ewmh: correctly set _NET_CURRENT_DESKTOP to the number of the active workspace

This commit is contained in:
Michael Stapelberg 2009-12-25 15:05:17 +01:00
parent ba82a3e63b
commit 0641e6a1a3
6 changed files with 62 additions and 2 deletions

23
include/ewmh.h Normal file
View File

@ -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

View File

@ -21,7 +21,7 @@
#ifndef _I3_H #ifndef _I3_H
#define _I3_H #define _I3_H
#define NUM_ATOMS 18 #define NUM_ATOMS 19
extern xcb_connection_t *global_conn; extern xcb_connection_t *global_conn;
extern xcb_key_symbols_t *keysyms; extern xcb_key_symbols_t *keysyms;

View File

@ -61,7 +61,8 @@ enum { _NET_SUPPORTED = 0,
WM_DELETE_WINDOW, WM_DELETE_WINDOW,
UTF8_STRING, UTF8_STRING,
WM_STATE, WM_STATE,
WM_CLIENT_LEADER WM_CLIENT_LEADER,
_NET_CURRENT_DESKTOP
}; };
extern unsigned int xcb_numlock_mask; extern unsigned int xcb_numlock_mask;

32
src/ewmh.c Normal file
View File

@ -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);
}

View File

@ -248,6 +248,7 @@ int main(int argc, char *argv[], char *env[]) {
REQUEST_ATOM(UTF8_STRING); REQUEST_ATOM(UTF8_STRING);
REQUEST_ATOM(WM_STATE); REQUEST_ATOM(WM_STATE);
REQUEST_ATOM(WM_CLIENT_LEADER); REQUEST_ATOM(WM_CLIENT_LEADER);
REQUEST_ATOM(_NET_CURRENT_DESKTOP);
/* TODO: this has to be more beautiful somewhen */ /* TODO: this has to be more beautiful somewhen */
int major, minor, error; int major, minor, error;
@ -410,6 +411,7 @@ int main(int argc, char *argv[], char *env[]) {
GET_ATOM(UTF8_STRING); GET_ATOM(UTF8_STRING);
GET_ATOM(WM_STATE); GET_ATOM(WM_STATE);
GET_ATOM(WM_CLIENT_LEADER); 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); 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 */ /* TODO: In order to comply with EWMH, we have to watch _NET_WM_STRUT_PARTIAL */

View File

@ -32,6 +32,7 @@
#include "xcb.h" #include "xcb.h"
#include "client.h" #include "client.h"
#include "log.h" #include "log.h"
#include "ewmh.h"
static iconv_t conversion_descriptor = 0; static iconv_t conversion_descriptor = 0;
struct keyvalue_table_head by_parent = TAILQ_HEAD_INITIALIZER(by_parent); 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_row = current_row;
c_ws->current_col = current_col; c_ws->current_col = current_col;
c_ws = client->workspace; c_ws = client->workspace;
ewmh_update_current_desktop();
/* Load current_col/current_row if we switch to a client without a container */ /* Load current_col/current_row if we switch to a client without a container */
current_col = c_ws->current_col; current_col = c_ws->current_col;
current_row = c_ws->current_row; current_row = c_ws->current_row;