]> git.sur5r.net Git - i3/i3/commitdiff
Implement putting clients into floating mode at a specific workspace
authorMichael Stapelberg <michael@stapelberg.de>
Tue, 21 Jul 2009 14:43:20 +0000 (16:43 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Tue, 21 Jul 2009 14:43:20 +0000 (16:43 +0200)
This changes syntax of the assign command a bit. Old configurations
will continue to work. See the userguide.

docs/userguide
include/data.h
src/config.c
src/manage.c

index 36c30d62f843bf1416256eff9977ba3a1e84dde8..05593cd574c8691e1b7fcdcc99bca7a56cb434d6 100644 (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), you’d 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.
+You can prefix or suffix workspaces with a +~+ to specify that matching clients
+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*:
-----------------------------------------------------
-assign ["]window class[/window title]["] [→] workspace
-----------------------------------------------------
+------------------------------------------------------------
+assign ["]window class[/window title]["] [→] [~ | workspace]
+------------------------------------------------------------
 
 *Examples*:
 ----------------------
@@ -273,7 +274,8 @@ assign urxvt 2
 assign urxvt → 2
 assign "urxvt" → 2
 assign "urxvt/VIM" → 3
-assign "gecko" → ~
+assign "gecko" → ~4
+assign "xv/MPlayer" → ~
 ----------------------
 
 === Automatically starting applications on startup
index 3288cb8d03e0533d36e2ff4d587cbc16ce32420a..3ed8d65bee97f3ec36963bbecd5d58091bab5e60 100644 (file)
@@ -250,7 +250,12 @@ struct Assignment {
         /** floating is true if this was an assignment to the special
          * workspace "~".  Matching clients will be put into floating mode
          * automatically. */
-        bool floating;
+        enum {
+                ASSIGN_FLOATING_NO,   /* don’t float, but put on a workspace */
+                ASSIGN_FLOATING_ONLY, /* float, but don’t assign on a workspace */
+                ASSIGN_FLOATING       /* float and put on a workspace */
+        } floating;
+
         /** The number of the workspace to assign to. */
         int workspace;
         TAILQ_ENTRY(Assignment) assignments;
index 2c2ba0453e9b0a7683936a661bcbca5f9935dde7..3fe6d0679d24a8d642ae29c91580eb891e8e8a62 100644 (file)
@@ -269,17 +269,33 @@ void load_configuration(xcb_connection_t *conn, const char *override_configpath)
                                 die("Malformed assignment, couldn't find target\n");
                         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");
 
                         LOG("assignment parsed: \"%s\" to \"%s\"\n", class_title, target);
 
                         struct Assignment *new = scalloc(sizeof(struct Assignment));
                         new->windowclass_title = class_title;
-                        if (*target == '~')
-                                new->floating = true;
-                        else new->workspace = atoi(target);
+                        if (strchr(target, '~') != NULL)
+                                new->floating = ASSIGN_FLOATING_ONLY;
+
+                        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);
+
+                        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;
                 }
 
index c1a79e7f662880ec5ee9dd47cb60801432405b76..f7630eb098941d47f995a2fc1f1c871c590e8a08 100644 (file)
@@ -311,10 +311,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) {
+                        if (assign->floating == ASSIGN_FLOATING_ONLY ||
+                            assign->floating == ASSIGN_FLOATING) {
                                 new->floating = FLOATING_AUTO_ON;
                                 LOG("Assignment matches, putting client into floating mode\n");
-                                break;
+                                if (assign->floating == ASSIGN_FLOATING_ONLY)
+                                        break;
                         }
 
                         LOG("Assignment \"%s\" matches, so putting it on workspace %d\n",