2013-06-14 23 views
5

Próbuję użyć XResizeWindow(), aby utworzyć okno, które będzie obejmować 2 monitory, ale menedżer okien? ogranicza to do jednego.Jak ustawić okno X11 na wielu monitorach?

Czy istnieje podpowiedź lub właściwość, którą mogę powiązać z oknem, aby powiedzieć WM, aby go nie ograniczać?

W moim przypadku testowym mam dwa monitory 1600x1200, które nVidia prezentuje jako jeden ekran 3200x1200 w KDE4. XDisplayWidth (display, 0); zwraca 3200 i XDisplayHeight (wyświetlacz, 0); zwraca 1200.

Kiedy zadzwonić

XCreateWindow(display, DefaultRootWindow(display), 
       220, 0, 1700, 930, 
       1, DefaultDepth(display,screen), 
       InputOutput, CopyFromParent, 
       CWCursor, &attributes); 

za oknem 1700x930 na 220,0 mi się okno 1593x930 przy 0,0, utrzymując ją w całości na lewym monitorze. Każdy XResizeWindow większy niż ten zostanie skurty do 1593. (Zakładam, że 7 pikseli to dekoracja okna, co jest w porządku.)

Ale, jeśli wtedy XMoveWindow (display, win, 800, 0), to przeniesie okno aby rozciągnąć ekrany, a następnie powiększyć go do 3200 (minus kilka pikseli).

Czy jest coś, co mogę zrobić, aby powiadomić zarządcę okien lub kogokolwiek, kto to robi, aby nie ograniczać okna do jednego monitora i pozwolić mi korzystać z całego ekranu?

Dzięki!

%xrandr -q --verbose 
xrandr: Failed to get size of gamma for output default 
Screen 0: minimum 3200 x 1200, current 3200 x 1200, maximum 3200 x 1200 
default connected 3200x1200+0+0 (0x161) normal (normal) 0mm x 0mm 
    Identifier: 0x160 
    Timestamp: 64409661 
    Subpixel: unknown 
    Clones:  
    CRTC:  0 
    CRTCs:  0 
    Transform: 1.000000 0.000000 0.000000 
       0.000000 1.000000 0.000000 
       0.000000 0.000000 1.000000 
       filter: 
3200x1200 (0x161) 192.0MHz *current 
    h: width 3200 start 0 end 0 total 3200 skew 0 clock 60.0KHz 
    v: height 1200 start 0 end 0 total 1200   clock 50.0Hz 

Odpowiedz

2

Ogólnie wniosek nie powinien starać się sztywno kontrolować jego rozmiar i położenie okna, jak WM ma być elegancki i umieszczenie okna w najlepszy możliwy sposób. Jeśli chcesz kontrolować tak, spróbuj użyć XSizeHints takiego:

XSizeHints sh; 
sh.width = sh.min_width = 1700; 
sh.height = sh.min_height = 930; 
sh.h = 220; 
sh.y = 0; 
sh.flags = PSize | PMinSize | PPosition; 
XSetWMNormalHints(dpy, win, &sh); 
XMapWindow(dpy, win); 

menedżerów okien uszanuje min_width i nie kurczą się okno mniejszy niż ten.

Jeśli potrzebujesz pełnoekranowego okna obejmującego kilka monitorów, robi się to inaczej, patrz here.

+0

Aha! Ustawienie min_width robi lewę. Aplikacja stara się być sztywna tylko w odniesieniu do rozmiaru, gdy użytkownik wyraźnie mówi aplikacji, jak duże ma to okno. Mogę więc sprawdzić rozmiar ekranu i jeśli jest wystarczająco duży, ręcznie zmusić go do min_width, a następnie ustawić min_width z powrotem na 640 po zmianie rozmiaru. Dziękujemy! –

+1

W przypadku podanego rozmiaru należy użyć opcji USSize/USMinSize itp. Zamiast P * (preferencje określone przez użytkownika mają być szanowane częściej). –