浏览代码

WindowServer: More work on the menu system.

Menus are now tied to a Process (by WeakPtr.) This will allow us to pass
notifications to the correct event stream.
Andreas Kling 6 年之前
父节点
当前提交
15b4c9f9f1

+ 7 - 1
Applications/Terminal/main.cpp

@@ -79,7 +79,13 @@ int main(int argc, char** argv)
     app_menu->add_item(1, "Quit");
     app_menu->add_item(1, "Quit");
     menubar->add_menu(move(app_menu));
     menubar->add_menu(move(app_menu));
 
 
-    auto help_menu = make<GMenu>("?");
+    auto font_menu = make<GMenu>("Font");
+    font_menu->add_item(30, "Liza 8x10");
+    font_menu->add_item(31, "LizaRegular 8x10");
+    font_menu->add_item(32, "LizaBold 8x10");
+    menubar->add_menu(move(font_menu));
+
+    auto help_menu = make<GMenu>("Help");
     help_menu->add_item(2, "About");
     help_menu->add_item(2, "About");
     menubar->add_menu(move(help_menu));
     menubar->add_menu(move(help_menu));
 
 

+ 3 - 2
WindowServer/WSMenu.cpp

@@ -7,9 +7,10 @@
 #include <SharedGraphics/Painter.h>
 #include <SharedGraphics/Painter.h>
 #include <SharedGraphics/Font.h>
 #include <SharedGraphics/Font.h>
 
 
-WSMenu::WSMenu(int menu_id, String&& name)
+WSMenu::WSMenu(Process& process, int menu_id, String&& name)
     : m_menu_id(menu_id)
     : m_menu_id(menu_id)
     , m_name(move(name))
     , m_name(move(name))
+    , m_process(process.make_weak_ptr())
 {
 {
 }
 }
 
 
@@ -88,7 +89,7 @@ void WSMenu::draw()
         if (item->type() == WSMenuItem::Text) {
         if (item->type() == WSMenuItem::Text) {
             Color text_color = Color::Black;
             Color text_color = Color::Black;
             if (item.ptr() == m_hovered_item) {
             if (item.ptr() == m_hovered_item) {
-                painter.fill_rect(item->rect(), Color(0, 0, 104));
+                painter.fill_rect(item->rect(), WSWindowManager::the().menu_selection_color());
                 text_color = Color::White;
                 text_color = Color::White;
             }
             }
             painter.draw_text(item->rect().translated(left_padding(), 0), item->text(), TextAlignment::CenterLeft, text_color);
             painter.draw_text(item->rect().translated(left_padding(), 0), item->text(), TextAlignment::CenterLeft, text_color);

+ 4 - 1
WindowServer/WSMenu.h

@@ -2,6 +2,7 @@
 
 
 #include <AK/AKString.h>
 #include <AK/AKString.h>
 #include <AK/Vector.h>
 #include <AK/Vector.h>
+#include <AK/WeakPtr.h>
 #include <SharedGraphics/Rect.h>
 #include <SharedGraphics/Rect.h>
 #include "WSMenuItem.h"
 #include "WSMenuItem.h"
 
 
@@ -9,10 +10,11 @@ class WSMenuBar;
 class WSMessage;
 class WSMessage;
 class WSWindow;
 class WSWindow;
 class Font;
 class Font;
+class Process;
 
 
 class WSMenu {
 class WSMenu {
 public:
 public:
-    WSMenu(int menu_id, String&& name);
+    WSMenu(Process&, int menu_id, String&& name);
     ~WSMenu();
     ~WSMenu();
 
 
     int menu_id() const { return m_menu_id; }
     int menu_id() const { return m_menu_id; }
@@ -80,5 +82,6 @@ private:
     WSMenuItem* m_hovered_item { nullptr };
     WSMenuItem* m_hovered_item { nullptr };
     Vector<OwnPtr<WSMenuItem>> m_items;
     Vector<OwnPtr<WSMenuItem>> m_items;
     OwnPtr<WSWindow> m_menu_window;
     OwnPtr<WSWindow> m_menu_window;
+    WeakPtr<Process> m_process;
 };
 };
 
 

+ 3 - 1
WindowServer/WSMenuBar.cpp

@@ -1,8 +1,10 @@
 #include "WSMenuBar.h"
 #include "WSMenuBar.h"
 #include "WSMenu.h"
 #include "WSMenu.h"
 #include "WSMenuItem.h"
 #include "WSMenuItem.h"
+#include <Kernel/Process.h>
 
 
-WSMenuBar::WSMenuBar()
+WSMenuBar::WSMenuBar(Process& process)
+    : m_process(process.make_weak_ptr())
 {
 {
 }
 }
 
 

+ 5 - 1
WindowServer/WSMenuBar.h

@@ -2,10 +2,13 @@
 
 
 #include "WSMenu.h"
 #include "WSMenu.h"
 #include <AK/Vector.h>
 #include <AK/Vector.h>
+#include <AK/WeakPtr.h>
+
+class Process;
 
 
 class WSMenuBar {
 class WSMenuBar {
 public:
 public:
-    WSMenuBar();
+    explicit WSMenuBar(Process&);
     ~WSMenuBar();
     ~WSMenuBar();
 
 
     void add_menu(WSMenu* menu) { m_menus.append(menu); }
     void add_menu(WSMenu* menu) { m_menus.append(menu); }
@@ -20,5 +23,6 @@ public:
     }
     }
 
 
 private:
 private:
+    WeakPtr<Process> m_process;
     Vector<WSMenu*> m_menus;
     Vector<WSMenu*> m_menus;
 };
 };

