Update to new xdg-shell pinging standards
This commit is contained in:
parent
a66060e21a
commit
f27f6aab78
@ -43,7 +43,7 @@
|
|||||||
Use this enum to check the protocol version, and it will be updated
|
Use this enum to check the protocol version, and it will be updated
|
||||||
automatically.
|
automatically.
|
||||||
</description>
|
</description>
|
||||||
<entry name="current" value="1" summary="Always the latest version"/>
|
<entry name="current" value="2" summary="Always the latest version"/>
|
||||||
</enum>
|
</enum>
|
||||||
|
|
||||||
|
|
||||||
@ -84,6 +84,28 @@
|
|||||||
<arg name="y" type="int"/>
|
<arg name="y" type="int"/>
|
||||||
<arg name="flags" type="uint"/>
|
<arg name="flags" type="uint"/>
|
||||||
</request>
|
</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>
|
||||||
|
|
||||||
<interface name="xdg_surface" version="1">
|
<interface name="xdg_surface" version="1">
|
||||||
@ -176,22 +198,6 @@
|
|||||||
<arg name="app_id" type="string"/>
|
<arg name="app_id" type="string"/>
|
||||||
</request>
|
</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">
|
<request name="move">
|
||||||
<description summary="start an interactive move">
|
<description summary="start an interactive move">
|
||||||
Start a pointer-driven move of the surface.
|
Start a pointer-driven move of the surface.
|
||||||
@ -447,22 +453,6 @@
|
|||||||
</description>
|
</description>
|
||||||
</request>
|
</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">
|
<event name="popup_done">
|
||||||
<description summary="popup interaction is done">
|
<description summary="popup interaction is done">
|
||||||
The popup_done event is sent out when a popup grab is broken,
|
The popup_done event is sent out when a popup grab is broken,
|
||||||
|
@ -717,6 +717,16 @@ xdg_shell_use_unstable_version (struct wl_client *client,
|
|||||||
g_warning ("Bad xdg_shell version: %d", version);
|
g_warning ("Bad xdg_shell version: %d", version);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
static void
|
||||||
xdg_surface_destructor (struct wl_resource *resource)
|
xdg_surface_destructor (struct wl_resource *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);
|
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
|
static gboolean
|
||||||
begin_grab_op_on_surface (MetaWaylandSurface *surface,
|
begin_grab_op_on_surface (MetaWaylandSurface *surface,
|
||||||
MetaWaylandSeat *seat,
|
MetaWaylandSeat *seat,
|
||||||
@ -958,7 +957,6 @@ static const struct xdg_surface_interface meta_wayland_xdg_surface_interface = {
|
|||||||
xdg_surface_set_margin,
|
xdg_surface_set_margin,
|
||||||
xdg_surface_set_title,
|
xdg_surface_set_title,
|
||||||
xdg_surface_set_app_id,
|
xdg_surface_set_app_id,
|
||||||
xdg_surface_pong,
|
|
||||||
xdg_surface_move,
|
xdg_surface_move,
|
||||||
xdg_surface_resize,
|
xdg_surface_resize,
|
||||||
xdg_surface_set_output,
|
xdg_surface_set_output,
|
||||||
@ -1009,20 +1007,8 @@ xdg_popup_destroy (struct wl_client *client,
|
|||||||
wl_resource_destroy (resource);
|
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 = {
|
static const struct xdg_popup_interface meta_wayland_xdg_popup_interface = {
|
||||||
xdg_popup_destroy,
|
xdg_popup_destroy,
|
||||||
xdg_popup_pong,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1076,8 +1062,37 @@ static const struct xdg_shell_interface meta_wayland_xdg_shell_interface = {
|
|||||||
xdg_shell_use_unstable_version,
|
xdg_shell_use_unstable_version,
|
||||||
xdg_shell_get_xdg_surface,
|
xdg_shell_get_xdg_surface,
|
||||||
xdg_shell_get_xdg_popup,
|
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
|
static void
|
||||||
bind_xdg_shell (struct wl_client *client,
|
bind_xdg_shell (struct wl_client *client,
|
||||||
void *data,
|
void *data,
|
||||||
@ -1085,6 +1100,7 @@ bind_xdg_shell (struct wl_client *client,
|
|||||||
guint32 id)
|
guint32 id)
|
||||||
{
|
{
|
||||||
struct wl_resource *resource;
|
struct wl_resource *resource;
|
||||||
|
XdgShell *xdg_shell;
|
||||||
|
|
||||||
if (version != 1)
|
if (version != 1)
|
||||||
{
|
{
|
||||||
@ -1092,8 +1108,15 @@ bind_xdg_shell (struct wl_client *client,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
xdg_shell = g_slice_new (XdgShell);
|
||||||
|
|
||||||
resource = wl_resource_create (client, &xdg_shell_interface, 1, id);
|
resource = wl_resource_create (client, &xdg_shell_interface, 1, id);
|
||||||
wl_resource_set_implementation (resource, &meta_wayland_xdg_shell_interface, data, NULL);
|
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
|
static void
|
||||||
@ -1514,12 +1537,18 @@ meta_wayland_surface_focused_unset (MetaWaylandSurface *surface)
|
|||||||
|
|
||||||
void
|
void
|
||||||
meta_wayland_surface_ping (MetaWaylandSurface *surface,
|
meta_wayland_surface_ping (MetaWaylandSurface *surface,
|
||||||
guint32 timestamp)
|
guint32 serial)
|
||||||
{
|
{
|
||||||
if (surface->xdg_surface.resource)
|
struct wl_client *client = wl_resource_get_client (surface->resource);
|
||||||
xdg_surface_send_ping (surface->xdg_surface.resource, timestamp);
|
struct wl_resource *xdg_shell = get_xdg_shell_for_client (client);
|
||||||
else if (surface->xdg_popup.resource)
|
|
||||||
xdg_popup_send_ping (surface->xdg_popup.resource, timestamp);
|
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
|
void
|
||||||
|
Loading…
Reference in New Issue
Block a user