/* -*- c++ -*-
 * dselect - Debian package maintenance user interface
 * bindings.h - keybindings class header file
 *
 * Copyright © 1994,1995 Ian Jackson <ian@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 <http://www.gnu.org/licenses/>.
 */

#ifndef BINDINGS_H
#define BINDINGS_H

struct keybindings {
  struct interpretation;

  struct orgbinding {
    int key;
    const char *action;
  };

  struct keyname {
    int key;
    const char *kname;
  };

  struct description {
    const char *action, *desc;
  };

  struct binding {
    binding *next;
    int key;
    const struct interpretation *interp;
    const char *desc;
  };

 private:
  static const keyname keynames[];
  static const description descriptions[];

  binding *bindings;
  const description *iterate;
  const interpretation *interps;

  bool bind(int key, const char *action);

 public:
  int name2key(const char *name);
  const char *key2name(int key);

  bool bind(const char *name, const char *action)
  { return bind(name2key(name), action); }
  const interpretation *operator()(int key);
  const char *find(const char *action);

  void describestart() { iterate=descriptions; }
  const char **describenext();
  //... returns array, null-term, first element is description, rest are key strings
  // caller must delete[] the array.  Null means end.

  keybindings(const interpretation *ints, const orgbinding *orgbindings);
  ~keybindings();
};

#include "pkglist.h"
#include "method.h"

struct keybindings::interpretation {
  const char *action;
  void (methodlist::*mfn)();
  void (packagelist::*pfn)();
  quitaction qa;
};

extern const keybindings::interpretation packagelist_kinterps[];
extern const keybindings::orgbinding packagelist_korgbindings[];

extern const keybindings::interpretation methodlist_kinterps[];
extern const keybindings::orgbinding methodlist_korgbindings[];

#endif /* BINDINGS_H */
