2016-05-08 1 views
0

J'ai un problème avec XCB. Je ne comprends pas la différence entre les types *_reply_t et *_request_t.reply_t vs request_t - les transmettre de façon interchangeable?

Il semble que le *_reply_t est passé à la place du *_response_t, mais les structures sont très différentes.

Par exemple:

xcb_randr_get_screen_resources_current_reply_t *reply = xcb_randr_get_screen_resources_current_reply(
     connection, xcb_randr_get_screen_resources_current(connection, root), NULL); 

Alors maintenant reply est le type de *_reply_t. Mais maintenant, je dois utiliser xcb_randr_get_screen_resources_current_outputs qui attend le premier argument est de type xcb_randr_get_screen_resources_current_request_t selon les docs ici:

http://www.linuxhowtos.org/manpages/3/xcb_randr_get_screen_resources_current_outputs.htm

  xcb_randr_output_t *xcb_randr_get_screen_resources_current_outputs(
      const xcb_randr_get_screen_resources_current_request_t *reply 
     ); 

Cependant, la réponse du premier appel est de type xcb_randr_get_screen_resources_current_reply_t (*_reply_t). Comment est-il possible de passer cela dans l'appel des sorties sans lancer? Les structures sont complètement différentes par la docs:

typedef struct xcb_randr_get_screen_resources_current_reply_t { 
    uint8_t   response_type; 
    uint8_t   pad0; 
    uint16_t  sequence; 
    uint32_t  length; 
    xcb_timestamp_t timestamp; 
    xcb_timestamp_t config_timestamp; 
    uint16_t  num_crtcs; 
    uint16_t  num_outputs; 
    uint16_t  num_modes; 
    uint16_t  names_len; 
    uint8_t   pad1[8]; 
} xcb_randr_get_screen_resources_current_reply_t; 

Et le struct pour le *_request_t est pas dans la documentation que je l'ai obtenu à partir du code source ici:

https://xcb.freedesktop.org/manual/randr_8h_source.html#l00896

typedef struct xcb_randr_get_screen_resources_current_request_t { 
     uint8_t  major_opcode; 
     uint8_t  minor_opcode; 
     uint16_t  length; 
     xcb_window_t window; 
    } xcb_randr_get_screen_resources_current_request_t; 

je ctypes donc je dois déclarer le type que je vais passer à l'avance pour la signature de la méthode. Donc, je suis très confus sur la façon dont quelque chose d'une structure totalement différente (reply) va dans un deuxième appel qui a la structure de request.

Répondre

1

Je pense que ce que vous avez découvert est simplement un bug de documentation. Toutes les fonctions qui prétendent prendre *_request_t attendent réellement *_reply_t. De la source même dont vous venez, regardez juste à la définition de la fonction réelle (plutôt que ce que la page man) et vous trouverez

xcb_randr_output_t * 
    xcb_randr_get_screen_resources_current_outputs (const xcb_randr_get_screen_resources_current_reply_t *R ); 

Le struct que vous avez trouvé est pas réellement utilisé partout dans le fichier, donc Il s'agit probablement de restes oubliés, ou peut-être encore conservés pour des raisons de compatibilité.

+0

Ohhh c'est correct! La signature de méthode n'utilise pas cela dans ce fichier de code. Doc erreur à coup sûr. Merci beaucoup! Correction du 'response' à' request' dans le post :) – Noitidart