]> git.sur5r.net Git - i3/i3/commitdiff
ipc: implement GET_OUTPUTS
authorMichael Stapelberg <michael@stapelberg.de>
Fri, 19 Mar 2010 21:24:52 +0000 (22:24 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Fri, 19 Mar 2010 21:24:52 +0000 (22:24 +0100)
docs/ipc
include/data.h
include/i3/ipc.h
src/ipc.c

index 383bde500ca139dafaf7927e867a06202219e207..35a5fa036914aca8318576ca6933f4a121300b25 100644 (file)
--- a/docs/ipc
+++ b/docs/ipc
@@ -49,6 +49,9 @@ GET_WORKSPACES (1)::
 SUBSCRIBE (2)::
        Subscribes your connection to certain events. See <<events>> for a
        description of this message and the concept of events.
+GET_OUTPUTS (3)::
+       Gets the current outputs. The reply will be a JSON-encoded list of outputs
+       (see the reply section).
 
 So, a typical message could look like this:
 --------------------------------------------------
@@ -96,6 +99,8 @@ GET_WORKSPACES (1)::
        Reply to the GET_WORKSPACES message.
 SUBSCRIBE (2)::
        Confirmation/Error code for the SUBSCRIBE message.
+GET_OUTPUTS (3)::
+       Reply to the GET_OUTPUTS message.
 
 === COMMAND reply
 
@@ -177,6 +182,50 @@ default) or whether a JSON parse error occurred.
 { "success": true }
 -------------------
 
+=== GET_OUTPUTS reply
+
+The reply consists of a serialized list of outputs. Each output has the
+following properties:
+
+name (string)::
+       The name of this output (as seen in +xrandr(1)+). Encoded in UTF-8.
+active (boolean)::
+       Whether this output is currently active (has a valid mode).
+current_workspace (integer)::
+       The current workspace which is visible on this output. +null+ if the
+       output is not active.
+rect (map)::
+       The rectangle of this output (equals the rect of the output it
+       is on), consists of x, y, width, height.
+
+*Example:*
+-------------------
+[
+ {
+  "name": "LVDS1",
+  "active": true,
+  "current_workspace": 4,
+  "rect": {
+   "x": 0,
+   "y": 0,
+   "width": 1280,
+   "height": 800
+  }
+ },
+ {
+  "name": "VGA1",
+  "active": true,
+  "current_workspace": 1,
+  "rect": {
+   "x": 1280,
+   "y": 0,
+   "width": 1280,
+   "height": 1024
+  },
+ }
+]
+-------------------
+
 == Events
 
 [[events]]
index 6819ca95f80edb9eec6b4ac4ad271c25dd9c1d9b..2d8c7b1a66a83a9a048eff456f036099bba3becb 100644 (file)
@@ -512,8 +512,8 @@ struct xoutput {
         /** Name of the output */
         char *name;
 
-        /** Whether the output is currently (has a CRTC attached with a valid
-         * mode) */
+        /** Whether the output is currently active (has a CRTC attached with a
+         * valid mode) */
         bool active;
 
         /** Internal flags, necessary for querying RandR screens (happens in
index 5adec37894f6d1057c1ca301f59fe9900a0f35c9..56f22344c5e0a6bfee1913275a5a6552b3a2f5ed 100644 (file)
@@ -32,6 +32,9 @@
 /** Subscribe to the specified events */
 #define I3_IPC_MESSAGE_TYPE_SUBSCRIBE           2
 
+/** Requests the current outputs from i3 */
+#define I3_IPC_MESSAGE_TYPE_GET_OUTPUTS         3
+
 /*
  * Messages from i3 to clients
  *
@@ -46,6 +49,9 @@
 /** Subscription reply type */
 #define I3_IPC_REPLY_TYPE_SUBSCRIBE             2
 
+/** Outputs reply type */
+#define I3_IPC_REPLY_TYPE_OUTPUTS               3
+
 /*
  * Events from i3 to clients. Events have the first bit set high.
  *
index 1b9bf6e06f7a9748704ea257987cd737cb864485..8ed455dd13ab15406ea457d7dd910fe7eb683880 100644 (file)
--- a/src/ipc.c
+++ b/src/ipc.c
@@ -32,6 +32,7 @@
 #include "commands.h"
 #include "log.h"
 #include "table.h"
+#include "randr.h"
 
 /* Shorter names for all those yajl_gen_* functions */
 #define y(x, ...) yajl_gen_ ## x (gen, ##__VA_ARGS__)
@@ -201,6 +202,56 @@ IPC_HANDLER(get_workspaces) {
         y(free);
 }
 
+/*
+ * Formats the reply message for a GET_OUTPUTS request and sends it to the
+ * client
+ *
+ */
+IPC_HANDLER(get_outputs) {
+        Output *output;
+
+        yajl_gen gen = yajl_gen_alloc(NULL, NULL);
+        y(array_open);
+
+        TAILQ_FOREACH(output, &outputs, outputs) {
+                y(map_open);
+
+                ystr("name");
+                ystr(output->name);
+
+                ystr("active");
+                y(bool, output->active);
+
+                ystr("rect");
+                y(map_open);
+                ystr("x");
+                y(integer, output->rect.x);
+                ystr("y");
+                y(integer, output->rect.y);
+                ystr("width");
+                y(integer, output->rect.width);
+                ystr("height");
+                y(integer, output->rect.height);
+                y(map_close);
+
+                ystr("current_workspace");
+                if (output->current_workspace == NULL)
+                        y(null);
+                else y(integer, output->current_workspace->num + 1);
+
+                y(map_close);
+        }
+
+        y(array_close);
+
+        const unsigned char *payload;
+        unsigned int length;
+        y(get_buf, &payload, &length);
+
+        ipc_send_message(fd, payload, I3_IPC_REPLY_TYPE_OUTPUTS, length);
+        y(free);
+}
+
 /*
  * Callback for the YAJL parser (will be called when a string is parsed).
  *
@@ -277,10 +328,13 @@ IPC_HANDLER(subscribe) {
                          I3_IPC_REPLY_TYPE_SUBSCRIBE, strlen(reply));
 }
 
-handler_t handlers[3] = {
+/* The index of each callback function corresponds to the numeric
+ * value of the message type (see include/i3/ipc.h) */
+handler_t handlers[4] = {
         handle_command,
         handle_get_workspaces,
-        handle_subscribe
+        handle_subscribe,
+        handle_get_outputs
 };
 
 /*