struct wl_resource *res, *surface;
struct wl_client *wc;
Eina_List *l;
+ E_Seat *seat = NULL;
if (!ec) return;
surface = e_comp_wl_client_surface_get(ec);
EINA_SAFETY_ON_NULL_RETURN(surface);
+ seat = e_seat_find_by_zone(e_comp_zone_find_by_ec(ec));
+ if (!seat) return;
+
wc = wl_resource_get_client(surface);
g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
}
g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
- e_comp_input_key->kbd.focus = surface;
+ e_seat_keyboard_focus_surface_set(seat, surface);
e_comp_wl_input_keyboard_enter_send(surface);
- e_comp_wl_data_device_keyboard_focus_set();
+ e_comp_wl_data_device_keyboard_focus_set(seat);
}
/* It is called in the following cases:
E_Comp_Wl_Key_Data *k;
Eina_List *l, *ll;
double t;
+ E_Seat *seat = NULL;
struct wl_resource *surface = e_comp_wl_client_surface_get(ec);
if (!surface) return;
EINA_SAFETY_ON_NULL_RETURN(surface);
+ seat = e_seat_find_by_zone(e_comp_zone_find_by_ec(ec));
+ if (!seat) return;
+
/* update keyboard modifier state */
wl_array_for_each(k, &e_comp_input_key->kbd.keys)
e_comp_wl_input_keyboard_state_update(k->key, EINA_FALSE);
}
}
g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+
+ e_seat_keyboard_focus_surface_set(seat, NULL);
}
static void
_e_comp_wl_pid_hook_call(E_COMP_WL_PID_HOOK_CONNECTED_CLIENT_CREATE, pid);
}
-static void
-_e_input_thread_client_cb_focus_set(void *data)
-{
- struct wl_resource *surface = NULL;
-
- EINA_SAFETY_ON_NULL_RETURN(data);
- surface = *(struct wl_resource **)data;
-
- ICINF("[input thread|%s] surface(%p)", __func__, surface);
-
- e_comp_input_key->kbd.focus = surface;
-}
-
static void
_e_comp_wl_client_cb_focus_set(void *data EINA_UNUSED, E_Client *ec)
{
if (ec->comp_data->shell.surface)
_e_comp_wl_configure_send(ec, 0, 0);
}
-
- ICINF("[%s] surface(%p)", __func__, ec->comp_data->surface);
- e_input_backend_thread_safe_call(_e_input_thread_client_cb_focus_set, (void *)&ec->comp_data->surface, sizeof(struct wl_resource *));
-}
-
-static void
-_e_input_thread_client_cb_focus_unset(void *data)
-{
- struct wl_resource *surface = NULL;
-
- EINA_SAFETY_ON_NULL_RETURN(data);
- surface = *(struct wl_resource **)data;
-
- ICINF("[input thread|%s] surface(%p)", __func__, surface);
-
- if (e_comp_input_key->kbd.focus == surface)
- e_comp_input_key->kbd.focus = NULL;
}
static void
}
_e_comp_wl_focus_check();
-
- ICINF("[%s] surface(%p)", __func__, ec->comp_data->surface);
- e_input_backend_thread_safe_call(_e_input_thread_client_cb_focus_unset, (void *)&ec->comp_data->surface, sizeof(struct wl_resource *));
}
static void
} E_Comp_Wl_Thread_Data;
static void _e_comp_wl_data_source_cancelled_send(E_Comp_Wl_Data_Source *source);
-static void _e_comp_wl_data_device_selection_unset(void);
+static void _e_comp_wl_data_device_selection_unset(E_Comp_Wl_Data_Source *source);
static void
_mime_types_free(E_Comp_Wl_Data_Source *source)
if (comp_wl->selection.data_source == source)
{
comp_wl->selection.data_source = NULL;
- _e_comp_wl_data_device_selection_unset();
+ _e_comp_wl_data_device_selection_unset(source);
}
_mime_types_free(source);
+ source->seat = NULL;
free(source);
}
};
static void
-_e_comp_wl_data_device_selection_unset(void)
+_e_comp_wl_data_device_selection_unset(E_Comp_Wl_Data_Source *source)
{
struct wl_resource *data_device_res = NULL, *focus = NULL;
struct wl_resource *data_only;
E_Comp_Wl_Data *comp_wl;
Eina_List *l;
+ E_Seat *seat = NULL;
comp_wl = e_comp_wl_get();
- if (e_seat_keyboard_enabled_get(NULL))
- focus = e_comp_input_key->kbd.focus;
+ seat = source->seat;
+ if (seat && e_seat_keyboard_enabled_get(seat))
+ focus = e_seat_keyboard_focus_surface_get(seat);
if (focus)
{
return;
}
- _e_comp_wl_data_device_selection_unset();
+ _e_comp_wl_data_device_selection_unset(source);
wl_signal_emit(&comp_wl->selection.signal, comp_wl);
}
E_Comp_Wl_Data_Source *sel_source;
struct wl_resource *offer_res, *data_device_res, *focus = NULL;
struct wl_client *source_client = NULL, *sel_client = NULL, *cbhm_client = NULL;
+ E_Seat *seat = NULL;
sel_source = (E_Comp_Wl_Data_Source*)comp_wl->selection.data_source;
comp_wl->clipboard.xwl_owner = NULL;
comp_wl->selection.serial = serial;
- if (e_seat_keyboard_enabled_get(NULL))
- focus = e_comp_input_key->kbd.focus;
+ if ((source) && (seat = source->seat) && e_seat_keyboard_enabled_get(seat))
+ focus = e_seat_keyboard_focus_surface_get(seat);
//if source is from cbhm_client do not create data offer for cbhm
if ((cbhm_client) && (source_client != cbhm_client))
{
wc = wl_resource_get_client(origin_resource);
//TODO: consider multi-seat
- e_seat_pointer_send_leave(NULL, wc, ec, e_comp_wl_client_surface_get(ec));
+ e_seat_pointer_send_leave(seat, wc, ec, e_comp_wl_client_surface_get(ec));
}
evas_pointer_canvas_xy_get(e_comp_evas_get(), &x, &y);
e_comp_canvas_feed_mouse_up(0);
e_comp_wl_data_current_device_id_set(-1);
+ source->seat = seat;
}
static void
DBG("Data Device Selection Set");
if (!source_resource) return;
if (!(source = wl_resource_get_user_data(source_resource))) return;
+
seat = wl_resource_get_user_data(resource);
if (!seat) return;
+ source->seat = seat;
_e_comp_wl_data_device_selection_set(comp_wl, source, serial);
}
}
EINTERN void
-e_comp_wl_data_device_keyboard_focus_set(void)
+e_comp_wl_data_device_keyboard_focus_set(E_Seat *seat)
{
struct wl_resource *data_device_res, *offer_res = NULL, *focus;
E_Comp_Wl_Data_Source *source;
E_Comp_Wl_Data *comp_wl;
- if (e_seat_keyboard_enabled_get(NULL))
+ if (e_seat_keyboard_enabled_get(seat))
{
ERR("Keyboard not enabled");
return;
}
- if (!(focus = e_comp_input_key->kbd.focus))
+ if (!(focus = e_seat_keyboard_focus_surface_get(seat)))
{
ERR("No focused resource");
return;
source->target = _e_comp_wl_data_source_target_send;
source->send = _e_comp_wl_data_source_send_send;
source->cancelled = _e_comp_wl_data_source_cancelled_send;
+ source->seat = NULL;
source->resource =
wl_resource_create(client, &wl_data_source_interface, 3, id);
struct wl_resource *offer_res = NULL, *focus;
E_Comp_Wl_Data_Source *source;
E_Comp_Wl_Data *comp_wl;
+ E_Seat *seat;
EINA_SAFETY_ON_NULL_RETURN(data_device_res);
+ seat = wl_resource_get_user_data(data_device_res);
comp_wl = e_comp_wl_get();
if (set)
comp_wl->selection.data_only_list =
eina_list_remove(comp_wl->selection.data_only_list, data_device_res);
- focus = e_comp_input_key->kbd.focus;
+ focus = e_seat_keyboard_focus_surface_get(seat);
if ((!focus) ||
(wl_resource_get_client(focus) != wl_resource_get_client(data_device_res)))
{