static WMenu *makeOptionsMenu(WScreen * scr) { WMenu *menu; WMenuEntry *entry; int i; menu = wMenuCreate(scr, NULL, False); if (!menu) { wwarning(_("could not create submenu for window menu")); return NULL; } for (i = 0; i < wlengthof(menu_options_entries); i++) { entry = wMenuAddCallback(menu, _(menu_options_entries[i]), execWindowOptionCommand, NULL); entry->flags.indicator = 1; entry->flags.indicator_type = MI_CHECK; } for (i = 0; i < MAX_WINDOW_SHORTCUTS; i++) { entry = wMenuAddCallback(menu, "", makeShortcutCommand, NULL); entry->flags.indicator = 1; } return menu; }
static WMenu* createApplicationMenu(WScreen *scr) { WMenu *menu; menu = wMenuCreate(scr, NULL, False); wMenuAddCallback(menu, _("Unhide Here"), unhideHereCallback, NULL); wMenuAddCallback(menu, _("Hide"), hideCallback, NULL); wMenuAddCallback(menu, _("Set Icon..."), setIconCallback, NULL); wMenuAddCallback(menu, _("Kill"), killCallback, NULL); return menu; }
WMenu *wWorkspaceMenuMake(WScreen * scr, Bool titled) { WMenu *wsmenu; WMenuEntry *entry; wsmenu = wMenuCreate(scr, titled ? _("Workspaces") : NULL, False); if (!wsmenu) { wwarning(_("could not create Workspace menu")); return NULL; } /* callback to be called when an entry is edited */ wsmenu->on_edit = onMenuEntryEdited; wMenuAddCallback(wsmenu, _("New"), newWSCommand, NULL); wMenuAddCallback(wsmenu, _("Destroy Last"), deleteWSCommand, NULL); entry = wMenuAddCallback(wsmenu, _("Last Used"), lastWSCommand, NULL); entry->rtext = GetShortcutKey(wKeyBindings[WKBD_LASTWORKSPACE]); return wsmenu; }
static WMenu *makeMaximizeMenu(WScreen * scr) { WMenu *menu; int i; menu = wMenuCreate(scr, NULL, False); if (!menu) { wwarning(_("could not create submenu for window menu")); return NULL; } for (i = 0; i < wlengthof(menu_maximize_entries); i++) wMenuAddCallback(menu, _(menu_maximize_entries[i].label), execMaximizeCommand, NULL); return menu; }
static void updateWorkspaceMenu(WMenu * menu) { WScreen *scr = menu->frame->screen_ptr; char title[MAX_WORKSPACENAME_WIDTH + 1]; WMenuEntry *entry; int i; for (i = 0; i < scr->workspace_count; i++) { if (i < menu->entry_no) { entry = menu->entries[i]; if (strcmp(entry->text, scr->workspaces[i]->name) != 0) { wfree(entry->text); strncpy(title, scr->workspaces[i]->name, MAX_WORKSPACENAME_WIDTH); title[MAX_WORKSPACENAME_WIDTH] = 0; menu->entries[i]->text = wstrdup(title); menu->entries[i]->rtext = GetShortcutKey(wKeyBindings[WKBD_MOVE_WORKSPACE1 + i]); menu->flags.realized = 0; } } else { strncpy(title, scr->workspaces[i]->name, MAX_WORKSPACENAME_WIDTH); title[MAX_WORKSPACENAME_WIDTH] = 0; entry = wMenuAddCallback(menu, title, switchWSCommand, NULL); entry->rtext = GetShortcutKey(wKeyBindings[WKBD_MOVE_WORKSPACE1 + i]); menu->flags.realized = 0; } /* workspace shortcut labels */ if (i / 10 == scr->current_workspace / 10) entry->rtext = GetShortcutKey(wKeyBindings[WKBD_MOVE_WORKSPACE1 + (i % 10)]); else entry->rtext = NULL; } if (!menu->flags.realized) wMenuRealize(menu); }
static WMenu *createWindowMenu(WScreen * scr) { WMenu *menu; int i; menu = wMenuCreate(scr, NULL, False); for (i = 0; i < wlengthof(window_menu_entries); i++) { WMenuEntry *entry; entry = wMenuAddCallback(menu, _(window_menu_entries[i].label), (window_menu_entries[i].generate_submenu == NULL)?execMenuCommand:NULL, NULL); if (window_menu_entries[i].generate_submenu != NULL) { WMenu *submenu; submenu = window_menu_entries[i].generate_submenu(scr); wMenuEntrySetCascade(menu, entry, submenu); } } return menu; }
static WMenu *createApplicationMenu(virtual_screen *vscr, Bool hidden) { WMenu *menu; menu = menu_create(vscr, NULL); wMenuAddCallback(menu, _("Unhide Here"), unhideHereCallback, NULL); if (hidden) wMenuAddCallback(menu, _("Unhide"), hideCallback, NULL); else wMenuAddCallback(menu, _("Hide"), hideCallback, NULL); wMenuAddCallback(menu, _("Launch"), relaunchCallback, NULL); wMenuAddCallback(menu, _("Set Icon..."), setIconCallback, NULL); wMenuAddCallback(menu, _("Kill"), killCallback, NULL); return menu; }
void wWorkspaceMenuUpdate(WMenu *menu) { int i; long ws; char title[MAX_WORKSPACENAME_WIDTH + 1]; WMenuEntry *entry; int tmp; if (!menu) return; if (menu->entry_no < w_global.workspace.count + MC_WORKSPACE1) { /* new workspace(s) added */ i = w_global.workspace.count - (menu->entry_no - MC_WORKSPACE1); ws = menu->entry_no - MC_WORKSPACE1; while (i > 0) { wstrlcpy(title, w_global.workspace.array[ws]->name, MAX_WORKSPACENAME_WIDTH); entry = wMenuAddCallback(menu, title, switchWSCommand, (void *)ws); entry->flags.indicator = 1; entry->flags.editable = 1; i--; ws++; } } else if (menu->entry_no > w_global.workspace.count + MC_WORKSPACE1) { /* removed workspace(s) */ for (i = menu->entry_no - 1; i >= w_global.workspace.count + MC_WORKSPACE1; i--) wMenuRemoveItem(menu, i); } for (i = 0; i < w_global.workspace.count; i++) { /* workspace shortcut labels */ if (i / 10 == w_global.workspace.current / 10) menu->entries[i + MC_WORKSPACE1]->rtext = GetShortcutKey(wKeyBindings[WKBD_WORKSPACE1 + (i % 10)]); else menu->entries[i + MC_WORKSPACE1]->rtext = NULL; menu->entries[i + MC_WORKSPACE1]->flags.indicator_on = 0; } menu->entries[w_global.workspace.current + MC_WORKSPACE1]->flags.indicator_on = 1; wMenuRealize(menu); /* don't let user destroy current workspace */ if (w_global.workspace.current == w_global.workspace.count - 1) wMenuSetEnabled(menu, MC_DESTROY_LAST, False); else wMenuSetEnabled(menu, MC_DESTROY_LAST, True); /* back to last workspace */ if (w_global.workspace.count && w_global.workspace.last_used != w_global.workspace.current) wMenuSetEnabled(menu, MC_LAST_USED, True); else wMenuSetEnabled(menu, MC_LAST_USED, False); tmp = menu->frame->top_width + 5; /* if menu got unreachable, bring it to a visible place */ if (menu->frame_x < tmp - (int)menu->frame->core->width) wMenuMove(menu, tmp - (int)menu->frame->core->width, menu->frame_y, False); wMenuPaint(menu); }
static WMenu *parseMenuCommand(WScreen * scr, Window win, char **slist, int count, int *index) { WMenu *menu; int command; int code, pos; char title[300]; char rtext[300]; if (strlen(slist[*index]) > sizeof(title) - 1) { wwarning("appmenu: menu command size exceeded in window %lx", win); return NULL; } if (sscanf(slist[*index], "%i %i %n", &command, &code, &pos) < 2 || command != wmBeginMenu) { wwarning("appmenu: bad menu entry \"%s\" in window %lx", slist[*index], win); return NULL; } strcpy(title, &slist[*index][pos]); menu = wMenuCreateForApp(scr, title, *index == 1); if (!menu) return NULL; *index += 1; while (*index < count) { int ecode, etag, enab; if (sscanf(slist[*index], "%i", &command) != 1) { wMenuDestroy(menu, True); wwarning("appmenu: bad menu entry \"%s\" in window %lx", slist[*index], win); return NULL; } if (command == wmEndMenu) { *index += 1; break; } else if (command == wmNormalItem || command == wmDoubleItem) { WAppMenuData *data; WMenuEntry *entry; if (command == wmNormalItem) { if (sscanf(slist[*index], "%i %i %i %i %n", &command, &ecode, &etag, &enab, &pos) != 4 || ecode != code) { wMenuDestroy(menu, True); wwarning("appmenu: bad menu entry \"%s\" in window %lx", slist[*index], win); return NULL; } strcpy(title, &slist[*index][pos]); rtext[0] = 0; } else { if (sscanf(slist[*index], "%i %i %i %i %s %n", &command, &ecode, &etag, &enab, rtext, &pos) != 5 || ecode != code) { wMenuDestroy(menu, True); wwarning("appmenu: bad menu entry \"%s\" in window %lx", slist[*index], win); return NULL; } strcpy(title, &slist[*index][pos]); } if (!(data = malloc(sizeof(WAppMenuData)))) { wwarning("appmenu: out of memory making menu for window %lx", win); wMenuDestroy(menu, True); return NULL; } data->code = code; data->tag = etag; data->window = win; entry = wMenuAddCallback(menu, title, notifyClient, data); if (!entry) { wMenuDestroy(menu, True); wwarning("appmenu: out of memory creating menu for window %lx", win); free(data); return NULL; } if (rtext[0] != 0) entry->rtext = wstrdup(rtext); else entry->rtext = NULL; entry->free_cdata = free; *index += 1; } else if (command == wmSubmenuItem) { int ncode; WMenuEntry *entry; WMenu *submenu; if (sscanf(slist[*index], "%i %i %i %i %i %n", &command, &ecode, &etag, &enab, &ncode, &pos) != 5 || ecode != code) { wMenuDestroy(menu, True); wwarning("appmenu: bad menu entry \"%s\" in window %lx", slist[*index], win); return NULL; } strcpy(title, &slist[*index][pos]); *index += 1; submenu = parseMenuCommand(scr, win, slist, count, index); entry = wMenuAddCallback(menu, title, NULL, NULL); if (!entry) { wMenuDestroy(menu, True); wMenuDestroy(submenu, True); wwarning("appmenu: out of memory creating menu for window %lx", win); return NULL; } wMenuEntrySetCascade(menu, entry, submenu); } else { wMenuDestroy(menu, True); wwarning("appmenu: bad menu entry \"%s\" in window %lx", slist[*index], win); return NULL; } } return menu; }