aboutsummaryrefslogtreecommitdiff
path: root/sway/config
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2021-07-30 23:00:10 +0200
committerSimon Ser <contact@emersion.fr>2021-08-12 21:06:26 +0200
commit4cdc4ac63aeb7f5e17c42ad3317978bd31e1fde2 (patch)
treea7efd4bc886dbb33df30387255a92192f62fe9b3 /sway/config
parentf67ed6772c27d7ba163e8caa3c9eb8481712a716 (diff)
Fallback to other output modes if preferred mode fails
Sometimes the preferred mode is not available due to hardware constraints (e.g. GPU or cable bandwidth limitations). In these cases it's better to fallback to lower modes than to end up with a black screen.
Diffstat (limited to 'sway/config')
-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)) {