diff options
author | Jasper St. Pierre <jstpierre@mecheye.net> | 2014-02-15 10:26:43 -0500 |
---|---|---|
committer | Jasper St. Pierre <jstpierre@mecheye.net> | 2014-02-16 10:21:22 -0500 |
commit | f27f6aab78e2964953e224e744d6aa14e57e7831 (patch) | |
tree | 938f8e92f30aa0f7b294b4b3ca0f98390185d101 | |
parent | a66060e21aeb215feae57c79b4a75774482bd03e (diff) | |
download | mutter-f27f6aab78e2964953e224e744d6aa14e57e7831.tar.gz |
Update to new xdg-shell pinging standards
-rw-r--r-- | protocol/xdg-shell.xml | 56 | ||||
-rw-r--r-- | src/wayland/meta-wayland-surface.c | 87 |
2 files changed, 81 insertions, 62 deletions
diff --git a/protocol/xdg-shell.xml b/protocol/xdg-shell.xml index f0d04aa34..ef755b720 100644 --- a/protocol/xdg-shell.xml +++ b/protocol/xdg-shell.xml @@ -43,7 +43,7 @@ Use this enum to check the protocol version, and it will be updated automatically. </description> - <entry name="current" value="1" summary="Always the latest version"/> + <entry name="current" value="2" summary="Always the latest version"/> </enum> @@ -84,6 +84,28 @@ <arg name="y" type="int"/> <arg name="flags" type="uint"/> </request> + + <event name="ping"> + <description summary="check if the client is alive"> + The ping event asks the client if it's still alive. Pass the + serial specified in the event back to the compositor by sending + a "pong" request back with the specified serial. + + Compositors can use this to determine if the client is still + alive. It's unspecified what will happen if the client doesn't + respond to the ping request, or in what timeframe. Clients should + try to respond in a reasonable amount of time. + </description> + <arg name="serial" type="uint" summary="pass this to the callback"/> + </event> + + <request name="pong"> + <description summary="respond to a ping event"> + A client must respond to a ping event with a pong request or + the client may be deemed unresponsive. + </description> + <arg name="serial" type="uint" summary="serial of the ping event"/> + </request> </interface> <interface name="xdg_surface" version="1"> @@ -176,22 +198,6 @@ <arg name="app_id" type="string"/> </request> - <request name="pong"> - <description summary="respond to a ping event"> - A client must respond to a ping event with a pong request or - the client may be deemed unresponsive. - </description> - <arg name="serial" type="uint" summary="serial of the ping event"/> - </request> - - <event name="ping"> - <description summary="ping client"> - Ping a client to check if it is receiving events and sending - requests. A client is expected to reply with a pong request. - </description> - <arg name="serial" type="uint"/> - </event> - <request name="move"> <description summary="start an interactive move"> Start a pointer-driven move of the surface. @@ -447,22 +453,6 @@ </description> </request> - <request name="pong"> - <description summary="respond to a ping event"> - A client must respond to a ping event with a pong request or - the client may be deemed unresponsive. - </description> - <arg name="serial" type="uint" summary="serial of the ping event"/> - </request> - - <event name="ping"> - <description summary="ping client"> - Ping a client to check if it is receiving events and sending - requests. A client is expected to reply with a pong request. - </description> - <arg name="serial" type="uint"/> - </event> - <event name="popup_done"> <description summary="popup interaction is done"> The popup_done event is sent out when a popup grab is broken, diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c index 42f937c58..f19cc5cd3 100644 --- a/src/wayland/meta-wayland-surface.c +++ b/src/wayland/meta-wayland-surface.c @@ -718,6 +718,16 @@ xdg_shell_use_unstable_version (struct wl_client *client, } static void +xdg_shell_pong (struct wl_client *client, + struct wl_resource *resource, + uint32_t serial) +{ + MetaDisplay *display = meta_get_display (); + + meta_display_pong_for_serial (display, serial); +} + +static void xdg_surface_destructor (struct wl_resource *resource) { MetaWaylandSurfaceExtension *xdg_surface = wl_resource_get_user_data (resource); @@ -792,17 +802,6 @@ xdg_surface_set_app_id (struct wl_client *client, meta_window_set_wm_class (surface->window, app_id, app_id); } -static void -xdg_surface_pong (struct wl_client *client, - struct wl_resource *resource, - guint32 serial) -{ - MetaWaylandSurfaceExtension *xdg_surface = wl_resource_get_user_data (resource); - MetaWaylandSurface *surface = wl_container_of (xdg_surface, surface, xdg_surface); - - meta_display_pong_for_serial (surface->window->display, serial); -} - static gboolean begin_grab_op_on_surface (MetaWaylandSurface *surface, MetaWaylandSeat *seat, @@ -958,7 +957,6 @@ static const struct xdg_surface_interface meta_wayland_xdg_surface_interface = { xdg_surface_set_margin, xdg_surface_set_title, xdg_surface_set_app_id, - xdg_surface_pong, xdg_surface_move, xdg_surface_resize, xdg_surface_set_output, @@ -1009,20 +1007,8 @@ xdg_popup_destroy (struct wl_client *client, wl_resource_destroy (resource); } -static void -xdg_popup_pong (struct wl_client *client, - struct wl_resource *resource, - uint32_t serial) -{ - MetaWaylandSurfaceExtension *xdg_popup = wl_resource_get_user_data (resource); - MetaWaylandSurface *surface = wl_container_of (xdg_popup, surface, xdg_popup); - - meta_display_pong_for_serial (surface->window->display, serial); -} - static const struct xdg_popup_interface meta_wayland_xdg_popup_interface = { xdg_popup_destroy, - xdg_popup_pong, }; static void @@ -1076,8 +1062,37 @@ static const struct xdg_shell_interface meta_wayland_xdg_shell_interface = { xdg_shell_use_unstable_version, xdg_shell_get_xdg_surface, xdg_shell_get_xdg_popup, + xdg_shell_pong, }; +typedef struct { + struct wl_resource *resource; + struct wl_listener client_destroy_listener; +} XdgShell; + +static void +xdg_shell_handle_client_destroy (struct wl_listener *listener, void *data) +{ + XdgShell *xdg_shell = wl_container_of (listener, xdg_shell, client_destroy_listener); + g_slice_free (XdgShell, data); +} + +static struct wl_resource * +get_xdg_shell_for_client (struct wl_client *client) +{ + struct wl_listener *listener; + XdgShell *xdg_shell; + + listener = wl_client_get_destroy_listener (client, xdg_shell_handle_client_destroy); + + /* No xdg_shell has been bound for this client */ + if (listener == NULL) + return NULL; + + xdg_shell = wl_container_of (listener, xdg_shell, client_destroy_listener); + return xdg_shell->resource; +} + static void bind_xdg_shell (struct wl_client *client, void *data, @@ -1085,6 +1100,7 @@ bind_xdg_shell (struct wl_client *client, guint32 id) { struct wl_resource *resource; + XdgShell *xdg_shell; if (version != 1) { @@ -1092,8 +1108,15 @@ bind_xdg_shell (struct wl_client *client, return; } + xdg_shell = g_slice_new (XdgShell); + resource = wl_resource_create (client, &xdg_shell_interface, 1, id); wl_resource_set_implementation (resource, &meta_wayland_xdg_shell_interface, data, NULL); + xdg_shell->resource = wl_resource_create (client, &xdg_shell_interface, 1, id); + wl_resource_set_implementation (xdg_shell->resource, &meta_wayland_xdg_shell_interface, data, NULL); + + xdg_shell->client_destroy_listener.notify = xdg_shell_handle_client_destroy; + wl_client_add_destroy_listener (client, &xdg_shell->client_destroy_listener); } static void @@ -1514,12 +1537,18 @@ meta_wayland_surface_focused_unset (MetaWaylandSurface *surface) void meta_wayland_surface_ping (MetaWaylandSurface *surface, - guint32 timestamp) + guint32 serial) { - if (surface->xdg_surface.resource) - xdg_surface_send_ping (surface->xdg_surface.resource, timestamp); - else if (surface->xdg_popup.resource) - xdg_popup_send_ping (surface->xdg_popup.resource, timestamp); + struct wl_client *client = wl_resource_get_client (surface->resource); + struct wl_resource *xdg_shell = get_xdg_shell_for_client (client); + + if (xdg_shell == NULL) + { + g_warning ("Trying to ping a surface without an xdg_shell bound. How does this happen?"); + return; + } + + xdg_shell_send_ping (xdg_shell, serial); } void |