2017-08-03 3 views
0

私は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は一度だけです。

+1

あなたが見るよりも多くのウィンドウがあります。あなたは、目に見えない風についていつもcreatenotifyイベントを得るでしょう。通知されるウィンドウを正確に作成する必要があります。表示可能なトップレベルウィンドウが必要な場合は、SubstructureNotifyマスクを登録してMapNotifyイベントを監視し、おそらく新しく作成されたウィンドウ属性を取得し、画面外にあるものを除外する必要があります。 –

答えて

0

ほとんどのウィンドウマネージャは、ボーダー/トップバー/ボタンを管理するために、新しいトップレベルウィンドウの再親です。あなたが見ているのは、アプリケーションウィンドウID + WMウィンドウIDです。あなたはウィンドウの所有者pidを見ることで確認できます。それは_NET_WM_PID poroperty(xprop -id wid _NET_WM_PID)にあります - How to convert a X11 window id to a process id

+1

ウィンドウマネージャはフレームウィンドウのプロパティを設定することもあれば設定しないこともありません(私はできません)。 –

関連する問題