Support gapps with varcol

This commit is contained in:
Micah Gorrell 2023-05-14 16:42:18 -06:00
parent 7c4d521f99
commit f5d7ee03c3
2 changed files with 50 additions and 14 deletions

View File

@ -4,8 +4,8 @@ static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will
static const int smartgaps = 1; /* 1 means no outer gap when there is only one window */ static const int smartgaps = 1; /* 1 means no outer gap when there is only one window */
static const int monoclegaps = 0; /* 1 means outer gaps in monocle layout */ static const int monoclegaps = 0; /* 1 means outer gaps in monocle layout */
static const unsigned int borderpx = 1; /* border pixel of windows */ static const unsigned int borderpx = 1; /* border pixel of windows */
static const unsigned int gappih = 10; /* horiz inner gap between windows */ static const unsigned int gappih = 20; /* horiz inner gap between windows */
static const unsigned int gappiv = 10; /* vert inner gap between windows */ static const unsigned int gappiv = 20; /* vert inner gap between windows */
static const unsigned int gappoh = 0; /* horiz outer gap between windows and screen edge */ static const unsigned int gappoh = 0; /* horiz outer gap between windows and screen edge */
static const unsigned int gappov = 0; /* vert outer gap between windows and screen edge */ static const unsigned int gappov = 0; /* vert outer gap between windows and screen edge */
static const float bordercolor[] = {0.5, 0.5, 0.5, 1.0}; static const float bordercolor[] = {0.5, 0.5, 0.5, 1.0};

View File

@ -27,16 +27,24 @@ static const float colfact[3] = { 0.1, 0.6, 0.3 };
offset The offset of this client within the column offset The offset of this client within the column
count The number of clients in the column count The number of clients in the column
*/ */
static void placeClientInColumn(Monitor *m, Client *c, int w, int x, int offset, int count) static void placeClientInColumn(Monitor *m, Client *c, int w, int x, int offset, int count, int totaln)
{ {
struct wlr_box geom = {0}; struct wlr_box geom = {0};
int monheight = m->w.height;
if (totaln > 1) {
monheight -= (2 * m->gappov);
}
geom.width = w; geom.width = w;
geom.height = floor(m->w.height / count); geom.height = floor(monheight / count);
geom.x = x; geom.x = x;
geom.y = m->w.y + (offset * geom.height); geom.y = m->w.y + (offset * geom.height);
/* Adjust the height to account for gapps AFTER adjusting the y position */
geom.height -= m->gappiv;
resize(c, geom, False); resize(c, geom, False);
} }
@ -50,8 +58,8 @@ static void placeClientInColumn(Monitor *m, Client *c, int w, int x, int offset,
*/ */
void varcol(Monitor *m) void varcol(Monitor *m)
{ {
int masterw, leftw, rightw, x; int masterw, leftw, rightw, x, monwidth;
unsigned int i, leftn, rightn, mastern, coln, offset; unsigned int i, leftn, rightn, mastern, totaln, coln, offset;
float colfacts; float colfacts;
Client *c, *tmp; Client *c, *tmp;
int nmastercols = m->nmastercols; int nmastercols = m->nmastercols;
@ -89,7 +97,7 @@ void varcol(Monitor *m)
} }
/* Count the windows for each column type */ /* Count the windows for each column type */
leftn = rightn = mastern = 0; totaln = leftn = rightn = mastern = 0;
wl_list_for_each(c, &clients, link) { wl_list_for_each(c, &clients, link) {
if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) { if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) {
continue; continue;
@ -102,6 +110,8 @@ void varcol(Monitor *m)
} else { } else {
rightn++; rightn++;
} }
totaln++;
} }
nmastercols = MAX(MIN(mastern, nmastercols), 1); nmastercols = MAX(MIN(mastern, nmastercols), 1);
@ -131,10 +141,27 @@ void varcol(Monitor *m)
} }
} }
/* Calculate the usable width, with gapps removed */
monwidth = m->w.width;
if (rightn > 0) {
/* Gap to the left of reach right column */
monwidth -= m->gappih * nrightcols;
}
if (leftn > 0) {
/* Gap on the right of the left column */
monwidth -= m->gappih;
}
if (totaln > 1) {
/* Outer gaps */
monwidth -= (2 * m->gappoh);
}
/* Calculate the width for each column type */ /* Calculate the width for each column type */
leftw = (m->w.width / colfacts) * m->colfact[0]; leftw = (monwidth / colfacts) * m->colfact[0];
masterw = (m->w.width / colfacts) * m->colfact[1]; masterw = (monwidth / colfacts) * m->colfact[1];
rightw = (m->w.width / colfacts) * m->colfact[2]; rightw = (monwidth / colfacts) * m->colfact[2];
/* Adjust right and left column to fit all clients */ /* Adjust right and left column to fit all clients */
wl_list_for_each(c, &clients, link) { wl_list_for_each(c, &clients, link) {
@ -171,6 +198,10 @@ void varcol(Monitor *m)
x = m->w.x; x = m->w.x;
if (leftn > 0) { if (leftn > 0) {
x += leftw; x += leftw;
x += m->gappih;
}
if (totaln > 1) {
x += m->gappoh;
} }
i = 0; i = 0;
@ -193,11 +224,12 @@ void varcol(Monitor *m)
/* Max number of items in each master column */ /* Max number of items in each master column */
coln = ceil((float) mastern / nmastercols); coln = ceil((float) mastern / nmastercols);
placeClientInColumn(m, c, masterw, x, offset % coln, coln); placeClientInColumn(m, c, masterw, x, offset % coln, coln, totaln);
/* Only increment x if this is the last client in this column */ /* Only increment x if this is the last client in this column */
if ((++offset % coln) == 0) { if ((++offset % coln) == 0) {
x += masterw; x += masterw;
x += m->gappih;
} }
} else if (!isleft(c)) { } else if (!isleft(c)) {
/* Right columns */ /* Right columns */
@ -208,15 +240,19 @@ void varcol(Monitor *m)
/* Max number of items in each right column */ /* Max number of items in each right column */
coln = ceil((float) rightn / nrightcols); coln = ceil((float) rightn / nrightcols);
placeClientInColumn(m, c, rightw, x, offset % coln, coln); placeClientInColumn(m, c, rightw, x, offset % coln, coln, totaln);
/* Only increment x if this is the last client in this column */ /* Only increment x if this is the last client in this column */
if ((++offset % coln) == 0) { if ((++offset % coln) == 0) {
x += rightw; x += rightw;
x += m->gappih;
} }
} else if (leftn > 0) { } else if (leftn > 0) {
/* left column */ /* left column */
x = m->w.x; x = m->w.x;
if (totaln > 1) {
x += m->gappoh;
}
/* Offset within the section */ /* Offset within the section */
offset = i - (mastern + rightn); offset = i - (mastern + rightn);
@ -224,7 +260,7 @@ void varcol(Monitor *m)
/* There is only one left column */ /* There is only one left column */
coln = leftn; coln = leftn;
placeClientInColumn(m, c, leftw, x, offset, leftn); placeClientInColumn(m, c, leftw, x, offset, leftn, totaln);
} }
i++; i++;