Break apart keyboard code to separate dbus code (cleaner).
authorChristopher Michael <cpmichael1@comcast.net>
Sun, 27 Dec 2009 00:57:04 +0000 (00:57 +0000)
committerChristopher Michael <cpmichael1@comcast.net>
Sun, 27 Dec 2009 00:57:04 +0000 (00:57 +0000)
Fix initial home window size problem.

SVN revision: 44725

src/modules/illume2/Makefile.am
src/modules/illume2/e_kbd.c
src/modules/illume2/e_kbd.h
src/modules/illume2/e_kbd_dbus.c [new file with mode: 0644]
src/modules/illume2/e_kbd_dbus.h [new file with mode: 0644]
src/modules/illume2/e_mod_main.c

index 1c87990..4eba077 100644 (file)
@@ -29,6 +29,8 @@ module_la_SOURCES      = e_mod_main.h \
                          e_mod_border.c \
                          e_kbd.h \
                          e_kbd.c \
+                         e_kbd_dbus.h \
+                         e_kbd_dbus.c \
                          e_mod_config.h \
                          e_mod_config.c \
                          e_mod_animation.h \
index e30a875..e93ab47 100644 (file)
 #include "e.h"
 #include "e_kbd.h"
+#include "e_kbd_dbus.h"
 #include "e_mod_config.h"
 
-static Eina_List *handlers = NULL;
-static Eina_List *kbds = NULL;
-static Ecore_X_Atom atom_mb_im_invoker_command = 0;
-static Ecore_X_Atom atom_mtp_im_invoker_command = 0;
-static Eina_List *border_hooks = NULL;
-static E_Border *focused_border = NULL;
-static Ecore_X_Atom focused_vkbd_state = 0;
-static E_Module *mod = NULL;
-static Ecore_Job *_e_kbd_apply_all_job = NULL;
-
 #define ICONIFY_TO_HIDE 0
 
+/* local function prototypes */
+static void _e_kbd_cb_free(E_Kbd *kbd);
+static int _e_kbd_cb_delay_hide(void *data);
+static void _e_kbd_hide(E_Kbd *kbd);
 static void _e_kbd_layout_send(E_Kbd *kbd);
+static void _e_kbd_border_show(E_Border *bd);
+static void _e_kbd_border_hide(E_Border *bd);
+static void _e_kbd_slide(E_Kbd *kbd, int visible, double len);
+static void _e_kbd_all_show(void);
+static void _e_kbd_all_hide(void);
+static void _e_kbd_all_toggle(void);
+static void _e_kbd_all_layout_set(E_Kbd_Layout layout);
+static E_Kbd *_e_kbd_by_border_get(E_Border *bd);
+static void _e_kbd_border_adopt(E_Kbd *kbd, E_Border *bd);
+static void _e_kbd_vkbd_state_handle(Ecore_X_Virtual_Keyboard_State state);
+static int _e_kbd_border_is_keyboard(E_Border *bd);
+
+static int _e_kbd_cb_animate(void *data);
+static int _e_kbd_cb_client_message(void *data, int type, void *event);
+static int _e_kbd_cb_border_remove(void *data, int type, void *event);
+static int _e_kbd_cb_border_focus_in(void *data, int type, void *event);
+static int _e_kbd_cb_border_focus_out(void *data, int type, void *event);
+static int _e_kbd_cb_border_property(void *data, int type, void *event);
+static void _e_kbd_cb_border_pre_post_fetch(void *data, void *data2);
+static void _e_kbd_cb_border_post_assign(void *data, void *data2);
+static void _e_kbd_cb_border_end(void *data, void *data2);
+
+/* local variables */
+static Eina_List *handlers = NULL, *hooks = NULL, *kbds = NULL;
+static Ecore_X_Atom atom_mb_invoker = 0;
+static Ecore_X_Atom atom_mtp_invoker = 0;
+static Ecore_X_Atom atom_focused_vkbd_state = 0;
+const char *mod_dir = NULL;
+
+/* public functions */
+int 
+e_kbd_init(E_Module *m) 
+{
+   mod_dir = eina_stringshare_add(m->dir);
+   atom_mb_invoker = ecore_x_atom_get("_MB_IM_INVOKER_COMMAND");
+   atom_mtp_invoker = ecore_x_atom_get("_MTP_IM_INVOKER_COMMAND");
+
+   handlers = 
+     eina_list_append(handlers, 
+                      ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, 
+                                              _e_kbd_cb_client_message, NULL));
+   handlers = 
+     eina_list_append(handlers, 
+                      ecore_event_handler_add(E_EVENT_BORDER_REMOVE, 
+                                              _e_kbd_cb_border_remove, NULL));
+   handlers = 
+     eina_list_append(handlers, 
+                      ecore_event_handler_add(E_EVENT_BORDER_FOCUS_IN, 
+                                              _e_kbd_cb_border_focus_in, NULL));
+   handlers = 
+     eina_list_append(handlers, 
+                      ecore_event_handler_add(E_EVENT_BORDER_FOCUS_OUT, 
+                                              _e_kbd_cb_border_focus_out, NULL));
+   handlers = 
+     eina_list_append(handlers, 
+                      ecore_event_handler_add(E_EVENT_BORDER_PROPERTY, 
+                                              _e_kbd_cb_border_property, NULL));
+   hooks = 
+     eina_list_append(hooks, 
+                      e_border_hook_add(E_BORDER_HOOK_EVAL_PRE_POST_FETCH, 
+                                        _e_kbd_cb_border_pre_post_fetch, NULL));
+   hooks = 
+     eina_list_append(hooks, 
+                      e_border_hook_add(E_BORDER_HOOK_EVAL_POST_BORDER_ASSIGN, 
+                                        _e_kbd_cb_border_post_assign, NULL));
+   hooks = 
+     eina_list_append(hooks, 
+                      e_border_hook_add(E_BORDER_HOOK_EVAL_END, 
+                                        _e_kbd_cb_border_end, NULL));
+
+   e_kbd_dbus_init();
+   return 1;
+}
+
+int 
+e_kbd_shutdown(void) 
+{
+   E_Border_Hook *hook;
+   Ecore_Event_Handler *handler;
+
+   e_kbd_dbus_shutdown();
+   EINA_LIST_FREE(hooks, hook)
+     e_border_hook_del(hook);
+   EINA_LIST_FREE(handlers, handler)
+     ecore_event_handler_del(handler);
+   if (mod_dir) eina_stringshare_del(mod_dir);
+   mod_dir = NULL;
+   return 1;
+}
 
-static void
-_e_kbd_cb_apply_all_job(void *data)
+E_Kbd *
+e_kbd_new(void) 
 {
-//   _e_mod_layout_apply_all();
-   _e_kbd_apply_all_job = NULL;
+   E_Kbd *kbd;
+
+   kbd = E_OBJECT_ALLOC(E_Kbd, E_KBD_TYPE, _e_kbd_cb_free);
+   if (!kbd) return NULL;
+   kbds = eina_list_append(kbds, kbd);
+   kbd->layout = ECORE_X_VIRTUAL_KEYBOARD_STATE_ON;
+   return kbd;
 }
 
-static void
-_e_kbd_apply_all_job_queue(void)
+void 
+e_kbd_enable(E_Kbd *kbd) 
 {
-   if (_e_kbd_apply_all_job) ecore_job_del(_e_kbd_apply_all_job);
-   _e_kbd_apply_all_job = ecore_job_add(_e_kbd_cb_apply_all_job, NULL);
+   if (!kbd->disabled) return;
+   kbd->disabled = 0;
+   if (kbd->visible) 
+     {
+        kbd->visible = 0;
+        e_kbd_show(kbd);
+     }
 }
 
-static void
-_e_kbd_apply_all_job_queue_end(void)
+void 
+e_kbd_disable(E_Kbd *kbd) 
 {
-   if (_e_kbd_apply_all_job) ecore_job_del(_e_kbd_apply_all_job);
-   _e_kbd_apply_all_job = NULL;
+   if (kbd->disabled) return;
+   if (kbd->visible) e_kbd_hide(kbd);
+   kbd->disabled = 1;
 }
 
-static void
-_e_kbd_border_hide(E_Border *bd)
+void 
+e_kbd_show(E_Kbd *kbd) 
 {
-   if (!bd) return;
-#ifdef ICONIFY_TO_HIDE
-   e_border_iconify(bd);
-#else
-   e_border_hide(bd, 2);
-#endif   
+   if (kbd->delay_hide) ecore_timer_del(kbd->delay_hide);
+   kbd->delay_hide = NULL;
+   if (kbd->visible) return;
+   kbd->visible = 1;
+   if (kbd->disabled) return;
+   _e_kbd_layout_send(kbd);
+   if (il_cfg->sliding.kbd.duration <= 0) 
+     {
+        if (kbd->border) 
+          {
+             e_border_fx_offset(kbd->border, 0, 0);
+             _e_kbd_border_show(kbd->border);
+          }
+        kbd->actually_visible = 1;
+     }
+   else 
+     {
+        if (kbd->border) 
+          {
+             e_border_fx_offset(kbd->border, 0, kbd->border->h - kbd->adjust);
+             _e_kbd_border_show(kbd->border);
+          }
+        _e_kbd_slide(kbd, 1, (double)il_cfg->sliding.kbd.duration / 1000.0);
+     }
 }
 
