diff options
author | emersion <contact@emersion.fr> | 2018-04-05 22:54:26 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-05 22:54:26 -0400 |
commit | 254ca8103cfb633fe1392b51f5c80fd28e901479 (patch) | |
tree | aa0bfd765d0c6562bed26acc753fe571e72a4110 | |
parent | Merge pull request #1743 from emersion/subsurface-damage-tracking (diff) | |
parent | address feedback (diff) | |
download | sway-254ca8103cfb633fe1392b51f5c80fd28e901479.tar.gz sway-254ca8103cfb633fe1392b51f5c80fd28e901479.tar.zst sway-254ca8103cfb633fe1392b51f5c80fd28e901479.zip |
Merge pull request #1747 from acrisci/ipc-layout
ipc layout
-rw-r--r-- | sway/ipc-json.c | 32 | ||||
-rw-r--r-- | sway/ipc-server.c | 25 |
2 files changed, 55 insertions, 2 deletions
diff --git a/sway/ipc-json.c b/sway/ipc-json.c index 54824a36..2c7c7325 100644 --- a/sway/ipc-json.c +++ b/sway/ipc-json.c | |||
@@ -11,6 +11,25 @@ | |||
11 | #include <wlr/types/wlr_output.h> | 11 | #include <wlr/types/wlr_output.h> |
12 | #include "wlr-layer-shell-unstable-v1-protocol.h" | 12 | #include "wlr-layer-shell-unstable-v1-protocol.h" |
13 | 13 | ||
14 | static const char *ipc_json_layout_description(enum sway_container_layout l) { | ||
15 | switch (l) { | ||
16 | case L_VERT: | ||
17 | return "splitv"; | ||
18 | case L_HORIZ: | ||
19 | return "splith"; | ||
20 | case L_TABBED: | ||
21 | return "tabbed"; | ||
22 | case L_STACKED: | ||
23 | return "stacked"; | ||
24 | case L_FLOATING: | ||
25 | return "floating"; | ||
26 | case L_NONE: | ||
27 | case L_LAYOUTS: | ||
28 | break; | ||
29 | } | ||
30 | return "none"; | ||
31 | } | ||
32 | |||
14 | json_object *ipc_json_get_version() { | 33 | json_object *ipc_json_get_version() { |
15 | int major = 0, minor = 0, patch = 0; | 34 | int major = 0, minor = 0, patch = 0; |
16 | json_object *version = json_object_new_object(); | 35 | json_object *version = json_object_new_object(); |
@@ -115,7 +134,9 @@ static void ipc_json_describe_output(struct sway_container *container, json_obje | |||
115 | json_object_new_int(mode->refresh)); | 134 | json_object_new_int(mode->refresh)); |
116 | json_object_array_add(modes_array, mode_object); | 135 | json_object_array_add(modes_array, mode_object); |
117 | } | 136 | } |
137 | |||
118 | json_object_object_add(object, "modes", modes_array); | 138 | json_object_object_add(object, "modes", modes_array); |
139 | json_object_object_add(object, "layout", json_object_new_string("output")); | ||
119 | } | 140 | } |
120 | 141 | ||
121 | static void ipc_json_describe_workspace(struct sway_container *workspace, | 142 | static void ipc_json_describe_workspace(struct sway_container *workspace, |
@@ -127,12 +148,23 @@ static void ipc_json_describe_workspace(struct sway_container *workspace, | |||
127 | json_object_new_string(workspace->parent->name) : NULL); | 148 | json_object_new_string(workspace->parent->name) : NULL); |
128 | json_object_object_add(object, "type", json_object_new_string("workspace")); | 149 | json_object_object_add(object, "type", json_object_new_string("workspace")); |
129 | json_object_object_add(object, "urgent", json_object_new_boolean(false)); | 150 | json_object_object_add(object, "urgent", json_object_new_boolean(false)); |
151 | |||
152 | const char *layout = ipc_json_layout_description(workspace->workspace_layout); | ||
153 | json_object_object_add(object, "layout", json_object_new_string(layout)); | ||
130 | } | 154 | } |
131 | 155 | ||
132 | static void ipc_json_describe_view(struct sway_container *c, json_object *object) { | 156 | static void ipc_json_describe_view(struct sway_container *c, json_object *object) { |
133 | json_object_object_add(object, "name", | 157 | json_object_object_add(object, "name", |
134 | c->name ? json_object_new_string(c->name) : NULL); | 158 | c->name ? json_object_new_string(c->name) : NULL); |
135 | json_object_object_add(object, "type", json_object_new_string("con")); | 159 | json_object_object_add(object, "type", json_object_new_string("con")); |
160 | |||
161 | if (c->parent) { | ||
162 | enum sway_container_layout layout = (c->parent->type == C_CONTAINER) ? | ||
163 | c->parent->layout : c->layout; | ||
164 | |||
165 | json_object_object_add(object, "layout", | ||
166 | json_object_new_string(ipc_json_layout_description(layout))); | ||
167 | } | ||
136 | } | 168 | } |
137 | 169 | ||
138 | json_object *ipc_json_describe_container(struct sway_container *c) { | 170 | json_object *ipc_json_describe_container(struct sway_container *c) { |
diff --git a/sway/ipc-server.c b/sway/ipc-server.c index df5fb699..045802e1 100644 --- a/sway/ipc-server.c +++ b/sway/ipc-server.c | |||
@@ -241,10 +241,19 @@ int ipc_client_handle_readable(int client_fd, uint32_t mask, void *data) { | |||
241 | return 0; | 241 | return 0; |
242 | } | 242 | } |
243 | 243 | ||
244 | static bool ipc_has_event_listeners(enum ipc_command_type event) { | ||
245 | for (int i = 0; i < ipc_client_list->length; i++) { | ||
246 | struct ipc_client *client = ipc_client_list->items[i]; | ||
247 | if ((client->subscribed_events & event_mask(event)) == 0) { | ||
248 | return true; | ||
249 | } | ||
250 | } | ||
251 | return false; | ||
252 | } | ||
253 | |||
244 | static void ipc_send_event(const char *json_string, enum ipc_command_type event) { | 254 | static void ipc_send_event(const char *json_string, enum ipc_command_type event) { |
245 | int i; | ||
246 | struct ipc_client *client; | 255 | struct ipc_client *client; |
247 | for (i = 0; i < ipc_client_list->length; i++) { | 256 | for (int i = 0; i < ipc_client_list->length; i++) { |
248 | client = ipc_client_list->items[i]; | 257 | client = ipc_client_list->items[i]; |
249 | if ((client->subscribed_events & event_mask(event)) == 0) { | 258 | if ((client->subscribed_events & event_mask(event)) == 0) { |
250 | continue; | 259 | continue; |
@@ -259,6 +268,9 @@ static void ipc_send_event(const char *json_string, enum ipc_command_type event) | |||
259 | 268 | ||
260 | void ipc_event_workspace(struct sway_container *old, | 269 | void ipc_event_workspace(struct sway_container *old, |
261 | struct sway_container *new, const char *change) { | 270 | struct sway_container *new, const char *change) { |
271 | if (!ipc_has_event_listeners(IPC_EVENT_WORKSPACE)) { | ||
272 | return; | ||
273 | } | ||
262 | wlr_log(L_DEBUG, "Sending workspace::%s event", change); | 274 | wlr_log(L_DEBUG, "Sending workspace::%s event", change); |
263 | json_object *obj = json_object_new_object(); | 275 | json_object *obj = json_object_new_object(); |
264 | json_object_object_add(obj, "change", json_object_new_string(change)); | 276 | json_object_object_add(obj, "change", json_object_new_string(change)); |
@@ -284,6 +296,9 @@ void ipc_event_workspace(struct sway_container *old, | |||
284 | } | 296 | } |
285 | 297 | ||
286 | void ipc_event_window(struct sway_container *window, const char *change) { | 298 | void ipc_event_window(struct sway_container *window, const char *change) { |
299 | if (!ipc_has_event_listeners(IPC_EVENT_WINDOW)) { | ||
300 | return; | ||
301 | } | ||
287 | wlr_log(L_DEBUG, "Sending window::%s event", change); | 302 | wlr_log(L_DEBUG, "Sending window::%s event", change); |
288 | json_object *obj = json_object_new_object(); | 303 | json_object *obj = json_object_new_object(); |
289 | json_object_object_add(obj, "change", json_object_new_string(change)); | 304 | json_object_object_add(obj, "change", json_object_new_string(change)); |
@@ -295,6 +310,9 @@ void ipc_event_window(struct sway_container *window, const char *change) { | |||
295 | } | 310 | } |
296 | 311 | ||
297 | void ipc_event_barconfig_update(struct bar_config *bar) { | 312 | void ipc_event_barconfig_update(struct bar_config *bar) { |
313 | if (!ipc_has_event_listeners(IPC_EVENT_BARCONFIG_UPDATE)) { | ||
314 | return; | ||
315 | } | ||
298 | wlr_log(L_DEBUG, "Sending barconfig_update event"); | 316 | wlr_log(L_DEBUG, "Sending barconfig_update event"); |
299 | json_object *json = ipc_json_describe_bar_config(bar); | 317 | json_object *json = ipc_json_describe_bar_config(bar); |
300 | 318 | ||
@@ -304,6 +322,9 @@ void ipc_event_barconfig_update(struct bar_config *bar) { | |||
304 | } | 322 | } |
305 | 323 | ||
306 | void ipc_event_mode(const char *mode) { | 324 | void ipc_event_mode(const char *mode) { |
325 | if (!ipc_has_event_listeners(IPC_EVENT_MODE)) { | ||
326 | return; | ||
327 | } | ||
307 | wlr_log(L_DEBUG, "Sending mode::%s event", mode); | 328 | wlr_log(L_DEBUG, "Sending mode::%s event", mode); |
308 | json_object *obj = json_object_new_object(); | 329 | json_object *obj = json_object_new_object(); |
309 | json_object_object_add(obj, "change", json_object_new_string(mode)); | 330 | json_object_object_add(obj, "change", json_object_new_string(mode)); |