我正在尝试使用XResizeWindow()创建一个将跨越2个监视器的窗口,但是?窗口管理器?将其限制为一个。
是否有可以与窗口关联的提示或属性,以告诉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,我得到0,0处的窗口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
通常,应用程序不应尝试严格控制其窗口大小和位置,因为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);
WM将尊重min_width
,并且不会将窗口缩小到小于此范围。
如果需要跨多个监视器的全屏窗口,则可以使用_NET_WM_FULLSCREEN_MONITORS
属性来完成此操作。参见here。