-static void
-_e_kbd_border_show(E_Kbd *kbd, E_Border *bd)
+void 
+e_kbd_hide(E_Kbd *kbd) 
 {
-   if (!bd) return;
-   e_border_uniconify(bd);
-   if (kbd->fullscreen)
-     e_border_layer_set(kbd->border, 250);
-   else
-     e_border_layer_set(kbd->border, 100);
-   e_border_show(bd);
-   e_border_raise(bd);
+   if (!kbd->visible) return;
+   kbd->visible = 0;
+   if (!kbd->delay_hide)
+     kbd->delay_hide = ecore_timer_add(0.2, _e_kbd_cb_delay_hide, kbd);
 }
 
-static int
-_e_kbd_cb_animate(void *data)
+void 
+e_kbd_safe_app_region_get(E_Zone *zone, int *x, int *y, int *w, int *h) 
 {
+   Eina_List *l;
    E_Kbd *kbd;
-   double t, v;
 
-   kbd = data;
-   t = ecore_loop_time_get() - kbd->start;
-   if (t > kbd->len) t = kbd->len;
-   if (kbd->len > 0.0)
-     {
-       v = t / kbd->len;
-       v = 1.0 - v;
-       v = v * v * v * v;
-       v = 1.0 - v;
-     }
-   else
-     {
-       t = kbd->len;
-       v = 1.0;
-     }
-   kbd->adjust = (kbd->adjust_end * v) + (kbd->adjust_start  * (1.0 - v));
-   if (kbd->border)
-     e_border_fx_offset(kbd->border, 0, kbd->border->h - kbd->adjust);
-   if (t == kbd->len)
+   if (x) *x = zone->x;
+   if (y) *y = zone->y;
+   if (w) *w = zone->w;
+   if (h) *h = zone->h;
+   EINA_LIST_FOREACH(kbds, l, kbd) 
      {
-       kbd->animator = NULL;
-       if (!kbd->visible)
-         {
-            _e_kbd_border_hide(kbd->border);
-            kbd->actually_visible = kbd->visible;
-         }
-       _e_kbd_apply_all_job_queue();
-       _e_kbd_layout_send(kbd);
-       return 0;
+        if ((kbd->border) && (kbd->border->zone == zone)) 
+          {
+             if ((kbd->actually_visible) && 
+                 (!kbd->animator) && (!kbd->disabled)) 
+               {
+                  if (h) 
+                    {
+                       *h -= kbd->border->h;
+                       if (*h < 0) *h = 0;
+                    }
+               }
+             return;
+          }
      }
-   return 1;
 }
 
-static void
-_e_kbd_free(E_Kbd *kbd)
+void 
+e_kbd_fullscreen_set(E_Zone *zone, int fullscreen) 
+{
+   Eina_List *l;
+   E_Kbd *kbd;
+
+   EINA_LIST_FOREACH(kbds, l, kbd)
+     if ((!!fullscreen) != kbd->fullscreen) 
+       {
+          int layer = 100;
+
+          kbd->fullscreen = fullscreen;
+          if (fullscreen) layer = 250;
+          if (kbd->border->layer != layer)
+            e_border_layer_set(kbd->border, layer);
+       }
+}
+
+void 
+e_kbd_layout_set(E_Kbd *kbd, E_Kbd_Layout layout) 
+{
+   if (kbd->layout == layout) return;
+   kbd->layout = layout;
+   _e_kbd_layout_send(kbd);
+}
+
+void 
+e_kbd_all_enable(void) 
+{
+   Eina_List *l;
+   E_Kbd *kbd;
+
+   EINA_LIST_FOREACH(kbds, l, kbd)
+     e_kbd_enable(kbd);
+}
+
+void 
+e_kbd_all_disable(void) 
+{
+   Eina_List *l;
+   E_Kbd *kbd;
+
+   EINA_LIST_FOREACH(kbds, l, kbd)
+     e_kbd_disable(kbd);
+}
+
+/* local functions */
+static void 
+_e_kbd_cb_free(E_Kbd *kbd) 
 {
    E_Border *bd;
 
    kbds = eina_list_remove(kbds, kbd);
    if (kbd->animator) ecore_animator_del(kbd->animator);
    if (kbd->delay_hide) ecore_timer_del(kbd->delay_hide);
-// FIXME: thought right - on shutdown, this might point to freed data
-//   if (kbd->border) kbd->border->stolen = 0;
    EINA_LIST_FREE(kbd->waiting_borders, bd)
      bd->stolen = 0;
-   free(kbd);
+   E_FREE(kbd);
 }
 
-static void
-_e_kbd_slide(E_Kbd *kbd, int visible, double len)
+static int 
+_e_kbd_cb_delay_hide(void *data) 
 {
-   _e_kbd_apply_all_job_queue();
-   kbd->start = ecore_loop_time_get();
-   kbd->len = len;
-   kbd->adjust_start = kbd->adjust;
-   kbd->adjust_end = 0;
-   if ((visible) && (kbd->border))
-     kbd->adjust_end = kbd->border->h;
-   if (!kbd->animator)
-     kbd->animator = ecore_animator_add(_e_kbd_cb_animate, kbd);
+   E_Kbd *kbd;
+
+   if (!(kbd = data)) return 0;
+   _e_kbd_hide(kbd);
+   kbd->delay_hide = NULL;
+   return 0;
 }
 
 static void 
-_e_kbd_hide(E_Kbd *kbd)
+_e_kbd_hide(E_Kbd *kbd) 
 {
    if (kbd->visible) return;
-   if (il_cfg->sliding.kbd.duration <= 0)
+   if (il_cfg->sliding.kbd.duration <= 0) 
      {
-       _e_kbd_border_hide(kbd->border);
-       kbd->actually_visible = kbd->visible;
-       _e_kbd_apply_all_job_queue();
-       _e_kbd_layout_send(kbd);
+        _e_kbd_border_hide(kbd->border);
+        kbd->actually_visible = 0;
+        _e_kbd_layout_send(kbd);
      }
    else
      _e_kbd_slide(kbd, 0, (double)il_cfg->sliding.kbd.duration / 1000.0);
 }
 
-static int
-_e_kbd_border_is_keyboard(E_Border *bd)
+static void 
+_e_kbd_layout_send(E_Kbd *kbd) 
 {
-   if ((bd->client.vkbd.vkbd) || /* explicit hint that its a virtual keyboard */
-       /* legacy */
-       ( /* trap the matchbox qwerty and multitap kbd's */
-        (((bd->client.icccm.title) && (!strcmp(bd->client.icccm.title, "Keyboard"))) ||
-         ((bd->client.icccm.name) && ((!strcmp(bd->client.icccm.name, "multitap-pad")))))
-        && (bd->client.netwm.state.skip_taskbar)
-        && (bd->client.netwm.state.skip_pager)))
-     return 1;
-   return 0;
-}
+   Ecore_X_Virtual_Keyboard_State state;
 
-static void
-_e_kbd_border_adopt(E_Kbd *kbd, E_Border *bd)
-{
-   kbd->border = bd;
-   bd->sticky = 1;
-   if (kbd->fullscreen)
-     e_border_layer_set(kbd->border, 250);
-   else
-     e_border_layer_set(kbd->border, 100);
-   if (!kbd->actually_visible)
+   state = ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF;
+   if ((kbd->actually_visible) && (!kbd->disabled)) 
      {
-       e_border_fx_offset(kbd->border, 0, kbd->border->h);
-       _e_kbd_layout_send(kbd);
+        state = ECORE_X_VIRTUAL_KEYBOARD_STATE_ON;
+        if (kbd->layout == E_KBD_LAYOUT_ALPHA) 
+          state = ECORE_X_VIRTUAL_KEYBOARD_STATE_ALPHA;
+        else if (kbd->layout == E_KBD_LAYOUT_NUMERIC) 
+          state = ECORE_X_VIRTUAL_KEYBOARD_STATE_NUMERIC;
+        else if (kbd->layout == E_KBD_LAYOUT_PIN) 
+          state = ECORE_X_VIRTUAL_KEYBOARD_STATE_PIN;
+        else if (kbd->layout == E_KBD_LAYOUT_PHONE_NUMBER) 
+          state = ECORE_X_VIRTUAL_KEYBOARD_STATE_PHONE_NUMBER;
+        else if (kbd->layout == E_KBD_LAYOUT_HEX) 
+          state = ECORE_X_VIRTUAL_KEYBOARD_STATE_HEX;
+        else if (kbd->layout == E_KBD_LAYOUT_TERMINAL) 
+          state = ECORE_X_VIRTUAL_KEYBOARD_STATE_TERMINAL;
+        else if (kbd->layout == E_KBD_LAYOUT_PASSWORD) 
+          state = ECORE_X_VIRTUAL_KEYBOARD_STATE_PASSWORD;
+        else if (kbd->layout == E_KBD_LAYOUT_IP) 
+          state = ECORE_X_VIRTUAL_KEYBOARD_STATE_IP;
+        else if (kbd->layout == E_KBD_LAYOUT_HOST) 
+          state = ECORE_X_VIRTUAL_KEYBOARD_STATE_HOST;
+        else if (kbd->layout == E_KBD_LAYOUT_FILE) 
+          state = ECORE_X_VIRTUAL_KEYBOARD_STATE_FILE;
+        else if (kbd->layout == E_KBD_LAYOUT_URL) 
+          state = ECORE_X_VIRTUAL_KEYBOARD_STATE_URL;
+        else if (kbd->layout == E_KBD_LAYOUT_KEYPAD) 
+          state = ECORE_X_VIRTUAL_KEYBOARD_STATE_KEYPAD;
+        else if (kbd->layout == E_KBD_LAYOUT_J2ME) 
+          state = ECORE_X_VIRTUAL_KEYBOARD_STATE_J2ME;
+        else if (kbd->layout == E_KBD_LAYOUT_NONE) 
+          state = ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF;
      }
-   kbd->h = kbd->border->h;
+   if (kbd->border)
+     ecore_x_e_virtual_keyboard_state_send(kbd->border->client.win, state);
 }
 
