Merge branch 'devs/devilhorns/e_comp_wl'

This merges new wayland compositor code which fixes Several issues
including crashes on module dialog close, pixmap garbage on resize,
and various other issues.

This is a much more solid wayland compositor now, however it does
require updated wayland libraries (1.6) and xdg_shell 1.6 is supported
also.

@fix
This commit is contained in:
Chris Michael 2014-10-31 12:36:58 -04:00
commit 57fa2d1365
5 changed files with 1098 additions and 2618 deletions

File diff suppressed because it is too large Load Diff

View File

@ -13,10 +13,10 @@
# include <xkbcommon/xkbcommon.h>
# ifdef HAVE_WAYLAND_EGL
# include <EGL/egl.h>
# define GL_GLEXT_PROTOTYPES
# endif
/* # ifdef HAVE_WAYLAND_EGL */
/* # include <EGL/egl.h> */
/* # define GL_GLEXT_PROTOTYPES */
/* # endif */
# ifdef __linux__
# include <linux/input.h>
@ -188,7 +188,6 @@ struct _E_Comp_Wl_Data
struct
{
struct wl_resource *resource;
int32_t width, height;
uint32_t edges;
} resize;
@ -241,10 +240,9 @@ struct _E_Comp_Wl_Client_Data
struct
{
int32_t x, y, w, h;
E_Comp_Wl_Buffer *buffer;
struct wl_listener buffer_destroy;
struct wl_resource *buffer;
Eina_Bool new_attach : 1;
Eina_Tiler *damage;
Eina_List *damages;
Eina_Tiler *input;
Eina_Tiler *opaque;
} pending;
@ -271,9 +269,10 @@ EINTERN void e_comp_wl_shutdown(void);
EINTERN struct wl_resource *e_comp_wl_surface_create(struct wl_client *client, int version, uint32_t id);
EINTERN void e_comp_wl_surface_destroy(struct wl_resource *resource);
EINTERN Eina_Bool e_comp_wl_surface_commit(E_Client *ec);
EINTERN void e_comp_wl_buffer_reference(E_Comp_Wl_Buffer_Ref *ref, E_Comp_Wl_Buffer *buffer);
EAPI struct wl_signal e_comp_wl_surface_signal_get(E_Comp *comp);
EAPI struct wl_signal e_comp_wl_surface_create_signal_get(E_Comp *comp);
static inline uint64_t
e_comp_wl_id_get(uint32_t client, uint32_t surface)

View File

@ -393,7 +393,7 @@ _e_comp_wl_data_manager_cb_device_get(struct wl_client *client, struct wl_resour
E_Comp_Data *cdata;
struct wl_resource *res;
DBG("Data Manager Device Get");
/* DBG("Data Manager Device Get"); */
/* try to get the compositor data */
if (!(cdata = wl_resource_get_user_data(seat_resource))) return;
@ -661,10 +661,7 @@ _e_comp_wl_clipboard_selection_set(struct wl_listener *listener EINA_UNUSED, voi
cdata->selection.serial, p[0]);
if (!cdata->clipboard.source)
{
close(p[0]);
return;
}
close(p[0]);
}
static void

View File

@ -619,12 +619,12 @@ e_pixmap_image_clear(E_Pixmap *cp, Eina_Bool cache)
wl_callback_send_done(cb, (ecore_loop_time_get() * 1000));
wl_resource_destroy(cb);
}
}
/* post a buffer release */
/* TODO: FIXME: We need a way to determine if the client wants to
* keep the buffer or not. If so, then we should Not be setting NULL
* here as this will essentially release the buffer */
e_comp_wl_buffer_reference(&cd->buffer_ref, NULL);
if (cache)
{
if (cp->resource) wl_buffer_send_release(cp->resource);
cp->resource = NULL;
}
#endif
break;

View File

