#include "e_comp_wl_input_thread_intern.h"
#include "e_seat_intern.h"
#include "e_surface_view_intern.h"
+#include "e_zone_intern.h"
#include <tizen-extension-server-protocol.h>
#include <relative-pointer-unstable-v1-server-protocol.h>
*/
typedef struct _E_Comp_Data E_Comp_Data;
+typedef struct _E_Comp_Wl_Focus_Private_Client E_Comp_Wl_Focus_Private_Client;
struct _E_Comp_Data
{
Ecore_Device *dev;
} E_Comp_Wl_Key_Data;
+struct _E_Comp_Wl_Focus_Private_Client
+{
+ E_Client *ec;
+
+ struct wl_listener client_destroy;
+ struct wl_listener focus_set;
+ struct wl_listener focus_unset;
+};
+
static Eina_List *handlers = NULL;
static E_Client *cursor_timer_ec = NULL;
static Eina_Bool need_send_released = EINA_FALSE;
e_input_thread_boost_unlock(&connection_mutex);
}
+
static void
_e_comp_wl_cb_prepare(void *data EINA_UNUSED, Ecore_Fd_Handler *hdlr EINA_UNUSED)
{
/* raise client priority */
_e_comp_wl_client_priority_raise(ec);
- struct wl_resource *surface = e_comp_wl_client_surface_get(ec);
- if (!surface) return;
-
- INF("send focus in request to input thread. surface(%p)\n", surface);
- _e_comp_wl_input_thread_focus_in(&surface);
-
ec->comp_data->on_focus_timer =
ecore_timer_add(((e_config->xkb.delay_held_key_input_to_focus)/1000.0),
(Ecore_Task_Cb)_e_comp_wl_evas_cb_focus_in_timer, ec);
/* lower client priority */
if (!e_object_is_del(data))
_e_comp_wl_client_priority_normal(ec);
-
- struct wl_resource *surface = e_comp_wl_client_surface_get(ec);
- INF("send focus out request to input thread. surface(%p)\n", surface);
- _e_comp_wl_input_thread_focus_out(&surface);
}
static void
return ECORE_CALLBACK_RENEW;
}
+static void
+_e_comp_wl_focus_client_del(E_Comp_Wl_Focus_Private_Client *kbd_focus_client)
+{
+ wl_list_remove(&kbd_focus_client->client_destroy.link);
+ wl_list_remove(&kbd_focus_client->focus_set.link);
+ wl_list_remove(&kbd_focus_client->focus_unset.link);
+
+ E_FREE(kbd_focus_client);
+}
+
+
+static void
+_e_comp_wl_focus_client_cb_client_destroy(struct wl_listener *listener, void *data)
+{
+ E_Comp_Wl_Focus_Private_Client *kbd_focus_client;
+
+ kbd_focus_client = wl_container_of(listener, kbd_focus_client, client_destroy);
+ _e_comp_wl_focus_client_del(kbd_focus_client);
+}
+
+static void
+_e_comp_wl_focus_client_cb_client_focus_set(struct wl_listener *listener, void *data)
+{
+ E_Client *ec;
+ E_Comp_Wl_Focus_Private_Client *kbd_focus_client;
+
+ kbd_focus_client = wl_container_of(listener, kbd_focus_client, focus_set);
+ EINA_SAFETY_ON_NULL_RETURN(kbd_focus_client);
+ ec = kbd_focus_client->ec;
+ EINA_SAFETY_ON_NULL_RETURN(ec);
+
+ struct wl_resource *surface = e_comp_wl_client_surface_get(ec);
+ if (!surface) return;
+
+ ELOGF("COMP_WL", "send focus in request to input thread. surface(%p)\n", ec, surface);
+ _e_comp_wl_input_thread_focus_in(&surface);
+
+ return;
+}
+
+static void
+_e_comp_wl_focus_client_cb_client_focus_unset(struct wl_listener *listener, void *data)
+{
+ E_Client *ec;
+ E_Comp_Wl_Focus_Private_Client *kbd_focus_client;
+
+ kbd_focus_client = wl_container_of(listener, kbd_focus_client, focus_unset);
+ EINA_SAFETY_ON_NULL_RETURN(kbd_focus_client);
+ ec = kbd_focus_client->ec;
+ EINA_SAFETY_ON_NULL_RETURN(ec);
+
+ struct wl_resource *surface = e_comp_wl_client_surface_get(ec);
+ if (!surface) return;
+
+ ELOGF("COMP_WL", "send focus out request to input thread. surface(%p)\n", ec, surface);
+ _e_comp_wl_input_thread_focus_out(&surface);
+
+ return;
+}
+
+static void
+_e_comp_wl_focus_client_add(E_Client *ec)
+{
+ E_Comp_Wl_Focus_Private_Client *kbd_focus_client;
+
+ kbd_focus_client = E_NEW(E_Comp_Wl_Focus_Private_Client, 1);
+ EINA_SAFETY_ON_NULL_RETURN(kbd_focus_client);
+
+ kbd_focus_client->ec = ec;
+
+ kbd_focus_client->focus_set.notify = _e_comp_wl_focus_client_cb_client_focus_set;
+ e_client_focus_set_listener_add(ec, &kbd_focus_client->focus_set);
+
+ kbd_focus_client->focus_unset.notify = _e_comp_wl_focus_client_cb_client_focus_unset;
+ e_client_focus_unset_listener_add(ec, &kbd_focus_client->focus_unset);
+
+ kbd_focus_client->client_destroy.notify = _e_comp_wl_focus_client_cb_client_destroy;
+ e_client_destroy_listener_add(ec, &kbd_focus_client->client_destroy);
+
+ return;
+}
+
static Eina_Bool
_e_comp_wl_cb_comp_object_add(void *data EINA_UNUSED, int type EINA_UNUSED, E_Event_Comp_Object *ev)
{
/* if we have not setup evas callbacks for this client, do it */
if (!ec->comp_data->evas_init) _e_comp_wl_client_evas_init(ec);
+ _e_comp_wl_focus_client_add(ec);
+
return ECORE_CALLBACK_RENEW;
}
E_Client *ec = NULL;
uint32_t keycode;
E_Comp_Wl_Key_Data *end, *k;
+ const char *seat_name = NULL;
+ E_Seat *seat;
+ E_Zone *zone = NULL;
if (ev->window != e_comp_ee_win_get())
{
comp = e_comp_get();
if ((!e_client_action_get()) && (!comp->input_key_grabs))
{
- ec = e_client_focused_get();
+ seat_name = e_device_seatname_get(dev);
+ if ((seat_name) && (seat = e_seat_find(seat_name)))
+ zone = e_seat_zone_get(seat);
+ if (!zone)
+ zone = e_comp_default_zone_get(comp);
+
+ ec = e_zone_focused_client_get(zone);
+ ELOGF("INPUT", "Key Down. seat:%s zone_id:%d", ec, seat_name, e_zone_id_get(zone));
+
struct wl_resource *surface = e_comp_wl_client_surface_get(ec);
if (ec && ec->comp_data && surface)
{
uint32_t keycode, delivered_key;
E_Comp_Wl_Key_Data *end, *k;
E_Comp *comp;
+ const char *seat_name = NULL;
+ E_Seat *seat;
+ E_Zone *zone = NULL;
if (ev->window != e_comp_ee_win_get())
{
if ((delivered_key) ||
((!e_client_action_get()) && (!comp->input_key_grabs)))
{
- ec = e_client_focused_get();
+ seat_name = e_device_seatname_get(dev);
+ if ((seat_name) && (seat = e_seat_find(seat_name)))
+ zone = e_seat_zone_get(seat);
+ if (!zone)
+ zone = e_comp_default_zone_get(comp);
+
+ 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)