Skip to content

Commit 7df4751

Browse files
committed
Improve example
1 parent f398c79 commit 7df4751

File tree

5 files changed

+72
-38
lines changed

5 files changed

+72
-38
lines changed

examples/video/01-menubar/menubar.c

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ typedef enum SDL_EventType_MenuExt
2323
MENU_BAR_BOOKMARKS_TOOLBAR_WIKI,
2424
MENU_BAR_BOOKMARKS_TOOLBAR_DISCORD,
2525
MENU_BAR_BOOKMARKS_OTHER_BOOKMARKS,
26-
MENU_BAR_BOOKMARKS_OTHER_BOOKMARKS_TWITTER,
27-
MENU_BAR_BOOKMARKS_OTHER_BOOKMARKS_REDDIT,
26+
MENU_BAR_BOOKMARKS_OTHER_BOOKMARKS_STACKOVERFLOW,
2827
MENU_BAR_INCOGNITO,
2928
MENU_BAR_TOP_LEVEL_BUTTON,
3029
MENU_BAR_EXIT,
@@ -54,7 +53,7 @@ void CreateMenuBar()
5453
SDL_CreateMenuItem((SDL_Menu*)main_bookmarks, "SDL Discord", SDL_MENU_BUTTON, MENU_BAR_BOOKMARKS_TOOLBAR_DISCORD);
5554

5655
SDL_MenuItem* other_bookmarks = SDL_CreateMenuItem((SDL_Menu*)menu, "Other Bookmarks", SDL_MENU, MENU_BAR_LAST);
57-
SDL_CreateMenuItem((SDL_Menu*)other_bookmarks, "Stack Overflow", SDL_MENU_BUTTON, MENU_BAR_BOOKMARKS_OTHER_BOOKMARKS);
56+
SDL_CreateMenuItem((SDL_Menu *)other_bookmarks, "Stack Overflow", SDL_MENU_BUTTON, MENU_BAR_BOOKMARKS_OTHER_BOOKMARKS_STACKOVERFLOW);
5857

5958
SDL_EnableMenuItem(other_bookmarks, false);
6059
}
@@ -102,6 +101,32 @@ SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event) {
102101
case SDL_EVENT_MENU_BUTTON_CLICKED:
103102
case SDL_EVENT_MENU_CHECKABLE_CLICKED:
104103
{
104+
switch (event->menu.user_event_type) {
105+
case MENU_BAR_BOOKMARKS_TOOLBAR_GITHUB:
106+
{
107+
SDL_OpenURL("https://github.com/libsdl-org/SDL");
108+
break;
109+
}
110+
case MENU_BAR_BOOKMARKS_TOOLBAR_WIKI:
111+
{
112+
SDL_OpenURL("https://wiki.libsdl.org/SDL3/FrontPage");
113+
break;
114+
}
115+
case MENU_BAR_BOOKMARKS_TOOLBAR_DISCORD:
116+
{
117+
SDL_OpenURL("https://discord.gg/BwpFGBWsv8");
118+
break;
119+
}
120+
case MENU_BAR_BOOKMARKS_OTHER_BOOKMARKS_STACKOVERFLOW:
121+
{
122+
SDL_OpenURL("https://stackoverflow.com/questions");
123+
break;
124+
}
125+
case MENU_BAR_EXIT:
126+
{
127+
return SDL_APP_SUCCESS;
128+
}
129+
}
105130
SDL_Log("%d\n", event->menu.user_event_type);
106131
}
107132
}

src/video/SDL_sysvideo.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,13 +224,11 @@ typedef struct SDL_MenuItem_CommonData
224224
typedef struct SDL_MenuBar
225225
{
226226
SDL_MenuItem_CommonData common;
227-
SDL_MenuItem *item_list;
228227
} SDL_MenuBar;
229228

230229
typedef struct SDL_Menu
231230
{
232231
SDL_MenuItem_CommonData common;
233-
SDL_MenuItem *menuitem_list;
234232
} SDL_Menu;
235233

