diff --git a/Applications/Terminal/main.cpp b/Applications/Terminal/main.cpp index 9ef6f64d83e..50e4a7010b1 100644 --- a/Applications/Terminal/main.cpp +++ b/Applications/Terminal/main.cpp @@ -79,7 +79,13 @@ int main(int argc, char** argv) app_menu->add_item(1, "Quit"); menubar->add_menu(move(app_menu)); - auto help_menu = make("?"); + auto font_menu = make("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("Help"); help_menu->add_item(2, "About"); menubar->add_menu(move(help_menu)); diff --git a/WindowServer/WSMenu.cpp b/WindowServer/WSMenu.cpp index 8d863712609..fb9b638de5f 100644 --- a/WindowServer/WSMenu.cpp +++ b/WindowServer/WSMenu.cpp @@ -7,9 +7,10 @@ #include #include -WSMenu::WSMenu(int menu_id, String&& name) +WSMenu::WSMenu(Process& process, int menu_id, String&& name) : m_menu_id(menu_id) , m_name(move(name)) + , m_process(process.make_weak_ptr()) { } @@ -88,7 +89,7 @@ void WSMenu::draw() if (item->type() == WSMenuItem::Text) { Color text_color = Color::Black; 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; } painter.draw_text(item->rect().translated(left_padding(), 0), item->text(), TextAlignment::CenterLeft, text_color); diff --git a/WindowServer/WSMenu.h b/WindowServer/WSMenu.h index 39c8b07dae3..26f64bb5c49 100644 --- a/WindowServer/WSMenu.h +++ b/WindowServer/WSMenu.h @@ -2,6 +2,7 @@ #include #include +#include #include #include "WSMenuItem.h" @@ -9,10 +10,11 @@ class WSMenuBar; class WSMessage; class WSWindow; class Font; +class Process; class WSMenu { public: - WSMenu(int menu_id, String&& name); + WSMenu(Process&, int menu_id, String&& name); ~WSMenu(); int menu_id() const { return m_menu_id; } @@ -80,5 +82,6 @@ private: WSMenuItem* m_hovered_item { nullptr }; Vector> m_items; OwnPtr m_menu_window; + WeakPtr m_process; }; diff --git a/WindowServer/WSMenuBar.cpp b/WindowServer/WSMenuBar.cpp index 80e6db95461..f8aa83dff8e 100644 --- a/WindowServer/WSMenuBar.cpp +++ b/WindowServer/WSMenuBar.cpp @@ -1,8 +1,10 @@ #include "WSMenuBar.h" #include "WSMenu.h" #include "WSMenuItem.h" +#include -WSMenuBar::WSMenuBar() +WSMenuBar::WSMenuBar(Process& process) + : m_process(process.make_weak_ptr()) { } diff --git a/WindowServer/WSMenuBar.h b/WindowServer/WSMenuBar.h index fe177e16b8d..07014124866 100644 --- a/WindowServer/WSMenuBar.h +++ b/WindowServer/WSMenuBar.h @@ -2,10 +2,13 @@ #include "WSMenu.h" #include +#include + +class Process; class WSMenuBar { public: - WSMenuBar(); + explicit WSMenuBar(Process&); ~WSMenuBar(); void add_menu(WSMenu* menu) { m_menus.append(menu); } @@ -20,5 +23,6 @@ public: } private: + WeakPtr m_process; Vector m_menus; }; diff --git a/WindowServer/WSWindowManager.cpp b/WindowServer/WSWindowManager.cpp index 02cb835efbf..131b3034e2c 100644 --- a/WindowServer/WSWindowManager.cpp +++ b/WindowServer/WSWindowManager.cpp @@ -180,38 +180,21 @@ WSWindowManager::WSWindowManager() invalidate(m_screen_rect); }); + m_menu_selection_color = Color(0x84351a); { - auto menubar = make(); - - { - byte system_menu_name[] = { 0xfc, 0 }; - auto& menu = create_menu(String((const char*)system_menu_name)); - menu.add_item(make(0, "Launch Terminal")); - menu.add_item(make(WSMenuItem::Separator)); - menu.add_item(make(1, "Hello again")); - menu.add_item(make(2, "To all my friends")); - menu.add_item(make(3, "Together we can play some rock&roll")); - menu.add_item(make(WSMenuItem::Separator)); - menu.add_item(make(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(5, "Foo.")); - menu.add_item(make(6, "Bar?")); - menu.add_item(make(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(*current, -1, String((const char*)system_menu_name)); + m_system_menu->add_item(make(0, "Launch Terminal")); + m_system_menu->add_item(make(WSMenuItem::Separator)); + m_system_menu->add_item(make(1, "Hello again")); + m_system_menu->add_item(make(2, "To all my friends")); + m_system_menu->add_item(make(3, "Together we can play some rock&roll")); + m_system_menu->add_item(make(WSMenuItem::Separator)); + m_system_menu->add_item(make(4, "About...")); + m_system_menu->on_item_activation = [] (WSMenuItem& item) { + kprintf("WSMenu 1 item activated: '%s'\n", item.text().characters()); + }; } invalidate(); @@ -630,7 +613,7 @@ void WSWindowManager::draw_menubar() m_current_menubar->for_each_menu([&] (WSMenu& menu) { Color text_color = Color::Black; 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; } 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) { + LOCKER(m_lock); ASSERT(m_current_menu == &menu); close_current_menu(); } WSMenu& WSWindowManager::create_menu(String&& name) { + LOCKER(m_lock); int menu_id = m_next_menu_id++; - auto menu = make(menu_id, move(name)); + auto menu = make(*current, menu_id, move(name)); auto* menu_ptr = menu.ptr(); m_menus.set(menu_id, move(menu)); return *menu_ptr; @@ -786,7 +771,7 @@ WSMenu& WSWindowManager::create_menu(String&& name) int WSWindowManager::api$menubar_create() { LOCKER(m_lock); - auto menubar = make(); + auto menubar = make(*current); int menubar_id = m_next_menubar_id++; m_menubars.set(menubar_id, move(menubar)); return menubar_id; diff --git a/WindowServer/WSWindowManager.h b/WindowServer/WSWindowManager.h index 3b8e96e43c3..85b680a2e1f 100644 --- a/WindowServer/WSWindowManager.h +++ b/WindowServer/WSWindowManager.h @@ -52,6 +52,7 @@ public: const Font& font() const { return *m_font; } void close_menu(WSMenu&); + Color menu_selection_color() const { return m_menu_selection_color; } int api$menubar_create(); int api$menubar_destroy(int menubar_id); @@ -141,6 +142,8 @@ private: int m_next_menubar_id = 100; int m_next_menu_id = 900; + OwnPtr m_system_menu; + Color m_menu_selection_color; WSMenuBar* m_current_menubar { nullptr }; WSMenu* m_current_menu { nullptr }; HashMap> m_menubars;