From: Scott Moynes Date: Fri, 19 Jul 2002 13:11:27 +0000 (+0000) Subject: Added an action class and started the even handler. X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=f586e55a8cd3d740a1b7b3a0801bad27030926f9;p=chaz%2Fopenbox Added an action class and started the even handler. --- 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 + +extern "C" { +#include +} +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 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 #include +#include + #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 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::const_iterator it = _epist->actions().begin(); + list::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