/* * dselect - Debian package maintenance user interface * bindings.cc - keybinding manager object definitions and default bindings * * Copyright © 1995 Ian Jackson * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include "dselect.h" #include "bindings.h" keybindings::keybindings(const interpretation *ints, const orgbinding *orgbindings) { interps= ints; bindings = nullptr; const orgbinding *b= orgbindings; while (b->action) { bind(b->key,b->action); b++; } describestart(); } bool keybindings::bind(int key, const char *action) { if (key == -1) return false; const interpretation *interp = interps; while (interp->action && strcmp(interp->action, action)) interp++; if (!interp->action) return false; const description *desc = descriptions; while (desc->action && strcmp(desc->action, action)) desc++; binding *b = bindings; while (b && b->key != key) b = b->next; if (!b) { b = new binding; b->key = key; b->next = bindings; bindings = b; } b->interp = interp; b->desc = desc->desc; return true; } const char *keybindings::find(const char *action) { binding *b = bindings; while (b && strcmp(action, b->interp->action)) b = b->next; if (!b) return _("[not bound]"); const char *n= key2name(b->key); if (n) return n; static char buf[50]; sprintf(buf,_("[unk: %d]"),b->key); return buf; } const keybindings::interpretation *keybindings::operator()(int key) { binding *b = bindings; while (b && b->key != key) b = b->next; if (!b) return nullptr; return b->interp; } const char **keybindings::describenext() { binding *search; int count; for (;;) { if (!iterate->action) return nullptr; for (count=0, search=bindings; search; search=search->next) if (strcmp(search->interp->action, iterate->action) == 0) count++; if (count) break; iterate++; } const char **retarray= new const char *[count+2]; retarray[0]= iterate->desc; for (count=1, search=bindings; search; search=search->next) if (strcmp(search->interp->action, iterate->action) == 0) retarray[count++]= key2name(search->key); retarray[count] = nullptr; iterate++; return retarray; } const char *keybindings::key2name(int key) { const keyname *search = keynames; while (search->key != -1 && search->key != key) search++; return search->kname; } int keybindings::name2key(const char *name) { const keyname *search = keynames; while (search->kname && strcasecmp(search->kname, name)) search++; return search->key; } keybindings::~keybindings() { binding *search, *next; for (search=bindings; search; search=next) { next= search->next; delete search; } } const keybindings::description keybindings::descriptions[]= { // Actions which apply to both types of list. { "iscrollon", N_("Scroll onwards through help/information") }, { "iscrollback", N_("Scroll backwards through help/information") }, { "up", N_("Move up") }, { "down", N_("Move down") }, { "top", N_("Go to top of list") }, { "bottom", N_("Go to end of list") }, { "help", N_("Request help (cycle through help screens)") }, { "info", N_("Cycle through information displays") }, { "redraw", N_("Redraw display") }, { "scrollon1", N_("Scroll onwards through list by 1 line") }, { "scrollback1", N_("Scroll backwards through list by 1 line") }, { "iscrollon1", N_("Scroll onwards through help/information by 1 line") }, { "iscrollback1", N_("Scroll backwards through help/information by 1 line") }, { "scrollon", N_("Scroll onwards through list") }, { "scrollback", N_("Scroll backwards through list") }, // Actions which apply only to lists of packages. { "install", N_("Mark package(s) for installation") }, { "remove", N_("Mark package(s) for deinstallation") }, { "purge", N_("Mark package(s) for deinstall and purge") }, { "morespecific", N_("Make highlight more specific") }, { "lessspecific", N_("Make highlight less specific") }, { "search", N_("Search for a package whose name contains a string") }, { "searchagain", N_("Repeat last search") }, { "swaporder", N_("Swap sort order priority/section") }, { "quitcheck", N_("Quit, confirming, and checking dependencies") }, { "quitnocheck", N_("Quit, confirming without check") }, { "quitrejectsug", N_("Quit, rejecting conflict/dependency suggestions") }, { "abortnocheck", N_("Abort - quit without making changes") }, { "revert", N_("Revert to old state for all packages") }, { "revertsuggest", N_("Revert to suggested state for all packages") }, { "revertdirect", N_("Revert to directly requested state for all packages") }, { "revertinstalled", N_("Revert to currently installed state for all packages") }, // Actions which apply only to lists of methods. { "select-and-quit", N_("Select currently-highlighted access method") }, { "abort", N_("Quit without changing selected access method") }, { nullptr, nullptr } };