diff --git a/legacy/ecore/src/lib/ecore_x/Ecore_X.h b/legacy/ecore/src/lib/ecore_x/Ecore_X.h index 0e2dd39581..f0bac239d2 100644 --- a/legacy/ecore/src/lib/ecore_x/Ecore_X.h +++ b/legacy/ecore/src/lib/ecore_x/Ecore_X.h @@ -755,6 +755,12 @@ struct _Ecore_X_Event_Desktop_Change int source; }; +EAPI extern int ECORE_X_EVENT_ANY; /**< low level event dependent on + backend in use, if Xlib will be XEvent, + if XCB will be xcb_generic_event_t. + + @warning avoid using it. + */ EAPI extern int ECORE_X_EVENT_MOUSE_IN; EAPI extern int ECORE_X_EVENT_MOUSE_OUT; EAPI extern int ECORE_X_EVENT_WINDOW_FOCUS_IN; diff --git a/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb.c b/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb.c index f62122a883..6aa4c173ba 100644 --- a/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb.c +++ b/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb.c @@ -18,6 +18,11 @@ static void _ecore_xcb_event_filter_end(void *data, void *loop_data); static Ecore_Fd_Handler *_ecore_xcb_fd_handler_handle = NULL; static Ecore_Event_Filter *_ecore_xcb_filter_handler = NULL; +static const int AnyXEvent = 0; /* 0 can be used as there are no event types + * with index 0 and 1 as they are used for + * errors + */ + #ifdef ECORE_XCB_DAMAGE static int _ecore_xcb_event_damage_id = 0; #endif /* ECORE_XCB_DAMAGE */ @@ -60,6 +65,7 @@ Ecore_X_Window _ecore_xcb_private_window = 0; Ecore_X_Atom _ecore_xcb_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_NUM]; +EAPI int ECORE_X_EVENT_ANY = 0; EAPI int ECORE_X_EVENT_MOUSE_IN = 0; EAPI int ECORE_X_EVENT_MOUSE_OUT = 0; EAPI int ECORE_X_EVENT_WINDOW_FOCUS_IN = 0; @@ -400,6 +406,7 @@ ecore_x_init(const char *name) _ecore_xcb_xcursor = XcursorSupportsARGB(_ecore_xcb_conn); #endif /* ECORE_XCB_CURSOR */ + _ecore_xcb_event_handlers[AnyXEvent] = _ecore_x_event_handle_any_event; _ecore_xcb_event_handlers[XCB_KEY_PRESS] = _ecore_x_event_handle_key_press; _ecore_xcb_event_handlers[XCB_KEY_RELEASE] = _ecore_x_event_handle_key_release; _ecore_xcb_event_handlers[XCB_BUTTON_PRESS] = _ecore_x_event_handle_button_press; @@ -462,8 +469,9 @@ ecore_x_init(const char *name) _ecore_xcb_event_handlers[_ecore_xcb_event_fixes_selection_id] = _ecore_x_event_handle_fixes_selection_notify; #endif /* ECORE_XCB_FIXES */ - if (!ECORE_X_EVENT_MOUSE_IN) + if (!ECORE_X_EVENT_ANY) { + ECORE_X_EVENT_ANY = ecore_event_type_new(); ECORE_X_EVENT_MOUSE_IN = ecore_event_type_new(); ECORE_X_EVENT_MOUSE_OUT = ecore_event_type_new(); ECORE_X_EVENT_WINDOW_FOCUS_IN = ecore_event_type_new(); @@ -826,6 +834,9 @@ handle_event(xcb_generic_event_t *ev) if (response_type < _ecore_xcb_event_handlers_num) { + if (_ecore_xcb_event_handlers[AnyXEvent]) + _ecore_xcb_event_handlers[AnyXEvent] (&ev); + if (_ecore_xcb_event_handlers[response_type]) _ecore_xcb_event_handlers[response_type] (ev); } diff --git a/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_events.c b/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_events.c index 4e9632a1f2..d8a7aeca1c 100644 --- a/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_events.c +++ b/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_events.c @@ -192,6 +192,15 @@ _ecore_x_event_free_selection_notify(void *data __UNUSED__, void *ev) free(e); } +void +_ecore_x_event_handle_any_event(xcb_generic_event_t *event) +{ + xcb_generic_event_t* ev = malloc(sizeof(xcb_generic_event_t)); + memcpy(ev, event, sizeof(xcb_generic_event_t)); + + ecore_event_add(ECORE_X_EVENT_ANY, ev, NULL, NULL); +} + /* FIXME: handle this event */ void _ecore_x_event_handle_key_press(xcb_generic_event_t *event) diff --git a/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_private.h b/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_private.h index 605bb986b6..29337c0604 100644 --- a/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_private.h +++ b/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_private.h @@ -165,6 +165,7 @@ extern Ecore_X_Window _ecore_xcb_private_window; void _ecore_x_error_handler_init(void); +void _ecore_x_event_handle_any_event (xcb_generic_event_t *event); void _ecore_x_event_handle_key_press (xcb_generic_event_t *event); void _ecore_x_event_handle_key_release (xcb_generic_event_t *event); void _ecore_x_event_handle_button_press (xcb_generic_event_t *event); diff --git a/legacy/ecore/src/lib/ecore_x/xlib/ecore_x.c b/legacy/ecore/src/lib/ecore_x/xlib/ecore_x.c index eff10fca65..5dd79387ef 100644 --- a/legacy/ecore/src/lib/ecore_x/xlib/ecore_x.c +++ b/legacy/ecore/src/lib/ecore_x/xlib/ecore_x.c @@ -22,6 +22,12 @@ static int _ecore_x_key_mask_get(KeySym sym); static int _ecore_x_event_modifier(unsigned int state); static Ecore_Fd_Handler *_ecore_x_fd_handler_handle = NULL; + +static const int AnyXEvent = 0; /* 0 can be used as there are no event types + * with index 0 and 1 as they are used for + * errors + */ + static int _ecore_x_event_shape_id = 0; static int _ecore_x_event_screensaver_id = 0; static int _ecore_x_event_sync_id = 0; @@ -54,6 +60,7 @@ Ecore_X_Window _ecore_x_private_win = 0; Ecore_X_Atom _ecore_x_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_NUM]; +EAPI int ECORE_X_EVENT_ANY = 0; EAPI int ECORE_X_EVENT_MOUSE_IN = 0; EAPI int ECORE_X_EVENT_MOUSE_OUT = 0; EAPI int ECORE_X_EVENT_WINDOW_FOCUS_IN = 0; @@ -224,6 +231,7 @@ ecore_x_init(const char *name) #ifdef ECORE_XCURSOR _ecore_x_xcursor = XcursorSupportsARGB(_ecore_x_disp); #endif + _ecore_x_event_handlers[AnyXEvent] = _ecore_x_event_handle_any_event; _ecore_x_event_handlers[KeyPress] = _ecore_x_event_handle_key_press; _ecore_x_event_handlers[KeyRelease] = _ecore_x_event_handle_key_release; _ecore_x_event_handlers[ButtonPress] = _ecore_x_event_handle_button_press; @@ -292,8 +300,9 @@ ecore_x_init(const char *name) while (0); #endif - if (!ECORE_X_EVENT_MOUSE_IN) + if (!ECORE_X_EVENT_ANY) { + ECORE_X_EVENT_ANY = ecore_event_type_new(); ECORE_X_EVENT_MOUSE_IN = ecore_event_type_new(); ECORE_X_EVENT_MOUSE_OUT = ecore_event_type_new(); ECORE_X_EVENT_WINDOW_FOCUS_IN = ecore_event_type_new(); @@ -699,6 +708,9 @@ _ecore_x_fd_handler(void *data, Ecore_Fd_Handler *fd_handler __UNUSED__) if ((ev.type >= 0) && (ev.type < _ecore_x_event_handlers_num)) { + if (_ecore_x_event_handlers[AnyXEvent]) + _ecore_x_event_handlers[AnyXEvent] (&ev); + if (_ecore_x_event_handlers[ev.type]) _ecore_x_event_handlers[ev.type] (&ev); } diff --git a/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_events.c b/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_events.c index 01215e1503..d50c72bdc2 100644 --- a/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_events.c +++ b/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_events.c @@ -412,6 +412,15 @@ _ecore_mouse_button(int event, return e; } +void +_ecore_x_event_handle_any_event(XEvent *xevent) +{ + XEvent* ev = malloc(sizeof(XEvent)); + memcpy(ev, xevent, sizeof(XEvent)); + + ecore_event_add(ECORE_X_EVENT_ANY, ev, NULL, NULL); +} + void _ecore_x_event_handle_key_press(XEvent *xevent) { diff --git a/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_private.h b/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_private.h index e3d665e41b..3bd0027598 100644 --- a/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_private.h +++ b/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_private.h @@ -169,6 +169,7 @@ extern void *_ecore_window_grab_replay_data; extern Ecore_X_Window _ecore_x_private_win; void _ecore_x_error_handler_init(void); +void _ecore_x_event_handle_any_event(XEvent *xevent); void _ecore_x_event_handle_key_press(XEvent *xevent); void _ecore_x_event_handle_key_release(XEvent *xevent); void _ecore_x_event_handle_button_press(XEvent *xevent);