summaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
authorScott Moynes <smoynes@nexus.carleton.ca>2002-07-19 13:11:27 +0000
committerScott Moynes <smoynes@nexus.carleton.ca>2002-07-19 13:11:27 +0000
commitf586e55a8cd3d740a1b7b3a0801bad27030926f9 (patch)
treed9a6889fbb1f4088af2b56b3ddc0934acd7f2a26 /util
parent0326ac961fb82d8d7aab22e4da1859adeeceb2f7 (diff)
Added an action class and started the even handler.
Diffstat (limited to 'util')
-rw-r--r--util/epist/Makefile.am2
-rw-r--r--util/epist/actions.hh99
-rw-r--r--util/epist/epist.cc27
-rw-r--r--util/epist/epist.hh7
-rw-r--r--util/epist/screen.cc52
-rw-r--r--util/epist/screen.hh4
6 files changed, 151 insertions, 40 deletions
diff --git a/util/epist/Makefile.am b/util/epist/Makefile.am
index 662ac41c..84cad62b 100644
--- a/util/epist/Makefile.am
+++ b/util/epist/Makefile.am
@@ -4,7 +4,7 @@ CPPFLAGS= @CPPFLAGS@ @DEBUG@
EXTRA_PROGRAMS = epist
-epist_SOURCES = epist.cc window.cc screen.cc main.cc
+epist_SOURCES = epist.cc window.cc screen.cc main.cc actions.cc
epist_LDADD = ../../src/XAtom.o ../../src/BaseDisplay.o \
../../src/Util.o ../../src/i18n.o \
../../src/GCCache.o ../../src/Color.o ../../src/Texture.o \
diff --git a/util/epist/actions.hh b/util/epist/actions.hh
index a61319c3..71d20ce2 100644
--- a/util/epist/actions.hh
+++ b/util/epist/actions.hh
@@ -1,41 +1,62 @@
-// xOr: this is crap.
-enum ActionType {
- noaction = 0,
- execute,
- iconify,
- raiseWindow,
- lowerWindow,
- closeWindow,
- shade,
- moveWindowUp,
- moveWindowDown,
- moveWindowLeft,
- moveWindowRight,
- nextWindow,
- prevWindow,
-
- nextWindow,
- prevWindow,
- nextWindowOnAllDesktops,
- prevWindowOnAllDesktops,
-
- nextWindowOfClass,
- prevWindowOfClass,
-
- changeDesktop,
- nextDesktop,
- prevDesktop,
-
- // these are openbox extensions
- showRootMenu,
- showWorkspaceMenu,
-
- stringChain,
- keyChain,
- numberChain,
-
- cancel,
-
- NUM_ACTIONS
+#ifndef __actions_hh
+#define __actions_hh
+#include <list>
+
+extern "C" {
+#include <X11/X.h>
+}
+class Action {
+public:
+ // xOr: this is crap.
+ enum ActionType {
+ noaction = 0,
+ execute,
+ iconify,
+ raiseWindow,
+ lowerWindow,
+ closeWindow,
+ shade,
+ moveWindowUp,
+ moveWindowDown,
+ moveWindowLeft,
+ moveWindowRight,
+
+ nextWindow,
+ prevWindow,
+ nextWindowOnAllDesktops,
+ prevWindowOnAllDesktops,
+
+ nextWindowOfClass,
+ prevWindowOfClass,
+
+ changeDesktop,
+ nextDesktop,
+ prevDesktop,
+
+ // these are openbox extensions
+ showRootMenu,
+ showWorkspaceMenu,
+
+ stringChain,
+ keyChain,
+ numberChain,
+
+ cancel,
+ };
+
+private:
+ enum Action::ActionType _type;
+ const KeyCode _keycode;
+ const int _modifierMask;
+
+public:
+ inline enum ActionType type() const { return _type;}
+ inline const KeyCode keycode() const { return _keycode; }
+ inline const int modifierMask() const { return _modifierMask; }
+
+ Action::Action(enum ActionType type, KeyCode keycode, int modifierMask);
};
+
+typedef list<Action> ActionList;
+#endif
diff --git a/util/epist/epist.cc b/util/epist/epist.cc
index 7be2ae31..2dcacba5 100644
--- a/util/epist/epist.cc
+++ b/util/epist/epist.cc
@@ -75,6 +75,16 @@ epist::epist(char **argv, char *dpy_name, char *rc_file)
cout << "No compatible window manager found on any screens. Aborting.\n";
::exit(1);
}
+
+ _actions.push_back(Action(Action::nextDesktop,
+ XKeysymToKeycode(getXDisplay(),
+ XStringToKeysym("Tab")),
+ Mod1Mask));
+ _actions.push_back(Action(Action::prevDesktop,
+ XKeysymToKeycode(getXDisplay(),
+ XStringToKeysym("Tab")),
+ ControlMask));
+ activateGrabs();
}
@@ -82,7 +92,24 @@ epist::~epist() {
delete _xatom;
}
+// XGrabKey(_epist->getXDisplay(), XKeysymToKeycode(_epist->getXDisplay(),
+// XStringToKeysym("F5")),
+// Mod1Mask, _root, True, GrabModeAsync, GrabModeAsync);
+
+void epist::activateGrabs() {
+
+ ScreenList::const_iterator scrit, scrend = _screens.end();
+
+ for (scrit = _screens.begin(); scrit != scrend; ++scrit) {
+ ActionList::const_iterator end = _actions.end();
+ for(ActionList::const_iterator ait = _actions.begin();
+ ait != end; ++ait) {
+ XGrabKey(getXDisplay(), ait->keycode(), ait->modifierMask(),
+ (*scrit)->rootWindow(), True, GrabModeAsync, GrabModeAsync);
+ }
+ }
+}
bool epist::handleSignal(int sig) {
switch (sig) {
case SIGHUP:
diff --git a/util/epist/epist.hh b/util/epist/epist.hh
index 061e1f4d..755fec8c 100644
--- a/util/epist/epist.hh
+++ b/util/epist/epist.hh
@@ -30,6 +30,8 @@ extern "C" {
#include <string>
#include <map>
+#include <actions.hh>
+
#include "../../src/BaseDisplay.hh"
class XAtom;
@@ -49,9 +51,12 @@ private:
typedef WindowLookup::value_type WindowLookupPair;
WindowLookup _windows;
+ ActionList _actions;
+
virtual void process_event(XEvent *e);
virtual bool handleSignal(int sig);
+ void activateGrabs();
public:
epist(char **argv, char *display_name, char *rc_file);
virtual ~epist();
@@ -61,6 +66,8 @@ public:
void addWindow(XWindow *window);
void removeWindow(XWindow *window);
XWindow *findWindow(Window window) const;
+
+ list<Action> actions(void) { return _actions; }
};
#endif // __epist_hh
diff --git a/util/epist/screen.cc b/util/epist/screen.cc
index ad2b1772..74a98e4e 100644
--- a/util/epist/screen.cc
+++ b/util/epist/screen.cc
@@ -137,10 +137,30 @@ void screen::processEvent(const XEvent &e) {
}
break;
case KeyPress:
+ handleKeypress(e);
break;
}
}
+void screen::handleKeypress(const XEvent &e) {
+ list<Action>::const_iterator it = _epist->actions().begin();
+ list<Action>::const_iterator end = _epist->actions().end();
+ for (; it != end; ++it) {
+ if (e.xkey.keycode == it->keycode() &&
+ e.xkey.state == it->modifierMask() )
+ {
+ switch (it->type()) {
+ case Action::nextDesktop:
+ cycleWorkspace(true);
+ break;
+ case Action::prevDesktop:
+ cycleWorkspace(false);
+ break;
+ }
+ break;
+ }
+ }
+}
// do we want to add this window to our list?
bool screen::doAddWindow(Window window) const {
@@ -238,3 +258,35 @@ void screen::updateActiveWindow() {
perror("putenv()");
}
*/
+
+void screen::cycleWorkspace(const bool forward) {
+ cout << "blef" << endl;
+
+ unsigned long currentDesktop = 0;
+ unsigned long numDesktops = 0;
+
+ if (_xatom->getValue(_root, XAtom::net_current_desktop, XAtom::cardinal,
+ currentDesktop)) {
+ if (forward)
+ ++currentDesktop;
+ else
+ --currentDesktop;
+
+ cout << currentDesktop << endl;
+
+
+ _xatom->getValue(_root, XAtom::net_number_of_desktops, XAtom::cardinal,
+ numDesktops);
+
+ if ( ( (signed)currentDesktop) == -1)
+ currentDesktop = numDesktops - 1;
+ else if (currentDesktop >= numDesktops)
+ currentDesktop = 0;
+
+
+ _xatom->sendClientMessage(_root, XAtom::net_current_desktop, _root,
+ currentDesktop);
+
+ }
+}
+
diff --git a/util/epist/screen.hh b/util/epist/screen.hh
index 54551aa3..8b7344d4 100644
--- a/util/epist/screen.hh
+++ b/util/epist/screen.hh
@@ -62,6 +62,10 @@ public:
inline bool managed() const { return _managed; }
void processEvent(const XEvent &e);
+
+ void handleKeypress(const XEvent &e);
+
+ void cycleWorkspace(const bool forward);
};
#endif // __screen_hh