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

Commit 5544905926ce50e9832f79bcec805b0d26140031
Parent: 2ccab78c3deaed07f7642a92f86be29d684b5435
Author: mcol <mcol@posteo.net>
Date: 2020-11-11 22:37:47 +0000
Committer: mcol <mcol@posteo.net>
Committed: 2020-11-11 22:38:04 +0000

implement desk zooming, bind to M-m and M-n

src/shell.c Modified

@@ -1,6 +1,7 @@
 #include <wlr/util/edges.h>
 
 #include "config.h"
+#include "desk.h"
 #include "output.h"
 #include "types.h"
 

src/output.h Modified

@@ -17,6 +17,7 @@
     struct wlr_renderer *renderer;
     struct view *view;
     struct timespec *when;
+    double zoom;
 };
 
 void render_surface(

src/output.c Modified

@@ -34,10 +34,10 @@
 
     // scale for HiDPI
     struct wlr_box box = {
-	.x = x * output->scale,
-	.y = y * output->scale,
-	.width = surface->current.width * output->scale,
-	.height = surface->current.height * output->scale,
+	.x = x * output->scale * rdata->zoom,
+	.y = y * output->scale * rdata->zoom,
+	.width = surface->current.width * output->scale * rdata->zoom,
+	.height = surface->current.height * output->scale * rdata->zoom,
     };
 
     // this is where any rendering magic might happen
@@ -87,6 +87,7 @@
 	    .view = view,
 	    .renderer = renderer,
 	    .when = &now,
+	    .zoom = desk->zoom,
 	};
 	wlr_xdg_surface_for_each_surface(
 	    view->surface, render_surface, &rdata

src/input.c Modified

@@ -128,6 +128,8 @@
 	    break;
 
 	case CURSOR_PAN:
+	    dx /= server->current_desk->zoom;
+	    dy /= server->current_desk->zoom;
 	    wl_list_for_each(view, &server->current_desk->views, link) {
 		view->x += dx;
 		view->y += dy;
@@ -191,6 +193,9 @@
 	server->seat, event->time_msec, event->orientation, event->delta,
 	event->delta_discrete, event->source
     );
+    if (server->cursor_mode == CURSOR_PAN) {
+	zoom_desk(server->current_desk, event->delta);
+    }
 }
 
 
@@ -241,6 +246,14 @@
 	save_pan(server->current_desk);
 	break;
 
+    case XKB_KEY_M:
+	zoom_desk(server->current_desk, -1);
+	break;
+
+    case XKB_KEY_N:
+	zoom_desk(server->current_desk, 1);
+	break;
+
     default:
 	return false;
     }

src/desk.h Modified

@@ -9,6 +9,7 @@
 void prev_desk(struct server *server);
 void reset_pan(struct desk *desk);
 void save_pan(struct desk *desk);
+void zoom_desk(struct desk *desk, int dir);
 
 struct wallpaper {
     struct wlr_texture *texture;
@@ -23,6 +24,7 @@
     struct wallpaper *wallpaper;
     double panned_x, panned_y;
     int index;
+    double zoom;
 };
 
 #endif

src/desk.c Modified

@@ -15,6 +15,7 @@
     assign_colour("#5D479D", desk->background);
     desk->wallpaper = NULL;
     desk->index = num_desks;
+    desk->zoom = 1;
     num_desks++;
 }
 
@@ -66,9 +67,17 @@
 	view->y -= desk->panned_y;
     }
     desk->panned_x = desk->panned_y = 0;
+    desk->zoom = 1;
 }
 
 
 void save_pan(struct desk *desk) {
     desk->panned_x = desk->panned_y = 0;
 }
+
+
+void zoom_desk(struct desk *desk, int dir) {
+    /* dir > 0 ? zoom in : zoom out */
+    double f = dir > 0 ? 1.015 : 1/1.015;
+    desk->zoom *= f;
+}