aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Shape.cc48
-rw-r--r--src/Shape.hh10
2 files changed, 31 insertions, 27 deletions
diff --git a/src/Shape.cc b/src/Shape.cc
index 76cac96..de03ab2 100644
--- a/src/Shape.cc
+++ b/src/Shape.cc
@@ -19,12 +19,14 @@
19// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 19// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20// DEALINGS IN THE SOFTWARE. 20// DEALINGS IN THE SOFTWARE.
21 21
22// $Id: Shape.cc,v 1.8 2004/01/09 02:17:46 fluxgen Exp $ 22// $Id: Shape.cc,v 1.9 2004/01/11 15:02:11 fluxgen Exp $
23 23
24#include "Shape.hh" 24#include "Shape.hh"
25
25#include "FbTk/FbWindow.hh" 26#include "FbTk/FbWindow.hh"
26#include "FbTk/App.hh" 27#include "FbTk/App.hh"
27#include "FbTk/GContext.hh" 28#include "FbTk/GContext.hh"
29#include "FbTk/FbPixmap.hh"
28 30
29#include <cstring> 31#include <cstring>
30 32
@@ -39,7 +41,7 @@ using namespace std;
39 41
40namespace { 42namespace {
41 43
42Pixmap createShape(FbTk::FbWindow &win, int place) { 44FbTk::FbPixmap *createShape(FbTk::FbWindow &win, int place) {
43 if (win.window() == 0 || place == 0 || 45 if (win.window() == 0 || place == 0 ||
44 win.width() < 3 || win.height() < 3) 46 win.width() < 3 || win.height() < 3)
45 return 0; 47 return 0;
@@ -111,39 +113,34 @@ Pixmap createShape(FbTk::FbWindow &win, int place) {
111 } 113 }
112 } 114 }
113 115
114 Pixmap pm = XCreatePixmap(disp, win.window(), win_width, win_height, 1); 116 FbTk::FbPixmap *pm = new FbTk::FbPixmap(win, win_width, win_height, 1);
117
115 118
116 FbTk::GContext gc(pm); 119 FbTk::GContext gc(*pm);
117 120
118 XPutImage(disp, pm, gc.gc(), ximage, 0, 0, 0, 0, 121 XPutImage(disp, pm->drawable(), gc.gc(), ximage, 0, 0, 0, 0,
119 win_width, win_height); 122 win_width, win_height);
120 123
121 XDestroyImage(ximage); 124 XDestroyImage(ximage);
122 125
123 return pm; 126 return pm;
124 127
125
126} 128}
127 129
128}; // end anonymous namespace 130} // end anonymous namespace
129 131
130Shape::Shape(FbTk::FbWindow &win, int shapeplaces): 132Shape::Shape(FbTk::FbWindow &win, int shapeplaces):
131 m_win(&win), 133 m_win(&win),
132 m_shapeplaces(shapeplaces) { 134 m_shapeplaces(shapeplaces) {
133 135
134 m_shape = createShape(win, shapeplaces); 136 m_shape.reset(createShape(win, shapeplaces));
135 m_width = win.width();
136 m_height = win.height();
137
138} 137}
139 138
140Shape::~Shape() { 139Shape::~Shape() {
141 if (m_shape != 0)
142 XFreePixmap(FbTk::App::instance()->display(), m_shape);
143 140
144#ifdef SHAPE 141#ifdef SHAPE
145 if (m_win != 0 && m_win->window()) { 142 if (m_win != 0 && m_win->window()) {
146 // reset shape of window 143 // Reset shape of window
147 XShapeCombineMask(FbTk::App::instance()->display(), 144 XShapeCombineMask(FbTk::App::instance()->display(),
148 m_win->window(), 145 m_win->window(),
149 ShapeBounding, 146 ShapeBounding,
@@ -162,14 +159,10 @@ void Shape::update() {
162 if (m_win == 0 || m_win->window() == 0) 159 if (m_win == 0 || m_win->window() == 0)
163 return; 160 return;
164#ifdef SHAPE 161#ifdef SHAPE
165 if (m_win->width() != m_width || 162 if (m_shape.get() == 0 ||
166 m_win->height() != m_height) { 163 m_win->width() != width() ||
167 if (m_shape != 0) 164 m_win->height() != height()) {
168 XFreePixmap(FbTk::App::instance()->display(), m_shape); 165 m_shape.reset(createShape(*m_win, m_shapeplaces));
169 m_shape = createShape(*m_win, m_shapeplaces);
170 m_width = m_win->width();
171 m_height = m_win->height();
172
173 } 166 }
174 167
175 // the m_shape can be = 0 which will just reset the shape mask 168 // the m_shape can be = 0 which will just reset the shape mask
@@ -178,9 +171,10 @@ void Shape::update() {
178 m_win->window(), 171 m_win->window(),
179 ShapeBounding, 172 ShapeBounding,
180 -m_win->borderWidth(), -m_win->borderWidth(), 173 -m_win->borderWidth(), -m_win->borderWidth(),
181 m_shape, 174 m_shape.get() ? m_shape->drawable() : 0,
182 ShapeSet); 175 ShapeSet);
183 176
177
184#endif // SHAPE 178#endif // SHAPE
185 179
186} 180}
@@ -215,3 +209,11 @@ bool Shape::isShaped(const FbTk::FbWindow &win) {
215 209
216 return (shaped != 0 ? true : false); 210 return (shaped != 0 ? true : false);
217} 211}
212
213unsigned int Shape::width() const {
214 return m_shape.get() ? m_shape->width() : 0;
215}
216
217unsigned int Shape::height() const {
218 return m_shape.get() ? m_shape->height() : 0;
219}
diff --git a/src/Shape.hh b/src/Shape.hh
index 0bc037f..53faaaa 100644
--- a/src/Shape.hh
+++ b/src/Shape.hh
@@ -19,15 +19,17 @@
19// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 19// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20// DEALINGS IN THE SOFTWARE. 20// DEALINGS IN THE SOFTWARE.
21 21
22// $Id: Shape.hh,v 1.3 2003/12/16 23:32:02 fluxgen Exp $ 22// $Id: Shape.hh,v 1.4 2004/01/11 15:02:11 fluxgen Exp $
23 23
24#ifndef SHAPE_HH 24#ifndef SHAPE_HH
25#define SHAPE_HH 25#define SHAPE_HH
26 26
27#include <X11/Xlib.h> 27#include <X11/Xlib.h>
28#include <memory>
28 29
29namespace FbTk { 30namespace FbTk {
30class FbWindow; 31class FbWindow;
32class FbPixmap;
31} 33}
32 34
33/// creates round corners on windows 35/// creates round corners on windows
@@ -49,16 +51,16 @@ public:
49 void update(); 51 void update();
50 /// assign a new window 52 /// assign a new window
51 void setWindow(FbTk::FbWindow &win); 53 void setWindow(FbTk::FbWindow &win);
54 unsigned int width() const;
55 unsigned int height() const;
52 // sets shape notify mask 56 // sets shape notify mask
53 static void setShapeNotify(const FbTk::FbWindow &win); 57 static void setShapeNotify(const FbTk::FbWindow &win);
54 /// @return true if window has shape 58 /// @return true if window has shape
55 static bool isShaped(const FbTk::FbWindow &win); 59 static bool isShaped(const FbTk::FbWindow &win);
56private: 60private:
57 FbTk::FbWindow *m_win; ///< window to be shaped 61 FbTk::FbWindow *m_win; ///< window to be shaped
58 Pixmap m_shape; ///< our shape pixmap 62 std::auto_ptr<FbTk::FbPixmap> m_shape; ///< our shape pixmap
59 int m_shapeplaces; ///< places to shape 63 int m_shapeplaces; ///< places to shape
60 unsigned int m_width; ///< width of window (the "old" size), if width != window width then shape resizes
61 unsigned int m_height; ///< height of window (the "old" size), if height != window height then shape resizes
62}; 64};
63 65
64#endif // SHAPE_HH 66#endif // SHAPE_HH