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

Commit 4e3d98c5b487213aae97f4e701a3f391018cfe9e
Parent: 6b6952f0add33e31f8dcab11167b0a011f27e0e4
Author: mcol <mcol@posteo.net>
Date: 2020-11-07 23:06:16 +0000
Committer: mcol <mcol@posteo.net>
Committed: 2020-11-07 23:10:19 +0000

Add skeleton workspaces (desks) with configurable background colours

This cleans up handling of config reading, makes assign_colour a bit
more flexible (i.e. with preceding '#'s), adds desk structs each with
their own background colours, and keybound functions to move through
desks.

src/types.h Modified

@@ -29,7 +29,7 @@
     struct wlr_xdg_shell *shell;
     struct wl_listener new_xdg_surface_listener;
     struct wl_list views;
-    float background[4];
+    struct wl_list desks;
 
     struct wlr_cursor *cursor;
     struct wlr_xcursor_manager *cursor_manager;
@@ -72,4 +72,12 @@
     struct wl_listener key_listener;
 };
 
+struct desk {
+    struct wl_list link;
+    struct server *server;
+    float background[4];
+    int x, y;
+    int index;
+};
+
 #endif

src/shell.h Modified

@@ -3,7 +3,6 @@
 
 #include "types.h"
 
-
 void focus_view(struct view *view, struct wlr_surface *surface);
 void on_map(struct wl_listener *listener, void *data);
 void on_unmap(struct wl_listener *listener, void *data);
@@ -12,6 +11,10 @@
 void on_request_move(struct wl_listener *listener, void *data);
 void on_request_resize(struct wl_listener *listener, void *data);
 void on_new_xdg_surface(struct wl_listener *listener, void *data);
+void add_desk(struct server *server);
+void remove_desk(struct desk *desk);
+void next_desk(struct server *server);
+void prev_desk(struct server *server);
 void set_up_shell(struct server *server);
 
 #endif

src/shell.c Modified

@@ -1,5 +1,6 @@
 #include <wlr/util/edges.h>
 
+#include "config.h"
 #include "output.h"
 #include "types.h"
 
@@ -126,6 +127,39 @@
 }
 
 
