Handle fullscreen state in apply_layout

This commit is contained in:
Bastien Dejean 2013-06-08 18:31:55 +02:00
parent ad44ed1565
commit 12403a5081
7 changed files with 58 additions and 51 deletions

View file

@ -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);

View file

@ -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
View file

@ -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
View file

@ -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 *);

View file

@ -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);

View file

@ -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)

View file

@ -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);