2016-05-08 8 views
0

Ich habe ein Problem mit XCB. Ich verstehe den Unterschied zwischen *_reply_t vs *_request_t Typen nicht.reply_t vs request_t - sie austauschbar übergeben?

Es scheint, dass die *_reply_t anstelle der *_response_t übergeben wird, jedoch sind die Strukturen sehr unterschiedlich.

Zum Beispiel:

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

So, jetzt reply ist die Art der *_reply_t. Aber jetzt brauche ich xcb_randr_get_screen_resources_current_outputs zu verwenden, die das erste Argument erwartet vom Typ seine xcb_randr_get_screen_resources_current_request_t gemäß dem docs hier:

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

jedoch die Antwort von dem ersten Aufruf vom Typ xcb_randr_get_screen_resources_current_reply_t (*_reply_t). Wie ist es möglich, dies in den Output-Call ohne Casting zu übergeben? Die Strukturen sind völlig verschieden pro 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; 

und die Struktur für die *_request_t ist nicht in der Dokumentation habe ich es aus dem Quellcode hier:

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; 

ich tun Also muss ich den Typ, den ich vorher übergeben werde, für die Signatur der Methode deklarieren. So bin ich sehr verwirrt darüber, wie etwas von einer völlig anderen Struktur (reply) in einen zweiten Anruf geht, der die Struktur request hat.

Antwort

1

Ich denke, was Sie stolperte, ist einfach ein Dokumentationsfehler. Alle Funktionen, die Anspruch auf *_request_t nehmen, erwarten eigentlich *_reply_t. Von der Quelle, die Sie aus verbunden ist, schauen Sie in der eigentlichen Funktion Definition (und nicht als das, was der Mann sagt Seite) und Sie werden

xcb_randr_output_t * 
    xcb_randr_get_screen_resources_current_outputs (const xcb_randr_get_screen_resources_current_reply_t *R ); 

Die Struktur Sie nicht gefunden wird tatsächlich verwendet überall in der Datei, so es ist wahrscheinlich ein vergessener Überrest oder wird aus Kompatibilitätsgründen immer noch aufbewahrt.

+0

Ohhh richtig! Die Methodensignatur verwendet das in dieser Codedatei nicht. Doc-Fehler sicher. Vielen Dank! Die 'Antwort' auf' Anfrage' in der Post wurde korrigiert :) – Noitidart

Verwandte Themen