Implement the special workspace ~ for assignments, which will set clients floating automatically

This commit is contained in:
Michael Stapelberg 2009-06-19 20:20:00 +02:00
parent bcd479ca92
commit 325d1b301f
4 changed files with 18 additions and 3 deletions

View File

@ -237,6 +237,9 @@ 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
in this case.
You can use the special workspace +~+ to specify that matching clients should
be put into floating mode.
*Syntax*:
----------------------------------------------------
assign ["]window class[/window title]["] [→] workspace
@ -248,6 +251,7 @@ assign urxvt 2
assign urxvt → 2
assign "urxvt" → 2
assign "urxvt/VIM" → 3
assign "gecko" → ~
----------------------
=== Automatically starting applications on startup

View File

@ -223,6 +223,9 @@ struct Autostart {
*/
struct Assignment {
char *windowclass_title;
/* floating is true if this was an assignment to the special workspace "~".
* Matching clients will be put into floating mode automatically. */
bool floating;
int workspace;
TAILQ_ENTRY(Assignment) assignments;
};

View File

@ -241,14 +241,16 @@ void load_configuration(xcb_connection_t *conn, const char *override_configpath)
die("Malformed assignment, couldn't find target\n");
target++;
if (atoi(target) < 1 || atoi(target) > 10)
if (*target != '~' && (atoi(target) < 1 || atoi(target) > 10))
die("Malformed assignment, invalid workspace number\n");
LOG("assignment parsed: \"%s\" to \"%s\"\n", class_title, target);
struct Assignment *new = smalloc(sizeof(struct Assignment));
struct Assignment *new = scalloc(sizeof(struct Assignment));
new->windowclass_title = class_title;
new->workspace = atoi(target);
if (*target == '~')
new->floating = true;
else new->workspace = atoi(target);
TAILQ_INSERT_TAIL(&assignments, new, assignments);
continue;
}

View File

@ -315,6 +315,12 @@ void reparent_window(xcb_connection_t *conn, xcb_window_t child,
if (get_matching_client(conn, assign->windowclass_title, new) == NULL)
continue;
if (assign->floating) {
new->floating = FLOATING_AUTO_ON;
LOG("Assignment matches, putting client into floating mode\n");
break;
}
LOG("Assignment \"%s\" matches, so putting it on workspace %d\n",
assign->windowclass_title, assign->workspace);