+ 18 - 33
WindowServer/WSWindowManager.cpp

@@ -180,38 +180,21 @@ WSWindowManager::WSWindowManager()
         invalidate(m_screen_rect);
         invalidate(m_screen_rect);
     });
     });
 
 
+    m_menu_selection_color = Color(0x84351a);
 
 
     {
     {
-        auto menubar = make<WSMenuBar>();
-
-        {
-            byte system_menu_name[] = { 0xfc, 0 };
-            auto& menu = create_menu(String((const char*)system_menu_name));
-            menu.add_item(make<WSMenuItem>(0, "Launch Terminal"));
-            menu.add_item(make<WSMenuItem>(WSMenuItem::Separator));
-            menu.add_item(make<WSMenuItem>(1, "Hello again"));
-            menu.add_item(make<WSMenuItem>(2, "To all my friends"));
-            menu.add_item(make<WSMenuItem>(3, "Together we can play some rock&roll"));
-            menu.add_item(make<WSMenuItem>(WSMenuItem::Separator));
-            menu.add_item(make<WSMenuItem>(4, "About..."));
-            menu.on_item_activation = [] (WSMenuItem& item) {
-                kprintf("WSMenu 1 item activated: '%s'\n", item.text().characters());
-            };
-            menubar->add_menu(&menu);
-        }
-        {
-            auto& menu = create_menu("Dummy");
-            menu.add_item(make<WSMenuItem>(5, "Foo."));
-            menu.add_item(make<WSMenuItem>(6, "Bar?"));
-            menu.add_item(make<WSMenuItem>(7, "Baz!"));
-            menu.on_item_activation = [] (WSMenuItem& item) {
-                kprintf("WSMenu 2 item activated: '%s'\n", item.text().characters());
-            };
-            menubar->add_menu(&menu);
-        }
-
-        set_current_menubar(menubar.ptr());
-        m_menubars.set(1, move(menubar));
+        byte system_menu_name[] = { 0xfc, 0 };
+        m_system_menu = make<WSMenu>(*current, -1, String((const char*)system_menu_name));
+        m_system_menu->add_item(make<WSMenuItem>(0, "Launch Terminal"));
+        m_system_menu->add_item(make<WSMenuItem>(WSMenuItem::Separator));
+        m_system_menu->add_item(make<WSMenuItem>(1, "Hello again"));
+        m_system_menu->add_item(make<WSMenuItem>(2, "To all my friends"));
+        m_system_menu->add_item(make<WSMenuItem>(3, "Together we can play some rock&roll"));
+        m_system_menu->add_item(make<WSMenuItem>(WSMenuItem::Separator));
+        m_system_menu->add_item(make<WSMenuItem>(4, "About..."));
+        m_system_menu->on_item_activation = [] (WSMenuItem& item) {
+            kprintf("WSMenu 1 item activated: '%s'\n", item.text().characters());
+        };
     }
     }
 
 
     invalidate();
     invalidate();