-static E_Kbd * 
-_e_kbd_by_border_get(E_Border *bd)
+static void 
+_e_kbd_border_show(E_Border *bd) 
 {
-   Eina_List *l, *l2;
-   E_Border *over;
-   E_Kbd *kbd;
-
-   if (!bd->stolen) return NULL;
-   EINA_LIST_FOREACH(kbds, l, kbd)
-     {
-       if (kbd->border == bd) return kbd;
-       EINA_LIST_FOREACH(kbd->waiting_borders, l2, over)
-         if (over == bd) return kbd;
-     }
-   return NULL;
+   if (!bd) return;
+   e_border_uniconify(bd);
+   e_border_show(bd);
+   e_border_raise(bd);
 }
 
-static int
-_e_kbd_cb_delayed_hide(void *data)
+static void 
+_e_kbd_border_hide(E_Border *bd) 
 {
-   E_Kbd *kbd;
+   if (!bd) return;
+#ifdef ICONIFY_TO_HIDE
+   e_border_iconify(bd);
+#else
+   e_border_hide(bd, 2);
+#endif
+}
 
-   kbd = data;
-   _e_kbd_hide(kbd);
-   kbd->delay_hide = NULL;
-   return 0;
+static void 
+_e_kbd_slide(E_Kbd *kbd, int visible, double len) 
+{
+   kbd->start = ecore_loop_time_get();
+   kbd->len = len;
+   kbd->adjust_start = kbd->adjust;
+   kbd->adjust_end = 0;
+   if ((visible) && (kbd->border))
+     kbd->adjust_end = kbd->border->h;
+   if (!kbd->animator)
+     kbd->animator = ecore_animator_add(_e_kbd_cb_animate, kbd);
 }
 
-static void
-_e_kbd_all_enable(void)
+static void 
+_e_kbd_all_show(void) 
 {
    Eina_List *l;
    E_Kbd *kbd;
 
    EINA_LIST_FOREACH(kbds, l, kbd)
-     e_kbd_enable(kbd);
+     e_kbd_show(kbd);
 }
 
-static void
-_e_kbd_all_disable(void)
+static void 
+_e_kbd_all_hide(void) 
 {
    Eina_List *l;
    E_Kbd *kbd;
 
    EINA_LIST_FOREACH(kbds, l, kbd)
-     e_kbd_disable(kbd);
+     e_kbd_hide(kbd);
 }
 
-static void
-_e_kbd_all_show(void)
+static void 
+_e_kbd_all_toggle(void) 
 {
    Eina_List *l;
    E_Kbd *kbd;
 
    EINA_LIST_FOREACH(kbds, l, kbd) 
-     e_kbd_show(kbd);
+     {
+        if (kbd->visible) e_kbd_hide(kbd);
+        else e_kbd_show(kbd);
+     }
 }
 
-static void
-_e_kbd_all_layout_set(E_Kbd_Layout layout)
+static void 
+_e_kbd_all_layout_set(E_Kbd_Layout layout) 
 {
    Eina_List *l;
    E_Kbd *kbd;
@@ -243,141 +401,201 @@ _e_kbd_all_layout_set(E_Kbd_Layout layout)
      e_kbd_layout_set(kbd, layout);
 }
 
-static void
-_e_kbd_all_hide(void)
+static E_Kbd *
+_e_kbd_by_border_get(E_Border *bd) 
 {
-   Eina_List *l;
+   Eina_List *l, *ll;
+   E_Border *over;
    E_Kbd *kbd;
 
+   if (!bd->stolen) return NULL;
    EINA_LIST_FOREACH(kbds, l, kbd) 
-     e_kbd_hide(kbd);
+     {
+        if (kbd->border == bd) return kbd;
+        EINA_LIST_FOREACH(kbd->waiting_borders, ll, over)
+          if (over == bd) return kbd;
+     }
+   return NULL;
 }
 
-static void
-_e_kbd_all_toggle(void)
+static void 
+_e_kbd_border_adopt(E_Kbd *kbd, E_Border *bd) 
 {
-   Eina_List *l;
-   E_Kbd *kbd;
+   kbd->border = bd;
+   bd->sticky = 1;
+   if (kbd->fullscreen)
+     e_border_layer_set(kbd->border, 250);
+   else
+     e_border_layer_set(kbd->border, 100);
+   if (!kbd->actually_visible) 
+     e_border_fx_offset(kbd->border, 0, kbd->border->h);
+   kbd->h = kbd->border->h;
+}
 
-   EINA_LIST_FOREACH(kbds, l, kbd) 
+static void 
+_e_kbd_vkbd_state_handle(Ecore_X_Virtual_Keyboard_State state) 
+{
+   atom_focused_vkbd_state = state;
+   if (atom_focused_vkbd_state == 0) return;
+   if (atom_focused_vkbd_state == ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF) 
      {
-        if (kbd->visible) e_kbd_hide(kbd);
-        else e_kbd_show(kbd);
+//        _e_kbd_all_layout_set(E_KBD_LAYOUT_NONE);
+        _e_kbd_all_hide();
+     }
+   else 
+     {
+        if (atom_focused_vkbd_state == ECORE_X_VIRTUAL_KEYBOARD_STATE_ALPHA)
+          _e_kbd_all_layout_set(E_KBD_LAYOUT_ALPHA);
+        else if (atom_focused_vkbd_state == ECORE_X_VIRTUAL_KEYBOARD_STATE_NUMERIC)
+          _e_kbd_all_layout_set(E_KBD_LAYOUT_NUMERIC);
+        else if (atom_focused_vkbd_state == ECORE_X_VIRTUAL_KEYBOARD_STATE_PIN)
+          _e_kbd_all_layout_set(E_KBD_LAYOUT_PIN);
+        else if (atom_focused_vkbd_state == ECORE_X_VIRTUAL_KEYBOARD_STATE_PHONE_NUMBER)
+          _e_kbd_all_layout_set(E_KBD_LAYOUT_PHONE_NUMBER);
+        else if (atom_focused_vkbd_state == ECORE_X_VIRTUAL_KEYBOARD_STATE_HEX)
+          _e_kbd_all_layout_set(E_KBD_LAYOUT_HEX);
+        else if (atom_focused_vkbd_state == ECORE_X_VIRTUAL_KEYBOARD_STATE_TERMINAL)
+          _e_kbd_all_layout_set(E_KBD_LAYOUT_TERMINAL);
+        else if (atom_focused_vkbd_state == ECORE_X_VIRTUAL_KEYBOARD_STATE_PASSWORD)
+          _e_kbd_all_layout_set(E_KBD_LAYOUT_PASSWORD);
+        else if (atom_focused_vkbd_state == ECORE_X_VIRTUAL_KEYBOARD_STATE_IP)
+          _e_kbd_all_layout_set(E_KBD_LAYOUT_IP);
+        else if (atom_focused_vkbd_state == ECORE_X_VIRTUAL_KEYBOARD_STATE_HOST)
+          _e_kbd_all_layout_set(E_KBD_LAYOUT_HOST);
+        else if (atom_focused_vkbd_state == ECORE_X_VIRTUAL_KEYBOARD_STATE_FILE)
+          _e_kbd_all_layout_set(E_KBD_LAYOUT_FILE);
+        else if (atom_focused_vkbd_state == ECORE_X_VIRTUAL_KEYBOARD_STATE_URL)
+          _e_kbd_all_layout_set(E_KBD_LAYOUT_URL);
+        else if (atom_focused_vkbd_state == ECORE_X_VIRTUAL_KEYBOARD_STATE_KEYPAD)
+          _e_kbd_all_layout_set(E_KBD_LAYOUT_KEYPAD);
+        else if (atom_focused_vkbd_state == ECORE_X_VIRTUAL_KEYBOARD_STATE_J2ME)
+          _e_kbd_all_layout_set(E_KBD_LAYOUT_J2ME);
+        else
+          _e_kbd_all_layout_set(E_KBD_LAYOUT_DEFAULT);
+        _e_kbd_all_show();
      }
 }
 
-static int
-_e_kbd_cb_client_message(void *data, int type, void *event)
+static int 
+_e_kbd_border_is_keyboard(E_Border *bd) 
 {
-   Ecore_X_Event_Client_Message *ev;
+   if ((bd->client.vkbd.vkbd) || /* explicit hint that its a virtual keyboard */
+       /* legacy */
+       ( /* trap the matchbox qwerty and multitap kbd's */
+        (((bd->client.icccm.title) && (!strcmp(bd->client.icccm.title, "Keyboard"))) ||
+         ((bd->client.icccm.name) && ((!strcmp(bd->client.icccm.name, "multitap-pad")))))
+        && (bd->client.netwm.state.skip_taskbar)
+        && (bd->client.netwm.state.skip_pager)))
+     return 1;
+   return 0;
+}
 
