devilhorns pushed a commit to branch master.
commit 237e5f6f51f3c14fb35d3dbeebe4dae927411a0d
Author: Chris Michael <[email protected]>
Date: Wed Jul 3 08:55:47 2013 +0100
Do not need desktop_shell_cb_bind anymore.
Assign the shell to the shell_surface on creation (for future
dereference)
Make grab/move/resize work again for wayland-clients
Signed-off-by: Chris Michael <[email protected]>
---
src/modules/wl_desktop_shell/e_mod_main.c | 79 +++++++++++++++----------------
1 file changed, 39 insertions(+), 40 deletions(-)
diff --git a/src/modules/wl_desktop_shell/e_mod_main.c
b/src/modules/wl_desktop_shell/e_mod_main.c
index 6fe8d33..353ae67 100644
--- a/src/modules/wl_desktop_shell/e_mod_main.c
+++ b/src/modules/wl_desktop_shell/e_mod_main.c
@@ -18,14 +18,13 @@ static void _e_wl_shell_grab_cb_surface_destroy(struct
wl_listener *listener, vo
static void _e_wl_shell_cb_shell_surface_get(struct wl_client *client, struct
wl_resource *resource, unsigned int id, struct wl_resource *surface_resource);
/* desktop shell function prototypes */
-static void _e_wl_desktop_shell_cb_bind(struct wl_client *client, void *data,
unsigned int version EINA_UNUSED, unsigned int id);
static void _e_wl_desktop_shell_cb_unbind(struct wl_resource *resource);
/* desktop shell interface prototypes */
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);
/* shell surface function prototypes */
-static E_Wayland_Shell_Surface *_e_wl_shell_shell_surface_create(void *shell
EINA_UNUSED, 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);
static void _e_wl_shell_shell_surface_create_toplevel(E_Wayland_Surface *ews);
static void _e_wl_shell_shell_surface_create_popup(E_Wayland_Surface *ews);
static void _e_wl_shell_shell_surface_destroy(struct wl_resource *resource);
@@ -190,8 +189,7 @@ e_modapi_init(E_Module *m)
/* try to add the desktop shell interface to the display's global list */
if (!wl_display_add_global(_e_wl_comp->wl.display,
- &e_desktop_shell_interface, shell,
- _e_wl_desktop_shell_cb_bind))
+ &e_desktop_shell_interface, shell, NULL))
goto err;
/* for each input, we need to create a pointer focus listener */
@@ -253,6 +251,7 @@ static void
_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;
+ struct wl_resource *res = NULL;
/* try to cast data to our shell */
if (!(shell = data)) return;
@@ -260,18 +259,39 @@ _e_wl_shell_cb_bind(struct wl_client *client, void *data,
unsigned int version E
/* try to add the shell to the client */
wl_client_add_object(client, &wl_shell_interface,
&_e_shell_interface, id, shell);
+
+ /* try to add the desktop shell to the client */
+ if (!(res = wl_client_new_object(client, &e_desktop_shell_interface,
+ &_e_desktop_shell_interface, shell)))
+ {
+ wl_resource_post_error(res, WL_DISPLAY_ERROR_INVALID_OBJECT,
+ "Permission Denied");
+ wl_resource_destroy(res);
+ return;
+ }
+
+ /* set desktop shell destroy callback */
+ wl_resource_set_destructor(res, _e_wl_desktop_shell_cb_unbind);
+
+ shell->wl.resource = res;
}
static void
_e_wl_shell_cb_ping(E_Wayland_Surface *ews, unsigned int serial)
{
E_Wayland_Shell_Surface *ewss = NULL;
+ E_Wayland_Desktop_Shell *shell = NULL;
if (!ews) return;
/* try to cast to our shell surface */
if (!(ewss = ews->shell_surface)) return;
+ shell = (E_Wayland_Desktop_Shell *)ewss->shell;
+
+ if ((ewss->surface) && (ewss->surface == shell->grab_surface))
+ return;
+
/* if we do not have a ping timer yet, create one */
if (!ewss->ping_timer)
{
@@ -351,6 +371,8 @@ _e_wl_shell_grab_start(E_Wayland_Shell_Grab *grab,
E_Wayland_Shell_Surface *ewss
/* safety check */
if ((!grab) || (!ewss)) return;
+ shell = ewss->shell;
+
/* end any popup grabs */
_e_wl_shell_popup_grab_end(pointer);
@@ -358,18 +380,16 @@ _e_wl_shell_grab_start(E_Wayland_Shell_Grab *grab,
E_Wayland_Shell_Surface *ewss
grab->grab.interface = interface;
grab->shell_surface = ewss;
grab->shell_surface_destroy.notify = _e_wl_shell_grab_cb_surface_destroy;
- grab->pointer = pointer;
- grab->grab.focus = ewss->surface->wl.surface;
/* add a listener in case this surface gets destroyed */
- wl_signal_add(&ewss->wl.destroy_signal,
- &grab->shell_surface_destroy);
+ wl_signal_add(&ewss->wl.destroy_signal, &grab->shell_surface_destroy);
+
+ grab->pointer = pointer;
+// grab->grab.focus = ewss->surface->wl.surface;
/* start the pointer grab */
wl_pointer_start_grab(pointer, &grab->grab);
- shell = (E_Wayland_Desktop_Shell *)_e_wl_comp->shell_interface.shell;
-
/* set cursor */
if (shell)
e_desktop_shell_send_grab_cursor(shell->wl.resource, cursor);
@@ -407,15 +427,18 @@ _e_wl_shell_grab_cb_surface_destroy(struct wl_listener
*listener, void *data EIN
/* shell interface functions */
static void
-_e_wl_shell_cb_shell_surface_get(struct wl_client *client, struct wl_resource
*resource EINA_UNUSED, unsigned int id, struct wl_resource *surface_resource)
+_e_wl_shell_cb_shell_surface_get(struct wl_client *client, struct wl_resource
*resource, unsigned int id, struct wl_resource *surface_resource)
{
E_Wayland_Surface *ews = NULL;
E_Wayland_Shell_Surface *ewss = NULL;
+ E_Wayland_Desktop_Shell *shell = NULL;
/* try to cast the surface resource to our structure */
if (!(ews = wl_resource_get_user_data(surface_resource)))
return;
+ shell = wl_resource_get_user_data(resource);
+
/* check if this surface already has a shell surface */
if ((ews->configure) &&
(ews->configure == _e_wl_shell_shell_surface_configure))
@@ -427,7 +450,7 @@ _e_wl_shell_cb_shell_surface_get(struct wl_client *client,
struct wl_resource *r
}
/* try to create a shell surface for this surface */
- if (!(ewss = _e_wl_shell_shell_surface_create(NULL, ews, NULL)))
+ if (!(ewss = _e_wl_shell_shell_surface_create(shell, ews, NULL)))
{
wl_resource_post_no_memory(surface_resource);
return;
@@ -442,31 +465,6 @@ _e_wl_shell_cb_shell_surface_get(struct wl_client *client,
struct wl_resource *r
/* desktop shell functions */
static void
-_e_wl_desktop_shell_cb_bind(struct wl_client *client, void *data, unsigned int
version EINA_UNUSED, unsigned int id)
-{
- E_Wayland_Desktop_Shell *shell = NULL;
- struct wl_resource *res = NULL;
-
- /* try to cast data to our shell */
- if (!(shell = data)) return;
-
- /* try to add the desktop shell to the client */
- if (!(res = wl_client_add_object(client, &e_desktop_shell_interface,
- &_e_desktop_shell_interface, id, shell)))
- {
- wl_resource_post_error(res, WL_DISPLAY_ERROR_INVALID_OBJECT,
- "Permission Denied");
- wl_resource_destroy(res);
- return;
- }
-
- shell->wl.resource = res;
-
- /* set desktop shell destroy callback */
- wl_resource_set_destructor(res, _e_wl_desktop_shell_cb_unbind);
-}
-
-static void
_e_wl_desktop_shell_cb_unbind(struct wl_resource *resource)
{
E_Wayland_Desktop_Shell *shell = NULL;
@@ -490,7 +488,7 @@ _e_wl_desktop_shell_cb_shell_grab_surface_set(struct
wl_client *client EINA_UNUS
/* shell surface functions */
static E_Wayland_Shell_Surface *
-_e_wl_shell_shell_surface_create(void *shell EINA_UNUSED, 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)
{
E_Wayland_Shell_Surface *ewss = NULL;
@@ -506,6 +504,7 @@ _e_wl_shell_shell_surface_create(void *shell EINA_UNUSED,
E_Wayland_Surface *ews
ews->unmap = _e_wl_shell_shell_surface_unmap;
/* set some properties on the shell surface */
+ ewss->shell = (E_Wayland_Desktop_Shell *)shell;
ewss->surface = ews;
ews->shell_surface = ewss;
@@ -726,8 +725,8 @@ _e_wl_shell_shell_surface_destroy(struct wl_resource
*resource)
if (ewss->popup.grab.pointer)
wl_pointer_end_grab(ewss->popup.grab.pointer);
- wl_list_remove(&ewss->wl.surface_destroy.link);
- ewss->surface->configure = NULL;
+// wl_list_remove(&ewss->wl.surface_destroy.link);
+// if (ewss->surface) ewss->surface->configure = NULL;
/* try to cast the ping timer */
if ((tmr = (E_Wayland_Ping_Timer *)ewss->ping_timer))
--
------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:
Build for Windows Store.
http://p.sf.net/sfu/windows-dev2dev