]> git.sur5r.net Git - i3/i3/commitdiff
recognize dock windows (and support matching them)
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 15 Aug 2010 10:18:27 +0000 (12:18 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 15 Aug 2010 10:18:27 +0000 (12:18 +0200)
include/data.h
include/match.h
src/load_layout.c
src/main.c
src/manage.c
src/match.c

index de29e829e46a35875a3c0241de1630ed9ad8d9d3..79e0e18a04107933d9436f280b6cf361436db349 100644 (file)
@@ -228,6 +228,9 @@ struct Window {
 
     /** Whether the application used _NET_WM_NAME */
     bool uses_net_wm_name;
+
+    /** Whether the window says it is a dock window */
+    bool dock;
 };
 
 struct Match {
@@ -239,6 +242,7 @@ struct Match {
     char *class;
     char *instance;
     char *mark;
+    int dock;
     xcb_window_t id;
     Con *con_id;
     enum { M_ANY = 0, M_TILING, M_FLOATING } floating;
index 923be2e1f921c7d1a32de55600d1461b94b5220d..ef0251729a2675d1d4c4ae4e6b247bd95559512a 100644 (file)
@@ -1,6 +1,14 @@
 #ifndef _MATCH_H
 #define _MATCH_H
 
+/*
+ * Initializes the Match data structure. This function is necessary because the
+ * members representing boolean values (like dock) need to be initialized with
+ * -1 instead of 0.
+ *
+ */
+void match_init(Match *match);
+
 /**
  * Check if a match is empty. This is necessary while parsing commands to see
  * whether the user specified a match at all.
index c7e77eef80f9c690c77b693225da90319c9b4d39..b88a49be1f9d5307f998e448a95638f32f59858b 100644 (file)
@@ -1,3 +1,7 @@
+/*
+ * vim:ts=4:sw=4:expandtab
+ *
+ */
 #include <yajl/yajl_common.h>
 #include <yajl/yajl_gen.h>
 #include <yajl/yajl_parse.h>
@@ -16,7 +20,8 @@ static int json_start_map(void *ctx) {
     LOG("start of map\n");
     if (parsing_swallows) {
         LOG("TODO: create new swallow\n");
-        current_swallow = scalloc(sizeof(Match));
+        current_swallow = smalloc(sizeof(Match));
+        match_init(current_swallow);
         TAILQ_INSERT_TAIL(&(json_node->swallow_head), current_swallow, matches);
     } else {
         if (!parsing_rect)
@@ -104,6 +109,9 @@ static int json_int(void *ctx, long val) {
         if (strcasecmp(last_key, "id") == 0) {
             current_swallow->id = val;
         }
+        if (strcasecmp(last_key, "dock") == 0) {
+            current_swallow->dock = true;
+        }
     }
 
     return 1;
index a5769d170812b6f045ab2a3858fecc19567945fa..076aa277fcd6ca44a750ce10091874db04ba8317 100644 (file)
@@ -296,7 +296,9 @@ int main(int argc, char *argv[]) {
     /* proof-of-concept for assignments */
     Con *ws = workspace_get("3");
 
-    Match *current_swallow = scalloc(sizeof(Match));
+    Match *current_swallow = smalloc(sizeof(Match));
+    match_init(current_swallow);
+
     TAILQ_INSERT_TAIL(&(ws->swallow_head), current_swallow, matches);
 
     current_swallow->insert_where = M_ACTIVE;
index 4826264254ede0896527bb0fde003dcbd736ac75..792008828ec6c44d7c0eebf307fde7c68a7a371f 100644 (file)
@@ -145,6 +145,13 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki
     window_update_name_legacy(cwindow, xcb_get_property_reply(conn, title_cookie, NULL));
     window_update_name(cwindow, xcb_get_property_reply(conn, utf8_title_cookie, NULL));
 
+    xcb_get_property_reply_t *reply = xcb_get_property_reply(conn, wm_type_cookie, NULL);
+    if (xcb_reply_contains_atom(reply, atoms[_NET_WM_WINDOW_TYPE_DOCK])) {
+        cwindow->dock = true;
+        LOG("this window is a dock\n");
+    }
+
+
     Con *nc;
     Match *match;
 
@@ -175,9 +182,6 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki
     nc->window = cwindow;
     x_reinit(nc);
 
-    xcb_get_property_reply_t *reply = xcb_get_property_reply(conn, wm_type_cookie, NULL);
-    if (xcb_reply_contains_atom(reply, atoms[_NET_WM_WINDOW_TYPE_DOCK]))
-        LOG("this window is a dock\n");
 
     /* set floating if necessary */
     if (xcb_reply_contains_atom(reply, atoms[_NET_WM_WINDOW_TYPE_DIALOG]) ||
index c384c41acd654830915a0be25f042b21657e10b9..42eba26ea9ffda46a054365f1979f10f27829821 100644 (file)
 
 #include "all.h"
 
+/*
+ * Initializes the Match data structure. This function is necessary because the
+ * members representing boolean values (like dock) need to be initialized with
+ * -1 instead of 0.
+ *
+ */
+void match_init(Match *match) {
+    memset(match, 0, sizeof(Match));
+    match->dock = -1;
+}
+
 /*
  * Check if a match is empty. This is necessary while parsing commands to see
  * whether the user specified a match at all.
@@ -30,6 +41,7 @@ bool match_is_empty(Match *match) {
             match->instance == NULL &&
             match->id == XCB_NONE &&
             match->con_id == NULL &&
+            match->dock == -1 &&
             match->floating == M_ANY);
 }
 
@@ -54,6 +66,12 @@ bool match_matches_window(Match *match, i3Window *window) {
         return true;
     }
 
+    LOG("match->dock = %d, window->dock = %d\n", match->dock, window->dock);
+    if (match->dock != -1 && window->dock == match->dock) {
+        LOG("match made by dock\n");
+        return true;
+    }
+
     LOG("window %d (%s) could not be matched\n", window->id, window->class_class);
 
     return false;