c - 如何让X11窗口跨越多个显示器

标签 c api x11 multiple-monitors

我正在尝试使用 XResizeWindow() 制作一个跨越 2 个显示器的窗口,但是 ?window manager?将其限制为一个。

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

对于我的测试用例,我有两个 1600x1200 显示器,nVidia 将它们作为一个 3200x1200 屏幕呈现给 KDE4。 XDisplayWidth(显示, 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);

WMs 将遵守 min_width 并且不会将窗口缩小到比这更小。

如果您需要一个跨多个监视器的全屏窗口,则可以使用 _NET_WM_FULLSCREEN_MONITORS 属性以不同的方式完成。参见 here .

关于c - 如何让X11窗口跨越多个显示器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17114738/

相关文章:

c - 读取字符数组

java - Java 和 C/C++ 应用程序可以共享信号量吗?

javascript - 是否可以强制用户的浏览器发出(并遵循)正文中包含 JSON 的 GET 请求?

linux - 如何检查哪个程序在 gnome-terminal 中运行

linux - x11 - 如何设置 _NET_WM_ALLOWED_ACTIONS

c++ - 找不到-lX11

c++ - 在 Arduino 中将字节 * 转换为字符串

c - 如何捕获 SIGSEGV 并写入它出现在哪一行

javascript - Youtube API 多个带有事件的视频

api - Youtube播放器Iframe API跳过播放列表中的视频