Commit 7be89bba103fcddcedbdf80f4a6117461f42867f Parent: 73375f3abeaa9564f2bd12594f9a454cded220b3 Author: mcol <mcol@posteo.net> Date: 2021-02-10 23:23:50 +0000 Committer: mcol <mcol@posteo.net> Committed: 2021-02-10 23:23:50 +0000 keyboard.c -> input.c
src/output.c Modified
@@ -6,6 +6,7 @@ #include <wlr/types/wlr_output_damage.h> #include <wlr/types/wlr_output_layout.h> #include <wlr/types/wlr_output_management_v1.h> +#include <wlr/types/wlr_screencopy_v1.h> #include <wlr/types/wlr_xdg_output_v1.h> #include "output.h" @@ -406,6 +407,7 @@ wimp.new_output_listener.notify = on_new_output; wl_signal_add(&wimp.backend->events.new_output, &wimp.new_output_listener); + wlr_screencopy_manager_v1_create(wimp.display); wlr_xdg_output_manager_v1_create(wimp.display, wimp.output_layout); wimp.output_manager = wlr_output_manager_v1_create(wimp.display);
src/main.c Modified
@@ -4,9 +4,6 @@ #include <wlr/backend.h> #include <wlr/render/wlr_renderer.h> #include <wlr/types/wlr_compositor.h> -#include <wlr/types/wlr_data_device.h> -#include <wlr/types/wlr_primary_selection_v1.h> -#include <wlr/types/wlr_screencopy_v1.h> #include <wlr/types/wlr_xdg_shell.h> #include <wlr/util/log.h> @@ -15,7 +12,7 @@ #include "decorations.h" #include "desk.h" #include "main.h" -#include "keyboard.h" +#include "input.h" #include "layer_shell.h" #include "log.h" #include "output.h" @@ -151,11 +148,6 @@ wlr_renderer_init_wl_display(wimp.renderer, wimp.display); wlr_compositor_create(wimp.display, wimp.renderer); - // add some managers - wlr_screencopy_manager_v1_create(wimp.display); - wlr_data_device_manager_create(wimp.display); - wlr_primary_selection_v1_device_manager_create(wimp.display); - // initialise wl_list_init(&wimp.desks); wl_list_init(&wimp.key_bindings); @@ -166,10 +158,10 @@ // configure locate_config(); load_config(); + set_up_inputs(); set_up_outputs(); set_up_shell(); set_up_cursor(); - set_up_keyboard(); set_up_decorations(); set_up_layer_shell();
src/keyboard.h Deleted
@@ -1,8 +0,0 @@ -#ifndef DESKWM_KEYBOARD_H -#define DESKWM_KEYBOARD_H - -#include "types.h" - -void set_up_keyboard(); - -#endif
src/keyboard.c Deleted
@@ -1,216 +0,0 @@ -#include <inttypes.h> -#include <unistd.h> -#include <wayland-server-protocol.h> -#include <wlr/types/wlr_keyboard.h> -#include <wlr/types/wlr_data_device.h> -#include <wlr/types/wlr_virtual_keyboard_v1.h> - -#include "action.h" -#include "cursor.h" -#include "shell.h" -#include "types.h" - - -static void on_modifier(struct wl_listener *listener, void *data) { - struct keyboard *keyboard = wl_container_of(listener, keyboard, modifier_listener); - wlr_seat_keyboard_notify_modifiers( - wimp.seat, &keyboard->device->keyboard->modifiers - ); - - uint32_t modifiers = wlr_keyboard_get_modifiers(keyboard->device->keyboard); - bool handled = false; - struct binding *kb; - if ((modifiers & wimp.mod)) { - modifiers &= ~wimp.mod; - wl_list_for_each(kb, &wimp.mouse_bindings, link) { - if (modifiers == kb->mods) { - switch (kb->key) { - case MOTION: - wimp.on_mouse_motion = kb->action; - break; - case SCROLL: - wimp.on_mouse_scroll = kb->action; - break; - case DRAG1: - wimp.on_drag1 = kb->action; - break; - case DRAG2: - wimp.on_drag2 = kb->action; - break; - case DRAG3: - wimp.on_drag3 = kb->action; - break; - case PINCH: - wimp.on_pinch = kb->action; - wimp.on_pinch_begin = kb->begin; - break; - } - wimp.cursor_mode = CURSOR_MOD; - handled = true; - } - } - } - - if (!handled){ - wimp.cursor_mode = CURSOR_PASSTHROUGH; - } -} - - -static void on_key(struct wl_listener *listener, void *data) { - struct wlr_event_keyboard_key *event = data; - - if (event->state == WL_KEYBOARD_KEY_STATE_PRESSED) { - const xkb_keysym_t *syms; - xkb_keycode_t keycode = event->keycode + 8; - struct keyboard *keyboard = wl_container_of(listener, keyboard, key_listener); - struct wlr_keyboard *wlr_kb = keyboard->device->keyboard; - - if (wimp.mark_waiting) { - struct mark *mark; - wimp.mark_waiting = false; - xkb_state_key_get_syms(wlr_kb->xkb_state, keycode, &syms); - mark = wl_container_of(wimp.marks.next, mark, link); - if (mark->key == 0) { - actually_set_mark(syms[0]); - } else { - actually_go_to_mark(syms[0]); - } - return; - } - - uint32_t modifiers = wlr_keyboard_get_modifiers(keyboard->device->keyboard); - struct binding *kb; - if ((modifiers & wimp.mod)) { - xkb_layout_index_t layout_index = xkb_state_key_get_layout(wlr_kb->xkb_state, keycode); - int nsyms = xkb_keymap_key_get_syms_by_level( - wlr_kb->keymap, keycode, layout_index, 0, &syms - ); - - modifiers &= ~wimp.mod; - for (int i = 0; i < nsyms; i++) { - wl_list_for_each(kb, &wimp.key_bindings, link) { - if (syms[i] == kb->key && modifiers == kb->mods) { - kb->action(kb->data); - return; - } - } - } - } - } - - // forward to client - wlr_seat_keyboard_notify_key( - wimp.seat, event->time_msec, event->keycode, event->state - ); -} - - -static void on_keyboard_destroy(struct wl_listener *listener, void *data) { - struct keyboard *keyboard = wl_container_of(listener, keyboard, destroy_listener); - - wl_list_remove(&keyboard->link); - wl_list_remove(&keyboard->modifier_listener.link); - wl_list_remove(&keyboard->key_listener.link); - wl_list_remove(&keyboard->destroy_listener.link); - free(keyboard); - - if (!wl_list_empty(&wimp.keyboards)) { - keyboard = wl_container_of(wimp.keyboards.next, keyboard, link); - wlr_seat_set_keyboard(wimp.seat, keyboard->device); - } -} - - -static void on_new_keyboard(struct wlr_input_device *device) { - struct keyboard *keyboard = calloc(1, sizeof(struct keyboard)); - keyboard->device = device; - - // currently assumes default "us" - struct xkb_rule_names rules = { 0 }; - struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); - struct xkb_keymap *keymap = xkb_map_new_from_names(context, &rules, - XKB_KEYMAP_COMPILE_NO_FLAGS); - - wlr_keyboard_set_keymap(device->keyboard, keymap); - xkb_keymap_unref(keymap); - xkb_context_unref(context); - wlr_keyboard_set_repeat_info(device->keyboard, 25, 600); - - keyboard->key_listener.notify = on_key; - keyboard->destroy_listener.notify = on_keyboard_destroy; - keyboard->modifier_listener.notify = on_modifier; - wl_signal_add(&device->keyboard->events.key, &keyboard->key_listener); - wl_signal_add(&device->keyboard->events.destroy, &keyboard->destroy_listener); - wl_signal_add(&device->keyboard->events.modifiers, &keyboard->modifier_listener); - - wlr_seat_set_keyboard(wimp.seat, device); - wl_list_insert(&wimp.keyboards, &keyboard->link); -} - - -static void on_request_set_selection(struct wl_listener *listener, void *data) { - struct wlr_seat_request_set_selection_event *event = data; - wlr_seat_set_selection(wimp.seat, event->source, event->serial); -} - - -static void on_request_cursor(struct wl_listener *listener, void *data) { - struct wlr_seat_pointer_request_set_cursor_event *event = data; - struct wlr_seat_client *focused_client = - wimp.seat->pointer_state.focused_client; - - if (focused_client == event->seat_client) { - wlr_cursor_set_surface( - wimp.cursor, event->surface, event->hotspot_x, event->hotspot_y - ); - } -} - - -static void on_new_input(struct wl_listener *listener, void *data) { - struct wlr_input_device *device = data; - switch (device->type) { - case WLR_INPUT_DEVICE_KEYBOARD: - on_new_keyboard(device); - break; - case WLR_INPUT_DEVICE_POINTER: - wlr_cursor_attach_input_device(wimp.cursor, device); - break; - default: - break; - } - - uint32_t capabilities = WL_SEAT_CAPABILITY_POINTER; - if (!wl_list_empty(&wimp.keyboards)) - capabilities |= WL_SEAT_CAPABILITY_KEYBOARD; - wlr_seat_set_capabilities(wimp.seat, capabilities); -} - - -static void on_new_virtual_keyboard(struct wl_listener *listener, void *data) { - struct wlr_virtual_keyboard_v1 *keyboard = data; - struct wlr_input_device *device = &keyboard->input_device; - on_new_keyboard(device); -} - - -void set_up_keyboard() { - wl_list_init(&wimp.keyboards); - - wimp.new_input_listener.notify = on_new_input; - wl_signal_add(&wimp.backend->events.new_input, &wimp.new_input_listener); - - wimp.seat = wlr_seat_create(wimp.display, "seat0"); - wimp.request_cursor_listener.notify = on_request_cursor; - wl_signal_add(&wimp.seat->events.request_set_cursor, &wimp.request_cursor_listener); - - wimp.request_set_selection_listener.notify = on_request_set_selection; - wl_signal_add(&wimp.seat->events.request_set_selection, - &wimp.request_set_selection_listener); - - wimp.virtual_keyboard = wlr_virtual_keyboard_manager_v1_create(wimp.display); - wimp.new_virtual_keyboard_listener.notify = on_new_virtual_keyboard; - wl_signal_add(&wimp.virtual_keyboard->events.new_virtual_keyboard, - &wimp.new_virtual_keyboard_listener); -}
src/input.h Added
@@ -0,0 +1,8 @@ +#ifndef DESKWM_KEYBOARD_H +#define DESKWM_KEYBOARD_H + +#include "types.h" + +void set_up_inputs(); + +#endif
src/input.c Added
@@ -0,0 +1,203 @@ +#include <inttypes.h> +#include <unistd.h> +#include <wayland-server-protocol.h> +#include <wlr/types/wlr_keyboard.h> +#include <wlr/types/wlr_data_device.h> +#include <wlr/types/wlr_primary_selection_v1.h> +#include <wlr/types/wlr_virtual_keyboard_v1.h> + +#include "action.h" +#include "cursor.h" +#include "shell.h" +#include "types.h" + + +static void on_modifier(struct wl_listener *listener, void *data) { + struct keyboard *keyboard = wl_container_of(listener, keyboard, modifier_listener); + wlr_seat_keyboard_notify_modifiers( + wimp.seat, &keyboard->device->keyboard->modifiers + ); + + uint32_t modifiers = wlr_keyboard_get_modifiers(keyboard->device->keyboard); + bool handled = false; + struct binding *kb; + if ((modifiers & wimp.mod)) { + modifiers &= ~wimp.mod; + wl_list_for_each(kb, &wimp.mouse_bindings, link) { + if (modifiers == kb->mods) { + switch (kb->key) { + case MOTION: + wimp.on_mouse_motion = kb->action; + break; + case SCROLL: + wimp.on_mouse_scroll = kb->action; + break; + case DRAG1: + wimp.on_drag1 = kb->action; + break; + case DRAG2: + wimp.on_drag2 = kb->action; + break; + case DRAG3: + wimp.on_drag3 = kb->action; + break; + case PINCH: + wimp.on_pinch = kb->action; + wimp.on_pinch_begin = kb->begin; + break; + } + wimp.cursor_mode = CURSOR_MOD; + handled = true; + } + } + } + + if (!handled){ + wimp.cursor_mode = CURSOR_PASSTHROUGH; + } +} + + +static void on_key(struct wl_listener *listener, void *data) { + struct wlr_event_keyboard_key *event = data; + + if (event->state == WL_KEYBOARD_KEY_STATE_PRESSED) { + const xkb_keysym_t *syms; + xkb_keycode_t keycode = event->keycode + 8; + struct keyboard *keyboard = wl_container_of(listener, keyboard, key_listener); + struct wlr_keyboard *wlr_kb = keyboard->device->keyboard; + + if (wimp.mark_waiting) { + struct mark *mark; + wimp.mark_waiting = false; + xkb_state_key_get_syms(wlr_kb->xkb_state, keycode, &syms); + mark = wl_container_of(wimp.marks.next, mark, link); + if (mark->key == 0) { + actually_set_mark(syms[0]); + } else { + actually_go_to_mark(syms[0]); + } + return; + } + + uint32_t modifiers = wlr_keyboard_get_modifiers(keyboard->device->keyboard); + struct binding *kb; + if ((modifiers & wimp.mod)) { + xkb_layout_index_t layout_index = xkb_state_key_get_layout(wlr_kb->xkb_state, keycode); + int nsyms = xkb_keymap_key_get_syms_by_level( + wlr_kb->keymap, keycode, layout_index, 0, &syms + ); + + modifiers &= ~wimp.mod; + for (int i = 0; i < nsyms; i++) { + wl_list_for_each(kb, &wimp.key_bindings, link) { + if (syms[i] == kb->key && modifiers == kb->mods) { + kb->action(kb->data); + return; + } + } + } + } + } + + // forward to client + wlr_seat_keyboard_notify_key( + wimp.seat, event->time_msec, event->keycode, event->state + ); +} + + +static void on_keyboard_destroy(struct wl_listener *listener, void *data) { + struct keyboard *keyboard = wl_container_of(listener, keyboard, destroy_listener); + + wl_list_remove(&keyboard->link); + wl_list_remove(&keyboard->modifier_listener.link); + wl_list_remove(&keyboard->key_listener.link); + wl_list_remove(&keyboard->destroy_listener.link); + free(keyboard); + + if (!wl_list_empty(&wimp.keyboards)) { + keyboard = wl_container_of(wimp.keyboards.next, keyboard, link); + wlr_seat_set_keyboard(wimp.seat, keyboard->device); + } +} + + +static void on_new_keyboard(struct wlr_input_device *device) { + struct keyboard *keyboard = calloc(1, sizeof(struct keyboard)); + keyboard->device = device; + + // currently assumes default "us" + struct xkb_rule_names rules = { 0 }; + struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); + struct xkb_keymap *keymap = xkb_map_new_from_names(context, &rules, + XKB_KEYMAP_COMPILE_NO_FLAGS); + + wlr_keyboard_set_keymap(device->keyboard, keymap); + xkb_keymap_unref(keymap); + xkb_context_unref(context); + wlr_keyboard_set_repeat_info(device->keyboard, 25, 600); + + keyboard->key_listener.notify = on_key; + keyboard->destroy_listener.notify = on_keyboard_destroy; + keyboard->modifier_listener.notify = on_modifier; + wl_signal_add(&device->keyboard->events.key, &keyboard->key_listener); + wl_signal_add(&device->keyboard->events.destroy, &keyboard->destroy_listener); + wl_signal_add(&device->keyboard->events.modifiers, &keyboard->modifier_listener); + + wlr_seat_set_keyboard(wimp.seat, device); + wl_list_insert(&wimp.keyboards, &keyboard->link); +} + + +static void on_request_set_selection(struct wl_listener *listener, void *data) { + struct wlr_seat_request_set_selection_event *event = data; + wlr_seat_set_selection(wimp.seat, event->source, event->serial); +} + + +static void on_new_input(struct wl_listener *listener, void *data) { + struct wlr_input_device *device = data; + switch (device->type) { + case WLR_INPUT_DEVICE_KEYBOARD: + on_new_keyboard(device); + break; + case WLR_INPUT_DEVICE_POINTER: + wlr_cursor_attach_input_device(wimp.cursor, device); + break; + default: + break; + } + + uint32_t capabilities = WL_SEAT_CAPABILITY_POINTER; + if (!wl_list_empty(&wimp.keyboards)) + capabilities |= WL_SEAT_CAPABILITY_KEYBOARD; + wlr_seat_set_capabilities(wimp.seat, capabilities); +} + + +static void on_new_virtual_keyboard(struct wl_listener *listener, void *data) { + struct wlr_virtual_keyboard_v1 *keyboard = data; + struct wlr_input_device *device = &keyboard->input_device; + on_new_keyboard(device); +} + + +void set_up_inputs() { + wimp.seat = wlr_seat_create(wimp.display, "seat0"); + wlr_data_device_manager_create(wimp.display); + wlr_primary_selection_v1_device_manager_create(wimp.display); + wl_list_init(&wimp.keyboards); + + wimp.new_input_listener.notify = on_new_input; + wl_signal_add(&wimp.backend->events.new_input, &wimp.new_input_listener); + + wimp.request_set_selection_listener.notify = on_request_set_selection; + wl_signal_add(&wimp.seat->events.request_set_selection, + &wimp.request_set_selection_listener); + + wimp.virtual_keyboard = wlr_virtual_keyboard_manager_v1_create(wimp.display); + wimp.new_virtual_keyboard_listener.notify = on_new_virtual_keyboard; + wl_signal_add(&wimp.virtual_keyboard->events.new_virtual_keyboard, + &wimp.new_virtual_keyboard_listener); +}
src/cursor.c Modified
@@ -22,6 +22,19 @@ } +static void on_request_cursor(struct wl_listener *listener, void *data) { + struct wlr_seat_pointer_request_set_cursor_event *event = data; + struct wlr_seat_client *focused_client = + wimp.seat->pointer_state.focused_client; + + if (focused_client == event->seat_client) { + wlr_cursor_set_surface( + wimp.cursor, event->surface, event->hotspot_x, event->hotspot_y + ); + } +} + + static void process_cursor_move(uint32_t time, double zoom) { wimp.grabbed_view->x = (wimp.cursor->x - wimp.grab_x) / zoom; wimp.grabbed_view->y = (wimp.cursor->y - wimp.grab_y) / zoom; @@ -359,6 +372,9 @@ wimp.cursor_manager = wlr_xcursor_manager_create(NULL, 24); wlr_xcursor_manager_load(wimp.cursor_manager, 1); + wimp.request_cursor_listener.notify = on_request_cursor; + wl_signal_add(&wimp.seat->events.request_set_cursor, &wimp.request_cursor_listener); + wimp.cursor_axis_listener.notify = on_cursor_axis; wimp.cursor_frame_listener.notify = on_cursor_frame; wimp.cursor_button_listener.notify = on_cursor_button;