如何使X11窗口跨越多个监视器

Ken*_*tin 6 c x11 api multiple-monitors

我正在尝试使用XResizeWindow()创建一个跨越2个监视器的窗口,但是窗口管理器?将其限制为一个.

是否有一个提示或属性我可以与窗口关联告诉WM不要限制它?

对于我的测试用例,我有两台1600x1200显示器,nVidia将其作为一个3200x1200屏幕呈现给KDE4.XDisplayWidth(显示,0); 返回3200和XDisplayHeight(显示,0); 返回1200.

我打电话的时候

XCreateWindow(display, DefaultRootWindow(display),
              220, 0, 1700, 930,
              1, DefaultDepth(display,screen),
              InputOutput, CopyFromParent,
              CWCursor, &attributes);
Run Code Online (Sandbox Code Playgroud)

对于一个窗口1700x930在220,0我得到一个窗口1593x930在0,0,完全保持在左侧监视器上.任何大于它的XResizeWindow都缩小到1593.(我假设7个像素是窗口装饰,这很好.)

但是,如果我然后XMoveWindow(显示,赢,800,0),它将移动窗口跨越屏幕,然后我可以将其放大到3200宽(减去几个像素).

有什么办法可以告诉窗口管理员,或者是这样做的人,不要将窗口限制在一个监视器上,让我使用整个屏幕?

谢谢!

%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
Run Code Online (Sandbox Code Playgroud)

n. *_* m. 4

一般来说,应用程序不应尝试严格控制其窗口大小和位置,因为 WM 应该是智能的并以尽可能最佳的方式放置窗口。如果你想控制的话,尝试XSizeHints这样使用:

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);
Run Code Online (Sandbox Code Playgroud)

WM 会尊重min_width并且不会将窗口缩小到小于此值。

如果您需要跨多个显示器的全屏窗口,则可以通过_NET_WM_FULLSCREEN_MONITORS属性以不同的方式完成此操作。看这里