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) { + +}