# HG changeset patch # User Olaf Winermann # Date 1734260370 -3600 # Node ID 89ad8467c39fe621e72d80831e125299c922442a # Parent e35cdf33998cd0b8ae13734b1a6da7af8e6980fa implement motif menu/menu item diff -r e35cdf33998c -r 89ad8467c39f application/main.c --- a/application/main.c Fri Dec 13 10:59:31 2024 +0100 +++ b/application/main.c Sun Dec 15 11:59:30 2024 +0100 @@ -554,6 +554,12 @@ int main(int argc, char** argv) { ui_init("app1", argc, argv); ui_onstartup(application_startup, NULL); + + // menu + ui_menu("File") { + ui_menuitem(.label = "Test"); + } + ui_main(); return (EXIT_SUCCESS); } diff -r e35cdf33998c -r 89ad8467c39f ui/motif/menu.c --- a/ui/motif/menu.c Fri Dec 13 10:59:31 2024 +0100 +++ b/ui/motif/menu.c Sun Dec 15 11:59:30 2024 +0100 @@ -36,8 +36,117 @@ #include "stock.h" #include "container.h" #include "../common/context.h" +#include "../common/menu.h" #include "../ui/window.h" #include #include + +static ui_menu_add_f createMenuItem[] = { + /* UI_MENU */ add_menu_widget, + /* UI_MENU_ITEM */ add_menuitem_widget, + /* UI_MENU_CHECK_ITEM */ add_checkitem_widget, + /* UI_MENU_RADIO_ITEM */ add_radioitem_widget, + /* UI_MENU_ITEM_LIST */ add_menuitem_list_widget, + /* UI_MENU_CHECKITEM_LIST */ add_menuitem_list_widget, + /* UI_MENU_RADIOITEM_LIST */ add_menuitem_list_widget, + /* UI_MENU_SEPARATOR */ add_menuseparator_widget +}; + +void ui_create_menubar(UiObject *obj, Widget window) { + UiMenu *menus_begin = uic_get_menu_list(); + if(!menus_begin) { + return; + } + + Widget menubar = XmCreateMenuBar(window, "menubar", NULL, 0); + XtManageChild(menubar); + + UiMenu *ls = menus_begin; + while(ls) { + UiMenu *menu = ls; + add_menu_widget(menubar, 0, &menu->item, obj); + ls = (UiMenu*)ls->item.next; + } +} + +void ui_add_menu_items(Widget parent, int i, UiMenu *menu, UiObject *obj) { + UiMenuItemI *it = menu->items_begin; + int index = 0; + while(it) { + createMenuItem[it->type](parent, index, it, obj); + it = it->next; + index++; + } +} + +void add_menu_widget(Widget parent, int i, UiMenuItemI *item, UiObject *obj) { + UiMenu *menu = (UiMenu*)item; + Arg args[4]; + int n = 0; + + XmString s = NULL; + if(menu->label) { + s = XmStringCreateLocalized((char*)menu->label); + XtSetArg(args[n], XmNlabelString, s); n++; + } + + Widget submenu = XmVaCreateSimplePulldownMenu(parent, "menu_pulldown", i, NULL, NULL); + XtSetArg(args[n], XmNsubMenuId, submenu); n++; + Widget menuItem = XtCreateManagedWidget( + "menuitem", + xmCascadeButtonWidgetClass, + parent, + args, + n); + + + if(s) { + XmStringFree(s); + } + + ui_add_menu_items(submenu, i, menu, obj); +} + +void add_menuitem_widget(Widget parent, int i, UiMenuItemI *item, UiObject *obj) { + UiMenuItem *it = (UiMenuItem*)item; + + XmString s = NULL; + Arg args[4]; + int n = 0; + if(it->label) { + s = XmStringCreateLocalized((char*)it->label); + XtSetArg(args[n], XmNlabelString, s); n++; + } + + Widget mitem = XtCreateManagedWidget( + "menubutton", + xmPushButtonWidgetClass, + parent, + args, + n); + if(s) { + XmStringFree(s); + } +} + +void add_menuseparator_widget(Widget p, int i, UiMenuItemI *item, UiObject *obj) { + +} + +void add_checkitem_widget(Widget p, int i, UiMenuItemI *item, UiObject *obj) { + +} + +void add_radioitem_widget(Widget p, int index, UiMenuItemI *item, UiObject *obj) { + +} + +void add_checkitemnv_widget(Widget p, int i, UiMenuItemI *item, UiObject *obj) { + +} + +void add_menuitem_list_widget(Widget p, int i, UiMenuItemI *item, UiObject *obj) { + +} diff -r e35cdf33998c -r 89ad8467c39f ui/motif/menu.h --- a/ui/motif/menu.h Fri Dec 13 10:59:31 2024 +0100 +++ b/ui/motif/menu.h Sun Dec 15 11:59:30 2024 +0100 @@ -36,7 +36,19 @@ extern "C" { #endif +typedef void(*ui_menu_add_f)(Widget, int, UiMenuItemI*, UiObject*); + +void ui_create_menubar(UiObject *obj, Widget window); +void ui_add_menu_widget(Widget parent, int i, UiMenuItemI *item, UiObject *obj); +void add_menu_widget(Widget parent, int i, UiMenuItemI *item, UiObject *obj); +void add_menuitem_widget(Widget parent, int i, UiMenuItemI *item, UiObject *obj); +void add_menuitem_st_widget(Widget p, int i, UiMenuItemI *item, UiObject *obj); +void add_menuseparator_widget(Widget p, int i, UiMenuItemI *item, UiObject *obj); +void add_checkitem_widget(Widget p, int i, UiMenuItemI *item, UiObject *obj); +void add_radioitem_widget(Widget p, int index, UiMenuItemI *item, UiObject *obj); +void add_checkitemnv_widget(Widget p, int i, UiMenuItemI *item, UiObject *obj); +void add_menuitem_list_widget(Widget p, int i, UiMenuItemI *item, UiObject *obj); #ifdef __cplusplus } diff -r e35cdf33998c -r 89ad8467c39f ui/motif/text.c --- a/ui/motif/text.c Fri Dec 13 10:59:31 2024 +0100 +++ b/ui/motif/text.c Sun Dec 15 11:59:30 2024 +0100 @@ -390,6 +390,7 @@ bar->getpathelm = NULL; bar->getpathelmdata = NULL; + bar->current_pathelms = NULL; bar->shift = 0; diff -r e35cdf33998c -r 89ad8467c39f ui/motif/window.c --- a/ui/motif/window.c Fri Dec 13 10:59:31 2024 +0100 +++ b/ui/motif/window.c Sun Dec 15 11:59:30 2024 +0100 @@ -97,6 +97,11 @@ toplevel, NULL); + // menu + if(!simple) { + ui_create_menubar(obj, window); + } + // content frame n = 0; Widget frame = XmCreateFrame(window, "window_frame", args, n);