summaryrefslogtreecommitdiffstats
path: root/dselect/bindings.cc
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--dselect/bindings.cc179
1 files changed, 179 insertions, 0 deletions
diff --git a/dselect/bindings.cc b/dselect/bindings.cc
new file mode 100644
index 0000000..fe65c45
--- /dev/null
+++ b/dselect/bindings.cc
@@ -0,0 +1,179 @@
+/*
+ * dselect - Debian package maintenance user interface
+ * bindings.cc - keybinding manager object definitions and default bindings
+ *
+ * Copyright © 1995 Ian Jackson <ijackson@chiark.greenend.org.uk>
+ *
+ * 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 <https://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include <compat.h>
+
+#include <string.h>
+#include <stdio.h>
+
+#include <dpkg/i18n.h>
+#include <dpkg/dpkg.h>
+#include <dpkg/dpkg-db.h>
+
+#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 }
+};