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" :{}}
然後WindowManagerEvent
komorebi::core
可以過濾type
鍵以komorebi
您感興趣的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