new versions of the X classes
added an Atom in XAtom and functionality in XScreen and XDisplay
This commit is contained in:
parent
de712f8567
commit
20d7381ffb
6 changed files with 178 additions and 28 deletions
|
@ -27,6 +27,10 @@
|
||||||
XAtom::XAtom(const XDisplay *display) {
|
XAtom::XAtom(const XDisplay *display) {
|
||||||
_display = display->_display;
|
_display = display->_display;
|
||||||
|
|
||||||
|
#ifdef HAVE_GETPID
|
||||||
|
openbox_pid = getAtom("_BLACKBOX_PID");
|
||||||
|
#endif // HAVE_GETPID
|
||||||
|
|
||||||
wm_colormap_windows = getAtom("WM_COLORMAP_WINDOWS");
|
wm_colormap_windows = getAtom("WM_COLORMAP_WINDOWS");
|
||||||
wm_protocols = getAtom("WM_PROTOCOLS");
|
wm_protocols = getAtom("WM_PROTOCOLS");
|
||||||
wm_state = getAtom("WM_STATE");
|
wm_state = getAtom("WM_STATE");
|
||||||
|
|
10
src/XAtom.h
10
src/XAtom.h
|
@ -22,6 +22,8 @@
|
||||||
#ifndef __XAtom_h
|
#ifndef __XAtom_h
|
||||||
#define __XAtom_h
|
#define __XAtom_h
|
||||||
|
|
||||||
|
#include "../config.h"
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
#include <X11/Xatom.h>
|
#include <X11/Xatom.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
@ -37,6 +39,10 @@ class XAtom {
|
||||||
SupportWindows _support_windows;
|
SupportWindows _support_windows;
|
||||||
|
|
||||||
Atom
|
Atom
|
||||||
|
#ifdef HAVE_GETPID
|
||||||
|
openbox_pid,
|
||||||
|
#endif // HAVE_GETPID
|
||||||
|
|
||||||
// window hints
|
// window hints
|
||||||
wm_colormap_windows,
|
wm_colormap_windows,
|
||||||
wm_protocols,
|
wm_protocols,
|
||||||
|
@ -140,6 +146,10 @@ public:
|
||||||
|
|
||||||
void eraseValue(Window win, Atom atom) const;
|
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 wmChangeState() const { return wm_change_state; }
|
||||||
inline Atom wmState() const { return wm_state; }
|
inline Atom wmState() const { return wm_state; }
|
||||||
inline Atom wmDelete() const { return wm_delete_window; }
|
inline Atom wmDelete() const { return wm_delete_window; }
|
||||||
|
|
137
src/XDisplay.cc
137
src/XDisplay.cc
|
@ -36,7 +36,6 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "XDisplay.h"
|
#include "XDisplay.h"
|
||||||
#include "XScreen.h"
|
|
||||||
#include "Util.h"
|
#include "Util.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
@ -51,7 +50,7 @@ Window XDisplay::_last_bad_window = None;
|
||||||
* X error handler to handle all X errors while the application is
|
* X error handler to handle all X errors while the application is
|
||||||
* running.
|
* running.
|
||||||
*/
|
*/
|
||||||
int XDisplay::XErrorHandler(Display *d, XErrorEvent *e) {
|
int XDisplay::errorHandler(Display *d, XErrorEvent *e) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
char errtxt[128];
|
char errtxt[128];
|
||||||
XGetErrorText(d, e->error_code, errtxt, sizeof(errtxt)/sizeof(char));
|
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);
|
_name = XDisplayName(dpyname);
|
||||||
|
|
||||||
XSetErrorHandler(XErrorHandler);
|
XSetErrorHandler(errorHandler);
|
||||||
|
|
||||||
#ifdef SHAPE
|
#ifdef SHAPE
|
||||||
int waste;
|
int waste;
|
||||||
_hasshape = XShapeQueryExtension(_display, &_shape_event_base, &waste);
|
_hasshape = XShapeQueryExtension(_display, &_shape_event_base, &waste);
|
||||||
#endif // SHAPE
|
#endif // SHAPE
|
||||||
|
|
||||||
const unsigned int scount = ScreenCount(_display);
|
#ifndef NOCLOBBER
|
||||||
_screens.reserve(scount);
|
getLockModifiers();
|
||||||
for (unsigned int s = 0; s < scount; s++)
|
#endif
|
||||||
_screens.push_back(new XScreen(this, s));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
* Grab the X server
|
||||||
*/
|
*/
|
||||||
|
@ -153,3 +142,119 @@ bool XDisplay::nextEvent(XEvent &e) {
|
||||||
}
|
}
|
||||||
return true;
|
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
|
||||||
|
}
|
||||||
|
|
|
@ -39,11 +39,17 @@ private:
|
||||||
bool _hasshape;
|
bool _hasshape;
|
||||||
int _shape_event_base;
|
int _shape_event_base;
|
||||||
|
|
||||||
typedef std::vector<XScreen*> XScreenList;
|
#ifndef NOCLOBBER
|
||||||
XScreenList _screens;
|
// 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
|
// X error handling
|
||||||
static int XErrorHandler(Display *d, XErrorEvent *e);
|
static int errorHandler(Display *d, XErrorEvent *e);
|
||||||
static std::string _app_name;
|
static std::string _app_name;
|
||||||
static Window _last_bad_window;
|
static Window _last_bad_window;
|
||||||
|
|
||||||
|
@ -58,27 +64,34 @@ public:
|
||||||
XDisplay(const std::string &application_name, const char *dpyname = 0);
|
XDisplay(const std::string &application_name, const char *dpyname = 0);
|
||||||
virtual ~XDisplay();
|
virtual ~XDisplay();
|
||||||
|
|
||||||
XScreen *screen(unsigned int s) const;
|
inline virtual unsigned int screenCount() const
|
||||||
inline unsigned int screenCount() const { return _screens.size(); }
|
{ return ScreenCount(_display); }
|
||||||
|
|
||||||
inline bool hasShape() const { return _hasshape; }
|
inline bool hasShape() const { return _hasshape; }
|
||||||
inline int shapeEventBase() const { return _shape_event_base; }
|
inline int shapeEventBase() const { return _shape_event_base; }
|
||||||
|
|
||||||
//inline Display *display() const { return _display; }
|
//inline Display *display() const { return _display; }
|
||||||
|
|
||||||
|
inline std::string applicationName() const { return _app_name; }
|
||||||
inline std::string name() const { return _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 grab();
|
||||||
void ungrab();
|
void ungrab();
|
||||||
|
|
||||||
bool nextEvent(XEvent &e);
|
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
|
#endif // _XDisplay_h
|
||||||
|
|
|
@ -71,3 +71,16 @@ void XScreen::setColorData() {
|
||||||
_colormap = DefaultColormap(_display, _number);
|
_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);
|
||||||
|
}
|
||||||
|
|
|
@ -53,6 +53,11 @@ public:
|
||||||
inline unsigned int depth() const { return _depth; }
|
inline unsigned int depth() const { return _depth; }
|
||||||
inline unsigned int number() const { return _number; }
|
inline unsigned int number() const { return _number; }
|
||||||
inline const Size &size() const { return _size; }
|
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
|
#endif // __XScreen_h
|
||||||
|
|
Loading…
Reference in a new issue