e_input: move kbd structure to e_comp_input_intern.h
[platform/upstream/enlightenment.git] / src / bin / e_comp_wl_input.c
index 2e83ac8..84c651e 100644 (file)
@@ -84,7 +84,7 @@ _e_comp_wl_input_update_seat_caps(struct wl_client *wc)
 
    if (e_comp_wl->ptr.enabled)
      caps |= WL_SEAT_CAPABILITY_POINTER;
-   if (e_comp_wl->kbd.enabled)
+   if (e_comp_input_key->kbd.enabled)
      caps |= WL_SEAT_CAPABILITY_KEYBOARD;
    if (e_comp_wl->touch.enabled)
      caps |= WL_SEAT_CAPABILITY_TOUCH;
@@ -325,6 +325,14 @@ _e_comp_wl_input_thread_cb_keyboard_unbind(void *data)
      if (res == resource)
        e_comp_wl->kbd.focused =
          eina_list_remove_list(e_comp_wl->kbd.focused, l);
+
+   e_comp_input_key->kbd.resources =
+     eina_list_remove(e_comp_input_key->kbd.resources, resource);
+
+   EINA_LIST_FOREACH_SAFE(e_comp_input_key->kbd.focused, l, ll, res)
+     if (res == resource)
+       e_comp_input_key->kbd.focused =
+         eina_list_remove_list(e_comp_input_key->kbd.focused, l);
 }
 
 static void
@@ -343,7 +351,7 @@ e_comp_wl_input_keyboard_enter_send(struct wl_resource *surface)
    xkb_mod_mask_t mod_depressed, mod_latched, mod_locked;
    xkb_layout_index_t mod_group;
 
-   if (!e_comp_wl->kbd.focused)
+   if (!e_comp_input_key->kbd.focused)
      {
         return;
      }
@@ -352,16 +360,16 @@ e_comp_wl_input_keyboard_enter_send(struct wl_resource *surface)
 
    serial = wl_display_next_serial(e_comp_wl->wl.disp);
 
-   mod_depressed = atomic_load(&e_comp_wl->kbd.mod_depressed);
-   mod_latched = atomic_load(&e_comp_wl->kbd.mod_latched);
-   mod_locked = atomic_load(&e_comp_wl->kbd.mod_locked);
+   mod_depressed = atomic_load(&e_comp_input_key->kbd.mod_depressed);
+   mod_latched = atomic_load(&e_comp_input_key->kbd.mod_latched);
+   mod_locked = atomic_load(&e_comp_input_key->kbd.mod_locked);
 
-   mod_group = atomic_load(&e_comp_wl->kbd.mod_group);
+   mod_group = atomic_load(&e_comp_input_key->kbd.mod_group);
 
