XFetchName renvoie toujours 0

J’essaie d’écrire un code C pour obtenir le titre de la fenêtre active dans mon système Linux, mais la fonction XFetchName renvoie toujours zéro, j’ai aussi essayé XGetWMName, même résultat … mais en utilisant xprop, je peux voir qu’il y a une chaîne dans la propriété “WM_NAME”

Quelqu’un peut-il me dire ce qui ne va pas avec mon code?

#include  #include  #include  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; } 

Merci.

Vous pouvez essayer d’utiliser la fonction XGetWMName . Bien que les XGetWMName de XGetWMName et de XFetchName indiquent toutes deux qu’elles WM_NAME propriété WM_NAME , il semble qu’elles soient différentes l’une de l’autre. Parfois, ils renvoient le même nom. Parfois, seul XGetWMName renvoie le nom.

Vous pouvez également utiliser xwininfo -root -tree pour obtenir le nom de toutes les fenêtres et comparer avec le résultat de XFetchName et XGetWMName .

Ce code peut répertorier toutes les fenêtres et imprimer l’identifiant et le résultat de XFetchName et XGetWMName . Vous pouvez utiliser l’identifiant de la fenêtre pour rechercher dans la sortie de xwininfo -root -tree .

 #include  #include  #include  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); } 

Voici un morceau de sortie montrant que le résultat de deux fonctions peut être différent.

 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)" 

Voici un xwininfo -root -tree de la sortie de xwininfo -root -tree montrant le nom de ces fenêtres. xwininfo: identifiant de fenêtre: 0x2c7 (la fenêtre racine) (sans nom)

  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 

La fonction XFetchName renvoie le nom de la fenêtre spécifiée. Si cela réussit, il renvoie un statut différent de zéro; sinon, aucun nom n’a été défini pour la fenêtre et celle-ci renvoie zéro.

Vous devez définir un nom pour votre fenêtre.

J’ai démarré une session xterm , exécuté votre code et obtenu le résultat suivant:

 sangeeth@home:~/work/test$ ./a.out ret = 1 Title = sangeeth@home: ~/work/test sangeeth@home:~/work/test$ 

OTOH, j’ai essayé de comstackr votre programme et j’ai eu l’erreur suivante:

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

Vous devez changer

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

à

 int main(int argc, char* argv[]) 
  /* * 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 utilise XGetWMName

voir: entrer la description du lien ici