summaryrefslogtreecommitdiffstats
path: root/curses/curseskeyhandler.C
diff options
context:
space:
mode:
Diffstat (limited to 'curses/curseskeyhandler.C')
-rw-r--r--curses/curseskeyhandler.C75
1 files changed, 75 insertions, 0 deletions
diff --git a/curses/curseskeyhandler.C b/curses/curseskeyhandler.C
new file mode 100644
index 0000000..3ca30bd
--- /dev/null
+++ b/curses/curseskeyhandler.C
@@ -0,0 +1,75 @@
+/*
+** Copyright 2002, Double Precision Inc.
+**
+** See COPYING for distribution information.
+*/
+
+#include "curses_config.h"
+#include "curseskeyhandler.H"
+
+#include <functional>
+#include <algorithm>
+
+using namespace std;
+
+list<CursesKeyHandler *> CursesKeyHandler::handlers;
+bool CursesKeyHandler::handlerListModified=true;
+
+CursesKeyHandler::CursesKeyHandler(int priorityArg)
+ : priority(priorityArg)
+{
+ list<CursesKeyHandler *>::iterator b=handlers.begin(),
+ e=handlers.end();
+
+ while (b != e)
+ {
+ if ( (*b)->priority > priorityArg)
+ break;
+ b++;
+ }
+
+ handlers.insert(b, 1, this);
+
+ handlerListModified=true;
+}
+
+CursesKeyHandler::~CursesKeyHandler()
+{
+ list<CursesKeyHandler *>::iterator me=
+ find_if(handlers.begin(), handlers.end(),
+ bind2nd(equal_to<CursesKeyHandler *>(), this));
+
+ handlers.erase(me);
+ handlerListModified=true;
+}
+
+bool CursesKeyHandler::listKeys( vector< pair<string, string> > &list)
+{
+ return false;
+}
+
+bool CursesKeyHandler::handle(const Curses::Key &key, Curses *focus)
+{
+ list<CursesKeyHandler *>::iterator b=handlers.begin(),
+ e=handlers.end();
+
+ while (b != e)
+ {
+ CursesKeyHandler *p= *b++;
+
+ if (p->priority >= 0 && focus)
+ {
+ if (focus->processKeyInFocus(key))
+ return true;
+ focus=NULL;
+ }
+
+ if ( p->processKey(key))
+ return true;
+ }
+
+ if (focus)
+ if (focus->processKeyInFocus(key))
+ return true;
+ return false;
+}