Skip to content

Commit 527b8d4

Browse files
committed
Added some relevant testing to the example.
1 parent 9b2a5f9 commit 527b8d4

File tree

12 files changed

+260
-197
lines changed

12 files changed

+260
-197
lines changed

examples/video/01-menubar/menubar.c

Lines changed: 191 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -8,36 +8,48 @@
88
#include <SDL3/SDL.h>
99
#include <SDL3/SDL_main.h>
1010

11-
SDL_Window* window = NULL;
12-
SDL_Renderer* renderer = NULL;
11+
SDL_Window* window_1 = NULL;
12+
SDL_Renderer *renderer_1 = NULL;
1313

14-
SDL_MenuItem* checkable = NULL;
15-
SDL_MenuItem* new_window = NULL;
14+
SDL_Window *window_2 = NULL;
15+
SDL_Renderer *renderer_2 = NULL;
1616

17-
SDL_MenuItem *menu_bar;
17+
SDL_MenuItem *checkable[2] = {
18+
NULL,
19+
NULL
20+
};
21+
22+
SDL_MenuItem *null_out_button[2] = {
23+
NULL,
24+
NULL
25+
};
26+
27+
SDL_MenuItem *menu_bar_1;
28+
SDL_MenuItem *menu_bar_2;
1829

1930
typedef enum SDL_EventType_MenuExt
2031
{
21-
MENU_BAR_FILE,
22-
MENU_BAR_FILE_NEW_WINDOW,
23-
MENU_BAR_FILE_DISABLE_NEW_WINDOW,
24-
MENU_BAR_BOOKMARKS,
25-
MENU_BAR_BOOKMARKS_TOOLBAR,
26-
MENU_BAR_BOOKMARKS_TOOLBAR_GITHUB,
27-
MENU_BAR_BOOKMARKS_TOOLBAR_WIKI,
28-
MENU_BAR_BOOKMARKS_TOOLBAR_DISCORD,
29-
MENU_BAR_BOOKMARKS_OTHER_BOOKMARKS,
30-
MENU_BAR_BOOKMARKS_OTHER_BOOKMARKS_STACKOVERFLOW,
31-
MENU_BAR_INCOGNITO,
32-
MENU_BAR_TOP_LEVEL_BUTTON,
33-
MENU_BAR_EXIT,
34-
35-
MENU_BAR_LAST
32+
MENU_BAR_FILE,
33+
MENU_BAR_FILE_SWAP_BARS,
34+
MENU_BAR_FILE_NULL_OUT_BAR,
35+
MENU_BAR_FILE_DISABLE_NULL_OUT_BAR,
36+
MENU_BAR_BOOKMARKS,
37+
MENU_BAR_BOOKMARKS_TOOLBAR,
38+
MENU_BAR_BOOKMARKS_TOOLBAR_GITHUB,
39+
MENU_BAR_BOOKMARKS_TOOLBAR_WIKI,
40+
MENU_BAR_BOOKMARKS_TOOLBAR_DISCORD,
41+
MENU_BAR_BOOKMARKS_OTHER_BOOKMARKS,
42+
MENU_BAR_BOOKMARKS_OTHER_BOOKMARKS_STACKOVERFLOW,
43+
MENU_BAR_INCOGNITO,
44+
MENU_BAR_TOP_LEVEL_BUTTON,
45+
MENU_BAR_EXIT,
46+
47+
MENU_BAR_LAST
3648
} SDL_EventType_MenuExt;
3749

3850
static SDL_EventType_MenuExt EVENT_START = (SDL_EventType_MenuExt)0;
3951

