Пример #1
0
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);
	}
}
Пример #2
0
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;