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

Commit 377d16183feafb4dddcc1392519dde7a84fdbab2
Parent: 4e3d98c5b487213aae97f4e701a3f391018cfe9e
Author: mcol <mcol@posteo.net>
Date: 2020-11-07 23:43:52 +0000
Committer: mcol <mcol@posteo.net>
Committed: 2020-11-07 23:43:52 +0000

store current desk as server member to avoid per-frame calculation

src/types.h Modified

@@ -30,6 +30,7 @@
     struct wl_listener new_xdg_surface_listener;
     struct wl_list views;
     struct wl_list desks;
+    struct desk *current_desk;
 
     struct wlr_cursor *cursor;
     struct wlr_xcursor_manager *cursor_manager;

src/shell.c Modified

@@ -127,7 +127,7 @@
 }
 
 
-static int desk_index = 0;
+static int num_desks = 0;
 
 
 void add_desk(struct server *server) {
@@ -135,8 +135,8 @@
     wl_list_insert(server->desks.prev, &desk->link);
     desk->server = server;
     assign_colour("#5D479D", desk->background);
-    desk->index = desk_index;
-    desk_index++;
+    desk->index = num_desks;
+    num_desks++;
 }
 
 
@@ -147,16 +147,24 @@
 
 
 void next_desk(struct server *server) {
-    struct wl_list *current = server->desks.next;
-    wl_list_remove(current);
-    wl_list_insert(server->desks.prev, current);
+    struct desk *desk;
+    if (server->current_desk->index + 1 == num_desks) {
+	desk = wl_container_of(server->desks.next, desk, link);
+    } else {
+	desk = wl_container_of(server->current_desk->link.next, desk, link);
+    }
+    server->current_desk = desk;
 }
 
 
 void prev_desk(struct server *server) {
-    struct wl_list *prev = server->desks.prev;
-    wl_list_remove(prev);
-    wl_list_insert(&server->desks, prev);
+    struct desk *desk;
+    if (server->current_desk->index == 0) {
+	desk = wl_container_of(server->desks.prev, desk, link);
+    } else {
+	desk = wl_container_of(server->current_desk->link.prev, desk, link);
+    }
+    server->current_desk = desk;
 }
 
 

src/output.c Modified

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

src/config.c Modified

@@ -35,6 +35,8 @@
 
 static void set_defaults(struct server *server) {
     add_desk(server);
+    server->current_desk =
+	wl_container_of(server->desks.prev, server->current_desk, link);
 }