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
Notes: sideshowbarker 2024-07-19 15:46:55 +09:00
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");
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");
menubar->add_menu(move(help_menu));

View file

@ -7,9 +7,10 @@
#include <SharedGraphics/Painter.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_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);

View file

@ -2,6 +2,7 @@
#include <AK/AKString.h>
#include <AK/Vector.h>
#include <AK/WeakPtr.h>
#include <SharedGraphics/Rect.h>
#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<OwnPtr<WSMenuItem>> m_items;
OwnPtr<WSWindow> m_menu_window;
WeakPtr<Process> m_process;
};

View file

@ -1,8 +1,10 @@
#include "WSMenuBar.h"
#include "WSMenu.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 <AK/Vector.h>
#include <AK/WeakPtr.h>
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<Process> m_process;
Vector<WSMenu*> m_menus;
};

View file

@ -180,38 +180,21 @@ WSWindowManager::WSWindowManager()
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();
@ -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<WSMenu>(menu_id, move(name));
auto menu = make<WSMenu>(*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<WSMenuBar>();
auto menubar = make<WSMenuBar>(*current);
int menubar_id = m_next_menubar_id++;
m_menubars.set(menubar_id, move(menubar));
return menubar_id;

View file

@ -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<WSMenu> m_system_menu;
Color m_menu_selection_color;
WSMenuBar* m_current_menubar { nullptr };
WSMenu* m_current_menu { nullptr };
HashMap<int, OwnPtr<WSMenuBar>> m_menubars;