XGetWindowAttributes始终返回初始窗口位置的原因咨询
XGetWindowAttributes返回初始窗口位置的原因及解决方法
核心原因:
XGetWindowAttributes返回的x和y是窗口客户端区域(不含边框)相对于其父窗口的位置,而非窗口在屏幕上的绝对坐标。当你通过窗口管理器拖动顶层窗口时,窗口管理器实际调整的是包含边框的整个窗口框架的位置,而客户端区域相对于框架的偏移是固定的,因此这个函数返回的坐标不会随窗口移动而改变。解决方法:
- 使用
XTranslateCoordinates将窗口的原点(0,0)转换为根窗口的坐标,以此获取窗口在屏幕上的绝对位置:Window root_return; int root_x, root_y; int win_x, win_y; unsigned int mask_return; XTranslateCoordinates(display, your_window, RootWindow(display, screen), 0, 0, &root_x, &root_y, &root_return, &mask_return); // root_x和root_y就是窗口原点在屏幕上的绝对坐标 - 若要获取包含边框的整个窗口的位置和大小,可以查询窗口管理器的
_NET_WM_GEOMETRY属性:Atom net_wm_geometry = XInternAtom(display, "_NET_WM_GEOMETRY", False); long geom_data[4]; Atom actual_type; int actual_format; unsigned long nitems, bytes_after; if (XGetWindowProperty(display, your_window, net_wm_geometry, 0, 4, False, AnyPropertyType, &actual_type, &actual_format, &nitems, &bytes_after, (unsigned char**)&geom_data) == Success) { int x = geom_data[0]; int y = geom_data[1]; unsigned int width = geom_data[2]; unsigned int height = geom_data[3]; // x,y是整个窗口(含边框)的屏幕坐标,width,height是整体尺寸 }
- 使用
内容的提问来源于stack exchange,提问作者Irbis
相关产品推荐
相关产品推荐

