Manajemen Jendela Ubin untuk Windows.
komorebi adalah tiling window manager yang berfungsi sebagai ekstensi dari Desktop Window Manager Microsoft di Windows 10 dan yang lebih baru.
komorebi memungkinkan Anda mengontrol jendela aplikasi, ruang kerja virtual, dan monitor tampilan dengan CLI yang dapat digunakan dengan perangkat lunak pihak ketiga seperti whkd
dan AutoHotKey untuk mengatur pintasan keyboard yang ditentukan pengguna.
komorebi bertujuan untuk membuat sesedikit mungkin modifikasi pada sistem operasi dan lingkungan desktop secara default. Pengguna bebas melakukan modifikasi tersebut pada file konfigurasi mereka sendiri untuk komorebi , namun modifikasi ini akan tetap disertakan dan tidak disertakan secara default di masa mendatang.
Silakan merujuk ke dokumentasi untuk petunjuk tentang cara menginstal dan mengkonfigurasi komorebi , alur kerja umum, referensi skema konfigurasi lengkap, dan referensi CLI lengkap.
Ada server Discord yang tersedia untuk diskusi terkait komorebi , bantuan, pemecahan masalah, dll. Jika Anda memiliki permintaan fitur khusus atau bug untuk dilaporkan, silakan buat masalah di repositori ini.
Ada saluran YouTube tempat saya memposting video pengembangan komorebi . Jika Anda ingin diberi tahu tentang video mendatang, silakan berlangganan dan aktifkan notifikasi.
Ada Daftar Luar Biasa yang menampilkan banyak proyek mengagumkan yang ada di ekosistem komorebi .
komorebi adalah proyek gratis dan tersedia sumbernya, dan proyek yang mendorong Anda untuk memberikan sumbangan amal jika Anda merasa perangkat lunak tersebut berguna dan memiliki kemampuan finansial.
Saya mendorong Anda untuk memberikan sumbangan amal kepada Dana Bantuan Anak-Anak Palestina sebelum Anda mempertimbangkan untuk mensponsori saya di GitHub.
Sponsor GitHub diaktifkan untuk proyek ini. Sayangnya saya tidak memiliki sesuatu yang spesifik untuk ditawarkan selain rasa terima kasih dan teriakan saya di akhir video dan tutorial pengembangan langsung komorebi .
Jika Anda ingin memberi tip atau mensponsori proyek tetapi tidak dapat menggunakan GitHub Sponsor, Anda juga dapat mensponsori melalui Ko-fi.
Tersedia panduan instalasi dan mulai cepat terperinci yang menunjukkan cara mulai menggunakan scoop
, winget
atau membangun dari sumber.
Anggota komunitas Olge telah membuat video luar biasa yang membandingkan fitur manajemen jendela default Windows 11, Fancy Zones, dan komorebi.
Jika Anda belum familiar dengan tiling window manager atau jika Anda sedang melihat komorebi dan bertanya-tanya "apa bedanya dengan Fancy Zones? ?", video pendek ini akan menjawab sebagian besar pertanyaan Anda.
@amnweb menampilkan komorebi v0.1.28
yang berjalan di Windows 11 dengan batas jendela, transparansi jendela tidak fokus, dan animasi diaktifkan, menggunakan bilah status khusus yang terintegrasi menggunakan Langganan Acara Window Manager komorebi .
@haxibami menampilkan komorebi yang berjalan di Windows 11 dengan emulator terminal, browser web, dan editor kode. Video aslinya dapat dilihat di sini.
@aik2mlj menampilkan komorebi yang berjalan di Windows 11 dengan beberapa ruang kerja, emulator terminal, browser web, dan bilah status yasb dengan widget ruang kerja komorebi diaktifkan. Video aslinya dapat dilihat di sini.
Jika Anda ingin berkontribusi pada komorebi
mohon luangkan waktu untuk membaca panduan di bawah ini dengan cermat.
use
cargo +stable clippy
dan pastikan semua serat dan saran telah ditangani sebelum melakukancargo +nightly fmt --all
untuk memastikan pemformatan yang konsisten sebelum melakukangit cz
dengan Commitizen CLI untuk menyiapkan pesan penerapanSangat sulit untuk meninjau permintaan tarik yang menyentuh beberapa fitur dan bagian basis kode yang tidak terkait.
Harap jangan mengirimkan permintaan penarikan seperti ini; Anda akan diminta untuk memisahkannya menjadi PR yang lebih kecil yang hanya menangani satu fitur atau perbaikan bug dalam satu waktu.
Jika Anda sedang mengerjakan beberapa fitur dan perbaikan bug, saya sarankan Anda memotong cabang bernama local-trunk
dari master
yang Anda perbarui, dan rebase berbagai cabang independen yang sedang Anda kerjakan ke cabang itu jika Anda ingin mengujinya bersama-sama atau membuat bangunan dengan segala sesuatunya terintegrasi.
komorebi
adalah basis kode yang matang dengan konsistensi dan struktur internal yang telah berkembang secara organik selama hampir setengah dekade.
Ada banyak sekali video pengkodean langsung yang mendemonstrasikan pekerjaan pada proyek ini dan menunjukkan kepada kontributor baru bagaimana melakukan segalanya mulai dari tugas dasar seperti menerapkan perintah komorebic
baru hingga membedakan monitor berdasarkan pengidentifikasi perangkat keras pabrikan dan port kartu video.
Pemfaktoran ulang terhadap struktur basis kode tidak dianggap enteng dan memerlukan diskusi dan persetujuan sebelumnya.
Harap jangan mulai melakukan pemfaktoran ulang basis kode dengan harapan agar perubahan Anda terintegrasi hingga Anda menerima persetujuan eksplisit atau permintaan untuk melakukannya.
Demikian pula, ketika mengimplementasikan fitur dan perbaikan bug, harap tetap berpegang pada struktur basis kode sebisa mungkin dan jangan menganggap ini sebagai kesempatan untuk melakukan "pemfaktoran ulang selama prosesnya".
Sangat sulit untuk meninjau PR untuk mengetahui fitur dan perbaikan bug jika hilang karena perubahan besar pada struktur basis kode.
Ini termasuk namun tidak terbatas pada:
komorebic
komorebi.json
komorebi-application-specific-configuration
Tidak ada pengguna yang menemukan bahwa file konfigurasi mereka berhenti berfungsi setelah memutakhirkan ke versi baru komorebi
.
Seringkali ada cara untuk memformulasi ulang perubahan yang pada awalnya tampak seperti memerlukan perubahan antarmuka pengguna menjadi perubahan tambahan.
Untuk beberapa inspirasi silakan lihat komitmen ini yang menambahkan kemampuan bagi pengguna untuk menentukan warna dalam komorebi.json
dalam format Hex bersama RGB.
Ada juga proses yang diterapkan untuk penghentian opsi konfigurasi yang anggun, tidak terputus, dan tidak lagi diperlukan.
komorebi
dilisensikan di bawah lisensi Komorebi 1.0.0, yang merupakan cabang dari lisensi PolyForm Strict 1.0.0. Pada tingkat tinggi, ini berarti Anda bebas melakukan apa pun yang Anda inginkan dengan komorebi
untuk penggunaan pribadi selain dari redistribusi, atau distribusi karya baru (misalnya hard-fork) berdasarkan perangkat lunak.
Siapa pun bebas membuat fork komorebi
mereka sendiri dengan perubahan yang ditujukan untuk penggunaan pribadi atau untuk integrasi kembali ke hulu melalui permintaan tarik.
Lisensi Komorebi 1.0.0 tidak mengizinkan penggunaan komersial apa pun.
Lisensi khusus dan EULA akan diperkenalkan pada tahun 2025 untuk organisasi komersial dan nonkomersial.
Silakan lihat CONTRIBUTING.md untuk informasi lebih lanjut tentang bagaimana kontribusi kode ke komorebi
dilisensikan.
Jika Anda menggunakan IntelliJ, Anda harus mengaktifkan pengaturan berikut untuk memastikan bahwa kode yang dihasilkan oleh makro dikenali oleh IDE untuk penyelesaian dan navigasi:
Expand declarative macros
menjadi Use new engine
di bawah "Pengaturan > Bahasa & Kerangka > Rust"org.rust.cargo.evaluate.build.scripts
org.rust.macros.proc
Log dari komorebi
akan ditambahkan ke %LOCALAPPDATA%/komorebi/komorebi.log
; file ini tidak pernah diputar atau ditimpa, sehingga akan terus bertambah hingga dihapus oleh pengguna.
Setiap kali menjalankan perintah komorebic stop
atau mengirim sinyal Ctrl-C ke komorebi
secara langsung, proses komorebi
memastikan bahwa semua jendela tersembunyi dipulihkan sebelum penghentian.
Namun, jika Anda menemukan jendela yang tersembunyi dan tidak dapat dipulihkan, daftar pengendali jendela yang dikenal dengan komorebi
disimpan dan terus diperbarui di %LOCALAPPDATA%/komorebi//komorebi.hwnd.json
.
Menjalankan komorebic restore-windows
akan membaca daftar pegangan jendela dan memulihkannya secara paksa, terlepas dari apakah proses komorebi
utama sedang berjalan.
Jika komorebi
berhenti merespons, kemungkinan besar hal tersebut disebabkan oleh kepanikan atau kebuntuan. Jika terjadi kepanikan, hal ini akan dilaporkan di log. Jika terjadi kebuntuan, tidak akan ada kesalahan apa pun di log, tetapi proses dan log akan tampak terhenti.
Jika Anda yakin telah menemui kebuntuan, Anda dapat mengkompilasi komorebi
dengan --features deadlock_detection
dan mencoba mereproduksi kebuntuan itu lagi. Ini akan memeriksa kebuntuan setiap 5 detik di latar belakang, dan jika kebuntuan ditemukan, informasi tentang kebuntuan itu akan muncul di log yang dapat dibagikan ketika membuka suatu terbitan.
Status window manager saat ini dapat ditanyakan menggunakan perintah komorebic state
, yang mengembalikan representasi JSON dari struct State
.
Ini juga dapat disurvei untuk membangun integrasi dan widget lebih lanjut.
Dimungkinkan untuk berlangganan notifikasi setiap WindowManagerEvent
dan SocketMessage
yang ditangani oleh komorebi
menggunakan Named Pipes.
Pertama, aplikasi Anda harus membuat pipa bernama. Setelah pipa bernama dibuat, jalankan perintah berikut:
komorebic.exe subscribe - pipe < your pipe name >
Perhatikan bahwa Anda tidak harus menyertakan path lengkap dari pipa bernama, cukup namanya saja.
Jika pipa bernama ada, komorebi
akan mulai memasukkan data JSON dari peristiwa dan pesan yang berhasil ditangani:
{ "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" :{}}
Anda kemudian dapat memfilter kunci type
untuk mendengarkan peristiwa yang Anda minati. Untuk daftar lengkap kemungkinan jenis notifikasi, lihat varian enum WindowManagerEvent
di komorebi
dan SocketMessage
di komorebi::core
.
Di bawah ini adalah contoh bagaimana Anda dapat berlangganan dan memfilter acara menggunakan pipa bernama di 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 ;
}
} ) ;
Dimungkinkan untuk berlangganan notifikasi setiap WindowManagerEvent
dan SocketMessage
yang ditangani oleh komorebi
menggunakan Unix Domain Sockets.
UDS juga merupakan satu-satunya cara komunikasi antara komorebi
dan komorebic
.
Pertama, aplikasi Anda harus membuat soket di $ENV:LocalAppDatakomorebi
. Setelah soket dibuat, jalankan perintah berikut:
komorebic.exe subscribe - socket < your socket name >
Jika soket ada, komorebi akan mulai memasukkan data JSON dari peristiwa dan pesan yang berhasil ditangani seperti pada contoh di atas di bagian Pipa Bernama.
Pada v0.1.22
dimungkinkan untuk menggunakan peti komorebi-client
untuk berlangganan notifikasi setiap WindowManagerEvent
dan SocketMessage
yang ditangani oleh komorebi
dalam basis kode Rust.
Di bawah ini adalah contoh sederhana cara menggunakan komorebi-client
di aplikasi dasar 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}" ) ;
}
}
}
}
Contoh dunia baca dapat ditemukan di komokana.
Skema JSON dari notifikasi acara yang dikirimkan ke pelanggan dapat dibuat dengan perintah komorebic notification-schema
. Output dari perintah ini dapat diarahkan ke clipboard atau file, yang dapat digunakan dengan layanan seperti Quicktype untuk menghasilkan definisi tipe dalam berbagai bahasa pemrograman.
Pendengar TCP secara opsional dapat diekspos pada port pilihan Anda dengan flag --tcp-port=N
. Jika tanda ini tidak diberikan ke komorebi
atau komorebic start
, tidak ada pendengar TCP yang akan dibuat.
Setelah dibuat, klien Anda dapat mengirim SocketMessage apa pun ke komorebi
dengan cara yang sama seperti yang dilakukan komorebic
.
Ini dapat digunakan jika Anda ingin membuat alternatif Anda sendiri untuk komorebic
yang menggabungkan skrip dan berbagai lapisan middleware, dan juga dapat digunakan jika Anda ingin mengintegrasikan komorebi
dengan pengendali input khusus.
Jika klien mengirim pesan yang tidak dikenal, pesan tersebut akan terputus dan harus menyambung kembali sebelum mencoba berkomunikasi lagi.
Skema pesan soket JSON yang digunakan untuk mengirim instruksi ke komorebi
dapat dibuat dengan perintah komorebic socket-schema
. Output dari perintah ini dapat diarahkan ke clipboard atau file, yang dapat digunakan dengan layanan seperti Quicktype untuk menghasilkan definisi tipe dalam berbagai bahasa pemrograman.
Pertama-tama, terima kasih kepada istri saya, baik atas nama proyek ini maupun atas kesabarannya sepanjang pengembangan yang tiada henti.
Terima kasih kepada @sitiom karena telah menjadi pemimpin komunitas open source yang patut dicontoh
Terima kasih kepada para pengembang nog yang datang sebelum saya dan yang karyanya mengajari saya lebih dari yang dapat saya harapkan untuk membalasnya
Terima kasih kepada para pengembang GlazeWM karena telah mendorong batas-batas pengelolaan jendela ubin di Windows bersama saya dan memiliki semangat kolaborasi yang luar biasa
Terima kasih kepada @Ciantic karena telah membantu saya menghadirkan fungsi penyelubungan Desktop Virtual yang tersembunyi ke komorebi