From 12403a50816b3eacdf505bcc3ea1d0868ad86bb0 Mon Sep 17 00:00:00 2001 From: Bastien Dejean Date: Sat, 8 Jun 2013 18:31:55 +0200 Subject: [PATCH] Handle fullscreen state in `apply_layout` --- events.c | 12 ++++++++---- messages.c | 23 +++++++++-------------- tree.c | 47 +++++++++++++++++++++++++++++------------------ tree.h | 1 + types.c | 2 -- window.c | 22 ++++++++++------------ window.h | 2 +- 7 files changed, 58 insertions(+), 51 deletions(-) diff --git a/events.c b/events.c index fec76a8..c653399 100644 --- a/events.c +++ b/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); diff --git a/messages.c b/messages.c index 5668238..7551d85 100644 --- a/messages.c +++ b/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) { diff --git a/tree.c b/tree.c index c42d20b..82775b6 100644 --- a/tree.c +++ b/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); diff --git a/tree.h b/tree.h index e6750d7..360b269 100644 --- a/tree.h +++ b/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 *); diff --git a/types.c b/types.c index d181d9d..778aa9d 100644 --- a/types.c +++ b/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); diff --git a/window.c b/window.c index 2b019ac..91ab153 100644 --- a/window.c +++ b/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) diff --git a/window.h b/window.h index 1d465b4..1e93305 100644 --- a/window.h +++ b/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);