【问题标题】:Window Id using X11使用 X11 的窗口 ID
【发布时间】:2017-08-04 08:30:22
【问题描述】:

我对 X11 编程非常陌生。

我尝试使用以下代码来显示创建的新窗口的 Window Id,但它显示 Window Id 两次(不同的 Window Id)。我得到了正确的结果,并且只针对使用 FVWM(fvwm 套接字)创建的每个新窗口。如果我从命令启动 firefox,那么它会显示大约 5 次窗口。

我想为每个新窗口创建一次而不是两次显示正确的窗口 ID。

#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
int main()
{
                Display* display = XOpenDisplay(":0");
                XSetWindowAttributes attributes;
//                attributes.event_mask = SubstructureNotifyMask | StructureNotifyMask;
                attributes.event_mask = SubstructureNotifyMask | VisibilityChangeMask | EnterWindowMask;
                attributes.backing_store = Always;
                Window win = XDefaultRootWindow(display);
                printf("Deafult root window %x\n", win);
                XChangeWindowAttributes(display, win, CWEventMask, &attributes);

                while (1)
                {
                   XEvent event;
                   XNextEvent(display, &event);
                   if (event.type == CreateNotify)
                   {
                         puts("create Notify event occured\n");
                        printf("Window ID: %x\n", event.xcreatewindow.window);
                        printf("Window ID: %d\n", event.xcreatewindow.window);

                        printf("Parent Window ID: %x\n", event.xcreatewindow.parent);
                  }
                }
}

以下是“xclock”的输出。

[root@localhost src]# ./XWindow.out 
create Notify event occured

Window ID: 3e0000c
Window ID: 65011724
create Notify event occured

Window ID: 100118f
Window ID: 16781711
create Notify event occured

以下是与“xprop”命令一致

[root@localhost src]# xclock &
[2] 6564
[root@localhost src]# xprop 
_NET_WM_STATE(ATOM) = 
WM_STATE(WM_STATE):
        window state: Normal
        icon window: 0x0
_NET_WM_DESKTOP(CARDINAL) = 0
_NET_FRAME_EXTENTS(CARDINAL) = 1, 1, 39, 1
_NET_WM_ALLOWED_ACTIONS(ATOM) = _NET_WM_ACTION_MOVE, _NET_WM_ACTION_RESIZE, _NET_WM_ACTION_FULLSCREEN, _NET_WM_ACTION_MINIMIZE, _NET_WM_ACTION_SHADE, _NET_WM_ACTION_MAXIMIZE_HORZ, _NET_WM_ACTION_MAXIMIZE_VERT, _NET_WM_ACTION_CHANGE_DESKTOP, _NET_WM_ACTION_CLOSE, _NET_WM_ACTION_ABOVE, _NET_WM_ACTION_BELOW
_NET_WM_PID(CARDINAL) = 6564
WM_PROTOCOLS(ATOM): protocols  WM_DELETE_WINDOW
SM_CLIENT_ID(STRING) = "10b83f0cefdd07ca73150167045190887900000031930078"
WM_CLIENT_LEADER(WINDOW): window id # 0x3e0000c
WM_LOCALE_NAME(STRING) = "C"
WM_CLASS(STRING) = "xclock", "XClock"
WM_HINTS(WM_HINTS):
        Client accepts input or input focus: False
        Initial state is Normal State.
        bitmap id # to use for icon: 0x3e00001
        bitmap id # of mask for icon: 0x3e00003
WM_NORMAL_HINTS(WM_SIZE_HINTS):
        program specified size: 164 by 164
        window gravity: NorthWest
WM_CLIENT_MACHINE(STRING) = "localhost.localdomain"
WM_COMMAND(STRING) = { "xclock" }
WM_ICON_NAME(STRING) = "xclock"
WM_NAME(STRING) = "xclock"
[root@localhost src]# 

你对在 Linux 中只创建一次新窗口(例如 xclock 或 firefox)时显示 Window id 的代码有任何想法吗?

【问题讨论】:

  • 窗口比你看到的要多得多。您将始终收到有关 invisiblle windows 的 createnotify 事件。您需要仔细制定您希望收到通知的确切窗口。如果您想要可见的顶级窗口,您需要注册 SubstructureNotify 掩码并观察 MapNotify 事件,然后可能会获取新创建的窗口属性并过滤掉那些完全在屏幕之外的属性。

标签: c x11


【解决方案1】:

大多数窗口管理器重新设置新的顶级窗口以管理边框/顶部栏/按钮。我很确定你看到的是应用程序窗口 id + wm 窗口 id。您可以通过查看窗口的所有者 pid 来检查 - 它位于 _NET_WM_PID 端口(@98​​7654322@)中 - 请参阅 How to convert a X11 window id to a process id

【讨论】:

  • 窗口管理器可能会也可能不会为框架窗口设置任何属性(我的没有)。
猜你喜欢
  • 2016-09-13
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 2021-03-18
相关资源
最近更新 更多