+static int desk_index = 0;
+
+
+void add_desk(struct server *server) {
+    struct desk *desk = calloc(1, sizeof(struct desk));
+    wl_list_insert(server->desks.prev, &desk->link);
+    desk->server = server;
+    assign_colour("#5D479D", desk->background);
+    desk->index = desk_index;
+    desk_index++;
+}
+
+
+void remove_desk(struct desk *desk) {
+    wl_list_remove(&desk->link);
+    free(desk);
+}
+
+
+void next_desk(struct server *server) {
+    struct wl_list *current = server->desks.next;
+    wl_list_remove(current);
+    wl_list_insert(server->desks.prev, current);
+}
+
+
+void prev_desk(struct server *server) {
+    struct wl_list *prev = server->desks.prev;
+    wl_list_remove(prev);
+    wl_list_insert(&server->desks, prev);
+}
+
+
 void set_up_shell(struct server *server) {
     wl_list_init(&server->views);
     server->shell = wlr_xdg_shell_create(server->display);

src/output.c Modified

@@ -60,7 +60,8 @@
     wlr_output_effective_resolution(output->wlr_output, &width, &height);
     wlr_renderer_begin(renderer, width, height);
 
-    wlr_renderer_clear(renderer, output->server->background);
+    struct desk *desk = wl_container_of(output->server->desks.next, desk, link);
+    wlr_renderer_clear(renderer, desk->background);
 
     struct view *view;
     wl_list_for_each_reverse(view, &output->server->views, link) {

src/input.c Modified

@@ -215,6 +215,14 @@
 	wl_list_insert(server->views.prev, &current_view->link);
 	break;
 
+    case XKB_KEY_Left:
+	prev_desk(server);
+	break;
+
+    case XKB_KEY_Right:
+	next_desk(server);
+	break;
+
     default:
 	return false;
     }

src/deskwm.h Modified

@@ -1,8 +1,4 @@
 #ifndef DESKWM_DESKWM_H
 #define DESKWM_DESKWM_H
 
-#include "types.h"
-
-struct server create_server();
-
 #endif

src/deskwm.c Modified

@@ -1,4 +1,5 @@
 #include <stdlib.h>
+#include <string.h>
 #include <unistd.h>
 #include <wlr/backend.h>
 #include <wlr/render/wlr_renderer.h>
@@ -15,34 +16,35 @@
 #include "types.h"
 
 
-struct server create_server() {
-    struct server server;
-    server.display = wl_display_create();
-    server.backend = wlr_backend_autocreate(server.display, NULL);
-    server.renderer = wlr_backend_get_renderer(server.backend);
-    wlr_renderer_init_wl_display(server.renderer, server.display);
-    wlr_compositor_create(server.display, server.renderer);
-    wlr_data_device_manager_create(server.display);
-    return server;
-}
-
-
 int main(int argc, char *argv[]) {
     wlr_log_init(WLR_ERROR, NULL);
 
     int opt;
-    while ((opt = getopt(argc, argv, "d")) != -1) {
+    char *config = NULL;
+    while ((opt = getopt(argc, argv, "dc:")) != -1) {
         switch (opt) {
 	    case 'd':
 		wlr_log_init(WLR_DEBUG, NULL);
+		break;
+	    case 'c':
+		config = strdup(optarg);
+		break;
         }
     }
 
     // create
-    struct server server = create_server();
+    struct server server;
+    server.display = wl_display_create();
+    server.backend = wlr_backend_autocreate(server.display, NULL);
+    server.renderer = wlr_backend_get_renderer(server.backend);
+    wlr_renderer_init_wl_display(server.renderer, server.display);
+    wlr_compositor_create(server.display, server.renderer);
+    wlr_data_device_manager_create(server.display);
+    wl_list_init(&server.desks);
 
     // read config
-    load_config(&server);
+    load_config(&server, config);
+    free(config);
 
     // configure
     set_up_outputs(&server);

src/config.h Modified

@@ -3,7 +3,7 @@
 
 #include "types.h"
 
-
-void load_config(struct server *server);
+void assign_colour(char *hex, float dest[4]);
+void load_config(struct server *server, char *config);
 
 #endif

src/config.c Modified

@@ -1,8 +1,11 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <wordexp.h>
 #include <unistd.h>
 
+#include "config.h"
+#include "shell.h"
 #include "types.h"
 
 
@@ -13,8 +16,10 @@
 	    break;
 	case 7:
 	case 9:
-	    hex++;
-	    break;
+	    if (hex[0] == '#') {
+		hex++;
+		break;
+	    }
 	default:
 	    return;
     }
@@ -28,22 +33,32 @@
 }
 
 
-void set_defaults(struct server *server) {
-    assign_colour("#5D479D", &server->background);
+static void set_defaults(struct server *server) {
+    add_desk(server);
 }
 
 
-void load_config(struct server *server) {
+void load_config(struct server *server, char *config) {
     set_defaults(server);
 
-    char config[1024] = "";
-    strcpy(config, getenv("HOME"));
-    strcat(config, "/.config/deskwm.conf");
+    if (config == NULL) {
+	char *xdg_config_home = getenv("XDG_CONFIG_HOME");
+	if (xdg_config_home && *xdg_config_home) {
+	    config = "$XDG_CONFIG_HOME/.config/deskwm.conf";
+	} else {
+	    config = "$HOME/.config/deskwm.conf";
+	}
+    };
+    wordexp_t p;
+    wordexp(config, &p, WRDE_NOCMD | WRDE_UNDEF);
 
-    if(access(config, R_OK) == -1) {
+    if(access(p.we_wordv[0], R_OK) == -1) {
+	wlr_log(WLR_INFO, "%s not accessible. Using defaults.", p.we_wordv[0]);
+	wordfree(&p);
 	return;
     }
-    FILE *fd = fopen(config, "r");
+    FILE *fd = fopen(p.we_wordv[0], "r");
+    wordfree(&p);
 
     char *s;
     char linebuf[1024];
@@ -51,9 +66,12 @@
 	if (!(s = strtok(linebuf, " \t\n\r")) || s[0] == '#') {
 	    continue;
 	}
-	if (!strcasecmp(s, "background")) {
+	if (!strcasecmp(s, "add_desk")) {
+	    add_desk(server);
+	} else if (!strcasecmp(s, "background")) {
 	    if ((s = strtok(NULL, " \t\n\r"))) {
-		assign_colour(s, &server->background);
+		struct desk *desk = wl_container_of(server->desks.prev, desk, link);
+		assign_colour(s, desk->background);
 	    }
 	} else if (!strcasecmp(s, "modifier")) {
 	}