forked from enlightenment/enlightenment
Fix crash when trying to move wayland client applications.
Add callbacks for e_desktop_shell interface functions (cannot be NULL anymore). When we bind the wl_shell, we will create the e_desktop_shell. NB: The e_desktop_shell was not being created or bound to the display globals. Signed-off-by: Chris Michael <cp.michael@samsung.com>
This commit is contained in:
parent
3883a82fe9
commit
37e2134cf7
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
/* shell function prototypes */
|
/* shell function prototypes */
|
||||||
static void _e_wl_shell_cb_destroy(struct wl_listener *listener, void *data EINA_UNUSED);
|
static void _e_wl_shell_cb_destroy(struct wl_listener *listener, void *data EINA_UNUSED);
|
||||||
static void _e_wl_shell_cb_bind(struct wl_client *client, void *data, unsigned int version, unsigned int id);
|
static void _e_wl_shell_cb_bind(struct wl_client *client, void *data, unsigned int version EINA_UNUSED, unsigned int id);
|
||||||
static void _e_wl_shell_cb_bind_desktop(struct wl_client *client, void *data, unsigned int version, unsigned int id);
|
static void _e_wl_shell_cb_bind_desktop(struct wl_client *client, void *data, unsigned int version EINA_UNUSED, unsigned int id);
|
||||||
static void _e_wl_shell_cb_ping(E_Wayland_Surface *ews, unsigned int serial);
|
static void _e_wl_shell_cb_ping(E_Wayland_Surface *ews, unsigned int serial);
|
||||||
static void _e_wl_shell_cb_pointer_focus(struct wl_listener *listener EINA_UNUSED, void *data);
|
static void _e_wl_shell_cb_pointer_focus(struct wl_listener *listener EINA_UNUSED, void *data);
|
||||||
|
|
||||||
|
@ -22,7 +22,12 @@ static void _e_wl_shell_cb_shell_surface_get(struct wl_client *client, struct wl
|
||||||
static void _e_wl_desktop_shell_cb_unbind(struct wl_resource *resource);
|
static void _e_wl_desktop_shell_cb_unbind(struct wl_resource *resource);
|
||||||
|
|
||||||
/* desktop shell interface prototypes */
|
/* desktop shell interface prototypes */
|
||||||
|
static void _e_wl_desktop_shell_cb_background_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource EINA_UNUSED, struct wl_resource *output_resource EINA_UNUSED, struct wl_resource *surface_resource EINA_UNUSED);
|
||||||
|
static void _e_wl_desktop_shell_cb_panel_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource EINA_UNUSED, struct wl_resource *output_resource EINA_UNUSED, struct wl_resource *surface_resource EINA_UNUSED);
|
||||||
|
static void _e_wl_desktop_shell_cb_lock_surface_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource EINA_UNUSED, struct wl_resource *surface_resource EINA_UNUSED);
|
||||||
|
static void _e_wl_desktop_shell_cb_unlock(struct wl_client *client EINA_UNUSED, struct wl_resource *resource EINA_UNUSED);
|
||||||
static void _e_wl_desktop_shell_cb_shell_grab_surface_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, struct wl_resource *surface_resource);
|
static void _e_wl_desktop_shell_cb_shell_grab_surface_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, struct wl_resource *surface_resource);
|
||||||
|
static void _e_wl_desktop_shell_cb_ready(struct wl_client *client EINA_UNUSED, struct wl_resource *resource EINA_UNUSED);
|
||||||
|
|
||||||
/* shell surface function prototypes */
|
/* shell surface function prototypes */
|
||||||
static E_Wayland_Shell_Surface *_e_wl_shell_shell_surface_create(void *shell, E_Wayland_Surface *ews, const void *client EINA_UNUSED);
|
static E_Wayland_Shell_Surface *_e_wl_shell_shell_surface_create(void *shell, E_Wayland_Surface *ews, const void *client EINA_UNUSED);
|
||||||
|
@ -97,12 +102,12 @@ static const struct wl_shell_interface _e_shell_interface =
|
||||||
|
|
||||||
static const struct e_desktop_shell_interface _e_desktop_shell_interface =
|
static const struct e_desktop_shell_interface _e_desktop_shell_interface =
|
||||||
{
|
{
|
||||||
NULL, // desktop_background_set,
|
_e_wl_desktop_shell_cb_background_set,
|
||||||
NULL, // desktop_panel_set
|
_e_wl_desktop_shell_cb_panel_set,
|
||||||
NULL, // desktop_lock_surface_set
|
_e_wl_desktop_shell_cb_lock_surface_set,
|
||||||
NULL, // desktop_unlock
|
_e_wl_desktop_shell_cb_unlock,
|
||||||
_e_wl_desktop_shell_cb_shell_grab_surface_set,
|
_e_wl_desktop_shell_cb_shell_grab_surface_set,
|
||||||
NULL // desktop_ready
|
_e_wl_desktop_shell_cb_ready
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct wl_shell_surface_interface _e_shell_surface_interface =
|
static const struct wl_shell_surface_interface _e_shell_surface_interface =
|
||||||
|
@ -250,7 +255,7 @@ _e_wl_shell_cb_destroy(struct wl_listener *listener, void *data EINA_UNUSED)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_e_wl_shell_cb_bind(struct wl_client *client, void *data, unsigned int version, unsigned int id)
|
_e_wl_shell_cb_bind(struct wl_client *client, void *data, unsigned int version EINA_UNUSED, unsigned int id)
|
||||||
{
|
{
|
||||||
E_Wayland_Desktop_Shell *shell = NULL;
|
E_Wayland_Desktop_Shell *shell = NULL;
|
||||||
struct wl_resource *res = NULL;
|
struct wl_resource *res = NULL;
|
||||||
|
@ -261,11 +266,24 @@ _e_wl_shell_cb_bind(struct wl_client *client, void *data, unsigned int version,
|
||||||
/* try to add the shell to the client */
|
/* try to add the shell to the client */
|
||||||
res = wl_resource_create(client, &wl_shell_interface, 1, id);
|
res = wl_resource_create(client, &wl_shell_interface, 1, id);
|
||||||
if (res)
|
if (res)
|
||||||
wl_resource_set_implementation(res, &_e_shell_interface, shell, NULL);
|
{
|
||||||
|
struct wl_resource *dres = NULL;
|
||||||
|
|
||||||
|
wl_resource_set_implementation(res, &_e_shell_interface, shell, NULL);
|
||||||
|
|
||||||
|
dres = wl_resource_create(client, &e_desktop_shell_interface, -1, 0);
|
||||||
|
if (dres)
|
||||||
|
{
|
||||||
|
wl_resource_set_implementation(dres, &_e_desktop_shell_interface,
|
||||||
|
shell, _e_wl_desktop_shell_cb_unbind);
|
||||||
|
|
||||||
|
shell->wl.resource = dres;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_e_wl_shell_cb_bind_desktop(struct wl_client *client, void *data, unsigned int version, unsigned int id)
|
_e_wl_shell_cb_bind_desktop(struct wl_client *client, void *data, unsigned int version EINA_UNUSED, unsigned int id)
|
||||||
{
|
{
|
||||||
E_Wayland_Desktop_Shell *shell = NULL;
|
E_Wayland_Desktop_Shell *shell = NULL;
|
||||||
struct wl_resource *res = NULL;
|
struct wl_resource *res = NULL;
|
||||||
|
@ -274,8 +292,7 @@ _e_wl_shell_cb_bind_desktop(struct wl_client *client, void *data, unsigned int v
|
||||||
if (!(shell = data)) return;
|
if (!(shell = data)) return;
|
||||||
|
|
||||||
/* try to add the shell to the client */
|
/* try to add the shell to the client */
|
||||||
res = wl_resource_create(client, &e_desktop_shell_interface,
|
res = wl_resource_create(client, &e_desktop_shell_interface, 2, id);
|
||||||
MIN(version, 2), id);
|
|
||||||
if (res)
|
if (res)
|
||||||
{
|
{
|
||||||
wl_resource_set_implementation(res, &_e_desktop_shell_interface,
|
wl_resource_set_implementation(res, &_e_desktop_shell_interface,
|
||||||
|
@ -379,7 +396,7 @@ _e_wl_shell_grab_start(E_Wayland_Shell_Grab *grab, E_Wayland_Shell_Surface *ewss
|
||||||
/* safety check */
|
/* safety check */
|
||||||
if ((!grab) || (!ewss)) return;
|
if ((!grab) || (!ewss)) return;
|
||||||
|
|
||||||
shell = ewss->shell;
|
shell = (E_Wayland_Desktop_Shell *)ewss->shell;
|
||||||
|
|
||||||
/* end any popup grabs */
|
/* end any popup grabs */
|
||||||
_e_wl_shell_popup_grab_end(pointer);
|
_e_wl_shell_popup_grab_end(pointer);
|
||||||
|
@ -482,6 +499,30 @@ _e_wl_desktop_shell_cb_unbind(struct wl_resource *resource)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* desktop shell interface functions */
|
/* desktop shell interface functions */
|
||||||
|
static void
|
||||||
|
_e_wl_desktop_shell_cb_background_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource EINA_UNUSED, struct wl_resource *output_resource EINA_UNUSED, struct wl_resource *surface_resource EINA_UNUSED)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_wl_desktop_shell_cb_panel_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource EINA_UNUSED, struct wl_resource *output_resource EINA_UNUSED, struct wl_resource *surface_resource EINA_UNUSED)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_wl_desktop_shell_cb_lock_surface_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource EINA_UNUSED, struct wl_resource *surface_resource EINA_UNUSED)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_wl_desktop_shell_cb_unlock(struct wl_client *client EINA_UNUSED, struct wl_resource *resource EINA_UNUSED)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_e_wl_desktop_shell_cb_shell_grab_surface_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, struct wl_resource *surface_resource)
|
_e_wl_desktop_shell_cb_shell_grab_surface_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, struct wl_resource *surface_resource)
|
||||||
{
|
{
|
||||||
|
@ -494,6 +535,12 @@ _e_wl_desktop_shell_cb_shell_grab_surface_set(struct wl_client *client EINA_UNUS
|
||||||
shell->grab_surface = wl_resource_get_user_data(surface_resource);
|
shell->grab_surface = wl_resource_get_user_data(surface_resource);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_wl_desktop_shell_cb_ready(struct wl_client *client EINA_UNUSED, struct wl_resource *resource EINA_UNUSED)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* shell surface functions */
|
/* shell surface functions */
|
||||||
static E_Wayland_Shell_Surface *
|
static E_Wayland_Shell_Surface *
|
||||||
_e_wl_shell_shell_surface_create(void *shell, E_Wayland_Surface *ews, const void *client EINA_UNUSED)
|
_e_wl_shell_shell_surface_create(void *shell, E_Wayland_Surface *ews, const void *client EINA_UNUSED)
|
||||||
|
|
Loading…
Reference in New Issue