]> git.sur5r.net Git - i3/i3/commitdiff
ewmh: correctly set _NET_CURRENT_DESKTOP to the number of the active workspace
authorMichael Stapelberg <michael@stapelberg.de>
Fri, 25 Dec 2009 14:05:17 +0000 (15:05 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Fri, 25 Dec 2009 14:05:17 +0000 (15:05 +0100)
include/ewmh.h [new file with mode: 0644]
include/i3.h
include/xcb.h
src/ewmh.c [new file with mode: 0644]
src/mainx.c
src/util.c

diff --git a/include/ewmh.h b/include/ewmh.h
new file mode 100644 (file)
index 0000000..a54a79c
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * vim:ts=8:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ */
+#ifndef _EWMH_C
+#define _EWMH_C
+
+/**
+ * Updates _NET_CURRENT_DESKTOP with the current desktop number.
+ *
+ * EWMH: The index of the current desktop. This is always an integer between 0
+ * and _NET_NUMBER_OF_DESKTOPS - 1.
+ *
+ */
+void ewmh_update_current_desktop();
+
+#endif
index fda6cfd8dad5967363dd0c07795fb4b4ce0bf1ae..ddcbc3b7ac2e4fcc090cdbc6b621f50abf8e34b7 100644 (file)
@@ -21,7 +21,7 @@
 #ifndef _I3_H
 #define _I3_H
 
-#define NUM_ATOMS 18
+#define NUM_ATOMS 19
 
 extern xcb_connection_t *global_conn;
 extern xcb_key_symbols_t *keysyms;
index d01f6da170823f02ac908e38e293dc6cad62b244..aa9a4ec51bcdb53004c9c925ee66fad79ce5edfa 100644 (file)
@@ -61,7 +61,8 @@ enum { _NET_SUPPORTED = 0,
         WM_DELETE_WINDOW,
         UTF8_STRING,
         WM_STATE,
-        WM_CLIENT_LEADER
+        WM_CLIENT_LEADER,
+        _NET_CURRENT_DESKTOP
 };
 
 extern unsigned int xcb_numlock_mask;
diff --git a/src/ewmh.c b/src/ewmh.c
new file mode 100644 (file)
index 0000000..b222e28
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * vim:ts=8:expandtab
+ *
+ * i3 - an improved dynamic tiling window manager
+ *
+ * © 2009 Michael Stapelberg and contributors
+ *
+ * See file LICENSE for license information.
+ *
+ * ewmh.c: Functions to get/set certain EWMH properties easily.
+ *
+ */
+#include <stdint.h>
+
+#include "data.h"
+#include "table.h"
+#include "i3.h"
+#include "xcb.h"
+
+/*
+ * Updates _NET_CURRENT_DESKTOP with the current desktop number.
+ *
+ * EWMH: The index of the current desktop. This is always an integer between 0
+ * and _NET_NUMBER_OF_DESKTOPS - 1.
+ *
+ */
+void ewmh_update_current_desktop() {
+        uint32_t current_desktop = c_ws->num;
+        xcb_change_property(global_conn, XCB_PROP_MODE_REPLACE, root,
+                            atoms[_NET_CURRENT_DESKTOP], CARDINAL, 32, 1,
+                            &current_desktop);
+}
index 9c38c4acd74b2c9c45f356b518fc9807c171234e..9298fb3d8999949cdf21f0518fbab84750b9b8cf 100644 (file)
@@ -248,6 +248,7 @@ int main(int argc, char *argv[], char *env[]) {
         REQUEST_ATOM(UTF8_STRING);
         REQUEST_ATOM(WM_STATE);
         REQUEST_ATOM(WM_CLIENT_LEADER);
+        REQUEST_ATOM(_NET_CURRENT_DESKTOP);
 
         /* TODO: this has to be more beautiful somewhen */
         int major, minor, error;
@@ -410,6 +411,7 @@ int main(int argc, char *argv[], char *env[]) {
         GET_ATOM(UTF8_STRING);
         GET_ATOM(WM_STATE);
         GET_ATOM(WM_CLIENT_LEADER);
+        GET_ATOM(_NET_CURRENT_DESKTOP);
 
         xcb_property_set_handler(&prophs, atoms[_NET_WM_WINDOW_TYPE], UINT_MAX, handle_window_type, NULL);
         /* TODO: In order to comply with EWMH, we have to watch _NET_WM_STRUT_PARTIAL */
index 915f8cde0667a35e937dc8fcf852a92f249afb5c..8a202299451700921017564d7e333b4c728209be 100644 (file)
@@ -32,6 +32,7 @@
 #include "xcb.h"
 #include "client.h"
 #include "log.h"
+#include "ewmh.h"
 
 static iconv_t conversion_descriptor = 0;
 struct keyvalue_table_head by_parent = TAILQ_HEAD_INITIALIZER(by_parent);
@@ -230,6 +231,7 @@ void set_focus(xcb_connection_t *conn, Client *client, bool set_anyways) {
         c_ws->current_row = current_row;
         c_ws->current_col = current_col;
         c_ws = client->workspace;
+        ewmh_update_current_desktop();
         /* Load current_col/current_row if we switch to a client without a container */
         current_col = c_ws->current_col;
         current_row = c_ws->current_row;