Skip to content

Commit 133706d

Browse files
committed
Add API's and plumbing for WindowServer clients to make menus.
1 parent bb31d96 commit 133706d

File tree

17 files changed

+322
-24
lines changed

17 files changed

+322
-24
lines changed

Applications/Terminal/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ int main(int argc, char** argv)
8181

8282
auto help_menu = make<GMenu>("?");
8383
help_menu->add_item(2, "About");
84-
menubar->add_menu(move(app_menu));
84+
menubar->add_menu(move(help_menu));
8585

8686
app.set_menubar(move(menubar));
8787

Kernel/Process.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,14 @@ class Process : public InlineLinkedListNode<Process>, public Weakable<Process> {
230230
int gui$get_window_rect(int window_id, GUI_Rect*);
231231
int gui$set_window_rect(int window_id, const GUI_Rect*);
232232
int gui$set_global_cursor_tracking_enabled(int window_id, bool enabled);
233+
int gui$menubar_create();
234+
int gui$menubar_destroy(int menubar_id);
235+
int gui$menubar_add_menu(int menubar_id, int menu_id);
236+
int gui$menu_create(const char* name);
237+
int gui$menu_destroy(int menu_id);
238+
int gui$menu_add_separator(int menu_id);
239+
int gui$menu_add_item(int menu_id, unsigned identifier, const char* text);
240+
int gui$set_menubar(int menubar_id);
233241

234242
DisplayInfo set_video_resolution(int width, int height);
235243

Kernel/ProcessGUI.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <WindowServer/WSMessageLoop.h>
77
#include <WindowServer/WSWindow.h>
88
#include <WindowServer/WSWindowManager.h>
9+
#include <WindowServer/WSMenuBar.h>
910
#include <Kernel/BochsVGADevice.h>
1011

1112
//#define LOG_GUI_SYSCALLS
@@ -284,3 +285,48 @@ DisplayInfo Process::set_video_resolution(int width, int height)
284285
BochsVGADevice::the().set_resolution(width, height);
285286
return info;
286287
}
288+
289+
int Process::gui$menubar_create()
290+
{
291+
return WSWindowManager::the().api$menubar_create();
292+
}
293+
294+
int Process::gui$menubar_destroy(int menubar_id)
295+
{
296+
return WSWindowManager::the().api$menubar_destroy(menubar_id);
297+
}
298+
299+
int Process::gui$menubar_add_menu(int menubar_id, int menu_id)
300+
{
301+
return WSWindowManager::the().api$menubar_add_menu(menubar_id, menu_id);
302+
}
303+
304+
int Process::gui$menu_create(const char* name)
305+
{
306+
if (!validate_read_str(name))
307+
return -EFAULT;
308+
return WSWindowManager::the().api$menu_create(String(name));
309+
}
310+
311+
int Process::gui$menu_destroy(int menu_id)
312+
{
313+
return WSWindowManager::the().api$menu_destroy(menu_id);
314+
}
315+
316+
int Process::gui$menu_add_separator(int menu_id)
317+
{
318+
return WSWindowManager::the().api$menu_add_separator(menu_id);
319+
}
320+
321+
int Process::gui$menu_add_item(int menu_id, unsigned identifier, const char* text)
322+
{
323+
if (!validate_read_str(text))
324+
return -EFAULT;
325+
return WSWindowManager::the().api$menu_add_item(menu_id, identifier, String(text));
326+
}
327+
328+
int Process::gui$set_menubar(int menubar_id)
329+
{
330+
kprintf("gui$set_menubar %d\n", menubar_id);
331+
return WSWindowManager::the().api$app_set_menubar(menubar_id);
332+
}

