aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
Diffstat (limited to 'sway')
-rw-r--r--sway/config/output.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/sway/config/output.c b/sway/config/output.c
index 7d0ed395..6224fc10 100644
--- a/sway/config/output.c
+++ b/sway/config/output.c
@@ -357,8 +357,26 @@ static void queue_output_config(struct output_config *oc,
set_mode(wlr_output, oc->width, oc->height,
oc->refresh_rate, oc->custom_mode == 1);
} else if (!wl_list_empty(&wlr_output->modes)) {
- struct wlr_output_mode *mode = wlr_output_preferred_mode(wlr_output);
- wlr_output_set_mode(wlr_output, mode);
+ sway_log(SWAY_DEBUG, "Set preferred mode");
+ struct wlr_output_mode *preferred_mode =
+ wlr_output_preferred_mode(wlr_output);
+ wlr_output_set_mode(wlr_output, preferred_mode);
+
+ if (!wlr_output_test(wlr_output)) {
+ sway_log(SWAY_DEBUG, "Preferred mode rejected, "
+ "falling back to another mode");
+ struct wlr_output_mode *mode;
+ wl_list_for_each(mode, &wlr_output->modes, link) {
+ if (mode == preferred_mode) {
+ continue;
+ }
+
+ wlr_output_set_mode(wlr_output, mode);
+ if (wlr_output_test(wlr_output)) {
+ break;
+ }
+ }
+ }
}
if (oc && (oc->subpixel != WL_OUTPUT_SUBPIXEL_UNKNOWN || config->reloading)) {