@@ -630,7 +613,7 @@ void WSWindowManager::draw_menubar()
     m_current_menubar->for_each_menu([&] (WSMenu& menu) {
     m_current_menubar->for_each_menu([&] (WSMenu& menu) {
         Color text_color = Color::Black;
         Color text_color = Color::Black;
         if (&menu == m_current_menu) {
         if (&menu == m_current_menu) {
-            m_back_painter->fill_rect(menu.rect_in_menubar(), Color(0, 0, 104));
+            m_back_painter->fill_rect(menu.rect_in_menubar(), menu_selection_color());
             text_color = Color::White;
             text_color = Color::White;
         }
         }
         m_back_painter->draw_text(menu.text_rect_in_menubar(), menu.name(), TextAlignment::CenterLeft, text_color);
         m_back_painter->draw_text(menu.text_rect_in_menubar(), menu.name(), TextAlignment::CenterLeft, text_color);
@@ -769,14 +752,16 @@ void WSWindowManager::flush(const Rect& a_rect)
 
 
 void WSWindowManager::close_menu(WSMenu& menu)
 void WSWindowManager::close_menu(WSMenu& menu)
 {
 {
+    LOCKER(m_lock);
     ASSERT(m_current_menu == &menu);
     ASSERT(m_current_menu == &menu);
     close_current_menu();
     close_current_menu();
 }
 }
 
 
 WSMenu& WSWindowManager::create_menu(String&& name)
 WSMenu& WSWindowManager::create_menu(String&& name)
 {
 {
+    LOCKER(m_lock);
     int menu_id = m_next_menu_id++;
     int menu_id = m_next_menu_id++;
-    auto menu = make<WSMenu>(menu_id, move(name));
+    auto menu = make<WSMenu>(*current, menu_id, move(name));
     auto* menu_ptr = menu.ptr();
     auto* menu_ptr = menu.ptr();
     m_menus.set(menu_id, move(menu));
     m_menus.set(menu_id, move(menu));
     return *menu_ptr;
     return *menu_ptr;
@@ -786,7 +771,7 @@ WSMenu& WSWindowManager::create_menu(String&& name)
 int WSWindowManager::api$menubar_create()
 int WSWindowManager::api$menubar_create()
 {
 {
     LOCKER(m_lock);
     LOCKER(m_lock);
-    auto menubar = make<WSMenuBar>();
+    auto menubar = make<WSMenuBar>(*current);
     int menubar_id = m_next_menubar_id++;
     int menubar_id = m_next_menubar_id++;
     m_menubars.set(menubar_id, move(menubar));
     m_menubars.set(menubar_id, move(menubar));
     return menubar_id;
     return menubar_id;

+ 3 - 0
WindowServer/WSWindowManager.h

@@ -52,6 +52,7 @@ public:
     const Font& font() const { return *m_font; }
     const Font& font() const { return *m_font; }
 
 
     void close_menu(WSMenu&);
     void close_menu(WSMenu&);
+    Color menu_selection_color() const { return m_menu_selection_color; }
 
 
     int api$menubar_create();
     int api$menubar_create();
     int api$menubar_destroy(int menubar_id);
     int api$menubar_destroy(int menubar_id);
@@ -141,6 +142,8 @@ private:
     int m_next_menubar_id = 100;
     int m_next_menubar_id = 100;
     int m_next_menu_id = 900;
     int m_next_menu_id = 900;
 
 
+    OwnPtr<WSMenu> m_system_menu;
+    Color m_menu_selection_color;
     WSMenuBar* m_current_menubar { nullptr };
     WSMenuBar* m_current_menubar { nullptr };
     WSMenu* m_current_menu { nullptr };
     WSMenu* m_current_menu { nullptr };
     HashMap<int, OwnPtr<WSMenuBar>> m_menubars;
     HashMap<int, OwnPtr<WSMenuBar>> m_menubars;