Kernel/Syscall.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,22 @@ static dword handle(RegisterDump& regs, dword function, dword arg1, dword arg2,
223223
return current->sys$rmdir((const char*)arg1);
224224
case Syscall::SC_chmod:
225225
return current->sys$chmod((const char*)arg1, (mode_t)arg2);
226+
case Syscall::SC_gui_menubar_create:
227+
return current->gui$menubar_create();
228+
case Syscall::SC_gui_menubar_destroy:
229+
return current->gui$menubar_destroy((int)arg1);
230+
case Syscall::SC_gui_menubar_add_menu:
231+
return current->gui$menubar_add_menu((int)arg1, (int)arg2);
232+
case Syscall::SC_gui_menu_create:
233+
return current->gui$menu_create((const char*)arg1);
234+
case Syscall::SC_gui_menu_destroy:
235+
return current->gui$menu_destroy((int)arg1);
236+
case Syscall::SC_gui_menu_add_separator:
237+
return current->gui$menu_add_separator((int)arg1);
238+
case Syscall::SC_gui_menu_add_item:
239+
return current->gui$menu_add_item((int)arg1, (unsigned)arg2, (const char*)arg3);
240+
case Syscall::SC_gui_app_set_menubar:
241+
return current->gui$set_menubar((int)arg1);
226242
default:
227243
kprintf("<%u> int0x80: Unknown function %u requested {%x, %x, %x}\n", current->pid(), function, arg1, arg2, arg3);
228244
break;

Kernel/Syscall.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,14 @@
8585
__ENUMERATE_SYSCALL(rmdir) \
8686
__ENUMERATE_SYSCALL(chmod) \
8787
__ENUMERATE_SYSCALL(usleep) \
88+
__ENUMERATE_SYSCALL(gui_menubar_create) \
89+
__ENUMERATE_SYSCALL(gui_menubar_destroy) \
90+
__ENUMERATE_SYSCALL(gui_menubar_add_menu) \
91+
__ENUMERATE_SYSCALL(gui_menu_create) \
92+
__ENUMERATE_SYSCALL(gui_menu_destroy) \
93+
__ENUMERATE_SYSCALL(gui_menu_add_separator) \
94+
__ENUMERATE_SYSCALL(gui_menu_add_item) \
95+
__ENUMERATE_SYSCALL(gui_app_set_menubar) \
8896

8997

9098
#ifdef SERENITY

LibC/errno_numbers.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@
4646
__ERROR(EBADWINDOW, "Bad window ID") \
4747
__ERROR(EBADBACKING, "Bad backing store ID") \
4848
__ERROR(ENOTEMPTY, "Directory not empty") \
49+
__ERROR(EBADMENUBAR, "Bad menubar ID") \
50+
__ERROR(EBADMENU, "Bad menu ID") \
4951

5052

5153
enum __errno_values {

LibC/gui.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,51 @@ int gui_set_global_cursor_tracking_enabled(int window_id, bool enabled)
6868
int rc = syscall(SC_gui_set_global_cursor_tracking_enabled, window_id, enabled);
6969
__RETURN_WITH_ERRNO(rc, rc, -1);
7070
}
71+
72+
int gui_menubar_create()
73+
{
74+
int rc = syscall(SC_gui_menubar_create);
75+
__RETURN_WITH_ERRNO(rc, rc, -1);
76+
}
77+
78+
int gui_menubar_destroy(int menubar_id)
79+
{
80+
int rc = syscall(SC_gui_menubar_destroy, menubar_id);
81+
__RETURN_WITH_ERRNO(rc, rc, -1);
82+
}
83+
84+
int gui_menubar_add_menu(int menubar_id, int menu_id)
85+
{
86+
int rc = syscall(SC_gui_menubar_add_menu, menubar_id, menu_id);
87+
__RETURN_WITH_ERRNO(rc, rc, -1);
88+
}
89+
90+
int gui_menu_create(const char* name)
91+
{
92+
int rc = syscall(SC_gui_menu_create, name);
93+
__RETURN_WITH_ERRNO(rc, rc, -1);
94+
}
95+
96+
int gui_menu_destroy(int menu_id)
97+
{
98+
int rc = syscall(SC_gui_menu_destroy, menu_id);
99+
__RETURN_WITH_ERRNO(rc, rc, -1);
100+
}
101+
102+
int gui_menu_add_separator(int menu_id)
103+
{
104+
int rc = syscall(SC_gui_menu_add_separator, menu_id);
105+
__RETURN_WITH_ERRNO(rc, rc, -1);
106+
}
107+
108+
int gui_menu_add_item(int menu_id, unsigned identifier, const char* text)
109+
{
110+
int rc = syscall(SC_gui_menu_add_item, menu_id, identifier, text);
111+
__RETURN_WITH_ERRNO(rc, rc, -1);
112+
}
113+
114+
int gui_app_set_menubar(int menubar_id)
115+
{
116+
int rc = syscall(SC_gui_app_set_menubar, menubar_id);
117+
__RETURN_WITH_ERRNO(rc, rc, -1);
118+
}

LibC/gui.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,14 @@ int gui_set_window_title(int window_id, const char*, size_t);
1616
int gui_get_window_rect(int window_id, GUI_Rect*);
1717
int gui_set_window_rect(int window_id, const GUI_Rect*);
1818
int gui_set_global_cursor_tracking_enabled(int window_id, bool);
19+
int gui_menubar_create();
20+
int gui_menubar_destroy(int menubar_id);
21+
int gui_menubar_add_menu(int menubar_id, int menu_id);
22+
int gui_menu_create(const char* name);
23+
int gui_menu_destroy(int menu_id);
24+
int gui_menu_add_separator(int menu_id);
25+
int gui_menu_add_item(int menu_id, unsigned identifier, const char* text);
26+
int gui_app_set_menubar(int menubar_id);
1927

2028
__END_DECLS
2129

LibGUI/GMenu.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include <LibGUI/GMenu.h>
2+
#include <LibC/gui.h>
23

34
GMenu::GMenu(const String& name)
45
: m_name(name)
@@ -7,6 +8,10 @@ GMenu::GMenu(const String& name)
78

89
GMenu::~GMenu()
910
{
11+
if (m_menu_id) {
12+
gui_menu_destroy(m_menu_id);
13+
m_menu_id = 0;
14+
}
1015
}
1116

1217
void GMenu::add_item(unsigned identifier, const String& text)
@@ -18,3 +23,16 @@ void GMenu::add_separator()
1823
{
1924
m_items.append(GMenuItem(GMenuItem::Separator));
2025
}
26+
27+
int GMenu::realize_menu()
28+
{
29+
m_menu_id = gui_menu_create(m_name.characters());
30+
ASSERT(m_menu_id > 0);
31+
for (auto& item : m_items) {
32+
if (item.type() == GMenuItem::Separator)
33+
gui_menu_add_separator(m_menu_id);
34+
else if (item.type() == GMenuItem::Text)
35+
gui_menu_add_item(m_menu_id, item.identifier(), item.text().characters());
36+
}
37+
return m_menu_id;
38+
}

LibGUI/GMenu.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ class GMenu {
1212
void add_separator();
1313

1414
private:
15+
friend class GMenuBar;
16+
int menu_id() const { return m_menu_id; }
17+
int realize_menu();
18+
19+
int m_menu_id { 0 };
1520
String m_name;
1621
Vector<GMenuItem> m_items;
1722
};

0 commit comments

Comments
 (0)