static void updateOptionsMenu(WMenu * menu, WWindow * wwin) { WMenu *smenu = menu->cascades[menu->entries[MC_OPTIONS]->cascade]; /* keep on top check */ smenu->entries[WO_KEEP_ON_TOP]->clientdata = wwin; smenu->entries[WO_KEEP_ON_TOP]->flags.indicator_on = (wwin->frame->core->stacking->window_level == WMFloatingLevel) ? 1 : 0; wMenuSetEnabled(smenu, WO_KEEP_ON_TOP, !wwin->flags.miniaturized); smenu->entries[WO_KEEP_ON_TOP]->rtext = GetShortcutKey(wKeyBindings[WKBD_KEEP_ON_TOP]); /* keep at bottom check */ smenu->entries[WO_KEEP_AT_BOTTOM]->clientdata = wwin; smenu->entries[WO_KEEP_AT_BOTTOM]->flags.indicator_on = (wwin->frame->core->stacking->window_level == WMSunkenLevel) ? 1 : 0; wMenuSetEnabled(smenu, WO_KEEP_AT_BOTTOM, !wwin->flags.miniaturized); smenu->entries[WO_KEEP_AT_BOTTOM]->rtext = GetShortcutKey(wKeyBindings[WKBD_KEEP_AT_BOTTOM]); /* omnipresent check */ smenu->entries[WO_OMNIPRESENT]->clientdata = wwin; smenu->entries[WO_OMNIPRESENT]->flags.indicator_on = IS_OMNIPRESENT(wwin); smenu->entries[WO_OMNIPRESENT]->rtext = GetShortcutKey(wKeyBindings[WKBD_OMNIPRESENT]); smenu->flags.realized = 0; wMenuRealize(smenu); }
static void updateUnmaximizeShortcut(WMenuEntry * entry, int flags) { int key; switch (flags & (MAX_HORIZONTAL | MAX_VERTICAL | MAX_LEFTHALF | MAX_RIGHTHALF | MAX_TOPHALF | MAX_BOTTOMHALF | MAX_MAXIMUS)) { case MAX_HORIZONTAL: key = WKBD_HMAXIMIZE; break; case MAX_VERTICAL: key = WKBD_VMAXIMIZE; break; case MAX_LEFTHALF | MAX_VERTICAL: key = WKBD_LHMAXIMIZE; break; case MAX_RIGHTHALF | MAX_VERTICAL: key = WKBD_RHMAXIMIZE; break; case MAX_TOPHALF | MAX_HORIZONTAL: key = WKBD_THMAXIMIZE; break; case MAX_BOTTOMHALF | MAX_HORIZONTAL: key = WKBD_BHMAXIMIZE; break; case MAX_LEFTHALF | MAX_TOPHALF: key = WKBD_LTCMAXIMIZE; break; case MAX_RIGHTHALF | MAX_TOPHALF: key = WKBD_RTCMAXIMIZE; break; case MAX_LEFTHALF | MAX_BOTTOMHALF: key = WKBD_LBCMAXIMIZE; break; case MAX_RIGHTHALF | MAX_BOTTOMHALF: key = WKBD_RBCMAXIMIZE; break; case MAX_MAXIMUS: key = WKBD_MAXIMUS; break; default: key = WKBD_MAXIMIZE; break; } entry->rtext = GetShortcutKey(wKeyBindings[key]); }
static void updateMaximizeMenu(WMenu * menu, WWindow * wwin) { WMenu *smenu = menu->cascades[menu->entries[MC_OTHERMAX]->cascade]; int i; for (i = 0; i < smenu->entry_no; i++) { smenu->entries[i]->clientdata = wwin; smenu->entries[i]->rtext = GetShortcutKey(wKeyBindings[menu_maximize_entries[i].shortcut_idx]); } smenu->flags.realized = 0; wMenuRealize(smenu); }
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); }
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 void updateMenuForWindow(WMenu * menu, WWindow * wwin) { WApplication *wapp = wApplicationOf(wwin->main_window); WScreen *scr = wwin->screen_ptr; int i; updateOptionsMenu(menu, wwin); updateMaximizeMenu(menu, wwin); updateMakeShortcutMenu(menu, wwin); wMenuSetEnabled(menu, MC_HIDE, wapp != NULL && !WFLAGP(wapp->main_window_desc, no_appicon)); wMenuSetEnabled(menu, MC_CLOSE, (wwin->protocols.DELETE_WINDOW && !WFLAGP(wwin, no_closable))); if (wwin->flags.miniaturized) { static char *text = NULL; if (!text) text = _("Deminiaturize"); menu->entries[MC_MINIATURIZE]->text = text; } else { static char *text = NULL; if (!text) text = _("Miniaturize"); menu->entries[MC_MINIATURIZE]->text = text; } wMenuSetEnabled(menu, MC_MINIATURIZE, !WFLAGP(wwin, no_miniaturizable)); if (wwin->flags.maximized) { static char *text = NULL; if (!text) text = _("Unmaximize"); menu->entries[MC_MAXIMIZE]->text = text; updateUnmaximizeShortcut(menu->entries[MC_MAXIMIZE], wwin->flags.maximized); } else { static char *text = NULL; if (!text) text = _("Maximize"); menu->entries[MC_MAXIMIZE]->text = text; menu->entries[MC_MAXIMIZE]->rtext = GetShortcutKey(wKeyBindings[WKBD_MAXIMIZE]); } wMenuSetEnabled(menu, MC_MAXIMIZE, IS_RESIZABLE(wwin)); wMenuSetEnabled(menu, MC_MOVERESIZE, IS_RESIZABLE(wwin) && !wwin->flags.miniaturized); if (wwin->flags.shaded) { static char *text = NULL; if (!text) text = _("Unshade"); menu->entries[MC_SHADE]->text = text; } else { static char *text = NULL; if (!text) text = _("Shade"); menu->entries[MC_SHADE]->text = text; } wMenuSetEnabled(menu, MC_SHADE, !WFLAGP(wwin, no_shadeable) && !wwin->flags.miniaturized); if (wwin->flags.selected) { static char *text = NULL; if (!text) text = _("Deselect"); menu->entries[MC_SELECT]->text = text; } else { static char *text = NULL; if (!text) text = _("Select"); menu->entries[MC_SELECT]->text = text; } wMenuSetEnabled(menu, MC_CHANGEWKSPC, !IS_OMNIPRESENT(wwin)); if (!wwin->flags.inspector_open) { wMenuSetEnabled(menu, MC_PROPERTIES, True); } else { wMenuSetEnabled(menu, MC_PROPERTIES, False); } /* Update shortcut labels except for (Un)Maximize which is * handled separately. */ menu->entries[MC_MINIATURIZE]->rtext = GetShortcutKey(wKeyBindings[WKBD_MINIATURIZE]); menu->entries[MC_SHADE]->rtext = GetShortcutKey(wKeyBindings[WKBD_SHADE]); menu->entries[MC_HIDE]->rtext = GetShortcutKey(wKeyBindings[WKBD_HIDE]); menu->entries[MC_MOVERESIZE]->rtext = GetShortcutKey(wKeyBindings[WKBD_MOVERESIZE]); menu->entries[MC_SELECT]->rtext = GetShortcutKey(wKeyBindings[WKBD_SELECT]); menu->entries[MC_RELAUNCH]->rtext = GetShortcutKey(wKeyBindings[WKBD_RELAUNCH]); menu->entries[MC_CLOSE]->rtext = GetShortcutKey(wKeyBindings[WKBD_CLOSE]); /* set the client data of the entries to the window */ for (i = 0; i < menu->entry_no; i++) { menu->entries[i]->clientdata = wwin; } for (i = 0; i < scr->workspace_submenu->entry_no; i++) { scr->workspace_submenu->entries[i]->clientdata = wwin; if (i == scr->current_workspace) wMenuSetEnabled(scr->workspace_submenu, i, False); else wMenuSetEnabled(scr->workspace_submenu, i, True); } menu->flags.realized = 0; wMenuRealize(menu); }
static void updateMakeShortcutMenu(WMenu * menu, WWindow * wwin) { WMenu *smenu = menu->cascades[menu->entries[MC_OPTIONS]->cascade]; int i; char *buffer; int buflen; KeyCode kcode; if (!smenu) return; buflen = strlen(_("Set Shortcut")) + 16; buffer = wmalloc(buflen); for (i = wlengthof(menu_options_entries); i < smenu->entry_no; i++) { int shortcutNo = i - wlengthof(menu_options_entries); WMenuEntry *entry = smenu->entries[i]; WMArray *shortSelWindows = wwin->screen_ptr->shortcutWindows[shortcutNo]; snprintf(buffer, buflen, "%s %i", _("Set Shortcut"), shortcutNo + 1); if (!shortSelWindows) { entry->flags.indicator_on = 0; } else { entry->flags.indicator_on = 1; if (WMCountInArray(shortSelWindows, wwin)) entry->flags.indicator_type = MI_DIAMOND; else entry->flags.indicator_type = MI_CHECK; } if (strcmp(buffer, entry->text) != 0) { wfree(entry->text); entry->text = wstrdup(buffer); smenu->flags.realized = 0; } kcode = wKeyBindings[WKBD_WINDOW1 + shortcutNo].keycode; if (kcode) { char *tmp; tmp = GetShortcutKey(wKeyBindings[WKBD_WINDOW1 + shortcutNo]); if (tmp == NULL) { if (entry->rtext != NULL) { /* There was a shortcut, but there is no more */ wfree(entry->rtext); entry->rtext = NULL; smenu->flags.realized = 0; } } else if (entry->rtext == NULL) { /* There was no shortcut, but there is one now */ entry->rtext = tmp; smenu->flags.realized = 0; } else if (strcmp(tmp, entry->rtext) != 0) { /* There was a shortcut, but it has changed */ wfree(entry->rtext); entry->rtext = tmp; smenu->flags.realized = 0; } else { /* There was a shortcut but it did not change */ wfree(tmp); } wMenuSetEnabled(smenu, i, True); } else { wMenuSetEnabled(smenu, i, False); if (entry->rtext) { wfree(entry->rtext); entry->rtext = NULL; smenu->flags.realized = 0; } } entry->clientdata = wwin; } wfree(buffer); if (!smenu->flags.realized) wMenuRealize(smenu); }
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); }