40-
void PrintMenuItems(SDL_MenuItem *menu_item, int indent, int *total_index)
52+
void PrintMenuItems(SDL_Renderer* renderer, SDL_MenuItem *menu_item, int indent, int *total_index)
4153
{
4254
if (!menu_item) {
4355
return;
@@ -56,130 +68,197 @@ void PrintMenuItems(SDL_MenuItem *menu_item, int indent, int *total_index)
5668
size_t item_count = SDL_GetMenuChildItems(menu_item);
5769

5870
for (size_t i = 0; i < item_count; ++i) {
59-
PrintMenuItems(SDL_GetMenuChildItem(menu_item, i), indent + 1, total_index);
71+
PrintMenuItems(renderer, SDL_GetMenuChildItem(menu_item, i), indent + 1, total_index);
6072
}
6173
}
6274

6375

64-
void CreateMenuBar()
76+
void CreateMenuBar_1()
6577
{
66-
menu_bar = SDL_CreateMenuBar(window);
78+
menu_bar_1 = SDL_CreateMenuBar();
6779

68-
{
69-
SDL_MenuItem* menu = SDL_CreateMenuItem(menu_bar, "File", SDL_MENUITEM_SUBMENU, MENU_BAR_LAST);
70-
new_window = SDL_CreateMenuItem(menu, "New Window", SDL_MENUITEM_BUTTON, MENU_BAR_FILE_NEW_WINDOW);
71-
checkable = SDL_CreateMenuItem(menu, "Enable New Window", SDL_MENUITEM_CHECKABLE, MENU_BAR_FILE_DISABLE_NEW_WINDOW);
80+
{
81+
SDL_MenuItem *menu = SDL_CreateMenuItem(menu_bar_1, "File_1", SDL_MENUITEM_SUBMENU, MENU_BAR_LAST);
82+
SDL_CreateMenuItem(menu, "Swap Bars", SDL_MENUITEM_BUTTON, MENU_BAR_FILE_SWAP_BARS);
83+
null_out_button[0] = SDL_CreateMenuItem(menu, "Null Out Bar", SDL_MENUITEM_BUTTON, MENU_BAR_FILE_NULL_OUT_BAR);
84+
SDL_SetMenuItemEnabled(null_out_button[0], false);
85+
checkable[0] = SDL_CreateMenuItem(menu, "Enable Null Out Bar", SDL_MENUITEM_CHECKABLE, MENU_BAR_FILE_DISABLE_NULL_OUT_BAR);
86+
SDL_SetMenuItemChecked(checkable[0], false);
87+
}
7288

73-
SDL_SetMenuItemChecked(checkable, true);
74-
}
89+
{
90+
SDL_MenuItem *menu = SDL_CreateMenuItem(menu_bar_1, "Bookmarks_1", SDL_MENUITEM_SUBMENU, MENU_BAR_LAST);
91+
SDL_MenuItem *main_bookmarks = SDL_CreateMenuItem(menu, "Bookmarks Toolbar_1", SDL_MENUITEM_SUBMENU, MENU_BAR_LAST);
92+
SDL_MenuItem *discord = SDL_CreateMenuItem(main_bookmarks, "SDL Discord_1", SDL_MENUITEM_BUTTON, MENU_BAR_BOOKMARKS_TOOLBAR_DISCORD);
93+
SDL_CreateMenuItem(main_bookmarks, "SDL GitHub_1", SDL_MENUITEM_BUTTON, MENU_BAR_BOOKMARKS_TOOLBAR_GITHUB);
94+
SDL_CreateMenuItemAt(main_bookmarks, 0, "SDL Wiki_1", SDL_MENUITEM_BUTTON, MENU_BAR_BOOKMARKS_TOOLBAR_WIKI);
7595

76-
{
77-
SDL_MenuItem* menu = SDL_CreateMenuItem(menu_bar, "Bookmarks", SDL_MENUITEM_SUBMENU, MENU_BAR_LAST);
78-
SDL_MenuItem* main_bookmarks = SDL_CreateMenuItem(menu, "Bookmarks Toolbar", SDL_MENUITEM_SUBMENU, MENU_BAR_LAST);
79-
SDL_MenuItem* discord = SDL_CreateMenuItem(main_bookmarks, "SDL Discord", SDL_MENUITEM_BUTTON, MENU_BAR_BOOKMARKS_TOOLBAR_DISCORD);
80-
SDL_CreateMenuItem(main_bookmarks, "SDL GitHub", SDL_MENUITEM_BUTTON, MENU_BAR_BOOKMARKS_TOOLBAR_GITHUB);
81-
SDL_CreateMenuItemAt(main_bookmarks, 0, "SDL Wiki", SDL_MENUITEM_BUTTON, MENU_BAR_BOOKMARKS_TOOLBAR_WIKI);
96+
SDL_MenuItem *other_bookmarks = SDL_CreateMenuItem(main_bookmarks, "Other Bookmarks_1", SDL_MENUITEM_SUBMENU, MENU_BAR_LAST);
97+
SDL_MenuItem *stack_overflow = SDL_CreateMenuItem(other_bookmarks, "Stack Overflow-test", SDL_MENUITEM_BUTTON, MENU_BAR_BOOKMARKS_OTHER_BOOKMARKS_STACKOVERFLOW);
98+
SDL_SetMenuItemLabel(stack_overflow, "Stack Overflow_1");
8299

83-
SDL_MenuItem *other_bookmarks = SDL_CreateMenuItem(main_bookmarks, "Other Bookmarks", SDL_MENUITEM_SUBMENU, MENU_BAR_LAST);
84-
SDL_MenuItem *stack_overflow = SDL_CreateMenuItem(other_bookmarks, "Stack Overflow-test", SDL_MENUITEM_BUTTON, MENU_BAR_BOOKMARKS_OTHER_BOOKMARKS_STACKOVERFLOW);
85-
SDL_SetMenuItemLabel(stack_overflow, "Stack Overflow");
86-
87-
SDL_DestroyMenuItem(discord);
100+
SDL_DestroyMenuItem(discord);
88101

102+
SDL_SetMenuItemChecked(other_bookmarks, false);
103+
}
89104

90-
SDL_SetMenuItemChecked(other_bookmarks, false);
91-
}
105+
{
106+
// We can't create a top level checkable .
107+
SDL_assert(!SDL_CreateMenuItem(menu_bar_1, "Incognito", SDL_MENUITEM_CHECKABLE, MENU_BAR_INCOGNITO));
92108

93-
{
94-
// We can't create a top level checkable .
95-
SDL_assert(!SDL_CreateMenuItem(menu_bar, "Incognito", SDL_MENUITEM_CHECKABLE, MENU_BAR_INCOGNITO));
96-
97-
SDL_CreateMenuItem(menu_bar, "Exit", SDL_MENUITEM_BUTTON, MENU_BAR_EXIT);
98-
}
109+
SDL_CreateMenuItem(menu_bar_1, "Exit", SDL_MENUITEM_BUTTON, MENU_BAR_EXIT);
110+
}
99111

100-
SDL_SetWindowMenuBar(window, menu_bar);
112+
SDL_SetWindowMenuBar(window_1, menu_bar_1);
101113

102-
EVENT_START = (SDL_EventType_MenuExt)SDL_RegisterEvents(MENU_BAR_LAST);
114+
EVENT_START = (SDL_EventType_MenuExt)SDL_RegisterEvents(MENU_BAR_LAST);
115+
}
116+
117+
void CreateMenuBar_2()
118+
{
119+
menu_bar_2 = SDL_CreateMenuBar();
120+
121+
{
122+
SDL_MenuItem *menu = SDL_CreateMenuItem(menu_bar_2, "File_2", SDL_MENUITEM_SUBMENU, MENU_BAR_LAST);
123+
SDL_CreateMenuItem(menu, "Swap Bars", SDL_MENUITEM_BUTTON, MENU_BAR_FILE_SWAP_BARS);
124+
null_out_button[1] = SDL_CreateMenuItem(menu, "Null Out Bar", SDL_MENUITEM_BUTTON, MENU_BAR_FILE_NULL_OUT_BAR);
125+
SDL_SetMenuItemEnabled(null_out_button[1], false);
126+
checkable[1] = SDL_CreateMenuItem(menu, "Enable Null Out Bar", SDL_MENUITEM_CHECKABLE, MENU_BAR_FILE_DISABLE_NULL_OUT_BAR);
127+
SDL_SetMenuItemChecked(checkable[1], false);
128+
}
129+
130+
{
131+
SDL_MenuItem *menu = SDL_CreateMenuItem(menu_bar_2, "Bookmarks_2", SDL_MENUITEM_SUBMENU, MENU_BAR_LAST);
132+
SDL_MenuItem *main_bookmarks = SDL_CreateMenuItem(menu, "Bookmarks Toolbar_2", SDL_MENUITEM_SUBMENU, MENU_BAR_LAST);
133+
SDL_MenuItem *discord = SDL_CreateMenuItem(main_bookmarks, "SDL Discord_2", SDL_MENUITEM_BUTTON, MENU_BAR_BOOKMARKS_TOOLBAR_DISCORD);
134+
SDL_CreateMenuItem(main_bookmarks, "SDL GitHub_2", SDL_MENUITEM_BUTTON, MENU_BAR_BOOKMARKS_TOOLBAR_GITHUB);
135+
SDL_CreateMenuItemAt(main_bookmarks, 0, "SDL Wiki_2", SDL_MENUITEM_BUTTON, MENU_BAR_BOOKMARKS_TOOLBAR_WIKI);
136+
137+
SDL_MenuItem *other_bookmarks = SDL_CreateMenuItem(main_bookmarks, "Other Bookmarks_2", SDL_MENUITEM_SUBMENU, MENU_BAR_LAST);
138+
SDL_MenuItem *stack_overflow = SDL_CreateMenuItem(other_bookmarks, "Stack Overflow-test_2", SDL_MENUITEM_BUTTON, MENU_BAR_BOOKMARKS_OTHER_BOOKMARKS_STACKOVERFLOW);
139+
SDL_SetMenuItemLabel(stack_overflow, "Stack Overflow_2");
140+
141+
SDL_DestroyMenuItem(discord);
142+
143+
SDL_SetMenuItemChecked(other_bookmarks, false);
144+
}
145+
146+
{
147+
// We can't create a top level checkable .
148+
SDL_assert(!SDL_CreateMenuItem(menu_bar_2, "Incognito_2", SDL_MENUITEM_CHECKABLE, MENU_BAR_INCOGNITO));
149+
150+
SDL_CreateMenuItem(menu_bar_2, "Exit", SDL_MENUITEM_BUTTON, MENU_BAR_EXIT);
151+
}
152+
153+
SDL_SetWindowMenuBar(window_2, menu_bar_2);
154+
155+
EVENT_START = (SDL_EventType_MenuExt)SDL_RegisterEvents(MENU_BAR_LAST);
103156
}
104157

105158
SDL_AppResult SDL_AppInit(void** appstate, int argc, char** argv) {
106-
SDL_CreateWindowAndRenderer("menu bar test", 640, 480, 0, &window, &renderer);
159+
SDL_CreateWindowAndRenderer("Window 1", 640, 480, 0, &window_1, &renderer_1);
160+
SDL_CreateWindowAndRenderer("Window 2", 640, 480, 0, &window_2, &renderer_2);
107161

108-
CreateMenuBar();
162+
CreateMenuBar_1();
163+
CreateMenuBar_2();
109164

110-
//return SDL_APP_SUCCESS;
111-
return SDL_APP_CONTINUE;
165+
//return SDL_APP_SUCCESS;
166+
return SDL_APP_CONTINUE;
112167
}
113168

114169
SDL_AppResult SDL_AppIterate(void* appstate) {
115170

116-
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
117-
SDL_RenderClear(renderer);
118-
171+
// Window 1
172+
SDL_SetRenderDrawColor(renderer_1, 180, 180, 180, 255);
173+
SDL_RenderClear(renderer_1);
119174

120-
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
121-
int total_index = 0;
122-
PrintMenuItems(menu_bar, 0, &total_index);
123-
SDL_RenderPresent(renderer);
175+
SDL_SetRenderDrawColor(renderer_1, 0, 0, 0, 255);
176+
int total_index = 0;
177+
PrintMenuItems(renderer_1, SDL_GetWindowMenuBar(window_1), 0, &total_index);
178+
SDL_RenderPresent(renderer_1);
179+
180+
// Window 2
181+
SDL_SetRenderDrawColor(renderer_2, 255, 255, 255, 255);
182+
SDL_RenderClear(renderer_2);
183+
184+
SDL_SetRenderDrawColor(renderer_2, 0, 0, 0, 255);
185+
total_index = 0;
186+
PrintMenuItems(renderer_2, SDL_GetWindowMenuBar(window_2), 0, &total_index);
187+
SDL_RenderPresent(renderer_2);
124188

125-
return SDL_APP_CONTINUE;
189+
return SDL_APP_CONTINUE;
126190
}
127191

128192
SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event) {
129193

130-
switch (event->common.type)
131-
{
132-
case SDL_EVENT_QUIT:
194+
switch (event->common.type)
133195
{
134-
return SDL_APP_SUCCESS;
135-
}
136-
case SDL_EVENT_MENU_BUTTON_CLICKED:
137-
case SDL_EVENT_MENU_CHECKABLE_CLICKED:
138-
{
139-
switch (event->menu.user_event_type) {
140-
case MENU_BAR_BOOKMARKS_TOOLBAR_GITHUB:
141-
{
142-
SDL_OpenURL("https://github.com/libsdl-org/SDL");
143-
break;
144-
}
145-
case MENU_BAR_BOOKMARKS_TOOLBAR_WIKI:
146-
{
147-
SDL_OpenURL("https://wiki.libsdl.org/SDL3/FrontPage");
148-
break;
149-
}
150-
case MENU_BAR_BOOKMARKS_TOOLBAR_DISCORD:
151-
{
152-
SDL_OpenURL("https://discord.gg/BwpFGBWsv8");
153-
break;
154-
}
155-
case MENU_BAR_BOOKMARKS_OTHER_BOOKMARKS_STACKOVERFLOW:
156-
{
157-
SDL_OpenURL("https://stackoverflow.com/questions");
158-
break;
159-
}
160-
case MENU_BAR_FILE_DISABLE_NEW_WINDOW:
161-
{
162-
bool is_checked = false;
163-
SDL_GetMenuItemChecked(checkable, &is_checked);
164-
SDL_SetMenuItemChecked(checkable, !is_checked);
165-
166-
bool is_enabled = false;
167-
SDL_GetMenuItemEnabled(new_window, &is_enabled);
168-
SDL_SetMenuItemEnabled(new_window, !is_enabled);
169-
170-
break;
171-
}
172-
case MENU_BAR_EXIT:
173-
{
174-
return SDL_APP_SUCCESS;
175-
}
196+
case SDL_EVENT_QUIT:
197+
{
198+
return SDL_APP_SUCCESS;
199+
}
200+
case SDL_EVENT_MENU_BUTTON_CLICKED:
201+
case SDL_EVENT_MENU_CHECKABLE_CLICKED:
202+
{
203+
switch (event->menu.user_event_type) {
204+
case MENU_BAR_BOOKMARKS_TOOLBAR_GITHUB:
205+
{
206+
SDL_OpenURL("https://github.com/libsdl-org/SDL");
207+
break;
208+
}
209+
case MENU_BAR_BOOKMARKS_TOOLBAR_WIKI:
210+
{
211+
SDL_OpenURL("https://wiki.libsdl.org/SDL3/FrontPage");
212+
break;
213+
}
214+
case MENU_BAR_BOOKMARKS_TOOLBAR_DISCORD:
215+
{
216+
SDL_OpenURL("https://discord.gg/BwpFGBWsv8");
217+
break;
218+
}
219+
case MENU_BAR_BOOKMARKS_OTHER_BOOKMARKS_STACKOVERFLOW:
220+
{
221+
SDL_OpenURL("https://stackoverflow.com/questions");
222+
break;
223+
}
224+
case MENU_BAR_FILE_DISABLE_NULL_OUT_BAR:
225+
{
226+
bool is_checked = false;
227+
SDL_GetMenuItemChecked(checkable[0], &is_checked);
228+
SDL_SetMenuItemChecked(checkable[0], !is_checked);
229+
SDL_SetMenuItemChecked(checkable[1], !is_checked);
230+
231+
bool is_enabled = false;
232+
SDL_GetMenuItemEnabled(null_out_button[0], &is_enabled);
233+
SDL_SetMenuItemEnabled(null_out_button[0], !is_enabled);
234+
SDL_SetMenuItemEnabled(null_out_button[1], !is_enabled);
235+
236+
break;
237+
}
238+
case MENU_BAR_FILE_SWAP_BARS:
239+
{
240+
SDL_MenuItem *menu_bar1 = SDL_GetWindowMenuBar(window_1);
241+
SDL_MenuItem *menu_bar2 = SDL_GetWindowMenuBar(window_2);
242+
SDL_SetWindowMenuBar(window_1, menu_bar2);
243+
SDL_SetWindowMenuBar(window_2, menu_bar1);
244+
break;
245+
}
246+
case MENU_BAR_FILE_NULL_OUT_BAR:
247+
{
248+
SDL_Window *window = SDL_GetWindowFromID(event->menu.windowID);
249+
SDL_SetWindowMenuBar(window, NULL);
250+
break;
251+
}
252+
case MENU_BAR_EXIT:
253+
{
254+
return SDL_APP_SUCCESS;
255+
}
256+
}
257+
SDL_Log("%d\n", event->menu.user_event_type);
176258
}
177-
SDL_Log("%d\n", event->menu.user_event_type);
178259
}
179-
}
180-
181260

182-
return SDL_APP_CONTINUE;
261+
return SDL_APP_CONTINUE;
183262
}
184263

185264
void SDL_AppQuit(void* appstate, SDL_AppResult result) {

include/SDL3/SDL_events.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -990,6 +990,7 @@ typedef struct SDL_MenuEvent
990990
Uint32 type; /**< SDL_EVENT_MENU_BUTTON_CLICKED or SDL_EVENT_MENU_CHECKABLE_CLICKED */
991991
Uint32 reserved;
992992
Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */
993+
SDL_WindowID windowID; /**< The associated window if any */
993994
Uint16 user_event_type;
994995
} SDL_MenuEvent;
995996

include/SDL3/SDL_video.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3060,7 +3060,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_EnableScreenSaver(void);
30603060
*/
30613061
extern SDL_DECLSPEC bool SDLCALL SDL_DisableScreenSaver(void);
30623062

3063-
extern SDL_DECLSPEC SDL_MenuItem *SDL_CreateMenuBar(SDL_Window *window);
3063+
extern SDL_DECLSPEC SDL_MenuItem *SDL_CreateMenuBar();
30643064

30653065
#define SDL_PROP_MENUITEM_CREATE_LABEL "SDL.menuitem.create.label"
30663066

@@ -3087,6 +3087,7 @@ extern SDL_DECLSPEC SDL_MenuItem *SDL_GetMenuChildItem(SDL_MenuItem *menu_as_ite
30873087
extern SDL_DECLSPEC const char *SDL_GetMenuItemLabel(SDL_MenuItem *menu_item);
30883088
extern SDL_DECLSPEC bool SDL_SetMenuItemLabel(SDL_MenuItem *menu_item, const char *label);
30893089
extern SDL_DECLSPEC SDL_MenuItemType SDL_GetMenuItemType(SDL_MenuItem *menu_item);
3090+
extern SDL_DECLSPEC Sint32 SDL_GetMenuItemEventType(SDL_MenuItem *menu_item);
30903091

30913092
/**
30923093
* Must be a SDL_MENUITEM_CHECKABLE

src/dynapi/SDL_dynapi_overrides.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1299,7 +1299,8 @@
12991299
#define SDL_GetMenuChildItems SDL_GetMenuChildItems_REAL
13001300
#define SDL_GetMenuChildItem SDL_GetMenuChildItem_REAL
13011301
#define SDL_GetMenuItemLabel SDL_GetMenuItemLabel_REAL
1302-
#define SDL_GetMenuItemType SDL_GetMenuItemType_REAL
1302+
#define SDL_GetMenuItemType SDL_GetMenuItemType_REAL
1303+
#define SDL_GetMenuItemEventType SDL_GetMenuItemEventType_REAL
13031304
#define SDL_SetMenuItemLabel SDL_SetMenuItemLabel_REAL
13041305
#define SDL_SetMenuItemChecked SDL_SetMenuItemChecked_REAL
13051306
#define SDL_GetMenuItemChecked SDL_GetMenuItemChecked_REAL

0 commit comments

Comments
 (0)