Sun, 07 Dec 2025 10:41:04 +0100
add menubar (Win32)
| application/main.c | file | annotate | diff | comparison | revisions | |
| client/main.c | file | annotate | diff | comparison | revisions | |
| client/uiclient.c | file | annotate | diff | comparison | revisions | |
| ui/win32/menu.c | file | annotate | diff | comparison | revisions | |
| ui/win32/menu.h | file | annotate | diff | comparison | revisions | |
| ui/win32/objs.mk | file | annotate | diff | comparison | revisions | |
| ui/win32/toolkit.c | file | annotate | diff | comparison | revisions | |
| ui/win32/window.c | file | annotate | diff | comparison | revisions |
--- a/application/main.c Sun Dec 07 10:02:27 2025 +0100 +++ b/application/main.c Sun Dec 07 10:41:04 2025 +0100 @@ -1248,9 +1248,6 @@ ui_textarea(obj, .colspan = 3, .fill = TRUE); } - - - ui_show(obj); }
--- a/client/main.c Sun Dec 07 10:02:27 2025 +0100 +++ b/client/main.c Sun Dec 07 10:41:04 2025 +0100 @@ -26,6 +26,8 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include "main.h" + #ifndef _WIN32 #include <stdio.h> @@ -207,7 +209,8 @@ #else -int main(int argc, char **argv) { + +int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { return 0; }
--- a/client/uiclient.c Sun Dec 07 10:02:27 2025 +0100 +++ b/client/uiclient.c Sun Dec 07 10:41:04 2025 +0100 @@ -35,6 +35,8 @@ #include "../ui/common/args.h" +#ifndef _WIN32 + static UiMessageHandler *io; static CxMap *msg_types; @@ -299,3 +301,5 @@ return 0; } + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/win32/menu.c Sun Dec 07 10:41:04 2025 +0100 @@ -0,0 +1,97 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2024 Olaf Wintermann. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "menu.h" + +static ui_menu_add_f createMenuItem[] = { + /* UI_MENU */ ui_add_menu, + /* UI_MENU_ITEM */ ui_add_menu_item, + /* UI_MENU_CHECK_ITEM */ ui_add_menu_checkitem, + /* UI_MENU_RADIO_ITEM */ ui_add_menu_radioitem, + /* UI_MENU_ITEM_LIST */ ui_add_menu_list, + /* UI_MENU_CHECKITEM_LIST */ ui_add_menu_checklist, + /* UI_MENU_RADIOITEM_LIST */ ui_add_menu_radiolist, + /* UI_MENU_SEPARATOR */ ui_add_menu_separator +}; + + +HMENU ui_create_main_menu(UiObject *obj) { + UiMenu *menu = uic_get_menu_list(); + if (!menu) { + return NULL; + } + + HMENU hMenu = CreateMenu(); + ui_add_menu(hMenu, 0, &menu->item, obj); + + + + return hMenu; +} + +void ui_add_menu(HMENU parent, int pos, UiMenuItemI *item, UiObject *obj) { + UiMenu *menu = (UiMenu*)item; + HMENU hMenu = CreatePopupMenu(); + AppendMenu(parent, MF_POPUP, (UINT_PTR)hMenu, menu->label); + + int i = 0; + UiMenuItemI *child = menu->items_begin; + while (child) { + createMenuItem[child->type](hMenu, i++, child, obj); + child = child->next; + } +} + +void ui_add_menu_item(HMENU parent, int pos, UiMenuItemI *item, UiObject *obj) { + UiMenuItem *i = (UiMenuItem*)item; + AppendMenu(parent, MF_STRING, 0, i->label); +} + +void ui_add_menu_checkitem(HMENU parent, int pos, UiMenuItemI *item, UiObject *obj) { + +} + +void ui_add_menu_radioitem(HMENU parent, int pos, UiMenuItemI *item, UiObject *obj) { + +} + +void ui_add_menu_list(HMENU parent, int pos, UiMenuItemI *item, UiObject *obj) { + +} + +void ui_add_menu_checklist(HMENU parent, int pos, UiMenuItemI *item, UiObject *obj) { + +} + +void ui_add_menu_radiolist(HMENU parent, int pos, UiMenuItemI *item, UiObject *obj) { + +} + +void ui_add_menu_separator(HMENU parent, int pos, UiMenuItemI *item, UiObject *obj) { + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/win32/menu.h Sun Dec 07 10:41:04 2025 +0100 @@ -0,0 +1,57 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2025 Olaf Wintermann. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef MENU_H +#define MENU_H + +#include "toolkit.h" +#include "../ui/menu.h" +#include "../common/menu.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void(*ui_menu_add_f)(HMENU, int, UiMenuItemI*, UiObject*); + +HMENU ui_create_main_menu(UiObject *obj); + +void ui_add_menu(HMENU parent, int pos, UiMenuItemI *item, UiObject *obj); +void ui_add_menu_item(HMENU parent, int pos, UiMenuItemI *item, UiObject *obj); +void ui_add_menu_checkitem(HMENU parent, int pos, UiMenuItemI *item, UiObject *obj); +void ui_add_menu_radioitem(HMENU parent, int pos, UiMenuItemI *item, UiObject *obj); +void ui_add_menu_list(HMENU parent, int pos, UiMenuItemI *item, UiObject *obj); +void ui_add_menu_checklist(HMENU parent, int pos, UiMenuItemI *item, UiObject *obj); +void ui_add_menu_radiolist(HMENU parent, int pos, UiMenuItemI *item, UiObject *obj); +void ui_add_menu_separator(HMENU parent, int pos, UiMenuItemI *item, UiObject *obj); + +#ifdef __cplusplus +} +#endif + +#endif //MENU_H \ No newline at end of file
--- a/ui/win32/objs.mk Sun Dec 07 10:02:27 2025 +0100 +++ b/ui/win32/objs.mk Sun Dec 07 10:41:04 2025 +0100 @@ -39,6 +39,7 @@ WIN32OBJ += grid.obj WIN32OBJ += text.obj WIN32OBJ += list.obj +WIN32OBJ += menu.obj TOOLKITOBJS += $(WIN32OBJ:%=$(WIN32_OBJPRE)%) TOOLKITSOURCE += $(WIN32OBJ:%.obj=win32/%.c)
--- a/ui/win32/toolkit.c Sun Dec 07 10:02:27 2025 +0100 +++ b/ui/win32/toolkit.c Sun Dec 07 10:41:04 2025 +0100 @@ -161,7 +161,7 @@ case WM_SIZE: { int width = LOWORD(lParam); int height = HIWORD(lParam); - if (widget->layout) { + if (widget && widget->layout) { widget->layout(widget->layoutmanager, width, height); } break;
--- a/ui/win32/window.c Sun Dec 07 10:02:27 2025 +0100 +++ b/ui/win32/window.c Sun Dec 07 10:41:04 2025 +0100 @@ -39,6 +39,7 @@ #include <stdlib.h> #include "win32.h" +#include "menu.h" static W32WidgetClass w32_toplevel_widget_class = { .eventproc = ui_window_widget_event, @@ -87,6 +88,13 @@ hInstance, NULL); + if (!simple) { + HMENU menubar = ui_create_main_menu(obj); + if (menubar) { + SetMenu(hwnd, menubar); + } + } + UpdateWindow(hwnd); UiContainerX *container = ui_box_container_create(obj, hwnd, UI_BOX_VERTICAL, 0, INSETS_ZERO);