e_seat: move keyboard variables (resources, focused) to E_Seat struct 56/325056/1
authorduna.oh <duna.oh@samsung.com>
Thu, 22 May 2025 06:48:22 +0000 (15:48 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Mon, 2 Jun 2025 06:50:36 +0000 (15:50 +0900)
Change-Id: I73e28e16fca334df158565d1bcf15f0c5b1410b5

src/bin/inputmgr/e_comp_input.c
src/bin/inputmgr/e_comp_input_intern.h
src/bin/server/e_comp_wl.c
src/bin/server/e_comp_wl_input.c
src/bin/server/e_compositor.c
src/bin/server/e_keyrouter_wl.c
src/bin/server/e_seat.c
src/bin/server/e_seat_intern.h

index 967982fe1e7108a481cc289b1e78de286353a60d..0580c93141b09c17742872b13adeb64283e80dfd 100644 (file)
@@ -19,8 +19,6 @@ e_comp_input_init(void)
      }
 
    g_rec_mutex_init(&e_comp_input_key->xkb.keymap_mutex);
-   g_rec_mutex_init(&e_comp_input_key->kbd.resources_mutex);
-   g_rec_mutex_init(&e_comp_input_key->kbd.focused_mutex);
 
    e_comp_input = E_NEW(E_Comp_Input, 1);
    if (!e_comp_input)
@@ -57,8 +55,6 @@ e_comp_input_shutdown(void)
           xkb_context_unref(e_comp_input_key->xkb.context);
 
         g_rec_mutex_clear(&e_comp_input_key->xkb.keymap_mutex);
-        g_rec_mutex_clear(&e_comp_input_key->kbd.resources_mutex);
-        g_rec_mutex_clear(&e_comp_input_key->kbd.focused_mutex);
 
         E_FREE(e_comp_input_key);
      }
@@ -146,7 +142,9 @@ e_input_thread_info_kbd_resource_list_get(E_Input_Thread_Info *input_thread_info
 {
    EINA_SAFETY_ON_NULL_RETURN_VAL(input_thread_info, NULL);
 
-   return ((E_Comp_Input_Key_Data *)input_thread_info)->kbd.resources;
+   //TODO:
+   //return ((E_Comp_Input_Key_Data *)input_thread_info)->kbd.resources;
+   return NULL;
 }
 
 E_API int
@@ -170,7 +168,8 @@ e_input_thread_info_kbd_resource_list_lock(E_Input_Thread_Info *input_thread_inf
 {
    EINA_SAFETY_ON_NULL_RETURN(input_thread_info);
 
-   g_rec_mutex_lock(&((E_Comp_Input_Key_Data *)input_thread_info)->kbd.resources_mutex);
+   //TODO:
+   //g_rec_mutex_lock(&((E_Comp_Input_Key_Data *)input_thread_info)->kbd.resources_mutex);
 }
 
 E_API void
@@ -178,5 +177,6 @@ e_input_thread_info_kbd_resource_list_unlock(E_Input_Thread_Info *input_thread_i
 {
    EINA_SAFETY_ON_NULL_RETURN(input_thread_info);
 
-   g_rec_mutex_unlock(&((E_Comp_Input_Key_Data *)input_thread_info)->kbd.resources_mutex);
-}
\ No newline at end of file
+   //TODO:
+   //g_rec_mutex_unlock(&((E_Comp_Input_Key_Data *)input_thread_info)->kbd.resources_mutex);
+}
index 3fe3e09e29cf8b2654811e5198b031a87ebbc483..3b00e5255fac0e2c183687d08c8dcb477a1a48b3 100644 (file)
@@ -31,8 +31,6 @@ struct _E_Comp_Input_Key_Data
 
    struct
      {
-        Eina_List *resources;
-        Eina_List *focused;
         xkb_mod_index_t mod_shift, mod_caps;
         xkb_mod_index_t mod_ctrl, mod_alt;
         xkb_mod_index_t mod_super;
@@ -41,8 +39,6 @@ struct _E_Comp_Input_Key_Data
         int mod_changed;
         atomic_int repeat_delay;
         atomic_int repeat_rate;
-        GRecMutex resources_mutex;
-        GRecMutex focused_mutex;
      } kbd;
 };
 
index b99bb494edb918b6d9e071e1d64d4d64b3b8db56..baa4a05305d80d9225ed6d80725a2df3e535982d 100644 (file)
@@ -2146,38 +2146,40 @@ _e_comp_wl_cb_randr_change(void *data EINA_UNUSED, int type EINA_UNUSED, void *e
 }
 
 static void
-_e_comp_wl_send_keys(E_Comp_Wl_Data *comp_wl)
+_e_comp_wl_send_keys(E_Seat *seat)
 {
    uint32_t serial;
    struct wl_resource *res;
    Eina_List *l;
+   E_Comp_Wl_Data *comp_wl = e_comp_wl_get();
 
-   g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
-   if (!e_comp_input_key->kbd.focused)
-     {
-        g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
-        return;
-     }
+   if (e_seat_keyboard_focused_is_empty(seat)) return;
 
    serial = wl_display_next_serial(comp_wl->wl.disp);
 
-   EINA_LIST_FOREACH(e_comp_input_key->kbd.focused, l, res)
+   e_seat_keyboard_focused_lock(seat);
+   EINA_LIST_FOREACH(e_seat_keyboard_focused_get(seat), l, res)
      {
         e_seat_keyboard_resource_send_keys(NULL, res, serial, WL_KEYBOARD_KEY_STATE_PRESSED);
      }
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+   e_seat_keyboard_focused_unlock(seat);
 }
 
 static Eina_Bool
 _e_comp_wl_client_focus_in_timer(E_Client *ec)
 {
+   E_Seat *seat = NULL;
+
    if (!ec) return EINA_FALSE;
    if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE;
    if (!ec->comp_data) return EINA_FALSE;
 
    ec->comp_data->on_focus_timer = NULL;
 
-   _e_comp_wl_send_keys(e_comp_wl_get());
+   seat = e_seat_find_by_zone(e_comp_zone_find_by_ec(ec));
+   if (!seat) return EINA_FALSE;
+
+   _e_comp_wl_send_keys(seat);
 
    return EINA_FALSE;
 }
@@ -2185,9 +2187,8 @@ _e_comp_wl_client_focus_in_timer(E_Client *ec)
 static void
 _e_comp_wl_client_focus_in(E_Client *ec)
 {
-   struct wl_resource *res, *surface;
+   struct wl_resource *surface;
    struct wl_client *wc;
-   Eina_List *l;
    E_Seat *seat = NULL;
 
    if (!ec) return;
@@ -2199,27 +2200,9 @@ _e_comp_wl_client_focus_in(E_Client *ec)
 
    wc = wl_resource_get_client(surface);
 
-   g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
-   EINA_LIST_FOREACH(e_comp_input_key->kbd.resources, l, res)
-     {
-        if (wl_resource_get_client(res) == wc &&
-            e_seat_keyboard_resource_is_for_ec(res, ec))
-          {
-             g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
-             if (!eina_list_data_find(e_comp_input_key->kbd.focused, res))
-               e_comp_input_key->kbd.focused = eina_list_append(e_comp_input_key->kbd.focused, res);
-             g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
-          }
-     }
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
+   e_seat_keyboard_focused_resource_add(seat, wc);
 
-   g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
-   if (!e_comp_input_key->kbd.focused)
-     {
-        g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
-        return;
-     }
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+   if (e_seat_keyboard_focused_is_empty(seat)) return;
 
    e_seat_keyboard_focus_surface_set(seat, surface);
    e_seat_keyboard_send_enter(seat, surface);
@@ -2252,29 +2235,21 @@ _e_comp_wl_client_focus_out(E_Client *ec)
    /* update keyboard modifier state */
    e_seat_keyboard_keys_state_update(seat, EINA_FALSE);
 
-   g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
-   if (!eina_list_count(e_comp_input_key->kbd.resources))
-     {
-        g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
-        return;
-     }
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
+   if (e_seat_keyboard_resources_is_empty(seat)) return;
 
    /* send keyboard_leave to all keyboard resources */
    serial = wl_display_next_serial(e_comp_wl_display_get());
 
-   g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
-   EINA_LIST_FOREACH_SAFE(e_comp_input_key->kbd.focused, l, ll, res)
+   e_seat_keyboard_focused_lock(seat);
+   EINA_LIST_FOREACH_SAFE(e_seat_keyboard_focused_get(seat), l, ll, res)
      {
         e_seat_keyboard_resource_send_keys(NULL, res, serial, WL_KEYBOARD_KEY_STATE_RELEASED);
      }
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+   e_seat_keyboard_focused_unlock(seat);
 
    e_seat_keyboard_send_leave(seat, surface);
 
-   g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
-   e_comp_input_key->kbd.focused = eina_list_free(e_comp_input_key->kbd.focused);
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+   e_seat_keyboard_focused_resource_remove(seat, wl_resource_get_client(surface));
 
    e_seat_keyboard_focus_surface_set(seat, NULL);
 }
@@ -3991,7 +3966,7 @@ e_comp_wl_output_remove(const char *id)
 }
 
 static void
