使用多个显示 - XOpenDisplay(NULL)有时无法获得窗口的当前显示吗?

时间:2017-07-10 02:04:23

标签: c++ linux x11 xlib

我有一个* .SO库,从应用程序调用时,会从指定的窗口中删除窗口装饰。这是我的代码:

#include <X11/Xlib.h>

struct MwmHints
{
    unsigned long flags;
    unsigned long functions;
    unsigned long decorations;
    long input_mode;
    unsigned long status;
};
enum
{
    MWM_HINTS_FUNCTIONS = (1L << 0),
    MWM_HINTS_DECORATIONS =  (1L << 1),

    MWM_FUNC_ALL = (1L << 0),
    MWM_FUNC_RESIZE = (1L << 1),
    MWM_FUNC_MOVE = (1L << 2),
    MWM_FUNC_MINIMIZE = (1L << 3),
    MWM_FUNC_MAXIMIZE = (1L << 4),
    MWM_FUNC_CLOSE = (1L << 5)
};

extern "C"
{
    void borderless(Window window)
    {
        Display *display = XOpenDisplay(NULL);
        Atom mwmHintsProperty = XInternAtom(display,"_MOTIF_WM_HINTS",0);
        struct MwmHints hints;
        hints.flags = MWM_HINTS_DECORATIONS;
        hints.decorations = 0;
        XChangeProperty(display,window,mwmHintsProperty,mwmHintsProperty,32,
        PropModeReplace,(unsigned char *)&hints,5);
        XCloseDisplay(display);
    }
}

我的问题 - 使用我当前设置的代码 - 根据当前显示窗口的显示情况,有时会无法删除窗口装饰吗?我的印象是XOpenDisplay(NULL)将返回默认或第一个显示,无论哪一个。如果窗口是在第二个(或非默认)显示上创建的,XOpenDisplay(NULL)将返回一个窗口未打开的显示,并且窗口装饰不会被删除 - 这是正确的吗?

我没有多台显示器可以测试,所以我需要知道我的* .SO库无论最终用户是否有多显示器设置都能正常工作。

1 个答案:

答案 0 :(得分:2)

Windows无法在显示之间移动。您可能会混淆显示器和监视器,这在X Window系统中是非常不同的。

没有“当前显示”这样的东西。使用XOpenDisplay(NULL)打开的显示由DISPLAY环境变量决定,该变量应由用户环境设置或由用户手动设置,绝不是您(应用程序编写者)的责任。

显示器可以连接多个显示器。 Windows可以在监视器之间自由移动。这对包括您在内的大多数应用程序都是透明的。无论如何,您正在处理单个显示器。

简而言之,你担心没问题。

还有一种叫做“屏幕”的东西,它与显示器和显示器都不同。你也不应该担心它。