-   EINA_LIST_FOREACH(e_comp_wl->kbd.focused, l, res)
+   EINA_LIST_FOREACH(e_comp_input_key->kbd.focused, l, res)
      {
         wl_keyboard_send_enter(res, serial, surface,
-                               &e_comp_wl->kbd.keys);
+                               &e_comp_input_key->kbd.keys);
 
         wl_keyboard_send_modifiers(res, serial,
                                    mod_depressed,
@@ -394,6 +402,9 @@ _e_comp_wl_input_thread_cb_keyboard_get(void *data)
    e_comp_wl->kbd.resources =
      eina_list_append(e_comp_wl->kbd.resources, res);
 
+   e_comp_input_key->kbd.resources =
+     eina_list_append(e_comp_input_key->kbd.resources, res);
+
    wl_resource_set_implementation(res, &_e_keyboard_interface,
                                   e_comp->wl_comp_data,
                                   _e_comp_wl_input_cb_keyboard_unbind);
@@ -401,7 +412,7 @@ _e_comp_wl_input_thread_cb_keyboard_get(void *data)
    /* send current repeat_info */
    if (wl_resource_get_version(res) >= WL_KEYBOARD_REPEAT_INFO_SINCE_VERSION)
      {
-        wl_keyboard_send_repeat_info(res, e_comp_wl->kbd.repeat_rate, e_comp_wl->kbd.repeat_delay);
+        wl_keyboard_send_repeat_info(res, e_comp_input_key->kbd.repeat_rate, e_comp_input_key->kbd.repeat_delay);
      }
 
    /* send current keymap */
@@ -420,6 +431,7 @@ _e_comp_wl_input_thread_cb_keyboard_get(void *data)
    if (!surface) return;
 
    if (keyboard_get_data.client != wl_resource_get_client(surface)) return;
+   e_comp_input_key->kbd.focused = eina_list_append(e_comp_input_key->kbd.focused, res);
    e_comp_wl->kbd.focused = eina_list_append(e_comp_wl->kbd.focused, res);
 
    e_comp_wl_input_keyboard_enter_send(e_comp_wl_client_surface_get(focused));
@@ -1432,15 +1444,15 @@ _e_comp_wl_input_keymap_update(struct xkb_keymap *keymap, const char *keymap_pat
    e_comp_input_key->xkb.keymap = keymap;
 
    /* fetch updated modifiers */
-   e_comp_wl->kbd.mod_shift =
+   e_comp_input_key->kbd.mod_shift =
      xkb_map_mod_get_index(keymap, XKB_MOD_NAME_SHIFT);
-   e_comp_wl->kbd.mod_caps =
+   e_comp_input_key->kbd.mod_caps =
      xkb_map_mod_get_index(keymap, XKB_MOD_NAME_CAPS);
-   e_comp_wl->kbd.mod_ctrl =
+   e_comp_input_key->kbd.mod_ctrl =
      xkb_map_mod_get_index(keymap, XKB_MOD_NAME_CTRL);
-   e_comp_wl->kbd.mod_alt =
+   e_comp_input_key->kbd.mod_alt =
      xkb_map_mod_get_index(keymap, XKB_MOD_NAME_ALT);
-   e_comp_wl->kbd.mod_super =
+   e_comp_input_key->kbd.mod_super =
      xkb_map_mod_get_index(keymap, XKB_MOD_NAME_LOGO);
 
    if (!(tmp = xkb_map_get_as_string(keymap)))
@@ -1478,7 +1490,7 @@ _e_comp_wl_input_keymap_update(struct xkb_keymap *keymap, const char *keymap_pat
 
    /* send updated keymap */
    TRACE_INPUT_BEGIN(wl_keyboard_send_keymap_update);
-   EINA_LIST_FOREACH(e_comp_wl->kbd.resources, l, res)
+   EINA_LIST_FOREACH(e_comp_input_key->kbd.resources, l, res)
      wl_keyboard_send_keymap(res, WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
                              e_comp_input_key->xkb.fd,
                              e_comp_input_key->xkb.size);
@@ -1510,18 +1522,26 @@ e_comp_wl_input_init(void)
 
    /* get default keyboard repeat delay from configuration */
    atomic_store(&e_comp_wl->kbd.repeat_delay, e_config->keyboard.repeat_delay);
+   atomic_store(&e_comp_input_key->kbd.repeat_delay, e_config->keyboard.repeat_delay);
    /* check for valid repeat_delay */
    /* if invalid, set the default value of repeat delay */
    if (e_comp_wl->kbd.repeat_delay < 0)
      atomic_store(&e_comp_wl->kbd.repeat_delay, 400);
 
+   if (e_comp_input_key->kbd.repeat_delay < 0)
+     atomic_store(&e_comp_input_key->kbd.repeat_delay, 400);
+
    /* get default keyboard repeat rate from configuration */
    atomic_store(&e_comp_wl->kbd.repeat_rate, e_config->keyboard.repeat_rate);
+   atomic_store(&e_comp_input_key->kbd.repeat_rate, e_config->keyboard.repeat_rate);
    /* check for valid repeat_rate value */
    /* if invalid, set the default value of repeat rate value */
    if (e_comp_wl->kbd.repeat_rate < 0)
      atomic_store(&e_comp_wl->kbd.repeat_rate, 25);
 
+   if (e_comp_input_key->kbd.repeat_rate < 0)
+     atomic_store(&e_comp_input_key->kbd.repeat_rate, 25);
+
    /* create the global resource for input seat */
    e_comp_wl->seat.global =
      wl_global_create(e_comp_wl->wl.disp, &wl_seat_interface, 4,
@@ -1569,6 +1589,8 @@ e_comp_wl_input_init(void)
 
    wl_array_init(&e_comp_wl->kbd.keys);
    wl_array_init(&e_comp_wl->kbd.routed_keys);
+   wl_array_init(&e_comp_input_key->kbd.keys);
+   wl_array_init(&e_comp_input_key->kbd.routed_keys);
 
    E_EVENT_TEXT_INPUT_PANEL_VISIBILITY_CHANGE = ecore_event_type_new();
 
@@ -1674,7 +1696,6 @@ e_comp_wl_input_shutdown(void)
    g_mutex_clear(&e_comp_wl->xkb.keymap_mutex);
    g_mutex_clear(&e_comp_wl->xkb.state_mutex);
 
-   g_mutex_clear(&e_comp_wl->kbd.keys_mutex);
    g_mutex_clear(&e_comp_wl->kbd.repeat_delay_mutex);
    g_mutex_clear(&e_comp_wl->kbd.repeat_rate_mutex);
 }
@@ -1712,28 +1733,28 @@ e_comp_wl_input_keyboard_modifiers_serialize(void)
 
    mod = xkb_state_serialize_mods(e_comp_input_key->xkb.state,
                               XKB_STATE_DEPRESSED);
-   mod_depressed = atomic_load(&e_comp_wl->kbd.mod_depressed);
+   mod_depressed = atomic_load(&e_comp_input_key->kbd.mod_depressed);
    changed |= mod != mod_depressed;
-   atomic_store(&e_comp_wl->kbd.mod_depressed, mod);
+   atomic_store(&e_comp_input_key->kbd.mod_depressed, mod);
 
    mod = xkb_state_serialize_mods(e_comp_input_key->xkb.state,
                               XKB_STATE_MODS_LATCHED);
 
-   mod_latched = atomic_load(&e_comp_wl->kbd.mod_latched);
+   mod_latched = atomic_load(&e_comp_input_key->kbd.mod_latched);
    changed |= mod != mod_latched;
-   atomic_store(&e_comp_wl->kbd.mod_latched, mod);
+   atomic_store(&e_comp_input_key->kbd.mod_latched, mod);
 
    mod = xkb_state_serialize_mods(e_comp_input_key->xkb.state,
                               XKB_STATE_MODS_LOCKED);
-   mod_locked = atomic_load(&e_comp_wl->kbd.mod_locked);
+   mod_locked = atomic_load(&e_comp_input_key->kbd.mod_locked);
    changed |= mod != mod_locked;
-   atomic_store(&e_comp_wl->kbd.mod_locked, mod);
+   atomic_store(&e_comp_input_key->kbd.mod_locked, mod);
 
    grp = xkb_state_serialize_layout(e_comp_input_key->xkb.state,
                                 XKB_STATE_LAYOUT_EFFECTIVE);
-   mod_group = atomic_load(&e_comp_wl->kbd.mod_group);
+   mod_group = atomic_load(&e_comp_input_key->kbd.mod_group);
    changed |= grp != mod_group;
-   atomic_store(&e_comp_wl->kbd.mod_group, grp);
+   atomic_store(&e_comp_input_key->kbd.mod_group, grp);
 
    return changed;
 }
@@ -1746,18 +1767,18 @@ e_comp_wl_input_keyboard_modifiers_update(void)
    Eina_List *l;
 
    if (!e_comp_wl_input_keyboard_modifiers_serialize()) return;
-   if (!e_comp_wl->kbd.focused)
+   if (!e_comp_input_key->kbd.focused)
      {
        return;
      }
 
    serial = wl_display_next_serial(e_comp_wl->wl.disp);
-   EINA_LIST_FOREACH(e_comp_wl->kbd.focused, l, res)
+   EINA_LIST_FOREACH(e_comp_input_key->kbd.focused, l, res)
      wl_keyboard_send_modifiers(res, serial,
-                                e_comp_wl->kbd.mod_depressed,
-                                e_comp_wl->kbd.mod_latched,
-                                e_comp_wl->kbd.mod_locked,
-                                e_comp_wl->kbd.mod_group);
+                                e_comp_input_key->kbd.mod_depressed,
+                                e_comp_input_key->kbd.mod_latched,
+                                e_comp_input_key->kbd.mod_locked,
+                                e_comp_input_key->kbd.mod_group);
 }
 
 EINTERN void
