mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 11:47:46 +00:00
WindowServer: Implement mechanism to restore safe mode setting
Such mechanism will be used by the Intel Graphics driver, because we lack support of changing the resolution on this driver currently, so, when WindowServer will try to mode-set the display then it will fail, and will use the safe mode-setting call instead to be able to show something on screen.
This commit is contained in:
parent
d9a2706079
commit
6d7e2596e0
3 changed files with 15 additions and 3 deletions
|
@ -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;
|
||||
|
|
|
@ -66,8 +66,15 @@ ErrorOr<void> 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 {};
|
||||
|
|
|
@ -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<String> {};
|
||||
auto device = (mode == Screen::Mode::Device || mode == Screen::Mode::DisplayConnectorDevice) ? config_file.read_entry(group_name, "Device") : Optional<String> {};
|
||||
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") },
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue