forked from enlightenment/enlightenment
handle illegal xdg-shell resource unbinds
this occurs when the shell resource dies before all the surfaces/positioners are destroyed. usually this means the client has aborted, so there's no point in sending an error or doing anything beyond performing a thorough cleanup
This commit is contained in:
parent
50b2712f61
commit
7851769eab
|
@ -29,6 +29,7 @@ typedef struct v6_Shell_Data
|
||||||
typedef struct Positioner
|
typedef struct Positioner
|
||||||
{
|
{
|
||||||
v6_Shell_Data *v;
|
v6_Shell_Data *v;
|
||||||
|
struct wl_resource *res;
|
||||||
Evas_Coord_Size size;
|
Evas_Coord_Size size;
|
||||||
Eina_Rectangle anchor_rect;
|
Eina_Rectangle anchor_rect;
|
||||||
enum zxdg_positioner_v6_anchor anchor;
|
enum zxdg_positioner_v6_anchor anchor;
|
||||||
|
@ -147,6 +148,7 @@ _e_xdg_shell_positioner_destroy(struct wl_resource *resource)
|
||||||
Positioner *p;
|
Positioner *p;
|
||||||
|
|
||||||
p = wl_resource_get_user_data(resource);
|
p = wl_resource_get_user_data(resource);
|
||||||
|
if (!p) return;
|
||||||
if (p->v) p->v->positioners = eina_list_remove(p->v->positioners, p);
|
if (p->v) p->v->positioners = eina_list_remove(p->v->positioners, p);
|
||||||
free(p);
|
free(p);
|
||||||
}
|
}
|
||||||
|
@ -162,6 +164,8 @@ _e_xdg_shell_cb_positioner_create(struct wl_client *client, struct wl_resource *
|
||||||
res = wl_resource_create(client, &zxdg_positioner_v6_interface, 1, id);
|
res = wl_resource_create(client, &zxdg_positioner_v6_interface, 1, id);
|
||||||
p = E_NEW(Positioner, 1);
|
p = E_NEW(Positioner, 1);
|
||||||
p->v = v;
|
p->v = v;
|
||||||
|
p->res = res;
|
||||||
|
v->positioners = eina_list_append(v->positioners, p);
|
||||||
wl_resource_set_implementation(res, &_e_xdg_positioner_interface, p, _e_xdg_shell_positioner_destroy);
|
wl_resource_set_implementation(res, &_e_xdg_positioner_interface, p, _e_xdg_shell_positioner_destroy);
|
||||||
wl_resource_set_user_data(res, p);
|
wl_resource_set_user_data(res, p);
|
||||||
}
|
}
|
||||||
|
@ -1291,10 +1295,16 @@ _e_xdg_shell_cb_surface_get(struct wl_client *client, struct wl_resource *resour
|
||||||
static void
|
static void
|
||||||
_e_xdg_shell_cb_pong(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, uint32_t serial EINA_UNUSED)
|
_e_xdg_shell_cb_pong(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, uint32_t serial EINA_UNUSED)
|
||||||
{
|
{
|
||||||
E_Client *ec;
|
v6_Shell_Data *v;
|
||||||
|
Eina_List *l;
|
||||||
|
struct wl_resource *res;
|
||||||
|
|
||||||
if ((ec = wl_resource_get_user_data(resource)))
|
v = wl_resource_get_user_data(resource);
|
||||||
|
EINA_LIST_FOREACH(v->surfaces, l, res)
|
||||||
{
|
{
|
||||||
|
E_Client *ec = wl_resource_get_user_data(res);
|
||||||
|
|
||||||
|
if (!ec) continue;
|
||||||
ec->ping_ok = EINA_TRUE;
|
ec->ping_ok = EINA_TRUE;
|
||||||
ec->hung = EINA_FALSE;
|
ec->hung = EINA_FALSE;
|
||||||
}
|
}
|
||||||
|
@ -1312,12 +1322,31 @@ static void
|
||||||
_e_xdg_shell_cb_unbind(struct wl_resource *resource)
|
_e_xdg_shell_cb_unbind(struct wl_resource *resource)
|
||||||
{
|
{
|
||||||
v6_Shell_Data *v;
|
v6_Shell_Data *v;
|
||||||
|
Positioner *p;
|
||||||
|
struct wl_resource *res;
|
||||||
|
Eina_List *l, *ll;
|
||||||
struct wl_client *client = wl_resource_get_client(resource);
|
struct wl_client *client = wl_resource_get_client(resource);
|
||||||
|
|
||||||
v = wl_resource_get_user_data(resource);
|
v = wl_resource_get_user_data(resource);
|
||||||
eina_hash_set(shell_resources, &client, NULL);
|
eina_hash_set(shell_resources, &client, NULL);
|
||||||
E_FREE_LIST(v->surfaces, e_shell_surface_cb_destroy);
|
EINA_LIST_REVERSE_FOREACH_SAFE(v->surfaces, l, ll, res)
|
||||||
v->positioners = eina_list_free(v->positioners);
|
{
|
||||||
|
E_Client *ec = wl_resource_get_user_data(res);
|
||||||
|
E_Shell_Data *shd;
|
||||||
|
|
||||||
|
if (ec->comp_data->shell.surface)
|
||||||
|
e_shell_surface_cb_destroy(ec->comp_data->shell.surface);
|
||||||
|
shd = ec->comp_data->shell.data;
|
||||||
|
if (shd)
|
||||||
|
e_shell_surface_cb_destroy(shd->surface);
|
||||||
|
v->surfaces = eina_list_remove_list(v->surfaces, l);
|
||||||
|
}
|
||||||
|
|
||||||
|
EINA_LIST_FREE(v->positioners, p)
|
||||||
|
{
|
||||||
|
wl_resource_set_user_data(p->res, NULL);
|
||||||
|
free(p);
|
||||||
|
}
|
||||||
free(v);
|
free(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue