Skip to content
🖥️ Window Manager & Compositor

حاوية desktop

الطبقة الأجمل والأكثر تعقيداً في مساحة المستخدم. تجمع بين إدارة مدخلات الماوس والكيبورد، ونظام نوافذ متكامل، والرسم المباشر على الشاشة باستخدام eg-fb. يتم كل هذا بدون حجز ذاكرة ديناميكي (No dynamic allocation) بفضل المعمارية المحكمة.

app_runner

مسار تدفق الأحداث

Event Pipeline

كيف تتحول نقرة الماوس إلى رسمة على الشاشة؟

⌨️

Input IPC

Receive Mouse & KB Events

💾

UI State

Update Static Mut Data

🥞

Window Manager

Z-Order & Focus Logic

🎨

Compositor

Render layers via eg-fb

التواصل مع الحاويات

Container Connections

مع من تتحدث حاوية الديسكتوب وماذا تطلب؟

⬅️
Initيستقبل: fb_vaddr, fb_w, fb_h, fb_pitch, fb_bpp, launch_slot
⬅️
Auth_Vaultيطلب Token (0x100) لاستخدامه مع FS_Vault
⬅️➡️
FS_Vault (ep=2)يجلب قائمة ملفات Desktop ويحدّثها كل 80 حدث ماوس
⬅️
Input_Vault (ep=0)يستقبل: 0x0300=MouseEvent, 0x0301=KeyboardEvent

البرامج المدمجة

Built-in Applications

مدمجة مباشرة في ثنائي الديسكتوب — لا IPC إضافي

🧮

calc

programs/calc

آلة حاسبة بواجهة نافذة كاملة مكتوبة بـ Rust

📁

files

programs/files

متصفح ملفات يتواصل مع FS_Vault لعرض المجلدات والملفات

✏️

editor

programs/editor

محرر نصوص بسيط يعمل داخل نافذة مع دعم الكيبورد الكامل

🖼️

viewer

programs/viewer

عارض محتوى يقرأ الملفات من نظام الملفات ويعرضها في نافذة

إحصائيات الحاوية

Container Stats

256 KB
VAULT_HEAP (ثابت في BSS)
283
أسطر main.rs (نقطة الدخول)
4
تطبيقات مدمجة (calc, files, editor, viewer)
9
مكتبات في Cargo.toml
80
حدث ماوس بين كل تحديث لسطح المكتب
0
Dynamic Allocations في حلقة الأحداث

قرارات الأداء

Performance Decisions

🎯

Single-Buffer Mode (بدون Double Buffer)

نرسم مباشرة على MMIO Framebuffer بدلاً من إنشاء back-buffer في الذاكرة (كان سيستهلك ~3MB static في BSS). الثمن هو وميض خفيف أحياناً، والمكسب توفير كامل لذاكرة الـ BSS.

render_window() بدلاً من render() الكامل

عند تمرير شريط الملفات أو تحديث محتوى نافذة واحدة، يُعاد رسم تلك النافذة فقط (Compositor::render_window) بدلاً من إعادة رسم الشاشة كاملاً، مما يمنع الوميض المرئي.

🖱️

تحديث الـ Dock كل 4 أحداث فقط

تأثير تكبير أيقونات الـ Dock (Zoom on Hover) يُحسب في كل حدث ماوس ولكن يُرسم فقط كل 4 أحداث (loop_counter % 4 == 0) لتجنب استنزاف معالج الرسومات بإعادة رسم كاملة متكررة.

🚀

main.rs

Entry Point
containers/desktop/src/main.rs

نقطة الدخول الفعلية للحاوية. يستقبل إحداثيات الـ Framebuffer من Init عبر IPC، يجلب Token من Auth_Vault، يهيئ UIState في static storage، ثم يدخل في حلقة أحداث لا نهائية تعالج الماوس والكيبورد.

حلقة الأحداث:tag 0x0300 = MouseEvent, 0x0301 = KeyboardEvent
المخصص الثابت:VAULT_HEAP [u8; 256KB] عبر talc
🎨

wm/compositor.rs

Compositor
containers/desktop/src/desktop_ui/wm/compositor.rs

قلب نظام الرسم. يرسم كل الطبقات بالترتيب: الخلفية، ثم النوافذ حسب Z-Order، ثم شريط المهام والـ Dock، ثم المؤشر في الأعلى. يدعم رسم نافذة واحدة (render_window) لتجنب الوميض.

رسم كامل:Compositor::render(fb, state, zstack)
رسم نافذة واحدة:Compositor::render_window(fb, state, win_id)
💾

desktop_ui/mod.rs

UI State
containers/desktop/src/desktop_ui/mod.rs

يعرّف هيكل UIState المركزي المخزن في static mut. يحتوي على حالة كل النوافذ، الـ ZOrderStack، شريط المهام، حالة السحب، مؤشر الماوس، وقنوات IPC. كل شيء بدون تخصيص ديناميكي.

حالة ثابتة:static mut UI_STORAGE_BYTES في main.rs
إعداد الحجم:UIState::init(ptr, fs_ep, token, ipc_buf)
🥞

wm/zorder.rs

Window Layering
containers/desktop/src/desktop_ui/wm/zorder.rs

يدير ZOrderStack الذي يحدد ترتيب رسم النوافذ. عند النقر على نافذة يتم استدعاء bring_to_front لنقلها لقمة المكدس فترسم آخراً وتظهر فوق الجميع. يدعم rebuild_from_open لإعادة بناء الترتيب.

رفع النافذة:bring_to_front(window_id)
إعادة البناء:rebuild_from_open(is_open)
📋

wm/taskbar.rs

Taskbar
containers/desktop/src/desktop_ui/wm/taskbar.rs

يدير شريط المهام السفلي: تسجيل التطبيقات المفتوحة، حساب تخطيط الأزرار، ومعالجة النقر لتفعيل أو تصغير النوافذ. يتكيف مع أي دقة شاشة عبر set_screen.

تسجيل تطبيق:taskbar.register(window_id, label)
معالجة النقر:taskbar.on_click(cx, cy) -> Option<Option<usize>>
🖱️

wm/shortcut.rs

Desktop Shortcuts
containers/desktop/src/desktop_ui/wm/shortcut.rs

يدير أيقونات سطح المكتب (Shortcuts) المرسومة على الخلفية. يخزن اسم التطبيق، مساره، ومعرّف الأيقونة. يدعم hit-testing للتحقق من النقر على أيقونة معينة.

اكتشاف النقر:shortcut.hit(cx, cy) -> bool
إيجاد المنقور عليه:find_hit(cx, cy) -> Option<usize>
✏️

desktop_ui/draw.rs

Drawing
containers/desktop/src/desktop_ui/draw.rs

مكتبة الرسم المركزية للـ UI. تحتوي على دوال رسم الـ Dock بتأثير تكبير ديناميكي عند التحوم (Zoom on Hover)، شريط المهام، قائمة Start، وأيقونات الاختصارات بجميع أنواعها.

الـ Dock:draw_dock_only(fb, state) مع dock_icon_size()
أيقونات مخصصة:icon_terminal / icon_vault / icon_files / icon_tor
🖱️

cursor.rs

Cursor
containers/desktop/src/cursor.rs

يدير مؤشر الماوس بتقنية save/restore: قبل رسم المؤشر يحفظ الـ pixels التي ستُغطى في CURSOR_BG static، وعند الحركة يعيدها ثم يرسم المؤشر في الموضع الجديد لمنع التلف البصري.

حفظ الخلفية:save_bg(fb, cx, cy, bg: &mut [Rgb888])
الرسم والاستعادة:draw_cursor() / restore_bg()
🤚

desktop_ui/drag.rs

Drag & Drop
containers/desktop/src/desktop_ui/drag.rs

يدير حالة السحب (Drag) للنوافذ وشريط التمرير. يتتبع DragTarget (WindowMove أو FilesScrollbar) ويحسب الإزاحة (Δx, Δy) لتحريك النوافذ أو تمرير محتوى نافذة الملفات بسلاسة.

هدف السحب:DragTarget::WindowMove(id) | FilesScrollbar(id)
الحالة:drag.active() -> bool
🪟

window.rs + window_draw.rs

Windows
containers/desktop/src/desktop_ui/

window.rs يعرّف هيكل Window (العنوان، الأبعاد، نوع المحتوى، حالة التعظيم). window_draw.rs يرسم إطار النافذة مع شريط العنوان وأزرار التحكم الثلاثة (إغلاق، تصغير، تعظيم) باستخدام eg-fb.

اكتشاف الأزرار:in_titlebar / in_close_btn / in_maximize_btn
أنواع النوافذ:Calc, Files, Editor, Viewer, Terminal

جميع الحقوق محفوظة © 2026 Qtoom