wl client pixmaps now use a different method for creating the pixmap id

This commit is contained in:
Mike Blumenkrantz 2015-04-21 15:19:20 -04:00
parent 6e222cede8
commit 96f07bff8a
6 changed files with 56 additions and 111 deletions

View File

@ -1156,12 +1156,10 @@ _e_comp_wl_surface_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl_re
static void
_e_comp_wl_surface_cb_attach(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, struct wl_resource *buffer_resource, int32_t sx, int32_t sy)
{
E_Pixmap *ep;
E_Client *ec;
E_Comp_Wl_Buffer *buffer = NULL;
if (!(ep = wl_resource_get_user_data(resource))) return;
if (!(ec = e_pixmap_client_get(ep))) return;
if (!(ec = wl_resource_get_user_data(resource))) return;
if (e_object_is_del(E_OBJECT(ec))) return;
if (buffer_resource)
@ -1184,12 +1182,10 @@ _e_comp_wl_surface_cb_attach(struct wl_client *client EINA_UNUSED, struct wl_res
static void
_e_comp_wl_surface_cb_damage(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, int32_t x, int32_t y, int32_t w, int32_t h)
{
E_Pixmap *ep;
E_Client *ec;
Eina_Rectangle *dmg = NULL;
if (!(ep = wl_resource_get_user_data(resource))) return;
if (!(ec = e_pixmap_client_get(ep))) return;
if (!(ec = wl_resource_get_user_data(resource))) return;
if (e_object_is_del(E_OBJECT(ec))) return;
if (!(dmg = eina_rectangle_new(x, y, w, h))) return;
@ -1213,12 +1209,10 @@ _e_comp_wl_frame_cb_destroy(struct wl_resource *resource)
static void
_e_comp_wl_surface_cb_frame(struct wl_client *client, struct wl_resource *resource, uint32_t callback)
{
E_Pixmap *ep;
E_Client *ec;
struct wl_resource *res;
if (!(ep = wl_resource_get_user_data(resource))) return;
if (!(ec = e_pixmap_client_get(ep))) return;
if (!(ec = wl_resource_get_user_data(resource))) return;
if (e_object_is_del(E_OBJECT(ec))) return;
/* create frame callback */
@ -1238,11 +1232,9 @@ _e_comp_wl_surface_cb_frame(struct wl_client *client, struct wl_resource *resour
static void
_e_comp_wl_surface_cb_opaque_region_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, struct wl_resource *region_resource)
{
E_Pixmap *ep;
E_Client *ec;
if (!(ep = wl_resource_get_user_data(resource))) return;
if (!(ec = e_pixmap_client_get(ep))) return;
if (!(ec = wl_resource_get_user_data(resource))) return;
if (e_object_is_del(E_OBJECT(ec))) return;
if (region_resource)
@ -1267,11 +1259,9 @@ _e_comp_wl_surface_cb_opaque_region_set(struct wl_client *client EINA_UNUSED, st
static void
_e_comp_wl_surface_cb_input_region_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, struct wl_resource *region_resource)
{
E_Pixmap *ep;
E_Client *ec;
if (!(ep = wl_resource_get_user_data(resource))) return;
if (!(ec = e_pixmap_client_get(ep))) return;
if (!(ec = wl_resource_get_user_data(resource))) return;
if (e_object_is_del(E_OBJECT(ec))) return;
if (region_resource)
@ -1293,12 +1283,10 @@ _e_comp_wl_surface_cb_input_region_set(struct wl_client *client EINA_UNUSED, str
static void
_e_comp_wl_surface_cb_commit(struct wl_client *client EINA_UNUSED, struct wl_resource *resource)
{
E_Pixmap *ep;
E_Client *ec, *subc;
Eina_List *l;
if (!(ep = wl_resource_get_user_data(resource))) return;
if (!(ec = e_pixmap_client_get(ep))) return;
if (!(ec = wl_resource_get_user_data(resource))) return;
if (e_object_is_del(E_OBJECT(ec))) return;
if (e_comp_wl_subsurface_commit(ec)) return;
@ -1338,22 +1326,22 @@ static const struct wl_surface_interface _e_surface_interface =
};
static void
_e_comp_wl_surface_destroy(struct wl_resource *resource)
_e_comp_wl_surface_render_stop(E_Client *ec)
{
E_Pixmap *ep;
E_Client *ec;
if (!(ep = wl_resource_get_user_data(resource))) return;
/* try to get the e_client from this pixmap */
if (!(ec = e_pixmap_client_get(ep)))
return;
/* FIXME: this should be fine after e_pixmap can create textures for wl clients */
/* FIXME: this may be fine after e_pixmap can create textures for wl clients? */
//if ((!ec->internal) && (!e_comp_gl_get()))
if (!ec->internal)
ec->dead = ec->hidden = 1;
evas_object_hide(ec->frame);
}
static void
_e_comp_wl_surface_destroy(struct wl_resource *resource)
{
E_Client *ec;
if (!(ec = wl_resource_get_user_data(resource))) return;
_e_comp_wl_surface_render_stop(ec);
e_object_del(E_OBJECT(ec));
}
@ -1361,9 +1349,7 @@ static void
_e_comp_wl_compositor_cb_surface_create(struct wl_client *client, struct wl_resource *resource, uint32_t id)
{
struct wl_resource *res;
E_Pixmap *ep;
E_Client *ec;
uint64_t win;
E_Client *ec = NULL;
pid_t pid;
DBG("Compositor Cb Surface Create: %d", id);
@ -1384,27 +1370,33 @@ _e_comp_wl_compositor_cb_surface_create(struct wl_client *client, struct wl_reso
_e_comp_wl_surface_destroy);
wl_client_get_credentials(client, &pid, NULL, NULL);
win = e_comp_wl_id_get(id, pid);
/* try to create new pixmap */
if (!(ep = e_pixmap_new(E_PIXMAP_TYPE_WL, win)))
if (pid == getpid()) //internal!
ec = e_pixmap_find_client(E_PIXMAP_TYPE_WL, (uintptr_t)id);
if (!ec)
{
ERR("Could not create new pixmap");
wl_resource_destroy(res);
wl_client_post_no_memory(client);
return;
}
DBG("\tUsing Pixmap: %p", ep);
E_Pixmap *ep;
if ((ec = e_client_new(ep, 0, 0)))
{
ec->new_client = 0;
e_comp->new_clients--;
ec->client.w = ec->client.h = 1;
ec->ignored = 1;
/* try to create new pixmap */
if (!(ep = e_pixmap_new(E_PIXMAP_TYPE_WL, resource)))
{
ERR("Could not create new pixmap");
wl_resource_destroy(res);
wl_client_post_no_memory(client);
return;
}
DBG("\tUsing Pixmap: %p", ep);
if ((ec = e_client_new(ep, 0, 0)))
{
ec->new_client = 0;
e_comp->new_clients--;
ec->client.w = ec->client.h = 1;
ec->ignored = 1;
}
}
/* set reference to pixmap so we can fetch it later */
wl_resource_set_user_data(res, ep);
wl_resource_set_user_data(res, ec);
/* emit surface create signal */
wl_signal_emit(&e_comp->wl_comp_data->signals.surface.create, res);
@ -1920,14 +1912,13 @@ _e_comp_wl_subcompositor_cb_destroy(struct wl_client *client EINA_UNUSED, struct
static void
_e_comp_wl_subcompositor_cb_subsurface_get(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, uint32_t id, struct wl_resource *surface_resource, struct wl_resource *parent_resource)
{
E_Pixmap *ep, *epp;
E_Client *ec, *epc = NULL;
static const char where[] = "get_subsurface: wl_subsurface@";
if (!(ep = wl_resource_get_user_data(surface_resource))) return;
if (!(epp = wl_resource_get_user_data(parent_resource))) return;
if (!(ec = wl_resource_get_user_data(surface_resource))) return;
if (!(epc = wl_resource_get_user_data(parent_resource))) return;
if (ep == epp)
if (ec == epc)
{
wl_resource_post_error(resource, WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE,
"%s%d: wl_surface@%d cannot be its own parent",
@ -1935,24 +1926,8 @@ _e_comp_wl_subcompositor_cb_subsurface_get(struct wl_client *client EINA_UNUSED,
return;
}
if (!(ec = e_pixmap_client_get(ep)))
{
if (!(ec = e_client_new(ep, 0, 0)))
{
wl_resource_post_no_memory(resource);
return;
}
if (ec->comp_data)
ec->comp_data->surface = surface_resource;
}
if (e_object_is_del(E_OBJECT(ec))) return;
if ((epc = e_pixmap_client_get(epp)))
{
if (e_object_is_del(E_OBJECT(epc))) return;
}
if (e_object_is_del(E_OBJECT(epc))) return;
/* check if this surface is already a sub-surface */
if ((ec->comp_data) && (ec->comp_data->sub.data))
@ -2085,7 +2060,8 @@ _e_comp_wl_client_cb_del(void *data EINA_UNUSED, E_Client *ec)
wl_resource_set_user_data(ec->comp_data->surface, NULL);
E_FREE(ec->comp_data);
if (ec->internal_elm_win)
_e_comp_wl_surface_render_stop(ec);
_e_comp_wl_focus_check();
}

View File

@ -292,11 +292,5 @@ EAPI struct wl_signal e_comp_wl_surface_create_signal_get(void);
EAPI double e_comp_wl_idle_time_get(void);
EAPI Eina_Bool e_comp_wl_output_init(const char *id, const char *make, const char *model, int x, int y, int w, int h, int pw, int ph, unsigned int refresh, unsigned int subpixel, unsigned int transform);
static inline uint64_t
e_comp_wl_id_get(uint32_t id, pid_t pid)
{
return ((uint64_t)id << 32) + pid;
}
# endif
#endif

View File

@ -31,9 +31,7 @@ static void
_e_comp_wl_input_pointer_cb_cursor_set(struct wl_client *client, struct wl_resource *resource EINA_UNUSED, uint32_t serial EINA_UNUSED, struct wl_resource *surface_resource, int32_t x, int32_t y)
{
E_Comp_Data *cdata;
pid_t pid;
E_Client *ec;
uint64_t sid;
Eina_Bool got_mouse = EINA_FALSE;
/* get compositor data */
@ -54,9 +52,7 @@ _e_comp_wl_input_pointer_cb_cursor_set(struct wl_client *client, struct wl_resou
e_pointer_object_set(e_comp->pointer, NULL, x, y);
return;
}
wl_client_get_credentials(client, &pid, NULL, NULL);
sid = e_comp_wl_id_get(wl_resource_get_id(surface_resource), pid);
ec = e_pixmap_find_client(E_PIXMAP_TYPE_WL, sid);
ec = wl_resource_get_user_data(surface_resource);
if (!ec->re_manage)
{
ec->re_manage = 1;

View File

@ -150,7 +150,7 @@ _e_pixmap_find(E_Pixmap_Type type, va_list *l)
Ecore_X_Window xwin;
#endif
#if defined(HAVE_WAYLAND_CLIENTS) || defined(HAVE_WAYLAND_ONLY)
uint64_t id;
uintptr_t id;
#endif
if (!pixmaps[type]) return NULL;
@ -164,7 +164,7 @@ _e_pixmap_find(E_Pixmap_Type type, va_list *l)
break;
case E_PIXMAP_TYPE_WL:
#if defined(HAVE_WAYLAND_CLIENTS) || defined(HAVE_WAYLAND_ONLY)
id = va_arg(*l, uint64_t);
id = va_arg(*l, uintptr_t);
return eina_hash_find(pixmaps[type], &id);
#endif
break;
@ -200,7 +200,7 @@ e_pixmap_new(E_Pixmap_Type type, ...)
Ecore_X_Window xwin;
#endif
#if defined(HAVE_WAYLAND_CLIENTS) || defined(HAVE_WAYLAND_ONLY)
uint64_t id;
uintptr_t id;
#endif
EINA_SAFETY_ON_TRUE_RETURN_VAL((type != E_PIXMAP_TYPE_WL) && (type != E_PIXMAP_TYPE_X), NULL);
@ -228,7 +228,7 @@ e_pixmap_new(E_Pixmap_Type type, ...)
break;
case E_PIXMAP_TYPE_WL:
#if defined(HAVE_WAYLAND_CLIENTS) || defined(HAVE_WAYLAND_ONLY)
id = va_arg(l, uint64_t);
id = va_arg(l, uintptr_t);
if (pixmaps[type])
{
cp = eina_hash_find(pixmaps[type], &id);

View File

@ -79,7 +79,7 @@ _e_elm_win_trap_show(void *data, Evas_Object *o)
type = E_PIXMAP_TYPE_WL;
ctx->pointer = e_comp->pointer;
elm_win_borderless_set(o, 1);
wl_win_id = e_comp_wl_id_get(win, getpid());
wl_win_id = win;
}
else
#endif

View File

@ -547,12 +547,11 @@ _e_shell_surface_unmap(struct wl_resource *resource)
static void
_e_shell_cb_shell_surface_get(struct wl_client *client, struct wl_resource *resource EINA_UNUSED, uint32_t id, struct wl_resource *surface_resource)
{
E_Pixmap *ep;
E_Client *ec;
E_Comp_Client_Data *cdata;
/* get the pixmap from this surface so we can find the client */
if (!(ep = wl_resource_get_user_data(surface_resource)))
if (!(ec = wl_resource_get_user_data(surface_resource)))
{
wl_resource_post_error(surface_resource,
WL_DISPLAY_ERROR_INVALID_OBJECT,
@ -560,12 +559,6 @@ _e_shell_cb_shell_surface_get(struct wl_client *client, struct wl_resource *reso
return;
}
/* make sure it's a wayland pixmap */
if (e_pixmap_type_get(ep) != E_PIXMAP_TYPE_WL) return;
/* find the client for this pixmap */
ec = e_pixmap_client_get(ep);
EC_CHANGED(ec);
ec->new_client = ec->netwm.ping = EINA_TRUE;
e_comp->new_clients++;
@ -1109,14 +1102,13 @@ _e_xdg_shell_surface_unmap(struct wl_resource *resource)
static void
_e_xdg_shell_cb_surface_get(struct wl_client *client, struct wl_resource *resource EINA_UNUSED, uint32_t id, struct wl_resource *surface_resource)
{
E_Pixmap *ep;
E_Client *ec;
E_Comp_Client_Data *cdata;
/* DBG("XDG_SHELL: Surface Get %d", wl_resource_get_id(surface_resource)); */
/* get the pixmap from this surface so we can find the client */
if (!(ep = wl_resource_get_user_data(surface_resource)))
if (!(ec = wl_resource_get_user_data(surface_resource)))
{
wl_resource_post_error(surface_resource,
WL_DISPLAY_ERROR_INVALID_OBJECT,
@ -1124,12 +1116,6 @@ _e_xdg_shell_cb_surface_get(struct wl_client *client, struct wl_resource *resour
return;
}
/* make sure it's a wayland pixmap */
if (e_pixmap_type_get(ep) != E_PIXMAP_TYPE_WL) return;
/* find the client for this pixmap */
ec = e_pixmap_client_get(ep);
EC_CHANGED(ec);
ec->new_client = ec->netwm.ping = EINA_TRUE;
e_comp->new_clients++;
@ -1198,7 +1184,6 @@ static const struct xdg_popup_interface _e_xdg_popup_interface =
static void
_e_xdg_shell_cb_popup_get(struct wl_client *client, struct wl_resource *resource EINA_UNUSED, uint32_t id, struct wl_resource *surface_resource, struct wl_resource *parent_resource, struct wl_resource *seat_resource EINA_UNUSED, uint32_t serial EINA_UNUSED, int32_t x, int32_t y, uint32_t flags EINA_UNUSED)
{
E_Pixmap *ep;
E_Client *ec;
E_Comp_Client_Data *cdata;
@ -1208,7 +1193,7 @@ _e_xdg_shell_cb_popup_get(struct wl_client *client, struct wl_resource *resource
/* DBG("\tLocation: %d %d", x, y); */
/* get the pixmap from this surface so we can find the client */
if (!(ep = wl_resource_get_user_data(surface_resource)))
if (!(ec = wl_resource_get_user_data(surface_resource)))
{
wl_resource_post_error(surface_resource,
WL_DISPLAY_ERROR_INVALID_OBJECT,
@ -1216,12 +1201,6 @@ _e_xdg_shell_cb_popup_get(struct wl_client *client, struct wl_resource *resource
return;
}
/* make sure it's a wayland pixmap */
if (e_pixmap_type_get(ep) != E_PIXMAP_TYPE_WL) return;
/* find the client for this pixmap */
ec = e_pixmap_client_get(ep);
/* get the client data */
if (!(cdata = ec->comp_data))
{