Gestión de ventanas en mosaico para Windows.
komorebi es un administrador de ventanas en mosaico que funciona como una extensión del Administrador de ventanas de escritorio de Microsoft en Windows 10 y versiones posteriores.
komorebi le permite controlar ventanas de aplicaciones, espacios de trabajo virtuales y monitores de visualización con una CLI que se puede usar con software de terceros como whkd
y AutoHotKey para configurar atajos de teclado definidos por el usuario.
komorebi tiene como objetivo realizar la menor cantidad de modificaciones posibles en el sistema operativo y el entorno de escritorio de forma predeterminada. Los usuarios son libres de realizar dichas modificaciones en sus propios archivos de configuración de komorebi , pero permanecerán activas y desactivadas de forma predeterminada en el futuro previsible.
Consulte la documentación para obtener instrucciones sobre cómo instalar y configurar komorebi , flujos de trabajo comunes, una referencia completa del esquema de configuración y una referencia completa de la CLI.
Hay un servidor de Discord disponible para debates, ayuda, solución de problemas, etc. relacionados con komorebi . Si tiene solicitudes de funciones específicas o errores que informar, cree un problema en este repositorio.
Hay un canal de YouTube donde publico videos sobre el desarrollo de komorebi . Si desea recibir notificaciones sobre los próximos videos, suscríbase y active las notificaciones.
Hay una Lista impresionante que muestra los muchos proyectos increíbles que existen en el ecosistema de komorebi .
komorebi es un proyecto gratuito y de fuentes disponibles, que lo alienta a realizar donaciones caritativas si encuentra que el software es útil y tiene los medios financieros.
Te animo a que hagas una donación caritativa al Fondo de Ayuda para los Niños de Palestina antes de considerar patrocinarme en GitHub.
Los patrocinadores de GitHub están habilitados para este proyecto. Desafortunadamente, no tengo nada específico que ofrecer además de mi gratitud y agradecimientos al final de los videos y tutoriales de desarrollo en vivo de komorebi .
Si desea dar propina o patrocinar el proyecto pero no puede utilizar los patrocinadores de GitHub, también puede patrocinar a través de Ko-fi.
Hay disponible una guía detallada de instalación y inicio rápido que muestra cómo comenzar a usar scoop
, winget
o Build desde la fuente.
Olge, miembro de la comunidad, ha creado un excelente vídeo que compara las funciones predeterminadas de administración de ventanas de Windows 11, Fancy Zones y komorebi.
Si no está familiarizado con los administradores de ventanas en mosaico o si está mirando komorebi y se pregunta "¿en qué se diferencia esto de Fancy Zones?", este breve video responderá la mayoría de sus preguntas.
@amnweb muestra komorebi v0.1.28
ejecutándose en Windows 11 con bordes de ventana, transparencia de ventana desenfocada y animaciones habilitadas, usando una barra de estado personalizada integrada con las suscripciones a eventos del Administrador de ventanas de komorebi .
@haxibami muestra komorebi ejecutándose en Windows 11 con un emulador de terminal, un navegador web y un editor de código. El vídeo original se puede ver aquí.
@aik2mlj muestra komorebi ejecutándose en Windows 11 con múltiples espacios de trabajo, emuladores de terminal, un navegador web y la barra de estado de yasb con el widget del espacio de trabajo de komorebi habilitado. El vídeo original se puede ver aquí.
Si desea contribuir a komorebi
tómese el tiempo para leer atentamente las pautas a continuación.
use
cargo +stable clippy
y asegúrese de que se hayan abordado todas las pelusas y sugerencias antes de comprometerse.cargo +nightly fmt --all
para garantizar un formato coherente antes de confirmargit cz
con la CLI de Commitizen para preparar mensajes de confirmaciónEs muy difícil revisar las solicitudes de extracción que afectan a múltiples funciones y partes del código base no relacionadas.
No envíe solicitudes de extracción como esta; Se le pedirá que los separe en RP más pequeños que se ocupen solo de una característica o corrección de errores a la vez.
Si está trabajando en múltiples funciones y correcciones de errores, le sugiero que corte una rama llamada local-trunk
de master
que mantenga actualizada y que rebase las diversas ramas independientes en las que está trabajando en esa rama si desea probarlas. juntos o crear una construcción con todo integrado.
komorebi
es una base de código madura con una consistencia y estructura internas que se ha desarrollado orgánicamente durante casi media década.
Hay innumerables horas de videos de codificación en vivo que demuestran el trabajo en este proyecto y muestran a los nuevos contribuyentes cómo hacer de todo, desde tareas básicas como implementar nuevos comandos komorebic
hasta distinguir monitores por identificadores de hardware del fabricante y puertos de tarjetas de video.
Los refactores de la estructura del código base no se toman a la ligera y requieren discusión y aprobación previa.
No comience a refactorizar el código base con la expectativa de integrar los cambios hasta que reciba una aprobación explícita o una solicitud para hacerlo.
De manera similar, cuando implemente características y correcciones de errores, respete la estructura del código base tanto como sea posible y no aproveche esto como una oportunidad para realizar algunas "refactorizaciones en el camino".
Es extremadamente difícil revisar los PR en busca de características y correcciones de errores si se pierden en cambios radicales en la estructura del código base.
Esto incluye pero no se limita a:
komorebic
komorebi.json
komorebi-application-specific-configuration
Ningún usuario debería descubrir que su archivo de configuración ha dejado de funcionar después de actualizar a una nueva versión de komorebi
.
La mayoría de las veces hay formas de reformular cambios que inicialmente pueden parecer que requieren dividir las interfaces de usuario en cambios aditivos.
Para inspirarse, eche un vistazo a este compromiso que agregó la capacidad para que los usuarios especifiquen colores en komorebi.json
en formato hexadecimal junto con RGB.
También existe un proceso para la desactivación elegante y sin interrupciones de las opciones de configuración que ya no son necesarias.
komorebi
tiene la licencia Komorebi 1.0.0, que es una bifurcación de la licencia PolyForm Strict 1.0.0. En un nivel alto, esto significa que eres libre de hacer lo que quieras con komorebi
para uso personal que no sea la redistribución o distribución de nuevos trabajos (es decir, hard-forks) basados en el software.
Cualquiera es libre de crear su propia bifurcación de komorebi
con cambios destinados a uso personal o para la integración en sentido ascendente mediante solicitudes de extracción.
La Licencia Komorebi 1.0.0 no permite ningún tipo de uso comercial.
En 2025 se introducirá una licencia específica y un EULA para organizaciones comerciales y no comerciales.
Consulte CONTRIBUTING.md para obtener más información sobre cómo se licencian las contribuciones de código a komorebi
.
Si utiliza IntelliJ, debe habilitar las siguientes configuraciones para garantizar que el IDE reconozca el código generado por las macros para su finalización y navegación:
Expand declarative macros
para Use new engine
en "Configuración > Idiomas y marcos > Rust"org.rust.cargo.evaluate.build.scripts
org.rust.macros.proc
Los registros de komorebi
se agregarán a %LOCALAPPDATA%/komorebi/komorebi.log
; este archivo nunca se rota ni se sobrescribe, por lo que seguirá creciendo hasta que el usuario lo elimine.
Siempre que se ejecuta el comando komorebic stop
o se envía una señal Ctrl-C directamente a komorebi
, el proceso komorebi
garantiza que todas las ventanas ocultas se restablezcan antes de la terminación.
Sin embargo, si alguna vez termina con ventanas que están ocultas y no se pueden restaurar, se almacena una lista de identificadores de ventanas conocidos por komorebi
y se actualiza continuamente en %LOCALAPPDATA%/komorebi//komorebi.hwnd.json
.
Al ejecutar komorebic restore-windows
leerá la lista de identificadores de ventanas y los restaurará a la fuerza, independientemente de si el proceso principal komorebi
se está ejecutando.
Si komorebi
alguna vez deja de responder, lo más probable es que se deba a pánico o a un punto muerto. En caso de pánico, esto se informará en el registro. En caso de un punto muerto, no habrá ningún error en el registro, pero el proceso y el registro aparecerán congelados.
Si cree que ha encontrado un punto muerto, puede compilar komorebi
con --features deadlock_detection
e intentar reproducir el punto muerto nuevamente. Esto buscará interbloqueos cada 5 segundos en segundo plano y, si se encuentra un interbloqueo, aparecerá información al respecto en el registro que se puede compartir al abrir un problema.
El estado actual del administrador de ventanas se puede consultar utilizando el comando komorebic state
, que devuelve una representación JSON de la estructura State
.
Esto también se puede sondear para crear más integraciones y widgets.
Es posible suscribirse a notificaciones de cada WindowManagerEvent
y SocketMessage
manejados por komorebi
usando Named Pipes.
Primero, su aplicación debe crear una canalización con nombre. Una vez que se haya creado la canalización con nombre, ejecute el siguiente comando:
komorebic.exe subscribe - pipe < your pipe name >
Tenga en cuenta que no es necesario incluir la ruta completa de la canalización con nombre, solo el nombre.
Si la canalización con nombre existe, komorebi
comenzará a enviar datos JSON de eventos y mensajes manejados exitosamente:
{ "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" :{}}
Luego puede filtrar por clave type
para escuchar los eventos que le interesan. Para obtener una lista completa de posibles tipos de notificación, consulte las variantes de enumeración de WindowManagerEvent
en komorebi
y SocketMessage
en komorebi::core
.
A continuación se muestra un ejemplo de cómo puede suscribirse y filtrar eventos utilizando una canalización con nombre en 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 ;
}
} ) ;
Es posible suscribirse a notificaciones de cada WindowManagerEvent
y SocketMessage
manejados por komorebi
utilizando Unix Domain Sockets.
Los UDS son también el único modo de comunicación entre komorebi
y komorebic
.
Primero, su aplicación debe crear un socket en $ENV:LocalAppDatakomorebi
. Una vez que se haya creado el socket, ejecute el siguiente comando:
komorebic.exe subscribe - socket < your socket name >
Si el socket existe, komorebi comenzará a enviar datos JSON de eventos y mensajes manejados exitosamente como en el ejemplo anterior en la sección Canalizaciones con nombre.
A partir de v0.1.22
es posible utilizar la caja komorebi-client
para suscribirse a notificaciones de cada WindowManagerEvent
y SocketMessage
manejados por komorebi
en una base de código Rust.
A continuación se muestra un ejemplo sencillo de cómo utilizar komorebi-client
en una aplicación básica de Rust.
// 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 ejemplo del mundo de lectura se puede encontrar en komokana.
Se puede generar un esquema JSON de las notificaciones de eventos emitidas a los suscriptores con el comando komorebic notification-schema
. La salida de este comando se puede redirigir al portapapeles o a un archivo, que se puede usar con servicios como Quicktype para generar definiciones de tipos en diferentes lenguajes de programación.
Opcionalmente, se puede exponer un escucha TCP en un puerto de su elección con el indicador --tcp-port=N
. Si este indicador no se proporciona a komorebi
o komorebic start
, no se creará ningún escucha TCP.
Una vez creado, su cliente puede enviar cualquier SocketMessage a komorebi
de la misma manera que lo haría komorebic
.
Esto se puede utilizar si desea crear su propia alternativa a komorebic
que incorpore secuencias de comandos y varias capas de middleware, y de manera similar se puede utilizar si desea integrar komorebi
con un controlador de entrada personalizado.
Si un cliente envía un mensaje no reconocido, se desconectará y deberá volver a conectarse antes de intentar comunicarse nuevamente.
Se puede generar un esquema JSON de mensajes de socket utilizados para enviar instrucciones a komorebi
con el comando komorebic socket-schema
. La salida de este comando se puede redirigir al portapapeles o a un archivo, que se puede usar con servicios como Quicktype para generar definiciones de tipos en diferentes lenguajes de programación.
En primer lugar, gracias a mi esposa, tanto por ponerle nombre a este proyecto como por su paciencia durante su interminable desarrollo.
Gracias a @sitiom por ser un líder ejemplar de la comunidad de código abierto
Gracias a los desarrolladores de nog que me precedieron y cuyo trabajo me enseñó más de lo que puedo esperar devolver.
Gracias a los desarrolladores de GlazeWM por superar los límites de la gestión de ventanas en mosaico en Windows conmigo y por tener un excelente espíritu de colaboración.
Gracias a @Ciantic por ayudarme a traer la función oculta de encubrimiento de escritorios virtuales a komorebi