diff --git a/include/ipc-server.h b/include/ipc-server.h index 9858d6f0..ab9807ef 100644 --- a/include/ipc-server.h +++ b/include/ipc-server.h @@ -9,7 +9,7 @@ void ipc_init(void); void ipc_terminate(void); struct sockaddr_un *ipc_user_sockaddr(void); -void ipc_event_workspace(swayc_t *old, swayc_t *new); +void ipc_event_workspace(swayc_t *old, swayc_t *new, const char *change); void ipc_event_barconfig_update(struct bar_config *bar); const char *swayc_type_string(enum swayc_types type); diff --git a/sway/focus.c b/sway/focus.c index c1170ca4..cf0ee7f6 100644 --- a/sway/focus.c +++ b/sway/focus.c @@ -34,7 +34,7 @@ static void update_focus(swayc_t *c) { // Case where workspace changes case C_WORKSPACE: if (prev) { - ipc_event_workspace(prev, c); + ipc_event_workspace(prev, c, "focus"); // update visibility of old workspace update_visibility(prev); @@ -122,11 +122,6 @@ bool set_focused_container(swayc_t *c) { p = p->parent; p->is_focused = false; } - // active_ws might have been destroyed by now - // (focus swap away from empty ws = destroy ws) - if (active_ws_child_count == 0) { - active_ws = NULL; - } // get new focused view and set focus to it. p = get_focused_view(c); @@ -146,7 +141,13 @@ bool set_focused_container(swayc_t *c) { } if (active_ws != workspace) { - ipc_event_workspace(active_ws, workspace); + // active_ws might have been destroyed by now + // (focus swap away from empty ws = destroy ws) + if (active_ws_child_count == 0) { + active_ws = NULL; + } + + ipc_event_workspace(active_ws, workspace, "focus"); } return true; } diff --git a/sway/ipc-server.c b/sway/ipc-server.c index b459b5ce..e161c756 100644 --- a/sway/ipc-server.c +++ b/sway/ipc-server.c @@ -562,15 +562,23 @@ json_object *ipc_json_describe_bar_config(struct bar_config *bar) { return json; } -void ipc_event_workspace(swayc_t *old, swayc_t *new) { +void ipc_event_workspace(swayc_t *old, swayc_t *new, const char *change) { json_object *obj = json_object_new_object(); - json_object_object_add(obj, "change", json_object_new_string("focus")); - if (old) { - json_object_object_add(obj, "old", ipc_json_describe_workspace(old)); + json_object_object_add(obj, "change", json_object_new_string(change)); + if (strcmp("focus", change) == 0) { + if (old) { + json_object_object_add(obj, "old", ipc_json_describe_workspace(old)); + } else { + json_object_object_add(obj, "old", NULL); + } + } + + if (new) { + json_object_object_add(obj, "current", ipc_json_describe_workspace(new)); } else { - json_object_object_add(obj, "old", NULL); + json_object_object_add(obj, "current", NULL); } - json_object_object_add(obj, "current", ipc_json_describe_workspace(new)); + const char *json_string = json_object_to_json_string(obj); for (int i = 0; i < ipc_client_list->length; i++) { diff --git a/sway/layout.c b/sway/layout.c index a9e7c7f1..563e9d11 100644 --- a/sway/layout.c +++ b/sway/layout.c @@ -10,6 +10,7 @@ #include "workspace.h" #include "focus.h" #include "output.h" +#include "ipc-server.h" swayc_t root_container; list_t *scratchpad; @@ -312,6 +313,12 @@ void move_container_to(swayc_t* container, swayc_t* destination) { // reset container geometry container->width = container->height = 0; add_child(destination, container); + + // If the workspace only has one child after adding one, it + // means that the workspace was just initialized. + if (destination->children->length + destination->floating->length == 1) { + ipc_event_workspace(NULL, destination, "init"); + } } else { // reset container geometry container->width = container->height = 0;