-   ev = event;
-   if ((ev->win == ecore_x_window_root_first_get()) &&
-       ((ev->message_type == atom_mb_im_invoker_command) ||
-       (ev->message_type == atom_mtp_im_invoker_command)))
+static int 
+_e_kbd_cb_animate(void *data) 
+{
+   E_Kbd *kbd;
+   double t, v;
+
+   if (!(kbd = data)) return 1;
+   t = ecore_loop_time_get() - kbd->start;
+   if (t > kbd->len) t = kbd->len;
+   if (kbd->len > 0.0) 
+     {
+        v = t / kbd->len;
+        v = 1.0 - v;
+        v = v * v * v * v;
+        v = 1.0 - v;
+     }
+   else 
      {
-       if (ev->data.l[0] == 1) _e_kbd_all_show();
-       else if (ev->data.l[0] == 2) _e_kbd_all_hide();
-       else if (ev->data.l[0] == 3) _e_kbd_all_toggle();
+        t = kbd->len;
+        v = 1.0;
+     }
+   kbd->adjust = (kbd->adjust_end * v) + (kbd->adjust_start * (1.0 - v));
+   if (kbd->border)
+     e_border_fx_offset(kbd->border, 0, (kbd->border->h - kbd->adjust));
+   if (t == kbd->len) 
+     {
+        kbd->animator = NULL;
+        kbd->actually_visible = 1;
+        if (!kbd->visible) 
+          {
+             _e_kbd_border_hide(kbd->border);
+             kbd->actually_visible = 0;
+          }
+        return 0;
      }
    return 1;
 }
 
-static int
-_e_kbd_cb_border_add(void *data, int type, void *event)
+static int 
+_e_kbd_cb_client_message(void *data, int type, void *event) 
 {
-   E_Event_Border_Add *ev;
+   Ecore_X_Event_Client_Message *ev;
 
    ev = event;
-   // nothing - border hooks do this
+   if (ev->win != ecore_x_window_root_first_get()) return 1;
+   if ((ev->message_type == atom_mb_invoker) || 
+       (ev->message_type == atom_mtp_invoker)) 
+     {
+        if (ev->data.l[0] == 1) _e_kbd_all_show();
+        else if (ev->data.l[0] == 2) _e_kbd_all_hide();
+        else if (ev->data.l[0] == 3) _e_kbd_all_toggle();
+     }
    return 1;
 }
 
-static int
-_e_kbd_cb_border_remove(void *data, int type, void *event)
+static int 
+_e_kbd_cb_border_remove(void *data, int type, void *event) 
 {
    E_Event_Border_Remove *ev;
    E_Kbd *kbd;
 
    ev = event;
-   if (ev->border == focused_border)
-     {
-       focused_border = NULL;
-       focused_vkbd_state = 0;
-       return 1;
-     }
-   // if border is in a created kbd - unstore
-   kbd = _e_kbd_by_border_get(ev->border);
-   if (!kbd) return 1;
-   if (kbd->border == ev->border)
+   /* TODO: Focused */
+   if (!(kbd = _e_kbd_by_border_get(ev->border))) return 1;
+   if (kbd->border == ev->border) 
      {
-       kbd->border = NULL;
-       if (kbd->waiting_borders)
-         {
-            E_Border *bd;
+        kbd->border = NULL;
+        if (kbd->waiting_borders) 
+          {
+             E_Border *bd;
 
-            bd = kbd->waiting_borders->data;
-            kbd->waiting_borders = eina_list_remove_list(kbd->waiting_borders, kbd->waiting_borders);
-            _e_kbd_border_adopt(kbd, bd);
-         }
-       if (kbd->visible)
-         {
-            kbd->visible = 0;
-            _e_kbd_border_hide(kbd->border);
-            kbd->actually_visible = kbd->visible;
-            e_kbd_show(kbd);
-         }
-       _e_kbd_apply_all_job_queue();
+             bd = kbd->waiting_borders->data;
+             kbd->waiting_borders = 
+               eina_list_remove_list(kbd->waiting_borders, kbd->waiting_borders);
+             _e_kbd_border_adopt(kbd, bd);
+          }
+        if (kbd->visible) 
+          {
+             kbd->visible = 0;
+             _e_kbd_border_hide(kbd->border);
+             kbd->actually_visible = 0;
+             e_kbd_show(kbd);
+          }
      }
    else
      kbd->waiting_borders = eina_list_remove(kbd->waiting_borders, ev->border);
    return 1;
 }
 
-static int
-_e_kbd_cb_border_focus_in(void *data, int type, void *event)
+static int 
+_e_kbd_cb_border_focus_in(void *data, int type, void *event) 
 {
    E_Event_Border_Focus_In *ev;
 
    ev = event;
    if (_e_kbd_by_border_get(ev->border)) return 1;
-   // FIXME: if ev->border->client.vkbd.state == 0 then this app doesnt know
-   // how to request for a virtual keyboard and so we should have a manual
-   // override
    if ((ev->border->need_fullscreen) || (ev->border->fullscreen))
      e_kbd_fullscreen_set(ev->border->zone, 1);
-   else e_kbd_fullscreen_set(ev->border->zone, 0);
-   focused_border = ev->border;
-   focused_vkbd_state = ev->border->client.vkbd.state;
-   if (ev->border->client.vkbd.state == 0) return 1;
-   if (ev->border->client.vkbd.state == ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF)
-     {
-       _e_kbd_all_layout_set(E_KBD_LAYOUT_NONE);
-       _e_kbd_all_hide();
-       return 1;
-     }
-   else if (ev->border->client.vkbd.state == ECORE_X_VIRTUAL_KEYBOARD_STATE_ALPHA)
-     _e_kbd_all_layout_set(E_KBD_LAYOUT_ALPHA);
-   else if (ev->border->client.vkbd.state == ECORE_X_VIRTUAL_KEYBOARD_STATE_NUMERIC)
-     _e_kbd_all_layout_set(E_KBD_LAYOUT_NUMERIC);
-   else if (ev->border->client.vkbd.state == ECORE_X_VIRTUAL_KEYBOARD_STATE_PIN)
-     _e_kbd_all_layout_set(E_KBD_LAYOUT_PIN);
-   else if (ev->border->client.vkbd.state == ECORE_X_VIRTUAL_KEYBOARD_STATE_PHONE_NUMBER)
-     _e_kbd_all_layout_set(E_KBD_LAYOUT_PHONE_NUMBER);
-   else if (ev->border->client.vkbd.state == ECORE_X_VIRTUAL_KEYBOARD_STATE_HEX)
-     _e_kbd_all_layout_set(E_KBD_LAYOUT_HEX);
-   else if (ev->border->client.vkbd.state == ECORE_X_VIRTUAL_KEYBOARD_STATE_TERMINAL)
-     _e_kbd_all_layout_set(E_KBD_LAYOUT_TERMINAL);
-   else if (ev->border->client.vkbd.state == ECORE_X_VIRTUAL_KEYBOARD_STATE_PASSWORD)
-     _e_kbd_all_layout_set(E_KBD_LAYOUT_PASSWORD);
    else
-     _e_kbd_all_layout_set(E_KBD_LAYOUT_DEFAULT);
-   _e_kbd_all_show();
+     e_kbd_fullscreen_set(ev->border->zone, 0);
+   _e_kbd_vkbd_state_handle(ev->border->client.vkbd.state);
    return 1;
 }
 
-static int
-_e_kbd_cb_border_focus_out(void *data, int type, void *event)
+static int 
+_e_kbd_cb_border_focus_out(void *data, int type, void *event) 
 {
    E_Event_Border_Focus_Out *ev;
 
@@ -385,130 +603,60 @@ _e_kbd_cb_border_focus_out(void *data, int type, void *event)
    if (_e_kbd_by_border_get(ev->border)) return 1;
    if ((ev->border->need_fullscreen) || (ev->border->fullscreen))
      e_kbd_fullscreen_set(ev->border->zone, 1);
-   else e_kbd_fullscreen_set(ev->border->zone, 0);
+   else
+     e_kbd_fullscreen_set(ev->border->zone, 0);
    _e_kbd_all_layout_set(E_KBD_LAYOUT_NONE);
    _e_kbd_all_hide();
-   focused_border = NULL;
-   focused_vkbd_state = 0;
    return 1;
 }
 
