]> Dogcows Code - chaz/openbox/commitdiff
Added an action class and started the even handler.
authorScott Moynes <smoynes@nexus.carleton.ca>
Fri, 19 Jul 2002 13:11:27 +0000 (13:11 +0000)
committerScott Moynes <smoynes@nexus.carleton.ca>
Fri, 19 Jul 2002 13:11:27 +0000 (13:11 +0000)
util/epist/Makefile.am
util/epist/actions.hh
util/epist/epist.cc
util/epist/epist.hh
util/epist/screen.cc
util/epist/screen.hh

index 662ac41cb4c1107b4546adb4c45b71fcbbe91cea..84cad62b6c610ef421ef3419034453f791f06111 100644 (file)
@@ -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 \
index a61319c32f8f2b1c3e86b54acbd690b557a31232..71d20ce24c70acaf49f38f3a98c397886f5fb1a2 100644 (file)
@@ -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
index 7be2ae316a8315c5269b42ceb8928ebdbce7f64d..2dcacba5105cddd0817635f7c5f6cacfe7269fc9 100644 (file)
@@ -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:
index 061e1f4d82914ea7211843b735f141fc2c1f678a..755fec8cd8a705958d40ab0c9ff50b7070abaac1 100644 (file)
@@ -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
index ad2b17721ea39183fa257d35ee63b262613e67e6..74a98e4e8eba3a7fa17f4561d7a3532acc2752c9 100644 (file)
@@ -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);
+    
+  }
+}
+                                               
index 54551aa3f32b27d89a204712f0ae316789fcb657..8b7344d4a476fadfd7edaf5eee875a31f1eb0e0c 100644 (file)
@@ -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
This page took 0.032253 seconds and 4 git commands to generate.