diff --git a/src/include/event-adapter.h b/src/include/event-adapter.h index f13e043..a0465ca 100644 --- a/src/include/event-adapter.h +++ b/src/include/event-adapter.h @@ -40,8 +40,15 @@ typedef enum notify_detail_t { notify_detail_none = 7, } notify_detail_t; +typedef enum mapping_t { + MAPPING_MODIFIER = 0, + MAPPING_KEYBOARD = 1, + MAPPING_POINTER = 2 +} mapping_t; + typedef struct mapping_notify_event_t { event_type_t type; + mapping_t request; } mapping_notify_event_t; typedef struct key_press_event_t { @@ -52,6 +59,10 @@ typedef struct key_press_event_t { typedef struct button_press_event_t { event_type_t type; + xcb_window_t window; + xcb_window_t root; + int32_t x, y, root_x, root_y; + uint32_t time; /* 时间戳(单位:ms) */ } button_press_event_t; typedef struct configure_request_event_t { diff --git a/src/xcb/event.c b/src/xcb/event.c index 85f31f8..e4dad6f 100644 --- a/src/xcb/event.c +++ b/src/xcb/event.c @@ -18,11 +18,13 @@ struct event_adapter_t { static void convert_event(xcb_generic_event_t *xcb_event, generic_event_t *event) { uint8_t event_type = XCB_EVENT_RESPONSE_TYPE(xcb_event); - const char *label = xcb_event_get_label(event_type); switch (event_type) { - case XCB_MAPPING_NOTIFY: - event->type = EVENT_TYPE_MAPPING_NOTIFY; + case XCB_MAPPING_NOTIFY: { + xcb_mapping_notify_event_t *ev = (xcb_mapping_notify_event_t *)xcb_event; + event->mapping_notify.type = EVENT_TYPE_MAPPING_NOTIFY; + event->mapping_notify.request = ev->request; break; + } case XCB_KEY_PRESS: { xcb_key_press_event_t *ev = (xcb_key_press_event_t *)xcb_event; int col = ev->state & XCB_MOD_MASK_2 ? 1 : 0; @@ -32,9 +34,18 @@ static void convert_event(xcb_generic_event_t *xcb_event, event->key_press.modifiers = ev->state; break; } - case XCB_BUTTON_PRESS: - event->type = EVENT_TYPE_BUTTON_PRESS; + case XCB_BUTTON_PRESS: { + xcb_button_press_event_t *ev = (xcb_button_press_event_t *)xcb_event; + event->button_press.type = EVENT_TYPE_BUTTON_PRESS; + event->button_press.window = ev->event; + event->button_press.root = ev->root; + event->button_press.x = ev->event_x; + event->button_press.y = ev->event_y; + event->button_press.root_x = ev->root_x; + event->button_press.root_y = ev->root_y; + event->button_press.time = ev->time; break; + } case XCB_CONFIGURE_REQUEST: { xcb_configure_request_event_t *ev = (xcb_configure_request_event_t *)xcb_event; @@ -66,7 +77,8 @@ static void convert_event(xcb_generic_event_t *xcb_event, event->unmap_notify.type = EVENT_TYPE_UNMAP_NOTIFY; event->unmap_notify.window = ev->window; event->unmap_notify.send_event = XCB_EVENT_SENT(ev); - } break; + break; + } case XCB_DESTROY_NOTIFY: { xcb_destroy_notify_event_t *ev = (xcb_destroy_notify_event_t *)xcb_event; event->destroy_notify.type = EVENT_TYPE_DESTROY_NOTIFY; @@ -127,7 +139,8 @@ static void convert_event(xcb_generic_event_t *xcb_event, event->type = -1; return; } - if (event->type != EVENT_TYPE_MOTION_NOTIFY) { + if (event->type) { + const char *label = xcb_event_get_label(event_type); logger("========================== %s ==========================\n", label); } }