xwayland: Add xdg-system-bell support
For the Wayland compositors who do not implement XkbBellNotifyMask but support the Wayland protocol xdg-system-bell, use that to ring the bell. v2: Be more selective on the device, make sure it's a keyboard and it has core events. Signed-off-by: Olivier Fourdan <ofourdan@redhat.com> Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1742>
This commit is contained in:
parent
1ccc19d1df
commit
e4804d11e8
|
@ -51,6 +51,7 @@ xwayland_shell_xml = join_paths(protodir, 'staging', 'xwayland-shell', 'xwayland
|
||||||
tearing_xml = join_paths(protodir, 'staging', 'tearing-control', 'tearing-control-v1.xml')
|
tearing_xml = join_paths(protodir, 'staging', 'tearing-control', 'tearing-control-v1.xml')
|
||||||
fractional_scale_xml = join_paths(protodir, 'staging', 'fractional-scale', 'fractional-scale-v1.xml')
|
fractional_scale_xml = join_paths(protodir, 'staging', 'fractional-scale', 'fractional-scale-v1.xml')
|
||||||
syncobj_xml = join_paths(protodir, 'staging', 'linux-drm-syncobj', 'linux-drm-syncobj-v1.xml')
|
syncobj_xml = join_paths(protodir, 'staging', 'linux-drm-syncobj', 'linux-drm-syncobj-v1.xml')
|
||||||
|
system_bell_xml = join_paths(protodir, 'staging', 'xdg-system-bell', 'xdg-system-bell-v1.xml')
|
||||||
|
|
||||||
proto_xml = [
|
proto_xml = [
|
||||||
relative_xml,
|
relative_xml,
|
||||||
|
@ -68,6 +69,7 @@ proto_xml = [
|
||||||
tearing_xml,
|
tearing_xml,
|
||||||
fractional_scale_xml,
|
fractional_scale_xml,
|
||||||
syncobj_xml,
|
syncobj_xml,
|
||||||
|
system_bell_xml,
|
||||||
]
|
]
|
||||||
|
|
||||||
client_header = generator(scanner,
|
client_header = generator(scanner,
|
||||||
|
|
|
@ -57,6 +57,7 @@
|
||||||
#include "pointer-gestures-unstable-v1-client-protocol.h"
|
#include "pointer-gestures-unstable-v1-client-protocol.h"
|
||||||
#include "xwayland-keyboard-grab-unstable-v1-client-protocol.h"
|
#include "xwayland-keyboard-grab-unstable-v1-client-protocol.h"
|
||||||
#include "keyboard-shortcuts-inhibit-unstable-v1-client-protocol.h"
|
#include "keyboard-shortcuts-inhibit-unstable-v1-client-protocol.h"
|
||||||
|
#include "xdg-system-bell-v1-client-protocol.h"
|
||||||
|
|
||||||
#define SCROLL_AXIS_HORIZ 2
|
#define SCROLL_AXIS_HORIZ 2
|
||||||
#define SCROLL_AXIS_VERT 3
|
#define SCROLL_AXIS_VERT 3
|
||||||
|
@ -3091,6 +3092,15 @@ init_keyboard_shortcuts_inhibit(struct xwl_screen *xwl_screen,
|
||||||
1);
|
1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
init_system_bell(struct xwl_screen *xwl_screen, uint32_t id, uint32_t version)
|
||||||
|
{
|
||||||
|
xwl_screen->system_bell =
|
||||||
|
wl_registry_bind(xwl_screen->registry, id,
|
||||||
|
&xdg_system_bell_v1_interface,
|
||||||
|
1);
|
||||||
|
}
|
||||||
|
|
||||||
/* The compositor may send us wl_seat and its capabilities before sending e.g.
|
/* The compositor may send us wl_seat and its capabilities before sending e.g.
|
||||||
relative_pointer_manager or pointer_gesture interfaces. This would result in
|
relative_pointer_manager or pointer_gesture interfaces. This would result in
|
||||||
devices being created in capabilities handler, but listeners not, because
|
devices being created in capabilities handler, but listeners not, because
|
||||||
|
@ -3142,6 +3152,8 @@ input_handler(void *data, struct wl_registry *registry, uint32_t id,
|
||||||
init_keyboard_grab(xwl_screen, id, version);
|
init_keyboard_grab(xwl_screen, id, version);
|
||||||
} else if (strcmp(interface, zwp_keyboard_shortcuts_inhibit_manager_v1_interface.name) == 0) {
|
} else if (strcmp(interface, zwp_keyboard_shortcuts_inhibit_manager_v1_interface.name) == 0) {
|
||||||
init_keyboard_shortcuts_inhibit(xwl_screen, id, version);
|
init_keyboard_shortcuts_inhibit(xwl_screen, id, version);
|
||||||
|
} else if (strcmp(interface, xdg_system_bell_v1_interface.name) == 0) {
|
||||||
|
init_system_bell(xwl_screen, id, version);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3164,6 +3176,28 @@ ProcessInputEvents(void)
|
||||||
void
|
void
|
||||||
DDXRingBell(int volume, int pitch, int duration)
|
DDXRingBell(int volume, int pitch, int duration)
|
||||||
{
|
{
|
||||||
|
ScreenPtr screen = screenInfo.screens[0];
|
||||||
|
struct xwl_screen *xwl_screen;
|
||||||
|
struct xwl_seat *xwl_seat;
|
||||||
|
|
||||||
|
xwl_screen = xwl_screen_get(screen);
|
||||||
|
if (!xwl_screen->system_bell)
|
||||||
|
return;
|
||||||
|
|
||||||
|
xorg_list_for_each_entry(xwl_seat, &xwl_screen->seat_list, link) {
|
||||||
|
if (!xwl_seat->keyboard)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!xwl_seat->keyboard->coreEvents)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!xwl_seat->keyboard_focus)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
DebugF("XWAYLAND: Ringing the bell\n");
|
||||||
|
xdg_system_bell_v1_ring (xwl_screen->system_bell, xwl_seat->keyboard_focus);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Bool
|
static Bool
|
||||||
|
|
|
@ -117,6 +117,7 @@ struct xwl_screen {
|
||||||
struct wp_tearing_control_manager_v1 *tearing_control_manager;
|
struct wp_tearing_control_manager_v1 *tearing_control_manager;
|
||||||
struct wp_fractional_scale_manager_v1 *fractional_scale_manager;
|
struct wp_fractional_scale_manager_v1 *fractional_scale_manager;
|
||||||
struct wp_linux_drm_syncobj_manager_v1 *explicit_sync;
|
struct wp_linux_drm_syncobj_manager_v1 *explicit_sync;
|
||||||
|
struct xdg_system_bell_v1 *system_bell;
|
||||||
struct xorg_list drm_lease_devices;
|
struct xorg_list drm_lease_devices;
|
||||||
struct xorg_list queued_drm_lease_devices;
|
struct xorg_list queued_drm_lease_devices;
|
||||||
struct xorg_list drm_leases;
|
struct xorg_list drm_leases;
|
||||||
|
|
Loading…
Reference in New Issue