]> git.sur5r.net Git - i3/i3/commitdiff
ipc/parser: commands can now return custom JSON replies
authorMichael Stapelberg <michael@stapelberg.de>
Sat, 17 Jul 2010 13:15:37 +0000 (15:15 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Sat, 17 Jul 2010 13:15:37 +0000 (15:15 +0200)
Also, finally add include/cmdparse.h

include/all.h
include/cmdparse.h [new file with mode: 0644]
src/cmdparse.y
src/ipc.c

index 2890b9c6c69eaca0412746563db37dddea726180..5851141e65bdb0225d8cb1294f9c8507646741c6 100644 (file)
@@ -49,5 +49,6 @@
 #include "render.h"
 #include "window.h"
 #include "match.h"
+#include "cmdparse.h"
 
 #endif
diff --git a/include/cmdparse.h b/include/cmdparse.h
new file mode 100644 (file)
index 0000000..09d56ba
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _CMDPARSE_H
+#define _CMDPARSE_H
+
+char *parse_cmd(const char *new);
+
+#endif
index f4ad6e078a105b810f85152be8516832ac90bb83..6718e8b2c4b5a3d74d2da96173a99e6f5a4a5514 100644 (file)
@@ -37,6 +37,10 @@ typedef struct owindow {
 } owindow;
 static TAILQ_HEAD(owindows_head, owindow) owindows;
 
+/* Holds the JSON which will be returned via IPC or NULL for the default return
+ * message */
+static char *json_output;
+
 /* We don’t need yydebug for now, as we got decent error messages using
  * yyerror(). Should you ever want to extend the parser, it might be handy
  * to just comment it in again, so it stays here. */
@@ -61,7 +65,7 @@ int cmdyywrap() {
     return 1;
 }
 
-void parse_cmd(const char *new) {
+char *parse_cmd(const char *new) {
 
     //const char *new = "[level-up workspace] attach $output, focus";
 
@@ -69,14 +73,16 @@ void parse_cmd(const char *new) {
 
     context = scalloc(sizeof(struct context));
     context->filename = "cmd";
+    FREE(json_output);
     if (cmdyyparse() != 0) {
             fprintf(stderr, "Could not parse configfile\n");
             exit(1);
     }
-    printf("done\n");
+    printf("done, json output = %s\n", json_output);
 
     FREE(context->line_copy);
     free(context);
+    return json_output;
 }
 
 %}
@@ -392,7 +398,8 @@ open:
     TOK_OPEN
     {
         printf("opening new container\n");
-        tree_open_con(NULL);
+        Con *con = tree_open_con(NULL);
+        asprintf(&json_output, "{\"success\":true, \"id\":%d}", (long int)con);
     }
     ;
 
index 7c0a0f375f190d7aa014ad20342a942992e915f5..2c105acc35e4d322beba6bd4c44ee512f21692d3 100644 (file)
--- a/src/ipc.c
+++ b/src/ipc.c
@@ -115,13 +115,13 @@ IPC_HANDLER(command) {
         char *command = scalloc(message_size + 1);
         strncpy(command, (const char*)message, message_size);
         LOG("IPC: received: *%s*\n", command);
-        parse_cmd((const char*)command);
+        const char *reply = parse_cmd((const char*)command);
         tree_render();
         free(command);
 
-        /* For now, every command gets a positive acknowledge
-         * (will change with the new command parser) */
-        const char *reply = "{\"success\":true}";
+        /* If no reply was provided, we just use the default success message */
+        if (reply == NULL)
+                reply = "{\"success\":true}";
         ipc_send_message(fd, (const unsigned char*)reply,
                          I3_IPC_REPLY_TYPE_COMMAND, strlen(reply));
 }