-_e_comp_wl_key_send_to_focused_list(Ecore_Event_Key *ev, E_Device *dev, enum wl_keyboard_key_state state, E_Client *ec)
+_e_comp_wl_key_send_to_focused_list(Ecore_Event_Key *ev, E_Device *dev, E_Seat *seat, enum wl_keyboard_key_state state, E_Client *ec)
 {
    struct wl_resource *res;
    Eina_List *l;
@@ -4001,6 +3976,8 @@ _e_comp_wl_key_send_to_focused_list(Ecore_Event_Key *ev, E_Device *dev, enum wl_
    const char *device_name = NULL;
    E_Comp_Wl_Data *comp_wl;
 
+   EINA_SAFETY_ON_NULL_RETURN(seat);
+
    keycode = (ev->keycode - 8);
 
    comp_wl = e_comp_wl_get();
@@ -4032,8 +4009,8 @@ _e_comp_wl_key_send_to_focused_list(Ecore_Event_Key *ev, E_Device *dev, enum wl_
           }
      }
 
-   g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
-   EINA_LIST_FOREACH(e_comp_input_key->kbd.focused, l, res)
+   e_seat_keyboard_focused_lock(seat);
+   EINA_LIST_FOREACH(e_seat_keyboard_focused_get(seat), l, res)
      {
         if (wl_resource_get_client(res) != wc) continue;
 
@@ -4045,7 +4022,7 @@ _e_comp_wl_key_send_to_focused_list(Ecore_Event_Key *ev, E_Device *dev, enum wl_
                              keycode, state);
         TRACE_INPUT_END();
      }
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+   e_seat_keyboard_focused_unlock(seat);
 
    if (e_config->key_input_ttrace_enable)
      {
@@ -4099,15 +4076,10 @@ _e_comp_wl_key_down(Ecore_Event_Key *ev, E_Device *dev)
              return EINA_FALSE;
           }
 
-        g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
-        if (!e_comp_input_key->kbd.focused)
-          {
-             g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
-             goto end;
-          }
-        g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+        if (e_seat_keyboard_focused_is_empty(seat))
+          goto end;
 
-        _e_comp_wl_key_send_to_focused_list(ev, dev, WL_KEYBOARD_KEY_STATE_PRESSED, ec);
+        _e_comp_wl_key_send_to_focused_list(ev, dev, seat, WL_KEYBOARD_KEY_STATE_PRESSED, ec);
 
         /* A key only sent to clients is added to the list */
         if (!e_seat_keyboard_keys_keydata_add(NULL, keycode, dev))
@@ -4129,7 +4101,7 @@ _e_comp_wl_key_up(Ecore_Event_Key *ev, E_Device *dev)
    Eina_Bool delivered;
    E_Comp *comp;
    const char *seat_name = NULL;
-   E_Seat *seat;
+   E_Seat *seat = NULL;
    E_Zone *zone = NULL;
 
    if (ev->window != e_comp_ee_win_get())
@@ -4157,15 +4129,10 @@ _e_comp_wl_key_up(Ecore_Event_Key *ev, E_Device *dev)
         ec = e_zone_focused_client_get(zone);
         ELOGF("INPUT", "Key Up. seat:%s zone_id:%d", ec, seat_name, e_zone_id_get(zone));
 
-        g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
-        if (!e_comp_input_key->kbd.focused)
-          {
-             g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
-             goto end;
-          }
-        g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+        if (e_seat_keyboard_focused_is_empty(seat))
+          goto end;
 
-        _e_comp_wl_key_send_to_focused_list(ev, dev, WL_KEYBOARD_KEY_STATE_RELEASED, ec);
+        _e_comp_wl_key_send_to_focused_list(ev, dev, seat, WL_KEYBOARD_KEY_STATE_RELEASED, ec);
      }
 
 end:
