From e05f047185c2e3e396fcb2ca3d426d3f4df9af71 Mon Sep 17 00:00:00 2001 From: Juha Aatrokoski Date: Thu, 4 Jul 2019 10:50:33 +0300 Subject: [PATCH] Add pixelated option to desktop zoom Add the option (disabled by default) to have the desktop zoom feature always use the "nearest" filter, with 2x zoom increments (as otherwise the nearest filter would horrible). While it can be used as an accessibility feature like the standard desktop zoom, it is not really meant as such, but rather as a "pixel inspector": to see what pixels are actually rendered on the screen. Signed-off-by: Juha Aatrokoski --- defaults/defaults | 1 + src/compositor.c | 27 ++++++++++++++++++++++----- src/settings.c | 7 +++++++ src/settings.h | 1 + 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/defaults/defaults b/defaults/defaults index 38d34704..7deda18a 100644 --- a/defaults/defaults +++ b/defaults/defaults @@ -77,3 +77,4 @@ wrap_resistance=10 wrap_windows=true wrap_workspaces=false zoom_desktop=true +zoom_desktop_pixelated=false diff --git a/src/compositor.c b/src/compositor.c index 165601f3..fa75ce7f 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -3283,7 +3283,8 @@ recenter_zoomed_area (ScreenInfo *screen_info, int x_root, int y_root) screen_info->transform.matrix[1][2] = (yp << 16); } - if (zf > (1 << 14) && zf < (1 << 16)) + if (!screen_info->params->zoom_desktop_pixelated + && zf > (1 << 14) && zf < (1 << 16)) { #ifdef HAVE_EPOXY if (screen_info->use_glx) @@ -4172,8 +4173,16 @@ void compositorZoomIn (ScreenInfo *screen_info, XfwmEventButton *event) { #ifdef HAVE_COMPOSITOR - screen_info->transform.matrix[0][0] -= 4096; - screen_info->transform.matrix[1][1] -= 4096; + if (screen_info->params->zoom_desktop_pixelated) + { + screen_info->transform.matrix[0][0] >>= 1; + screen_info->transform.matrix[1][1] >>= 1; + } + else + { + screen_info->transform.matrix[0][0] -= 4096; + screen_info->transform.matrix[1][1] -= 4096; + } if (screen_info->transform.matrix[0][0] < (1 << 10)) { @@ -4208,8 +4217,16 @@ compositorZoomOut (ScreenInfo *screen_info, XfwmEventButton *event) /* don't do anything if the user disabled the zoom feature */ if (screen_info->zoomed) { - screen_info->transform.matrix[0][0] += 4096; - screen_info->transform.matrix[1][1] += 4096; + if (screen_info->params->zoom_desktop_pixelated) + { + screen_info->transform.matrix[0][0] <<= 1; + screen_info->transform.matrix[1][1] <<= 1; + } + else + { + screen_info->transform.matrix[0][0] += 4096; + screen_info->transform.matrix[1][1] += 4096; + } if (screen_info->transform.matrix[0][0] >= (1 << 16)) { diff --git a/src/settings.c b/src/settings.c index ccb14319..2c23c2ca 100644 --- a/src/settings.c +++ b/src/settings.c @@ -746,6 +746,7 @@ loadSettings (ScreenInfo *screen_info) {"wrap_windows", NULL, G_TYPE_BOOLEAN, TRUE}, {"wrap_workspaces", NULL, G_TYPE_BOOLEAN, TRUE}, {"zoom_desktop", NULL, G_TYPE_BOOLEAN, TRUE}, + {"zoom_desktop_pixelated", NULL, G_TYPE_BOOLEAN, TRUE}, {NULL, NULL, G_TYPE_INVALID, FALSE} }; @@ -850,6 +851,8 @@ loadSettings (ScreenInfo *screen_info) getBoolValue ("wrap_workspaces", rc); screen_info->params->zoom_desktop = getBoolValue ("zoom_desktop", rc); + screen_info->params->zoom_desktop_pixelated = + getBoolValue ("zoom_desktop_pixelated", rc); screen_info->params->wrap_layout = getBoolValue ("wrap_layout", rc); @@ -1301,6 +1304,10 @@ cb_xfwm4_channel_property_changed(XfconfChannel *channel, const gchar *property_ { screen_info->params->zoom_desktop = g_value_get_boolean (value); } + else if (!strcmp (name, "zoom_desktop_pixelated")) + { + screen_info->params->zoom_desktop_pixelated = g_value_get_boolean (value); + } else if (!strcmp (name, "wrap_windows")) { screen_info->params->wrap_windows = g_value_get_boolean (value); diff --git a/src/settings.h b/src/settings.h index f20c6db4..e359ddd7 100644 --- a/src/settings.h +++ b/src/settings.h @@ -245,6 +245,7 @@ struct _XfwmParams gboolean wrap_windows; gboolean wrap_workspaces; gboolean zoom_desktop; + gboolean zoom_desktop_pixelated; }; gboolean loadSettings (ScreenInfo *); -- 2.21.0