[Xcb] proposal: events used in requests ( xinput:SendExtensionEvent, xproto:SendEvent, ... )

Christian Linhart chris at DemoRecorder.com
Mon Sep 8 08:08:40 PDT 2014


Hi all,

The only thing that is still missing for complete XInput coverage in my patches
is request SendExtensionEvent which contains a list of events.

In theory this could be defined with lots of code-duplication in xinput.xml
by redefining all XInput1-events in form of a huge switch-case in a struct
but that would neither be good nor elegant.

Therefore I propose to support that in the generator.

Here's my proposal:

Provide a way to define a struct which can be any event from a
given list of events.

This could look like.

<eventstruct name="EventForSend">
	<allowed extension="xinput" xge="false" opcode-min="0" opcode-max="16" />
</eventstruct>

This defines a struct-type which can hold one event of a type which matches any of the <allowed/> - rules.
In the example above it can contain any non-xge event with opcodes 0 to 16 from the xinput-extension.
( extension="xproto" would refer to core-protocol events. This could be used in the definition of core-request "SendEvent" )

An eventstruct can contain multiple <allowed/> - rules.

Request SendExtensionEvent can then be defined as follows:

    <request name="SendExtensionEvent" opcode="31">
        <field type="WINDOW" name="destination" />
        <field type="CARD8"  name="device_id" />
        <field type="BOOL"   name="propagate" />
        <field type="CARD16" name="num_classes" />
        <field type="CARD8"  name="num_events" />
        <pad bytes="3" />
        <list type="EventForSend" name="events">
            <fieldref>num_events</fieldref>
        </list>
        <list type="EventClass" name="classes">
            <fieldref>num_classes</fieldref>
        </list>
    </request>


The generated C-code for an eventstruct could be as follows:
* eventstruct is represented by a union which contains a type-field and a member for each allowed type of event.
* if an eventstruct is allowed to contain xge-events then it is a var-sized type, otherwise a fixed-sized type.
  ( with all consequences of either of that... )


In the example above the union could look like:

    typedef union xcb_input_event_for_send_t{
            uint8_t                                  response_type;
            xcb_input_device_valuator_event_t        device_valuator;
            xcb_input_device_key_press_event_t       device_key_press;
            xcb_input_device_key_press_event_t       device_key_release;
	    ...
            xcb_input_device_property_notify_event_t device_property_notify;
    } xcb_input_event_for_send_t;


If it may contain xge-events then it will contain a member xge-header as follows:

    typedef union xcb_input_foo_t{
	uint8_t response_type;
	struct{
            uint8_t               response_type; /**<  */
            uint8_t               extension; /**<  */
            uint16_t              sequence; /**<  */
            uint32_t              length; /**<  */
            uint16_t              event_type; /**<  */
	} xge_header;
	xcb_input_raw_touch_begin_event_t raw_touch_begin;
	...

or instead of nested struct xge_header it may simply contain a member of type xcb_ge_generic_event_t:

    typedef union xcb_input_foo_t{
	uint8_t response_type;
        xcb_ge_generic_event_t xge;
	xcb_input_raw_touch_begin_event_t raw_touch_begin;
	...

***

In think that adding support for that in the parser/generator will be pretty straightforward.

***

What do you think about this proposal?

Chris



More information about the Xcb mailing list