all repos — openbox @ 9b6e5f9cf49df78be25720f9c4b33a733b856c9b

openbox fork - make it a bit more like ryudo

otk/surface.cc (raw)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-

#ifdef    HAVE_CONFIG_H
#  include "../config.h"
#endif // HAVE_CONFIG_H

#include "surface.hh"
#include "display.hh"
#include "screeninfo.hh"

extern "C" {
#include <X11/Xutil.h>
}

namespace otk {

Surface::Surface(int screen)
  : _screen(screen),
    _size(1, 1),
    _im(0),
    _pm(None),
    _xftdraw(0)
{
  createObjects();
}

Surface::Surface(int screen, const Point &size)
  : _screen(screen),
    _size(size),
    _im(0),
    _pm(None),
    _xftdraw(0)
{
  createObjects();
}

Surface::~Surface()
{
  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();
}

}