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

Commit eb08b684c2cfd937320634b69825a3b90be23983
Parent: 4b5efe4c5719e333a433296fc23a163a02e23773
Author: mcol <mcol@posteo.net>
Date: 2021-02-12 19:23:16 +0000
Committer: mcol <mcol@posteo.net>
Committed: 2021-02-12 19:23:16 +0000

Add `desk X corner resize` option, colouring view corners when mod held

This is the first in a 2-step process. This commit results in corners
being drawn on views with a configured colour when the mod key is held
down. The next step is implemented server-side resizing enabled by
starting drags within these highlighted corner regions.

wimp.conf Modified

@@ -23,10 +23,12 @@
 #desk 1 borders normal #3e3e73
 #desk 1 borders focus #998dd1
 #desk 1 borders width 4
+#desk 1 corners resize #406794
 #desk 2 background #3e3e73
 #desk 2 borders normal #5D479D
 #desk 2 borders focus #998dd1
 #desk 2 borders width 6
+#desk 2 corners resize #3e3e73
 desk 1 background ~/path/to/tiling-image.png
 
 # Magnification bounds

src/types.h Modified

@@ -88,6 +88,7 @@
     struct wl_listener request_set_selection_listener;
     struct wl_list keyboards;
     enum wlr_keyboard_modifier mod;
+    bool mod_on;
     struct wl_list key_bindings;
     struct wl_list mouse_bindings;
 
@@ -172,6 +173,7 @@
     float background[4];
     float border_normal[4];
     float border_focus[4];
+    float corner_resize[4];
     int border_width;
     struct wallpaper *wallpaper;
     double panned_x, panned_y;

src/output.h Modified

@@ -8,6 +8,7 @@
 void damage_by_view(struct view *view, bool with_borders);
 void damage_by_lview(struct layer_view *lview);
 void damage_all_outputs();
+void damage_all_views();
 void damage_mark_indicator();
 
 #endif

src/output.c Modified

@@ -44,18 +44,44 @@
 
     if (rdata->bordered == surface) {
 	int border_width = wimp.current_desk->border_width;
-	struct wlr_box borders = {
-	    .x = x - border_width * rdata->zoom,
-	    .y = y - border_width * rdata->zoom,
-	    .width = width + ceil(border_width * 2 * rdata->zoom),
-	    .height = height + ceil(border_width * 2 * rdata->zoom),
-	};
-	wlr_render_rect(
-	    rdata->renderer,
-	    &borders,
-	    rdata->is_focussed ? wimp.current_desk->border_focus : wimp.current_desk->border_normal,
-	    output->transform_matrix
-	);
+	if (border_width > 0) {
+	    int remainder = ceil(border_width * 2 * rdata->zoom);
+	    struct wlr_box borders = {
+		.x = x - border_width * rdata->zoom,
+		.y = y - border_width * rdata->zoom,
+		.width = width + remainder,
+		.height = height + remainder,
+	    };
+	    wlr_render_rect(
+		rdata->renderer,
+		&borders,
+		rdata->is_focussed ? wimp.current_desk->border_focus : wimp.current_desk->border_normal,
+		output->transform_matrix
+	    );
+	    if (wimp.mod_on) {
+		struct wlr_box corners = {
+		    .x = borders.x,
+		    .y = borders.y,
+		    .width = 24,
+		    .height = 24,
+		};
+		wlr_render_rect(
+		    rdata->renderer, &corners, wimp.current_desk->corner_resize, output->transform_matrix
+		);
+		corners.x = borders.x + borders.width - 24;
+		wlr_render_rect(
+		    rdata->renderer, &corners, wimp.current_desk->corner_resize, output->transform_matrix
+		);
+		corners.y = borders.y + borders.height - 24;
+		wlr_render_rect(
+		    rdata->renderer, &corners, wimp.current_desk->corner_resize, output->transform_matrix
+		);
+		corners.x = borders.x;
+		wlr_render_rect(
+		    rdata->renderer, &corners, wimp.current_desk->corner_resize, output->transform_matrix
+		);
+	    }
+	}
     }
 
     struct wlr_box box = {
@@ -272,6 +298,14 @@
 }
 
 
+void damage_all_views() {
+    struct view *view;
+    wl_list_for_each(view, &wimp.current_desk->views, link) {
+	damage_by_view(view, true);
+    }
+}
+
+
 void damage_mark_indicator() {
     struct output *output;
     struct wlr_box indicator = wimp.mark_indicator.box;

src/main.c Modified

@@ -29,6 +29,7 @@
     .on_drag3 = NULL,
     .on_pinch = NULL,
     .desk_count = 0,
+    .mod_on = false,
     .mark_waiting = false,
     .mark_indicator.box.width = 25,
     .mark_indicator.box.height = 25,

src/input.c Modified

@@ -52,6 +52,15 @@
 		handled = true;
 	    }
 	}
+	if (!wimp.mod_on) {
+	    wimp.mod_on = true;
+	    damage_all_views();
+	}
+    } else {
+	if (wimp.mod_on) {
+	    wimp.mod_on = false;
+	    damage_all_views();
+	}
     }
 
     if (!handled){

src/desk.c Modified

@@ -13,6 +13,7 @@
     assign_colour("#5D479D", desk->background);
     assign_colour("#3e3e73", desk->border_normal);
     assign_colour("#998dd1", desk->border_focus);
+    assign_colour("#406794", desk->corner_resize);
     desk->border_width = 4;
     desk->wallpaper = NULL;
     desk->index = wimp.desk_count;

src/config.c Modified

@@ -26,10 +26,12 @@
 desk 1 borders normal #3e3e73\n\
 desk 1 borders focus #998dd1\n\
 desk 1 borders width 4\n\
+desk 1 corners resize #406794\n\
 desk 2 background #3e3e73\n\
 desk 2 borders normal #5D479D\n\
 desk 2 borders focus #998dd1\n\
 desk 2 borders width 6\n\
+desk 2 corners resize #3e3e73\n\
 zoom_min 0.2\n\
 zoom_max 5\n\
 mark_indicator #000000\n\
@@ -588,6 +590,14 @@
 			}
 		    }
 		}
+
+		// desk <index> corners resize <#rrggbb>
+		else if (!strcasecmp(s, "corners")) {
+		    s = strtok(NULL, " \t\n\r");
+		    if (!strcasecmp(s, "resize")) {
+			assign_colour(strtok(NULL, " \t\n\r"), desk->corner_resize);
+		    }
+		}
 	    }
 	}