-static int
-_e_kbd_cb_border_property(void *data, int type, void *event)
+static int 
+_e_kbd_cb_border_property(void *data, int type, void *event) 
 {
    E_Event_Border_Property *ev;
 
    ev = event;
-   if (_e_kbd_by_border_get(ev->border)) return 1;
    if (!ev->border->focused) return 1;
-   /* nothing happened to vkbd prop - leave everything alone */
-   if ((ev->border == focused_border) &&
-       (ev->border->client.vkbd.state == focused_vkbd_state))
-     return 1;
-   focused_vkbd_state = ev->border->client.vkbd.state;
-   /* app doesn't know what to do - just leave everything as-is */
+   if (_e_kbd_by_border_get(ev->border)) return 1;
+   if (ev->border->client.vkbd.state == atom_focused_vkbd_state) return 1;
    if ((ev->border->need_fullscreen) || (ev->border->fullscreen))
      e_kbd_fullscreen_set(ev->border->zone, 1);
-   else e_kbd_fullscreen_set(ev->border->zone, 0);
-   if (ev->border->client.vkbd.state == 0)
-     return 1;
-   /* app wants kbd off - then kbd off it is */
-   else if (ev->border->client.vkbd.state == ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF)
-     _e_kbd_all_hide();
-   /* app wants something else than off... */
    else
-     {
-       if (ev->border->client.vkbd.state == ECORE_X_VIRTUAL_KEYBOARD_STATE_ALPHA)
-         _e_kbd_all_layout_set(E_KBD_LAYOUT_ALPHA);
-       else if (ev->border->client.vkbd.state == ECORE_X_VIRTUAL_KEYBOARD_STATE_NUMERIC)
-         _e_kbd_all_layout_set(E_KBD_LAYOUT_NUMERIC);
-       else if (ev->border->client.vkbd.state == ECORE_X_VIRTUAL_KEYBOARD_STATE_PIN)
-         _e_kbd_all_layout_set(E_KBD_LAYOUT_PIN);
-       else if (ev->border->client.vkbd.state == ECORE_X_VIRTUAL_KEYBOARD_STATE_PHONE_NUMBER)
-         _e_kbd_all_layout_set(E_KBD_LAYOUT_PHONE_NUMBER);
-       else if (ev->border->client.vkbd.state == ECORE_X_VIRTUAL_KEYBOARD_STATE_HEX)
-         _e_kbd_all_layout_set(E_KBD_LAYOUT_HEX);
-       else if (ev->border->client.vkbd.state == ECORE_X_VIRTUAL_KEYBOARD_STATE_TERMINAL)
-         _e_kbd_all_layout_set(E_KBD_LAYOUT_TERMINAL);
-       else if (ev->border->client.vkbd.state == ECORE_X_VIRTUAL_KEYBOARD_STATE_PASSWORD)
-         _e_kbd_all_layout_set(E_KBD_LAYOUT_PASSWORD);
-       else
-         _e_kbd_all_layout_set(E_KBD_LAYOUT_DEFAULT);
-       _e_kbd_all_show();
-     }
+     e_kbd_fullscreen_set(ev->border->zone, 0);
+   _e_kbd_vkbd_state_handle(ev->border->client.vkbd.state);
    return 1;
 }
 
-static void
-_e_kbd_cb_border_hook_pre_post_fetch(void *data, void *data2)
+static void 
+_e_kbd_cb_border_pre_post_fetch(void *data, void *data2) 
 {
    E_Border *bd;
 
    if (!(bd = data2)) return;
-   // check if bd has special kbd properites - if so, store in created kbd
    if (!bd->new_client) return;
    if (_e_kbd_by_border_get(bd)) return;
-   if (_e_kbd_border_is_keyboard(bd))
+   if (_e_kbd_border_is_keyboard(bd)) 
      {
-       Eina_List *l;
+        Eina_List *l;
         E_Kbd *kbd;
 
-       EINA_LIST_FOREACH(kbds, l, kbd)
+        EINA_LIST_FOREACH(kbds, l, kbd) 
           {
-            if (!kbd->border)
-              {
-                 _e_kbd_border_adopt(kbd, bd);
-                 bd->stolen = 1;
-                 if (bd->remember)
-                   {
-                      if (bd->bordername)
-                        {
-                           eina_stringshare_del(bd->bordername);
-                           bd->bordername = NULL;
-                           bd->client.border.changed = 1;
-                        }
-                      e_remember_unuse(bd->remember);
-                      bd->remember = NULL;
-                   }
-                 eina_stringshare_replace(&bd->bordername, "borderless");
-                 bd->client.border.changed = 1;
-                 return;
-              }
-            else
-              {
-                 kbd->waiting_borders = eina_list_append(kbd->waiting_borders, bd);
-                 bd->stolen = 1;
-                 if (bd->remember)
-                   {
-                      if (bd->bordername)
-                        {
-                           eina_stringshare_del(bd->bordername);
-                           bd->bordername = NULL;
-                           bd->client.border.changed = 1;
-                        }
-                      e_remember_unuse(bd->remember);
-                      bd->remember = NULL;
-                   }
-                 eina_stringshare_replace(&bd->bordername, "borderless");
-                 bd->client.border.changed = 1;
-                 return;
-              }
-         }
+             if (!kbd->border) 
+               {
+                  _e_kbd_border_adopt(kbd, bd);
+               }
+             else 
+               {
+                  kbd->waiting_borders = 
+                    eina_list_append(kbd->waiting_borders, bd);
+               }
+          }
      }
 }
 
-static void
-_e_kbd_cb_border_hook_post_fetch(void *data, void *data2)
-{
-   //E_Border *bd;
-
-   //if (!(bd = data2)) return;
-   // nothing - all done in _e_kbd_cb_border_hook_pre_post_fetch()
-   //if (!_e_kbd_by_border_get(bd)) return;
-}
-
-static void
-_e_kbd_cb_border_hook_post_border_assign(void *data, void *data2)
+static void 
+_e_kbd_cb_border_post_assign(void *data, void *data2) 
 {
    E_Border *bd;
    E_Kbd *kbd;
@@ -588,8 +736,8 @@ _e_kbd_cb_border_hook_post_border_assign(void *data, void *data2)
      }
 }
 
-static void
-_e_kbd_cb_border_hook_end(void *data, void *data2)
+static void 
+_e_kbd_cb_border_end(void *data, void *data2) 
 {
    E_Border *bd;
    E_Kbd *kbd;
@@ -604,499 +752,3 @@ _e_kbd_cb_border_hook_end(void *data, void *data2)
    else
      _e_kbd_border_hide(bd);
 }
