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
1930typedef 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
3850static 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
105158SDL_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
114169SDL_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
128192SDL_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
185264void SDL_AppQuit (void * appstate , SDL_AppResult result ) {
0 commit comments