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

6
我正在尝试使用XResizeWindow()创建一个跨越两个监视器的窗口,但是窗口管理器将其限制在一个窗口中。是否有提示或属性可以与窗口关联,告诉WM不要限制它?
对于我的测试用例,我有两个1600x1200的显示器,nVidia将其呈现为KDE4的一个3200x1200屏幕。 XDisplayWidth(display,0); 返回3200,XDisplayHeight(display,0);返回1200。
当我调用
XCreateWindow(display, DefaultRootWindow(display),
              220, 0, 1700, 930,
              1, DefaultDepth(display,screen),
              InputOutput, CopyFromParent,
              CWCursor, &attributes);

对于一个220,0位置的1700x930窗口,我得到了一个1593x930的窗口,完全保留在左侧监视器上。任何大于这个大小的XResizeWindow都会被缩小到1593(我假设7个像素是窗口装饰,这没关系)。但是,如果我使用XMoveWindow(display,win,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
1个回答

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

WMs将尊重min_width,并且不会将窗口缩小到比这个更小。

如果您需要一个跨越多个监视器的全屏窗口,则可以使用_NET_WM_FULLSCREEN_MONITORS属性来完成。请参见此处


啊哈!设置min_width就解决了问题。应用程序尝试仅在用户明确告诉应用程序窗口大小时才保持刚性。因此,我可以检查屏幕大小,如果足够大,则手动使用min_width强制其大小,然后在调整大小后将min_width设置回640。谢谢! - Ken Martin
1
为了使用指定的尺寸,需要使用USSize/USMinSize等而不是P*(应更加尊重用户指定的偏好)。 - n. m.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接