@@ -4797,6 +4764,7 @@ e_comp_wl_key_send(E_Client *ec, int keycode, Eina_Bool pressed, void *dev, uint
    E_Comp_Config *comp_conf = NULL;
    const char *dev_name = NULL;
    E_Comp_Wl_Data *comp_wl;
+   E_Seat *seat = NULL;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
    EINA_SAFETY_ON_NULL_RETURN_VAL(ec->comp_data, EINA_FALSE);
@@ -4848,8 +4816,11 @@ e_comp_wl_key_send(E_Client *ec, int keycode, Eina_Bool pressed, void *dev, uint
           }
      }
 
-   g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
-   EINA_LIST_FOREACH(e_comp_input_key->kbd.resources, l, res)
+   seat = e_seat_find_by_zone(e_comp_zone_find_by_ec(ec));
+   if (!seat) return EINA_FALSE;
+
+   e_seat_keyboard_resources_lock(seat);
+   EINA_LIST_FOREACH(e_seat_keyboard_resources_get(seat), l, res)
      {
         if (wl_resource_get_client(res) != wc) continue;
         if (comp_conf && comp_conf->input_log_enable)
@@ -4859,7 +4830,7 @@ e_comp_wl_key_send(E_Client *ec, int keycode, Eina_Bool pressed, void *dev, uint
         wl_keyboard_send_key(res, serial, time,
                              wl_keycode, state);
      }
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
+   e_seat_keyboard_resources_unlock(seat);
 
    if (e_config->key_input_ttrace_enable)
      {
@@ -4879,6 +4850,7 @@ e_comp_wl_key_cancel(E_Client *ec, int keycode, Ecore_Device *dev, uint32_t time
    uint32_t serial, wl_keycode, cancel_keycode;
    E_Comp_Config *comp_conf = NULL;
    E_Comp_Wl_Data *comp_wl;
+   E_Seat *seat = NULL;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
    EINA_SAFETY_ON_NULL_RETURN_VAL(ec->comp_data, EINA_FALSE);
@@ -4915,8 +4887,11 @@ e_comp_wl_key_cancel(E_Client *ec, int keycode, Ecore_Device *dev, uint32_t time
    if (dev) _e_comp_wl_send_event_device(wc, time, dev, serial);
    else _e_comp_wl_device_send_last_event_device(comp_wl, ec, ECORE_DEVICE_CLASS_KEYBOARD, time);
 
-   g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
-   EINA_LIST_FOREACH(e_comp_input_key->kbd.resources, l, res)
+   seat = e_seat_find_by_zone(e_comp_zone_find_by_ec(ec));
+   if (!seat) return EINA_FALSE;
+
+   e_seat_keyboard_resources_lock(seat);
+   EINA_LIST_FOREACH(e_seat_keyboard_resources_get(seat), l, res)
      {
         if (wl_resource_get_client(res) != wc) continue;
         if (comp_conf && comp_conf->input_log_enable)
@@ -4928,7 +4903,7 @@ e_comp_wl_key_cancel(E_Client *ec, int keycode, Ecore_Device *dev, uint32_t time
         wl_keyboard_send_key(res, serial, time,
                              cancel_keycode, WL_KEYBOARD_KEY_STATE_RELEASED);
      }
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
+   e_seat_keyboard_resources_unlock(seat);
 
    return EINA_TRUE;
 }
index ce77a8da8f981561da3c87915dd537a4fc3eeb2e..83db2e3f89c727a4c23ee0ef1d76c9737ff1dade 100644 (file)
@@ -908,9 +908,10 @@ _e_comp_wl_input_keymap_update(struct xkb_keymap *keymap, const char *keymap_pat
    char *tmp;
    xkb_mod_mask_t latched = 0, locked = 0, group = 0;
    struct wl_resource *res;
-   Eina_List *l;
+   Eina_List *l, *ll;
    int rw_fd, ro_fd;
    void *dst;
+   E_Seat *seat;
 
    /* unreference any existing keymap */
    g_rec_mutex_lock(&e_comp_input_key->xkb.keymap_mutex);
@@ -1002,10 +1003,13 @@ _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);
-   g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
-   EINA_LIST_FOREACH(e_comp_input_key->kbd.resources, l, res)
-     e_comp_wl_input_keyboard_keymap_send(res);
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
+   EINA_LIST_FOREACH(e_seat_list_get(), l, seat)
+     {
+        e_seat_keyboard_resources_lock(seat);
+        EINA_LIST_FOREACH(e_seat_keyboard_resources_get(seat), ll, res)
+          e_comp_wl_input_keyboard_keymap_send(res);
+        e_seat_keyboard_resources_unlock(seat);
+     }
    TRACE_INPUT_END();
 
    /* update modifiers */
@@ -1141,11 +1145,6 @@ e_comp_wl_input_shutdown(void)
    EINA_LIST_FREE(comp_wl->ptr_constraints.resources, res)
      wl_resource_destroy(res);
 
-   /* destroy keyboard resources */
-   EINA_LIST_FREE(e_comp_input_key->kbd.resources, res)
-     wl_resource_destroy(res);
-   e_comp_input_key->kbd.resources = eina_list_free(e_comp_input_key->kbd.resources);
-
    /* unmap any existing keyboard area */
    if (comp_wl->xkb.area)
      munmap(comp_wl->xkb.area, comp_wl->xkb.size);
@@ -1246,25 +1245,27 @@ e_comp_wl_input_keyboard_modifiers_update(void)
 {
    uint32_t serial;
    struct wl_resource *res;
-   Eina_List *l;
+   Eina_List *l, *ll;
+   E_Seat *seat;
    E_Comp_Wl_Data *comp_wl = e_comp_wl_get();
 
    if (!e_comp_wl_input_keyboard_modifiers_serialize()) return;
-   g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
-   if (!e_comp_input_key->kbd.focused)
-     {
-       g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
-       return;
-     }
 
    serial = wl_display_next_serial(comp_wl->wl.disp);
-   EINA_LIST_FOREACH(e_comp_input_key->kbd.focused, l, res)
-     wl_keyboard_send_modifiers(res, serial,
-                                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);
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+
+   EINA_LIST_FOREACH(e_seat_list_get(), l, seat)
+     {
+        e_seat_keyboard_focused_lock(seat);
+        EINA_LIST_FOREACH(e_seat_keyboard_focused_get(seat), ll, res)
+          {
+             wl_keyboard_send_modifiers(res, serial,
+                                        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);
+          }
+        e_seat_keyboard_focused_unlock(seat);
+     }
 }
 
 EINTERN void
@@ -1576,21 +1577,25 @@ E_API void
 e_comp_wl_input_keyboard_repeat_set(int delay, int rate)
 {
    struct wl_resource *res;
-   Eina_List *l;
+   Eina_List *l, *ll;
+   E_Seat *seat;
 
    EINA_SAFETY_ON_NULL_RETURN(e_comp_wl_get());
 
    atomic_store(&e_comp_input_key->kbd.repeat_delay, delay);
    atomic_store(&e_comp_input_key->kbd.repeat_rate, rate);
 
-   g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
-   EINA_LIST_FOREACH(e_comp_input_key->kbd.resources, l, res)
+   EINA_LIST_FOREACH(e_seat_list_get(), l, seat)
      {
-        if (wl_resource_get_version(res) >= WL_KEYBOARD_REPEAT_INFO_SINCE_VERSION)
-          wl_keyboard_send_repeat_info(res, e_comp_input_key->kbd.repeat_rate,
-                                       e_comp_input_key->kbd.repeat_delay);
+        e_seat_keyboard_resources_lock(seat);
+        EINA_LIST_FOREACH(e_seat_keyboard_resources_get(seat), ll, res)
+          {
+             if (wl_resource_get_version(res) >= WL_KEYBOARD_REPEAT_INFO_SINCE_VERSION)
+               wl_keyboard_send_repeat_info(res, e_comp_input_key->kbd.repeat_rate,
+                                            e_comp_input_key->kbd.repeat_delay);
+          }
+        e_seat_keyboard_resources_unlock(seat);
      }
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
 }
 
 typedef struct _keycode_map{
@@ -1793,7 +1798,9 @@ E_API const Eina_List *
 e_comp_wl_input_kbd_resources_get()
 {
    EINA_SAFETY_ON_FALSE_RETURN_VAL(e_comp_input_key, NULL);
-   return e_comp_input_key->kbd.resources;
+   //TODO:
+   //return e_comp_input_key->kbd.resources;
+   return NULL;
 }
 
 E_API int
@@ -1814,12 +1821,14 @@ E_API void
 e_comp_wl_input_kbd_resource_list_lock()
 {
   EINA_SAFETY_ON_NULL_RETURN(e_comp_input_key);
-  g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
+  //TODO:
+  //g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
 }
 
 E_API void
 e_comp_wl_input_kbd_resource_list_unlock()
 {
   EINA_SAFETY_ON_NULL_RETURN(e_comp_input_key);
-  g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
+  //TODO:
+  //g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
 }
index 1c3b4d2eeb93847e92640f6cab14ac3d2c4aa26c..a6159fdfb502499217955a7d06316dac8b173483 100644 (file)
@@ -12,6 +12,7 @@
 #include "e_surface_view_intern.h"
 #include "e_view_client_intern.h"
 #include "e_zone_intern.h"
+#include "e_seat_intern.h"
 #include "e_comp_input_intern.h"
 
 #include <assert.h>
@@ -1436,10 +1437,10 @@ _e_surface_ec_render_stop(E_Surface *surface)
 static void
 _e_surface_ec_del(E_Surface *surface)
 {
-   struct wl_resource *res, *surface_resource;
+   struct wl_resource *surface_resource;
    struct wl_client *surface_client = NULL;
-   Eina_List *l, *ll;
    E_Zone *zone;
+   E_Seat *seat;
 
    surface_resource = e_surface_resource_get(surface);
    if (surface_resource)
@@ -1451,22 +1452,17 @@ _e_surface_ec_del(E_Surface *surface)
         ERR("_e_surface_ec_del: zone is NULL");
         zone = e_zone_current_get();
      }
+   seat = e_seat_find_by_zone(zone);
+   if (!seat)
+     {
+        ERR("_e_surface_ec_del: seat is NULL");
+        seat = e_seat_current_get();
+     }
 
    if (surface_client &&
        (surface->ec == e_zone_focused_client_get(zone)))
      {
-        g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
-        EINA_LIST_FOREACH_SAFE(e_comp_input_key->kbd.focused, l, ll, res)
-          {
-             if (wl_resource_get_client(res) ==
-                 surface_client)
-               {
-                  e_comp_input_key->kbd.focused =
-                     eina_list_remove_list(e_comp_input_key->kbd.focused, l);
-               }
-
-          }
-        g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+        e_seat_keyboard_focused_resource_remove(seat, surface_client);
      }
 
    e_comp_wl_client_surface_set(surface->ec, NULL);
index c6484a38a9f28fe50ad9e942aa7d624c204ab54f..51bc1e6c39b944602c219841acbe8278c8f1a95a 100644 (file)
@@ -85,9 +85,10 @@ static void
 _e_keyrouter_wl_key_send_to_resource_list(Ecore_Event_Key *ev, E_Device *dev, enum wl_keyboard_key_state state, struct wl_client *client, struct wl_resource *surface)
 {
    struct wl_resource *res;
-   Eina_List *l;
+   Eina_List *l, *ll;
    uint32_t serial, keycode;
    E_Comp_Wl_Data *comp_wl;
+   E_Seat *seat;
 
    keycode = (ev->keycode - 8);
 
@@ -116,16 +117,19 @@ _e_keyrouter_wl_key_send_to_resource_list(Ecore_Event_Key *ev, E_Device *dev, en
           e_comp_wl_send_event_e_device(client, ev->timestamp, dev, serial);
      }
 
-   g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
-   EINA_LIST_FOREACH(e_comp_input_key->kbd.resources, l, res)
+   TRACE_INPUT_BEGIN(_e_keyrouter_wl_key_send);
+   EINA_LIST_FOREACH(e_seat_list_get(), l, seat)
      {
-        if (wl_resource_get_client(res) != client) continue;
-        TRACE_INPUT_BEGIN(_e_keyrouter_wl_key_send);
-        wl_keyboard_send_key(res, serial, ev->timestamp,
-                             keycode, state);
-        TRACE_INPUT_END();
+        e_seat_keyboard_resources_lock(seat);
+        EINA_LIST_FOREACH(e_seat_keyboard_resources_get(seat), ll, res)
+          {
+             if (wl_resource_get_client(res) != client) continue;
+             wl_keyboard_send_key(res, serial, ev->timestamp,
+                                  keycode, state);
+          }
+        e_seat_keyboard_resources_unlock(seat);
      }
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
+   TRACE_INPUT_END();
 
    if (e_config->key_input_ttrace_enable)
      {
@@ -135,7 +139,7 @@ _e_keyrouter_wl_key_send_to_resource_list(Ecore_Event_Key *ev, E_Device *dev, en
 }
 
 static void
-_e_keyrouter_wl_key_send_to_focused_list(Ecore_Event_Key *ev, E_Device *dev, enum wl_keyboard_key_state state)
+_e_keyrouter_wl_key_send_to_focused_list(Ecore_Event_Key *ev, E_Device *dev, E_Seat *seat, enum wl_keyboard_key_state state)
 {
    struct wl_resource *res;
    Eina_List *l;
@@ -143,6 +147,8 @@ _e_keyrouter_wl_key_send_to_focused_list(Ecore_Event_Key *ev, E_Device *dev, enu
    struct wl_client *wc;
    E_Comp_Wl_Data *comp_wl;
 
+   EINA_SAFETY_ON_NULL_RETURN(seat);
+
    keycode = (ev->keycode - 8);
 
    comp_wl = e_comp_wl_get();
@@ -154,8 +160,8 @@ _e_keyrouter_wl_key_send_to_focused_list(Ecore_Event_Key *ev, E_Device *dev, enu
         ELOGF("INPUT", "wl_keyboard_send_key:%s:%s|B|", NULL, (state ? "PRESS" : "RELEASE"), ev->keyname);
      }
 
-   g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
-   EINA_LIST_FOREACH(e_comp_input_key->kbd.focused, l, res)
+   e_seat_keyboard_focused_lock(seat);
+   EINA_LIST_FOREACH(e_seat_keyboard_focused_get(seat), l, res)
      {
         wc = wl_resource_get_client(res);
         if (!e_input_thread_mode_get())
@@ -173,7 +179,7 @@ _e_keyrouter_wl_key_send_to_focused_list(Ecore_Event_Key *ev, E_Device *dev, enu
                              keycode, state);
         TRACE_INPUT_END();
      }
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+   e_seat_keyboard_focused_unlock(seat);
 
    if (e_config->key_input_ttrace_enable)
      {
@@ -190,7 +196,7 @@ e_keyrouter_wl_key_send(Ecore_Event_Key *ev, E_Device *dev, Eina_Bool pressed, s
    uint32_t keycode;
    enum wl_keyboard_key_state state;
    const char *seat_name = NULL;
-   E_Seat *seat;
+   E_Seat *seat = NULL;
    E_Zone *zone = NULL;
    E_Comp_Config *comp_conf = NULL;
 
@@ -237,14 +243,8 @@ e_keyrouter_wl_key_send(Ecore_Event_Key *ev, E_Device *dev, Eina_Bool pressed, s
         ec = e_zone_focused_client_get(zone);
         ELOGF("KRT", "Key Send. seat:%s zone_id:%d", ec, seat_name, e_zone_id_get(zone));
 
-        g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
-        if (!e_comp_input_key->kbd.focused)
-          {
-             g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
-             return EINA_FALSE;
-          }
-        g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
-        _e_keyrouter_wl_key_send_to_focused_list(ev, dev, state);
+        if (e_seat_keyboard_focused_is_empty(seat)) return EINA_FALSE;
+        _e_keyrouter_wl_key_send_to_focused_list(ev, dev, seat, state);
 
         /* update modifier state */
         e_comp_wl_input_keyboard_state_update(keycode, pressed);
index 791bdef7792dd0491a9ae803aaea176475b39f1f..db3ae435b798306e80a76f48e8d9ba0b5c4ac39f 100644 (file)
@@ -37,10 +37,14 @@ struct _E_Seat
 
      struct
      {
+        Eina_List *resources;
+        Eina_List *focused;
         Eina_Bool enabled : 1;
         unsigned int num_devices;
         struct wl_resource *focus;
         struct wl_array keys;
+        GRecMutex resources_mutex;
+        GRecMutex focused_mutex;
      } kbd;
    E_Zone *zone;
 };
@@ -327,18 +331,20 @@ _e_seat_cb_keyboard_unbind(struct wl_resource *resource)
 
    Eina_List *l, *ll;
    struct wl_resource *res;
+   E_Seat *seat;
+   seat = wl_resource_get_user_data(resource);
+   if (!seat) return;
 
-   g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
-   e_comp_input_key->kbd.resources =
-     eina_list_remove(e_comp_input_key->kbd.resources, resource);
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
+   g_rec_mutex_lock(&seat->kbd.resources_mutex);
+   seat->kbd.resources =
+     eina_list_remove(seat->kbd.resources, resource);
+   g_rec_mutex_unlock(&seat->kbd.resources_mutex);
 
-   g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
-   EINA_LIST_FOREACH_SAFE(e_comp_input_key->kbd.focused, l, ll, res)
+   g_rec_mutex_lock(&seat->kbd.focused_mutex);
+   EINA_LIST_FOREACH_SAFE(seat->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);
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+       seat->kbd.focused = eina_list_remove_list(seat->kbd.focused, l);
+   g_rec_mutex_unlock(&seat->kbd.focused_mutex);
 }
 
 static enum wl_iterator_result
@@ -346,18 +352,21 @@ _e_seat_get_resource(struct wl_resource *resource, void *data)
 {
    Eina_List *l, *ll;
    struct wl_resource *res;
+   E_Seat *seat;
+   seat = wl_resource_get_user_data(resource);
+   if (!seat) return WL_ITERATOR_CONTINUE;
 
-   g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
-   e_comp_input_key->kbd.resources = eina_list_remove(e_comp_input_key->kbd.resources, resource);
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
+   g_rec_mutex_lock(&seat->kbd.resources_mutex);
+   seat->kbd.resources = eina_list_remove(seat->kbd.resources, resource);
+   g_rec_mutex_unlock(&seat->kbd.resources_mutex);
 
-   g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
-   EINA_LIST_FOREACH_SAFE(e_comp_input_key->kbd.focused, l, ll, res)
+   g_rec_mutex_lock(&seat->kbd.focused_mutex);
+   EINA_LIST_FOREACH_SAFE(seat->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);
+          seat->kbd.focused = eina_list_remove_list(seat->kbd.focused, l);
      }
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+   g_rec_mutex_unlock(&seat->kbd.focused_mutex);
 
    return WL_ITERATOR_CONTINUE;
 }
@@ -393,10 +402,10 @@ _e_seat_cb_keyboard_get(struct wl_client *client, struct wl_resource *resource,
         return;
      }
 
-   g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
-   e_comp_input_key->kbd.resources =
-     eina_list_append(e_comp_input_key->kbd.resources, res);
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
+   g_rec_mutex_lock(&seat->kbd.resources_mutex);
+   seat->kbd.resources =
+     eina_list_append(seat->kbd.resources, res);
+   g_rec_mutex_unlock(&seat->kbd.resources_mutex);
 
    wl_resource_set_implementation(res, &_e_keyboard_interface,
                                   seat,
@@ -422,9 +431,9 @@ _e_seat_cb_keyboard_get(struct wl_client *client, struct wl_resource *resource,
    if (!surface) return;
 
    if (client != wl_resource_get_client(surface)) return;
-   g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
-   e_comp_input_key->kbd.focused = eina_list_append(e_comp_input_key->kbd.focused, res);
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+   g_rec_mutex_lock(&seat->kbd.focused_mutex);
+   seat->kbd.focused = eina_list_append(seat->kbd.focused, res);
+   g_rec_mutex_unlock(&seat->kbd.focused_mutex);
 
    e_seat_keyboard_send_enter(seat, surface);
 
@@ -603,6 +612,9 @@ e_seat_create(const char *seat_name)
      }
    seat->resources = NULL;
 
+   g_rec_mutex_init(&seat->kbd.resources_mutex);
+   g_rec_mutex_init(&seat->kbd.focused_mutex);
+
    wl_array_init(&seat->kbd.keys);
 
    _seats = eina_list_append(_seats, seat);
@@ -617,8 +629,14 @@ e_seat_destroy(E_Seat *seat)
 
    E_FREE(seat->name);
 
+   g_rec_mutex_clear(&seat->kbd.resources_mutex);
+   g_rec_mutex_clear(&seat->kbd.focused_mutex);
+
    wl_array_release(&seat->kbd.keys);
 
+   EINA_LIST_FREE(seat->kbd.resources, res)
+      wl_resource_destroy(res);
+   seat->kbd.resources = eina_list_free(seat->kbd.resources);
    EINA_LIST_FREE(seat->ptr.resources, res)
       wl_resource_destroy(res);
    EINA_LIST_FREE(seat->touch.resources, res)
@@ -1254,6 +1272,124 @@ e_seat_keyboard_keys_state_update(E_Seat *seat, Eina_Bool pressed)
      e_comp_wl_input_keyboard_state_update(k->key, pressed);
 }
 
+EINTERN Eina_List *
+e_seat_keyboard_focused_get(E_Seat *seat)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(seat, NULL);
+   return seat->kbd.focused;
+}
+
+EINTERN Eina_List *
+e_seat_keyboard_resources_get(E_Seat *seat)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(seat, NULL);
+   return seat->kbd.resources;
+}
+
+EINTERN void
+e_seat_keyboard_resources_lock(E_Seat *seat)
+{
+   EINA_SAFETY_ON_NULL_RETURN(seat);
+   g_rec_mutex_lock(&seat->kbd.resources_mutex);
+}
+
+EINTERN void
+e_seat_keyboard_resources_unlock(E_Seat *seat)
+{
+   EINA_SAFETY_ON_NULL_RETURN(seat);
+   g_rec_mutex_unlock(&seat->kbd.resources_mutex);
+}
+
+EINTERN void
+e_seat_keyboard_focused_lock(E_Seat *seat)
+{
+   EINA_SAFETY_ON_NULL_RETURN(seat);
+   g_rec_mutex_lock(&seat->kbd.focused_mutex);
+}
+
+EINTERN void
+e_seat_keyboard_focused_unlock(E_Seat *seat)
+{
+   EINA_SAFETY_ON_NULL_RETURN(seat);
+   g_rec_mutex_unlock(&seat->kbd.focused_mutex);
+}
+
+EINTERN Eina_Bool
+e_seat_keyboard_focused_is_empty(E_Seat *seat)
+{
+   E_Seat *s;
+
+   if (!seat) s = _current_seat;
+   else s = seat;
+
+   g_rec_mutex_lock(&s->kbd.focused_mutex);
+   if (!s->kbd.focused || !eina_list_count(s->kbd.focused))
+     {
+        g_rec_mutex_unlock(&s->kbd.focused_mutex);
+        return EINA_TRUE;
+     }
+   g_rec_mutex_unlock(&s->kbd.focused_mutex);
+   return EINA_FALSE;
+}
+
+EINTERN Eina_Bool
+e_seat_keyboard_resources_is_empty(E_Seat *seat)
+{
+   E_Seat *s;
+
+   if (!seat) s = _current_seat;
+   else s = seat;
+
+   g_rec_mutex_lock(&s->kbd.resources_mutex);
+   if (!s->kbd.resources || !eina_list_count(s->kbd.resources))
+     {
+        g_rec_mutex_unlock(&s->kbd.resources_mutex);
+        return EINA_TRUE;
+     }
+   g_rec_mutex_unlock(&s->kbd.resources_mutex);
+   return EINA_FALSE;
+}
+
+EINTERN void
+e_seat_keyboard_focused_resource_add(E_Seat *seat, struct wl_client *wc)
+{
+   struct wl_resource *res;
+   Eina_List *l;
+
+   EINA_SAFETY_ON_NULL_RETURN(seat);
+
+   g_rec_mutex_lock(&seat->kbd.resources_mutex);
+   EINA_LIST_FOREACH(seat->kbd.resources, l, res)
+     {
+        if (wl_resource_get_client(res) == wc)
+          {
+            g_rec_mutex_lock(&seat->kbd.focused_mutex);
+            if (!eina_list_data_find(seat->kbd.focused, res))
+              seat->kbd.focused = eina_list_append(seat->kbd.focused, res);
+            g_rec_mutex_unlock(&seat->kbd.focused_mutex);
+          }
+     }
+     g_rec_mutex_unlock(&seat->kbd.resources_mutex);
+}
+
+EINTERN void
+e_seat_keyboard_focused_resource_remove(E_Seat *seat, struct wl_client *wc)
+{
+   struct wl_resource *res;
+   Eina_List *l, *ll;
+
+   g_rec_mutex_lock(&seat->kbd.focused_mutex);
+   EINA_LIST_FOREACH_SAFE(seat->kbd.focused, l, ll, res)
+     {
+        if (wl_resource_get_client(res) == wc)
+          {
+             seat->kbd.focused =
+                eina_list_remove_list(seat->kbd.focused, l);
+          }
+     }
+   g_rec_mutex_unlock(&seat->kbd.focused_mutex);
+}
+
 EINTERN void
 e_seat_keyboard_resource_send_keys(E_Seat *seat, struct wl_resource *res, uint32_t serial,
                                    uint32_t state)
@@ -1295,13 +1431,13 @@ e_seat_keyboard_send_enter(E_Seat *seat, struct wl_resource *surface)
    if (!seat) s = _current_seat;
    else s = seat;
 
-   g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
-   if (!e_comp_input_key->kbd.focused)
+   g_rec_mutex_lock(&s->kbd.focused_mutex);
+   if (!s->kbd.focused)
      {
-        g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+        g_rec_mutex_unlock(&s->kbd.focused_mutex);
         return;
      }
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+   g_rec_mutex_unlock(&s->kbd.focused_mutex);
 
    e_comp_wl_input_keyboard_modifiers_serialize();
 
@@ -1325,15 +1461,15 @@ e_seat_keyboard_send_enter(E_Seat *seat, struct wl_resource *surface)
       *key = k->key;
    }
 
-   g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
-   EINA_LIST_FOREACH(e_comp_input_key->kbd.focused, l, res)
+   g_rec_mutex_lock(&s->kbd.focused_mutex);
+   EINA_LIST_FOREACH(s->kbd.focused, l, res)
      {
-        if (wl_resource_get_client(res) == wl_resource_get_client(surface))
-          {
-             ELOGF("Key", "Enter. keys(cnt:%d)", NULL, key_cnt);
-             wl_keyboard_send_enter(res, serial, surface,
-                                    &keys);
-          }
+        if (wl_resource_get_client(res) != wl_resource_get_client(surface))
+          continue;
+
+        ELOGF("Key", "Enter. keys(cnt:%d)", NULL, key_cnt);
+        wl_keyboard_send_enter(res, serial, surface,
+                               &keys);
 
         wl_keyboard_send_modifiers(res, serial,
                                    mod_depressed,
@@ -1341,7 +1477,7 @@ e_seat_keyboard_send_enter(E_Seat *seat, struct wl_resource *surface)
                                    mod_locked,
                                    mod_group);
      }
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+   g_rec_mutex_unlock(&s->kbd.focused_mutex);
 
    wl_array_release(&keys);
 }
@@ -1353,18 +1489,20 @@ e_seat_keyboard_send_leave(E_Seat *seat, struct wl_resource *surface)
    Eina_List *l;
    uint32_t serial;
    E_Comp_Wl_Data *comp_wl = e_comp_wl_get();
+   E_Seat *s;
 
-   //seat;
+   if (!seat) s = _current_seat;
+   else s = seat;
 
    serial = wl_display_next_serial(comp_wl->wl.disp);
 
-   g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
-   EINA_LIST_FOREACH(e_comp_input_key->kbd.focused, l, res)
+   g_rec_mutex_lock(&s->kbd.focused_mutex);
+   EINA_LIST_FOREACH(s->kbd.focused, l, res)
      {
         if (wl_resource_get_client(res) == wl_resource_get_client(surface))
           {
              wl_keyboard_send_leave(res, serial, surface);
           }
      }
-   g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+   g_rec_mutex_unlock(&s->kbd.focused_mutex);
 }
index d96a2227dc003edeb959231709816a65a138b73d..986d70a2c664f2609921cb458e45a5a5e035e71c 100644 (file)
@@ -78,9 +78,20 @@ EINTERN Eina_Bool   e_seat_keyboard_keys_keydata_add(E_Seat *seat, uint32_t keyc
 EINTERN Eina_Bool   e_seat_keyboard_keys_keydata_remove(E_Seat *seat, uint32_t keycode);
 EINTERN void        e_seat_keyboard_keys_state_update(E_Seat *seat, Eina_Bool pressed);
 
+EINTERN Eina_List  *e_seat_keyboard_focused_get(E_Seat *seat);
+EINTERN Eina_List  *e_seat_keyboard_resources_get(E_Seat *seat);
+EINTERN void        e_seat_keyboard_resources_lock(E_Seat *seat);
+EINTERN void        e_seat_keyboard_resources_unlock(E_Seat *seat);
+EINTERN void        e_seat_keyboard_focused_lock(E_Seat *seat);
+EINTERN void        e_seat_keyboard_focused_unlock(E_Seat *seat);
+EINTERN Eina_Bool   e_seat_keyboard_focused_is_empty(E_Seat *seat);
+EINTERN Eina_Bool   e_seat_keyboard_resources_is_empty(E_Seat *seat);
+EINTERN void        e_seat_keyboard_focused_resource_add(E_Seat *seat, struct wl_client *wc);
+EINTERN void        e_seat_keyboard_focused_resource_remove(E_Seat *seat, struct wl_client *wc);
+
 EINTERN void        e_seat_keyboard_resource_send_keys(E_Seat *seat, struct wl_resource *res, uint32_t serial,
                                                        uint32_t state);
 EINTERN void        e_seat_keyboard_send_enter(E_Seat *seat, struct wl_resource *surface);
 EINTERN void        e_seat_keyboard_send_leave(E_Seat *seat, struct wl_resource *surface);
-
+EINTERN void        e_seat_keyboard_send_keymap(struct wl_resource *resource);
 #endif // E_SEAT_INTERN_H