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, ¤t_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")) { }