2012-01-11 18 views
3

私のLinuxシステムでアクティブウィンドウのタイトルを取得するためにCコードを書き込もうとしていますが、関数XFetchNameは常にゼロを返します。また、XGetWMName、同じ結果を試しました... xprop、私は "WM_NAME"プロパティに文字列があることがわかりますXFetchNameは常に0を返します

誰も私のコードで何が問題なのか教えていただけますか?

#include <X11/Xlib.h> 
#include <stdio.h> 
#include <stdarg.h> 


int main(int argc, char* argv[]) 
{ 
     Display *display; 
     Window focus; 
     char *window_name; 
     int revert; 

     display = XOpenDisplay(NULL); 
     XGetInputFocus(display, &focus, &revert); 
     int ret = XFetchName(display, focus, &window_name); 
     printf("ret = %d\n", ret); 
     if (window_name) printf("Title = %s\n", window_name); 
     return 0; 
} 

ありがとう。

+0

なぜ_main 'で' _'を'? –

+1

Xterm(デフォルトでは 'xterm'が設定されています)から実行すると、あなたのコードは私が現在使っているマシン(OSX Lion)上で完璧に動作します。さらに、 'XStoreName()'の呼び出しを追加して、最初に何かを設定しました。期待通りに新しい名前を取得するコードでうまくいきました。もちろんこれは '_main()'を 'main()'に改名した後です - あなたはどのようにプログラムを実行していますか? –

+0

'_'はstdlibを使用していないので、コマンドライン "-Wl、-e__main"でエントリポイント名を定義するだけです。何もしないと思います。まだUbuntuのターミナルから実行されたときは0を返しますが、xtermからは動作しますが、これには理由がありますか? – killercode

答えて

0

XFetchName関数は、指定されたウィンドウの名前を返します。成功した場合は、0以外のステータスを返します。それ以外の場合は、ウィンドウに名前が設定されておらず、ゼロが返されます。

ウィンドウの名前を設定する必要があります。

私はxtermセッションを開始し、あなたのコードを実行し、次の出力ました:

[email protected]:~/work/test$ ./a.out 
ret = 1 
Title = [email protected]: ~/work/test 
[email protected]:~/work/test$ 

大藤を、私はあなたのプログラムをコンパイルしようとしたと、次のエラーを得た:

(.text+0x18): undefined reference to `main' 

、変更する必要があります

int _main(int argc, char* argv[]) 

~

int main(int argc, char* argv[]) 
+0

私は '_main()'が実際の問題かもしれないより大きなフレームワークへのフックであると考えています。 –

+0

@BrianRoachそれは良い点です。私たちはOPから詳細を聞く必要があります。 –

+0

stdlibを使用していないので、 '_'はエントリポイント名 "-Wl、-e__main"を定義するだけです。 – killercode

1

XGetWMName機能を試すことができます。 XGetWMNameXFetchNameのディスクリプションは両方ともWM_NAMEのプロパティを返すと言いますが、それらはお互いに異なるようです。時折、彼らは同じ名前を返します。時々、XGetWMNameだけが名前を返します。

xwininfo -root -treeを使用してすべてのウィンドウの名前を取得し、XFetchNameXGetWMNameの結果と比較することもできます。

このコードでは、すべてのウィンドウを一覧表示し、XFetchNameXGetWMNameのウィンドウIDと結果を出力できます。ウィンドウIDを使用して、xwininfo -root -treeの出力をルックアップすることができます。

#include <stdio.h> 
#include <X11/Xlib.h> 
#include <X11/Xutil.h> 

void enum_windows(Display* display, Window window, int depth) { 
    int i; 

    XTextProperty text; 
    XGetWMName(display, window, &text); 
    char* name; 
    XFetchName(display, window, &name); 
    for (i = 0; i < depth; i++) 
    printf("\t"); 
    printf("id=0x%x, XFetchName=\"%s\", XGetWMName=\"%s\"\n", window, name != NULL ? name : "(no name)", text.value); 

    Window root, parent; 
    Window* children; 
    int n; 
    XQueryTree(display, window, &root, &parent, &children, &n); 
    if (children != NULL) { 
    for (i = 0; i < n; i++) { 
     enum_windows(display, children[i], depth + 1); 
    } 
    XFree(children); 
    } 
} 

int main() { 
    Display* display = XOpenDisplay(NULL); 
    Window root = XDefaultRootWindow(display); 
    enum_windows(display, root, 0); 
} 

2つの機能の結果が異なる可能性があることを示す出力結果です。

id=0x2c7, XFetchName="(no name)", XGetWMName="(null)" 
    id=0x400001, XFetchName="(no name)", XGetWMName="(null)" 
    id=0x800036, XFetchName="(no name)", XGetWMName="(null)" 
     id=0x1400001, XFetchName="(no name)", XGetWMName="c - XFetchName always returns 0 - Stack Overflow - Chromium" 
    id=0x1000001, XFetchName="terminator", XGetWMName="terminator" 
     id=0x1000002, XFetchName="(no name)", XGetWMName="(null)" 
    id=0x1200001, XFetchName="chromium", XGetWMName="chromium" 
     id=0x1200002, XFetchName="(no name)", XGetWMName="(null)" 

ここに、これらのウィンドウの名前を示すxwininfo -root -treeの出力があります。 xwininfo:ウィンドウID:0x2c7(ルートウィンドウ)(名前がありません)

Root window id: 0x2c7 (the root window) (has no name) 
    Parent window id: 0x0 (none) 
    29 children: 
    0x1200001 "chromium": ("chromium" "Chromium") 10x10+10+10 +10+10 
     1 child: 
     0x1200002 (has no name):() 1x1+-1+-1 +9+9 
    0x1000001 "terminator": ("terminator" "Terminator") 10x10+10+10 +10+10 
     1 child: 
     0x1000002 (has no name):() 1x1+-1+-1 +9+9 
    0x800036 (has no name):() 1364x741+0+25 +0+25 
     1 child: 
     0x1400001 "c - XFetchName always returns 0 - Stack Overflow - Chromium": ("Chromium" "Chromium") 1364x741+0+0 +1+26 
    0x400001 (has no name):() 10x10+-20+-20 +-20+-20 
0
/* 
    * The following functions are internationalized substitutions 
    * for XFetchName and XGetIconName using XGetWMName and 
    * XGetWMIconName. 
    * 
    * Please note that the third arguments have to be freed using free(), 
    * not XFree(). 
    */ 
Status 
I18N_FetchName(dpy, w, winname) 
    Display *dpy; 
    Window w; 
    char ** winname; 
{ 
    int status; 
    XTextProperty text_prop; 
    char **list; 
    int num; 

    status = XGetWMName(dpy, w, &text_prop); 
    if (!status || !text_prop.value || !text_prop.nitems) return 0; 
    status = XmbTextPropertyToTextList(dpy, &text_prop, &list, &num); 
    if (status < Success || !num || !*list) return 0; 
    XFree(text_prop.value); 
    *winname = (char *)strdup(*list); 
    XFreeStringList(list); 
    return 1; 
} 

// XFetchNameがXGetWMName

を参照してください使用しています:enter link description here

関連する問題