You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:54:51