]> git.sur5r.net Git - i3/i3/blobdiff - i3bar/src/ipc.c
Merge branch 'master' into next
[i3/i3] / i3bar / src / ipc.c
index 2170e50965466f6082f055677a5ccdbe8e42ebbf..9ec9100bfd63ac6765b144fd79d944011953d510 100644 (file)
@@ -64,7 +64,7 @@ void got_output_reply(char *reply) {
     parse_outputs_json(reply);
     DLOG("Reconfiguring Windows...\n");
     realloc_sl_buffer();
-    reconfig_windows();
+    reconfig_windows(false);
 
     i3_output *o_walk;
     SLIST_FOREACH(o_walk, outputs, slist) {
@@ -84,6 +84,8 @@ void got_bar_config(char *reply) {
      * workspaces. Everything else (creating the bars, showing the right workspace-
      * buttons and more) is taken care of by the event-drivenness of the code */
     i3_send_msg(I3_IPC_MESSAGE_TYPE_GET_OUTPUTS, NULL);
+
+    free_colors(&(config.colors));
     parse_config_json(reply);
 
     /* Now we can actually use 'config', so let's subscribe to the appropriate
@@ -97,11 +99,7 @@ void got_bar_config(char *reply) {
 
     /* Resolve color strings to colorpixels and save them, then free the strings. */
     init_colors(&(config.colors));
-    free_colors(&(config.colors));
 
-    /* The name of this function is actually misleading. Even if no command is
-     * specified, this function initiates the watchers to listen on stdin and
-     * react accordingly */
     start_child(config.command);
     FREE(config.command);
 }
@@ -148,12 +146,37 @@ void got_mode_event(char *event) {
     draw_bars(false);
 }
 
+/*
+ * Called, when a barconfig_update event arrives (i.e. i3 changed the bar hidden_state or mode)
+ *
+ */
+void got_bar_config_update(char *event) {
+    /* check whether this affect this bar instance by checking the bar_id */
+    char *expected_id;
+    sasprintf(&expected_id, "\"id\":\"%s\"", config.bar_id);
+    char *found_id = strstr(event, expected_id);
+    FREE(expected_id);
+    if (found_id == NULL)
+       return;
+
+    /* update the configuration with the received settings */
+    DLOG("Received bar config update \"%s\"\n", event);
+    int old_mode = config.hide_on_modifier;
+    parse_config_json(event);
+    if (old_mode != config.hide_on_modifier) {
+        reconfig_windows(true);
+    }
+
+    draw_bars(false);
+}
 
-/* Data-structure to easily call the reply-handlers later */
+/* Data-structure to easily call the event-handlers later */
 handler_t event_handlers[] = {
     &got_workspace_event,
     &got_output_event,
-    &got_mode_event
+    &got_mode_event,
+    NULL,
+    &got_bar_config_update,
 };
 
 /*
@@ -309,8 +332,8 @@ void destroy_connection(void) {
  */
 void subscribe_events(void) {
     if (config.disable_ws) {
-        i3_send_msg(I3_IPC_MESSAGE_TYPE_SUBSCRIBE, "[ \"output\", \"mode\" ]");
+        i3_send_msg(I3_IPC_MESSAGE_TYPE_SUBSCRIBE, "[ \"output\", \"mode\", \"barconfig_update\" ]");
     } else {
-        i3_send_msg(I3_IPC_MESSAGE_TYPE_SUBSCRIBE, "[ \"workspace\", \"output\", \"mode\" ]");
+        i3_send_msg(I3_IPC_MESSAGE_TYPE_SUBSCRIBE, "[ \"workspace\", \"output\", \"mode\", \"barconfig_update\" ]");
     }
 }