Windows 的平铺窗口管理。
komorebi是一个平铺窗口管理器,可作为 Windows 10 及更高版本中 Microsoft 桌面窗口管理器的扩展。
komorebi允许您使用 CLI 控制应用程序窗口、虚拟工作区和显示监视器,该 CLI 可以与第三方软件(例如whkd
和 AutoHotKey)一起使用来设置用户定义的键盘快捷键。
komorebi旨在默认情况下对操作系统和桌面环境进行尽可能少的修改。用户可以自由地在自己的komorebi配置文件中进行此类修改,但在可预见的将来,这些修改将保持选择加入和默认关闭的状态。
请参阅文档,了解有关如何安装和配置komorebi 、常见工作流程、完整配置架构参考和完整 CLI 参考的说明。
有一个 Discord 服务器可用于komorebi相关的讨论、帮助、故障排除等。如果您有任何特定的功能请求或错误要报告,请在此存储库中创建问题。
我在 YouTube 频道上发布了komorebi开发视频。如果您想收到即将推出的视频的通知,请订阅并打开通知。
有一个很棒的列表,展示了komorebi生态系统中存在的许多很棒的项目。
komorebi是一个免费且有源代码的项目,如果您发现该软件有用并且有经济能力,它会鼓励您进行慈善捐款。
我鼓励您在考虑在 GitHub 上赞助我之前先向巴勒斯坦儿童救济基金进行慈善捐款。
该项目已启用 GitHub 赞助商。不幸的是,除了在komorebi实时开发视频和教程结束时表达我的感激之情和大声疾呼之外,我没有任何具体的内容可以提供。
如果您想给项目小费或赞助,但无法使用 GitHub 赞助商,您也可以通过 Ko-fi 进行赞助。
提供了详细的安装和快速入门指南,其中展示了如何开始使用scoop
、 winget
或从源代码构建。
社区成员 Olge 创建了一个出色的视频,其中比较了 Windows 11、Fancy Zones 和 komorebi 的默认窗口管理功能。
如果您不熟悉平铺窗口管理器,或者您正在查看 komorebi 并想知道“这与 Fancy Zones 有什么不同??”,这段简短的视频将回答您的大部分问题。
@amnweb 显示komorebi v0.1.28
在 Windows 11 上运行,具有窗口边框、未聚焦的窗口透明度和启用的动画,使用使用komorebi的窗口管理器事件订阅集成的自定义状态栏。
@haxibami 展示了komorebi在 Windows 11 上运行,并带有终端模拟器、Web 浏览器和代码编辑器。原始视频可以在这里观看。
@aik2mlj 显示komorebi在 Windows 11 上运行,具有多个工作区、终端模拟器、Web 浏览器和启用了komorebi工作区小部件的 yasb 状态栏。原始视频可以在这里观看。
如果您想为komorebi
做出贡献,请花时间仔细阅读以下指南。
use
语句cargo +stable clippy
并确保在提交之前所有 lints 和建议都已得到解决cargo +nightly fmt --all
以确保提交前格式一致git cz
与 Commitizen CLI 结合使用来准备提交消息审查涉及多个不相关功能和代码库部分的拉取请求是非常困难的。
请不要提交这样的拉取请求;您将被要求将它们分成较小的 PR,一次仅处理一项功能或错误修复。
如果您正在开发多个功能和错误修复,我建议您从master
中删除一个名为local-trunk
的分支,并保持最新状态,如果您想测试它们,请将您正在处理的各个独立分支重新设置到该分支上一起或创建一个集成所有内容的构建。
komorebi
是一个成熟的代码库,具有内部一致性和结构,经过近五年的有机发展。
有无数小时的实时编码视频展示了该项目的工作,并向新贡献者展示了如何完成从基本任务(例如实施新的komorebic
命令)到通过制造商硬件标识符和视频卡端口区分显示器的所有操作。
对代码库结构的重构不会轻易进行,需要事先讨论和批准。
在收到明确批准或请求之前,请勿开始重构代码库并期望集成您的更改。
同样,在实现功能和错误修复时,请尽可能坚持代码库的结构,不要以此为契机进行一些“一路重构”。
如果在代码库结构的彻底更改中丢失了功能和错误修复的 PR,那么审查这些 PR 是极其困难的。
这包括但不限于:
komorebic
命令komorebi.json
架构komorebi-application-specific-configuration
模式任何用户都不应该发现他们的配置文件在升级到新版本的komorebi
后停止工作。
通常,有一些方法可以重新制定更改,这些更改最初看起来可能需要将面向用户的界面分解为附加更改。
如需一些灵感,请查看此提交,它增加了用户在komorebi.json
中以十六进制格式与 RGB 一起指定颜色的功能。
还有一个流程可以优雅地、不间断地弃用不再需要的配置选项。
komorebi
根据 Komorebi 1.0.0 许可证获得许可,该许可证是 PolyForm Strict 1.0.0 许可证的分支。从高层次上来说,这意味着您可以自由地使用komorebi
做任何您想做的事情供个人使用,除了重新分发或基于该软件分发新作品(即硬分叉)。
任何人都可以自由地制作自己的komorebi
分支,并进行更改以供个人使用或通过拉取请求集成回上游。
Komorebi 1.0.0 许可证不允许任何形式的商业用途。
将于 2025 年为商业和非商业组织引入专用许可证和 EULA。
请参阅 CONTRIBUTING.md 了解有关如何许可向komorebi
贡献代码的更多信息。
如果您使用 IntelliJ,则应启用以下设置以确保 IDE 能够识别宏生成的代码以进行补全和导航:
Expand declarative macros
设置为Use new engine
org.rust.cargo.evaluate.build.scripts
org.rust.macros.proc
来自komorebi
的日志将附加到%LOCALAPPDATA%/komorebi/komorebi.log
;该文件永远不会旋转或覆盖,因此它会不断增长,直到被用户删除。
每当运行komorebic stop
命令或直接向komorebi
发送 Ctrl-C 信号时, komorebi
进程都会确保在终止之前恢复所有隐藏窗口。
但是,如果您最终遇到隐藏且无法恢复的窗口, komorebi
已知的窗口句柄列表将存储在%LOCALAPPDATA%/komorebi//komorebi.hwnd.json
中并不断更新。
运行komorebic restore-windows
将读取窗口句柄列表并强制恢复它们,无论主komorebi
进程是否正在运行。
如果komorebi
停止响应,很可能是由于恐慌或僵局。如果发生恐慌,这将在日志中报告。死锁的情况下,日志中不会有任何错误,但进程和日志会出现冻结的情况。
如果您认为遇到了死锁,可以使用--features deadlock_detection
编译komorebi
并尝试再次重现死锁。这将在后台每 5 秒检查一次死锁,如果发现死锁,有关该死锁的信息将出现在日志中,该日志可以在打开问题时共享。
可以使用komorebic state
命令查询窗口管理器的当前状态,该命令返回State
结构的 JSON 表示形式。
也可以对其进行轮询以在其上构建进一步的集成和小部件。
可以使用命名管道订阅komorebi
处理的每个WindowManagerEvent
和SocketMessage
的通知。
首先,您的应用程序必须创建一个命名管道。创建命名管道后,运行以下命令:
komorebic.exe subscribe - pipe < your pipe name >
请注意,您不必包含命名管道的完整路径,只需包含名称即可。
如果命名管道存在, komorebi
将开始推送成功处理的事件和消息的 JSON 数据:
{ "event" :{ "type" : " AddSubscriber " , "content" : " yasb " }, "state" :{}}
{ "event" :{ "type" : " FocusWindow " , "content" : " Left " }, "state" :{}}
{ "event" :{ "type" : " FocusChange " , "content" :[ " SystemForeground " ,{ "hwnd" : 131444 , "title" : " komorebi – README.md " , "exe" : " idea64.exe " , "class" : " SunAwtFrame " , "rect" :{ "left" : 13 , "top" : 60 , "right" : 1520 , "bottom" : 1655 }}]}, "state" :{}}
{ "event" :{ "type" : " MonitorPoll " , "content" :[ " ObjectCreate " ,{ "hwnd" : 5572450 , "title" : " OLEChannelWnd " , "exe" : " explorer.exe " , "class" : " OleMainThreadWndClass " , "rect" :{ "left" : 0 , "top" : 0 , "right" : 0 , "bottom" : 0 }}]}, "state" :{}}
{ "event" :{ "type" : " FocusWindow " , "content" : " Right " }, "state" :{}}
{ "event" :{ "type" : " FocusChange " , "content" :[ " SystemForeground " ,{ "hwnd" : 132968 , "title" : " Windows PowerShell " , "exe" : " WindowsTerminal.exe " , "class" : " CASCADIA_HOSTING_WINDOW_CLASS " , "rect" :{ "left" : 1539 , "top" : 60 , "right" : 1520 , "bottom" : 821 }}]}, "state" :{}}
{ "event" :{ "type" : " FocusWindow " , "content" : " Down " }, "state" :{}}
{ "event" :{ "type" : " FocusChange " , "content" :[ " SystemForeground " ,{ "hwnd" : 329264 , "title" : " den — Mozilla Firefox " , "exe" : " firefox.exe " , "class" : " MozillaWindowClass " , "rect" :{ "left" : 1539 , "top" : 894 , "right" : 1520 , "bottom" : 821 }}]}, "state" :{}}
{ "event" :{ "type" : " FocusWindow " , "content" : " Up " }, "state" :{}}
{ "event" :{ "type" : " FocusChange " , "content" :[ " SystemForeground " ,{ "hwnd" : 132968 , "title" : " Windows PowerShell " , "exe" : " WindowsTerminal.exe " , "class" : " CASCADIA_HOSTING_WINDOW_CLASS " , "rect" :{ "left" : 1539 , "top" : 60 , "right" : 1520 , "bottom" : 821 }}]}, "state" :{}}
然后,您可以过滤type
键以侦听您感兴趣的事件。有关可能的通知类型的完整列表,请参阅komorebi
中的WindowManagerEvent
和komorebi::core
中的SocketMessage
的枚举变体。
下面是如何使用nodejs
中的命名管道订阅和过滤事件的示例。
const { exec } = require ( "child_process" ) ;
const net = require ( "net" ) ;
const pipeName = "\\.\pipe\komorebi-js" ;
const server = net . createServer ( ( stream ) => {
console . log ( "Client connected" ) ;
// Every time there is a workspace-related event, let's log the names of all
// workspaces on the currently focused monitor, and then log the name of the
// currently focused workspace on that monitor
stream . on ( "data" , ( data ) => {
let json = JSON . parse ( data . toString ( ) ) ;
let event = json . event ;
if ( event . type . includes ( "Workspace" ) ) {
let monitors = json . state . monitors ;
let current_monitor = monitors . elements [ monitors . focused ] ;
let workspaces = monitors . elements [ monitors . focused ] . workspaces ;
let current_workspace = workspaces . elements [ workspaces . focused ] ;
console . log (
workspaces . elements
. map ( ( workspace ) => workspace . name )
. filter ( ( name ) => name !== null )
) ;
console . log ( current_workspace . name ) ;
}
} ) ;
stream . on ( "end" , ( ) => {
console . log ( "Client disconnected" ) ;
} ) ;
} ) ;
server . listen ( pipeName , ( ) => {
console . log ( "Named pipe server listening" ) ;
} ) ;
const command = "komorebic subscribe-pipe komorebi-js" ;
exec ( command , ( error , stdout , stderr ) => {
if ( error ) {
console . error ( `Error executing command: ${ error } ` ) ;
return ;
}
} ) ;
可以使用 Unix 域套接字订阅komorebi
处理的每个WindowManagerEvent
和SocketMessage
的通知。
UDS也是komorebi
和komorebic
之间唯一的沟通方式。
首先,您的应用程序必须在$ENV:LocalAppDatakomorebi
中创建一个套接字。创建套接字后,运行以下命令:
komorebic.exe subscribe - socket < your socket name >
如果套接字存在,komorebi 将开始推送成功处理的事件和消息的 JSON 数据,如上面命名管道部分的示例所示。
从v0.1.22
开始,可以使用komorebi-client
crate 订阅 Rust 代码库中komorebi
处理的每个WindowManagerEvent
和SocketMessage
的通知。
下面是如何在基本 Rust 应用程序中使用komorebi-client
的简单示例。
// komorebi-client = { git = "https://github.com/LGUG2Z/komorebi", tag = "v0.1.30"}
use anyhow :: Result ;
use komorebi_client :: Notification ;
use komorebi_client :: NotificationEvent ;
use komorebi_client :: UnixListener ;
use komorebi_client :: WindowManagerEvent ;
use std :: io :: BufRead ;
use std :: io :: BufReader ;
use std :: io :: Read ;
pub fn main ( ) -> anyhow :: Result < ( ) > {
let socket = komorebi_client :: subscribe ( NAME ) ? ;
for incoming in socket . incoming ( ) {
match incoming {
Ok ( data ) => {
let reader = BufReader :: new ( data . try_clone ( ) ? ) ;
for line in reader . lines ( ) . flatten ( ) {
let notification : Notification = match serde_json :: from_str ( & line ) {
Ok ( notification ) => notification ,
Err ( error ) => {
log :: debug! ( "discarding malformed komorebi notification: {error}" ) ;
continue ;
}
} ;
// match and filter on desired notifications
}
}
Err ( error ) => {
log :: debug! ( "{error}" ) ;
}
}
}
}
阅读世界的例子可以在 komokana 中找到。
可以使用komorebic notification-schema
命令生成发送给订阅者的事件通知的 JSON 模式。该命令的输出可以重定向到剪贴板或文件,可以与 Quicktype 等服务一起使用,以生成不同编程语言的类型定义。
TCP 侦听器可以选择使用--tcp-port=N
标志在您选择的端口上公开。如果未向komorebi
或komorebic start
提供此标志,则不会创建 TCP 侦听器。
创建后,您的客户端可以像komorebic
一样向komorebi
发送任何 SocketMessage。
如果您想创建自己的komorebic
替代方案(包含脚本和各种中间件层),则可以使用此方法;如果您想将komorebi
与自定义输入处理程序集成,则可以使用类似的方法。
如果客户端发送无法识别的消息,它将断开连接,并且在尝试再次通信之前必须重新连接。
可以使用komorebic socket-schema
命令生成用于向komorebi
发送指令的套接字消息的 JSON 模式。该命令的输出可以重定向到剪贴板或文件,可以与 Quicktype 等服务一起使用,以生成不同编程语言的类型定义。
首先,感谢我的妻子为这个项目命名,并感谢她在其永无止境的开发过程中的耐心
感谢 @sitiom 成为模范开源社区领导者
感谢在我之前的 nog 开发者,他们的工作教会了我很多我无法回报的东西
感谢 GlazeWM 的开发人员与我一起突破 Windows 上平铺窗口管理的界限,并具有出色的协作精神
感谢 @Ciantic 帮助我将隐藏的虚拟桌面隐藏功能带到komorebi