Initial IPC_EVENT_OUTPUT support

This commit is contained in:
vesim987 2019-04-05 23:25:32 +02:00
parent 4b892a79aa
commit 50f82f19b0
4 changed files with 32 additions and 6 deletions

View file

@ -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);

View file

@ -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");
}

View file

@ -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 *modes_array = json_object_new_array();
struct wlr_output_mode *mode;

View file

@ -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;
}
}