static void menuItemCloned(WEditMenuDelegate * delegate, WEditMenu * menu, WEditMenuItem * origItem, WEditMenuItem * newItem) { ItemData *data = WGetEditMenuItemData(origItem); ItemData *newData; /* Parameter not used, but tell the compiler that it is ok */ (void) delegate; (void) menu; if (!data) return; #define DUP(s) (s) ? wstrdup(s) : NULL newData = wmalloc(sizeof(ItemData)); newData->type = data->type; switch (data->type) { case ExecInfo: newData->param.exec.command = DUP(data->param.exec.command); newData->param.exec.shortcut = DUP(data->param.exec.shortcut); break; case CommandInfo: newData->param.command.command = data->param.command.command; newData->param.command.parameter = DUP(data->param.command.parameter); newData->param.command.shortcut = DUP(data->param.command.shortcut); break; case PipeInfo: newData->param.pipe.command = DUP(data->param.pipe.command); newData->param.pipe.cached = data->param.pipe.cached; break; case PLPipeInfo: newData->param.pipe.command = DUP(data->param.pipe.command); newData->param.pipe.cached = data->param.pipe.cached; break; case ExternalInfo: newData->param.external.path = DUP(data->param.external.path); break; case DirectoryInfo: newData->param.directory.directory = DUP(data->param.directory.directory); newData->param.directory.command = DUP(data->param.directory.command); newData->param.directory.stripExt = data->param.directory.stripExt; break; default: break; } #undef DUP WSetEditMenuItemData(newItem, newData, (WMCallback *) freeItemData); }
static WEditMenu* buildSubmenu(_Panel *panel, WMPropList *pl) { WMScreen *scr = WMWidgetScreen(panel->parent); WEditMenu *menu; WEditMenuItem *item; char *title; WMPropList *tp, *bp; int i; tp = WMGetFromPLArray(pl, 0); title = WMGetFromPLString(tp); menu = WCreateEditMenu(scr, title); for (i = 1; i < WMGetPropListItemCount(pl); i++) { WMPropList *pi; pi = WMGetFromPLArray(pl, i); tp = WMGetFromPLArray(pi, 0); bp = WMGetFromPLArray(pi, 1); title = WMGetFromPLString(tp); if (!bp || WMIsPLArray(bp)) { /* it's a submenu */ WEditMenu *submenu; submenu = buildSubmenu(panel, pi); item = WAddMenuItemWithTitle(menu, title); WSetEditMenuSubmenu(menu, item, submenu); } else { ItemData *data; item = WAddMenuItemWithTitle(menu, title); data = parseCommand(pi); if (panel->markerPix[data->type]) WSetEditMenuItemImage(item, panel->markerPix[data->type]); WSetEditMenuItemData(item, data, (WMCallback*)freeItemData); } } WSetEditMenuAcceptsDrop(menu, True); WSetEditMenuDelegate(menu, &menuDelegate); WMRealizeWidget(menu); return menu; }
static ItemData *putNewItem(_Panel * panel, WEditMenu * menu, int type, const char *title) { WEditMenuItem *item; ItemData *data; item = WAddMenuItemWithTitle(menu, title); data = wmalloc(sizeof(ItemData)); data->type = type; WSetEditMenuItemData(item, data, (WMCallback *) freeItemData); WSetEditMenuItemImage(item, panel->markerPix[type]); return data; }
static WEditMenu *buildSubmenu(_Panel * panel, WMPropList * pl) { WMScreen *scr = WMWidgetScreen(panel->parent); WEditMenu *menu; WEditMenuItem *item; char *title; WMPropList *tp, *bp; int i; tp = WMGetFromPLArray(pl, 0); title = WMGetFromPLString(tp); menu = WCreateEditMenu(scr, title); for (i = 1; i < WMGetPropListItemCount(pl); i++) { WMPropList *pi; pi = WMGetFromPLArray(pl, i); tp = WMGetFromPLArray(pi, 0); bp = WMGetFromPLArray(pi, 1); title = WMGetFromPLString(tp); if (!bp || WMIsPLArray(bp)) { /* it's a submenu */ WEditMenu *submenu; submenu = buildSubmenu(panel, pi); item = WAddMenuItemWithTitle(menu, title); WSetEditMenuSubmenu(menu, item, submenu); } else { ItemData *data; data = parseCommand(pi); if (data != NULL) { item = WAddMenuItemWithTitle(menu, title); if (panel->markerPix[data->type]) WSetEditMenuItemImage(item, panel->markerPix[data->type]); WSetEditMenuItemData(item, data, (WMCallback *) freeItemData); } else { char *buf = wmalloc(1024); snprintf(buf, 1024, _("Invalid menu command \"%s\" with label \"%s\" cleared"), WMGetFromPLString(WMGetFromPLArray(pi, 1)), WMGetFromPLString(WMGetFromPLArray(pi, 0))); WMRunAlertPanel(scr, panel->parent, _("Warning"), buf, _("OK"), NULL, NULL); wfree(buf); } } } WSetEditMenuAcceptsDrop(menu, True); WSetEditMenuDelegate(menu, &menuDelegate); WMRealizeWidget(menu); return menu; }