236234
typedef struct SDL_MenuItem_Button
@@ -364,7 +362,8 @@ struct SDL_VideoDevice
364362
bool (*CreateMenuItem)(SDL_MenuItem *menu_item, const char *name, Uint16 event_type);
365363
bool (*CheckMenuItem)(SDL_MenuItem *menu_item, bool checked);
366364
bool (*EnableMenuItem)(SDL_MenuItem *menu_item, bool enabled);
367-
void (*DestroyMenuItem)(SDL_MenuItem *menu_item);
365+
bool (*DestroyMenuItem)(SDL_MenuItem *menu_item);
366+
bool (*DestroyMenuBar)(SDL_MenuBar *menu_bar);
368367

369368
/* * * */
370369
/*

src/video/SDL_video.c

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6091,15 +6091,15 @@ SDL_MenuItem* SDL_CreateMenuBarItem(SDL_MenuBar* menu_bar, const char *name, SDL
60916091
}
60926092

60936093
// Get the last item in the list and insert our new item.
6094-
if (menu_bar->item_list) {
6095-
SDL_MenuItem* last = menu_bar->item_list;
6094+
if (menu_bar->common.next) {
6095+
SDL_MenuItem* common = menu_bar->common.next;
60966096

6097-
while (last->common.next) last = last->common.next;
6097+
while (common->common.next) common = common->common.next;
60986098

6099-
last->common.next = menu_item;
6100-
menu_item->common.prev = last;
6099+
common->common.next = menu_item;
6100+
menu_item->common.prev = common;
61016101
} else {
6102-
menu_bar->item_list = menu_item;
6102+
menu_bar->common.next = menu_item;
61036103
}
61046104

61056105
return menu_item;
@@ -6120,15 +6120,15 @@ SDL_MenuItem* SDL_CreateMenuItem(SDL_Menu* menu, const char *name, SDL_MenuItemT
61206120
}
61216121

61226122
// Get the last item in the list and insert our new item.
6123-
if (menu->menuitem_list) {
6124-
SDL_MenuItem* last = menu->menuitem_list;
6123+
if (menu->common.next) {
6124+
SDL_MenuItem* current = menu->common.next;
61256125

6126-
while (last->common.next) last = last->common.next;
6126+
while (current->common.next) current = current->common.next;
61276127

6128-
last->common.next = menu_item;
6129-
menu_item->common.prev = last;
6128+
current->common.next = menu_item;
6129+
menu_item->common.prev = current;
61306130
} else {
6131-
menu->menuitem_list = menu_item;
6131+
menu->common.next = menu_item;
61326132
}
61336133

61346134
return menu_item;
@@ -6156,8 +6156,20 @@ bool SDL_EnableMenuItem(SDL_MenuItem* menu_item, bool enabled)
61566156
return _this->EnableMenuItem(menu_item, enabled);
61576157
}
61586158

6159+
static void SDL_DestroyMenuItem(SDL_MenuItem* menu_item) {
6160+
for (SDL_MenuItem *current = menu_item->common.next; current != NULL; current = current->common.next) {
6161+
SDL_DestroyMenuItem(current);
6162+
}
6163+
6164+
_this->DestroyMenuItem(menu_item);
6165+
SDL_free(menu_item);
6166+
}
6167+
61596168
bool SDL_DestroyMenuBar(SDL_MenuBar* menu_bar)
61606169
{
6170+
bool ret = _this->DestroyMenuBar(menu_bar);
6171+
SDL_DestroyMenuItem((SDL_MenuItem *)menu_bar);
6172+
61616173
return true;
61626174
}
61636175

src/video/windows/SDL_windowsvideo.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@ static SDL_VideoDevice *WIN_CreateDevice(void)
278278
device->CheckMenuItem = Win32_CheckMenuItem;
279279
device->EnableMenuItem = Win32_EnableMenuItem;
280280
device->DestroyMenuItem = Win32_DestroyMenuItem;
281+
device->DestroyMenuBar = Win32_DestroyMenuBar;
281282
#endif
282283

283284

@@ -932,15 +933,26 @@ static bool Win32_EnableMenuItem(SDL_MenuItem *menu_item, bool enabled)
932933
return true;
933934
}
934935

935-
static void Win32_DestroyMenuItem(SDL_MenuItem *menu_item)
936+
// We rely on the top level Win32_DestroyMenuBar to recursively deal with the native handles,
937+
// but we need to recurse through and delete the platform datas.
938+
static bool Win32_DestroyMenuItem(SDL_MenuItem *menu_item)
936939
{
937-
PlatformMenuData *platform_data = (PlatformMenuData *)menu_item->common.platform_data;
940+
SDL_free(menu_item->common.platform_data);
941+
return true;
942+
}
938943

939-
if (!RemoveMenu(platform_data->owner_handle, (UINT)platform_data->self_handle, MF_BYCOMMAND)) {
944+
static bool Win32_DestroyMenuBar(SDL_MenuBar *menu_bar)
945+
{
946+
PlatformMenuData *platform_data = (PlatformMenuData *)menu_bar->common.platform_data;
947+
948+
// This will take care of all of the child handles underneath the menubar.
949+
if (!DestroyMenu((HMENU)platform_data->self_handle)) {
940950
return WIN_SetError("Unable to remove menu item.");
941951
}
942952

943-
SDL_free(menu_item->common.platform_data);
953+
Win32_DestroyMenuItem((SDL_MenuItem *)menu_bar);
954+
SDL_free(menu_bar->common.platform_data);
955+
return true;
944956
}
945957

946958
#endif // SDL_VIDEO_DRIVER_WINDOWS

src/video/windows/SDL_windowsvideo.h

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -567,26 +567,12 @@ typedef struct PlatformMenuData
567567
UINT_PTR self_handle;
568568
} PlatformMenuData;
569569

570-
extern PlatformMenuData *CreatePlatformMenuData(HMENU owner, SDL_MenuItemType type);
571570
extern bool SDLCALL Win32_CreateMenuBar(SDL_MenuBar *menu_bar);
572-
573-
574-
575-
576-
//bool (*CreateMenuBar)(SDL_MenuBar *menu_bar);
577-
//bool (*CreateMenuBarItem)(SDL_MenuItem *menu_item, const char *name, Uint16 event_type);
578-
//bool (*CreateMenuItem)(SDL_MenuItem *menu_item, const char *name, Uint16 event_type);
579-
//bool (*CheckMenuItem)(SDL_MenuItem *menu_item, bool checked);
580-
//bool (*EnableMenuItem)(SDL_MenuItem *menu_item, bool enabled);
581-
//void (*DestroyMenuItem)(SDL_MenuItem *menu_item);
582-
583-
//extern SDL_MenuItem *Win32_CreateMenuItemImpl(HMENU menu, const char *name, SDL_MenuItemType type, Uint16 event_type, bool toplevel_menu);
584571
extern bool Win32_CreateMenuBarItem(SDL_MenuItem *menu_item, const char *name, Uint16 event_type);
585-
586-
//(*CreateMenuItem)(SDL_MenuItem *menu_item, const char *name, Uint16 event_type)
587572
extern bool Win32_CreateMenuItem(SDL_MenuItem *menu_item, const char *name, Uint16 event_type);
588573
extern bool Win32_CheckMenuItem(SDL_MenuItem *menu_item, bool checked);
589574
extern bool Win32_EnableMenuItem(SDL_MenuItem *menu_item, bool enabled);
590-
extern void Win32_DestroyMenuItem(SDL_MenuItem *menu_item);
575+
extern bool Win32_DestroyMenuItem(SDL_MenuItem *menu_item);
576+
extern bool Win32_DestroyMenuBar(SDL_MenuBar *menu_bar);
591577

592578
#endif // SDL_windowsvideo_h_

0 commit comments

Comments
 (0)