无法让 XCreateSimpleWindow 在正确位置打开窗口

2023-12-25

以下代码打开一个大小正确的窗口,w,h,但位置不正确,x,y。

#include <iostream>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xresource.h>
using namespace std;

int main(int argc, char* argv[]){
  Display *display; // A connection to X server
  int screen_number;
  Window canvas_window;
  unsigned long white_pixel;
  unsigned long black_pixel;

  display = XOpenDisplay(NULL);    // Connect X server by opening a display

  if(!display){
    cerr<<"Unable to connect X server\n";
    return 1;
  }

  screen_number = DefaultScreen(display);
  white_pixel = WhitePixel(display, screen_number);
  black_pixel = BlackPixel(display, screen_number);


  int x=0, y=100, w=300, h=400;

  canvas_window = XCreateSimpleWindow(display,
                                      RootWindow(display, screen_number),
                                      x,y,  // top left corner
                                      w,h,  // width and height
                                      2,    // border width
                                      black_pixel,
                                      white_pixel);

  XMapWindow(display, canvas_window);    // Map canvas window to display
  XSync(display, False);

  cin >> x;   // just so that the program does not end
}

我用 g++ xwindowtest.cpp -lX11 编译了它,其中 g++ 是版本 4.6.2,并在 Debian GNU/Linux 下运行。


上面的解决方案是正确的,但并不完整。

在桌面上创建新的顶级窗口以及在应用程序的顶级窗口中创建新(子)窗口使用相同的 XCreateSimpleWindow() 调用,但实际行为可能不同。

当您在应用程序中创建新的子窗口时,您负责,并且将尊重您为新窗口提供的原点坐标(相对于其父窗口的原点)和大小。换句话说,窗口将移动到您想要的位置。

然而,当在桌面上创建新的顶级窗口时,您必须处理讨厌的窗口管理器,例如 Motif、KDE、Gnome 等。当您创建顶级窗口以添加边框(“装饰”)时,这会介入、标题、可能的图标等。更重要的是,默认情况下,在大多数情况下,它会忽略您请求的原点坐标,并将新窗口放置在它想要的位置,而不是您要求它放置的位置。只有当它被映射(某处)时,您才可以使用 XMoveWindow() 移动它。

为了避免这种情况,您可以询问窗口管理器,或者在 X11 中“提示”窗口管理器“不,我希望您将窗口放在我要求的位置,而不是您想要放置的位置”。您可以按以下顺序执行此操作:

(1)定义一个XSizeHints结构体。 (2) 使用您想要指定的掩码设置此结构中的标志位 (3) 填充相关参数 (4) 在新创建的窗口上调用 XSetNormalHints()(在映射之前)。

所以在 C 代码中你会这样做:

XSizeHints    my_hints = {0};

my_hints.flags  = PPosition | PSize;     /* I want to specify position and size */
my_hints.x      = wanted_x_origin;       /* The origin and size coords I want */
my_hints.y      = wanted_y_origin;
my_hints.width  = wanted_width;
my_hints.height = wanted_height;

XSetNormalHints(disp, new_window, &my_hints);  /* Where new_window is the new window */

然后绘制它 - 希望 - 它会在你想要的地方。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法让 XCreateSimpleWindow 在正确位置打开窗口 的相关文章

  • Java zip 字符编码

    我使用以下方法将文件压缩为 zip 文件 import java util zip CRC32 import java util zip ZipEntry import java util zip ZipOutputStream publi

随机推荐