diff options
Diffstat (limited to 'otk/surface.cc')
| -rw-r--r-- | otk/surface.cc | 63 |
1 files changed, 56 insertions, 7 deletions
diff --git a/otk/surface.cc b/otk/surface.cc index cea793f2..c02526f3 100644 --- a/otk/surface.cc +++ b/otk/surface.cc @@ -6,29 +6,78 @@ #include "surface.hh" #include "display.hh" +#include "screeninfo.hh" + +extern "C" { +#include <X11/Xutil.h> +} namespace otk { -Surface::Surface() - : _size(1, 1), - _pm(None) +Surface::Surface(int screen) + : _screen(screen), + _size(1, 1), + _im(0), + _pm(None), + _xftdraw(0) { + createObjects(); } -Surface::Surface(const Point &size) - : _size(size), - _pm(None) +Surface::Surface(int screen, const Point &size) + : _screen(screen), + _size(size), + _im(0), + _pm(None), + _xftdraw(0) { + createObjects(); } Surface::~Surface() { - if (_pm != None) XFreePixmap(**display, _pm); + destroyObjects(); +} + +void Surface::createObjects() +{ + assert(!_im); assert(_pm == None); assert(!_xftdraw); + + const ScreenInfo *info = display->screenInfo(_screen); + + _im = XCreateImage(**display, info->visual(), info->depth(), + ZPixmap, 0, NULL, _size.x(), _size.y(), 32, 0); + + _pm = XCreatePixmap(**display, info->rootWindow(), _size.x(), _size.y(), + info->depth()); + + _xftdraw = XftDrawCreate(**display, _pm, info->visual(), info->colormap()); +} + +void Surface::destroyObjects() +{ + assert(_im); assert(_pm != None); assert(_xftdraw); + + // do the delete ourselves cuz we alloc it with new not malloc + delete [] _im->data; + _im->data = NULL; + XDestroyImage(_im); + _im = 0; + + XFreePixmap(**display, _pm); + _pm = None; + + XftDrawDestroy(_xftdraw); + _xftdraw = 0; } void Surface::setSize(int w, int h) { + if (w == _size.x() && h == _size.y()) return; // no change + _size.setPoint(w, h); + destroyObjects(); + createObjects(); } } |
