|
|
@ -4,6 +4,7 @@
|
|
|
|
#include <wlr/config.h>
|
|
|
|
#include <wlr/config.h>
|
|
|
|
#include <wlr/backend/multi.h>
|
|
|
|
#include <wlr/backend/multi.h>
|
|
|
|
#include <wlr/interfaces/wlr_keyboard.h>
|
|
|
|
#include <wlr/interfaces/wlr_keyboard.h>
|
|
|
|
|
|
|
|
#include <wlr/types/wlr_cursor.h>
|
|
|
|
#include <wlr/types/wlr_keyboard.h>
|
|
|
|
#include <wlr/types/wlr_keyboard.h>
|
|
|
|
#include <wlr/types/wlr_keyboard_group.h>
|
|
|
|
#include <wlr/types/wlr_keyboard_group.h>
|
|
|
|
#include <xkbcommon/xkbcommon-names.h>
|
|
|
|
#include <xkbcommon/xkbcommon-names.h>
|
|
|
@ -267,6 +268,7 @@ static bool keyboard_execute_compositor_binding(struct sway_keyboard *keyboard,
|
|
|
|
const xkb_keysym_t *pressed_keysyms, uint32_t modifiers, size_t keysyms_len) {
|
|
|
|
const xkb_keysym_t *pressed_keysyms, uint32_t modifiers, size_t keysyms_len) {
|
|
|
|
for (size_t i = 0; i < keysyms_len; ++i) {
|
|
|
|
for (size_t i = 0; i < keysyms_len; ++i) {
|
|
|
|
xkb_keysym_t keysym = pressed_keysyms[i];
|
|
|
|
xkb_keysym_t keysym = pressed_keysyms[i];
|
|
|
|
|
|
|
|
|
|
|
|
if (keysym >= XKB_KEY_XF86Switch_VT_1 &&
|
|
|
|
if (keysym >= XKB_KEY_XF86Switch_VT_1 &&
|
|
|
|
keysym <= XKB_KEY_XF86Switch_VT_12) {
|
|
|
|
keysym <= XKB_KEY_XF86Switch_VT_12) {
|
|
|
|
#if WLR_HAS_SESSION
|
|
|
|
#if WLR_HAS_SESSION
|
|
|
@ -282,6 +284,36 @@ static bool keyboard_execute_compositor_binding(struct sway_keyboard *keyboard,
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static bool keyboard_execute_pointer_keysyms(struct sway_keyboard *keyboard,
|
|
|
|
|
|
|
|
uint32_t time, const xkb_keysym_t *pressed_keysyms, size_t keysyms_len,
|
|
|
|
|
|
|
|
enum wl_keyboard_key_state state) {
|
|
|
|
|
|
|
|
struct sway_cursor *cursor = keyboard->seat_device->sway_seat->cursor;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < keysyms_len; ++i) {
|
|
|
|
|
|
|
|
xkb_keysym_t keysym = pressed_keysyms[i];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint32_t button = wlr_keyboard_keysym_to_pointer_button(keysym);
|
|
|
|
|
|
|
|
if (button != 0) {
|
|
|
|
|
|
|
|
dispatch_cursor_button(cursor, &keyboard->wlr->base, time, button,
|
|
|
|
|
|
|
|
(enum wl_pointer_button_state)state);
|
|
|
|
|
|
|
|
wlr_seat_pointer_notify_frame(cursor->seat->wlr_seat);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int dx, dy;
|
|
|
|
|
|
|
|
wlr_keyboard_keysym_to_pointer_motion(keysym, &dx, &dy);
|
|
|
|
|
|
|
|
if (state == WL_KEYBOARD_KEY_STATE_PRESSED && (dx != 0 || dy != 0)) {
|
|
|
|
|
|
|
|
dx *= 10;
|
|
|
|
|
|
|
|
dy *= 10;
|
|
|
|
|
|
|
|
pointer_motion(cursor, time, &keyboard->wlr->base, dx, dy, dx, dy);
|
|
|
|
|
|
|
|
wlr_seat_pointer_notify_frame(cursor->seat->wlr_seat);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Get keysyms and modifiers from the keyboard as xkb sees them.
|
|
|
|
* Get keysyms and modifiers from the keyboard as xkb sees them.
|
|
|
|
*
|
|
|
|
*
|
|
|
@ -507,6 +539,11 @@ static void handle_key_event(struct sway_keyboard *keyboard,
|
|
|
|
keyboard, keyinfo.raw_keysyms, keyinfo.raw_modifiers,
|
|
|
|
keyboard, keyinfo.raw_keysyms, keyinfo.raw_modifiers,
|
|
|
|
keyinfo.raw_keysyms_len);
|
|
|
|
keyinfo.raw_keysyms_len);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!handled) {
|
|
|
|
|
|
|
|
handled = keyboard_execute_pointer_keysyms(keyboard, event->time_msec,
|
|
|
|
|
|
|
|
keyinfo.translated_keysyms, keyinfo.translated_keysyms_len,
|
|
|
|
|
|
|
|
event->state);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (event->state == WL_KEYBOARD_KEY_STATE_RELEASED) {
|
|
|
|
if (event->state == WL_KEYBOARD_KEY_STATE_RELEASED) {
|
|
|
|
// If the pressed event was sent to a client and we have a focused
|
|
|
|
// If the pressed event was sent to a client and we have a focused
|
|
|
|