static void tabscb(Fl_Widget *w, void *) { vector<Fl_Menu_Item> items; const u32 max = g->closedtabs.size(); items.reserve(max + 1); const int inactive = max ? 0 : FL_MENU_INACTIVE; Fl_Menu_Item empty = {_("Empty trash"), 0, 0, 0, FL_MENU_DIVIDER | inactive, FL_NORMAL_LABEL, FL_HELVETICA, FL_NORMAL_SIZE, FL_FOREGROUND_COLOR }; items.push_back(empty); u32 i; for (i = 0; i < max; i++) { int shortcut = 0; if (!i) shortcut = menukey("keys.undotab"); Fl_Menu_Item it = {strdup(g->closedtabs[max - i - 1].title()), shortcut, 0, (void *) (unsigned long) (max - i), 0, FL_NORMAL_LABEL, FL_HELVETICA, FL_NORMAL_SIZE, FL_FOREGROUND_COLOR }; items.push_back(it); } Fl_Menu_Item end; memset(&end, 0, sizeof(Fl_Menu_Item)); items.push_back(end); const Fl_Menu_Item *ptr = items[0].popup(w->x(), w->y() + w->h()); if (ptr) { i = (u64) ptr->user_data_; if (i) { // Restore it i--; g->tabs.push_back(g->closedtabs[i]); g->closedtabs.erase(g->closedtabs.begin() + i); activatetab(g->tabs.size() - 1); } else { // Clear all closed tabs for (i = 0; i < max; i++) { if (g->closedtabs[i].web) { g->closedtabs[i].web->parent()->remove(g->closedtabs[i].web); g->closedtabs[i].web->stop(); delete g->closedtabs[i].errors; // Can't delete one with active downloads. if (g->closedtabs[i].web->numDownloads() == 0) delete g->closedtabs[i].web; else g->dlwebs.push_back(g->closedtabs[i].web); } } g->closedtabs.clear(); } } for (i = 0; i < max; i++) { free((char *) items[i + 1].text); } }
bool menukey(int code, bool isdown, int unicode, SDLMod mod) { if(!curmenu) return false; int n = curmenu->items.length(), menusel = curmenu->menusel; if(isdown) { bool hasdesc = false; loopv(curmenu->items) if(curmenu->items[i]->getdesc()) { hasdesc = true; break;} //int pagesize = MAXMENU - (curmenu->header ? 2 : 0) - (curmenu->footer || hasdesc ? 2 : 0); // FIXME: footer-length int pagesize = MAXMENU - (curmenu->header ? 2 : 0) - (curmenu->footer ? (curmenu->footlen?(curmenu->footlen+1):2) : (hasdesc ? 2 : 0)); // FIXME: footer-length if(curmenu->items.inrange(menusel)) { mitem *m = curmenu->items[menusel]; if(m->type == mitem::TYPE_KEYINPUT && ((mitemkeyinput *)m)->capture && code != SDLK_ESCAPE) { m->key(code, isdown, unicode); return true; } } switch(code) { case SDLK_PAGEUP: menusel -= pagesize; break; case SDLK_PAGEDOWN: if(menusel+pagesize>=n && menusel/pagesize!=(n-1)/pagesize) menusel = n-1; else menusel += pagesize; break; case SDLK_ESCAPE: case SDL_AC_BUTTON_RIGHT: if(!curmenu->allowinput) return false; menuset(menustack.empty() ? NULL : menustack.pop(), false); return true; break; case SDLK_UP: case SDL_AC_BUTTON_WHEELUP: if(iskeypressed(SDLK_LCTRL)) return menukey(SDLK_LEFT, isdown, 0); if(!curmenu->allowinput) return false; menusel--; break; case SDLK_DOWN: case SDL_AC_BUTTON_WHEELDOWN: if(iskeypressed(SDLK_LCTRL)) return menukey(SDLK_RIGHT, isdown, 0); if(!curmenu->allowinput) return false; menusel++; break; case SDLK_TAB: if(!curmenu->allowinput) return false; if(mod & KMOD_LSHIFT) menusel--; else menusel++; break; case SDLK_PRINT: curmenu->conprintmenu(); return true; case SDLK_F12: { extern void screenshot(const char *imagepath); if(!curmenu->allowinput) return false; screenshot(NULL); break; } case SDLK_1: case SDLK_2: case SDLK_3: case SDLK_4: case SDLK_5: case SDLK_6: case SDLK_7: case SDLK_8: case SDLK_9: if(curmenu->allowinput && curmenu->hotkeys) { int idx = code-SDLK_1; if(curmenu->items.inrange(idx)) { menuselect(curmenu, idx); mitem &m = *curmenu->items[idx]; m.select(); } return true; } default: { if(!curmenu->allowinput) return false; if(curmenu->keyfunc && (*curmenu->keyfunc)(curmenu, code, isdown, unicode)) return true; if(!curmenu->items.inrange(menusel)) return false; mitem &m = *curmenu->items[menusel]; m.key(code, isdown, unicode); return !curmenu->forwardkeys; } } if(!curmenu->hotkeys) menuselect(curmenu, menusel); return true; } else { if(!curmenu->allowinput || !curmenu->items.inrange(menusel)) return false;