Windows のタイル ウィンドウ管理。
komorebi は、Windows 10 以降で Microsoft のデスクトップ ウィンドウ マネージャーの拡張機能として機能するタイル ウィンドウ マネージャーです。
komorebi を使用すると、CLI を使用してアプリケーション ウィンドウ、仮想ワークスペース、およびディスプレイ モニターを制御できます。CLI は、 whkd
や AutoHotKey などのサードパーティ ソフトウェアで使用して、ユーザー定義のキーボード ショートカットを設定できます。
komorebi は、デフォルトのオペレーティング システムとデスクトップ環境への変更をできるだけ少なくすることを目指しています。ユーザーはkomorebiの独自の設定ファイルでそのような変更を自由に行うことができますが、これらは当面はオプトインのままで、デフォルトでオフのままになります。
komorebi のインストールと構成方法、一般的なワークフロー、完全な構成スキーマ リファレンス、および完全な CLI リファレンスについては、ドキュメントを参照してください。
komorebi関連のディスカッション、ヘルプ、トラブルシューティングなどに利用できる Discord サーバーがあります。報告すべき特定の機能リクエストやバグがある場合は、このリポジトリに問題を作成してください。
YouTube チャンネルがあり、こもれびの開発動画を投稿しています。今後のビデオの通知を受け取りたい場合は、チャンネル登録して通知をオンにしてください。
komorebiエコシステムに存在する多くの素晴らしいプロジェクトを紹介する Awesome List があります。
komorebiは無料でソースが利用可能なプロジェクトであり、ソフトウェアが有用であると判断し、経済的余裕がある場合は慈善寄付を行うことを奨励します。
GitHub で私のスポンサーになることを検討する前に、パレスチナ児童救援基金に慈善寄付をすることをお勧めします。
このプロジェクトでは GitHub スポンサーが有効になっています。残念ながら、 komorebi のライブ開発ビデオとチュートリアルの最後に感謝の意を表し、叫ぶ以外に特に提供できることはありません。
プロジェクトにチップやスポンサーを提供したいが、GitHub スポンサーを使用できない場合は、Ko-fi を通じてスポンサーすることもできます。
scoop
、 winget
の使用、またはソースからのビルドの開始方法を示す詳細なインストールおよびクイックスタート ガイドが利用可能です。
コミュニティ メンバーの Olge が、Windows 11、ファンシー ゾーン、および komorebi のデフォルトのウィンドウ管理機能を比較する優れたビデオを作成しました。
タイリング ウィンドウ マネージャーに慣れていない場合、または komorebi を見て「ファンシー ゾーンとどう違うの? ?」と疑問に思っている場合は、この短いビデオでほとんどの質問に答えられます。
@amnweb は、 komorebiのウィンドウ マネージャー イベント サブスクリプv0.1.28
を使用して統合されたカスタム ステータス バーを使用して、ウィンドウの境界線、フォーカスされていないウィンドウの透明度、およびアニメーションが有効になった Windows 11 上で実行されているkomorebi v0.1.28 を示しています。
@haxibami は、ターミナル エミュレーター、Web ブラウザー、コード エディターを使用して Windows 11 上で実行されているkomorebi を示しています。元のビデオはここでご覧いただけます。
@aik2mlj は、複数のワークスペース、ターミナル エミュレーター、Web ブラウザー、およびkomorebiワークスペース ウィジェットを有効にした yasb ステータス バーを備えた Windows 11 上で実行されているkomorebi を示しています。元のビデオはここでご覧いただけます。
komorebi
に貢献したい場合は、以下のガイドラインをよくお読みください。
use
ステートメントをフラット化するcargo +stable clippy
実行し、すべての lint と提案が対処されていることを確認してください。cargo +nightly fmt --all
実行して、一貫したフォーマットを確保します。git cz
使用してコミット メッセージを準備する複数の無関係な機能やコードベースの部分に関わるプル リクエストをレビューするのは非常に困難です。
このようなプルリクエストを送信しないでください。一度に 1 つの機能またはバグ修正のみを扱う小さな PR に分割するように求められます。
複数の機能やバグ修正に取り組んでいる場合は、最新の状態に保つmaster
からlocal-trunk
というブランチを切り取り、テストしたい場合は、作業中のさまざまな独立したブランチをそのブランチにリベースすることをお勧めします。一緒に作成するか、すべてを統合したビルドを作成します。
komorebi
5 年近くかけて有機的に開発された、内部の一貫性と構造を備えた成熟したコードベースです。
このプロジェクトの作業をデモンストレーションし、新しいkomorebic
コマンドの実装などの基本的なタスクからメーカーのハードウェア ID やビデオ カード ポートによるモニターの区別まで、あらゆる方法を新しい貢献者に説明するライブ コーディング ビデオが数え切れないほどあります。
コードベースの構造のリファクタリングは軽視されるものではなく、事前の議論と承認が必要です。
明示的な承認またはリクエストを受け取るまでは、変更が統合されることを期待してコードベースのリファクタリングを開始しないでください。
同様に、機能やバグ修正を実装するときは、できる限りコードベースの構造に固執し、「途中でリファクタリング」を行う機会としないでください。
コードベースの構造に対する大幅な変更によって機能やバグ修正の PR が失われると、それらをレビューするのは非常に困難になります。
これには以下が含まれますが、これらに限定されません。
komorebic
コマンドkomorebi.json
スキーマkomorebi-application-specific-configuration
スキーマ新しいバージョンのkomorebi
にアップグレードした後に、設定ファイルが機能しなくなったことにユーザーが気づくことはありません。
多くの場合、最初はユーザー向けインターフェイスを分割して追加的な変更を加える必要があるように見える変更を再定式化する方法があります。
インスピレーションを得るためには、ユーザーがkomorebi.json
で RGB とともに Hex 形式で色を指定できる機能を追加したこのコミットをご覧ください。
また、不要になった構成オプションを適切かつ破壊的ではなく非推奨にするためのプロセスも用意されています。
komorebi
、PolyForm Strict 1.0.0 ライセンスのフォークである Komorebi 1.0.0 ライセンスに基づいてライセンスされています。これは、大まかに言えば、再配布、またはソフトウェアに基づく新しい作品の配布 (つまり、ハードフォーク) 以外の個人使用の場合、 komorebi
で何をしても自由であることを意味します。
誰でも自由に、個人使用またはプルリクエストを介したアップストリームへの統合を目的とした変更を加えて独自のkomorebi
フォークを作成できます。
こもれび 1.0.0 ライセンスでは、いかなる商用利用も許可されていません。
専用ライセンスと EULA は、2025 年に営利組織と非営利組織の両方に導入される予定です。
komorebi
へのコード投稿のライセンス付与方法の詳細については、CONTRIBUTING.md を参照してください。
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
コマンドを実行するか、Ctrl-C 信号をkomorebi
に直接送信すると、 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
の enum バリアントを参照してください。
以下は、 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
クレートを使用して、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 にあります。
サブスクライバに発行されるイベント通知の JSON スキーマは、 komorebic notification-schema
コマンドを使用して生成できます。このコマンドの出力はクリップボードまたはファイルにリダイレクトでき、Quicktype などのサービスで使用して、さまざまなプログラミング言語で型定義を生成できます。
オプションで、 --tcp-port=N
フラグを使用して、選択したポートで TCP リスナーを公開できます。このフラグがkomorebi
またはkomorebic start
に提供されていない場合、TCP リスナーは作成されません。
作成後、クライアントはkomorebic
と同じ方法で SocketMessage をkomorebi
に送信できます。
これは、スクリプトやさまざまなミドルウェア層を組み込んだkomorebic
の代替を独自に作成したい場合に使用でき、同様に、 komorebi
カスタム入力ハンドラーと統合したい場合にも使用できます。
クライアントが認識できないメッセージを送信すると、クライアントは切断され、再度通信を試みる前に再接続する必要があります。
komorebi
に指示を送信するために使用されるソケット メッセージの JSON スキーマは、 komorebic socket-schema
コマンドで生成できます。このコマンドの出力はクリップボードまたはファイルにリダイレクトでき、Quicktype などのサービスで使用して、さまざまなプログラミング言語で型定義を生成できます。
何よりもまず、このプロジェクトに名前を付けてくれたことと、終わりのない開発を通して忍耐強くしてくれた妻に感謝します。
模範的なオープンソース コミュニティ リーダーである @sitiom に感謝します
私の前に来て、その仕事で私に恩返しできる以上のことを教えてくれた nog の開発者に感謝します。
私と一緒に Windows でのタイル ウィンドウ管理の限界を押し広げ、素晴らしい協力精神を持ってくれた GlazeWM の開発者に感謝します。
隠された仮想デスクトップのクローキング機能をkomorebi
に導入するのに協力してくれた @Ciantic に感謝します。