-
-static void
-_e_kbd_layout_send(E_Kbd *kbd)
-{
-   Ecore_X_Virtual_Keyboard_State type;
-
-   if ((kbd->actually_visible) && (!kbd->disabled))
-     {
-       type = ECORE_X_VIRTUAL_KEYBOARD_STATE_ON;
-       if (kbd->layout == E_KBD_LAYOUT_DEFAULT) 
-          type = ECORE_X_VIRTUAL_KEYBOARD_STATE_ON;
-       else if (kbd->layout == E_KBD_LAYOUT_ALPHA) 
-          type = ECORE_X_VIRTUAL_KEYBOARD_STATE_ALPHA;
-       else if (kbd->layout == E_KBD_LAYOUT_NUMERIC) 
-          type = ECORE_X_VIRTUAL_KEYBOARD_STATE_NUMERIC;
-       else if (kbd->layout == E_KBD_LAYOUT_PIN) 
-          type = ECORE_X_VIRTUAL_KEYBOARD_STATE_PIN;
-       else if (kbd->layout == E_KBD_LAYOUT_PHONE_NUMBER) 
-          type = ECORE_X_VIRTUAL_KEYBOARD_STATE_PHONE_NUMBER;
-       else if (kbd->layout == E_KBD_LAYOUT_HEX) 
-          type = ECORE_X_VIRTUAL_KEYBOARD_STATE_HEX;
-       else if (kbd->layout == E_KBD_LAYOUT_TERMINAL) 
-          type = ECORE_X_VIRTUAL_KEYBOARD_STATE_TERMINAL;
-       else if (kbd->layout == E_KBD_LAYOUT_PASSWORD) 
-          type = ECORE_X_VIRTUAL_KEYBOARD_STATE_PASSWORD;
-       else if (kbd->layout == E_KBD_LAYOUT_NONE) 
-          type = ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF;
-     }
-   else
-     type = ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF;
-   if (kbd->border)
-     ecore_x_e_virtual_keyboard_state_send(kbd->border->client.win, type);
-}
-
-// NOTES:
-// 
-// on freerunner these are always there:
-// 
-// /org/freedesktop/Hal/devices/platform_s3c2440_i2c_logicaldev_input
-// /org/freedesktop/Hal/devices/platform_neo1973_button_0_logicaldev_input
-// 
-// on desktop (built-in/ps2):
-// 
-// /org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input
-// 
-// on desktop (usb):
-// 
-// /org/freedesktop/Hal/devices/usb_device_46d_c517_noserial_if0_logicaldev_input
-// 
-// this:
-// 
-// /org/freedesktop/Hal/devices/usb_device_a12_1_noserial_if0_bluetooth_hci_bluetooth_hci_logicaldev_input
-// 
-// gets added for a bt kbd - unknown for usb.
-// 
-// chances are i either need a way for a platform config to list devices
-// known to be built-in keyboards but to be ignored when determining
-// if a vkbd should be disabled or not... or... i need some other way
-
-static E_DBus_Connection *_e_kbd_dbus_conn = NULL;
-static E_DBus_Signal_Handler *_e_kbd_dbus_handler_dev_add = NULL;
-static E_DBus_Signal_Handler *_e_kbd_dbus_handler_dev_del = NULL;
-static E_DBus_Signal_Handler *_e_kbd_dbus_handler_dev_chg = NULL;
-
-static Eina_List *_e_kbd_dbus_keyboards = NULL;
-static int _e_kbd_dbus_have_real_keyboard = 0;
-static Eina_List *_e_kbd_dbus_real_ignore = NULL;
-
-static void
-_e_kbd_dbus_keyboard_add(const char *udi)
-{
-   const char *str;
-   Eina_List *l;
-
-   EINA_LIST_FOREACH(_e_kbd_dbus_keyboards, l, str)
-     if (!strcmp(str, udi)) return;
-   _e_kbd_dbus_keyboards = eina_list_append
-     (_e_kbd_dbus_keyboards, eina_stringshare_add(udi));
-}
-
-static void
-_e_kbd_dbus_keyboard_del(const char *udi)
-{
-   Eina_List *l;
-   char *str;
-
-   EINA_LIST_FOREACH(_e_kbd_dbus_keyboards, l, str)
-     if (!strcmp(str, udi))
-       {
-         eina_stringshare_del(str);
-          _e_kbd_dbus_keyboards = eina_list_remove_list(_e_kbd_dbus_keyboards, l);
-          return;
-       }
-}
-
-static void
-_e_kbd_dbus_keyboard_eval(void)
-{
-   int have_real = 0;
-   Eina_List *l, *ll;
-   const char *g, *gg;
-
-   have_real = eina_list_count(_e_kbd_dbus_keyboards);
-   EINA_LIST_FOREACH(_e_kbd_dbus_keyboards, l, g)
-     EINA_LIST_FOREACH(_e_kbd_dbus_real_ignore, ll, gg)
-       if (e_util_glob_match(g, gg))
-         {
-            have_real--;
-            break;
-         }
-   if (have_real != _e_kbd_dbus_have_real_keyboard)
-     {
-       _e_kbd_dbus_have_real_keyboard = have_real;
-#if 0
-       if (_e_kbd_dbus_have_real_keyboard)
-         _e_kbd_all_disable();
-       else
-#endif
-         _e_kbd_all_enable();
-     }
-}
-
-static void
-_e_kbd_dbus_cb_dev_input_keyboard(void *user_data, void *reply_data, DBusError *error)
-{
-   E_Hal_Manager_Find_Device_By_Capability_Return *ret = reply_data;
-   Eina_List *l;
-   char *device;
-
-   if ((!ret) || (!ret->strings)) return;
-
-   if (dbus_error_is_set(error))
-     {
-       dbus_error_free(error);
-       return;
-     }
-
-   EINA_LIST_FOREACH(ret->strings, l, device)
-     {
-       _e_kbd_dbus_keyboard_add(device);
-       _e_kbd_dbus_keyboard_eval();
-     }
-}
-
-static void
-_e_kbd_dbus_cb_input_keyboard_is(void *user_data, void *reply_data, DBusError *error)
-{
-   char *udi = user_data;
-   E_Hal_Device_Query_Capability_Return *ret = reply_data;
-
-   if (dbus_error_is_set(error))
-     {
-       dbus_error_free(error);
-        free(udi);
-        return;
-     }
-
-   if ((ret) && (ret->boolean))
-     {
-       _e_kbd_dbus_keyboard_add(udi);
-       _e_kbd_dbus_keyboard_eval();
-     }
-}
-
-static void
-_e_kbd_dbus_cb_dev_add(void *data, DBusMessage *msg)
-{
-   DBusError err;
-   char *udi;
-   int ret;
-
-   dbus_error_init(&err);
-   dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, DBUS_TYPE_INVALID);
-   udi = strdup(udi);
-   ret = e_hal_device_query_capability(_e_kbd_dbus_conn, udi, "input.keyboard",
-                                       _e_kbd_dbus_cb_input_keyboard_is, 
-                                      strdup(udi));
-}
-     
-static void
-_e_kbd_dbus_cb_dev_del(void *data, DBusMessage *msg)
-{
-   DBusError err;
-   char *udi;
-
-   dbus_error_init(&err);
-   dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, DBUS_TYPE_INVALID);
-   _e_kbd_dbus_keyboard_del(udi);
-   _e_kbd_dbus_keyboard_eval();
-}
-
-static void
-_e_kbd_dbus_cb_cap_add(void *data, DBusMessage *msg)
-{
-   DBusError err;
-   char *udi, *capability;
-
-   dbus_error_init(&err);
-   dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, DBUS_TYPE_STRING,
-                         &capability, DBUS_TYPE_INVALID);
-   if (!strcmp(capability, "input.keyboard"))
-     {
-       _e_kbd_dbus_keyboard_add(udi);
-       _e_kbd_dbus_keyboard_eval();
-     }
-}
-
-static void
-_e_kbd_dbus_ignore_keyboards_file_load(const char *file)
-{
-   char buf[4096];
-   FILE *f;
-
-   if (!(f = fopen(file, "r"))) return;
-   while (fgets(buf, sizeof(buf), f))
-     {
-       char *p;
-       int len;
-
-       if (buf[0] == '#') continue;
-        len = strlen(buf);
-       if (len > 0)
-         {
-            if (buf[len - 1] == '\n') buf[len - 1] = 0;
-         }
-       p = buf;
-       while (isspace(*p)) p++;
-       if (*p) 
-          {
-             _e_kbd_dbus_real_ignore = eina_list_append
-               (_e_kbd_dbus_real_ignore, eina_stringshare_add(p));
-          }
-     }
-   fclose(f);
-}
-
-static void
-_e_kbd_dbus_ignore_keyboards_load(void)
-{
-   char buf[PATH_MAX];
-
-   e_user_dir_concat_static(buf, "keyboards/ignore_built_in_keyboards");
-   _e_kbd_dbus_ignore_keyboards_file_load(buf);
-   snprintf(buf, sizeof(buf), "%s/keyboards/ignore_built_in_keyboards", 
-            e_module_dir_get(mod));
-   _e_kbd_dbus_ignore_keyboards_file_load(buf);
-}
-
-static void
-_e_kbd_dbus_real_kbd_init(void)
-{
-   _e_kbd_dbus_have_real_keyboard = 0;
-
-   _e_kbd_dbus_ignore_keyboards_load();
-
-   _e_kbd_dbus_conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
-   if (_e_kbd_dbus_conn)
-     {
-       e_hal_manager_find_device_by_capability(_e_kbd_dbus_conn, "input.keyboard",
-                                               _e_kbd_dbus_cb_dev_input_keyboard, NULL);
-
-       _e_kbd_dbus_handler_dev_add =
-         e_dbus_signal_handler_add(_e_kbd_dbus_conn, "org.freedesktop.Hal",
-                                   "/org/freedesktop/Hal/Manager",
-                                   "org.freedesktop.Hal.Manager",
-                                   "DeviceAdded", _e_kbd_dbus_cb_dev_add, NULL);
-       _e_kbd_dbus_handler_dev_del =
-         e_dbus_signal_handler_add(_e_kbd_dbus_conn, "org.freedesktop.Hal",
-                                   "/org/freedesktop/Hal/Manager",
-                                   "org.freedesktop.Hal.Manager",
-                                   "DeviceRemoved", _e_kbd_dbus_cb_dev_del, NULL);
-       _e_kbd_dbus_handler_dev_chg =
-         e_dbus_signal_handler_add(_e_kbd_dbus_conn, "org.freedesktop.Hal",
-                                   "/org/freedesktop/Hal/Manager",
-                                   "org.freedesktop.Hal.Manager",
-                                   "NewCapability", _e_kbd_dbus_cb_cap_add, NULL);
-     }
-}
-
-static void
-_e_kbd_dbus_real_kbd_shutdown(void)
-{
-   char *str;
-
-   if (_e_kbd_dbus_conn)
-     {
-       e_dbus_signal_handler_del(_e_kbd_dbus_conn, _e_kbd_dbus_handler_dev_add);
-       e_dbus_signal_handler_del(_e_kbd_dbus_conn, _e_kbd_dbus_handler_dev_del);
-       e_dbus_signal_handler_del(_e_kbd_dbus_conn, _e_kbd_dbus_handler_dev_chg);
-     }
-   EINA_LIST_FREE(_e_kbd_dbus_real_ignore, str)
-     eina_stringshare_del(str);
-   EINA_LIST_FREE(_e_kbd_dbus_keyboards, str)
-     eina_stringshare_del(str);
-   _e_kbd_dbus_have_real_keyboard = 0;
-}
-
-int
-e_kbd_init(E_Module *m)
-{
-   mod = m;
-   focused_border = NULL;
-   focused_vkbd_state = 0;
-   atom_mb_im_invoker_command = ecore_x_atom_get("_MB_IM_INVOKER_COMMAND");
-   atom_mtp_im_invoker_command = ecore_x_atom_get("_MTP_IM_INVOKER_COMMAND");
-   handlers = eina_list_append(handlers, 
-                              ecore_event_handler_add
-                              (ECORE_X_EVENT_CLIENT_MESSAGE,
-                               _e_kbd_cb_client_message, NULL));
-   handlers = eina_list_append(handlers, 
-                              ecore_event_handler_add
-                              (E_EVENT_BORDER_ADD,
-                               _e_kbd_cb_border_add, NULL));
-   handlers = eina_list_append(handlers, 
-                              ecore_event_handler_add
-                              (E_EVENT_BORDER_REMOVE,
-                               _e_kbd_cb_border_remove, NULL));
-   handlers = eina_list_append(handlers, 
-                              ecore_event_handler_add
-                              (E_EVENT_BORDER_FOCUS_IN,
-                               _e_kbd_cb_border_focus_in, NULL));
-   handlers = eina_list_append(handlers, 
-                              ecore_event_handler_add
-                              (E_EVENT_BORDER_FOCUS_OUT,
-                               _e_kbd_cb_border_focus_out, NULL));
-   handlers = eina_list_append(handlers, 
-                              ecore_event_handler_add
-                              (E_EVENT_BORDER_PROPERTY,
-                               _e_kbd_cb_border_property, NULL));
-   border_hooks = eina_list_append(border_hooks,
-                                  e_border_hook_add
-                                  (E_BORDER_HOOK_EVAL_PRE_POST_FETCH,
-                                   _e_kbd_cb_border_hook_pre_post_fetch,
-                                   NULL));
-   border_hooks = eina_list_append(border_hooks,
-                                  e_border_hook_add
-                                  (E_BORDER_HOOK_EVAL_POST_FETCH,
-                                   _e_kbd_cb_border_hook_post_fetch,
-                                   NULL));
-   border_hooks = eina_list_append(border_hooks,
-                                  e_border_hook_add
-                                  (E_BORDER_HOOK_EVAL_POST_BORDER_ASSIGN,
-                                   _e_kbd_cb_border_hook_post_border_assign,
-                                   NULL));
-   border_hooks = eina_list_append(border_hooks,
-                                  e_border_hook_add
-                                  (E_BORDER_HOOK_EVAL_END,
-                                   _e_kbd_cb_border_hook_end,
-                                   NULL));
-   _e_kbd_dbus_real_kbd_init();
-   return 1;
-}
-
-int 
-e_kbd_shutdown(void)
-{
-   E_Border_Hook *bh;
-   Ecore_Event_Handler *handle;
-
-   _e_kbd_apply_all_job_queue_end();
-   _e_kbd_dbus_real_kbd_shutdown();
-   EINA_LIST_FREE(border_hooks, bh)
-     e_border_hook_del(bh);
-   EINA_LIST_FREE(handlers, handle)
-     ecore_event_handler_del(handle);
-   focused_border = NULL;
-   focused_vkbd_state = 0;
-   mod = NULL;
-   return 1;
-}
-
-E_Kbd *
-e_kbd_new(E_Zone *zone, const char *themedir, const char *syskbds, const char *sysdicts)
-{
-   E_Kbd *kbd;
-
-   kbd = E_OBJECT_ALLOC(E_Kbd, E_KBD_TYPE, _e_kbd_free);
-   if (!kbd) return NULL;
-   kbds = eina_list_append(kbds, kbd);
-   kbd->layout = ECORE_X_VIRTUAL_KEYBOARD_STATE_ON;
-   return kbd;
-}
-
-void
-e_kbd_enable(E_Kbd *kbd)
-{
-   if (!kbd->disabled) return;
-   kbd->disabled = 0;
-   if (kbd->visible)
-     {
-       kbd->visible  = 0;
-       e_kbd_show(kbd);
-     }
-}
-
-void
-e_kbd_disable(E_Kbd *kbd)
-{
-   if (kbd->disabled) return;
-   if (kbd->visible) e_kbd_hide(kbd);
-   kbd->disabled = 1;
-}
-
-void
-e_kbd_show(E_Kbd *kbd)
-{
-   if (kbd->delay_hide)
-     {
-       ecore_timer_del(kbd->delay_hide);
-       kbd->delay_hide = NULL;
-     }
-   if (kbd->visible) return;
-   kbd->visible = 1;
-   if (kbd->disabled) return;
-   kbd->actually_visible = kbd->visible;
-   _e_kbd_layout_send(kbd);
-   if (il_cfg->sliding.kbd.duration <= 0)
-     {
-       if (kbd->border)
-         {
-            e_border_fx_offset(kbd->border, 0, 0);
-            _e_kbd_border_show(kbd, kbd->border);
-         }
-       kbd->actually_visible = kbd->visible;
-       _e_kbd_apply_all_job_queue();
-     }
-   else
-     {
-        if (kbd->border)
-         {
-            e_border_fx_offset(kbd->border, 0, kbd->border->h - kbd->adjust);
-            _e_kbd_border_show(kbd, kbd->border);
-         }
-       _e_kbd_slide(kbd, 1, (double)il_cfg->sliding.kbd.duration / 1000.0);
-     }
-}
-
-void
-e_kbd_layout_set(E_Kbd *kbd, E_Kbd_Layout layout)
-{
-   kbd->layout = layout;
-   _e_kbd_layout_send(kbd);
-}
-
-void
-e_kbd_hide(E_Kbd *kbd)
-{
-   if (!kbd->visible) return;
-   kbd->visible = 0;
-   if (!kbd->delay_hide)
-     kbd->delay_hide = ecore_timer_add(0.2, _e_kbd_cb_delayed_hide, kbd);
-}
-
-void
-e_kbd_safe_app_region_get(E_Zone *zone, int *x, int *y, int *w, int *h)
-{
-   Eina_List *l;
-   E_Kbd *kbd;
-
-   if (x) *x = zone->x;
-   if (y) *y = zone->y;
-   if (w) *w = zone->w;
-   if (h) *h = zone->h;
-   EINA_LIST_FOREACH(kbds, l, kbd)
-     {
-       if ((kbd->border) && (kbd->border->zone == zone))
-         {
-            if ((kbd->visible) && (!kbd->animator) && (!kbd->disabled)) 
-              {
-                 if (h)
-                   {
-                      *h -= kbd->border->h;
-                      if (*h < 0) *h = 0;
-                   }
-              }
-            return;
-         }
-     }
-}
-
-void
-e_kbd_fullscreen_set(E_Zone *zone, int fullscreen)
-{
-   Eina_List *l;
-   E_Kbd *kbd;
-
-   EINA_LIST_FOREACH(kbds, l, kbd)
-     if ((!!fullscreen) != kbd->fullscreen)
-       {
-          kbd->fullscreen = fullscreen;
-          if (kbd->fullscreen)
-            e_border_layer_set(kbd->border, 250);
-          else
-            e_border_layer_set(kbd->border, 100);
-       }
-}
index 4536eee..43e2780 100644 (file)
@@ -15,7 +15,13 @@ typedef enum _E_Kbd_Layout
    E_KBD_LAYOUT_PHONE_NUMBER,
    E_KBD_LAYOUT_HEX,
    E_KBD_LAYOUT_TERMINAL,
