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); + } + } } }