تبليط إدارة النوافذ لنظام التشغيل Windows.
komorebi هو مدير نوافذ متبلط يعمل كملحق لبرنامج Microsoft Desktop Window Manager في نظام التشغيل Windows 10 والإصدارات الأحدث.
يتيح لك komorebi التحكم في نوافذ التطبيقات ومساحات العمل الافتراضية وشاشات العرض باستخدام واجهة سطر الأوامر (CLI) التي يمكن استخدامها مع برامج الطرف الثالث مثل whkd
وAutoHotKey لتعيين اختصارات لوحة المفاتيح المعرفة من قبل المستخدم.
يهدف komorebi إلى إجراء أقل عدد ممكن من التعديلات على نظام التشغيل وبيئة سطح المكتب بشكل افتراضي. يتمتع المستخدمون بحرية إجراء مثل هذه التعديلات في ملفات التكوين الخاصة بهم لـ komorebi ، لكن هذه الملفات ستظل قابلة للاشتراك وإيقاف التشغيل افتراضيًا في المستقبل المنظور.
برجاء الرجوع إلى الوثائق للحصول على إرشادات حول كيفية تثبيت وتكوين komorebi ، ومسارات العمل الشائعة، ومرجع مخطط التكوين الكامل، ومرجع واجهة سطر الأوامر (CLI) الكامل.
يوجد خادم Discord متاح للمناقشة والمساعدة واستكشاف الأخطاء وإصلاحها المتعلقة بالكوموريبي وما إلى ذلك. إذا كان لديك أي طلبات ميزات محددة أو أخطاء للإبلاغ عنها، فيرجى إنشاء مشكلة في هذا المستودع.
هناك قناة على اليوتيوب أنشر فيها مقاطع فيديو حول تطوير كوموريبي . إذا كنت تريد أن يصلك إشعار بالفيديوهات القادمة، يرجى الاشتراك وتفعيل التنبيهات.
هناك قائمة رائعة تعرض العديد من المشاريع الرائعة الموجودة في نظام كوموريبي البيئي.
komorebi هو مشروع مجاني ومتاح المصدر، وهو يشجعك على تقديم تبرعات خيرية إذا وجدت البرنامج مفيدًا وتملك الإمكانيات المالية.
أنا أشجعك على التبرع الخيري لصندوق إغاثة أطفال فلسطين قبل أن تفكر في رعايتي على GitHub.
تم تمكين رعاة GitHub لهذا المشروع. لسوء الحظ ليس لدي أي شيء محدد لأقدمه إلى جانب امتناني وصيحاتي في نهاية مقاطع الفيديو والبرامج التعليمية للتطوير المباشر لـ komorebi .
إذا كنت ترغب في تقديم إكرامية أو رعاية للمشروع ولكنك غير قادر على استخدام رعاة GitHub، فيمكنك أيضًا الرعاية من خلال Ko-fi.
يتوفر دليل مفصل للتثبيت والبدء السريع يوضح كيفية البدء باستخدام scoop
أو winget
أو البناء من المصدر.
أنشأ عضو المجتمع Olge مقطع فيديو ممتازًا يقارن بين ميزات إدارة النوافذ الافتراضية في Windows 11 وFancy Zones وkomorebi.
إذا لم تكن على دراية بمديري النوافذ المتبلطين أو إذا كنت تنظر إلى كوموريبي وتتساءل "كيف يختلف هذا عن Fancy Zones؟؟"، فإن هذا الفيديو القصير سوف يجيب على معظم أسئلتك.
@amnweb يعرض إصدار komorebi v0.1.28
الذي يعمل على نظام التشغيل Windows 11 مع تمكين حدود النوافذ وشفافية النوافذ غير المركزة والرسوم المتحركة، باستخدام شريط حالة مخصص مدمج باستخدام اشتراكات أحداث Window Manager الخاصة بـ komorebi .
@haxibami يُظهر komorebi الذي يعمل على نظام التشغيل Windows 11 باستخدام محاكي طرفي ومتصفح ويب ومحرر أكواد. يمكن مشاهدة الفيديو الأصلي هنا.
@aik2mlj يعرض komorebi الذي يعمل على نظام التشغيل Windows 11 مع مساحات عمل متعددة، ومحاكيات طرفية، ومتصفح ويب، وشريط الحالة yasb مع تمكين عنصر واجهة مستخدم komorebi . يمكن مشاهدة الفيديو الأصلي هنا.
إذا كنت ترغب في المساهمة في komorebi
فيرجى تخصيص الوقت لقراءة الإرشادات أدناه بعناية.
use
cargo +stable clippy
وتأكد من معالجة جميع الوبر والاقتراحات قبل الالتزامcargo +nightly fmt --all
لضمان التنسيق المتسق قبل الالتزامgit cz
مع Commitizen CLI لإعداد رسائل الالتزاممن الصعب جدًا مراجعة طلبات السحب التي تمس ميزات وأجزاء متعددة غير مرتبطة بقاعدة التعليمات البرمجية.
من فضلك لا ترسل طلبات السحب مثل هذا؛ سيُطلب منك تقسيمها إلى ممثلين رئيسيين أصغر يتعاملون مع ميزة واحدة أو إصلاح خطأ واحد فقط في كل مرة.
إذا كنت تعمل على ميزات متعددة وإصلاحات للأخطاء، أقترح عليك قطع فرع يسمى local-trunk
من master
والذي تحافظ عليه محدثًا، وإعادة تأسيس الفروع المستقلة المتنوعة التي تعمل عليها على هذا الفرع إذا كنت تريد اختبارها معًا أو إنشاء تصميم يتضمن كل شيء متكامل.
komorebi
هي قاعدة تعليمات برمجية ناضجة ذات اتساق داخلي وبنية تطورت عضويًا على مدار ما يقرب من نصف عقد.
هناك ساعات لا حصر لها من مقاطع فيديو الترميز المباشر التي توضح العمل في هذا المشروع وتُظهر للمساهمين الجدد كيفية القيام بكل شيء بدءًا من المهام الأساسية مثل تنفيذ أوامر komorebic
الجديدة وحتى تمييز الشاشات بواسطة معرفات الأجهزة المصنعة ومنافذ بطاقة الفيديو.
لا يتم الاستخفاف بإعادة بناء بنية قاعدة التعليمات البرمجية وتتطلب مناقشة وموافقة مسبقة.
يرجى عدم البدء في إعادة هيكلة قاعدة التعليمات البرمجية مع توقع دمج التغييرات الخاصة بك حتى تتلقى موافقة صريحة أو طلبًا للقيام بذلك.
وبالمثل، عند تنفيذ الميزات وإصلاحات الأخطاء، يرجى الالتزام ببنية قاعدة التعليمات البرمجية قدر الإمكان ولا تغتنم هذه الفرصة لإجراء بعض "إعادة البناء على طول الطريق".
من الصعب للغاية مراجعة العلاقات العامة بحثًا عن الميزات وإصلاحات الأخطاء إذا تم فقدها في التغييرات الشاملة على بنية قاعدة التعليمات البرمجية.
وهذا يشمل على سبيل المثال لا الحصر:
komorebic
komorebi.json
komorebi-application-specific-configuration
لا ينبغي لأي مستخدم أن يجد أن ملف التكوين الخاص به قد توقف عن العمل بعد الترقية إلى إصدار جديد من komorebi
.
في أغلب الأحيان، توجد طرق لإعادة صياغة التغييرات التي قد تبدو في البداية وكأنها تتطلب تقسيم الواجهات التي تواجه المستخدم إلى تغييرات إضافية.
للحصول على بعض الإلهام، يرجى إلقاء نظرة على هذا الالتزام الذي أضاف قدرة المستخدمين على تحديد الألوان في komorebi.json
بتنسيق Hex إلى جانب RGB.
هناك أيضًا عملية مطبقة لإهمال خيارات التكوين التي لم تعد مطلوبة بشكل رشيق وغير منقطع.
تم ترخيص 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
ضمن "الإعدادات > اللغات والأطر > الصدأ"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
باستخدام Named Pipes.
أولاً، يجب أن يقوم التطبيق الخاص بك بإنشاء توجيه إخراج مسمى. بمجرد إنشاء الأنبوب المسمى، قم بتشغيل الأمر التالي:
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 Domain Switches.
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}" ) ;
}
}
}
}
يمكن العثور على مثال لعالم القراءة في komokana.
يمكن إنشاء مخطط JSON لإشعارات الأحداث المرسلة إلى المشتركين باستخدام أمر komorebic notification-schema
. يمكن إعادة توجيه مخرجات هذا الأمر إلى الحافظة أو إلى ملف، والذي يمكن استخدامه مع خدمات مثل Quicktype لإنشاء تعريفات النوع بلغات برمجة مختلفة.
يمكن بشكل اختياري عرض مستمع TCP على منفذ من اختيارك باستخدام علامة --tcp-port=N
. إذا لم يتم توفير هذه العلامة لـ komorebi
أو komorebic start
، فلن يتم إنشاء مستمع TCP.
بمجرد الإنشاء، قد يرسل عميلك أي رسالة مقبس إلى komorebi
بنفس الطريقة التي يرسلها komorebic
.
يمكن استخدام هذا إذا كنت ترغب في إنشاء بديل خاص بك لـ komorebic
الذي يتضمن البرمجة النصية وطبقات البرامج الوسيطة المختلفة، وبالمثل يمكن استخدامه إذا كنت ترغب في دمج komorebi
مع معالج إدخال مخصص.
إذا أرسل العميل رسالة غير معروفة، فسيتم قطع اتصاله وسيتعين عليه إعادة الاتصال قبل محاولة الاتصال مرة أخرى.
يمكن إنشاء مخطط JSON لرسائل مأخذ التوصيل المستخدمة لإرسال التعليمات إلى komorebi
باستخدام أمر komorebic socket-schema
. يمكن إعادة توجيه مخرجات هذا الأمر إلى الحافظة أو إلى ملف، والذي يمكن استخدامه مع خدمات مثل Quicktype لإنشاء تعريفات النوع بلغات برمجة مختلفة.
أولاً وقبل كل شيء، أشكر زوجتي على تسمية هذا المشروع وعلى صبرها طوال فترة تطوره التي لا تنتهي
شكرًا لـsitiom لكونك قائدًا مثاليًا لمجتمع المصادر المفتوحة
شكرًا لمطوري nog الذين سبقوني والذين علمني عملهم أكثر مما أتمنى أن أرده
شكرًا لمطوري GlazeWM لدفعهم معي حدود إدارة النوافذ المتجانبة على نظام التشغيل Windows والاستمتاع بروح التعاون الممتازة
شكرًا لـCiantic لمساعدتي في إحضار وظيفة إخفاء الهوية المخفية لأجهزة سطح المكتب الافتراضية إلى komorebi