-   E_KBD_LAYOUT_PASSWORD
+   E_KBD_LAYOUT_PASSWORD, 
+   E_KBD_LAYOUT_IP, 
+   E_KBD_LAYOUT_HOST, 
+   E_KBD_LAYOUT_FILE, 
+   E_KBD_LAYOUT_URL, 
+   E_KBD_LAYOUT_KEYPAD, 
+   E_KBD_LAYOUT_J2ME
 } E_Kbd_Layout;
 
 struct _E_Kbd
@@ -40,13 +46,17 @@ struct _E_Kbd
 int e_kbd_init(E_Module *m);
 int e_kbd_shutdown(void);
 
-E_Kbd *e_kbd_new(E_Zone *zone, const char *themedir, const char *syskbds, const char *sysdicts);
+E_Kbd *e_kbd_new(void);
 void e_kbd_enable(E_Kbd *kbd);
 void e_kbd_disable(E_Kbd *kbd);
 void e_kbd_show(E_Kbd *kbd);
-void e_kbd_layout_set(E_Kbd *kbd, E_Kbd_Layout layout);
 void e_kbd_hide(E_Kbd *kbd);
 void e_kbd_safe_app_region_get(E_Zone *zone, int *x, int *y, int *w, int *h);
 void e_kbd_fullscreen_set(E_Zone *zone, int fullscreen);
+void e_kbd_layout_set(E_Kbd *kbd, E_Kbd_Layout layout);
+void e_kbd_all_enable(void);
+void e_kbd_all_disable(void);
+
+extern const char *mod_dir;
 
 #endif
