]> Dogcows Code - chaz/openbox/commitdiff
new versions of the X classes
authorDana Jansens <danakj@orodu.net>
Fri, 17 May 2002 02:49:26 +0000 (02:49 +0000)
committerDana Jansens <danakj@orodu.net>
Fri, 17 May 2002 02:49:26 +0000 (02:49 +0000)
added an Atom in XAtom and functionality in XScreen and XDisplay

src/XAtom.cc
src/XAtom.h
src/XDisplay.cc
src/XDisplay.h
src/XScreen.cc
src/XScreen.h

index 5f5fa9edbfcfa5e204c84c0a4c5b07afd1f84b16..98f7d8d12ba530a2767a1cc16ee7a993ac32b313 100644 (file)
 XAtom::XAtom(const XDisplay *display) {
   _display = display->_display;
 
+#ifdef    HAVE_GETPID
+  openbox_pid = getAtom("_BLACKBOX_PID");
+#endif // HAVE_GETPID
+
   wm_colormap_windows = getAtom("WM_COLORMAP_WINDOWS");
   wm_protocols = getAtom("WM_PROTOCOLS");
   wm_state = getAtom("WM_STATE");
index 424603eccb5b7998a5fbe93737e1a35376a125f4..87afe2e44316354ed483d936766ec605207ac78c 100644 (file)
@@ -22,6 +22,8 @@
 #ifndef   __XAtom_h
 #define   __XAtom_h
 
+#include "../config.h"
+
 #include <X11/Xlib.h>
 #include <X11/Xatom.h>
 #include <vector>
@@ -37,6 +39,10 @@ class XAtom {
   SupportWindows        _support_windows; 
 
   Atom 
+#ifdef    HAVE_GETPID
+    openbox_pid,
+#endif // HAVE_GETPID
+
     // window hints
     wm_colormap_windows,
     wm_protocols,
@@ -140,6 +146,10 @@ public:
   
   void eraseValue(Window win, Atom atom) const;
   
+#ifdef    HAVE_GETPID
+  inline Atom openboxPid() const { return openbox_pid; }
+#endif // HAVE_GETPID
+
   inline Atom wmChangeState() const { return wm_change_state; }
   inline Atom wmState() const { return wm_state; }
   inline Atom wmDelete() const { return wm_delete_window; }
index 822f244a62899b920bba1ec670a5dd2f29f43c05..1addb2d5b4d2cf898db68b18e579977dc6968b67 100644 (file)
@@ -36,7 +36,6 @@
 #endif
 
 #include "XDisplay.h"
-#include "XScreen.h"
 #include "Util.h"
 #include <iostream>
 #include <algorithm>
@@ -51,7 +50,7 @@ Window      XDisplay::_last_bad_window = None;
  * X error handler to handle all X errors while the application is
  * running.
  */
-int XDisplay::XErrorHandler(Display *d, XErrorEvent *e) {
+int XDisplay::errorHandler(Display *d, XErrorEvent *e) {
 #ifdef DEBUG
   char errtxt[128];
   XGetErrorText(d, e->error_code, errtxt, sizeof(errtxt)/sizeof(char));
@@ -86,17 +85,16 @@ XDisplay::XDisplay(const std::string &application_name, const char *dpyname) {
   }
   _name = XDisplayName(dpyname);
 
-  XSetErrorHandler(XErrorHandler);
+  XSetErrorHandler(errorHandler);
 
 #ifdef    SHAPE
   int waste;
   _hasshape = XShapeQueryExtension(_display, &_shape_event_base, &waste);
 #endif // SHAPE
 
-  const unsigned int scount = ScreenCount(_display);
-  _screens.reserve(scount);
-  for (unsigned int s = 0; s < scount; s++)
-    _screens.push_back(new XScreen(this, s));
+#ifndef NOCLOBBER
+  getLockModifiers();
+#endif
 }
 
 
@@ -106,15 +104,6 @@ XDisplay::~XDisplay() {
 }
 
 
-/*
- * Return information about a screen.
- */
-XScreen *XDisplay::screen(unsigned int s) const {
-  ASSERT(s < _screens.size());
-  return _screens[s];
-}
-
-
 /*
  * Grab the X server
  */
@@ -153,3 +142,119 @@ bool XDisplay::nextEvent(XEvent &e) {
   }
   return true;
 }
+
+
+int XDisplay::connectionNumber() const {
+  return ConnectionNumber(_display);
+}
+
+
+/*
+ * Creates a font cursor in the X server and returns it.
+ */
+Cursor createCursor(unsigned int shape) const {
+  return XCreateFontCursor(_display, shape);
+}
+
+
+#ifndef   NOCLOBBER
+void XDisplay::getLockModifers() {
+  NumLockMask = ScrollLockMask = 0;
+
+  const XModifierKeymap* const modmap = XGetModifierMapping(display);
+  if (modmap && modmap->max_keypermod > 0) {
+    const int mask_table[] = {
+      ShiftMask, LockMask, ControlMask, Mod1Mask,
+      Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask
+    };
+    const size_t size = (sizeof(mask_table) / sizeof(mask_table[0])) *
+      modmap->max_keypermod;
+    // get the values of the keyboard lock modifiers
+    // Note: Caps lock is not retrieved the same way as Scroll and Num lock
+    // since it doesn't need to be.
+    const KeyCode num_lock_code = XKeysymToKeycode(display, XK_Num_Lock);
+    const KeyCode scroll_lock_code = XKeysymToKeycode(display, XK_Scroll_Lock);
+
+    for (size_t cnt = 0; cnt < size; ++cnt) {
+      if (! modmap->modifiermap[cnt]) continue;
+
+      if (num_lock_code == modmap->modifiermap[cnt])
+        NumLockMask = mask_table[cnt / modmap->max_keypermod];
+      if (scroll_lock_code == modmap->modifiermap[cnt])
+        ScrollLockMask = mask_table[cnt / modmap->max_keypermod];
+    }
+  }
+
+  MaskList[0] = 0;
+  MaskList[1] = LockMask;
+  MaskList[2] = NumLockMask;
+  MaskList[3] = ScrollLockMask;
+  MaskList[4] = LockMask | NumLockMask;
+  MaskList[5] = NumLockMask  | ScrollLockMask;
+  MaskList[6] = LockMask | ScrollLockMask;
+  MaskList[7] = LockMask | NumLockMask | ScrollLockMask;
+
+  if (modmap) XFreeModifiermap(const_cast<XModifierKeymap*>(modmap));
+}
+#endif // NOCLOBBER
+  
+unsigned int XDisplay::stripModifiers(const unsigned int state) const {
+#ifndef NOCLOBBER
+  return state &= ~(NumLockMask() | ScrollLockMask | LockMask);
+#else
+  return state &= ~LockMask;
+#endif
+}
+
+
+/*
+ * Verifies that a window has not requested to be destroyed/unmapped, so
+ * if it is a valid window or not.
+ * Returns: true if the window is valid; false if it is no longer valid.
+ */
+bool XDisplay::validateWindow(Window window) {
+  XEvent event;
+  if (XCheckTypedWindowEvent(_display, window, DestroyNotify, &event)) {
+    XPutBackEvent(display, &event);
+    return false;
+  }
+  return true;
+}
+
+
+/*
+ * Grabs a button, but also grabs the button in every possible combination with
+ * the keyboard lock keys, so that they do not cancel out the event.
+ */
+void BaseDisplay::grabButton(unsigned int button, unsigned int modifiers,
+                             Window grab_window, Bool owner_events,
+                             unsigned int event_mask, int pointer_mode,
+                             int keybaord_mode, Window confine_to,
+                             Cursor cursor) const
+{
+#ifndef   NOCLOBBER
+  for (size_t cnt = 0; cnt < 8; ++cnt)
+    XGrabButton(_display, button, modifiers | MaskList[cnt], grab_window,
+                owner_events, event_mask, pointer_mode, keybaord_mode,
+                confine_to, cursor);
+#else  // NOCLOBBER
+  XGrabButton(_display, button, modifiers, grab_window,
+              owner_events, event_mask, pointer_mode, keybaord_mode,
+              confine_to, cursor);
+#endif // NOCLOBBER
+}
+
+
+/*
+ * Releases the grab on a button, and ungrabs all possible combinations of the
+ * keyboard lock keys.
+ */
+void BaseDisplay::ungrabButton(unsigned int button, unsigned int modifiers,
+                               Window grab_window) const {
+#ifndef   NOCLOBBER
+  for (size_t cnt = 0; cnt < 8; ++cnt)
+    XUngrabButton(display, button, modifiers | MaskList[cnt], grab_window);
+#else  // NOCLOBBER
+  XUngrabButton(display, button, modifiers, grab_window);
+#endif // NOCLOBBER
+}
index b736fd423dd10dc95f88de702c165378979b1ad7..3c4230bdc78f8b8075d094f4126ccab577ffc4ab 100644 (file)
@@ -39,11 +39,17 @@ private:
   bool           _hasshape;
   int            _shape_event_base;
 
-  typedef std::vector<XScreen*> XScreenList;
-  XScreenList    _screens;
+#ifndef   NOCLOBBER
+  // the server's values for the lock key modifiers
+  void getLockModifiers();
+  unsigned int MaskList[8];
+  // the masks of the modifiers which are ignored in button events.
+  int NumLockMask, ScrollLockMask;
+#endif // NOCLOBBER
 
+  
   // X error handling
-  static int XErrorHandler(Display *d, XErrorEvent *e);
+  static int errorHandler(Display *d, XErrorEvent *e);
   static std::string _app_name;
   static Window _last_bad_window;
 
@@ -58,27 +64,34 @@ public:
   XDisplay(const std::string &application_name, const char *dpyname = 0);
   virtual ~XDisplay();
 
-  XScreen *screen(unsigned int s) const;
-  inline unsigned int screenCount() const { return _screens.size(); }
+  inline virtual unsigned int screenCount() const
+  { return ScreenCount(_display); }
   
   inline bool hasShape() const { return _hasshape; }
   inline int shapeEventBase() const { return _shape_event_base; }
 
   //inline Display *display() const { return _display; }
 
+  inline std::string applicationName() const { return _app_name; }
   inline std::string name() const { return _name; }
-
-  // these belong in Xwindow
-  //const bool validateWindow(Window);
-  //void grabButton(unsigned int, unsigned int, Window, Bool, unsigned int, int,
-  //    int, Window, Cursor) const;
-  //void ungrabButton(unsigned int button, unsigned int modifiers,
-  //    Window grab_window) const;
   
   void grab();
   void ungrab();
 
   bool nextEvent(XEvent &e);
+
+  int connectionNumber() const;
+
+  Cursor createCursor(unsigned int shape) const;
+
+  unsigned int stripModifiers(const unsigned int state) const;
+
+  // these belong in Xwindow
+  const bool validateWindow(Window);
+  void grabButton(unsigned int, unsigned int, Window, Bool, unsigned int, int,
+      int, Window, Cursor) const;
+  void ungrabButton(unsigned int button, unsigned int modifiers,
+      Window grab_window) const;
 };
 
 #endif // _XDisplay_h
index fc53385da0213a7888b564b45dee72e197ecbd8e..5ae8becdd490352e853deb5adbd4034401b025cc 100644 (file)
@@ -71,3 +71,16 @@ void XScreen::setColorData() {
     _colormap = DefaultColormap(_display, _number);
   }
 }
+
+
+/*
+ * Creates a window on screen.
+ */
+Window createWindow(Window parent, const Rect &area, int borderw,
+                    unsigned int winclass, unsigned long attrib_mask,
+                    XSetWindowAttributes *attrib) const {
+  return XCreateWindow(_display, parent,
+                       area.x(), area.y(), area.w(), area.h(),
+                       borderw, depth(), winclass, visual(),
+                       attrib_mask, attrib);
+}
index 6a6c692605e375080a6662d64136394e0a5a7ae5..cdfd4257bc07e87d41d136095cab2acf7fdd9f28 100644 (file)
@@ -53,6 +53,11 @@ public:
   inline unsigned int depth() const { return _depth; }
   inline unsigned int number() const { return _number; }
   inline const Size &size() const { return _size; }
+
+  Window createWindow(Window parent, const Rect &area, int borderw,
+                      unsigned int winclass,
+                      unsigned long attrib_mask,
+                      XSetWindowAttributes *attrib) const;
 };
 
 #endif // __XScreen_h
This page took 0.033513 seconds and 4 git commands to generate.