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 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_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_Client *ec;
E_Comp_Wl_Buffer *buffer = NULL; E_Comp_Wl_Buffer *buffer = NULL;
if (!(ep = wl_resource_get_user_data(resource))) return; if (!(ec = wl_resource_get_user_data(resource))) return;
if (!(ec = e_pixmap_client_get(ep))) return;
if (e_object_is_del(E_OBJECT(ec))) return; if (e_object_is_del(E_OBJECT(ec))) return;
if (buffer_resource) if (buffer_resource)
@ -1184,12 +1182,10 @@ _e_comp_wl_surface_cb_attach(struct wl_client *client EINA_UNUSED, struct wl_res
static void 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_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; E_Client *ec;
Eina_Rectangle *dmg = NULL; Eina_Rectangle *dmg = NULL;
if (!(ep = wl_resource_get_user_data(resource))) return; if (!(ec = wl_resource_get_user_data(resource))) return;
if (!(ec = e_pixmap_client_get(ep))) return;
if (e_object_is_del(E_OBJECT(ec))) return; if (e_object_is_del(E_OBJECT(ec))) return;
if (!(dmg = eina_rectangle_new(x, y, w, h))) 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 static void
_e_comp_wl_surface_cb_frame(struct wl_client *client, struct wl_resource *resource, uint32_t callback) _e_comp_wl_surface_cb_frame(struct wl_client *client, struct wl_resource *resource, uint32_t callback)
{ {
E_Pixmap *ep;
E_Client *ec; E_Client *ec;
struct wl_resource *res; struct wl_resource *res;
if (!(ep = wl_resource_get_user_data(resource))) return; if (!(ec = wl_resource_get_user_data(resource))) return;
if (!(ec = e_pixmap_client_get(ep))) return;
if (e_object_is_del(E_OBJECT(ec))) return; if (e_object_is_del(E_OBJECT(ec))) return;
/* create frame callback */ /* create frame callback */
@ -1238,11 +1232,9 @@ _e_comp_wl_surface_cb_frame(struct wl_client *client, struct wl_resource *resour
static void 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_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; E_Client *ec;
if (!(ep = wl_resource_get_user_data(resource))) return; if (!(ec = wl_resource_get_user_data(resource))) return;
if (!(ec = e_pixmap_client_get(ep))) return;
if (e_object_is_del(E_OBJECT(ec))) return; if (e_object_is_del(E_OBJECT(ec))) return;
if (region_resource) if (region_resource)
@ -1267,11 +1259,9 @@ _e_comp_wl_surface_cb_opaque_region_set(struct wl_client *client EINA_UNUSED, st
static void 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_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; E_Client *ec;
if (!(ep = wl_resource_get_user_data(resource))) return; if (!(ec = wl_resource_get_user_data(resource))) return;
if (!(ec = e_pixmap_client_get(ep))) return;
if (e_object_is_del(E_OBJECT(ec))) return; if (e_object_is_del(E_OBJECT(ec))) return;
if (region_resource) if (region_resource)
@ -1293,12 +1283,10 @@ _e_comp_wl_surface_cb_input_region_set(struct wl_client *client EINA_UNUSED, str
static void static void
_e_comp_wl_surface_cb_commit(struct wl_client *client EINA_UNUSED, struct wl_resource *resource) _e_comp_wl_surface_cb_commit(struct wl_client *client EINA_UNUSED, struct wl_resource *resource)
{ {
E_Pixmap *ep;
E_Client *ec, *subc; E_Client *ec, *subc;
Eina_List *l; Eina_List *l;
if (!(ep = wl_resource_get_user_data(resource))) return; if (!(ec = wl_resource_get_user_data(resource))) return;
if (!(ec = e_pixmap_client_get(ep))) return;
if (e_object_is_del(E_OBJECT(ec))) return; if (e_object_is_del(E_OBJECT(ec))) return;
if (e_comp_wl_subsurface_commit(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 static void
_e_comp_wl_surface_destroy(struct wl_resource *resource) _e_comp_wl_surface_render_stop(E_Client *ec)
{ {
E_Pixmap *ep; /* FIXME: this may be fine after e_pixmap can create textures for wl clients? */
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 */
//if ((!ec->internal) && (!e_comp_gl_get())) //if ((!ec->internal) && (!e_comp_gl_get()))
if (!ec->internal)
ec->dead = ec->hidden = 1; ec->dead = ec->hidden = 1;
evas_object_hide(ec->frame); 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)); 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) _e_comp_wl_compositor_cb_surface_create(struct wl_client *client, struct wl_resource *resource, uint32_t id)
{ {
struct wl_resource *res; struct wl_resource *res;
E_Pixmap *ep; E_Client *ec = NULL;
E_Client *ec;
uint64_t win;
pid_t pid; pid_t pid;
DBG("Compositor Cb Surface Create: %d", id); 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); _e_comp_wl_surface_destroy);
wl_client_get_credentials(client, &pid, NULL, NULL); wl_client_get_credentials(client, &pid, NULL, NULL);
win = e_comp_wl_id_get(id, pid); if (pid == getpid()) //internal!
/* try to create new pixmap */ ec = e_pixmap_find_client(E_PIXMAP_TYPE_WL, (uintptr_t)id);
if (!(ep = e_pixmap_new(E_PIXMAP_TYPE_WL, win))) if (!ec)
{ {
ERR("Could not create new pixmap"); E_Pixmap *ep;
wl_resource_destroy(res);
wl_client_post_no_memory(client);
return;
}
DBG("\tUsing Pixmap: %p", ep);
if ((ec = e_client_new(ep, 0, 0))) /* try to create new pixmap */
{ if (!(ep = e_pixmap_new(E_PIXMAP_TYPE_WL, resource)))
ec->new_client = 0; {
e_comp->new_clients--; ERR("Could not create new pixmap");
ec->client.w = ec->client.h = 1; wl_resource_destroy(res);
ec->ignored = 1; 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 */ /* 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 */ /* emit surface create signal */
wl_signal_emit(&e_comp->wl_comp_data->signals.surface.create, res); 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 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_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; E_Client *ec, *epc = NULL;
static const char where[] = "get_subsurface: wl_subsurface@"; static const char where[] = "get_subsurface: wl_subsurface@";
if (!(ep = wl_resource_get_user_data(surface_resource))) return; if (!(ec = wl_resource_get_user_data(surface_resource))) return;
if (!(epp = wl_resource_get_user_data(parent_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, wl_resource_post_error(resource, WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE,
"%s%d: wl_surface@%d cannot be its own parent", "%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; 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 (e_object_is_del(E_OBJECT(ec))) return;
if (e_object_is_del(E_OBJECT(epc))) return;
if ((epc = e_pixmap_client_get(epp)))
{
if (e_object_is_del(E_OBJECT(epc))) return;
}
/* check if this surface is already a sub-surface */ /* check if this surface is already a sub-surface */
if ((ec->comp_data) && (ec->comp_data->sub.data)) 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); wl_resource_set_user_data(ec->comp_data->surface, NULL);
E_FREE(ec->comp_data); E_FREE(ec->comp_data);
if (ec->internal_elm_win)
_e_comp_wl_surface_render_stop(ec);
_e_comp_wl_focus_check(); _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 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); 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
#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_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; E_Comp_Data *cdata;
pid_t pid;
E_Client *ec; E_Client *ec;
uint64_t sid;
Eina_Bool got_mouse = EINA_FALSE; Eina_Bool got_mouse = EINA_FALSE;
/* get compositor data */ /* 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); e_pointer_object_set(e_comp->pointer, NULL, x, y);
return; return;
} }
wl_client_get_credentials(client, &pid, NULL, NULL); ec = wl_resource_get_user_data(surface_resource);
sid = e_comp_wl_id_get(wl_resource_get_id(surface_resource), pid);
ec = e_pixmap_find_client(E_PIXMAP_TYPE_WL, sid);
if (!ec->re_manage) if (!ec->re_manage)
{ {
ec->re_manage = 1; ec->re_manage = 1;

View File

@ -150,7 +150,7 @@ _e_pixmap_find(E_Pixmap_Type type, va_list *l)
Ecore_X_Window xwin; Ecore_X_Window xwin;
#endif #endif
#if defined(HAVE_WAYLAND_CLIENTS) || defined(HAVE_WAYLAND_ONLY) #if defined(HAVE_WAYLAND_CLIENTS) || defined(HAVE_WAYLAND_ONLY)
uint64_t id; uintptr_t id;
#endif #endif
if (!pixmaps[type]) return NULL; if (!pixmaps[type]) return NULL;
@ -164,7 +164,7 @@ _e_pixmap_find(E_Pixmap_Type type, va_list *l)
break; break;
case E_PIXMAP_TYPE_WL: case E_PIXMAP_TYPE_WL:
#if defined(HAVE_WAYLAND_CLIENTS) || defined(HAVE_WAYLAND_ONLY) #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); return eina_hash_find(pixmaps[type], &id);
#endif #endif
break; break;
@ -200,7 +200,7 @@ e_pixmap_new(E_Pixmap_Type type, ...)
Ecore_X_Window xwin; Ecore_X_Window xwin;
#endif #endif
#if defined(HAVE_WAYLAND_CLIENTS) || defined(HAVE_WAYLAND_ONLY) #if defined(HAVE_WAYLAND_CLIENTS) || defined(HAVE_WAYLAND_ONLY)
uint64_t id; uintptr_t id;
#endif #endif
EINA_SAFETY_ON_TRUE_RETURN_VAL((type != E_PIXMAP_TYPE_WL) && (type != E_PIXMAP_TYPE_X), NULL); 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; break;
case E_PIXMAP_TYPE_WL: case E_PIXMAP_TYPE_WL:
#if defined(HAVE_WAYLAND_CLIENTS) || defined(HAVE_WAYLAND_ONLY) #if defined(HAVE_WAYLAND_CLIENTS) || defined(HAVE_WAYLAND_ONLY)
id = va_arg(l, uint64_t); id = va_arg(l, uintptr_t);
if (pixmaps[type]) if (pixmaps[type])
{ {
cp = eina_hash_find(pixmaps[type], &id); 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; type = E_PIXMAP_TYPE_WL;
ctx->pointer = e_comp->pointer; ctx->pointer = e_comp->pointer;
elm_win_borderless_set(o, 1); elm_win_borderless_set(o, 1);
wl_win_id = e_comp_wl_id_get(win, getpid()); wl_win_id = win;
} }
else else
#endif #endif

View File

@ -547,12 +547,11 @@ _e_shell_surface_unmap(struct wl_resource *resource)
static void 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_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_Client *ec;
E_Comp_Client_Data *cdata; E_Comp_Client_Data *cdata;
/* get the pixmap from this surface so we can find the client */ /* 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_resource_post_error(surface_resource,
WL_DISPLAY_ERROR_INVALID_OBJECT, WL_DISPLAY_ERROR_INVALID_OBJECT,
@ -560,12 +559,6 @@ _e_shell_cb_shell_surface_get(struct wl_client *client, struct wl_resource *reso
return; 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_CHANGED(ec);
ec->new_client = ec->netwm.ping = EINA_TRUE; ec->new_client = ec->netwm.ping = EINA_TRUE;
e_comp->new_clients++; e_comp->new_clients++;
@ -1109,14 +1102,13 @@ _e_xdg_shell_surface_unmap(struct wl_resource *resource)
static void 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_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_Client *ec;
E_Comp_Client_Data *cdata; E_Comp_Client_Data *cdata;
/* DBG("XDG_SHELL: Surface Get %d", wl_resource_get_id(surface_resource)); */ /* DBG("XDG_SHELL: Surface Get %d", wl_resource_get_id(surface_resource)); */
/* get the pixmap from this surface so we can find the client */ /* 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_resource_post_error(surface_resource,
WL_DISPLAY_ERROR_INVALID_OBJECT, WL_DISPLAY_ERROR_INVALID_OBJECT,
@ -1124,12 +1116,6 @@ _e_xdg_shell_cb_surface_get(struct wl_client *client, struct wl_resource *resour
return; 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_CHANGED(ec);
ec->new_client = ec->netwm.ping = EINA_TRUE; ec->new_client = ec->netwm.ping = EINA_TRUE;
e_comp->new_clients++; e_comp->new_clients++;
@ -1198,7 +1184,6 @@ static const struct xdg_popup_interface _e_xdg_popup_interface =
static void 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_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_Client *ec;
E_Comp_Client_Data *cdata; 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); */ /* DBG("\tLocation: %d %d", x, y); */
/* get the pixmap from this surface so we can find the client */ /* 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_resource_post_error(surface_resource,
WL_DISPLAY_ERROR_INVALID_OBJECT, WL_DISPLAY_ERROR_INVALID_OBJECT,
@ -1216,12 +1201,6 @@ _e_xdg_shell_cb_popup_get(struct wl_client *client, struct wl_resource *resource
return; 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 */ /* get the client data */
if (!(cdata = ec->comp_data)) if (!(cdata = ec->comp_data))
{ {