aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sway/config.h1
-rw-r--r--sway/desktop/output.c4
-rw-r--r--sway/ipc-server.c6
3 files changed, 11 insertions, 0 deletions
diff --git a/include/sway/config.h b/include/sway/config.h
index 013853c8..bb770c6f 100644
--- a/include/sway/config.h
+++ b/include/sway/config.h
@@ -706,6 +706,7 @@ void free_output_config(struct output_config *oc);
void request_modeset(void);
void force_modeset(void);
+bool modeset_is_pending(void);
bool spawn_swaybg(void);
diff --git a/sway/desktop/output.c b/sway/desktop/output.c
index 5c2332ce..c7ad8f93 100644
--- a/sway/desktop/output.c
+++ b/sway/desktop/output.c
@@ -408,6 +408,10 @@ void request_modeset(void) {
}
}
+bool modeset_is_pending(void) {
+ return server.delayed_modeset != NULL;
+}
+
void force_modeset(void) {
if (server.delayed_modeset != NULL) {
wl_event_source_remove(server.delayed_modeset);
diff --git a/sway/ipc-server.c b/sway/ipc-server.c
index 7f353c0e..b934bb56 100644
--- a/sway/ipc-server.c
+++ b/sway/ipc-server.c
@@ -648,6 +648,12 @@ void ipc_client_handle_command(struct ipc_client *client, uint32_t payload_lengt
}
list_t *res_list = execute_command(buf, NULL, NULL);
+ if (modeset_is_pending()) {
+ // IPC expects commands to have taken immediate effect, so we need
+ // to force a modeset after output commands. We do a single modeset
+ // here to avoid modesetting for every output command in sequence.
+ force_modeset();
+ }
transaction_commit_dirty();
char *json = cmd_results_to_json(res_list);
int length = strlen(json);