2015-05-12 38 views
5

Udało mi się zindywidualizować okno przy użyciu XIconifyWindow, ale nie udało się później go przywrócić. Próbowałem następujące:Jak przywrócić okno z Xlib?

XMapRaised (display, window); 

oraz:

XMapWindow (display, window); 

oraz:

XClientMessageEvent ev; 
std::memset (&ev, 0, sizeof ev); 
ev.type = ClientMessage; 
ev.window = window; 
ev.message_type = XInternAtom(display, "WM_CHANGE_STATE", False); 
ev.format = 32; 
ev.data.l[0] = NormalState; 
XSendEvent (display, RootWindow(display, XDefaultScreen(display)), False, 
    SubstructureRedirectMask |SubstructureNotifyMask, (XEvent*)&ev); 
XFlush (display); 

To bez powodzenia. Używam Debian Jessie z GNOME 3.14.0.

+0

Czy próbowałeś wysłać wiadomość 'WM_CHANGE_STATE' z elementem danych z' NormalState'? (Chociaż założyłbym, że 'XMapRaised' miałby niewymienione okno poprawnie, czy jesteś pewien, że opróżniłeś połączenia/czekałeś na serwer?) Upewniłeś się również, że zadzwoniłeś do tego w prawidłowym oknie i nie opuściłeś ancestor iconified/withdrawn?) –

+0

Nie, ale teraz próbowałem i niestety to nie działa. Mam tylko jedno okno, więc najwyraźniej jest to najwyższy poziom. Próbowałem też dodać "XFlush" bez powodzenia. Mam nadzieję, że ostatecznie nie będę musiał używać kodu specyficznego dla WM. –

+0

Czy możesz umieścić tutaj odpowiednie fragmenty kodu? W tym różne próby, które podjąłeś? –

Odpowiedz

4

Po wielu próbach, w końcu rozwiązany!

W środowisku GNOME 3 okna nie mają przycisku "ikona/zminimalizuj". Wygląda na to, że okna nie można zminimalizować ani przez użytkownika, ani przez kod. Kiedy zadzwoniłem pod numer XIconifyWindow, okno nie zostało zminimalizowane. Gdyby został zminimalizowany, dostałbym zdarzenie "UnmapNotify", czego nie zrobiłem. Co się stało, okno zostało ukryte ("_NET_WM_STATE_HIDDEN" zostało dodane do właściwości "_NET_WM_STATE" okna), a inne okno zostało aktywowane. Więc wszystko, co musiałem zrobić, aby „unminimize” okno było go aktywować:

XClientMessageEvent ev; 
std::memset (&ev, 0, sizeof ev); 
ev.type = ClientMessage; 
ev.window = window; 
ev.message_type = XInternAtom(display, "_NET_ACTIVE_WINDOW", True); 
ev.format = 32; 
ev.data.l[0] = 1; 
ev.data.l[1] = CurrentTime; 
ev.data.l[2] = ev.data.l[3] = ev.data.l[4] = 0; 
XSendEvent (display, RootWindow(display, XDefaultScreen(display)), False, 
    SubstructureRedirectMask |SubstructureNotifyMask, (XEvent*)&ev); 
XFlush (display); 

Btw nazywając XRaiseWindow zamiast nie działa, wydaje się, jakby to miał być aktywowana.

+0

Ładnie znalezione. Wydaje mi się jednak, że trochę mnie to zepsuło. Wysłanie '_NET_ACTIVE_WINDOW' jest inne niż" odkrywanie "okna (chociaż powinno odkryć okno), ale także oznacza żądanie, aby to okno stało się aktywnym oknem (które może lub nie jest pożądane). Spodziewałbym się, że 'XMapRaised' lub podobny by działał, ale być może nie. I nie widzę niczego oczywistego we wm-spec, jak cofnąć "UKRYTY". –