From 1bd0871daffbe1556a079f0ea60acbd77b8e27c7 Mon Sep 17 00:00:00 2001 From: bakkeby Date: Sat, 28 Mar 2020 21:28:17 +0100 Subject: [PATCH] Adding two new variants of gappless grid to flextile as well as making horizgrid pixel perfect --- patch/flextile-deluxe.c | 77 ++++++++++++++++++++++++++++------------- patch/flextile-deluxe.h | 26 ++++++++------ 2 files changed, 69 insertions(+), 34 deletions(-) diff --git a/patch/flextile-deluxe.c b/patch/flextile-deluxe.c index 8105b47..529c752 100644 --- a/patch/flextile-deluxe.c +++ b/patch/flextile-deluxe.c @@ -29,6 +29,8 @@ static const TileArranger flextiles[] = { { arrange_left_to_right }, { arrange_monocle }, { arrange_gapplessgrid }, + { arrange_gapplessgrid_alt1 }, + { arrange_gapplessgrid_alt2 }, { arrange_gridmode }, { arrange_horizgrid }, { arrange_dwindle }, @@ -325,6 +327,9 @@ arrange_left_to_right(Monitor *m, int x, int y, int h, int w, int ih, int iv, in float facts, fact = 1; Client *c; + if (ai + an > n) + an = n - ai; + w -= iv * (an - 1); getfactsforrange(m, an, ai, w, &rest, &facts); for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) { @@ -345,6 +350,9 @@ arrange_top_to_bottom(Monitor *m, int x, int y, int h, int w, int ih, int iv, in float facts, fact = 1; Client *c; + if (ai + an > n) + an = n - ai; + h -= ih * (an - 1); getfactsforrange(m, an, ai, h, &rest, &facts); for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) { @@ -396,8 +404,7 @@ arrange_gridmode(Monitor *m, int x, int y, int h, int w, int ih, int iv, int n, static void arrange_horizgrid(Monitor *m, int x, int y, int h, int w, int ih, int iv, int n, int an, int ai) { - int ntop, nbottom, i; - Client *c; + int ntop, nbottom, rh, rest; /* Exception when there is only one client; don't split into two rows */ if (an == 1) { @@ -407,28 +414,10 @@ arrange_horizgrid(Monitor *m, int x, int y, int h, int w, int ih, int iv, int n, ntop = an / 2; nbottom = an - ntop; - for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) { - if (i >= ai && i < (ai + an)) { - if ((i - ai) < ntop) - resize( - c, - x + (i - ai) * ((w - iv*(ntop - 1)) / ntop + iv), - y, - (w - iv*(ntop - 1)) / ntop - (2*c->bw), - (h - ih) / 2 - (2*c->bw), - False - ); - else - resize( - c, - x + (i - ai - ntop) * ((w - iv*(nbottom - 1)) / nbottom + iv), - y + ih + (h - ih) / 2, - (w - iv*(nbottom - 1)) / nbottom - (2*c->bw), - (h - ih) / 2 - (2*c->bw), - False - ); - } - } + rh = (h - ih) / 2; + rest = h - ih - rh * 2; + arrange_left_to_right(m, x, y, rh + rest, w, ih, iv, n, ntop, ai); + arrange_left_to_right(m, x, y + rh + ih + rest, rh, w, ih, iv, n, nbottom, ai + ntop); } static void @@ -466,6 +455,46 @@ arrange_gapplessgrid(Monitor *m, int x, int y, int h, int w, int ih, int iv, int } } +/* This version of gappless grid fills rows first */ +static void +arrange_gapplessgrid_alt1(Monitor *m, int x, int y, int h, int w, int ih, int iv, int n, int an, int ai) +{ + int i, cols, rows, rest, ch; + + /* grid dimensions */ + for (cols = 1; cols <= an/2; cols++) + if (cols*cols >= an) + break; + rows = (cols && (cols - 1) * cols >= an) ? cols - 1 : cols; + ch = (h - ih * (rows - 1)) / (rows ? rows : 1); + rest = (h - ih * (rows - 1)) - ch * rows; + + for (i = 0; i < rows; i++) { + arrange_left_to_right(m, x, y, ch + (i < rest ? 1 : 0), w, ih, iv, n, cols, ai + i*cols); + y += ch + (i < rest ? 1 : 0) + ih; + } +} + +/* This version of gappless grid fills columns first */ +static void +arrange_gapplessgrid_alt2(Monitor *m, int x, int y, int h, int w, int ih, int iv, int n, int an, int ai) +{ + int i, cols, rows, rest, cw; + + /* grid dimensions */ + for (rows = 0; rows <= an/2; rows++) + if (rows*rows >= an) + break; + cols = (rows && (rows - 1) * rows >= an) ? rows - 1 : rows; + cw = (w - iv * (cols - 1)) / (cols ? cols : 1); + rest = (w - iv * (cols - 1)) - cw * cols; + + for (i = 0; i < cols; i++) { + arrange_top_to_bottom(m, x, y, h, cw + (i < rest ? 1 : 0), ih, iv, n, rows, ai + i*rows); + x += cw + (i < rest ? 1 : 0) + iv; + } +} + static void arrange_fibonacci(Monitor *m, int x, int y, int h, int w, int ih, int iv, int n, int an, int ai, int s) { diff --git a/patch/flextile-deluxe.h b/patch/flextile-deluxe.h index db78483..b0aadd4 100644 --- a/patch/flextile-deluxe.h +++ b/patch/flextile-deluxe.h @@ -30,6 +30,8 @@ static void arrange_left_to_right(Monitor *m, int ax, int ay, int ah, int aw, in static void arrange_top_to_bottom(Monitor *m, int ax, int ay, int ah, int aw, int ih, int iv, int n, int an, int ai); static void arrange_monocle(Monitor *m, int ax, int ay, int ah, int aw, int ih, int iv, int n, int an, int ai); static void arrange_gapplessgrid(Monitor *m, int ax, int ay, int ah, int aw, int ih, int iv, int n, int an, int ai); +static void arrange_gapplessgrid_alt1(Monitor *m, int ax, int ay, int ah, int aw, int ih, int iv, int n, int an, int ai); +static void arrange_gapplessgrid_alt2(Monitor *m, int ax, int ay, int ah, int aw, int ih, int iv, int n, int an, int ai); static void arrange_gridmode(Monitor *m, int ax, int ay, int ah, int aw, int ih, int iv, int n, int an, int ai); static void arrange_horizgrid(Monitor *m, int ax, int ay, int ah, int aw, int ih, int iv, int n, int an, int ai); static void arrange_dwindle(Monitor *m, int ax, int ay, int ah, int aw, int ih, int iv, int n, int an, int ai); @@ -84,14 +86,16 @@ static char layoutsymb[] = { /* Tile arrangements */ enum { - TOP_TO_BOTTOM, // clients are stacked vertically - LEFT_TO_RIGHT, // clients are stacked horizontally - MONOCLE, // clients are stacked in deck / monocle mode - GAPPLESSGRID, // clients are stacked in a gappless grid - GRIDMODE, // clients are stacked in a grid - HORIZGRID, // clients are stacked in a grid - DWINDLE, // clients are stacked in fibonacci dwindle mode - SPIRAL, // clients are stacked in fibonacci spiral mode + TOP_TO_BOTTOM, // clients are arranged vertically + LEFT_TO_RIGHT, // clients are arranged horizontally + MONOCLE, // clients are arranged in deck / monocle mode + GAPPLESSGRID, // clients are arranged in a gappless grid (original formula) + GAPPLESSGRID_ALT1, // clients are arranged in a gappless grid (alt. 1, fills rows first) + GAPPLESSGRID_ALT2, // clients are arranged in a gappless grid (alt. 2, fills columns first) + GRIDMODE, // clients are arranged in a grid + HORIZGRID, // clients are arranged in a horizontal grid + DWINDLE, // clients are arranged in fibonacci dwindle mode + SPIRAL, // clients are arranged in fibonacci spiral mode AXIS_LAST, }; @@ -99,9 +103,11 @@ static char tilesymb[] = { 61, // "=", 124, // "|", 68, // "D", + 71, // "G", + 49, // "1", + 50, // "2" 35, // "#", - 35, // "#", - 35, // "#", + 126, // "~", 92, // "\\", 64, // "@", };