diff --git a/Kernel/API/FB.h b/Kernel/API/FB.h index 339f32eb41..2917806122 100644 --- a/Kernel/API/FB.h +++ b/Kernel/API/FB.h @@ -64,6 +64,11 @@ ALWAYS_INLINE int fb_set_head_mode_setting(int fd, FBHeadModeSetting* mode_setti return ioctl(fd, FB_IOCTL_SET_HEAD_MODE_SETTING, mode_setting); } +ALWAYS_INLINE int fb_set_safe_head_mode_setting(int fd) +{ + return ioctl(fd, FB_IOCTL_SET_SAFE_HEAD_MODE_SETTING, nullptr); +} + ALWAYS_INLINE int fb_get_head_mode_setting(int fd, FBHeadModeSetting* mode_setting) { FBHeadModeSetting head_mode_setting; diff --git a/Userland/Services/WindowServer/HardwareScreenBackend.cpp b/Userland/Services/WindowServer/HardwareScreenBackend.cpp index 36469a5cd6..f0bf2912b5 100644 --- a/Userland/Services/WindowServer/HardwareScreenBackend.cpp +++ b/Userland/Services/WindowServer/HardwareScreenBackend.cpp @@ -66,8 +66,15 @@ ErrorOr HardwareScreenBackend::set_head_resolution(FBHeadResolution resolu mode_setting.vertical_active = resolution.height; mode_setting.horizontal_stride = resolution.pitch; auto rc = fb_set_head_mode_setting(m_framebuffer_fd, &mode_setting); - if (rc != 0) - return Error::from_syscall("fb_set_head_mode_setting", rc); + if (rc != 0) { + dbgln("Failed to set backend mode setting: falling back to safe resolution"); + rc = fb_set_safe_head_mode_setting(m_framebuffer_fd); + if (rc != 0) { + dbgln("Failed to set backend safe mode setting: aborting"); + return Error::from_syscall("fb_set_safe_head_mode_setting", rc); + } + dbgln("Failed to set backend mode setting: falling back to safe resolution - success."); + } } return {}; diff --git a/Userland/Services/WindowServer/ScreenLayout.ipp b/Userland/Services/WindowServer/ScreenLayout.ipp index 3d5f32f1cd..f52a4096f2 100644 --- a/Userland/Services/WindowServer/ScreenLayout.ipp +++ b/Userland/Services/WindowServer/ScreenLayout.ipp @@ -250,7 +250,7 @@ bool ScreenLayout::load_config(const Core::ConfigFile& config_file, String* erro *this = {}; return false; } - auto device = (mode == Screen::Mode::Device) ? config_file.read_entry(group_name, "Device") : Optional {}; + auto device = (mode == Screen::Mode::Device || mode == Screen::Mode::DisplayConnectorDevice) ? config_file.read_entry(group_name, "Device") : Optional {}; screens.append({ mode, device, { config_file.read_num_entry(group_name, "Left"), config_file.read_num_entry(group_name, "Top") }, { config_file.read_num_entry(group_name, "Width"), config_file.read_num_entry(group_name, "Height") },