Управление окнами плиток для Windows.
komorebi — это тайловый оконный менеджер, который работает как расширение диспетчера окон рабочего стола Microsoft в Windows 10 и более поздних версиях.
komorebi позволяет вам управлять окнами приложений, виртуальными рабочими пространствами и мониторами с помощью интерфейса командной строки, который можно использовать со сторонним программным обеспечением, таким как whkd
и AutoHotKey, для установки пользовательских сочетаний клавиш.
komorebi по умолчанию стремится внести как можно меньше изменений в операционную систему и среду рабочего стола. Пользователи могут вносить такие изменения в свои собственные файлы конфигурации для komorebi , но в обозримом будущем они останутся включенными и отключенными по умолчанию.
Пожалуйста, обратитесь к документации за инструкциями по установке и настройке komorebi , общими рабочими процессами, полным справочником по схеме конфигурации и полным справочником по CLI.
Существует сервер Discord для обсуждения, помощи, устранения неполадок и т. д., связанного с komorebi . Если у вас есть пожелания по конкретным функциям или ошибкам, о которых нужно сообщить, создайте проблему в этом репозитории.
Есть канал на YouTube, где я публикую видеоролики о разработке комореби . Если вы хотите получать уведомления о предстоящих видео, подпишитесь и включите уведомления.
Существует потрясающий список, в котором демонстрируется множество замечательных проектов, существующих в экосистеме комореби .
komorebi — это бесплатный проект с доступными исходными кодами, который поощряет вас делать благотворительные пожертвования, если вы считаете программное обеспечение полезным и имеете финансовые средства.
Я призываю вас сделать благотворительное пожертвование в Фонд помощи палестинским детям, прежде чем вы решите спонсировать меня на GitHub.
Спонсоры GitHub включены для этого проекта. К сожалению, мне нечего предложить, кроме моей благодарности и словесных возгласов в конце видеороликов и руководств по разработке в режиме реального времени komorebi .
Если вы хотите дать чаевые или спонсировать проект, но не можете использовать спонсоров GitHub, вы также можете спонсировать через Ko-fi.
Доступно подробное руководство по установке и быстрому запуску, в котором показано, как начать использовать scoop
, winget
или сборку из исходного кода.
Участник сообщества Ольге создал отличное видео, в котором сравниваются функции управления окнами по умолчанию в Windows 11, Fancy Zones и komorebi.
Если вы не знакомы с тайловыми оконными менеджерами или смотрите на komorebi и задаетесь вопросом: «Чем это отличается от Fancy Zones?», это короткое видео ответит на большинство ваших вопросов.
@amnweb показывает komorebi v0.1.28
, работающий в Windows 11 с границами окон, прозрачностью несфокусированного окна и включенной анимацией, с использованием настраиваемой строки состояния, интегрированной с помощью подписки на события оконного менеджера komorebi .
@haxibami показывает komorebi , работающий в Windows 11 с эмулятором терминала, веб-браузером и редактором кода. Оригинальное видео можно посмотреть здесь.
@aik2mlj показывает komorebi , работающий в Windows 11 с несколькими рабочими пространствами, эмуляторами терминала, веб-браузером и строкой состояния yasb с включенным виджетом рабочей области komorebi . Оригинальное видео можно посмотреть здесь.
Если вы хотите внести свой вклад в пользу komorebi
пожалуйста, найдите время и внимательно прочтите приведенные ниже рекомендации.
use
cargo +stable clippy
и убедитесь, что все замечания и предложения учтены, прежде чем совершать коммит.cargo +nightly fmt --all
чтобы обеспечить согласованное форматирование перед фиксацией.git cz
с интерфейсом командной строки Commitizen для подготовки сообщений о коммитах.Очень сложно проверять запросы на включение, которые затрагивают несколько несвязанных между собой функций и частей кодовой базы.
Пожалуйста, не отправляйте подобные запросы на включение; вас попросят разделить их на более мелкие PR, которые касаются только одной функции или исправления ошибок за раз.
Если вы работаете над несколькими функциями и исправлениями ошибок, я предлагаю вам вырезать ветку под названием local-trunk
из master
, которую вы постоянно обновляете, и перебазировать различные независимые ветки, над которыми вы работаете, в эту ветку, если вы хотите их протестировать. вместе или создайте сборку со всем интегрированным.
komorebi
— это зрелая кодовая база с внутренней согласованностью и структурой, которая органично развивалась в течение почти полувека.
Существует бесчисленное количество часов живых видеороликов с кодированием, демонстрирующих работу над этим проектом и показывающих новым участникам, как делать все, от базовых задач, таких как реализация новых komorebic
команд, до различения мониторов по идентификаторам оборудования производителя и портам видеокарты.
Рефакторинг структуры кодовой базы не воспринимается легкомысленно и требует предварительного обсуждения и одобрения.
Пожалуйста, не начинайте рефакторинг кодовой базы, ожидая, что ваши изменения будут интегрированы, пока вы не получите явное одобрение или запрос на это.
Аналогичным образом, при реализации функций и исправлении ошибок, пожалуйста, придерживайтесь структуры кодовой базы, насколько это возможно, и не воспринимайте это как возможность провести некоторый «рефакторинг по ходу дела».
Чрезвычайно сложно просматривать запросы на добавление новых функций и исправлений ошибок, если они теряются в результате радикальных изменений в структуре кодовой базы.
Это включает, но не ограничивается:
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 не допускает какого-либо коммерческого использования.
Специальная лицензия и EULA будут введены в 2025 году как для коммерческих, так и для некоммерческих организаций.
Пожалуйста, посетите CONTRIBUTING.md для получения дополнительной информации о том, как лицензируется добавление кода в komorebi
.
Если вы используете IntelliJ, вам следует включить следующие настройки, чтобы код, сгенерированный макросами, распознавался IDE для завершения и навигации:
Expand declarative macros
Use new engine
в разделе «Настройки > Языки и платформы > Rust».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
когда-нибудь перестанет отвечать, то, скорее всего, это произойдет либо из-за паники, либо из-за тупиковой ситуации. В случае паники об этом будет сообщено в журнале. В случае взаимоблокировки в журнале не будет ошибок, но процесс и журнал будут выглядеть зависшими.
Если вы считаете, что столкнулись с взаимоблокировкой, вы можете скомпилировать komorebi
с --features deadlock_detection
и попытаться воспроизвести взаимоблокировку еще раз. Это будет проверять наличие взаимоблокировок каждые 5 секунд в фоновом режиме, и если взаимоблокировка будет обнаружена, информация о ней появится в журнале, которым можно будет поделиться при открытии проблемы.
Текущее состояние оконного менеджера можно запросить с помощью команды komorebic state
, которая возвращает JSON-представление структуры State
.
Это также может быть опрошено для создания дополнительных интеграций и виджетов поверх него.
Можно подписаться на уведомления о каждом WindowManagerEvent
и SocketMessage
обрабатываемом komorebi
используя именованные каналы.
Во-первых, ваше приложение должно создать именованный канал. После создания именованного канала выполните следующую команду:
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
, чтобы прослушивать интересующие вас события. Полный список возможных типов уведомлений см. в вариантах перечисления WindowManagerEvent
в komorebi
и SocketMessage
в komorebi::core
.
Ниже приведен пример того, как вы можете подписаться на события и фильтровать их с помощью именованного канала в 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 ;
}
} ) ;
Можно подписаться на уведомления о каждом WindowManagerEvent
и SocketMessage
обрабатываемом komorebi
с использованием доменных сокетов Unix.
UDS также являются единственным способом связи между komorebi
и komorebic
.
Во-первых, ваше приложение должно создать сокет в $ENV:LocalAppDatakomorebi
. После создания сокета выполните следующую команду:
komorebic.exe subscribe - socket < your socket name >
Если сокет существует, komorebi начнет отправлять данные JSON об успешно обработанных событиях и сообщениях, как в примере выше в разделе «Именованные каналы».
Начиная с v0.1.22
можно использовать крейт komorebi-client
для подписки на уведомления о каждом WindowManagerEvent
и SocketMessage
, обрабатываемом komorebi
в кодовой базе Rust.
Ниже приведен простой пример использования komorebi-client
в базовом приложении 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}" ) ;
}
}
}
}
Пример чтения мира можно найти в комокане.
Схема JSON уведомлений о событиях, отправляемых подписчикам, может быть создана с помощью команды komorebic notification-schema
. Вывод этой команды можно перенаправить в буфер обмена или в файл, который можно использовать с такими службами, как Quicktype, для создания определений типов на разных языках программирования.
Прослушиватель TCP может быть дополнительно открыт на выбранном вами порту с помощью флага --tcp-port=N
. Если этот флаг не указан для komorebi
или komorebic start
, прослушиватель TCP создан не будет.
После создания ваш клиент может отправить любое сообщение SocketMessage в komorebi
так же, как это сделал бы komorebic
.
Это можно использовать, если вы хотите создать свою собственную альтернативу komorebic
, которая включает в себя сценарии и различные уровни промежуточного программного обеспечения, и аналогичным образом ее можно использовать, если вы хотите интегрировать komorebi
с пользовательским обработчиком ввода.
Если клиент отправляет неопознанное сообщение, он будет отключен, и ему придется повторно подключиться, прежде чем пытаться снова связаться.
Схема JSON сообщений сокета, используемая для отправки инструкций в komorebi
может быть сгенерирована с помощью команды komorebic socket-schema
. Вывод этой команды можно перенаправить в буфер обмена или в файл, который можно использовать с такими службами, как Quicktype, для создания определений типов на разных языках программирования.
Прежде всего, спасибо моей жене как за название этого проекта, так и за ее терпение на протяжении всего его бесконечного развития.
Спасибо @sitiom за то, что он образцовый лидер сообщества открытого исходного кода.
Спасибо разработчикам nog, которые были до меня и чья работа научила меня большему, чем я когда-либо смогу отплатить.
Спасибо разработчикам GlazeWM за то, что вместе со мной расширили границы управления окнами в Windows и за отличный дух сотрудничества.
Спасибо @Ciantic за помощь в реализации скрытой функции маскировки виртуальных рабочих столов в komorebi