From 74d596e0fcf9e790e45a52ca8a1e704b2b77635f Mon Sep 17 00:00:00 2001 From: Francesco Mazzoli Date: Sat, 3 Nov 2012 11:17:29 +0000 Subject: [PATCH] more informative `workspace' events Add a `current' and `old' properties to the `focus' change type, containing the current and old workspace respectively. These additions are not necessary anywhere else because `focus' is always triggered when changing ws. --- docs/ipc | 18 ++++++++++++++++-- src/workspace.c | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/docs/ipc b/docs/ipc index 6bdccd0b..ae833c9f 100644 --- a/docs/ipc +++ b/docs/ipc @@ -644,11 +644,25 @@ if ($is_event) { This event consists of a single serialized map containing a property +change (string)+ which indicates the type of the change ("focus", "init", -"empty", "urgent"). +"empty", "urgent"). Additionally, when the change is "focus", an +old +(object)+ and a +current (object)+ properties will be present with the +previous and current workspace respectively. *Example:* --------------------- -{ "change": "focus" } +{ + "change": "focus", + "current": { + "id": 28489712, + "type":4, + ... + } + "old": { + "id": 28489715, + "type": 4, + ... + } +} --------------------- === output event diff --git a/src/workspace.c b/src/workspace.c index ed00c9a7..d4354898 100644 --- a/src/workspace.c +++ b/src/workspace.c @@ -11,6 +11,9 @@ * */ #include "all.h" +#include "yajl_utils.h" + +#include /* Stores a copy of the name of the last used workspace for the workspace * back-and-forth switching. */ @@ -331,6 +334,34 @@ static void workspace_defer_update_urgent_hint_cb(EV_P_ ev_timer *w, int revents FREE(con->urgency_timer); } +/* + * For the "focus" event we send, along the usual "change" field, also the + * current and previous workspace, in "current" and "old" respectively. + */ +static void _workspace_focus_event(Con *current, Con *old) { + yajl_gen gen = ygenalloc(); + + y(map_open); + + ystr("change"); + ystr("focus"); + + ystr("current"); + dump_node(gen, current, false); + + ystr("old"); + dump_node(gen, old, false); + + y(map_close); + + const unsigned char *payload; + ylength length; + y(get_buf, &payload, &length); + + ipc_send_event("workspace", I3_IPC_EVENT_WORKSPACE, (const char *)payload); + y(free); +} + static void _workspace_show(Con *workspace) { Con *current, *old = NULL; @@ -433,7 +464,7 @@ static void _workspace_show(Con *workspace) { /* Update the EWMH hints */ ewmh_update_current_desktop(); - ipc_send_event("workspace", I3_IPC_EVENT_WORKSPACE, "{\"change\":\"focus\"}"); + _workspace_focus_event(workspace, current); } /*