mirror of
https://github.com/brl/mutter.git
synced 2025-04-24 10:49:38 +00:00
wayland: Add 'MetaWaylandPopupSurface' bridge between popup and surface
Add a bridge between the MetaWaylandPopup object and the corresponding popup surface role. This bridge replaces communicating dismissed and unmapped popup events. https://bugzilla.gnome.org/show_bug.cgi?id=763431
This commit is contained in:
parent
d9b98bced9
commit
229a143eac
@ -890,7 +890,7 @@ meta_wayland_pointer_end_popup_grab (MetaWaylandPointer *pointer)
|
|||||||
|
|
||||||
MetaWaylandPopup *
|
MetaWaylandPopup *
|
||||||
meta_wayland_pointer_start_popup_grab (MetaWaylandPointer *pointer,
|
meta_wayland_pointer_start_popup_grab (MetaWaylandPointer *pointer,
|
||||||
MetaWaylandSurface *surface)
|
MetaWaylandPopupSurface *popup_surface)
|
||||||
{
|
{
|
||||||
MetaWaylandPopupGrab *grab;
|
MetaWaylandPopupGrab *grab;
|
||||||
|
|
||||||
@ -899,11 +899,11 @@ meta_wayland_pointer_start_popup_grab (MetaWaylandPointer *pointer,
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (pointer->grab == &pointer->default_grab)
|
if (pointer->grab == &pointer->default_grab)
|
||||||
grab = meta_wayland_popup_grab_create (pointer, surface);
|
grab = meta_wayland_popup_grab_create (pointer, popup_surface);
|
||||||
else
|
else
|
||||||
grab = (MetaWaylandPopupGrab*)pointer->grab;
|
grab = (MetaWaylandPopupGrab*)pointer->grab;
|
||||||
|
|
||||||
return meta_wayland_popup_create (surface, grab);
|
return meta_wayland_popup_create (popup_surface, grab);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -118,7 +118,7 @@ void meta_wayland_pointer_start_grab (MetaWaylandPointer *pointer,
|
|||||||
void meta_wayland_pointer_end_grab (MetaWaylandPointer *pointer);
|
void meta_wayland_pointer_end_grab (MetaWaylandPointer *pointer);
|
||||||
|
|
||||||
MetaWaylandPopup *meta_wayland_pointer_start_popup_grab (MetaWaylandPointer *pointer,
|
MetaWaylandPopup *meta_wayland_pointer_start_popup_grab (MetaWaylandPointer *pointer,
|
||||||
MetaWaylandSurface *popup);
|
MetaWaylandPopupSurface *popup_surface);
|
||||||
|
|
||||||
void meta_wayland_pointer_end_popup_grab (MetaWaylandPointer *pointer);
|
void meta_wayland_pointer_end_popup_grab (MetaWaylandPointer *pointer);
|
||||||
|
|
||||||
|
@ -48,6 +48,9 @@
|
|||||||
#include "meta-wayland-private.h"
|
#include "meta-wayland-private.h"
|
||||||
#include "meta-wayland-surface.h"
|
#include "meta-wayland-surface.h"
|
||||||
|
|
||||||
|
G_DEFINE_INTERFACE (MetaWaylandPopupSurface, meta_wayland_popup_surface,
|
||||||
|
G_TYPE_OBJECT);
|
||||||
|
|
||||||
struct _MetaWaylandPopupGrab
|
struct _MetaWaylandPopupGrab
|
||||||
{
|
{
|
||||||
MetaWaylandPointerGrab generic;
|
MetaWaylandPointerGrab generic;
|
||||||
@ -59,10 +62,8 @@ struct _MetaWaylandPopupGrab
|
|||||||
struct _MetaWaylandPopup
|
struct _MetaWaylandPopup
|
||||||
{
|
{
|
||||||
MetaWaylandPopupGrab *grab;
|
MetaWaylandPopupGrab *grab;
|
||||||
MetaWaylandSurface *surface;
|
|
||||||
struct wl_listener surface_destroy_listener;
|
struct wl_listener surface_destroy_listener;
|
||||||
struct wl_signal destroy_signal;
|
MetaWaylandPopupSurface *popup_surface;
|
||||||
|
|
||||||
struct wl_list link;
|
struct wl_list link;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -73,6 +74,29 @@ meta_wayland_popup_grab_begin (MetaWaylandPopupGrab *grab,
|
|||||||
static void
|
static void
|
||||||
meta_wayland_popup_grab_end (MetaWaylandPopupGrab *grab);
|
meta_wayland_popup_grab_end (MetaWaylandPopupGrab *grab);
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_wayland_popup_surface_default_init (MetaWaylandPopupSurfaceInterface *iface)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_wayland_popup_surface_done (MetaWaylandPopupSurface *popup_surface)
|
||||||
|
{
|
||||||
|
META_WAYLAND_POPUP_SURFACE_GET_IFACE (popup_surface)->done (popup_surface);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_wayland_popup_surface_dismiss (MetaWaylandPopupSurface *popup_surface)
|
||||||
|
{
|
||||||
|
META_WAYLAND_POPUP_SURFACE_GET_IFACE (popup_surface)->dismiss (popup_surface);
|
||||||
|
}
|
||||||
|
|
||||||
|
static MetaWaylandSurface *
|
||||||
|
meta_wayland_popup_surface_get_surface (MetaWaylandPopupSurface *popup_surface)
|
||||||
|
{
|
||||||
|
return META_WAYLAND_POPUP_SURFACE_GET_IFACE (popup_surface)->get_surface (popup_surface);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
popup_grab_focus (MetaWaylandPointerGrab *grab,
|
popup_grab_focus (MetaWaylandPointerGrab *grab,
|
||||||
MetaWaylandSurface *surface)
|
MetaWaylandSurface *surface)
|
||||||
@ -116,8 +140,10 @@ static MetaWaylandPointerGrabInterface popup_grab_interface = {
|
|||||||
|
|
||||||
MetaWaylandPopupGrab *
|
MetaWaylandPopupGrab *
|
||||||
meta_wayland_popup_grab_create (MetaWaylandPointer *pointer,
|
meta_wayland_popup_grab_create (MetaWaylandPointer *pointer,
|
||||||
MetaWaylandSurface *surface)
|
MetaWaylandPopupSurface *popup_surface)
|
||||||
{
|
{
|
||||||
|
MetaWaylandSurface *surface =
|
||||||
|
meta_wayland_popup_surface_get_surface (popup_surface);
|
||||||
struct wl_client *client = wl_resource_get_client (surface->resource);
|
struct wl_client *client = wl_resource_get_client (surface->resource);
|
||||||
MetaWaylandPopupGrab *grab;
|
MetaWaylandPopupGrab *grab;
|
||||||
|
|
||||||
@ -170,7 +196,7 @@ meta_wayland_popup_grab_end (MetaWaylandPopupGrab *grab)
|
|||||||
|
|
||||||
wl_list_for_each_safe (popup, tmp, &grab->all_popups, link)
|
wl_list_for_each_safe (popup, tmp, &grab->all_popups, link)
|
||||||
{
|
{
|
||||||
meta_wayland_surface_popup_done (popup->surface);
|
meta_wayland_popup_surface_done (popup->popup_surface);
|
||||||
meta_wayland_popup_destroy (popup);
|
meta_wayland_popup_destroy (popup);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -191,7 +217,7 @@ meta_wayland_popup_grab_get_top_popup (MetaWaylandPopupGrab *grab)
|
|||||||
g_assert (!wl_list_empty (&grab->all_popups));
|
g_assert (!wl_list_empty (&grab->all_popups));
|
||||||
popup = wl_container_of (grab->all_popups.next, popup, link);
|
popup = wl_container_of (grab->all_popups.next, popup, link);
|
||||||
|
|
||||||
return popup->surface;
|
return meta_wayland_popup_surface_get_surface (popup->popup_surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
@ -203,7 +229,7 @@ meta_wayland_pointer_grab_is_popup_grab (MetaWaylandPointerGrab *grab)
|
|||||||
void
|
void
|
||||||
meta_wayland_popup_destroy (MetaWaylandPopup *popup)
|
meta_wayland_popup_destroy (MetaWaylandPopup *popup)
|
||||||
{
|
{
|
||||||
wl_signal_emit (&popup->destroy_signal, popup);
|
meta_wayland_popup_surface_dismiss (popup->popup_surface);
|
||||||
|
|
||||||
wl_list_remove (&popup->surface_destroy_listener.link);
|
wl_list_remove (&popup->surface_destroy_listener.link);
|
||||||
wl_list_remove (&popup->link);
|
wl_list_remove (&popup->link);
|
||||||
@ -227,12 +253,6 @@ meta_wayland_popup_get_top_popup (MetaWaylandPopup *popup)
|
|||||||
return meta_wayland_popup_grab_get_top_popup (popup->grab);
|
return meta_wayland_popup_grab_get_top_popup (popup->grab);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct wl_signal *
|
|
||||||
meta_wayland_popup_get_destroy_signal (MetaWaylandPopup *popup)
|
|
||||||
{
|
|
||||||
return &popup->destroy_signal;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_popup_surface_destroy (struct wl_listener *listener,
|
on_popup_surface_destroy (struct wl_listener *listener,
|
||||||
void *data)
|
void *data)
|
||||||
@ -244,9 +264,11 @@ on_popup_surface_destroy (struct wl_listener *listener,
|
|||||||
}
|
}
|
||||||
|
|
||||||
MetaWaylandPopup *
|
MetaWaylandPopup *
|
||||||
meta_wayland_popup_create (MetaWaylandSurface *surface,
|
meta_wayland_popup_create (MetaWaylandPopupSurface *popup_surface,
|
||||||
MetaWaylandPopupGrab *grab)
|
MetaWaylandPopupGrab *grab)
|
||||||
{
|
{
|
||||||
|
MetaWaylandSurface *surface =
|
||||||
|
meta_wayland_popup_surface_get_surface (popup_surface);
|
||||||
MetaWaylandPopup *popup;
|
MetaWaylandPopup *popup;
|
||||||
|
|
||||||
/* Don't allow creating popups if the grab has a different client. */
|
/* Don't allow creating popups if the grab has a different client. */
|
||||||
@ -255,10 +277,8 @@ meta_wayland_popup_create (MetaWaylandSurface *surface,
|
|||||||
|
|
||||||
popup = g_slice_new0 (MetaWaylandPopup);
|
popup = g_slice_new0 (MetaWaylandPopup);
|
||||||
popup->grab = grab;
|
popup->grab = grab;
|
||||||
popup->surface = surface;
|
popup->popup_surface = popup_surface;
|
||||||
popup->surface_destroy_listener.notify = on_popup_surface_destroy;
|
popup->surface_destroy_listener.notify = on_popup_surface_destroy;
|
||||||
wl_signal_init (&popup->destroy_signal);
|
|
||||||
|
|
||||||
if (surface->xdg_popup)
|
if (surface->xdg_popup)
|
||||||
{
|
{
|
||||||
wl_resource_add_destroy_listener (surface->xdg_popup,
|
wl_resource_add_destroy_listener (surface->xdg_popup,
|
||||||
|
@ -27,8 +27,22 @@
|
|||||||
#include "meta-wayland-types.h"
|
#include "meta-wayland-types.h"
|
||||||
#include "meta-wayland-pointer.h"
|
#include "meta-wayland-pointer.h"
|
||||||
|
|
||||||
|
#define META_TYPE_WAYLAND_POPUP_SURFACE (meta_wayland_popup_surface_get_type ())
|
||||||
|
G_DECLARE_INTERFACE (MetaWaylandPopupSurface, meta_wayland_popup_surface,
|
||||||
|
META, WAYLAND_POPUP_SURFACE,
|
||||||
|
GObject);
|
||||||
|
|
||||||
|
struct _MetaWaylandPopupSurfaceInterface
|
||||||
|
{
|
||||||
|
GTypeInterface parent_iface;
|
||||||
|
|
||||||
|
void (*done) (MetaWaylandPopupSurface *popup_surface);
|
||||||
|
void (*dismiss) (MetaWaylandPopupSurface *popup_surface);
|
||||||
|
MetaWaylandSurface *(*get_surface) (MetaWaylandPopupSurface *popup_surface);
|
||||||
|
};
|
||||||
|
|
||||||
MetaWaylandPopupGrab *meta_wayland_popup_grab_create (MetaWaylandPointer *pointer,
|
MetaWaylandPopupGrab *meta_wayland_popup_grab_create (MetaWaylandPointer *pointer,
|
||||||
MetaWaylandSurface *surface);
|
MetaWaylandPopupSurface *popup_surface);
|
||||||
|
|
||||||
void meta_wayland_popup_grab_destroy (MetaWaylandPopupGrab *grab);
|
void meta_wayland_popup_grab_destroy (MetaWaylandPopupGrab *grab);
|
||||||
|
|
||||||
@ -36,7 +50,7 @@ MetaWaylandSurface *meta_wayland_popup_grab_get_top_popup (MetaWaylandPopupGrab
|
|||||||
|
|
||||||
gboolean meta_wayland_pointer_grab_is_popup_grab (MetaWaylandPointerGrab *grab);
|
gboolean meta_wayland_pointer_grab_is_popup_grab (MetaWaylandPointerGrab *grab);
|
||||||
|
|
||||||
MetaWaylandPopup *meta_wayland_popup_create (MetaWaylandSurface *surface,
|
MetaWaylandPopup *meta_wayland_popup_create (MetaWaylandPopupSurface *surface,
|
||||||
MetaWaylandPopupGrab *grab);
|
MetaWaylandPopupGrab *grab);
|
||||||
|
|
||||||
void meta_wayland_popup_destroy (MetaWaylandPopup *popup);
|
void meta_wayland_popup_destroy (MetaWaylandPopup *popup);
|
||||||
@ -45,6 +59,4 @@ void meta_wayland_popup_dismiss (MetaWaylandPopup *popup);
|
|||||||
|
|
||||||
MetaWaylandSurface *meta_wayland_popup_get_top_popup (MetaWaylandPopup *popup);
|
MetaWaylandSurface *meta_wayland_popup_get_top_popup (MetaWaylandPopup *popup);
|
||||||
|
|
||||||
struct wl_signal *meta_wayland_popup_get_destroy_signal (MetaWaylandPopup *popup);
|
|
||||||
|
|
||||||
#endif /* META_WAYLAND_POPUP_H */
|
#endif /* META_WAYLAND_POPUP_H */
|
||||||
|
@ -149,9 +149,6 @@ meta_wayland_surface_role_shell_surface_ping (MetaWaylandSurfaceRoleShellSurface
|
|||||||
static void
|
static void
|
||||||
meta_wayland_surface_role_shell_surface_close (MetaWaylandSurfaceRoleShellSurface *shell_surface_role);
|
meta_wayland_surface_role_shell_surface_close (MetaWaylandSurfaceRoleShellSurface *shell_surface_role);
|
||||||
|
|
||||||
static void
|
|
||||||
meta_wayland_surface_role_shell_surface_popup_done (MetaWaylandSurfaceRoleShellSurface *shell_surface_role);
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_wayland_surface_role_shell_surface_managed (MetaWaylandSurfaceRoleShellSurface *shell_surface_role,
|
meta_wayland_surface_role_shell_surface_managed (MetaWaylandSurfaceRoleShellSurface *shell_surface_role,
|
||||||
MetaWindow *window);
|
MetaWindow *window);
|
||||||
@ -1690,15 +1687,6 @@ meta_wayland_surface_delete (MetaWaylandSurface *surface)
|
|||||||
meta_wayland_surface_role_shell_surface_close (shell_surface_role);
|
meta_wayland_surface_role_shell_surface_close (shell_surface_role);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
meta_wayland_surface_popup_done (MetaWaylandSurface *surface)
|
|
||||||
{
|
|
||||||
MetaWaylandSurfaceRoleShellSurface *shell_surface_role =
|
|
||||||
META_WAYLAND_SURFACE_ROLE_SHELL_SURFACE (surface->role);
|
|
||||||
|
|
||||||
meta_wayland_surface_role_shell_surface_popup_done (shell_surface_role);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_wayland_surface_window_managed (MetaWaylandSurface *surface,
|
meta_wayland_surface_window_managed (MetaWaylandSurface *surface,
|
||||||
MetaWindow *window)
|
MetaWindow *window)
|
||||||
@ -1927,15 +1915,6 @@ meta_wayland_surface_role_shell_surface_close (MetaWaylandSurfaceRoleShellSurfac
|
|||||||
shell_surface_role_class->close (shell_surface_role);
|
shell_surface_role_class->close (shell_surface_role);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
meta_wayland_surface_role_shell_surface_popup_done (MetaWaylandSurfaceRoleShellSurface *shell_surface_role)
|
|
||||||
{
|
|
||||||
MetaWaylandSurfaceRoleShellSurfaceClass *shell_surface_role_class =
|
|
||||||
META_WAYLAND_SURFACE_ROLE_SHELL_SURFACE_GET_CLASS (shell_surface_role);
|
|
||||||
|
|
||||||
shell_surface_role_class->popup_done (shell_surface_role);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_wayland_surface_role_shell_surface_managed (MetaWaylandSurfaceRoleShellSurface *shell_surface_role,
|
meta_wayland_surface_role_shell_surface_managed (MetaWaylandSurfaceRoleShellSurface *shell_surface_role,
|
||||||
MetaWindow *window)
|
MetaWindow *window)
|
||||||
|
@ -100,7 +100,6 @@ struct _MetaWaylandSurfaceRoleShellSurfaceClass
|
|||||||
void (*ping) (MetaWaylandSurfaceRoleShellSurface *shell_surface_role,
|
void (*ping) (MetaWaylandSurfaceRoleShellSurface *shell_surface_role,
|
||||||
uint32_t serial);
|
uint32_t serial);
|
||||||
void (*close) (MetaWaylandSurfaceRoleShellSurface *shell_surface_role);
|
void (*close) (MetaWaylandSurfaceRoleShellSurface *shell_surface_role);
|
||||||
void (*popup_done) (MetaWaylandSurfaceRoleShellSurface *shell_surface_role);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define META_TYPE_WAYLAND_SURFACE_ROLE_SUBSURFACE (meta_wayland_surface_role_subsurface_get_type ())
|
#define META_TYPE_WAYLAND_SURFACE_ROLE_SUBSURFACE (meta_wayland_surface_role_subsurface_get_type ())
|
||||||
@ -231,7 +230,6 @@ struct _MetaWaylandSurface
|
|||||||
struct wl_listener parent_destroy_listener;
|
struct wl_listener parent_destroy_listener;
|
||||||
|
|
||||||
MetaWaylandPopup *popup;
|
MetaWaylandPopup *popup;
|
||||||
struct wl_listener destroy_listener;
|
|
||||||
} popup;
|
} popup;
|
||||||
|
|
||||||
/* wl_shell_surface */
|
/* wl_shell_surface */
|
||||||
@ -305,8 +303,6 @@ void meta_wayland_surface_ping (MetaWaylandSurface *surface,
|
|||||||
guint32 serial);
|
guint32 serial);
|
||||||
void meta_wayland_surface_delete (MetaWaylandSurface *surface);
|
void meta_wayland_surface_delete (MetaWaylandSurface *surface);
|
||||||
|
|
||||||
void meta_wayland_surface_popup_done (MetaWaylandSurface *surface);
|
|
||||||
|
|
||||||
/* Drag dest functions */
|
/* Drag dest functions */
|
||||||
void meta_wayland_surface_drag_dest_focus_in (MetaWaylandSurface *surface,
|
void meta_wayland_surface_drag_dest_focus_in (MetaWaylandSurface *surface,
|
||||||
MetaWaylandDataOffer *offer);
|
MetaWaylandDataOffer *offer);
|
||||||
|
@ -28,6 +28,7 @@ typedef struct _MetaWaylandPointerGrab MetaWaylandPointerGrab;
|
|||||||
typedef struct _MetaWaylandPointerGrabInterface MetaWaylandPointerGrabInterface;
|
typedef struct _MetaWaylandPointerGrabInterface MetaWaylandPointerGrabInterface;
|
||||||
typedef struct _MetaWaylandPopupGrab MetaWaylandPopupGrab;
|
typedef struct _MetaWaylandPopupGrab MetaWaylandPopupGrab;
|
||||||
typedef struct _MetaWaylandPopup MetaWaylandPopup;
|
typedef struct _MetaWaylandPopup MetaWaylandPopup;
|
||||||
|
typedef struct _MetaWaylandPopupSurface MetaWaylandPopupSurface;
|
||||||
typedef struct _MetaWaylandKeyboard MetaWaylandKeyboard;
|
typedef struct _MetaWaylandKeyboard MetaWaylandKeyboard;
|
||||||
typedef struct _MetaWaylandKeyboardGrab MetaWaylandKeyboardGrab;
|
typedef struct _MetaWaylandKeyboardGrab MetaWaylandKeyboardGrab;
|
||||||
typedef struct _MetaWaylandKeyboardGrabInterface MetaWaylandKeyboardGrabInterface;
|
typedef struct _MetaWaylandKeyboardGrabInterface MetaWaylandKeyboardGrabInterface;
|
||||||
|
@ -39,9 +39,14 @@ struct _MetaWaylandWlShellSurface
|
|||||||
MetaWaylandSurfaceRoleShellSurface parent;
|
MetaWaylandSurfaceRoleShellSurface parent;
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_TYPE (MetaWaylandWlShellSurface,
|
static void
|
||||||
|
popup_surface_iface_init (MetaWaylandPopupSurfaceInterface *iface);
|
||||||
|
|
||||||
|
G_DEFINE_TYPE_WITH_CODE (MetaWaylandWlShellSurface,
|
||||||
meta_wayland_wl_shell_surface,
|
meta_wayland_wl_shell_surface,
|
||||||
META_TYPE_WAYLAND_SURFACE_ROLE_SHELL_SURFACE);
|
META_TYPE_WAYLAND_SURFACE_ROLE_SHELL_SURFACE,
|
||||||
|
G_IMPLEMENT_INTERFACE (META_TYPE_WAYLAND_POPUP_SURFACE,
|
||||||
|
popup_surface_iface_init));
|
||||||
|
|
||||||
static void
|
static void
|
||||||
sync_wl_shell_parent_relationship (MetaWaylandSurface *surface,
|
sync_wl_shell_parent_relationship (MetaWaylandSurface *surface,
|
||||||
@ -248,23 +253,17 @@ handle_wl_shell_popup_parent_destroyed (struct wl_listener *listener,
|
|||||||
surface->popup.parent = NULL;
|
surface->popup.parent = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
handle_wl_shell_popup_destroyed (struct wl_listener *listener,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
MetaWaylandSurface *surface =
|
|
||||||
wl_container_of (listener, surface, popup.destroy_listener);
|
|
||||||
|
|
||||||
surface->popup.popup = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
create_popup (MetaWaylandSurface *surface)
|
create_popup (MetaWaylandSurface *surface)
|
||||||
{
|
{
|
||||||
|
MetaWaylandWlShellSurface *wl_shell_surface =
|
||||||
|
META_WAYLAND_WL_SHELL_SURFACE (surface->role);
|
||||||
|
MetaWaylandPopupSurface *popup_surface =
|
||||||
|
META_WAYLAND_POPUP_SURFACE (wl_shell_surface);
|
||||||
MetaWaylandSeat *seat = surface->wl_shell.popup_seat;
|
MetaWaylandSeat *seat = surface->wl_shell.popup_seat;
|
||||||
MetaWaylandPopup *popup;
|
MetaWaylandPopup *popup;
|
||||||
|
|
||||||
popup = meta_wayland_pointer_start_popup_grab (&seat->pointer, surface);
|
popup = meta_wayland_pointer_start_popup_grab (&seat->pointer, popup_surface);
|
||||||
if (!popup)
|
if (!popup)
|
||||||
{
|
{
|
||||||
wl_shell_surface_send_popup_done (surface->wl_shell_surface);
|
wl_shell_surface_send_popup_done (surface->wl_shell_surface);
|
||||||
@ -272,9 +271,6 @@ create_popup (MetaWaylandSurface *surface)
|
|||||||
}
|
}
|
||||||
|
|
||||||
surface->popup.popup = popup;
|
surface->popup.popup = popup;
|
||||||
surface->popup.destroy_listener.notify = handle_wl_shell_popup_destroyed;
|
|
||||||
wl_signal_add (meta_wayland_popup_get_destroy_signal (popup),
|
|
||||||
&surface->popup.destroy_listener);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -583,16 +579,46 @@ wl_shell_surface_role_close (MetaWaylandSurfaceRoleShellSurface *shell_surface_r
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
wl_shell_surface_role_popup_done (MetaWaylandSurfaceRoleShellSurface *shell_surface_role)
|
meta_wayland_wl_shell_surface_popup_done (MetaWaylandPopupSurface *popup_surface)
|
||||||
{
|
{
|
||||||
MetaWaylandSurfaceRole *surface_role =
|
MetaWaylandSurfaceRole *surface_role =
|
||||||
META_WAYLAND_SURFACE_ROLE (shell_surface_role);
|
META_WAYLAND_SURFACE_ROLE (popup_surface);
|
||||||
MetaWaylandSurface *surface =
|
MetaWaylandSurface *surface =
|
||||||
meta_wayland_surface_role_get_surface (surface_role);
|
meta_wayland_surface_role_get_surface (surface_role);
|
||||||
|
|
||||||
wl_shell_surface_send_popup_done (surface->wl_shell_surface);
|
wl_shell_surface_send_popup_done (surface->wl_shell_surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_wayland_wl_shell_surface_popup_dismiss (MetaWaylandPopupSurface *popup_surface)
|
||||||
|
{
|
||||||
|
MetaWaylandSurfaceRole *surface_role =
|
||||||
|
META_WAYLAND_SURFACE_ROLE (popup_surface);
|
||||||
|
MetaWaylandSurface *surface =
|
||||||
|
meta_wayland_surface_role_get_surface (surface_role);
|
||||||
|
|
||||||
|
surface->popup.popup = NULL;
|
||||||
|
|
||||||
|
meta_wayland_surface_destroy_window (surface);
|
||||||
|
}
|
||||||
|
|
||||||
|
static MetaWaylandSurface *
|
||||||
|
meta_wayland_wl_shell_surface_popup_get_surface (MetaWaylandPopupSurface *popup_surface)
|
||||||
|
{
|
||||||
|
MetaWaylandSurfaceRole *surface_role =
|
||||||
|
META_WAYLAND_SURFACE_ROLE (popup_surface);
|
||||||
|
|
||||||
|
return meta_wayland_surface_role_get_surface (surface_role);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
popup_surface_iface_init (MetaWaylandPopupSurfaceInterface *iface)
|
||||||
|
{
|
||||||
|
iface->done = meta_wayland_wl_shell_surface_popup_done;
|
||||||
|
iface->dismiss = meta_wayland_wl_shell_surface_popup_dismiss;
|
||||||
|
iface->get_surface = meta_wayland_wl_shell_surface_popup_get_surface;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_wayland_wl_shell_surface_init (MetaWaylandWlShellSurface *wl_shell_surface)
|
meta_wayland_wl_shell_surface_init (MetaWaylandWlShellSurface *wl_shell_surface)
|
||||||
{
|
{
|
||||||
@ -614,7 +640,6 @@ meta_wayland_wl_shell_surface_class_init (MetaWaylandWlShellSurfaceClass *klass)
|
|||||||
shell_surface_role_class->managed = wl_shell_surface_role_managed;
|
shell_surface_role_class->managed = wl_shell_surface_role_managed;
|
||||||
shell_surface_role_class->ping = wl_shell_surface_role_ping;
|
shell_surface_role_class->ping = wl_shell_surface_role_ping;
|
||||||
shell_surface_role_class->close = wl_shell_surface_role_close;
|
shell_surface_role_class->close = wl_shell_surface_role_close;
|
||||||
shell_surface_role_class->popup_done = wl_shell_surface_role_popup_done;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -52,9 +52,14 @@ struct _MetaWaylandXdgPopup
|
|||||||
MetaWaylandSurfaceRoleShellSurface parent;
|
MetaWaylandSurfaceRoleShellSurface parent;
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_TYPE (MetaWaylandXdgPopup,
|
static void
|
||||||
|
popup_surface_iface_init (MetaWaylandPopupSurfaceInterface *iface);
|
||||||
|
|
||||||
|
G_DEFINE_TYPE_WITH_CODE (MetaWaylandXdgPopup,
|
||||||
meta_wayland_xdg_popup,
|
meta_wayland_xdg_popup,
|
||||||
META_TYPE_WAYLAND_SURFACE_ROLE_SHELL_SURFACE);
|
META_TYPE_WAYLAND_SURFACE_ROLE_SHELL_SURFACE,
|
||||||
|
G_IMPLEMENT_INTERFACE (META_TYPE_WAYLAND_POPUP_SURFACE,
|
||||||
|
popup_surface_iface_init));
|
||||||
|
|
||||||
static void
|
static void
|
||||||
xdg_shell_destroy (struct wl_client *client,
|
xdg_shell_destroy (struct wl_client *client,
|
||||||
@ -393,28 +398,6 @@ handle_popup_parent_destroyed (struct wl_listener *listener,
|
|||||||
meta_wayland_surface_destroy_window (surface);
|
meta_wayland_surface_destroy_window (surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
handle_popup_destroyed (struct wl_listener *listener,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
MetaWaylandPopup *popup = data;
|
|
||||||
MetaWaylandSurface *top_popup;
|
|
||||||
MetaWaylandSurface *surface =
|
|
||||||
wl_container_of (listener, surface, popup.destroy_listener);
|
|
||||||
|
|
||||||
top_popup = meta_wayland_popup_get_top_popup (popup);
|
|
||||||
if (surface != top_popup)
|
|
||||||
{
|
|
||||||
wl_resource_post_error (surface->xdg_shell_resource,
|
|
||||||
XDG_SHELL_ERROR_NOT_THE_TOPMOST_POPUP,
|
|
||||||
"destroyed popup not top most popup");
|
|
||||||
}
|
|
||||||
|
|
||||||
surface->popup.popup = NULL;
|
|
||||||
|
|
||||||
meta_wayland_surface_destroy_window (surface);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
xdg_shell_get_xdg_popup (struct wl_client *client,
|
xdg_shell_get_xdg_popup (struct wl_client *client,
|
||||||
struct wl_resource *resource,
|
struct wl_resource *resource,
|
||||||
@ -428,6 +411,7 @@ xdg_shell_get_xdg_popup (struct wl_client *client,
|
|||||||
{
|
{
|
||||||
struct wl_resource *popup_resource;
|
struct wl_resource *popup_resource;
|
||||||
MetaWaylandSurface *surface = wl_resource_get_user_data (surface_resource);
|
MetaWaylandSurface *surface = wl_resource_get_user_data (surface_resource);
|
||||||
|
MetaWaylandPopupSurface *popup_surface;
|
||||||
MetaWaylandSurface *parent_surf = wl_resource_get_user_data (parent_resource);
|
MetaWaylandSurface *parent_surf = wl_resource_get_user_data (parent_resource);
|
||||||
MetaWaylandSurface *top_popup;
|
MetaWaylandSurface *top_popup;
|
||||||
MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
|
MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
|
||||||
@ -499,7 +483,9 @@ xdg_shell_get_xdg_popup (struct wl_client *client,
|
|||||||
meta_wayland_surface_set_window (surface, window);
|
meta_wayland_surface_set_window (surface, window);
|
||||||
|
|
||||||
meta_window_focus (window, meta_display_get_current_time (display));
|
meta_window_focus (window, meta_display_get_current_time (display));
|
||||||
popup = meta_wayland_pointer_start_popup_grab (&seat->pointer, surface);
|
popup_surface = META_WAYLAND_POPUP_SURFACE (surface->role);
|
||||||
|
popup = meta_wayland_pointer_start_popup_grab (&seat->pointer,
|
||||||
|
popup_surface);
|
||||||
if (popup == NULL)
|
if (popup == NULL)
|
||||||
{
|
{
|
||||||
xdg_popup_send_popup_done (surface->xdg_popup);
|
xdg_popup_send_popup_done (surface->xdg_popup);
|
||||||
@ -507,10 +493,7 @@ xdg_shell_get_xdg_popup (struct wl_client *client,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
surface->popup.destroy_listener.notify = handle_popup_destroyed;
|
|
||||||
surface->popup.popup = popup;
|
surface->popup.popup = popup;
|
||||||
wl_signal_add (meta_wayland_popup_get_destroy_signal (popup),
|
|
||||||
&surface->popup.destroy_listener);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct xdg_shell_interface meta_wayland_xdg_shell_interface = {
|
static const struct xdg_shell_interface meta_wayland_xdg_shell_interface = {
|
||||||
@ -814,16 +797,55 @@ xdg_popup_role_ping (MetaWaylandSurfaceRoleShellSurface *shell_surface_role,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
xdg_popup_role_popup_done (MetaWaylandSurfaceRoleShellSurface *shell_surface_role)
|
meta_wayland_xdg_popup_done (MetaWaylandPopupSurface *popup_surface)
|
||||||
{
|
{
|
||||||
MetaWaylandSurfaceRole *surface_role =
|
MetaWaylandSurfaceRole *surface_role =
|
||||||
META_WAYLAND_SURFACE_ROLE (shell_surface_role);
|
META_WAYLAND_SURFACE_ROLE (popup_surface);
|
||||||
MetaWaylandSurface *surface =
|
MetaWaylandSurface *surface =
|
||||||
meta_wayland_surface_role_get_surface (surface_role);
|
meta_wayland_surface_role_get_surface (surface_role);
|
||||||
|
|
||||||
xdg_popup_send_popup_done (surface->xdg_popup);
|
xdg_popup_send_popup_done (surface->xdg_popup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_wayland_xdg_popup_dismiss (MetaWaylandPopupSurface *popup_surface)
|
||||||
|
{
|
||||||
|
MetaWaylandXdgPopup *xdg_popup = META_WAYLAND_XDG_POPUP (popup_surface);
|
||||||
|
MetaWaylandSurfaceRole *surface_role = META_WAYLAND_SURFACE_ROLE (xdg_popup);
|
||||||
|
MetaWaylandSurface *surface =
|
||||||
|
meta_wayland_surface_role_get_surface (surface_role);
|
||||||
|
MetaWaylandSurface *top_popup;
|
||||||
|
|
||||||
|
top_popup = meta_wayland_popup_get_top_popup (surface->popup.popup);
|
||||||
|
if (surface != top_popup)
|
||||||
|
{
|
||||||
|
wl_resource_post_error (surface->xdg_shell_resource,
|
||||||
|
XDG_SHELL_ERROR_NOT_THE_TOPMOST_POPUP,
|
||||||
|
"destroyed popup not top most popup");
|
||||||
|
}
|
||||||
|
|
||||||
|
surface->popup.popup = NULL;
|
||||||
|
|
||||||
|
meta_wayland_surface_destroy_window (surface);
|
||||||
|
}
|
||||||
|
|
||||||
|
static MetaWaylandSurface *
|
||||||
|
meta_wayland_xdg_popup_get_surface (MetaWaylandPopupSurface *popup_surface)
|
||||||
|
{
|
||||||
|
MetaWaylandSurfaceRole *surface_role =
|
||||||
|
META_WAYLAND_SURFACE_ROLE (popup_surface);
|
||||||
|
|
||||||
|
return meta_wayland_surface_role_get_surface (surface_role);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
popup_surface_iface_init (MetaWaylandPopupSurfaceInterface *iface)
|
||||||
|
{
|
||||||
|
iface->done = meta_wayland_xdg_popup_done;
|
||||||
|
iface->dismiss = meta_wayland_xdg_popup_dismiss;
|
||||||
|
iface->get_surface = meta_wayland_xdg_popup_get_surface;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_wayland_xdg_popup_init (MetaWaylandXdgPopup *role)
|
meta_wayland_xdg_popup_init (MetaWaylandXdgPopup *role)
|
||||||
{
|
{
|
||||||
@ -844,7 +866,6 @@ meta_wayland_xdg_popup_class_init (MetaWaylandXdgPopupClass *klass)
|
|||||||
shell_surface_role_class->configure = xdg_popup_role_configure;
|
shell_surface_role_class->configure = xdg_popup_role_configure;
|
||||||
shell_surface_role_class->managed = xdg_popup_role_managed;
|
shell_surface_role_class->managed = xdg_popup_role_managed;
|
||||||
shell_surface_role_class->ping = xdg_popup_role_ping;
|
shell_surface_role_class->ping = xdg_popup_role_ping;
|
||||||
shell_surface_role_class->popup_done = xdg_popup_role_popup_done;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
x
Reference in New Issue
Block a user