Gestion des fenêtres en mosaïque pour Windows.
komorebi est un gestionnaire de fenêtres en mosaïque qui fonctionne comme une extension du gestionnaire de fenêtres de bureau de Microsoft dans Windows 10 et versions ultérieures.
komorebi vous permet de contrôler les fenêtres d'application, les espaces de travail virtuels et les moniteurs d'affichage avec une CLI qui peut être utilisée avec des logiciels tiers tels que whkd
et AutoHotKey pour définir des raccourcis clavier définis par l'utilisateur.
komorebi vise à apporter le moins de modifications possible au système d'exploitation et à l'environnement de bureau par défaut. Les utilisateurs sont libres d'apporter de telles modifications dans leurs propres fichiers de configuration pour komorebi , mais celles-ci resteront optionnelles et désactivées par défaut dans un avenir prévisible.
Veuillez vous référer à la documentation pour obtenir des instructions sur la façon d'installer et de configurer komorebi , les flux de travail courants, une référence complète du schéma de configuration et une référence CLI complète.
Il existe un serveur Discord disponible pour les discussions, l'aide, le dépannage, etc. liés à komorebi . Si vous avez des demandes de fonctionnalités spécifiques ou des bogues à signaler, veuillez créer un problème dans ce référentiel.
Il existe une chaîne YouTube sur laquelle je publie des vidéos de développement de Komorebi . Si vous souhaitez être informé des vidéos à venir, abonnez-vous et activez les notifications.
Il existe une liste impressionnante qui présente les nombreux projets géniaux qui existent dans l'écosystème komorebi .
komorebi est un projet gratuit et disponible en source, qui vous encourage à faire des dons caritatifs si vous trouvez le logiciel utile et si vous en avez les moyens financiers.
Je vous encourage à faire un don caritatif au Fonds de secours pour les enfants palestiniens avant d'envisager de me parrainer sur GitHub.
Les sponsors GitHub sont activés pour ce projet. Malheureusement, je n'ai rien de spécifique à offrir à part ma gratitude et mes remerciements à la fin des vidéos et tutoriels de développement en direct de Komorebi .
Si vous souhaitez donner un pourboire ou parrainer le projet mais que vous ne pouvez pas utiliser les sponsors GitHub, vous pouvez également parrainer via Ko-fi.
Un guide d'installation et de démarrage rapide détaillé est disponible et montre comment commencer à utiliser scoop
, winget
ou à construire à partir des sources.
Olge, membre de la communauté, a créé une excellente vidéo qui compare les fonctionnalités de gestion de fenêtres par défaut de Windows 11, Fancy Zones et komorebi.
Si vous n'êtes pas familier avec les gestionnaires de fenêtres en mosaïque ou si vous regardez komorebi et vous demandez "en quoi est-ce différent des Fancy Zones ? ?", cette courte vidéo répondra à la majorité de vos questions.
@amnweb montrant komorebi v0.1.28
fonctionnant sur Windows 11 avec bordures de fenêtre, transparence de fenêtre non ciblée et animations activées, à l'aide d'une barre d'état personnalisée intégrée à l'aide des abonnements aux événements du gestionnaire de fenêtres de komorebi .
@haxibami montrant komorebi fonctionnant sous Windows 11 avec un émulateur de terminal, un navigateur Web et un éditeur de code. La vidéo originale peut être visionnée ici.
@aik2mlj montrant komorebi fonctionnant sur Windows 11 avec plusieurs espaces de travail, des émulateurs de terminal, un navigateur Web et la barre d'état yasb avec le widget d'espace de travail komorebi activé. La vidéo originale peut être visionnée ici.
Si vous souhaitez contribuer à komorebi
veuillez prendre le temps de lire attentivement les directives ci-dessous.
use
cargo +stable clippy
et assurez-vous que toutes les peluches et suggestions ont été prises en compte avant de vous engagercargo +nightly fmt --all
pour garantir un formatage cohérent avant de vous engagergit cz
avec la CLI Commitizen pour préparer les messages de validationIl est très difficile d'examiner les demandes d'extraction qui touchent plusieurs fonctionnalités et parties non liées de la base de code.
Veuillez ne pas soumettre de demandes d'extraction comme celle-ci ; il vous sera demandé de les séparer en PR plus petits qui ne traitent qu'une seule fonctionnalité ou correction de bug à la fois.
Si vous travaillez sur plusieurs fonctionnalités et corrections de bugs, je vous suggère de couper une branche appelée local-trunk
du master
que vous tenez à jour, et de rebaser les différentes branches indépendantes sur lesquelles vous travaillez sur cette branche si vous souhaitez les tester. ensemble ou créez une construction avec tout intégré.
komorebi
est une base de code mature avec une cohérence et une structure internes qui s'est développée de manière organique sur près d'une demi-décennie.
Il existe d'innombrables heures de vidéos de codage en direct illustrant le travail sur ce projet et montrant aux nouveaux contributeurs comment tout faire, depuis les tâches de base comme la mise en œuvre de nouvelles commandes komorebic
jusqu'à la distinction des moniteurs par identifiants matériels du fabricant et ports de carte vidéo.
Les refactorisations de la structure de la base de code ne sont pas prises à la légère et nécessitent une discussion et une approbation préalables.
Veuillez ne pas commencer à refactoriser la base de code dans l'espoir d'intégrer vos modifications jusqu'à ce que vous receviez une approbation explicite ou une demande de le faire.
De même, lors de l'implémentation de fonctionnalités et de corrections de bugs, veuillez vous en tenir autant que possible à la structure de la base de code et ne pas profiter de cela comme d'une opportunité pour effectuer une "refactorisation en cours de route".
Il est extrêmement difficile d'examiner les PR pour les fonctionnalités et les corrections de bogues s'ils sont perdus dans des changements radicaux apportés à la structure de la base de code.
Cela comprend, sans toutefois s'y limiter :
komorebic
komorebi.json
komorebi-application-specific-configuration
Aucun utilisateur ne devrait constater que son fichier de configuration a cessé de fonctionner après la mise à niveau vers une nouvelle version de komorebi
.
Le plus souvent, il existe des moyens de reformuler des modifications qui, au départ, semblent nécessiter de diviser les interfaces destinées aux utilisateurs en modifications additives.
Pour vous inspirer, jetez un œil à ce commit qui a ajouté la possibilité pour les utilisateurs de spécifier des couleurs dans komorebi.json
au format Hex aux côtés de RVB.
Il existe également un processus en place pour la dépréciation gracieuse et ininterrompue des options de configuration qui ne sont plus nécessaires.
komorebi
est sous licence Komorebi 1.0.0, qui est un fork de la licence PolyForm Strict 1.0.0. À un niveau élevé, cela signifie que vous êtes libre de faire ce que vous voulez avec komorebi
pour un usage personnel autre que la redistribution ou la distribution de nouvelles œuvres (c'est-à-dire des hard-forks) basées sur le logiciel.
Tout le monde est libre de créer son propre fork de komorebi
avec des modifications destinées soit à un usage personnel, soit à une intégration en amont via des pull request.
La licence Komorebi 1.0.0 n'autorise aucun type d'utilisation commerciale.
Une licence dédiée et un CLUF seront introduits en 2025 pour les organisations commerciales et non commerciales.
Veuillez consulter CONTRIBUTING.md pour plus d'informations sur la façon dont les contributions de code à komorebi
sont autorisées.
Si vous utilisez IntelliJ, vous devez activer les paramètres suivants pour garantir que le code généré par les macros est reconnu par l'EDI pour les complétions et la navigation :
Expand declarative macros
sur Use new engine
sous "Paramètres > Langages et frameworks > Rust".org.rust.cargo.evaluate.build.scripts
org.rust.macros.proc
Les journaux de komorebi
seront ajoutés à %LOCALAPPDATA%/komorebi/komorebi.log
; ce fichier n'est jamais pivoté ou écrasé, il continuera donc à croître jusqu'à ce qu'il soit supprimé par l'utilisateur.
Chaque fois que vous exécutez la commande komorebic stop
ou envoyez directement un signal Ctrl-C à komorebi
, le processus komorebi
garantit que toutes les fenêtres cachées sont restaurées avant la fin.
Si toutefois vous vous retrouvez avec des fenêtres masquées et ne pouvant pas être restaurées, une liste des handles de fenêtres connus de komorebi
est stockée et mise à jour en permanence dans %LOCALAPPDATA%/komorebi//komorebi.hwnd.json
.
L'exécution komorebic restore-windows
lira la liste des handles de fenêtre et les restaurera de force, que le processus komorebi
principal soit en cours d'exécution ou non.
Si jamais komorebi
cesse de répondre, cela est probablement dû soit à une panique, soit à une impasse. En cas de panique, cela sera signalé dans le journal. En cas de blocage, il n'y aura aucune erreur dans le journal, mais le processus et le journal apparaîtront gelés.
Si vous pensez avoir rencontré un blocage, vous pouvez compiler komorebi
avec --features deadlock_detection
et essayer de reproduire à nouveau le blocage. Cela vérifiera les blocages toutes les 5 secondes en arrière-plan, et si un blocage est détecté, des informations à ce sujet apparaîtront dans le journal qui pourra être partagé lors de l'ouverture d'un problème.
L'état actuel du gestionnaire de fenêtres peut être interrogé à l'aide de la commande komorebic state
, qui renvoie une représentation JSON de la structure State
.
Cela peut également être interrogé pour créer d’autres intégrations et widgets.
Il est possible de s'abonner aux notifications de chaque WindowManagerEvent
et SocketMessage
gérés par komorebi
à l'aide de Named Pipes.
Tout d’abord, votre application doit créer un canal nommé. Une fois le canal nommé créé, exécutez la commande suivante :
komorebic.exe subscribe - pipe < your pipe name >
Notez que vous n'êtes pas obligé d'inclure le chemin complet du canal nommé, juste le nom.
Si le canal nommé existe, komorebi
commencera à transmettre les données JSON des événements et des messages gérés avec succès :
{ "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" :{}}
Vous pouvez ensuite filtrer sur la clé type
pour écouter les événements qui vous intéressent. Pour une liste complète des types de notification possibles, reportez-vous aux variantes enum de WindowManagerEvent
dans komorebi
et SocketMessage
dans komorebi::core
.
Vous trouverez ci-dessous un exemple de la façon dont vous pouvez vous abonner et filtrer les événements à l'aide d'un canal nommé dans 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 ;
}
} ) ;
Il est possible de s'abonner aux notifications de chaque WindowManagerEvent
et SocketMessage
gérés par komorebi
à l'aide de Sockets de domaine Unix.
Les UDS sont également le seul mode de communication entre komorebi
et komorebic
.
Tout d’abord, votre application doit créer un socket dans $ENV:LocalAppDatakomorebi
. Une fois le socket créé, exécutez la commande suivante :
komorebic.exe subscribe - socket < your socket name >
Si le socket existe, komorebi commencera à transmettre les données JSON des événements et des messages gérés avec succès, comme dans l'exemple ci-dessus dans la section Named Pipes.
Depuis v0.1.22
il est possible d'utiliser la caisse komorebi-client
pour s'abonner aux notifications de chaque WindowManagerEvent
et SocketMessage
gérés par komorebi
dans une base de code Rust.
Vous trouverez ci-dessous un exemple simple d'utilisation komorebi-client
dans une application Rust de base.
// 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}" ) ;
}
}
}
}
Un exemple de lecture du monde peut être trouvé dans komokana.
Un schéma JSON des notifications d'événements émises aux abonnés peut être généré avec la commande komorebic notification-schema
. La sortie de cette commande peut être redirigée vers le presse-papiers ou vers un fichier, qui peut être utilisé avec des services tels que Quicktype pour générer des définitions de type dans différents langages de programmation.
Un écouteur TCP peut éventuellement être exposé sur un port de votre choix avec l'indicateur --tcp-port=N
. Si cet indicateur n'est pas fourni à komorebi
ou komorebic start
, aucun écouteur TCP ne sera créé.
Une fois créé, votre client peut envoyer n'importe quel SocketMessage à komorebi
de la même manière que komorebic
le ferait.
Cela peut être utilisé si vous souhaitez créer votre propre alternative à komorebic
qui intègre des scripts et diverses couches middleware, et de la même manière, il peut être utilisé si vous souhaitez intégrer komorebi
avec un gestionnaire d'entrée personnalisé.
Si un client envoie un message non reconnu, il sera déconnecté et devra se reconnecter avant de tenter à nouveau de communiquer.
Un schéma JSON de messages socket utilisé pour envoyer des instructions à komorebi
peut être généré avec la commande komorebic socket-schema
. La sortie de cette commande peut être redirigée vers le presse-papiers ou vers un fichier, qui peut être utilisé avec des services tels que Quicktype pour générer des définitions de type dans différents langages de programmation.
Tout d'abord, merci à mon épouse, à la fois pour avoir nommé ce projet et pour sa patience tout au long de son incessant développement.
Merci à @sitiom d'être un leader exemplaire de la communauté open source
Merci aux développeurs de nog qui m'ont précédé et dont le travail m'a appris plus que je ne pourrai jamais espérer rembourser.
Merci aux développeurs de GlazeWM d'avoir repoussé avec moi les limites de la gestion des fenêtres en mosaïque sous Windows et d'avoir un excellent esprit de collaboration
Merci à @Ciantic de m'avoir aidé à apporter la fonction de masquage cachée des bureaux virtuels à komorebi