diff --git a/include/sway/ipc-server.h b/include/sway/ipc-server.h index 3c43f74d2..6088bce5b 100644 --- a/include/sway/ipc-server.h +++ b/include/sway/ipc-server.h @@ -13,6 +13,7 @@ struct sockaddr_un *ipc_user_sockaddr(void); void ipc_event_workspace(struct sway_workspace *old, struct sway_workspace *new, const char *change); +void ipc_event_output(struct sway_output *output, const char *change); void ipc_event_window(struct sway_container *window, const char *change); void ipc_event_barconfig_update(struct bar_config *bar); void ipc_event_bar_state_update(struct bar_config *bar); diff --git a/sway/desktop/output.c b/sway/desktop/output.c index 0b3e1edb9..9b78bdc39 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -20,6 +20,7 @@ #include "sway/desktop/transaction.h" #include "sway/input/input-manager.h" #include "sway/input/seat.h" +#include "sway/ipc-server.h" #include "sway/layers.h" #include "sway/output.h" #include "sway/server.h" @@ -29,7 +30,8 @@ #include "sway/tree/view.h" #include "sway/tree/workspace.h" -struct sway_output *output_by_name_or_id(const char *name_or_id) { + struct sway_output * + output_by_name_or_id(const char *name_or_id) { for (int i = 0; i < root->outputs->length; ++i) { struct sway_output *output = root->outputs->items[i]; char identifier[128]; @@ -516,6 +518,7 @@ static void handle_destroy(struct wl_listener *listener, void *data) { if (output->enabled) { output_disable(output); } + ipc_event_output(output, "destroy"); output_begin_destroy(output); wl_list_remove(&output->destroy.link); @@ -550,6 +553,7 @@ static void handle_mode(struct wl_listener *listener, void *data) { arrange_layers(output); arrange_output(output); transaction_commit_dirty(); + } static void handle_transform(struct wl_listener *listener, void *data) { @@ -640,4 +644,5 @@ void handle_new_output(struct wl_listener *listener, void *data) { } transaction_commit_dirty(); + ipc_event_output(output, "new"); } diff --git a/sway/ipc-json.c b/sway/ipc-json.c index c320d9586..e75bc52c3 100644 --- a/sway/ipc-json.c +++ b/sway/ipc-json.c @@ -198,11 +198,12 @@ static void ipc_json_describe_output(struct sway_output *output, ipc_json_output_transform_description(wlr_output->transform))); struct sway_workspace *ws = output_get_active_workspace(output); - if (!sway_assert(ws, "Expected output to have a workspace")) { - return; + if (ws == NULL) { + json_object_object_add(object, "current_workspace", NULL); + } else { + json_object_object_add(object, "current_workspace", + json_object_new_string(ws->name)); } - json_object_object_add(object, "current_workspace", - json_object_new_string(ws->name)); json_object *modes_array = json_object_new_array(); struct wlr_output_mode *mode; diff --git a/sway/ipc-server.c b/sway/ipc-server.c index e133a5bf1..8bddb3b57 100644 --- a/sway/ipc-server.c +++ b/sway/ipc-server.c @@ -289,6 +289,22 @@ static void ipc_send_event(const char *json_string, enum ipc_command_type event) } } +void ipc_event_output(struct sway_output *old, + const char *change) { + if (!ipc_has_event_listeners(IPC_EVENT_OUTPUT)) { + return; + } + sway_log(SWAY_DEBUG, "Sending output::%s event", change); + json_object *obj = json_object_new_object(); + json_object_object_add(obj, "change", json_object_new_string(change)); + json_object_object_add( + obj, "container", ipc_json_describe_node(&old->node)); + + const char *json_string = json_object_to_json_string(obj); + ipc_send_event(json_string, IPC_EVENT_OUTPUT); + json_object_put(obj); +} + void ipc_event_workspace(struct sway_workspace *old, struct sway_workspace *new, const char *change) { if (!ipc_has_event_listeners(IPC_EVENT_WORKSPACE)) { @@ -705,11 +721,14 @@ void ipc_client_handle_command(struct ipc_client *client) { } else if (strcmp(event_type, "tick") == 0) { client->subscribed_events |= event_mask(IPC_EVENT_TICK); is_tick = true; + } else if (strcmp(event_type, "output") == 0) { + client->subscribed_events |= event_mask(IPC_EVENT_OUTPUT); } else { const char msg[] = "{\"success\": false}"; client_valid = ipc_send_reply(client, msg, strlen(msg)); json_object_put(request); - sway_log(SWAY_INFO, "Unsupported event type in subscribe request"); + sway_log(SWAY_INFO, + "Unsupported event type in subscribe request"); goto exit_cleanup; } }