diff --git a/src/modules/illume2/e_kbd_dbus.c b/src/modules/illume2/e_kbd_dbus.c
new file mode 100644 (file)
index 0000000..4c40de7
--- /dev/null
@@ -0,0 +1,269 @@
+#include "e.h"
+#include "e_kbd.h"
+#include "e_kbd_dbus.h"
+
+/* local variables */
+static int have_real_kbd = 0;
+static E_DBus_Connection *dbus_conn = NULL;
+static E_DBus_Signal_Handler *dbus_dev_add = NULL;
+static E_DBus_Signal_Handler *dbus_dev_del = NULL;
+static E_DBus_Signal_Handler *dbus_dev_chg = NULL;
+static Eina_List *dbus_kbds = NULL, *ignore_kbds = NULL;
+
+/* local function prototypes */
+static void _e_kbd_dbus_cb_input_kbd(void *data, void *reply, DBusError *err);
+static void _e_kbd_dbus_cb_input_kbd_is(void *data, void *reply, DBusError *err);
+static void _e_kbd_dbus_ignore_kbds_load(void);
+static void _e_kbd_dbus_ignore_kbds_file_load(const char *file);
+static void _e_kbd_dbus_kbd_add(const char *udi);
+static void _e_kbd_dbus_kbd_del(const char *udi);
+static void _e_kbd_dbus_kbd_eval(void);
+static void _e_kbd_dbus_dev_add(void *data, DBusMessage *msg);
+static void _e_kbd_dbus_dev_del(void *data, DBusMessage *msg);
+static void _e_kbd_dbus_dev_chg(void *data, DBusMessage *msg);
+
+/* public functions */
+void 
+e_kbd_dbus_init(void) 
+{
+   /* load the 'ignore' keyboard files */
+   _e_kbd_dbus_ignore_kbds_load();
+
+   /* attempt to connect to the system dbus */
+   if (!(dbus_conn = e_dbus_bus_get(DBUS_BUS_SYSTEM))) return;
+
+   /* ask HAL for any input keyboards */
+   e_hal_manager_find_device_by_capability(dbus_conn, "input.keyboard", 
+                                           _e_kbd_dbus_cb_input_kbd, NULL);
+
+   /* setup dbus signal handlers for when a device gets added/removed/changed */
+   dbus_dev_add = 
+     e_dbus_signal_handler_add(dbus_conn, "org.freedesktop.Hal", 
+                               "/org/freedesktop/Hal/Manager", 
+                               "org.freedesktop.Hal.Manager", 
+                               "DeviceAdded", _e_kbd_dbus_dev_add, NULL);
+   dbus_dev_del = 
+     e_dbus_signal_handler_add(dbus_conn, "org.freedesktop.Hal", 
+                               "/org/freedesktop/Hal/Manager", 
+                               "org.freedesktop.Hal.Manager", 
+                               "DeviceRemoved", _e_kbd_dbus_dev_del, NULL);
+   dbus_dev_chg = 
+     e_dbus_signal_handler_add(dbus_conn, "org.freedesktop.Hal", 
+                               "/org/freedesktop/Hal/Manager", 
+                               "org.freedesktop.Hal.Manager", 
+                               "NewCapability", _e_kbd_dbus_dev_chg, NULL);
+}
+
+void 
+e_kbd_dbus_shutdown(void) 
+{
+   char *str;
+
+   /* remove the dbus signal handlers if we can */
+   if (dbus_conn) 
+     {
+        e_dbus_signal_handler_del(dbus_conn, dbus_dev_add);
+        e_dbus_signal_handler_del(dbus_conn, dbus_dev_del);
+        e_dbus_signal_handler_del(dbus_conn, dbus_dev_chg);
+     }
+
+   /* free the list of ignored keyboards */
+   EINA_LIST_FREE(ignore_kbds, str)
+     eina_stringshare_del(str);
+
+   /* free the list of keyboards */
+   EINA_LIST_FREE(dbus_kbds, str)
+     eina_stringshare_del(str);
+}
+
+/* local functions */
+static void 
+_e_kbd_dbus_cb_input_kbd(void *data, void *reply, DBusError *err) 
+{
+   E_Hal_Manager_Find_Device_By_Capability_Return *ret = reply;
+   Eina_List *l;
+   char *dev;
+
+   if ((!ret) || (!ret->strings)) return;
+
+   /* if dbus errored then cleanup and get out */
+   if (dbus_error_is_set(err)) 
+     {
+        dbus_error_free(err);
+        return;
+     }
+
+   /* for each returned keyboard, add it and evaluate it */
+   EINA_LIST_FOREACH(ret->strings, l, dev) 
+     {
+        _e_kbd_dbus_kbd_add(dev);
+        _e_kbd_dbus_kbd_eval();
+     }
+}
+
+static void 
+_e_kbd_dbus_cb_input_kbd_is(void *data, void *reply, DBusError *err) 
+{
+   E_Hal_Device_Query_Capability_Return *ret = reply;
+   char *udi = data;
+
+   /* if dbus errored then cleanup and get out */
+   if (dbus_error_is_set(err)) 
+     {
+        dbus_error_free(err);
+        if (udi) free(udi);
+        return;
+     }
+
+   /* if it's an input keyboard, than add it and eval */
+   if ((ret) && (ret->boolean)) 
+     {
+        _e_kbd_dbus_kbd_add(udi);
+        _e_kbd_dbus_kbd_eval();
+     }
+}
+
+static void 
+_e_kbd_dbus_ignore_kbds_load(void) 
+{
+   char buff[PATH_MAX];
+
+   /* load the 'ignore' file from the user's home dir */
+   e_user_dir_concat_static(buff, "keyboards/ignore_built_in_keyboards");
+   _e_kbd_dbus_ignore_kbds_file_load(buff);
+
+   /* load the 'ignore' file from the system/module dir */
+   snprintf(buff, sizeof(buff), 
+            "%s/keyboards/ignore_built_in_keyboards", mod_dir);
+   _e_kbd_dbus_ignore_kbds_file_load(buff);
+}
+
+static void 
+_e_kbd_dbus_ignore_kbds_file_load(const char *file) 
+{
+   char buf[PATH_MAX];
+   FILE *f;
+
+   /* can this file be opened */
+   if (!(f = fopen(file, "r"))) return;
+
+   /* parse out the info in the ignore file */
+   while (fgets(buf, sizeof(buf), f))
+     {
+       char *p;
+       int len;
+
+       if (buf[0] == '#') continue;
+        len = strlen(buf);
+       if (len > 0)
+         {
+            if (buf[len - 1] == '\n') buf[len - 1] = 0;
+         }
+       p = buf;
+       while (isspace(*p)) p++;
+
+        /* append this kbd to the ignore list */
+       if (*p) 
+          ignore_kbds = eina_list_append(ignore_kbds, eina_stringshare_add(p));
+     }
+   fclose(f);
+}
+
+static void 
+_e_kbd_dbus_kbd_add(const char *udi) 
+{
+   const char *str;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(dbus_kbds, l, str)
+     if (!strcmp(str, udi)) return;
+   dbus_kbds = eina_list_append(dbus_kbds, eina_stringshare_add(udi));
+}
+
+static void 
+_e_kbd_dbus_kbd_del(const char *udi) 
+{
+   const char *str;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(dbus_kbds, l, str)
+     if (!strcmp(str, udi)) 
+       {
+          eina_stringshare_del(str);
+          dbus_kbds = eina_list_remove_list(dbus_kbds, l);
+          return;
+       }
+}
+
+static void 
+_e_kbd_dbus_kbd_eval(void) 
+{
+   Eina_List *l, *ll;
+   const char *g, *gg;
+   int have_real = 0;
+
+   have_real = eina_list_count(dbus_kbds);
+   EINA_LIST_FOREACH(dbus_kbds, l, g)
+     EINA_LIST_FOREACH(ignore_kbds, ll, gg)
+       if (e_util_glob_match(g, gg)) 
+         {
+            have_real--;
+            break;
+         }
+   if (have_real != have_real_kbd) 
+     {
+        have_real_kbd = have_real;
+#if 0
+        if (have_real_kbd) e_kbd_all_disable();
+        else
+#endif
+          e_kbd_all_enable();
+     }
+}
+
+static void 
+_e_kbd_dbus_dev_add(void *data, DBusMessage *msg) 
+{
+   DBusError err;
+   char *udi;
+   int ret;
+
+   dbus_error_init(&err);
+   dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, DBUS_TYPE_INVALID);
+   ret = e_hal_device_query_capability(dbus_conn, udi, "input.keyboard", 
+                                       _e_kbd_dbus_cb_input_kbd_is, udi);
+}
+
+static void 
+_e_kbd_dbus_dev_del(void *data, DBusMessage *msg) 
+{
+   DBusError err;
+   char *udi;
+
+   dbus_error_init(&err);
+   dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, DBUS_TYPE_INVALID);
+   if (udi) 
+     {
+        _e_kbd_dbus_kbd_del(udi);
+        _e_kbd_dbus_kbd_eval();
+        free(udi);
+     }
+}
+
+static void 
+_e_kbd_dbus_dev_chg(void *data, DBusMessage *msg) 
+{
+   DBusError err;
+   char *udi, *cap;
+
+   dbus_error_init(&err);
+   dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, 
+                         DBUS_TYPE_STRING, &cap, DBUS_TYPE_INVALID);
+   if (!strcmp(cap, "input.keyboard")) 
+     {
+        _e_kbd_dbus_kbd_add(udi);
+        _e_kbd_dbus_kbd_eval();
+     }
+   if (cap) free(cap);
+   if (udi) free(udi);
+}
diff --git a/src/modules/illume2/e_kbd_dbus.h b/src/modules/illume2/e_kbd_dbus.h
new file mode 100644 (file)
index 0000000..c863c27
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef E_KBD_DBUS_H
+#define E_KBD_DBUS_H
+
+void e_kbd_dbus_init(void);
+void e_kbd_dbus_shutdown(void);
+
+#endif
index 91f12fd..cec1a81 100644 (file)
@@ -17,8 +17,6 @@ EAPI E_Module_Api e_modapi = { E_MODULE_API_VERSION, "Illume2" };
 EAPI void *
 e_modapi_init(E_Module *m) 
 {
-   E_Container *con;
-
    /* init the config subsystem */
    if (!il_config_init(m)) return NULL;
 
@@ -29,9 +27,7 @@ e_modapi_init(E_Module *m)
    e_mod_layout_init(m);
 
    /* create a new keyboard */
-   con = e_container_current_get(e_manager_current_get());
-   kbd = 
-     e_kbd_new(e_zone_current_get(con), m->dir, m->dir, m->dir);
+   kbd = e_kbd_new();
 
    /* show the keyboard if needed */
    e_kbd_show(kbd);