aboutsummaryrefslogtreecommitdiff
path: root/src/FbTk/Shape.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/FbTk/Shape.cc')
-rw-r--r--src/FbTk/Shape.cc53
1 files changed, 33 insertions, 20 deletions
diff --git a/src/FbTk/Shape.cc b/src/FbTk/Shape.cc
index c952403..91ecffc 100644
--- a/src/FbTk/Shape.cc
+++ b/src/FbTk/Shape.cc
@@ -109,6 +109,36 @@ struct CornerPixmaps {
109// unfortunately, we need a separate pixmap per screen 109// unfortunately, we need a separate pixmap per screen
110std::vector<CornerPixmaps> s_corners; 110std::vector<CornerPixmaps> s_corners;
111 111
112unsigned long nr_shapes = 0;
113
114void initCorners(FbWindow& win) {
115
116 if (s_corners.empty())
117 s_corners.resize(ScreenCount(App::instance()->display()));
118
119 static const unsigned char left_bits[] = { 0xc0, 0xf8, 0xfc, 0xfe, 0xfe, 0xfe, 0xff, 0xff };
120 static const unsigned char right_bits[] = { 0x03, 0x1f, 0x3f, 0x7f, 0x7f, 0x7f, 0xff, 0xff};
121 static const unsigned char bottom_left_bits[] = { 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xf8, 0xc0 };
122 static const unsigned char bottom_right_bits[] = { 0xff, 0xff, 0x7f, 0x7f, 0x7f, 0x3f, 0x1f, 0x03 };
123
124 const int screen_num = win.screenNumber();
125 s_corners[screen_num].topleft = makePixmap(win, left_bits);
126 s_corners[screen_num].topright = makePixmap(win, right_bits);
127 s_corners[screen_num].botleft = makePixmap(win, bottom_left_bits);
128 s_corners[screen_num].botright = makePixmap(win, bottom_right_bits);
129
130 nr_shapes++; // refcounting
131}
132
133void cleanCorners() {
134
135 if (nr_shapes == 0) {
136 s_corners.clear();
137 } else {
138 nr_shapes--; // refcounting
139 }
140}
141
112} // end of anonymous namespace 142} // end of anonymous namespace
113 143
114Shape::Shape(FbWindow &win, int shapeplaces): 144Shape::Shape(FbWindow &win, int shapeplaces):
@@ -119,7 +149,7 @@ Shape::Shape(FbWindow &win, int shapeplaces):
119 m_shapeplaces(shapeplaces) { 149 m_shapeplaces(shapeplaces) {
120 150
121#ifdef SHAPE 151#ifdef SHAPE
122 initCorners(win.screenNumber()); 152 initCorners(win);
123#endif 153#endif
124 154
125 update(); 155 update();
@@ -143,26 +173,9 @@ Shape::~Shape() {
143 0, 173 0,
144 ShapeSet); 174 ShapeSet);
145 } 175 }
146#endif // SHAPE
147}
148
149void Shape::initCorners(int screen_num) {
150 if (!m_win->window())
151 return;
152
153 if (s_corners.size() == 0)
154 s_corners.resize(ScreenCount(App::instance()->display()));
155
156 static const unsigned char left_bits[] = { 0xc0, 0xf8, 0xfc, 0xfe, 0xfe, 0xfe, 0xff, 0xff };
157 static const unsigned char right_bits[] = { 0x03, 0x1f, 0x3f, 0x7f, 0x7f, 0x7f, 0xff, 0xff};
158 static const unsigned char bottom_left_bits[] = { 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfc, 0xf8, 0xc0 };
159 static const unsigned char bottom_right_bits[] = { 0xff, 0xff, 0x7f, 0x7f, 0x7f, 0x3f, 0x1f, 0x03 };
160
161 s_corners[screen_num].topleft = makePixmap(*m_win, left_bits);
162 s_corners[screen_num].topright = makePixmap(*m_win, right_bits);
163 s_corners[screen_num].botleft = makePixmap(*m_win, bottom_left_bits);
164 s_corners[screen_num].botright = makePixmap(*m_win, bottom_right_bits);
165 176
177 cleanCorners();
178#endif // SHAPE
166} 179}
167 180
168void Shape::setPlaces(int shapeplaces) { 181void Shape::setPlaces(int shapeplaces) {