Allow to remove borders and gaps for single fullscreen window

This commit is contained in:
Alex Kotov 2021-11-16 06:05:22 +05:00
parent 125f209926
commit bf0295a721
Signed by: kotovalexarian
GPG Key ID: 553C0EBBEB5D5F08
5 changed files with 101 additions and 29 deletions

View File

@ -17,6 +17,7 @@ options:
%.o: %.c
${CC} -c $< -o $@ ${CFLAGS}
dwm.o: dwm/layouts.c dwm/swallow.c dwm/systray.c
${OBJ}: atoms.h drw.h config.def.h config.mk layouts.h settings.h spawn.h tags.h util.h
polytreewm: ${OBJ}

2
dwm.c
View File

@ -1914,10 +1914,12 @@ setfullscreen(Client *c, int fullscreen)
XChangeProperty(dpy, c->win, atoms->netatom[NetWMState], XA_ATOM, 32,
PropModeReplace, (unsigned char*)&atoms->netatom[NetWMFullscreen], 1);
c->isfullscreen = 1;
arrange(c->mon);
} else if (!fullscreen && c->isfullscreen){
XChangeProperty(dpy, c->win, atoms->netatom[NetWMState], XA_ATOM, 32,
PropModeReplace, (unsigned char*)0, 0);
c->isfullscreen = 0;
arrange(c->mon);
}
}

View File

