From 0641e6a1a386aa9568eb6ffa5f38694d05539851 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Fri, 25 Dec 2009 15:05:17 +0100 Subject: [PATCH] ewmh: correctly set _NET_CURRENT_DESKTOP to the number of the active workspace --- include/ewmh.h | 23 +++++++++++++++++++++++ include/i3.h | 2 +- include/xcb.h | 3 ++- src/ewmh.c | 32 ++++++++++++++++++++++++++++++++ src/mainx.c | 2 ++ src/util.c | 2 ++ 6 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 include/ewmh.h create mode 100644 src/ewmh.c diff --git a/include/ewmh.h b/include/ewmh.h new file mode 100644 index 00000000..a54a79c3 --- /dev/null +++ b/include/ewmh.h @@ -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 diff --git a/include/i3.h b/include/i3.h index fda6cfd8..ddcbc3b7 100644 --- a/include/i3.h +++ b/include/i3.h @@ -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; diff --git a/include/xcb.h b/include/xcb.h index d01f6da1..aa9a4ec5 100644 --- a/include/xcb.h +++ b/include/xcb.h @@ -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 index 00000000..b222e289 --- /dev/null +++ b/src/ewmh.c @@ -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 + +#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, + ¤t_desktop); +} diff --git a/src/mainx.c b/src/mainx.c index 9c38c4ac..9298fb3d 100644 --- a/src/mainx.c +++ b/src/mainx.c @@ -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 */ diff --git a/src/util.c b/src/util.c index 915f8cde..8a202299 100644 --- a/src/util.c +++ b/src/util.c @@ -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; -- 2.39.5