]> git.sur5r.net Git - i3/i3/commitdiff
more informative `workspace' events
authorFrancesco Mazzoli <f@mazzo.li>
Sat, 3 Nov 2012 11:17:29 +0000 (11:17 +0000)
committerMichael Stapelberg <michael@stapelberg.de>
Tue, 13 Nov 2012 08:33:00 +0000 (09:33 +0100)
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
src/workspace.c

index 6bdccd0b650c4629df430fc760a01d2f1ba3780d..ae833c9fcef34a4cc92c2719a3c27745a97a0b14 100644 (file)
--- 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
index ed00c9a7c89f12ef54e00be8f3b4240ccaee6cdb..d43548983fdb07f96b89c37fe5c6408e1cfd1bec 100644 (file)
@@ -11,6 +11,9 @@
  *
  */
 #include "all.h"
+#include "yajl_utils.h"
+
+#include <yajl/yajl_gen.h>
 
 /* 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);
 }
 
 /*