gimp but for windows: a wayland compositor
git clone https://github.com/m-col/wimp
Files | Refs | Readme

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;