Windows용 타일링 창 관리.
komorebi 는 Windows 10 이상에서 Microsoft 데스크톱 창 관리자의 확장으로 작동하는 타일링 창 관리자입니다.
komorebi를 사용하면 whkd
및 AutoHotKey와 같은 타사 소프트웨어와 함께 사용하여 사용자 정의 키보드 단축키를 설정할 수 있는 CLI를 통해 애플리케이션 창, 가상 작업 공간 및 디스플레이 모니터를 제어할 수 있습니다.
komorebi는 기본적으로 운영 체제와 데스크탑 환경에 가능한 한 적은 수정을 가하는 것을 목표로 합니다. 사용자는 komorebi 의 구성 파일을 자유롭게 수정할 수 있지만, 가까운 미래에는 기본적으로 선택 및 해제 상태로 유지됩니다.
komorebi 설치 및 구성 방법, 일반적인 작업 흐름, 전체 구성 스키마 참조 및 전체 CLI 참조에 대한 지침은 설명서를 참조하세요.
Komorebi 관련 토론, 도움말, 문제 해결 등에 사용할 수 있는 Discord 서버가 있습니다. 보고할 특정 기능 요청이나 버그가 있는 경우 이 저장소에 문제를 생성하세요.
코모레비 개발 영상을 올리는 유튜브 채널이 있습니다. 앞으로 나올 영상에 대한 알림을 받고 싶으시다면 구독과 알림을 켜주세요.
코모레비 생태계에 존재하는 수많은 멋진 프로젝트를 보여주는 Awesome List가 있습니다.
komorebi 는 무료로 소스를 사용할 수 있는 프로젝트이며, 소프트웨어가 유용하고 재정적 여유가 있다고 판단되면 자선 기부를 하도록 장려하는 프로젝트입니다.
GitHub에서 저를 후원하기 전에 팔레스타인 아동 구호 기금에 자선 기부를 해주시기 바랍니다.
이 프로젝트에 GitHub 후원자가 활성화되었습니다. 불행히도 Komorebi 라이브 개발 비디오와 튜토리얼이 끝나면 감사와 외침 외에 특별히 드릴 말씀이 없습니다.
프로젝트에 대한 팁이나 후원을 원하지만 GitHub 후원자를 사용할 수 없는 경우 Ko-fi를 통해 후원할 수도 있습니다.
scoop
, winget
또는 소스에서 빌드를 사용하여 시작하는 방법을 보여주는 자세한 설치 및 빠른 시작 가이드가 제공됩니다.
커뮤니티 회원 Olge는 Windows 11, Fancy Zones 및 komorebi의 기본 창 관리 기능을 비교하는 훌륭한 비디오를 만들었습니다.
타일링 창 관리자에 익숙하지 않거나 komorebi를 보고 "이게 Fancy Zones와 어떻게 다릅니까?"라고 궁금해하신다면, 이 짧은 영상이 대부분의 질문에 답해 줄 것입니다.
@amnweb은 komorebi 의 창 관리자 이벤트 구독을 사용하여 통합된 사용자 정의 상태 표시줄을 사용하여 창 테두리, 초점이 맞지 않는 창 투명도 및 애니메이션이 활성화된 Windows 11에서 실행되는 komorebi v0.1.28
보여줍니다.
@haxibami는 터미널 에뮬레이터, 웹 브라우저 및 코드 편집기를 사용하여 Windows 11에서 실행되는 komorebi를 보여줍니다. 원본 영상은 여기에서 보실 수 있습니다.
@aik2mlj는 여러 작업 공간, 터미널 에뮬레이터, 웹 브라우저 및 komorebi 작업 공간 위젯이 활성화된 yasb 상태 표시줄이 있는 Windows 11에서 실행되는 komorebi를 보여줍니다. 원본 영상은 여기에서 보실 수 있습니다.
komorebi
에 기여하고 싶다면 시간을 내어 아래 지침을 주의 깊게 읽어보시기 바랍니다.
use
문을 평면화cargo +stable clippy
실행하고 커밋하기 전에 모든 린트와 제안이 해결되었는지 확인하세요.cargo +nightly fmt --all
실행하세요.git cz
사용하세요.관련되지 않은 여러 기능과 코드베이스의 일부를 건드리는 풀 요청을 검토하는 것은 매우 어렵습니다.
이와 같은 풀 요청을 제출하지 마십시오. 한 번에 하나의 기능이나 버그 수정만 다루는 더 작은 PR로 분리하라는 메시지가 표시됩니다.
여러 기능 및 버그 수정 작업을 수행하는 경우 최신 상태를 유지하는 master
에서 local-trunk
라는 분기를 잘라내고 테스트하려는 경우 작업 중인 다양한 독립 분기를 해당 분기에 리베이스하는 것이 좋습니다. 함께 만들거나 모든 것이 통합된 빌드를 만들 수 있습니다.
komorebi
는 거의 5년에 걸쳐 유기적으로 개발된 내부 일관성과 구조를 갖춘 성숙한 코드베이스입니다.
이 프로젝트에 대한 작업을 시연하고 새로운 komorebic
명령 구현과 같은 기본 작업부터 제조업체 하드웨어 식별자 및 비디오 카드 포트별로 모니터를 구별하는 것과 같은 기본 작업부터 모든 작업을 수행하는 방법을 새로운 기여자에게 보여주는 수많은 라이브 코딩 비디오가 있습니다.
코드베이스 구조에 대한 리팩터링은 가볍게 수행되지 않으며 사전 논의와 승인이 필요합니다.
명시적인 승인이나 요청을 받을 때까지 변경 사항이 통합될 것이라는 기대로 코드베이스 리팩토링을 시작하지 마십시오.
마찬가지로, 기능 및 버그 수정을 구현할 때 가능한 한 코드베이스의 구조를 고수하고 이를 "중간 리팩토링"을 수행할 기회로 삼지 마십시오.
코드베이스 구조에 대한 대대적인 변경으로 인해 PR이 손실된 경우 기능 및 버그 수정에 대한 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
포크를 자유롭게 만들 수 있습니다.
Komorebi 1.0.0 라이센스는 어떠한 종류의 상업적 사용도 허용하지 않습니다.
2025년에는 상업용 및 비상업적 조직 모두를 위한 전용 라이선스와 EULA가 도입될 예정입니다.
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초마다 교착 상태를 확인하고, 교착 상태가 발견되면 문제를 열 때 공유할 수 있는 로그에 이에 대한 정보가 표시됩니다.
창 관리자의 현재 상태는 State
구조체의 JSON 표현을 반환하는 komorebic state
명령을 사용하여 쿼리할 수 있습니다.
이는 또한 추가 통합 및 위젯을 구축하기 위해 폴링될 수도 있습니다.
명명된 파이프를 사용하여 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
열거형 변형을 참조하세요.
다음은 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에게 감사드립니다.