mirror of
https://github.com/vale981/bspwm
synced 2025-03-05 18:01:37 -05:00
Handle fullscreen state in apply_layout
This commit is contained in:
parent
ad44ed1565
commit
12403a5081
7 changed files with 58 additions and 51 deletions
12
events.c
12
events.c
|
@ -211,8 +211,10 @@ void client_message(xcb_generic_event_t *evt)
|
|||
handle_state(loc.monitor, loc.desktop, loc.node, e->data.data32[1], e->data.data32[0]);
|
||||
handle_state(loc.monitor, loc.desktop, loc.node, e->data.data32[2], e->data.data32[0]);
|
||||
} else if (e->type == ewmh->_NET_ACTIVE_WINDOW) {
|
||||
if (loc.desktop->focus->client->fullscreen && loc.desktop->focus != loc.node)
|
||||
toggle_fullscreen(loc.monitor, loc.desktop, loc.desktop->focus);
|
||||
if (loc.desktop->focus->client->fullscreen && loc.desktop->focus != loc.node) {
|
||||
toggle_fullscreen(loc.desktop, loc.desktop->focus);
|
||||
arrange(loc.monitor, loc.desktop);
|
||||
}
|
||||
focus_node(loc.monitor, loc.desktop, loc.node);
|
||||
}
|
||||
}
|
||||
|
@ -253,8 +255,10 @@ void handle_state(monitor_t *m, desktop_t *d, node_t *n, xcb_atom_t state, unsig
|
|||
bool fs = n->client->fullscreen;
|
||||
if (action == XCB_EWMH_WM_STATE_TOGGLE
|
||||
|| (fs && action == XCB_EWMH_WM_STATE_REMOVE)
|
||||
|| (!fs && action == XCB_EWMH_WM_STATE_ADD))
|
||||
toggle_fullscreen(m, d, n);
|
||||
|| (!fs && action == XCB_EWMH_WM_STATE_ADD)) {
|
||||
toggle_fullscreen(d, n);
|
||||
arrange(m, d);
|
||||
}
|
||||
} else if (state == ewmh->_NET_WM_STATE_DEMANDS_ATTENTION) {
|
||||
if (action == XCB_EWMH_WM_STATE_ADD)
|
||||
set_urgency(m, d, n, true);
|
||||
|
|
23
messages.c
23
messages.c
|
@ -95,29 +95,25 @@ void process_message(char *msg, char *rsp)
|
|||
} else if (strcmp(cmd, "layout") == 0) {
|
||||
char *lyt = strtok(NULL, TOK_SEP);
|
||||
if (lyt != NULL) {
|
||||
layout_t y;
|
||||
if (parse_layout(lyt, &y)) {
|
||||
layout_t l;
|
||||
if (parse_layout(lyt, &l)) {
|
||||
char *name = strtok(NULL, TOK_SEP);
|
||||
if (name == NULL) {
|
||||
mon->desk->layout = y;
|
||||
change_layout(mon, mon->desk, l);
|
||||
} else {
|
||||
desktop_location_t loc;
|
||||
do {
|
||||
if (locate_desktop(name, &loc))
|
||||
loc.desktop->layout = y;
|
||||
change_layout(loc.monitor, loc.desktop, l);
|
||||
} while ((name = strtok(NULL, TOK_SEP)) != NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
put_status();
|
||||
arrange(mon, mon->desk);
|
||||
} else if (strcmp(cmd, "cycle_layout") == 0) {
|
||||
if (mon->desk->layout == LAYOUT_MONOCLE)
|
||||
mon->desk->layout = LAYOUT_TILED;
|
||||
change_layout(mon, mon->desk, LAYOUT_TILED);
|
||||
else
|
||||
mon->desk->layout = LAYOUT_MONOCLE;
|
||||
put_status();
|
||||
arrange(mon, mon->desk);
|
||||
change_layout(mon, mon->desk, LAYOUT_MONOCLE);
|
||||
} else if (strcmp(cmd, "shift") == 0) {
|
||||
char *dir = strtok(NULL, TOK_SEP);
|
||||
if (dir != NULL) {
|
||||
|
@ -127,14 +123,13 @@ void process_message(char *msg, char *rsp)
|
|||
}
|
||||
arrange(mon, mon->desk);
|
||||
} else if (strcmp(cmd, "toggle_fullscreen") == 0) {
|
||||
if (mon->desk->focus != NULL)
|
||||
toggle_fullscreen(mon, mon->desk, mon->desk->focus);
|
||||
toggle_fullscreen(mon->desk, mon->desk->focus);
|
||||
arrange(mon, mon->desk);
|
||||
} else if (strcmp(cmd, "toggle_floating") == 0) {
|
||||
toggle_floating(mon->desk, mon->desk->focus);
|
||||
arrange(mon, mon->desk);
|
||||
} else if (strcmp(cmd, "toggle_locked") == 0) {
|
||||
if (mon->desk->focus != NULL)
|
||||
toggle_locked(mon, mon->desk, mon->desk->focus);
|
||||
toggle_locked(mon, mon->desk, mon->desk->focus);
|
||||
} else if (strcmp(cmd, "toggle_visibility") == 0) {
|
||||
toggle_visibility();
|
||||
} else if (strcmp(cmd, "pad") == 0) {
|
||||
|
|
47
tree.c
47
tree.c
|
@ -23,7 +23,7 @@ bool is_tiled(client_t *c)
|
|||
{
|
||||
if (c == NULL)
|
||||
return false;
|
||||
return (!c->floating && !c->transient && !c->fullscreen);
|
||||
return (!c->floating && !c->fullscreen);
|
||||
}
|
||||
|
||||
bool is_floating(client_t *c)
|
||||
|
@ -48,6 +48,14 @@ void change_split_ratio(node_t *n, value_change_t chg)
|
|||
n->split_ratio = pow(n->split_ratio, (chg == CHANGE_INCREASE ? INC_EXP : DEC_EXP));
|
||||
}
|
||||
|
||||
void change_layout(monitor_t *m, desktop_t *d, layout_t l)
|
||||
{
|
||||
d->layout = l;
|
||||
arrange(m, d);
|
||||
if (d == mon->desk)
|
||||
put_status();
|
||||
}
|
||||
|
||||
node_t *first_extrema(node_t *n)
|
||||
{
|
||||
if (n == NULL)
|
||||
|
@ -362,8 +370,6 @@ void apply_layout(monitor_t *m, desktop_t *d, node_t *n, xcb_rectangle_t rect, x
|
|||
n->rectangle = rect;
|
||||
|
||||
if (is_leaf(n)) {
|
||||
if (n->client->fullscreen)
|
||||
return;
|
||||
|
||||
if (is_floating(n->client) && n->client->border_width != border_width) {
|
||||
int ds = 2 * (border_width - n->client->border_width);
|
||||
|
@ -371,24 +377,32 @@ void apply_layout(monitor_t *m, desktop_t *d, node_t *n, xcb_rectangle_t rect, x
|
|||
n->client->floating_rectangle.height += ds;
|
||||
}
|
||||
|
||||
if (borderless_monocle && is_tiled(n->client) && d->layout == LAYOUT_MONOCLE)
|
||||
if ((borderless_monocle && is_tiled(n->client) && d->layout == LAYOUT_MONOCLE) ||
|
||||
n->client->fullscreen)
|
||||
n->client->border_width = 0;
|
||||
else
|
||||
n->client->border_width = border_width;
|
||||
|
||||
xcb_rectangle_t r;
|
||||
if (is_tiled(n->client)) {
|
||||
if (d->layout == LAYOUT_TILED)
|
||||
r = rect;
|
||||
else if (d->layout == LAYOUT_MONOCLE)
|
||||
r = root_rect;
|
||||
int wg = (gapless_monocle && d->layout == LAYOUT_MONOCLE ? 0 : window_gap);
|
||||
int bleed = wg + 2 * n->client->border_width;
|
||||
r.width = (bleed < r.width ? r.width - bleed : 1);
|
||||
r.height = (bleed < r.height ? r.height - bleed : 1);
|
||||
n->client->tiled_rectangle = r;
|
||||
if (!n->client->fullscreen) {
|
||||
if (!n->client->floating) {
|
||||
/* tiled clients */
|
||||
if (d->layout == LAYOUT_TILED)
|
||||
r = rect;
|
||||
else if (d->layout == LAYOUT_MONOCLE)
|
||||
r = root_rect;
|
||||
int wg = (gapless_monocle && d->layout == LAYOUT_MONOCLE ? 0 : window_gap);
|
||||
int bleed = wg + 2 * n->client->border_width;
|
||||
r.width = (bleed < r.width ? r.width - bleed : 1);
|
||||
r.height = (bleed < r.height ? r.height - bleed : 1);
|
||||
n->client->tiled_rectangle = r;
|
||||
} else {
|
||||
/* floating clients */
|
||||
r = n->client->floating_rectangle;
|
||||
}
|
||||
} else {
|
||||
r = n->client->floating_rectangle;
|
||||
/* fullscreen clients */
|
||||
r = m->rectangle;
|
||||
}
|
||||
|
||||
window_move_resize(n->client->window, r.x, r.y, r.width, r.height);
|
||||
|
@ -739,9 +753,6 @@ void transfer_node(monitor_t *ms, desktop_t *ds, monitor_t *md, desktop_t *dd, n
|
|||
|
||||
fit_monitor(md, n->client);
|
||||
|
||||
if (n->client->fullscreen)
|
||||
window_move_resize(n->client->window, md->rectangle.x, md->rectangle.y, md->rectangle.width, md->rectangle.height);
|
||||
|
||||
if (ds != ms->desk && dd == md->desk)
|
||||
window_show(n->client->window);
|
||||
|
||||
|
|
1
tree.h
1
tree.h
|
@ -10,6 +10,7 @@ bool is_floating(client_t *);
|
|||
bool is_first_child(node_t *);
|
||||
bool is_second_child(node_t *);
|
||||
void change_split_ratio(node_t *, value_change_t);
|
||||
void change_layout(monitor_t *, desktop_t *, layout_t);
|
||||
node_t *first_extrema(node_t *);
|
||||
node_t *second_extrema(node_t *);
|
||||
node_t *next_leaf(node_t *, node_t *);
|
||||
|
|
2
types.c
2
types.c
|
@ -103,8 +103,6 @@ void transfer_desktop(monitor_t *ms, monitor_t *md, desktop_t *d)
|
|||
}
|
||||
for (node_t *n = first_extrema(d->root); n != NULL; n = next_leaf(n, d->root))
|
||||
fit_monitor(md, n->client);
|
||||
if (d->focus != NULL && d->focus->client->fullscreen)
|
||||
window_move_resize(d->focus->client->window, md->rectangle.x, md->rectangle.y, md->rectangle.width, md->rectangle.height);
|
||||
arrange(md, d);
|
||||
if (d != dd && md->desk == d) {
|
||||
desktop_show(d);
|
||||
|
|
22
window.c
22
window.c
|
@ -160,10 +160,10 @@ void manage_window(monitor_t *m, desktop_t *d, xcb_window_t win)
|
|||
toggle_floating(d, n);
|
||||
|
||||
if (d->focus != NULL && d->focus->client->fullscreen)
|
||||
toggle_fullscreen(m, d, d->focus);
|
||||
toggle_fullscreen(d, d->focus);
|
||||
|
||||
if (fullscreen)
|
||||
toggle_fullscreen(m, d, n);
|
||||
toggle_fullscreen(d, n);
|
||||
|
||||
if (is_tiled(c))
|
||||
window_lower(c->window);
|
||||
|
@ -340,8 +340,11 @@ void window_kill(desktop_t *d, node_t *n)
|
|||
remove_node(d, n);
|
||||
}
|
||||
|
||||
void toggle_fullscreen(monitor_t *m, desktop_t *d, node_t *n)
|
||||
void toggle_fullscreen(desktop_t *d, node_t *n)
|
||||
{
|
||||
if (n == NULL)
|
||||
return;
|
||||
|
||||
client_t *c = n->client;
|
||||
|
||||
PRINTF("toggle fullscreen %X\n", c->window);
|
||||
|
@ -350,19 +353,12 @@ void toggle_fullscreen(monitor_t *m, desktop_t *d, node_t *n)
|
|||
c->fullscreen = false;
|
||||
xcb_atom_t values[] = {XCB_NONE};
|
||||
xcb_ewmh_set_wm_state(ewmh, c->window, LENGTH(values), values);
|
||||
xcb_rectangle_t rect = get_rectangle(c);
|
||||
window_border_width(c->window, c->border_width);
|
||||
window_move_resize(c->window, rect.x, rect.y, rect.width, rect.height);
|
||||
window_draw_border(n, d->focus == n, mon == m);
|
||||
stack(d, n);
|
||||
} else {
|
||||
c->fullscreen = true;
|
||||
xcb_atom_t values[] = {ewmh->_NET_WM_STATE_FULLSCREEN};
|
||||
xcb_ewmh_set_wm_state(ewmh, c->window, LENGTH(values), values);
|
||||
window_raise(c->window);
|
||||
window_border_width(c->window, 0);
|
||||
xcb_rectangle_t rect = m->rectangle;
|
||||
window_move_resize(c->window, rect.x, rect.y, rect.width, rect.height);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -390,6 +386,9 @@ void toggle_floating(desktop_t *d, node_t *n)
|
|||
|
||||
void toggle_locked(monitor_t *m, desktop_t *d, node_t *n)
|
||||
{
|
||||
if (n == NULL)
|
||||
return;
|
||||
|
||||
client_t *c = n->client;
|
||||
|
||||
PRINTF("toggle locked %X\n", c->window);
|
||||
|
@ -403,9 +402,8 @@ void set_urgency(monitor_t *m, desktop_t *d, node_t *n, bool value)
|
|||
if (value && mon->desk->focus == n)
|
||||
return;
|
||||
n->client->urgent = value;
|
||||
window_draw_border(n, d->focus == n, m == mon);
|
||||
put_status();
|
||||
if (m->desk == d)
|
||||
arrange(m, d);
|
||||
}
|
||||
|
||||
void set_shadow(xcb_window_t win, uint32_t value)
|
||||
|
|
2
window.h
2
window.h
|
@ -25,7 +25,7 @@ void query_pointer(xcb_window_t *, xcb_point_t *);
|
|||
void list_windows(char *);
|
||||
void window_close(node_t *);
|
||||
void window_kill(desktop_t *, node_t *);
|
||||
void toggle_fullscreen(monitor_t *, desktop_t *, node_t *);
|
||||
void toggle_fullscreen(desktop_t *, node_t *);
|
||||
void toggle_floating(desktop_t *, node_t *);
|
||||
void toggle_locked(monitor_t *, desktop_t *, node_t *);
|
||||
void set_urgency(monitor_t *, desktop_t *, node_t *, bool);
|
||||
|
|
Loading…
Add table
Reference in a new issue