2015-05-12 29 views
5

Bir pencereyi XIconifyWindow kullanarak tanımlamayı başardım, ancak daha sonra geri yüklemeyi başaramadım.Xlib ile bir pencere nasıl geri yüklenir?

XMapRaised (display, window); 

Ve:

XMapWindow (display, window); 

Ve: hayır başarı için

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); 

Aşağıdaki çalıştı. Debian Jessie'yi GNOME 3.14.0 ile kullanıyorum.

+0

"NormalState" veri öğesiyle bir "WM_CHANGE_STATE" iletisi göndermeyi denediniz mi? (XMapRaised'in pencereyi doğru bir şekilde işaretlemeyeceğini düşünmese de, çağrıları temizlediğinden/sunucu için beklediğinden emin misiniz? Doğru üst düzey pencerede bunu aradığınızı ve ayrıldığınızdan emin oldun mu? Simge simgelenmiş/geri çekilmiş?) –

+0

Hayır, ama şimdi denedim ve maalesef işe yaramıyor. Sadece bir pencere var, bu yüzden en üst düzey. Ayrıca "XFlush" i başarıyla eklemeyi denedim. Umarım, WM'ye özgü kodu eninde sonunda kullanmak zorunda değilimdir. –

+0

Kodunuzun ilgili bölümlerini buradan kaydeder misiniz? Yaptığın çeşitli girişimler dahil mi? –

cevap

4

Pek çok stuggle sonra, sonunda çözüldü!

GNOME 3'te, pencerelerde "simge/küçültme" düğmesi yoktur. Bir kullanıcı, ne kullanıcı tarafından ne de kodla minimize edilemez. XIconifyWindow'u aradığımda pencere en aza indirilmedi. En aza indirilmiş olsaydı, yapmadığım bir "UnmapNotify" olayı olurdu. Ne oldu, pencere gizlendi ("_NET_WM_STATE_HIDDEN", ​​pencerenin "_NET_WM_STATE" özelliğine eklendi) ve başka bir pencere etkinleştirildi. Yani bütün yapmam gereken etmek "unminimize" penceresi etkinleştirmek için oldu: aktive edilmesi gerekiyordu gibi

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 işe yaramadı yerine XRaiseWindow arayarak, öyle görünüyor.

+0

Güzel bulundu. Bu benim için biraz bozuk görünüyor. "_NET_ACTIVE_WINDOW" ifadesinin gönderilmesi, bir pencerenin "gösterilmesini" farklı kılar (bir pencereyi göstermesi gerekir) ancak aynı zamanda bu pencerenin etkin pencere (isteğe bağlı olarak veya istenmeyebilir) haline gelmesini de gerektirir. XMapRaised'in veya benzerlerinin çalışmış olmasını beklerdim, muhtemelen değil. Ve wm-spec 'HIDDEN' geri almak için açık bir şey görmüyorum. –

İlgili konular