diff options
| author | Dana Jansens <danakj@orodu.net> | 2002-05-16 15:50:41 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2002-05-16 15:50:41 +0000 |
| commit | cc7cb82debabb98b6cca375f53fe29da7ae4fad4 (patch) | |
| tree | bb62727679ce2bd96d019bf4307d25f3c3fc7f07 /src/XDisplay.cc | |
| parent | bd196c710829f27458e620b8933cb67a33044cc0 (diff) | |
adding new X base classes which encapsulate all X server interation
Diffstat (limited to 'src/XDisplay.cc')
| -rw-r--r-- | src/XDisplay.cc | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/XDisplay.cc b/src/XDisplay.cc new file mode 100644 index 00000000..48f19d76 --- /dev/null +++ b/src/XDisplay.cc @@ -0,0 +1,89 @@ +// XDisplay.cc for Openbox +// Copyright (c) 2002 - 2002 Ben Janens (ben at orodu.net) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +#include "Xdisplay.h" +#include "XScreen.h" +#include "Util.h" +#include <iostream> +#include <algorithm> + +using std::cerr; + +Xdisplay::Xdisplay(const char *dpyname) { + _grabs = 0; + _hasshape = false; + + _display = XOpenDisplay(dpy_name); + if (_display == NULL) { + cerr << "Could not open display. Connection to X server failed.\n"; + ::exit(2); + } + if (-1 == fcntl(ConnectionNumber(display), F_SETFD, 1)) { + cerr << "Could not mark display connection as close-on-exec.\n"; + ::exit(2); + } + _name = XDisplayName(dpyname); + + XSetErrorHandler(XErrorHandler); + +#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(_display, s)); +} + + +Xdisplay::~Xdisplay() { + std::for_each(_screens.begin(), _screens.end(), PointerAssassin()); + XCloseDisplay(_display); +} + + +/* + * Return information about a screen. + */ +XScreen *Xdisplay::screen(unsigned int s) const { + ASSERT(s < _screens.size()); + return _screens[s]; +} + + +/* + * Grab the X server + */ +void XDisplay::grab() { + if (_grabs++ == 0) + XGrabServer(_display); +} + + +/* + * Release the X server from a grab + */ +void XDisplay::ungrab() { + if (--_grabs == 0) + XUngrabServer(_display); +} |
