mirror of
https://github.com/brl/mutter.git
synced 2025-04-27 12:19:38 +00:00
wayland: generalize ShellSurface to SurfaceExtension
We want to implement new shells and new extension interfaces for wl_surface, so generalize the book-keeping structures. https://bugzilla.gnome.org/show_bug.cgi?id=707128
This commit is contained in:
parent
5d1fcc26c0
commit
0f0c23fbab
@ -106,7 +106,7 @@ typedef struct
|
|||||||
MetaWaylandSurface *surface;
|
MetaWaylandSurface *surface;
|
||||||
struct wl_resource *resource;
|
struct wl_resource *resource;
|
||||||
struct wl_listener surface_destroy_listener;
|
struct wl_listener surface_destroy_listener;
|
||||||
} MetaWaylandShellSurface;
|
} MetaWaylandSurfaceExtension;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -897,7 +897,7 @@ shell_surface_pong (struct wl_client *client,
|
|||||||
typedef struct _MetaWaylandGrab
|
typedef struct _MetaWaylandGrab
|
||||||
{
|
{
|
||||||
MetaWaylandPointerGrab grab;
|
MetaWaylandPointerGrab grab;
|
||||||
MetaWaylandShellSurface *shell_surface;
|
MetaWaylandSurfaceExtension *shell_surface;
|
||||||
struct wl_listener shell_surface_destroy_listener;
|
struct wl_listener shell_surface_destroy_listener;
|
||||||
MetaWaylandPointer *pointer;
|
MetaWaylandPointer *pointer;
|
||||||
} MetaWaylandGrab;
|
} MetaWaylandGrab;
|
||||||
@ -929,7 +929,7 @@ typedef enum _GrabCursor
|
|||||||
static void
|
static void
|
||||||
grab_pointer (MetaWaylandGrab *grab,
|
grab_pointer (MetaWaylandGrab *grab,
|
||||||
const MetaWaylandPointerGrabInterface *interface,
|
const MetaWaylandPointerGrabInterface *interface,
|
||||||
MetaWaylandShellSurface *shell_surface,
|
MetaWaylandSurfaceExtension *shell_surface,
|
||||||
MetaWaylandPointer *pointer,
|
MetaWaylandPointer *pointer,
|
||||||
GrabCursor cursor)
|
GrabCursor cursor)
|
||||||
{
|
{
|
||||||
@ -990,7 +990,7 @@ move_grab_motion (MetaWaylandPointerGrab *grab,
|
|||||||
{
|
{
|
||||||
MetaWaylandMoveGrab *move = (MetaWaylandMoveGrab *)grab;
|
MetaWaylandMoveGrab *move = (MetaWaylandMoveGrab *)grab;
|
||||||
MetaWaylandPointer *pointer = move->base.pointer;
|
MetaWaylandPointer *pointer = move->base.pointer;
|
||||||
MetaWaylandShellSurface *shell_surface = move->base.shell_surface;
|
MetaWaylandSurfaceExtension *shell_surface = move->base.shell_surface;
|
||||||
|
|
||||||
if (!shell_surface)
|
if (!shell_surface)
|
||||||
return;
|
return;
|
||||||
@ -1027,7 +1027,7 @@ static const MetaWaylandPointerGrabInterface move_grab_interface = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
start_surface_move (MetaWaylandShellSurface *shell_surface,
|
start_surface_move (MetaWaylandSurfaceExtension *shell_surface,
|
||||||
MetaWaylandSeat *seat)
|
MetaWaylandSeat *seat)
|
||||||
{
|
{
|
||||||
MetaWaylandMoveGrab *move;
|
MetaWaylandMoveGrab *move;
|
||||||
@ -1056,7 +1056,7 @@ shell_surface_move (struct wl_client *client,
|
|||||||
guint32 serial)
|
guint32 serial)
|
||||||
{
|
{
|
||||||
MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
|
MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
|
||||||
MetaWaylandShellSurface *shell_surface = wl_resource_get_user_data (resource);
|
MetaWaylandSurfaceExtension *shell_surface = wl_resource_get_user_data (resource);
|
||||||
|
|
||||||
if (seat->pointer.button_count == 0 ||
|
if (seat->pointer.button_count == 0 ||
|
||||||
seat->pointer.grab_serial != serial ||
|
seat->pointer.grab_serial != serial ||
|
||||||
@ -1109,7 +1109,7 @@ shell_surface_set_toplevel (struct wl_client *client,
|
|||||||
struct wl_resource *resource)
|
struct wl_resource *resource)
|
||||||
{
|
{
|
||||||
MetaWaylandCompositor *compositor = &_meta_wayland_compositor;
|
MetaWaylandCompositor *compositor = &_meta_wayland_compositor;
|
||||||
MetaWaylandShellSurface *shell_surface = wl_resource_get_user_data (resource);
|
MetaWaylandSurfaceExtension *shell_surface = wl_resource_get_user_data (resource);
|
||||||
MetaWaylandSurface *surface = shell_surface->surface;
|
MetaWaylandSurface *surface = shell_surface->surface;
|
||||||
|
|
||||||
/* NB: Surfaces from xwayland become managed based on X events. */
|
/* NB: Surfaces from xwayland become managed based on X events. */
|
||||||
@ -1130,7 +1130,7 @@ shell_surface_set_transient (struct wl_client *client,
|
|||||||
guint32 flags)
|
guint32 flags)
|
||||||
{
|
{
|
||||||
MetaWaylandCompositor *compositor = &_meta_wayland_compositor;
|
MetaWaylandCompositor *compositor = &_meta_wayland_compositor;
|
||||||
MetaWaylandShellSurface *shell_surface = wl_resource_get_user_data (resource);
|
MetaWaylandSurfaceExtension *shell_surface = wl_resource_get_user_data (resource);
|
||||||
MetaWaylandSurface *surface = shell_surface->surface;
|
MetaWaylandSurface *surface = shell_surface->surface;
|
||||||
|
|
||||||
/* NB: Surfaces from xwayland become managed based on X events. */
|
/* NB: Surfaces from xwayland become managed based on X events. */
|
||||||
@ -1148,7 +1148,7 @@ shell_surface_set_fullscreen (struct wl_client *client,
|
|||||||
struct wl_resource *output)
|
struct wl_resource *output)
|
||||||
{
|
{
|
||||||
MetaWaylandCompositor *compositor = &_meta_wayland_compositor;
|
MetaWaylandCompositor *compositor = &_meta_wayland_compositor;
|
||||||
MetaWaylandShellSurface *shell_surface = wl_resource_get_user_data (resource);
|
MetaWaylandSurfaceExtension *shell_surface = wl_resource_get_user_data (resource);
|
||||||
MetaWaylandSurface *surface = shell_surface->surface;
|
MetaWaylandSurface *surface = shell_surface->surface;
|
||||||
|
|
||||||
/* NB: Surfaces from xwayland become managed based on X events. */
|
/* NB: Surfaces from xwayland become managed based on X events. */
|
||||||
@ -1211,29 +1211,51 @@ static const struct wl_shell_surface_interface meta_wayland_shell_surface_interf
|
|||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
shell_handle_surface_destroy (struct wl_listener *listener,
|
extension_handle_surface_destroy (struct wl_listener *listener,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
MetaWaylandShellSurface *shell_surface =
|
MetaWaylandSurfaceExtension *extension =
|
||||||
wl_container_of (listener, shell_surface, surface_destroy_listener);
|
wl_container_of (listener, extension, surface_destroy_listener);
|
||||||
shell_surface->surface->has_shell_surface = FALSE;
|
|
||||||
shell_surface->surface = NULL;
|
extension->surface = NULL;
|
||||||
wl_resource_destroy (shell_surface->resource);
|
wl_resource_destroy (extension->resource);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
destroy_shell_surface (struct wl_resource *resource)
|
destroy_surface_extension (struct wl_resource *resource)
|
||||||
{
|
{
|
||||||
MetaWaylandShellSurface *shell_surface = wl_resource_get_user_data (resource);
|
MetaWaylandSurfaceExtension *extension = wl_resource_get_user_data (resource);
|
||||||
|
|
||||||
/* In case cleaning up a dead client destroys shell_surface first */
|
/* In case cleaning up a dead client destroys extension first */
|
||||||
if (shell_surface->surface)
|
if (extension->surface)
|
||||||
{
|
{
|
||||||
wl_list_remove (&shell_surface->surface_destroy_listener.link);
|
wl_list_remove (&extension->surface_destroy_listener.link);
|
||||||
shell_surface->surface->has_shell_surface = FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
g_free (shell_surface);
|
g_free (extension);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
create_surface_extension (struct wl_client *client,
|
||||||
|
struct wl_resource *master_resource,
|
||||||
|
guint32 id,
|
||||||
|
MetaWaylandSurface *surface,
|
||||||
|
const struct wl_interface *interface,
|
||||||
|
const void *implementation)
|
||||||
|
{
|
||||||
|
MetaWaylandSurfaceExtension *extension;
|
||||||
|
|
||||||
|
extension = g_new0 (MetaWaylandSurfaceExtension, 1);
|
||||||
|
|
||||||
|
extension->resource = wl_resource_create (client, interface,
|
||||||
|
wl_resource_get_version (master_resource), id);
|
||||||
|
wl_resource_set_implementation (extension->resource, implementation,
|
||||||
|
extension, destroy_surface_extension);
|
||||||
|
|
||||||
|
extension->surface = surface;
|
||||||
|
extension->surface_destroy_listener.notify = extension_handle_surface_destroy;
|
||||||
|
wl_resource_add_destroy_listener (surface->resource,
|
||||||
|
&extension->surface_destroy_listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1243,7 +1265,6 @@ get_shell_surface (struct wl_client *client,
|
|||||||
struct wl_resource *surface_resource)
|
struct wl_resource *surface_resource)
|
||||||
{
|
{
|
||||||
MetaWaylandSurface *surface = wl_resource_get_user_data (surface_resource);
|
MetaWaylandSurface *surface = wl_resource_get_user_data (surface_resource);
|
||||||
MetaWaylandShellSurface *shell_surface;
|
|
||||||
|
|
||||||
if (surface->has_shell_surface)
|
if (surface->has_shell_surface)
|
||||||
{
|
{
|
||||||
@ -1253,19 +1274,9 @@ get_shell_surface (struct wl_client *client,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
shell_surface = g_new0 (MetaWaylandShellSurface, 1);
|
create_surface_extension (client, resource, id, surface,
|
||||||
|
&wl_shell_surface_interface,
|
||||||
/* a shell surface inherits the version from the shell */
|
&meta_wayland_shell_surface_interface);
|
||||||
shell_surface->resource =
|
|
||||||
wl_resource_create (client, &wl_shell_surface_interface,
|
|
||||||
wl_resource_get_version (resource), id);
|
|
||||||
wl_resource_set_implementation (shell_surface->resource, &meta_wayland_shell_surface_interface,
|
|
||||||
shell_surface, destroy_shell_surface);
|
|
||||||
|
|
||||||
shell_surface->surface = surface;
|
|
||||||
shell_surface->surface_destroy_listener.notify = shell_handle_surface_destroy;
|
|
||||||
wl_resource_add_destroy_listener (surface->resource,
|
|
||||||
&shell_surface->surface_destroy_listener);
|
|
||||||
surface->has_shell_surface = TRUE;
|
surface->has_shell_surface = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user