From: Bartlomiej Uliasz Date: Tue, 15 Sep 2015 10:08:56 +0000 (+0200) Subject: Fixed: There is no notification when the virtual keyboard appears X-Git-Tag: accepted/tizen/tv/20160311.055419~62 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=80fd0e73f4c5be1b094a39eba74005524fb2c2a9;p=profile%2Ftv%2Fapps%2Fnative%2Fscreen-reader.git Fixed: There is no notification when the virtual keyboard appears [UIFWAC-19] Change-Id: I15717f8d7a91afb996f2d13d596f90c67e557985 Signed-off-by: Bartlomiej Uliasz --- diff --git a/res/po/en_US.po b/res/po/en_US.po index f417595..afcdcf3 100644 --- a/res/po/en_US.po +++ b/res/po/en_US.po @@ -1,3 +1,10 @@ + +msgid "IDS_VISUAL_KEYBOARD_DISABLED" +msgstr "Visual keyboard disabled" + +msgid "IDS_VISUAL_KEYBOARD_ENABLED" +msgstr "Visual keyboard enabled" + msgid "IDS_REACHED_MAX_VAL" msgstr ", maximum value reached" @@ -198,3 +205,4 @@ msgstr "The Tick box for the entire group" msgid "IDS_TRAIT_LIST_ITEM_ICON" msgstr "icon" + diff --git a/src/keyboard_tracker.c b/src/keyboard_tracker.c index cff5294..0696183 100644 --- a/src/keyboard_tracker.c +++ b/src/keyboard_tracker.c @@ -16,12 +16,123 @@ #include #include +#include #include "keyboard_tracker.h" #include "logger.h" static AtspiDeviceListener *listener; static Keyboard_Tracker_Cb user_cb; static void *user_data; +static Ecore_Event_Handler *root_xwindow_property_changed_hld = NULL; +static Ecore_Event_Handler *active_xwindow_property_changed_hld = NULL; + +static void _check_keyboard_state(Ecore_X_Window keyboard_win) +{ + Ecore_X_Virtual_Keyboard_State keyboard_state; + static Ecore_X_Virtual_Keyboard_State last_keyboard_state = ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF; + + if (!keyboard_win) + { + return; + } + + keyboard_state = ecore_x_e_virtual_keyboard_state_get(keyboard_win); + if (keyboard_state == last_keyboard_state) + { + return; + } + + if (keyboard_state == ECORE_X_VIRTUAL_KEYBOARD_STATE_ON) + { + tts_speak (_("IDS_VISUAL_KEYBOARD_ENABLED"), EINA_FALSE); + last_keyboard_state = keyboard_state; + } + else if (keyboard_state == ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF) + { + tts_speak (_("IDS_VISUAL_KEYBOARD_DISABLED"), EINA_FALSE); + last_keyboard_state = keyboard_state; + } +} + +static Eina_Bool _active_xwindow_property_changed_cb(void *data, int type, void *event) +{ + Ecore_X_Event_Window_Property *wp; + wp = (Ecore_X_Event_Window_Property *)event; + + if (!wp) + { + return EINA_FALSE; + } + + if (wp->atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE) + { + DEBUG("keyboard state event"); + _check_keyboard_state(wp->win); + } + + return EINA_TRUE; +} + +void active_xwindow_property_tracker_register() +{ + Ecore_X_Window active_window = 0; + ecore_x_window_prop_xid_get(ecore_x_window_root_first_get(), ECORE_X_ATOM_NET_ACTIVE_WINDOW, ECORE_X_ATOM_WINDOW, &active_window, 1); + if (active_window) + { + ecore_x_event_mask_set(active_window, ECORE_X_EVENT_MASK_WINDOW_PROPERTY); + active_xwindow_property_changed_hld = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, _active_xwindow_property_changed_cb, NULL); + } +} + +void active_xwindow_property_tracker_unregister() +{ + if (active_xwindow_property_changed_hld) + { + ecore_event_handler_del(active_xwindow_property_changed_hld); + active_xwindow_property_changed_hld = NULL; + } +} + +static Eina_Bool _root_xwindow_property_changed_cb(void *data, int type, void *event) +{ + Ecore_X_Event_Window_Property *wp; + wp = (Ecore_X_Event_Window_Property *)event; + + if (!wp) + { + return EINA_FALSE; + } + + if (wp->atom == ECORE_X_ATOM_NET_ACTIVE_WINDOW) + { + DEBUG("active window change"); + active_xwindow_property_tracker_unregister(); + active_xwindow_property_tracker_register(); + } + + return EINA_TRUE; +} + +void root_xwindow_property_tracker_register() +{ + Ecore_X_Window root_window; + + root_window = ecore_x_window_root_first_get(); + if (root_window) + { + ecore_x_event_mask_set(root_window, ECORE_X_EVENT_MASK_WINDOW_PROPERTY); + root_xwindow_property_changed_hld = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, _root_xwindow_property_changed_cb, NULL); + } +} + +void root_xwindow_property_tracker_unregister() +{ + if (root_xwindow_property_changed_hld) + { + ecore_event_handler_del(root_xwindow_property_changed_hld); + root_xwindow_property_changed_hld = NULL; + } +} static gboolean device_cb(const AtspiDeviceEvent * stroke, void *data) { @@ -48,6 +159,8 @@ void keyboard_tracker_init(void) atspi_init(); listener = atspi_device_listener_new(device_cb, NULL, NULL); atspi_register_keystroke_listener(listener, NULL, 0, ATSPI_KEY_PRESSED, ATSPI_KEYLISTENER_SYNCHRONOUS | ATSPI_KEYLISTENER_CANCONSUME, NULL); + active_xwindow_property_tracker_register(); + root_xwindow_property_tracker_register(); DEBUG("keyboard tracker init"); } @@ -60,5 +173,7 @@ void keyboard_tracker_register(Keyboard_Tracker_Cb cb, void *data) void keyboard_tracker_shutdown(void) { atspi_deregister_keystroke_listener(listener, NULL, 0, ATSPI_KEY_PRESSED, NULL); + root_xwindow_property_tracker_unregister(); + active_xwindow_property_tracker_unregister(); DEBUG("keyboard tracker shutdown"); }