2016-05-17 1 views
1

Remarque: Ceci est la suite de la réponse à un problème de What process created this X11 window? de unix.stackexchange. Cette réponse mentionne XResQueryClientIds de X-Resource v1.2 extension. J'aimerais savoir comment l'utiliser.python: ID de fenêtre PID vers X11 à l'aide de XResQueryClientIds

Comment puis-je utiliser python's xcffib module pour trouver tous les identifiants de fenêtre X11 associés à un PID fourni (dans l'hypothèse où il n'y a pas de conditions de concurrence, les fenêtres ou les processus ne sont pas créés ou détruits).

Je ne connais pas beaucoup X11, le XCB API documentation semble incomplet, et les auto-generated xcffib python bindings ne sont pas documentés. D'après ce que je comprends, je dois:

  1. Créer une connexion: xcb_connect
  2. portent l'extension: en situation irrégulière?
  3. Interroger l'extension:? xcb_get_extension_data mentionne « les demandes de QueryExtension? »
  4. Obtenez la réponse de requête: xcb_get_extension_data
  5. Utilisez le extension documentation et la protocol stub API de déballer la réponse.
+0

Si ma réponse vous a aidé, veuillez la marquer comme acceptée. J'ai remarqué que vous avez été sur SO, mais je n'ai pas encore donné de commentaires sur ma réponse. –

Répondre

2

en supposant pas de conditions de concurrence; les fenêtres ou les processus ne sont pas créés ou détruits

L'hypothèse est mauvaise si vous savez que l'hypothèse ne tient pas. Heureusement, vous n'avez pas besoin de cette hypothèse. Il suffit d'utiliser xcb_grab_server et xcb_ungrab_server autour de vos opérations et ce ne sera pas un problème. Maintenant, comme pour XResQueryClientIds, vous pouvez simplement taper man xcb_res_query_client_ids. XCB fournit juste cela, pas besoin d'interroger réellement l'extension. Voici un exemple de programme. Compilez-le avec gcc -lxcb -lxcb-res main.c, puis exécutez-le en transmettant un ID de fenêtre comme seul argument (par exemple, ./a.out 0x2c00004).

#include <stdio.h> 
#include <stdlib.h> 
#include <xcb/xcb.h> 
#include <xcb/res.h> 

int main(int argc, char *argv[]) { 
    int screen; 
    xcb_connection_t *conn = xcb_connect(NULL, &screen); 

    xcb_res_client_id_spec_t spec = {0}; 
    spec.client = strtol(argv[1], NULL, 0); 
    spec.mask = XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID; 

    xcb_generic_error_t *err = NULL; 
    xcb_res_query_client_ids_cookie_t cookie = xcb_res_query_client_ids(conn, 1, &spec); 
    xcb_res_query_client_ids_reply_t *reply = xcb_res_query_client_ids_reply(conn, cookie, &err); 

    if (reply == NULL) { 
     fprintf(stderr, "Uh-Oh! :(\n"); 
     return -1; 
    } 

    uint32_t *pid = NULL; 
    xcb_res_client_id_value_iterator_t it = xcb_res_query_client_ids_ids_iterator(reply); 
    for (; it.rem; xcb_res_client_id_value_next(&it)) { 
     spec = it.data->spec; 
     if (spec.mask & XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID) { 
      pid = xcb_res_client_id_value_value(it.data); 
      break; 
     } 
    } 

    free(reply); 
    xcb_disconnect(conn); 

    fprintf(stderr, "PID: %d\n", *pid); 
} 

Pour donner l'attribution correcte, je ne savais pas de moi-même non plus, je viens de googlé le nom de la fonction XCB et suis tombé sur this. Pour comprendre les différentes parties, je suggère de lire la documentation de Xlib. XCB est souvent plutôt ... "sous-documenté", comme vous l'avez remarqué, mais c'est vraiment le même que Xlib avec d'autres noms légèrement différents pour la plupart.

+0

Pas vraiment ce que j'ai demandé, mais utile. Tant de problèmes avec xcffib: 1] 0,1 (fedora 23) se connecter est cassé, même avec xauth manuel 2] essayé des structures d'emballage manuellement, ce qui est le * mauvais sens * 3] de nombreuses façons de faire la même chose, la plupart * mauvaise manière * 4] aucun docs 5] 0.4.2 (courant) a un changement qui rompt la compatibilité avec xlib (devrait être corrigé dans la prochaine version). Littéralement ligne que j'ai essayé avait un problème, que ce soit par moi (documentation), d'une ancienne version, d'un mauvais patch, ou d'un mauvais protocole. – user19087

+1

Quoi qu'il en soit, avec tous ces problèmes, j'allais passer à libxcb (c), mais comme [le protocole X-Resource ne correspond pas à la spécification] (https://github.com/tych0/xcffib/issues/71), 'xcb_res_query_client_ids_reply_t' est plein de junk (read-out-of-bounds). Le correctif corrige cela pour toutes les liaisons, maintenant * xcffib * fonctionne parfaitement, maintenant que je sais ce que je fais. – user19087

+0

Je vois que vous avez mis beaucoup d'efforts dans le débogage. Cool! –