From 2e5251b36431e162fdb309c364661de2f80179b3 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 12 May 2017 12:08:32 -0400 Subject: [PATCH] ecore-wl2: add events for changes in keymap, selection, and kbd repeat rate @feature --- src/lib/ecore_wl2/Ecore_Wl2.h | 21 +++++++++++++++++++++ src/lib/ecore_wl2/ecore_wl2.c | 11 ++++++++++- src/lib/ecore_wl2/ecore_wl2_dnd.c | 8 ++++++++ src/lib/ecore_wl2/ecore_wl2_input.c | 19 +++++++++++++++++++ 4 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/lib/ecore_wl2/Ecore_Wl2.h b/src/lib/ecore_wl2/Ecore_Wl2.h index 9c3e959..cd8146f 100644 --- a/src/lib/ecore_wl2/Ecore_Wl2.h +++ b/src/lib/ecore_wl2/Ecore_Wl2.h @@ -180,6 +180,12 @@ typedef struct _Ecore_Wl2_Event_Data_Source_Send Ecore_Wl2_Display *display; } Ecore_Wl2_Event_Data_Source_Send; +typedef struct Ecore_Wl2_Event_Seat_Selection +{ + unsigned int seat; + Ecore_Wl2_Display *display; +} Ecore_Wl2_Event_Seat_Selection; + typedef struct _Ecore_Wl2_Event_Seat_Name { Eina_Stringshare *name; @@ -237,6 +243,18 @@ typedef struct _Ecore_Wl2_Event_Window_Configure_Complete unsigned int win; } Ecore_Wl2_Event_Window_Configure_Complete; +typedef struct _Ecore_Wl2_Event_Input_Keymap_Changed +{ + unsigned int id; + Ecore_Wl2_Display *display; +} Ecore_Wl2_Event_Seat_Keymap_Changed; + +typedef struct Ecore_Wl2_Event_Seat_Keyboard_Repeat_Changed +{ + unsigned int id; + Ecore_Wl2_Display *display; +} Ecore_Wl2_Event_Seat_Keyboard_Repeat_Changed; + typedef struct _Ecore_Wl2_Event_Sync_Done { Ecore_Wl2_Display *display; @@ -289,6 +307,9 @@ EAPI extern int ECORE_WL2_EVENT_SEAT_CAPABILITIES_CHANGED; /** @since 1.19 */ EAPI extern int ECORE_WL2_EVENT_DEVICE_ADDED; /** @since 1.19 */ EAPI extern int ECORE_WL2_EVENT_DEVICE_REMOVED; /** @since 1.19 */ EAPI extern int ECORE_WL2_EVENT_WINDOW_CONFIGURE_COMPLETE; /** @since 1.19 */ +EAPI extern int ECORE_WL2_EVENT_SEAT_KEYMAP_CHANGED; /** @since 1.20 */ +EAPI extern int ECORE_WL2_EVENT_SEAT_KEYBOARD_REPEAT_CHANGED; /** @since 1.20 */ +EAPI extern int ECORE_WL2_EVENT_SEAT_SELECTION; /** @since 1.20 */ /** * @file diff --git a/src/lib/ecore_wl2/ecore_wl2.c b/src/lib/ecore_wl2/ecore_wl2.c index 7c1b1f0..b9c9ec5 100644 --- a/src/lib/ecore_wl2/ecore_wl2.c +++ b/src/lib/ecore_wl2/ecore_wl2.c @@ -36,6 +36,9 @@ EAPI int ECORE_WL2_EVENT_SEAT_CAPABILITIES_CHANGED = 0; EAPI int ECORE_WL2_EVENT_DEVICE_ADDED = 0; EAPI int ECORE_WL2_EVENT_DEVICE_REMOVED = 0; EAPI int ECORE_WL2_EVENT_WINDOW_CONFIGURE_COMPLETE = 0; +EAPI int ECORE_WL2_EVENT_SEAT_KEYMAP_CHANGED = 0; +EAPI int ECORE_WL2_EVENT_SEAT_KEYBOARD_REPEAT_CHANGED = 0; +EAPI int ECORE_WL2_EVENT_SEAT_SELECTION = 0; EAPI int _ecore_wl2_event_window_www = -1; EAPI int _ecore_wl2_event_window_www_drag = -1; @@ -101,6 +104,9 @@ ecore_wl2_init(void) _ecore_wl2_event_window_www = ecore_event_type_new(); _ecore_wl2_event_window_www_drag = ecore_event_type_new(); ECORE_WL2_EVENT_WINDOW_CONFIGURE_COMPLETE = ecore_event_type_new(); + ECORE_WL2_EVENT_SEAT_KEYMAP_CHANGED = ecore_event_type_new(); + ECORE_WL2_EVENT_SEAT_KEYBOARD_REPEAT_CHANGED = ecore_event_type_new(); + ECORE_WL2_EVENT_SEAT_SELECTION = ecore_event_type_new(); } if (!no_session_recovery) no_session_recovery = !!getenv("EFL_NO_WAYLAND_SESSION_RECOVERY"); @@ -154,7 +160,10 @@ ecore_wl2_shutdown(void) ECORE_WL2_EVENT_SEAT_CAPABILITIES_CHANGED, ECORE_WL2_EVENT_DEVICE_ADDED, ECORE_WL2_EVENT_DEVICE_REMOVED, - ECORE_WL2_EVENT_WINDOW_CONFIGURE_COMPLETE); + ECORE_WL2_EVENT_WINDOW_CONFIGURE_COMPLETE, + ECORE_WL2_EVENT_SEAT_KEYMAP_CHANGED, + ECORE_WL2_EVENT_SEAT_KEYBOARD_REPEAT_CHANGED, + ECORE_WL2_EVENT_SEAT_SELECTION); /* shutdown Ecore_Event */ ecore_event_shutdown(); diff --git a/src/lib/ecore_wl2/ecore_wl2_dnd.c b/src/lib/ecore_wl2/ecore_wl2_dnd.c index 132eeb3..830ca4e 100644 --- a/src/lib/ecore_wl2/ecore_wl2_dnd.c +++ b/src/lib/ecore_wl2/ecore_wl2_dnd.c @@ -379,11 +379,19 @@ _ecore_wl2_dnd_drop(Ecore_Wl2_Input *input) void _ecore_wl2_dnd_selection(Ecore_Wl2_Input *input, struct wl_data_offer *offer) { + Ecore_Wl2_Event_Seat_Selection *ev; + if (input->selection) _ecore_wl2_offer_unref(input->selection); input->selection = NULL; if (offer) input->selection = wl_data_offer_get_user_data(offer); + ev = malloc(sizeof(Ecore_Wl2_Event_Seat_Selection)); + EINA_SAFETY_ON_NULL_RETURN(ev); + ev->seat = input->id; + ev->display = input->display; + ev->display->refs++; + ecore_event_add(ECORE_WL2_EVENT_SEAT_SELECTION, ev, _display_event_free, ev->display); } void diff --git a/src/lib/ecore_wl2/ecore_wl2_input.c b/src/lib/ecore_wl2/ecore_wl2_input.c index 9c7f5d9..1cd8ea8 100644 --- a/src/lib/ecore_wl2/ecore_wl2_input.c +++ b/src/lib/ecore_wl2/ecore_wl2_input.c @@ -824,6 +824,16 @@ _keyboard_cb_keymap(void *data, struct wl_keyboard *keyboard EINA_UNUSED, unsign input->xkb.keymap = NULL; return; } + { + Ecore_Wl2_Event_Seat_Keymap_Changed *ev = malloc(sizeof(Ecore_Wl2_Event_Seat_Keymap_Changed)); + if (ev) + { + ev->id = input->id; + ev->display = input->display; + input->display->refs++; + ecore_event_add(ECORE_WL2_EVENT_SEAT_KEYMAP_CHANGED, ev, _display_event_free, ev->display); + } + } input->xkb.control_mask = 1 << xkb_map_mod_get_index(input->xkb.keymap, XKB_MOD_NAME_CTRL); @@ -1019,6 +1029,7 @@ static void _keyboard_cb_repeat_setup(void *data, struct wl_keyboard *keyboard EINA_UNUSED, int32_t rate, int32_t delay) { Ecore_Wl2_Input *input; + Ecore_Wl2_Event_Seat_Keyboard_Repeat_Changed *ev; input = data; if (!input) return; @@ -1032,6 +1043,14 @@ _keyboard_cb_repeat_setup(void *data, struct wl_keyboard *keyboard EINA_UNUSED, input->repeat.enabled = EINA_TRUE; input->repeat.rate = (1.0 / rate); input->repeat.delay = (delay / 1000.0); + ev = malloc(sizeof(Ecore_Wl2_Event_Seat_Keymap_Changed)); + if (ev) + { + ev->id = input->id; + ev->display = input->display; + ev->display->refs++; + ecore_event_add(ECORE_WL2_EVENT_SEAT_KEYBOARD_REPEAT_CHANGED, ev, _display_event_free, ev->display); + } } static const struct wl_keyboard_listener _keyboard_listener = -- 2.7.4