Kachelfensterverwaltung für Windows.
komorebi ist ein Kachel-Fenstermanager, der als Erweiterung des Desktop-Fenstermanagers von Microsoft in Windows 10 und höher fungiert.
Mit komorebi können Sie Anwendungsfenster, virtuelle Arbeitsbereiche und Anzeigemonitore mit einer CLI steuern, die mit Software von Drittanbietern wie whkd
und AutoHotKey verwendet werden kann, um benutzerdefinierte Tastaturkürzel festzulegen.
komorebi ist bestrebt, standardmäßig so wenig Änderungen wie möglich am Betriebssystem und der Desktop-Umgebung vorzunehmen. Benutzern steht es frei, solche Änderungen in ihren eigenen Konfigurationsdateien für komorebi vorzunehmen, diese bleiben jedoch auf absehbare Zeit optional und standardmäßig deaktiviert.
Anweisungen zur Installation und Konfiguration von komorebi , allgemeine Arbeitsabläufe, eine vollständige Konfigurationsschema-Referenz und eine vollständige CLI-Referenz finden Sie in der Dokumentation.
Für Diskussionen, Hilfe, Fehlerbehebung usw. im Zusammenhang mit Komorebi steht ein Discord-Server zur Verfügung. Wenn Sie spezielle Funktionswünsche oder Fehler melden möchten, erstellen Sie bitte ein Problem in diesem Repository.
Es gibt einen YouTube-Kanal, auf dem ich Entwicklungsvideos von Komorebi poste. Wenn Sie über kommende Videos benachrichtigt werden möchten, abonnieren Sie bitte und aktivieren Sie Benachrichtigungen.
Es gibt eine tolle Liste, die die vielen tollen Projekte präsentiert, die es im Komorebi -Ökosystem gibt.
komorebi ist ein kostenloses und quellenbasiertes Projekt, das Sie zu wohltätigen Spenden ermutigt, wenn Sie die Software nützlich finden und über die finanziellen Mittel verfügen.
Ich ermutige Sie, eine wohltätige Spende an den Palestine Children's Relief Fund zu leisten, bevor Sie darüber nachdenken, mich auf GitHub zu sponsern.
GitHub Sponsors ist für dieses Projekt aktiviert. Leider habe ich außer meiner Dankbarkeit und meinen Grüßen am Ende der Komorebi- Live-Entwicklungsvideos und Tutorials nichts Konkretes zu bieten.
Wenn Sie dem Projekt ein Trinkgeld geben oder es sponsern möchten, aber nicht in der Lage sind, GitHub-Sponsoren zu nutzen, können Sie auch über Ko-fi sponsern.
Es ist eine ausführliche Installations- und Schnellstartanleitung verfügbar, die zeigt, wie Sie mit scoop
, winget
oder dem Erstellen aus dem Quellcode beginnen.
Community-Mitglied Olge hat ein hervorragendes Video erstellt, das die standardmäßigen Fensterverwaltungsfunktionen von Windows 11, Fancy Zones und komorebi vergleicht.
Wenn Sie mit dem Kacheln von Fenstermanagern nicht vertraut sind oder sich Komorebi ansehen und sich fragen: „Wie unterscheidet sich das von Fancy Zones?“, wird dieses kurze Video die meisten Ihrer Fragen beantworten.
@amnweb zeigt, wie komorebi v0.1.28
unter Windows 11 mit Fensterrändern, nicht fokussierter Fenstertransparenz und aktivierten Animationen läuft, wobei eine benutzerdefinierte Statusleiste verwendet wird, die mithilfe der Fenstermanager-Ereignisabonnements von komorebi integriert ist.
@haxibami zeigt Komorebi unter Windows 11 mit einem Terminalemulator, einem Webbrowser und einem Code-Editor. Das Originalvideo kann hier angesehen werden.
@aik2mlj zeigt Komorebi unter Windows 11 mit mehreren Arbeitsbereichen, Terminalemulatoren, einem Webbrowser und der Yasb-Statusleiste mit aktiviertem Komorebi- Arbeitsbereichs-Widget. Das Originalvideo kann hier angesehen werden.
Wenn Sie einen Beitrag zu komorebi
leisten möchten, nehmen Sie sich bitte die Zeit, die folgenden Richtlinien sorgfältig zu lesen.
use
cargo +stable clippy
aus und stellen Sie sicher, dass alle Probleme und Anregungen berücksichtigt wurden, bevor Sie den Vorgang ausführencargo +nightly fmt --all
aus, um vor dem Festschreiben eine konsistente Formatierung sicherzustellengit cz
mit der Commitizen-CLI, um Commit-Nachrichten vorzubereitenEs ist sehr schwierig, Pull-Anfragen zu überprüfen, die mehrere unabhängige Funktionen und Teile der Codebasis betreffen.
Bitte senden Sie keine solchen Pull-Anfragen. Sie werden gebeten, sie in kleinere PRs aufzuteilen, die jeweils nur eine Funktion oder Fehlerbehebung behandeln.
Wenn Sie an mehreren Funktionen und Fehlerbehebungen arbeiten, schlage ich vor, dass Sie einen Zweig namens local-trunk
aus master
herausschneiden, den Sie auf dem neuesten Stand halten, und die verschiedenen unabhängigen Zweige, an denen Sie arbeiten, auf diesen Zweig umbasieren, wenn Sie sie testen möchten zusammen oder erstellen Sie einen Build, in dem alles integriert ist.
komorebi
ist eine ausgereifte Codebasis mit einer internen Konsistenz und Struktur, die sich über fast ein halbes Jahrzehnt organisch entwickelt hat.
Es gibt unzählige Stunden an Live-Coding-Videos, die die Arbeit an diesem Projekt demonstrieren und neuen Mitwirkenden zeigen, wie sie alles erledigen, von grundlegenden Aufgaben wie der Implementierung neuer komorebic
-Befehle bis hin zur Unterscheidung von Monitoren anhand der Hardware-IDs des Herstellers und Grafikkartenanschlüssen.
Umgestaltungen der Struktur der Codebasis werden nicht auf die leichte Schulter genommen und bedürfen einer vorherigen Diskussion und Genehmigung.
Bitte beginnen Sie nicht mit der Umgestaltung der Codebasis in der Erwartung, dass Ihre Änderungen integriert werden, bis Sie eine ausdrückliche Genehmigung oder Aufforderung dazu erhalten.
Halten Sie sich auch bei der Implementierung von Funktionen und Fehlerbehebungen so weit wie möglich an die Struktur der Codebasis und nutzen Sie dies nicht zum Anlass, nebenbei noch einige „Refactorings“ vorzunehmen.
Es ist äußerst schwierig, PRs auf Funktionen und Fehlerbehebungen zu überprüfen, wenn diese bei umfassenden Änderungen an der Struktur der Codebasis verloren gehen.
Dazu gehören unter anderem:
komorebic
Befehlekomorebi.json
-Schemakomorebi-application-specific-configuration
Kein Benutzer sollte jemals feststellen, dass seine Konfigurationsdatei nach dem Upgrade auf eine neue Version von komorebi
nicht mehr funktioniert.
In den meisten Fällen gibt es Möglichkeiten, Änderungen umzuformulieren, die zunächst den Eindruck erwecken, sie erforderten die Aufteilung benutzerbezogener Schnittstellen in additive Änderungen.
Für etwas Inspiration schauen Sie sich bitte dieses Commit an, das Benutzern die Möglichkeit bietet, neben RGB auch Farben in komorebi.json
im Hex-Format anzugeben.
Es gibt auch einen Prozess für die ordnungsgemäße, unterbrechungsfreie Abschaffung von Konfigurationsoptionen, die nicht mehr benötigt werden.
komorebi
ist unter der Komorebi 1.0.0-Lizenz lizenziert, die ein Zweig der PolyForm Strict 1.0.0-Lizenz ist. Im Großen und Ganzen bedeutet dies, dass Sie mit komorebi
für den persönlichen Gebrauch alles tun können, was Sie wollen, mit Ausnahme der Weiterverbreitung oder der Verbreitung neuer Werke (z. B. Hard Forks) auf Basis der Software.
Es steht jedem frei, seinen eigenen Fork von komorebi
mit Änderungen zu erstellen, die entweder für den persönlichen Gebrauch oder für die Integration im Upstream über Pull-Requests gedacht sind.
Die Komorebi 1.0.0-Lizenz erlaubt keinerlei kommerzielle Nutzung.
Im Jahr 2025 werden sowohl für kommerzielle als auch für nichtkommerzielle Organisationen eine spezielle Lizenz und EULA eingeführt.
Weitere Informationen zur Lizenzierung von Codebeiträgen für komorebi
finden Sie unter CONTRIBUTING.md.
Wenn Sie IntelliJ verwenden, sollten Sie die folgenden Einstellungen aktivieren, um sicherzustellen, dass von Makros generierter Code von der IDE für Vervollständigungen und Navigation erkannt wird:
Expand declarative macros
unter „Einstellungen > Sprachen & Frameworks > Rust“ auf Use new engine
“ fest.org.rust.cargo.evaluate.build.scripts
org.rust.macros.proc
Protokolle von komorebi
werden an %LOCALAPPDATA%/komorebi/komorebi.log
angehängt; Diese Datei wird niemals gedreht oder überschrieben, sodass sie weiter wächst, bis sie vom Benutzer gelöscht wird.
Immer wenn der Befehl komorebic stop
ausgeführt oder ein Strg-C-Signal direkt an komorebi
gesendet wird, stellt der komorebi
-Prozess sicher, dass alle ausgeblendeten Fenster vor der Beendigung wiederhergestellt werden.
Sollten Sie jedoch jemals Fenster haben, die ausgeblendet sind und nicht wiederhergestellt werden können, wird eine Liste der Fensterhandles, die komorebi
bekannt sind, in %LOCALAPPDATA%/komorebi//komorebi.hwnd.json
gespeichert und kontinuierlich aktualisiert.
Beim Ausführen von komorebic restore-windows
wird die Liste der Fensterhandles gelesen und die Wiederherstellung erzwungen, unabhängig davon, ob der Hauptprozess komorebi
ausgeführt wird.
Wenn komorebi
jemals nicht mehr reagiert, liegt dies höchstwahrscheinlich entweder an einer Panik oder an einem Stillstand. Im Falle einer Panik wird dies im Protokoll gemeldet. Im Falle eines Deadlocks werden keine Fehler im Protokoll angezeigt, der Prozess und das Protokoll scheinen jedoch eingefroren zu sein.
Wenn Sie glauben, auf einen Deadlock gestoßen zu sein, können Sie komorebi
mit --features deadlock_detection
kompilieren und versuchen, den Deadlock erneut zu reproduzieren. Dadurch wird alle 5 Sekunden im Hintergrund nach Deadlocks gesucht. Wenn ein Deadlock gefunden wird, werden Informationen dazu im Protokoll angezeigt, die beim Öffnen eines Problems weitergegeben werden können.
Der aktuelle Status des Fenstermanagers kann mit dem Befehl komorebic state
abgefragt werden, der eine JSON-Darstellung der State
-Struktur zurückgibt.
Dies kann auch abgefragt werden, um weitere Integrationen und Widgets darauf aufzubauen.
Es ist möglich, Benachrichtigungen über jedes WindowManagerEvent
und SocketMessage
zu abonnieren, die von komorebi
mithilfe von Named Pipes verarbeitet werden.
Zunächst muss Ihre Anwendung eine Named Pipe erstellen. Sobald die Named Pipe erstellt wurde, führen Sie den folgenden Befehl aus:
komorebic.exe subscribe - pipe < your pipe name >
Beachten Sie, dass Sie nicht den vollständigen Pfad der Named Pipe angeben müssen, sondern nur den Namen.
Wenn die Named Pipe vorhanden ist, beginnt komorebi
mit dem Pushen von JSON-Daten erfolgreich verarbeiteter Ereignisse und Nachrichten:
{ "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" :{}}
Sie können dann nach dem type
filtern, um die Ereignisse abzuhören, die Sie interessieren. Eine vollständige Liste möglicher Benachrichtigungstypen finden Sie in den Enum-Varianten von WindowManagerEvent
in komorebi
und SocketMessage
in komorebi::core
.
Unten finden Sie ein Beispiel dafür, wie Sie Ereignisse mithilfe einer Named Pipe in nodejs
abonnieren und filtern können.
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 ;
}
} ) ;
Es ist möglich, Benachrichtigungen über alle WindowManagerEvent
und SocketMessage
zu abonnieren, die von komorebi
über Unix-Domain-Sockets verarbeitet werden.
UDS sind auch die einzige Kommunikationsart zwischen komorebi
und komorebic
.
Zunächst muss Ihre Anwendung einen Socket in $ENV:LocalAppDatakomorebi
erstellen. Sobald der Socket erstellt wurde, führen Sie den folgenden Befehl aus:
komorebic.exe subscribe - socket < your socket name >
Wenn der Socket vorhanden ist, beginnt komorebi mit dem Pushen von JSON-Daten erfolgreich verarbeiteter Ereignisse und Nachrichten, wie im obigen Beispiel im Abschnitt „Benannte Pipes“.
Ab v0.1.22
ist es möglich, die komorebi-client
-Kiste zu verwenden, um Benachrichtigungen über alle WindowManagerEvent
und SocketMessage
zu abonnieren, die von komorebi
in einer Rust-Codebasis verarbeitet werden.
Unten finden Sie ein einfaches Beispiel für die Verwendung komorebi-client
in einer einfachen Rust-Anwendung.
// 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}" ) ;
}
}
}
}
Ein Beispiel für die Lesewelt finden Sie in Komokana.
Mit dem Befehl komorebic notification-schema
kann ein JSON-Schema der an Abonnenten ausgegebenen Ereignisbenachrichtigungen generiert werden. Die Ausgabe dieses Befehls kann in die Zwischenablage oder eine Datei umgeleitet werden, die mit Diensten wie Quicktype zum Generieren von Typdefinitionen in verschiedenen Programmiersprachen verwendet werden kann.
Ein TCP-Listener kann optional mit dem Flag --tcp-port=N
auf einem Port Ihrer Wahl verfügbar gemacht werden. Wenn dieses Flag nicht für komorebi
oder komorebic start
bereitgestellt wird, wird kein TCP-Listener erstellt.
Nach der Erstellung kann Ihr Client jede SocketMessage auf die gleiche Weise an komorebi
senden, wie es komorebic
tun würde.
Dies kann verwendet werden, wenn Sie Ihre eigene Alternative zu komorebic
erstellen möchten, die Skripting und verschiedene Middleware-Ebenen umfasst, und es kann auch verwendet werden, wenn Sie komorebi
mit einem benutzerdefinierten Eingabehandler integrieren möchten.
Wenn ein Client eine nicht erkannte Nachricht sendet, wird die Verbindung getrennt und er muss die Verbindung wiederherstellen, bevor er erneut versuchen kann, zu kommunizieren.
Mit dem Befehl komorebic socket-schema
kann ein JSON-Schema von Socket-Nachrichten generiert werden, die zum Senden von Anweisungen an komorebi
verwendet werden. Die Ausgabe dieses Befehls kann in die Zwischenablage oder eine Datei umgeleitet werden, die mit Diensten wie Quicktype zum Generieren von Typdefinitionen in verschiedenen Programmiersprachen verwendet werden kann.
Zuallererst möchte ich meiner Frau danken, sowohl dafür, dass sie diesem Projekt einen Namen gegeben hat, als auch für ihre Geduld während seiner nie endenden Entwicklung
Vielen Dank an @sitiom für seine beispielhafte Führung der Open-Source-Community
Vielen Dank an die Entwickler von Nog, die vor mir kamen und deren Arbeit mir mehr beigebracht hat, als ich jemals zurückzahlen kann
Vielen Dank an die Entwickler von GlazeWM, die gemeinsam mit mir die Grenzen der Kachelfensterverwaltung unter Windows erweitert haben und eine hervorragende Zusammenarbeit pflegen
Vielen Dank an @Ciantic, der mir geholfen hat, die versteckte Cloaking-Funktion für virtuelle Desktops nach komorebi
zu bringen