@ -224,10 +224,10 @@ _e_shell_surface_cb_resize(struct wl_client *client EINA_UNUSED, struct wl_resou
return;
}
DBG("Comp Resize Edges Set: %d", edges);
cdata->resize.resource = resource;
cdata->resize.edges = edges;
cdata->resize.width = ec->client.w;
cdata->resize.height = ec->client.h;
cdata->ptr.grab_x = cdata->ptr.x;
cdata->ptr.grab_y = cdata->ptr.y;
@ -480,7 +480,7 @@ _e_shell_surface_configure(struct wl_resource *resource, Evas_Coord x, Evas_Coor
ec->changes.pos = EINA_TRUE;
}
if ((ec->client.w != w) || (ec->client.h != h))
// if ((ec->client.w != w) || (ec->client.h != h))
{
ec->client.w = w;
ec->client.h = h;
@ -641,8 +641,8 @@ _e_xdg_shell_surface_configure_send(struct wl_resource *resource, uint32_t edges
uint32_t *s;
uint32_t serial;
DBG("XDG_SHELL: Surface Configure Send: %d \t%d %d",
wl_resource_get_id(resource), width, height);
DBG("XDG_SHELL: Surface Configure Send: %d \t%d %d\tEdges: %d",
wl_resource_get_id(resource), width, height, edges);
/* get the client for this resource */
if (!(ec = wl_resource_get_user_data(resource)))
@ -668,7 +668,6 @@ _e_xdg_shell_surface_configure_send(struct wl_resource *resource, uint32_t edges
if (edges != 0)
{
DBG("\tResizing");
s = wl_array_add(&states, sizeof(*s));
*s = XDG_SURFACE_STATE_RESIZING;
}
@ -828,7 +827,8 @@ _e_xdg_shell_surface_cb_resize(struct wl_client *client EINA_UNUSED, struct wl_r
E_Comp_Data *cdata;
E_Binding_Event_Mouse_Button ev;
/* DBG("XDG_SHELL: Surface Resize"); */
DBG("XDG_SHELL: Surface Resize: %d\tEdges: %d",
wl_resource_get_id(resource), edges);
/* get the client for this resource */
if (!(ec = wl_resource_get_user_data(resource)))
@ -855,8 +855,6 @@ _e_xdg_shell_surface_cb_resize(struct wl_client *client EINA_UNUSED, struct wl_r
cdata->resize.resource = resource;
cdata->resize.edges = edges;
cdata->resize.width = ec->client.w;
cdata->resize.height = ec->client.h;
cdata->ptr.grab_x = cdata->ptr.x;
cdata->ptr.grab_y = cdata->ptr.y;
@ -1032,8 +1030,8 @@ _e_xdg_shell_surface_configure(struct wl_resource *resource, Evas_Coord x, Evas_
{
E_Client *ec;
/* DBG("XDG_SHELL: Surface Configure: %d \t%d %d %d %d", */
/* wl_resource_get_id(resource), x, y, w, h); */
DBG("XDG_SHELL: Surface Configure: %d \t%d %d %d %d",
wl_resource_get_id(resource), x, y, w, h);
/* get the client for this resource */
if (!(ec = wl_resource_get_user_data(resource)))
@ -1044,6 +1042,8 @@ _e_xdg_shell_surface_configure(struct wl_resource *resource, Evas_Coord x, Evas_
return;
}
DBG("\tClient Size: %d %d", ec->client.w, ec->client.h);
if (ec->parent)
{
if ((ec->netwm.type == E_WINDOW_TYPE_MENU) ||
@ -1064,7 +1064,7 @@ _e_xdg_shell_surface_configure(struct wl_resource *resource, Evas_Coord x, Evas_
ec->changes.pos = EINA_TRUE;
}
if ((ec->client.w != w) || (ec->client.h != h))
// if ((ec->client.w != w) || (ec->client.h != h))
{
ec->client.w = w;
ec->client.h = h;
@ -1073,7 +1073,10 @@ _e_xdg_shell_surface_configure(struct wl_resource *resource, Evas_Coord x, Evas_
ec->changes.size = EINA_TRUE;
}
if (ec->changes.pos) EC_CHANGED(ec);
/* TODO: ack configure ?? */
if ((ec->changes.pos) || (ec->changes.size))
EC_CHANGED(ec);
}
static void