2016-06-01 38 views
4

Derzeit bin ich verantwortlich für die Entwicklung einer (C++) Fensterklasse für ein kleines Projekt; Ziel ist es, Abhängigkeiten auf ein Minimum zu reduzieren. Die Implementierung für Win32/WinAPI funktioniert wie angenommen, aber ich kämpfe, wenn es um Linux/XCB geht.Welches Ereignis wird zum Maximieren/Minimieren verwendet?

Ich bin mir bewusst, dass ich in der Lage bin, die "_NET_WM_STATE" Eigenschaft zu überprüfen, jedoch die Dokumentation kein Ereignis angibt, das auftreten würde, wenn das Fenster maximiert oder minimiert wird. Die Erweiterte Window Manager Hinweise Spezifikation scheint auch kein Ereignis zu definieren.

Also, wie würde man das Maximize/Minimize Event abfangen?

EDIT: Mein Code im Grunde wie das aussieht, aber nicht funktioniert: (By nicht funktioniert, meine ich die if-Bedingung unten nie erfüllt ist.)

// xcb_generic_event_t* msg; 
// xcb_intern_atom_reply_t* wmStateMinimized; 

case XCB_PROPERTY_NOTIFY: { 
    xcb_property_notify_event_t* data{reinterpret_cast<xcb_property_notify_event_t*>(msg)}; 
    if(data->atom == wmStateMinimized->atom) 
     eventQueue.emplace(Event::Minimized); 

} break; 

Ich habe auch prüfte die Atome, die mir das Ereignis liefert. Sie unterscheiden sich von dem Atom, das von 'wmStateMinimized' bereitgestellt wird, obwohl das Atom für 'wmStateMinimized' vom Fenstermanager bereitgestellt wird.

EDIT 2: Ok, die xcb_property_notify_event_t liefert das Atom, das Veränderung gewesen ist, nicht der Wert selbst ein. die Also, wenn sollte wie diese dann aussehen:

if(data->atom == wmState->atom) 

Muss ich herauszufinden, wie der Wert richtig abzurufen.

+3

Es gibt kein bestimmtes Ereignis zum Maximieren/Minimieren. Um nach Änderungen der Eigenschaften zu suchen, müssen Sie PropertyNotify-Ereignisse abonnieren. Dies wird von der PropertyChangeMask gesteuert. –

+0

Danke, habe es auch herausgefunden, indem ich die Ereigniscodes druckte, die meine Anwendung bekommen würde. – Julien

+0

AFAIK, in X11 wurde die Maximierung-Minimierung durch den Fenstermanager gehandhabt. In einigen X11-Apps, die ich geschrieben habe, habe ich es nie explizit behandelt. Diese [SO post] (http://stackoverflow.com/questions/4530786/xlib-create-window-in-mimized-or-maximized-state) könnte für Sie interessant sein. – user3078414

Antwort

4

Also, nach 3 Stunden habe ich es endlich herausgefunden. Diese Lösung Schnipsel geht davon aus, dass Sie bereits die Atome abgefragt haben:

  • _NET_WM_STATE
  • _NET_WM_STATE_HIDDEN
  • _NET_WM_STATE_MAXIMIZED_VERT
  • _NET_WM_STATE_MAXIMIZED_HORZ

Sie werden in den folgenden Atome gespeichert werden:

xcb_atom_t wmState; 
xcb_atom_t wmStateHidden; 
xcb_atom_t wmStateMaxVert; 
xcb_atom_t wmStateMaxHorz; 

Dieser Code-Schnipsel übernimmt als auch, dass Sie

XCB_EVENT_MASK_PROPERTY_CHANGE 

für das Fenster, um tatsächlich angegeben haben, um über Eigenschaftsänderungen benachrichtigt.

So lassen Sie uns so tun, als wir in der Ereignisschleife sind jetzt:

case XCB_PROPERTY_NOTIFY: { 
    xcb_property_notify_event_t* data{reinterpret_cast<xcb_property_notify_event_t*>(msg)}; 
    if(data->atom == wmState){ // the WM_STATE property was changed. 
     // Now we need the value. 
     // Therefore I implemented an auxiliary function. 
     if(internal::getAtomValue(connection, window, wmState) == wmStateHidden) 
      // Handle Events here: 
      eventQueue.emplace(Event::Minimized); 
     else{ 
      xcb_atom_t value{internal::getAtomValue(connection, window, wmState)}; 
      if((value == wmStateMaxVert) || (value == wmStateMaxHorz)) 
      // Handle Event here 
      eventQueue.emplace(Event::Maximized); 
     } 
    } 

} break; 

Die Hilfsfunktion 'interne :: getAtomValue' funktioniert wie folgt:

xcb_get_property_cookie_t cookie{xcb_get_property(connection, false, window, atom, XCB_ATOM_ATOM, 0, 32)}; 
xcb_generic_error_t*   err{nullptr}; 
xcb_get_property_reply_t  reply{xcb_get_property_reply(connection, cookie, &err); 
xcb_atom_t*     value{reinterpret_cast<xcb_atom_t*>(xcb_get_property_value(reply))}; 

Ich hoffe, dass dieses Lösungskonzept Beweis und richtig.Darf es als Referenz für alle dienen, die mit XCB arbeiten müssen.

S.S .: Diese Snippets wurden von meiner ursprünglichen Quelle entfernt. Es könnte Tippfehler enthalten.

+1

Bitte seien Sie so freundlich, gegen Tippfehler zu überprüfen. Sowohl Ihre Frage als auch Ihre Antwort sind wichtig. Jemand anderes wird Ihre Recherche finden und diese Informationen weiterleiten. Vielen Dank. – user3078414