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

Commit eda920e395627606974e1258c85716b06b421eac
Parent: 8d6521d17956052473d173e77655a717b19a75b2
Author: mcol <mcol@posteo.net>
Date: 2020-11-22 21:53:52 +0000
Committer: mcol <mcol@posteo.net>
Committed: 2020-11-22 21:53:52 +0000

implement VT switching

src/types.h Modified

@@ -65,6 +65,8 @@
     struct wlr_box grab_geobox;
     uint32_t resize_edges;
     double zoom_min, zoom_max;
+
+    bool vt_switching;
 };
 
 struct view {

src/input.c Modified

@@ -219,7 +219,6 @@
 	    if (modifiers == kb->mods) {
 		switch (kb->key) {
 		    case MOTION:
-			printf("MOTION\n");
 			server->on_mouse_motion = kb->action;
 			break;
 		    case SCROLL:

src/config.c Modified

@@ -137,9 +137,10 @@
 	    return;
 	}
     }
-    wl_list_insert(bindings, &kb->link);
+    wl_list_insert(bindings->prev, &kb->link);
 }
 
+
 void assign_colour(char *hex, float dest[4]) {
     if (strlen(hex) != 7 || hex[0] != '#') {
 	wlr_log(WLR_INFO, "Invalid colour: %s. Should be in the form #rrggbb.", hex);
@@ -224,6 +225,33 @@
     server->zoom_min = 0.5;
     server->zoom_max = 3;
     server->reverse_scrolling = false;
+    server->vt_switching = true;
+}
+
+
+static void setup_vt_switching(struct server *server) {
+    if (!server->vt_switching)
+	return;
+
+    uint32_t func_keys[] = {
+	XKB_KEY_F1,
+	XKB_KEY_F2,
+	XKB_KEY_F3,
+	XKB_KEY_F4,
+	XKB_KEY_F5,
+	XKB_KEY_F6,
+    };
+    struct binding *kb;
+
+    for (unsigned i = 0; i < 6; i++) {
+	kb = calloc(1, sizeof(struct binding));
+	kb->mods = WLR_MODIFIER_CTRL;
+	kb->key = func_keys[i];
+	kb->action = &change_vt;
+	kb->data = calloc(1, sizeof(unsigned));
+	*(unsigned *)(kb->data) = i + 1;
+	wl_list_insert(server->key_bindings.prev, &kb->link);
+    }
 }
 
 
@@ -281,7 +309,13 @@
 	    }
 	} else if (!strcasecmp(s, "bind")) {
 	    add_binding(server, strtok(NULL, ""), line);
+	} else if (!strcasecmp(s, "vt_switching")) {
+	    s = strtok(NULL, " \t\n\r");
+	    if (!strcasecmp(s, "off"))
+		server->vt_switching = false;
 	}
     }
     fclose(fd);
+
+    setup_vt_switching(server);
 }

src/action.h Modified

@@ -5,6 +5,7 @@
 
 void shutdown(struct server *server, void *data);
 void exec_command(struct server *server, void *data);
+void change_vt(struct server *server, void *data);
 void close_current_window(struct server *server, void *data);
 void next_desk(struct server *server, void *data);
 void prev_desk(struct server *server, void *data);

src/action.c Modified

@@ -1,3 +1,7 @@
+#include <sys/vt.h>
+#include <wlr/backend.h>
+#include <wlr/backend/session.h>
+
 #include "desk.h"
 #include "types.h"
 
@@ -14,6 +18,13 @@
 }
 
 
+void change_vt(struct server *server, void *data) {
+    unsigned vt = *(unsigned*)data;
+    struct wlr_session *session = wlr_backend_get_session(server->backend);
+    wlr_session_change_vt(session, vt);
+}
+
+
 void close_current_window(struct server *server, void *data) {
     struct wlr_surface *surface = server->seat->keyboard_state.focused_surface;
     if (surface) {

readme.rst Modified

@@ -24,4 +24,3 @@
  - handle fullscreening
  - pinch gestures for desk zooming
  - draw rect with mouse when zoomed out to set new view
- - handle TTY changing

deskwm.conf Modified

@@ -19,6 +19,9 @@
 #zoom_min 0.5
 #zoom_max 3
 
+# Whether to allow VT switching: on or off.
+#vt_switching on
+
 
 ## Bindings
 
@@ -46,6 +49,7 @@
 # Scroll direction. Can be one of: natural, reverse
 #scroll_direction natural
 
+
 ## Configure desks
 
 # Commands until a further desk is added pertain to desk 1.