diff --git a/repos/dde_linux/src/drivers/framebuffer/intel/include/component.h b/repos/dde_linux/src/drivers/framebuffer/intel/include/component.h index 302a591c9..1b221d5fe 100644 --- a/repos/dde_linux/src/drivers/framebuffer/intel/include/component.h +++ b/repos/dde_linux/src/drivers/framebuffer/intel/include/component.h @@ -120,6 +120,16 @@ class Framebuffer::Session_component : public Genode::Rpc_object Genode::Xml_node config() { return _config.xml(); } + int force_width_from_config() + { + return _config.xml().attribute_value("force_width", 0); + } + + int force_height_from_config() + { + return _config.xml().attribute_value("force_height", 0); + } + /*********************************** ** Framebuffer session interface ** diff --git a/repos/dde_linux/src/drivers/framebuffer/intel/lx_emul.cc b/repos/dde_linux/src/drivers/framebuffer/intel/lx_emul.cc index 4886cc809..c3e546f1b 100644 --- a/repos/dde_linux/src/drivers/framebuffer/intel/lx_emul.cc +++ b/repos/dde_linux/src/drivers/framebuffer/intel/lx_emul.cc @@ -187,6 +187,12 @@ void Framebuffer::Driver::update_mode() _preferred_mode(c)); }); } + /* force virtual framebuffer size if requested */ + if (int w = _session.force_width_from_config()) + _config._lx.width = min(_config._lx.width, w); + if (int h = _session.force_height_from_config()) + _config._lx.height = min(_config._lx.height, h); + if (old._lx.addr) Lx::iounmap(old._lx.addr); /* drm_crtc.h in drm_framebuffer_funcs definition: use drm_fb_remove */ if (old._lx.lx_fb) drm_framebuffer_remove(old._lx.lx_fb);