Implement putting clients into floating mode at a specific workspace

This changes syntax of the assign command a bit. Old configurations
will continue to work. See the userguide.
This commit is contained in:
Michael Stapelberg 2009-07-21 16:43:20 +02:00
parent 008a2665c1
commit ffcc8bbc3a
4 changed files with 38 additions and 13 deletions

View File

@ -259,13 +259,14 @@ i3 will get the title as soon as the application maps the window (mapping means
actually displaying it on the screen), youd need to have to match on Firefox actually displaying it on the screen), youd need to have to match on Firefox
in this case. in this case.
You can use the special workspace +~+ to specify that matching clients should You can prefix or suffix workspaces with a +~+ to specify that matching clients
be put into floating mode. should be put into floating mode. If you specify only a +~+, the client will
not be put onto any workspace, but will be set floating on the current one.
*Syntax*: *Syntax*:
---------------------------------------------------- ------------------------------------------------------------
assign ["]window class[/window title]["] [→] workspace assign ["]window class[/window title]["] [→] [~ | workspace]
---------------------------------------------------- ------------------------------------------------------------
*Examples*: *Examples*:
---------------------- ----------------------
@ -273,7 +274,8 @@ assign urxvt 2
assign urxvt → 2 assign urxvt → 2
assign "urxvt" → 2 assign "urxvt" → 2
assign "urxvt/VIM" → 3 assign "urxvt/VIM" → 3
assign "gecko" → ~ assign "gecko" → ~4
assign "xv/MPlayer" → ~
---------------------- ----------------------
=== Automatically starting applications on startup === Automatically starting applications on startup

View File

@ -250,7 +250,12 @@ struct Assignment {
/** floating is true if this was an assignment to the special /** floating is true if this was an assignment to the special
* workspace "~". Matching clients will be put into floating mode * workspace "~". Matching clients will be put into floating mode
* automatically. */ * automatically. */
bool floating; enum {
ASSIGN_FLOATING_NO, /* dont float, but put on a workspace */
ASSIGN_FLOATING_ONLY, /* float, but dont assign on a workspace */
ASSIGN_FLOATING /* float and put on a workspace */
} floating;
/** The number of the workspace to assign to. */ /** The number of the workspace to assign to. */
int workspace; int workspace;
TAILQ_ENTRY(Assignment) assignments; TAILQ_ENTRY(Assignment) assignments;

View File

@ -269,17 +269,33 @@ void load_configuration(xcb_connection_t *conn, const char *override_configpath)
die("Malformed assignment, couldn't find target\n"); die("Malformed assignment, couldn't find target\n");
target++; target++;
if (*target != '~' && (atoi(target) < 1 || atoi(target) > 10)) if (strchr(target, '~') == NULL && (atoi(target) < 1 || atoi(target) > 10))
die("Malformed assignment, invalid workspace number\n"); die("Malformed assignment, invalid workspace number\n");
LOG("assignment parsed: \"%s\" to \"%s\"\n", class_title, target); LOG("assignment parsed: \"%s\" to \"%s\"\n", class_title, target);
struct Assignment *new = scalloc(sizeof(struct Assignment)); struct Assignment *new = scalloc(sizeof(struct Assignment));
new->windowclass_title = class_title; new->windowclass_title = class_title;
if (*target == '~') if (strchr(target, '~') != NULL)
new->floating = true; new->floating = ASSIGN_FLOATING_ONLY;
else new->workspace = atoi(target);
while (*target == '~')
target++;
if (atoi(target) >= 1 && atoi(target) <= 10) {
if (new->floating == ASSIGN_FLOATING_ONLY)
new->floating = ASSIGN_FLOATING;
new->workspace = atoi(target);
}
TAILQ_INSERT_TAIL(&assignments, new, assignments); TAILQ_INSERT_TAIL(&assignments, new, assignments);
LOG("Assignment loaded: \"%s\":\n", class_title);
if (new->floating != ASSIGN_FLOATING_ONLY)
LOG(" to workspace %d\n", new->workspace);
if (new->floating != ASSIGN_FLOATING_NO)
LOG(" will be floating\n");
continue; continue;
} }

View File

@ -311,9 +311,11 @@ void reparent_window(xcb_connection_t *conn, xcb_window_t child,
if (get_matching_client(conn, assign->windowclass_title, new) == NULL) if (get_matching_client(conn, assign->windowclass_title, new) == NULL)
continue; continue;
if (assign->floating) { if (assign->floating == ASSIGN_FLOATING_ONLY ||
assign->floating == ASSIGN_FLOATING) {
new->floating = FLOATING_AUTO_ON; new->floating = FLOATING_AUTO_ON;
LOG("Assignment matches, putting client into floating mode\n"); LOG("Assignment matches, putting client into floating mode\n");
if (assign->floating == ASSIGN_FLOATING_ONLY)
break; break;
} }