@@ -1774,6 +1795,7 @@ e_comp_wl_input_keyboard_state_update(uint32_t keycode, Eina_Bool pressed)
    else dir = XKB_KEY_UP;
 
    atomic_store(&e_comp_wl->kbd.mod_changed, xkb_state_update_key(e_comp_input_key->xkb.state, keycode + 8, dir));
+   atomic_store(&e_comp_input_key->kbd.mod_changed, xkb_state_update_key(e_comp_input_key->xkb.state, keycode + 8, dir));
 
    e_comp_wl_input_keyboard_modifiers_update();
 }
@@ -1803,6 +1825,7 @@ e_comp_wl_input_keyboard_enabled_set(Eina_Bool enabled)
      }
 
    e_comp_wl->kbd.enabled = !!enabled;
+   e_comp_input_key->kbd.enabled = !!enabled;
    _e_comp_wl_input_update_seat_caps(NULL);
 }
 
@@ -2063,8 +2086,13 @@ e_comp_wl_input_seat_caps_set(unsigned int caps)
 
    if (caps & E_INPUT_SEAT_POINTER)
      e_comp_wl->ptr.enabled = need_update = EINA_TRUE;
+
    if (caps & E_INPUT_SEAT_KEYBOARD)
-     e_comp_wl->kbd.enabled = need_update = EINA_TRUE;
+     {
+        e_comp_wl->kbd.enabled = need_update = EINA_TRUE;
+        e_comp_input_key->kbd.enabled = need_update = EINA_TRUE;
+     }
+
    if (caps & E_INPUT_SEAT_TOUCH)
      e_comp_wl->touch.enabled = need_update = EINA_TRUE;
 
@@ -2090,11 +2118,14 @@ e_comp_wl_input_keyboard_repeat_set(int delay, int rate)
    atomic_store(&e_comp_wl->kbd.repeat_delay, delay);
    atomic_store(&e_comp_wl->kbd.repeat_rate, rate);
 
-   EINA_LIST_FOREACH(e_comp_wl->kbd.resources, l, res)
+   atomic_store(&e_comp_input_key->kbd.repeat_delay, delay);
+   atomic_store(&e_comp_input_key->kbd.repeat_rate, rate);
+
+   EINA_LIST_FOREACH(e_comp_input_key->kbd.resources, l, res)
      {
         if (wl_resource_get_version(res) >= WL_KEYBOARD_REPEAT_INFO_SINCE_VERSION)
-          wl_keyboard_send_repeat_info(res, e_comp_wl->kbd.repeat_rate,
-                                       e_comp_wl->kbd.repeat_delay);
+          wl_keyboard_send_repeat_info(res, e_comp_input_key->kbd.repeat_rate,
+                                       e_comp_input_key->kbd.repeat_delay);
      }
 }