Fixed: There is no notification when the virtual keyboard appears
authorBartlomiej Uliasz <b.uliasz@samsung.com>
Tue, 15 Sep 2015 10:08:56 +0000 (12:08 +0200)
committerTomasz Olszak <t.olszak@samsung.com>
Tue, 15 Sep 2015 14:01:51 +0000 (23:01 +0900)
[UIFWAC-19]

Change-Id: I15717f8d7a91afb996f2d13d596f90c67e557985
Signed-off-by: Bartlomiej Uliasz <b.uliasz@samsung.com>
res/po/en_US.po
src/keyboard_tracker.c

index f417595..afcdcf3 100644 (file)
@@ -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"
+
index cff5294..0696183 100644 (file)
 
 #include <string.h>
 #include <atspi/atspi.h>
+#include <Ecore_X.h>
 #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");
 }