Jetpack Compose Desktop指定初始窗口大小的Linux适配及Xorg方案咨询
Jetpack Compose Desktop 启动窗口大小设置与Linux闪烁问题解决
一、解决Compose Desktop自身的窗口闪烁问题
Linux下窗口先以800x600创建再切换为指定大小,本质是窗口初始化后二次调整尺寸导致的闪烁。可以通过以下两种方式避免:
1. 提前通过WindowState指定初始大小
直接在rememberWindowState中定义窗口尺寸,让Compose在创建窗口时直接应用该大小,而非后续调整:
import androidx.compose.desktop.ui.tooling.preview.Preview import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface import androidx.compose.material.Text import androidx.compose.runtime.rememberWindowState import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Window import androidx.compose.ui.window.application import androidx.compose.ui.window.WindowSize fun main() = application { // 初始化时直接指定窗口大小 val windowState = rememberWindowState(size = WindowSize(1024.dp, 768.dp)) Window( state = windowState, onCloseRequest = ::exitApplication, title = "Compose Desktop App" ) { AppContent() } } @Preview @Composable fun AppContent() { MaterialTheme { Surface(modifier = Modifier.fillMaxSize()) { Text(text = "Hello, Compose Desktop!") } } }
2. 先隐藏窗口,设置尺寸后再显示
通过控制窗口可见性,先完成尺寸调整再显示,避免用户看到闪烁过程:
import androidx.compose.desktop.ui.tooling.preview.Preview import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface import androidx.compose.material.Text import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.rememberWindowState import androidx.compose.ui.Modifier import androidx.compose.ui.window.Window import androidx.compose.ui.window.application import java.awt.Dimension fun main() = application { val windowState = rememberWindowState() Window( state = windowState, onCloseRequest = ::exitApplication, title = "Compose Desktop App", visible = false // 初始隐藏窗口 ) { LaunchedEffect(Unit) { // 获取底层AWT窗口实例,设置目标尺寸 val awtWindow = windowState.window awtWindow.size = Dimension(1024, 768) // 尺寸设置完成后显示窗口 awtWindow.isVisible = true } AppContent() } } @Preview @Composable fun AppContent() { MaterialTheme { Surface(modifier = Modifier.fillMaxSize()) { Text(text = "Hello, Compose Desktop!") } } }
二、Xorg环境下强制应用启动窗口大小的方法
如果上述Compose层面的方案无法解决,可通过Xorg的窗口管理工具强制指定应用窗口尺寸:
1. 使用wmctl工具
- 先获取应用的窗口类名:运行
xprop WM_CLASS,然后点击你的Compose应用窗口,输出类似WM_CLASS(STRING) = "MyComposeApp", "MyComposeApp" - 执行命令强制设置窗口大小:
wmctrl -r "MyComposeApp" -e 0,-1,-1,1024,768- 参数说明:
-e表示调整窗口几何属性,0为重力参数(保持默认),-1,-1表示窗口位置由窗口管理器决定,1024,768为目标宽高
- 参数说明:
2. 配置窗口管理器规则
以Openbox为例,编辑~/.config/openbox/rc.xml,在<applications>节点下添加规则:
<application class="MyComposeApp"> <size> <width>1024</width> <height>768</height> </size> </application>
保存后重启Openbox:openbox --reconfigure
3. 使用Devilspie2脚本
安装Devilspie2后,在~/.config/devilspie2/下创建脚本(如compose-app.lua):
if get_window_class() == "MyComposeApp" then set_window_size(1024, 768) end
启动Devilspie2即可自动匹配窗口并设置尺寸
4. X资源配置
在~/.Xresources文件中添加:
MyComposeApp.geometry: 1024x768
执行xrdb -merge ~/.Xresources使配置生效,部分应用会读取X资源中的几何参数
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

