私はX11プログラミングの新機能です。X11を使用しているウィンドウID
作成した新しいウィンドウのウィンドウIDを表示するために次のコードを試しましたが、ウィンドウIDが2回表示されます(別のウィンドウID)。私はFVWM(fvwmソケット)を使用して作成されたすべての新しいウィンドウに対してのみ、一度だけ正しいものになっています。私がコマンドからfirefoxを起動すると、約5回ウィンドウが表示されます。
2回ではなく、新しいウィンドウ作成ごとに正しいウィンドウIDを1回表示します。
#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」の出力は次のとおりです。
[[email protected] 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
次の新しいウィンドウ(例えばxclockをまたはFirefoxが)で作成されるたびにあなたはウィンドウIDを表示するコードの一部についてどんな考えを持っていますか「xprop」コマンドから
[[email protected] src]# xclock &
[2] 6564
[[email protected] 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"
[[email protected] src]#
を同じ適合していますLinuxは一度だけです。
あなたが見るよりも多くのウィンドウがあります。あなたは、目に見えない風についていつもcreatenotifyイベントを得るでしょう。通知されるウィンドウを正確に作成する必要があります。表示可能なトップレベルウィンドウが必要な場合は、SubstructureNotifyマスクを登録してMapNotifyイベントを監視し、おそらく新しく作成されたウィンドウ属性を取得し、画面外にあるものを除外する必要があります。 –