我有一个* .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库无论最终用户是否有多显示器设置都能正常工作。
答案 0 :(得分:2)
Windows无法在显示之间移动。您可能会混淆显示器和监视器,这在X Window系统中是非常不同的。
没有“当前显示”这样的东西。使用XOpenDisplay(NULL)
打开的显示由DISPLAY
环境变量决定,该变量应由用户环境设置或由用户手动设置,绝不是您(应用程序编写者)的责任。
显示器可以连接多个显示器。 Windows可以在监视器之间自由移动。这对包括您在内的大多数应用程序都是透明的。无论如何,您正在处理单个显示器。
简而言之,你担心没问题。
还有一种叫做“屏幕”的东西,它与显示器和显示器都不同。你也不应该担心它。