diff options
author | Brian Ashworth <bosrsf04@gmail.com> | 2018-06-05 17:56:32 -0400 |
---|---|---|
committer | Brian Ashworth <bosrsf04@gmail.com> | 2018-06-06 20:11:24 -0400 |
commit | a1b5b93d299bfe129f2b3409a7f642049fcce1d6 (patch) | |
tree | 4d87f5ab8f0f18ada1fc12a4eb4ba3b5d0350527 | |
parent | Merge pull request #2116 from RedSoxFan/fix-2113 (diff) | |
download | sway-a1b5b93d299bfe129f2b3409a7f642049fcce1d6.tar.gz sway-a1b5b93d299bfe129f2b3409a7f642049fcce1d6.tar.zst sway-a1b5b93d299bfe129f2b3409a7f642049fcce1d6.zip |
Store sway_outputs so that they can be reenabled
-rw-r--r-- | include/sway/ipc-json.h | 1 | ||||
-rw-r--r-- | include/sway/output.h | 1 | ||||
-rw-r--r-- | include/sway/tree/layout.h | 2 | ||||
-rw-r--r-- | sway/commands/output.c | 29 | ||||
-rw-r--r-- | sway/config/output.c | 2 | ||||
-rw-r--r-- | sway/desktop/output.c | 35 | ||||
-rw-r--r-- | sway/ipc-json.c | 20 | ||||
-rw-r--r-- | sway/ipc-server.c | 9 | ||||
-rw-r--r-- | sway/tree/container.c | 2 | ||||
-rw-r--r-- | sway/tree/layout.c | 1 | ||||
-rw-r--r-- | swaymsg/main.c | 49 |
11 files changed, 118 insertions, 33 deletions
diff --git a/include/sway/ipc-json.h b/include/sway/ipc-json.h index 440e3a24..eaaa2164 100644 --- a/include/sway/ipc-json.h +++ b/include/sway/ipc-json.h | |||
@@ -6,6 +6,7 @@ | |||
6 | 6 | ||
7 | json_object *ipc_json_get_version(); | 7 | json_object *ipc_json_get_version(); |
8 | 8 | ||
9 | json_object *ipc_json_describe_disabled_output(struct sway_output *o); | ||
9 | json_object *ipc_json_describe_container(struct sway_container *c); | 10 | json_object *ipc_json_describe_container(struct sway_container *c); |
10 | json_object *ipc_json_describe_container_recursive(struct sway_container *c); | 11 | json_object *ipc_json_describe_container_recursive(struct sway_container *c); |
11 | json_object *ipc_json_describe_input(struct sway_input_device *device); | 12 | json_object *ipc_json_describe_input(struct sway_input_device *device); |
diff --git a/include/sway/output.h b/include/sway/output.h index be19d7b2..22c84039 100644 --- a/include/sway/output.h +++ b/include/sway/output.h | |||
@@ -45,4 +45,5 @@ void output_damage_whole_container(struct sway_output *output, | |||
45 | 45 | ||
46 | struct sway_container *output_by_name(const char *name); | 46 | struct sway_container *output_by_name(const char *name); |
47 | 47 | ||
48 | void output_enable(struct sway_output *output); | ||
48 | #endif | 49 | #endif |
diff --git a/include/sway/tree/layout.h b/include/sway/tree/layout.h index 2e0f2abf..069a02cc 100644 --- a/include/sway/tree/layout.h +++ b/include/sway/tree/layout.h | |||
@@ -31,6 +31,8 @@ struct sway_root { | |||
31 | 31 | ||
32 | struct wlr_texture *debug_tree; | 32 | struct wlr_texture *debug_tree; |
33 | 33 | ||
34 | list_t *outputs; | ||
35 | |||
34 | struct { | 36 | struct { |
35 | struct wl_signal new_container; | 37 | struct wl_signal new_container; |
36 | } events; | 38 | } events; |
diff --git a/sway/commands/output.c b/sway/commands/output.c index bc12310e..6c789cc9 100644 --- a/sway/commands/output.c +++ b/sway/commands/output.c | |||
@@ -1,5 +1,7 @@ | |||
1 | #include "sway/commands.h" | 1 | #include "sway/commands.h" |
2 | #include "sway/config.h" | 2 | #include "sway/config.h" |
3 | #include "sway/output.h" | ||
4 | #include "sway/tree/layout.h" | ||
3 | #include "list.h" | 5 | #include "list.h" |
4 | #include "log.h" | 6 | #include "log.h" |
5 | 7 | ||
@@ -80,16 +82,25 @@ struct cmd_results *cmd_output(int argc, char **argv) { | |||
80 | // will be applied during normal "new output" event from wlroots. | 82 | // will be applied during normal "new output" event from wlroots. |
81 | char identifier[128]; | 83 | char identifier[128]; |
82 | bool all = strcmp(output->name, "*") == 0; | 84 | bool all = strcmp(output->name, "*") == 0; |
83 | for (int i = 0; i < root_container.children->length; ++i) { | 85 | list_t *sway_outputs = root_container.sway_root->outputs; |
84 | struct sway_container *cont = root_container.children->items[i]; | 86 | for (int i = 0; i < sway_outputs->length; ++i) { |
85 | if (cont->type != C_OUTPUT) { | 87 | struct sway_output *sway_output = sway_outputs->items[i]; |
86 | continue; | 88 | output_get_identifier(identifier, sizeof(identifier), sway_output); |
87 | } | 89 | wlr_log(L_DEBUG, "Checking identifier %s", identifier); |
90 | if (all || strcmp(sway_output->wlr_output->name, output->name) == 0 | ||
91 | || strcmp(identifier, output->name) == 0) { | ||
92 | if (!sway_output->swayc) { | ||
93 | if (!output->enabled) { | ||
94 | if (!all) { | ||
95 | break; | ||
96 | } | ||
97 | continue; | ||
98 | } | ||
99 | |||
100 | output_enable(sway_output); | ||
101 | } | ||
88 | 102 | ||
89 | output_get_identifier(identifier, sizeof(identifier), cont->sway_output); | 103 | apply_output_config(output, sway_output->swayc); |
90 | if (all || strcmp(cont->name, output->name) == 0 || | ||
91 | strcmp(identifier, output->name) == 0) { | ||
92 | apply_output_config(output, cont); | ||
93 | 104 | ||
94 | if (!all) { | 105 | if (!all) { |
95 | // Stop looking if the output config isn't applicable to all | 106 | // Stop looking if the output config isn't applicable to all |
diff --git a/sway/config/output.c b/sway/config/output.c index ee2440ea..648ded27 100644 --- a/sway/config/output.c +++ b/sway/config/output.c | |||
@@ -131,11 +131,13 @@ void apply_output_config(struct output_config *oc, struct sway_container *output | |||
131 | struct wlr_output *wlr_output = output->sway_output->wlr_output; | 131 | struct wlr_output *wlr_output = output->sway_output->wlr_output; |
132 | 132 | ||
133 | if (oc && oc->enabled == 0) { | 133 | if (oc && oc->enabled == 0) { |
134 | struct sway_output *sway_output = output->sway_output; | ||
134 | if (output->sway_output->bg_pid != 0) { | 135 | if (output->sway_output->bg_pid != 0) { |
135 | terminate_swaybg(output->sway_output->bg_pid); | 136 | terminate_swaybg(output->sway_output->bg_pid); |
136 | output->sway_output->bg_pid = 0; | 137 | output->sway_output->bg_pid = 0; |
137 | } | 138 | } |
138 | container_destroy(output); | 139 | container_destroy(output); |
140 | sway_output->swayc = NULL; | ||
139 | wlr_output_layout_remove(root_container.sway_root->output_layout, | 141 | wlr_output_layout_remove(root_container.sway_root->output_layout, |
140 | wlr_output); | 142 | wlr_output); |
141 | return; | 143 | return; |
diff --git a/sway/desktop/output.c b/sway/desktop/output.c index acc9caae..5d02f5eb 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c | |||
@@ -1157,6 +1157,10 @@ void output_damage_whole_container(struct sway_output *output, | |||
1157 | wlr_output_damage_add_box(output->damage, &box); | 1157 | wlr_output_damage_add_box(output->damage, &box); |
1158 | } | 1158 | } |
1159 | 1159 | ||
1160 | static int find_output(const void *output1, const void *output2) { | ||
1161 | return output1 == output2 ? 0 : 1; | ||
1162 | } | ||
1163 | |||
1160 | static void damage_handle_destroy(struct wl_listener *listener, void *data) { | 1164 | static void damage_handle_destroy(struct wl_listener *listener, void *data) { |
1161 | struct sway_output *output = | 1165 | struct sway_output *output = |
1162 | wl_container_of(listener, output, damage_destroy); | 1166 | wl_container_of(listener, output, damage_destroy); |
@@ -1165,7 +1169,19 @@ static void damage_handle_destroy(struct wl_listener *listener, void *data) { | |||
1165 | 1169 | ||
1166 | static void handle_destroy(struct wl_listener *listener, void *data) { | 1170 | static void handle_destroy(struct wl_listener *listener, void *data) { |
1167 | struct sway_output *output = wl_container_of(listener, output, destroy); | 1171 | struct sway_output *output = wl_container_of(listener, output, destroy); |
1168 | container_destroy(output->swayc); | 1172 | if (output->swayc) { |
1173 | container_destroy(output->swayc); | ||
1174 | } | ||
1175 | int index = list_seq_find(root_container.sway_root->outputs, find_output, | ||
1176 | output); | ||
1177 | if (index >= 0 && index < root_container.sway_root->outputs->length) { | ||
1178 | wlr_log(L_DEBUG, "Removing %s from outputs list", | ||
1179 | output->wlr_output->name); | ||
1180 | list_del(root_container.sway_root->outputs, index); | ||
1181 | wl_list_remove(&output->destroy.link); | ||
1182 | output->wlr_output = NULL; | ||
1183 | free(output); | ||
1184 | } | ||
1169 | } | 1185 | } |
1170 | 1186 | ||
1171 | static void handle_mode(struct wl_listener *listener, void *data) { | 1187 | static void handle_mode(struct wl_listener *listener, void *data) { |
@@ -1203,6 +1219,7 @@ void handle_new_output(struct wl_listener *listener, void *data) { | |||
1203 | output->wlr_output = wlr_output; | 1219 | output->wlr_output = wlr_output; |
1204 | wlr_output->data = output; | 1220 | wlr_output->data = output; |
1205 | output->server = server; | 1221 | output->server = server; |
1222 | list_add(root_container.sway_root->outputs, output); | ||
1206 | 1223 | ||
1207 | if (!wl_list_empty(&wlr_output->modes)) { | 1224 | if (!wl_list_empty(&wlr_output->modes)) { |
1208 | struct wlr_output_mode *mode = | 1225 | struct wlr_output_mode *mode = |
@@ -1210,11 +1227,23 @@ void handle_new_output(struct wl_listener *listener, void *data) { | |||
1210 | wlr_output_set_mode(wlr_output, mode); | 1227 | wlr_output_set_mode(wlr_output, mode); |
1211 | } | 1228 | } |
1212 | 1229 | ||
1213 | output->damage = wlr_output_damage_create(wlr_output); | 1230 | output_enable(output); |
1231 | } | ||
1232 | |||
1233 | void output_enable(struct sway_output *output) { | ||
1234 | struct wlr_output *wlr_output = output->wlr_output; | ||
1235 | |||
1236 | if (!wlr_output->data) { | ||
1237 | wlr_output->data = output; | ||
1238 | } | ||
1239 | |||
1240 | if (!output->damage) { | ||
1241 | output->damage = wlr_output_damage_create(wlr_output); | ||
1242 | } | ||
1214 | 1243 | ||
1215 | output->swayc = output_create(output); | 1244 | output->swayc = output_create(output); |
1216 | if (!output->swayc) { | 1245 | if (!output->swayc) { |
1217 | free(output); | 1246 | // Output is disabled |
1218 | return; | 1247 | return; |
1219 | } | 1248 | } |
1220 | 1249 | ||
diff --git a/sway/ipc-json.c b/sway/ipc-json.c index 6d185449..5d402d1b 100644 --- a/sway/ipc-json.c +++ b/sway/ipc-json.c | |||
@@ -139,6 +139,26 @@ static void ipc_json_describe_output(struct sway_container *container, json_obje | |||
139 | json_object_object_add(object, "layout", json_object_new_string("output")); | 139 | json_object_object_add(object, "layout", json_object_new_string("output")); |
140 | } | 140 | } |
141 | 141 | ||
142 | json_object *ipc_json_describe_disabled_output(struct sway_output *output) { | ||
143 | struct wlr_output *wlr_output = output->wlr_output; | ||
144 | |||
145 | json_object *object = json_object_new_object(); | ||
146 | |||
147 | json_object_object_add(object, "type", json_object_new_string("output")); | ||
148 | json_object_object_add(object, "name", | ||
149 | wlr_output->name ? json_object_new_string(wlr_output->name) : NULL); | ||
150 | json_object_object_add(object, "active", json_object_new_boolean(false)); | ||
151 | json_object_object_add(object, "make", | ||
152 | json_object_new_string(wlr_output->make)); | ||
153 | json_object_object_add(object, "model", | ||
154 | json_object_new_string(wlr_output->model)); | ||
155 | json_object_object_add(object, "serial", | ||
156 | json_object_new_string(wlr_output->serial)); | ||
157 | json_object_object_add(object, "modes", json_object_new_array()); | ||
158 | |||
159 | return object; | ||
160 | } | ||
161 | |||
142 | static void ipc_json_describe_workspace(struct sway_container *workspace, | 162 | static void ipc_json_describe_workspace(struct sway_container *workspace, |
143 | json_object *object) { | 163 | json_object *object) { |
144 | int num = isdigit(workspace->name[0]) ? atoi(workspace->name) : -1; | 164 | int num = isdigit(workspace->name[0]) ? atoi(workspace->name) : -1; |
diff --git a/sway/ipc-server.c b/sway/ipc-server.c index 8d9ab06a..2a2346b4 100644 --- a/sway/ipc-server.c +++ b/sway/ipc-server.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include "sway/commands.h" | 19 | #include "sway/commands.h" |
20 | #include "sway/ipc-json.h" | 20 | #include "sway/ipc-json.h" |
21 | #include "sway/ipc-server.h" | 21 | #include "sway/ipc-server.h" |
22 | #include "sway/output.h" | ||
22 | #include "sway/server.h" | 23 | #include "sway/server.h" |
23 | #include "sway/input/input-manager.h" | 24 | #include "sway/input/input-manager.h" |
24 | #include "sway/input/seat.h" | 25 | #include "sway/input/seat.h" |
@@ -488,6 +489,14 @@ void ipc_client_handle_command(struct ipc_client *client) { | |||
488 | ipc_json_describe_container(container)); | 489 | ipc_json_describe_container(container)); |
489 | } | 490 | } |
490 | } | 491 | } |
492 | for (int i = 0; i < root_container.sway_root->outputs->length; ++i) { | ||
493 | struct sway_output *output = | ||
494 | root_container.sway_root->outputs->items[i]; | ||
495 | if (!output->swayc) { | ||
496 | json_object_array_add(outputs, | ||
497 | ipc_json_describe_disabled_output(output)); | ||
498 | } | ||
499 | } | ||
491 | const char *json_string = json_object_to_json_string(outputs); | 500 | const char *json_string = json_object_to_json_string(outputs); |
492 | ipc_send_reply(client, json_string, (uint32_t) strlen(json_string)); | 501 | ipc_send_reply(client, json_string, (uint32_t) strlen(json_string)); |
493 | json_object_put(outputs); // free | 502 | json_object_put(outputs); // free |
diff --git a/sway/tree/container.c b/sway/tree/container.c index d0d26631..af965857 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c | |||
@@ -255,7 +255,6 @@ static struct sway_container *container_output_destroy( | |||
255 | } | 255 | } |
256 | } | 256 | } |
257 | 257 | ||
258 | wl_list_remove(&output->sway_output->destroy.link); | ||
259 | wl_list_remove(&output->sway_output->mode.link); | 258 | wl_list_remove(&output->sway_output->mode.link); |
260 | wl_list_remove(&output->sway_output->transform.link); | 259 | wl_list_remove(&output->sway_output->transform.link); |
261 | wl_list_remove(&output->sway_output->scale.link); | 260 | wl_list_remove(&output->sway_output->scale.link); |
@@ -265,6 +264,7 @@ static struct sway_container *container_output_destroy( | |||
265 | 264 | ||
266 | // clear the wlr_output reference to this container | 265 | // clear the wlr_output reference to this container |
267 | output->sway_output->wlr_output->data = NULL; | 266 | output->sway_output->wlr_output->data = NULL; |
267 | output->sway_output->swayc = NULL; | ||
268 | 268 | ||
269 | wlr_log(L_DEBUG, "OUTPUT: Destroying output '%s'", output->name); | 269 | wlr_log(L_DEBUG, "OUTPUT: Destroying output '%s'", output->name); |
270 | _container_destroy(output); | 270 | _container_destroy(output); |
diff --git a/sway/tree/layout.c b/sway/tree/layout.c index 82502e1b..ce53a515 100644 --- a/sway/tree/layout.c +++ b/sway/tree/layout.c | |||
@@ -35,6 +35,7 @@ void layout_init(void) { | |||
35 | 35 | ||
36 | root_container.sway_root = calloc(1, sizeof(*root_container.sway_root)); | 36 | root_container.sway_root = calloc(1, sizeof(*root_container.sway_root)); |
37 | root_container.sway_root->output_layout = wlr_output_layout_create(); | 37 | root_container.sway_root->output_layout = wlr_output_layout_create(); |
38 | root_container.sway_root->outputs = create_list(); | ||
38 | wl_list_init(&root_container.sway_root->xwayland_unmanaged); | 39 | wl_list_init(&root_container.sway_root->xwayland_unmanaged); |
39 | wl_signal_init(&root_container.sway_root->events.new_container); | 40 | wl_signal_init(&root_container.sway_root->events.new_container); |
40 | 41 | ||
diff --git a/swaymsg/main.c b/swaymsg/main.c index 8a53474b..29f2a907 100644 --- a/swaymsg/main.c +++ b/swaymsg/main.c | |||
@@ -174,26 +174,35 @@ static void pretty_print_output(json_object *o) { | |||
174 | json_object *modes; | 174 | json_object *modes; |
175 | json_object_object_get_ex(o, "modes", &modes); | 175 | json_object_object_get_ex(o, "modes", &modes); |
176 | 176 | ||
177 | printf( | 177 | if (json_object_get_boolean(active)) { |
178 | "Output %s '%s %s %s'%s%s\n" | 178 | printf( |
179 | " Current mode: %dx%d @ %f Hz\n" | 179 | "Output %s '%s %s %s'%s\n" |
180 | " Position: %d,%d\n" | 180 | " Current mode: %dx%d @ %f Hz\n" |
181 | " Scale factor: %dx\n" | 181 | " Position: %d,%d\n" |
182 | " Transform: %s\n" | 182 | " Scale factor: %dx\n" |
183 | " Workspace: %s\n", | 183 | " Transform: %s\n" |
184 | json_object_get_string(name), | 184 | " Workspace: %s\n", |
185 | json_object_get_string(make), | 185 | json_object_get_string(name), |
186 | json_object_get_string(model), | 186 | json_object_get_string(make), |
187 | json_object_get_string(serial), | 187 | json_object_get_string(model), |
188 | json_object_get_boolean(focused) ? " (focused)" : "", | 188 | json_object_get_string(serial), |
189 | !json_object_get_boolean(active) ? " (inactive)" : "", | 189 | json_object_get_boolean(focused) ? " (focused)" : "", |
190 | json_object_get_int(width), json_object_get_int(height), | 190 | json_object_get_int(width), json_object_get_int(height), |
191 | (float)json_object_get_int(refresh) / 1000, | 191 | (float)json_object_get_int(refresh) / 1000, |
192 | json_object_get_int(x), json_object_get_int(y), | 192 | json_object_get_int(x), json_object_get_int(y), |
193 | json_object_get_int(scale), | 193 | json_object_get_int(scale), |
194 | json_object_get_string(transform), | 194 | json_object_get_string(transform), |
195 | json_object_get_string(ws) | 195 | json_object_get_string(ws) |
196 | ); | 196 | ); |
197 | } else { | ||
198 | printf( | ||
199 | "Output %s '%s %s %s' (inactive)", | ||
200 | json_object_get_string(name), | ||
201 | json_object_get_string(make), | ||
202 | json_object_get_string(model), | ||
203 | json_object_get_string(serial) | ||
204 | ); | ||
205 | } | ||
197 | 206 | ||
198 | size_t modes_len = json_object_array_length(modes); | 207 | size_t modes_len = json_object_array_length(modes); |
199 | if (modes_len > 0) { | 208 | if (modes_len > 0) { |