@ -20,16 +20,39 @@ centeredmaster(Monitor *m)
}
}
const bool enable_gap_for_single_window = settings_get_enable_gap_for_single_window();
const int gap_size = (n > 1 || enable_gap_for_single_window) ? settings_get_gap_size() : 0;
const SettingsForSingleWindow gap_for_single_window = settings_get_gap_for_single_window();
const SettingsForSingleWindow border_for_single_window = settings_get_border_for_single_window();
const int gap_size = (
n > 1
||
gap_for_single_window == SETTINGS_FOR_SINGLE_WINDOW_ALWAYS
||
(
gap_for_single_window == SETTINGS_FOR_SINGLE_WINDOW_NOT_IN_FULLSCREEN
&&
!m->sel->isfullscreen
)
) ? settings_get_gap_size() : 0;
const int border_width = (
n > 1
||
border_for_single_window == SETTINGS_FOR_SINGLE_WINDOW_ALWAYS
||
(
border_for_single_window == SETTINGS_FOR_SINGLE_WINDOW_NOT_IN_FULLSCREEN
&&
!m->sel->isfullscreen
)
) ? settings_get_border_width() : 0;
const int top_left_half_gap = gap_size / 2;
const int bottom_right_half_gap = gap_size - top_left_half_gap;
const bool enable_border_for_single_window = settings_get_enable_border_for_single_window();
const int border_width = (n > 1 || enable_border_for_single_window) ? settings_get_border_width() : 0;
unsigned int oty = 0, ety = 0, my = 0;
Client *c = nexttiled(m->clients);
unsigned int oty = 0, ety = 0, my = 0;
for (unsigned int i = 0; c; c = nexttiled(c->next), ++i) {
if (i < m->nmaster) {
// nmaster clients are stacked vertically,
@ -100,11 +123,28 @@ centeredmaster(Monitor *m)
void
monocle(Monitor *m)
{
const bool enable_gap_for_single_window = settings_get_enable_gap_for_single_window();
const int gap_size = enable_gap_for_single_window ? settings_get_gap_size() : 0;
const SettingsForSingleWindow gap_for_single_window = settings_get_gap_for_single_window();
const SettingsForSingleWindow border_for_single_window = settings_get_border_for_single_window();
const bool enable_border_for_single_window = settings_get_enable_border_for_single_window();
const int border_width = enable_border_for_single_window ? settings_get_border_width() : 0;
const int gap_size = (
gap_for_single_window == SETTINGS_FOR_SINGLE_WINDOW_ALWAYS
||
(
gap_for_single_window == SETTINGS_FOR_SINGLE_WINDOW_NOT_IN_FULLSCREEN
&&
!m->sel->isfullscreen
)
) ? settings_get_gap_size() : 0;
const int border_width = (
border_for_single_window == SETTINGS_FOR_SINGLE_WINDOW_ALWAYS
||
(
border_for_single_window == SETTINGS_FOR_SINGLE_WINDOW_NOT_IN_FULLSCREEN
&&
!m->sel->isfullscreen
)
) ? settings_get_border_width() : 0;
for (Client *c = nexttiled(m->clients); c; c = nexttiled(c->next)) {
resize(
@ -126,17 +166,40 @@ tile(Monitor *m)
for (Client *c = nexttiled(m->clients); c; c = nexttiled(c->next), ++n);
if (n == 0) return;
const bool enable_gap_for_single_window = settings_get_enable_gap_for_single_window();
const int gap_size = (n > 1 || enable_gap_for_single_window) ? settings_get_gap_size() : 0;
const SettingsForSingleWindow gap_for_single_window = settings_get_gap_for_single_window();
const SettingsForSingleWindow border_for_single_window = settings_get_border_for_single_window();
const int gap_size = (
n > 1
||
gap_for_single_window == SETTINGS_FOR_SINGLE_WINDOW_ALWAYS
||
(
gap_for_single_window == SETTINGS_FOR_SINGLE_WINDOW_NOT_IN_FULLSCREEN
&&
!m->sel->isfullscreen
)
) ? settings_get_gap_size() : 0;
const int border_width = (
n > 1
||
border_for_single_window == SETTINGS_FOR_SINGLE_WINDOW_ALWAYS
||
(
border_for_single_window == SETTINGS_FOR_SINGLE_WINDOW_NOT_IN_FULLSCREEN
&&
!m->sel->isfullscreen
)
) ? settings_get_border_width() : 0;
const int top_left_half_gap = gap_size / 2;
const int bottom_right_half_gap = gap_size - top_left_half_gap;
const bool enable_border_for_single_window = settings_get_enable_border_for_single_window();
const int border_width = (n > 1 || enable_border_for_single_window) ? settings_get_border_width() : 0;
const unsigned int mw = n > m->nmaster ? (m->nmaster ? m->ww * m->mfact : 0) : m->ww;
Client *c = nexttiled(m->clients);
for (unsigned int i = 0, my = 0, ty = 0; c; c = nexttiled(c->next), ++i) {
if (i < m->nmaster) {
const unsigned int h = (m->wh - my) / (MIN(n, m->nmaster) - i);

View File

@ -13,8 +13,8 @@
static int border_width = 2;
static int default_clients_in_master = 1;
static bool enable_border_for_single_window = true;
static bool enable_gap_for_single_window = true;
static SettingsForSingleWindow border_for_single_window = SETTINGS_FOR_SINGLE_WINDOW_NOT_IN_FULLSCREEN;
static SettingsForSingleWindow gap_for_single_window = SETTINGS_FOR_SINGLE_WINDOW_NOT_IN_FULLSCREEN;
static bool enable_swallowing = true;
static bool focus_on_wheel = true;
static int gap_size = 10;
@ -48,25 +48,25 @@ void settings_set_default_clients_in_master(int new_default_clients_in_master)
default_clients_in_master = new_default_clients_in_master;
}
bool settings_get_enable_border_for_single_window()
SettingsForSingleWindow settings_get_border_for_single_window()
{
return enable_border_for_single_window;
return border_for_single_window;
}
void settings_set_enable_border_for_single_window(const bool new_enable_border_for_single_window)
void settings_set_border_for_single_window(const SettingsForSingleWindow new_border_for_single_window)
{
enable_border_for_single_window = new_enable_border_for_single_window;
border_for_single_window = new_border_for_single_window;
// TODO: notify WM to rearrange clients
}
bool settings_get_enable_gap_for_single_window()
SettingsForSingleWindow settings_get_gap_for_single_window()
{
return enable_gap_for_single_window;
return gap_for_single_window;
}
void settings_set_enable_gap_for_single_window(const bool new_enable_gap_for_single_window)
void settings_set_gap_for_single_window(const SettingsForSingleWindow new_gap_for_single_window)
{
enable_gap_for_single_window = new_enable_gap_for_single_window;
gap_for_single_window = new_gap_for_single_window;
// TODO: notify WM to rearrange clients
}

View File

@ -3,17 +3,23 @@
#include <stdbool.h>
typedef enum {
SETTINGS_FOR_SINGLE_WINDOW_NEVER,
SETTINGS_FOR_SINGLE_WINDOW_ALWAYS,
SETTINGS_FOR_SINGLE_WINDOW_NOT_IN_FULLSCREEN,
} SettingsForSingleWindow;
int settings_get_border_width();
void settings_set_border_width(int new_border_width);
int settings_get_default_clients_in_master();
void settings_set_default_clients_in_master(int new_default_clients_in_master);
bool settings_get_enable_border_for_single_window();
void settings_set_enable_border_for_single_window(bool new_enable_border_for_single_window);
SettingsForSingleWindow settings_get_border_for_single_window();
void settings_set_border_for_single_window(SettingsForSingleWindow new_border_for_single_window);
bool settings_get_enable_gap_for_single_window();
void settings_set_enable_gap_for_single_window(bool new_enable_gap_for_single_window);
SettingsForSingleWindow settings_get_gap_for_single_window();
void settings_set_gap_for_single_window(SettingsForSingleWindow new_gap_for_single_window);
bool settings_get_enable_swallowing();
void settings_set_enable_swallowing(bool new_enable_swallowing);