}
}
+ g_mutex_lock(&ec->comp_data->surface_mutex);
ec->comp_data->surface = NULL;
+ g_mutex_unlock(&ec->comp_data->surface_mutex);
+
ec->comp_data->wl_surface = NULL;
e_pixmap_win_id_del(ec->pixmap);
ec->new_client = 0;
if ((!ec->client.w) && (ec->client.h))
ec->client.w = ec->client.h = 1;
+ g_mutex_lock(&ec->comp_data->surface_mutex);
ec->comp_data->surface = res;
+ g_mutex_unlock(&ec->comp_data->surface_mutex);
ec->icccm.accepts_focus = 1;
wl_list_init(&ec->comp_data->pointer_constraints);
}
e_pixmap_cdata_set(ec->pixmap, ec->comp_data);
g_mutex_init(&ec->comp_data->last_device_kbd_mutex);
+ g_mutex_init(&ec->comp_data->surface_mutex);
end:
TRACE_DS_END();
TRACE_DS_BEGIN(COMP_WL:CLIENT DEL CB);
g_mutex_clear(&ec->comp_data->last_device_kbd_mutex);
+ g_mutex_clear(&ec->comp_data->surface_mutex);
_e_comp_wl_hook_call(E_COMP_WL_HOOK_DEL, ec);
Eina_Bool wtz_surface_assigned;
struct wl_list pointer_constraints;
GMutex last_device_kbd_mutex;
+ GMutex surface_mutex;
};
struct _E_Comp_Wl_Output
{
E_Client *ec;
Eina_Bool got_mouse = EINA_FALSE;
+ struct wl_resource *surface;
E_CLIENT_FOREACH(ec)
{
if (e_object_is_del(E_OBJECT(ec))) continue;
if (e_pixmap_type_get(ec->pixmap) != E_PIXMAP_TYPE_WL) continue;
- if (!ec->comp_data->surface) continue;
- if (client != wl_resource_get_client(ec->comp_data->surface)) continue;
+ g_mutex_lock(&ec->comp_data->surface_mutex);
+ surface = ec->comp_data->surface;
+ g_mutex_unlock(&ec->comp_data->surface_mutex);
+
+ if (!surface) continue;
+ if (client != wl_resource_get_client(surface)) continue;
if (ec->mouse.in && ec->pointer_enter_sent)
{
got_mouse = EINA_TRUE;
serial = wl_display_next_serial(e_comp_wl->wl.disp);
+ g_mutex_lock(&ec->comp_data->surface_mutex);
EINA_LIST_FOREACH(e_comp_wl->kbd.focused, l, res)
{
wl_keyboard_send_enter(res, serial, ec->comp_data->surface,
e_comp_wl->kbd.mod_locked,
e_comp_wl->kbd.mod_group);
}
+ g_mutex_unlock(&ec->comp_data->surface_mutex);
}
static void
_e_comp_wl_subsurface_cb_comp_data_del,
sub);
+ g_mutex_lock(&ec->comp_data->surface_mutex);
ec->comp_data->surface = ec->comp_data->wl_surface;
+ g_mutex_unlock(&ec->comp_data->surface_mutex);
+
ec->comp_data->sub.data = &sub->base;
e_comp_wl_surface_state_init(&sub->base.cached, ec->w, ec->h);