diff --git a/include/data.h b/include/data.h index 1f4e1d0f..a31b6982 100644 --- a/include/data.h +++ b/include/data.h @@ -161,6 +161,9 @@ struct Workspace { int current_row; int current_col; + /* Should clients on this workspace be automatically floating? */ + bool auto_float; + Client *fullscreen_client; /* The focus stack contains the clients in the correct order of focus so that diff --git a/src/commands.c b/src/commands.c index 3300d1f8..d809c81a 100644 --- a/src/commands.c +++ b/src/commands.c @@ -854,8 +854,31 @@ void parse_command(xcb_connection_t *conn, const char *command) { return; } + enum { WITH_WINDOW, WITH_CONTAINER, WITH_WORKSPACE } with = WITH_WINDOW; + + /* Is it a ? */ + if (command[0] == 'w') { + command++; + /* TODO: implement */ + if (command[0] == 'c') { + with = WITH_CONTAINER; + command++; + } else if (command[0] == 'w') { + with = WITH_WORKSPACE; + command++; + } else { + LOG("not yet implemented.\n"); + return; + } + } + /* Is it 't' for toggle tiling/floating? */ if (command[0] == 't') { + if (with == WITH_WORKSPACE) { + c_ws->auto_float = !c_ws->auto_float; + LOG("autofloat is now %d\n", c_ws->auto_float); + return; + } if (last_focused == NULL) { LOG("Cannot toggle tiling/floating: workspace empty\n"); return; @@ -873,21 +896,6 @@ void parse_command(xcb_connection_t *conn, const char *command) { return; } - enum { WITH_WINDOW, WITH_CONTAINER } with = WITH_WINDOW; - - /* Is it a ? */ - if (command[0] == 'w') { - command++; - /* TODO: implement */ - if (command[0] == 'c') { - with = WITH_CONTAINER; - command++; - } else { - LOG("not yet implemented.\n"); - return; - } - } - /* It’s a normal */ char *rest = NULL; enum { ACTION_FOCUS, ACTION_MOVE, ACTION_SNAP } action = ACTION_FOCUS; diff --git a/src/manage.c b/src/manage.c index f4edc055..aebfe546 100644 --- a/src/manage.c +++ b/src/manage.c @@ -265,10 +265,15 @@ void reparent_window(xcb_connection_t *conn, xcb_window_t child, atom[i] == atoms[_NET_WM_WINDOW_TYPE_SPLASH]) { /* Set the dialog window to automatically floating, will be used below */ new->floating = FLOATING_AUTO_ON; - LOG("dialog window, automatically floating\n"); + LOG("dialog/utility/toolbar/splash window, automatically floating\n"); } } + if (new->workspace->auto_float) { + new->floating = FLOATING_AUTO_ON; + LOG("workspace is in autofloat mode, setting floating\n"); + } + if (new->dock) { /* Get _NET_WM_STRUT_PARTIAL to determine the client’s requested height */ uint32_t *strut;