1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-23 10:17:41 +00:00

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.
This commit is contained in:
Andreas Kling 2019-02-12 08:39:19 +01:00
parent 133706d697
commit 15b4c9f9f1
7 changed files with 43 additions and 39 deletions

View file

@ -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));

View file

@ -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);

View file

@ -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;
}; };

View file

@ -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())
{ {
} }

View file

@ -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;
}; };

View file

@ -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 };
m_system_menu = make<WSMenu>(*current, -1, String((const char*)system_menu_name));
{ m_system_menu->add_item(make<WSMenuItem>(0, "Launch Terminal"));
byte system_menu_name[] = { 0xfc, 0 }; m_system_menu->add_item(make<WSMenuItem>(WSMenuItem::Separator));
auto& menu = create_menu(String((const char*)system_menu_name)); m_system_menu->add_item(make<WSMenuItem>(1, "Hello again"));
menu.add_item(make<WSMenuItem>(0, "Launch Terminal")); m_system_menu->add_item(make<WSMenuItem>(2, "To all my friends"));
menu.add_item(make<WSMenuItem>(WSMenuItem::Separator)); m_system_menu->add_item(make<WSMenuItem>(3, "Together we can play some rock&roll"));
menu.add_item(make<WSMenuItem>(1, "Hello again")); m_system_menu->add_item(make<WSMenuItem>(WSMenuItem::Separator));
menu.add_item(make<WSMenuItem>(2, "To all my friends")); m_system_menu->add_item(make<WSMenuItem>(4, "About..."));
menu.add_item(make<WSMenuItem>(3, "Together we can play some rock&roll")); m_system_menu->on_item_activation = [] (WSMenuItem& item) {
menu.add_item(make<WSMenuItem>(WSMenuItem::Separator)); kprintf("WSMenu 1 item activated: '%s'\n", item.text().characters());
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));
} }
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;

View file

@ -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;