aboutsummaryrefslogtreecommitdiff
path: root/src/FbTk
diff options
context:
space:
mode:
Diffstat (limited to 'src/FbTk')
-rw-r--r--src/FbTk/FbWindow.cc24
-rw-r--r--src/FbTk/FbWindow.hh5
-rw-r--r--src/FbTk/Menu.cc11
-rw-r--r--src/FbTk/Transparent.cc68
-rw-r--r--src/FbTk/Transparent.hh9
5 files changed, 91 insertions, 26 deletions
diff --git a/src/FbTk/FbWindow.cc b/src/FbTk/FbWindow.cc
index 2e69339..7e6c863 100644
--- a/src/FbTk/FbWindow.cc
+++ b/src/FbTk/FbWindow.cc
@@ -19,7 +19,7 @@
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: FbWindow.cc,v 1.42 2004/09/11 22:59:15 fluxgen Exp $ 22// $Id: FbWindow.cc,v 1.43 2004/09/12 14:56:19 rathnor Exp $
23 23
24#include "FbWindow.hh" 24#include "FbWindow.hh"
25#include "FbPixmap.hh" 25#include "FbPixmap.hh"
@@ -161,6 +161,9 @@ void FbWindow::clearArea(int x, int y,
161 161
162void FbWindow::updateTransparent(int the_x, int the_y, unsigned int the_width, unsigned int the_height) { 162void FbWindow::updateTransparent(int the_x, int the_y, unsigned int the_width, unsigned int the_height) {
163#ifdef HAVE_XRENDER 163#ifdef HAVE_XRENDER
164 if (!m_transparent.get())
165 return;
166
164 if (width() == 0 || height() == 0) 167 if (width() == 0 || height() == 0)
165 return; 168 return;
166 169
@@ -174,9 +177,6 @@ void FbWindow::updateTransparent(int the_x, int the_y, unsigned int the_width, u
174 the_y = 0; 177 the_y = 0;
175 } 178 }
176 179
177 if (!m_transparent.get())
178 return;
179
180 // update source and destination if needed 180 // update source and destination if needed
181 Pixmap root = FbPixmap::getRootPixmap(screenNumber()); 181 Pixmap root = FbPixmap::getRootPixmap(screenNumber());
182 if (m_transparent->source() != root) 182 if (m_transparent->source() != root)
@@ -215,7 +215,13 @@ void FbWindow::updateTransparent(int the_x, int the_y, unsigned int the_width, u
215 215
216void FbWindow::setAlpha(unsigned char alpha) { 216void FbWindow::setAlpha(unsigned char alpha) {
217#ifdef HAVE_XRENDER 217#ifdef HAVE_XRENDER
218 if (m_transparent.get() == 0 && alpha < 255) { 218 if (FbTk::Transparent::haveComposite()) {
219 if (m_transparent.get() != 0)
220 m_transparent.reset(0);
221
222 // don't setOpaque, let controlling objects do that
223 // since it's only needed on toplevel windows
224 } else if (m_transparent.get() == 0 && alpha < 255) {
219 m_transparent.reset(new Transparent(FbPixmap::getRootPixmap(screenNumber()), window(), alpha, screenNumber())); 225 m_transparent.reset(new Transparent(FbPixmap::getRootPixmap(screenNumber()), window(), alpha, screenNumber()));
220 } else if (alpha < 255 && alpha != m_transparent->alpha()) 226 } else if (alpha < 255 && alpha != m_transparent->alpha())
221 m_transparent->setAlpha(alpha); 227 m_transparent->setAlpha(alpha);
@@ -395,6 +401,14 @@ long FbWindow::eventMask() const {
395 401
396} 402}
397 403
404void FbWindow::setOpaque(unsigned char alpha) {
405#ifdef HAVE_XRENDER
406 static Atom m_alphaatom = XInternAtom(display(), "_NET_WM_WINDOW_OPACITY", False);
407 unsigned int opacity = alpha << 24;
408 changeProperty(m_alphaatom, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &opacity, 1l);
409#endif // HAVE_XRENDER
410}
411
398void FbWindow::setBufferPixmap(Pixmap pm) { 412void FbWindow::setBufferPixmap(Pixmap pm) {
399 m_buffer_pm = pm; 413 m_buffer_pm = pm;
400} 414}
diff --git a/src/FbTk/FbWindow.hh b/src/FbTk/FbWindow.hh
index c39b8c1..d408216 100644
--- a/src/FbTk/FbWindow.hh
+++ b/src/FbTk/FbWindow.hh
@@ -19,7 +19,7 @@
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: FbWindow.hh,v 1.34 2004/09/11 12:33:14 rathnor Exp $ 22// $Id: FbWindow.hh,v 1.35 2004/09/12 14:56:19 rathnor Exp $
23 23
24#ifndef FBTK_FBWINDOW_HH 24#ifndef FBTK_FBWINDOW_HH
25#define FBTK_FBWINDOW_HH 25#define FBTK_FBWINDOW_HH
@@ -163,6 +163,9 @@ public:
163 inline bool operator == (const FbWindow &win) const { return m_window == win.m_window; } 163 inline bool operator == (const FbWindow &win) const { return m_window == win.m_window; }
164 inline bool operator != (const FbWindow &win) const { return m_window != win.m_window; } 164 inline bool operator != (const FbWindow &win) const { return m_window != win.m_window; }
165 165
166 // used for composite
167 void setOpaque(unsigned char alpha);
168
166protected: 169protected:
167 /// creates a window with x window client (m_window = client) 170 /// creates a window with x window client (m_window = client)
168 explicit FbWindow(Window client); 171 explicit FbWindow(Window client);
diff --git a/src/FbTk/Menu.cc b/src/FbTk/Menu.cc
index 5cfb1d1..b1e186d 100644
--- a/src/FbTk/Menu.cc
+++ b/src/FbTk/Menu.cc
@@ -22,7 +22,7 @@
22// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23// DEALINGS IN THE SOFTWARE. 23// DEALINGS IN THE SOFTWARE.
24 24
25// $Id: Menu.cc,v 1.84 2004/09/11 22:59:15 fluxgen Exp $ 25// $Id: Menu.cc,v 1.85 2004/09/12 14:56:19 rathnor Exp $
26 26
27//use GNU extensions 27//use GNU extensions
28#ifndef _GNU_SOURCE 28#ifndef _GNU_SOURCE
@@ -1379,10 +1379,14 @@ void Menu::keyPressEvent(XKeyEvent &event) {
1379 1379
1380void Menu::reconfigure() { 1380void Menu::reconfigure() {
1381 1381
1382 if (alpha() == 255 && m_transp.get() != 0) { 1382 if (FbTk::Transparent::haveComposite()) {
1383 if (m_transp.get() != 0)
1384 m_transp.reset(0);
1385
1386 menu.window.setOpaque(alpha());
1387 } else if (alpha() == 255 && m_transp.get() != 0) {
1383 m_transp.reset(0); 1388 m_transp.reset(0);
1384 } else if (alpha () < 255) { 1389 } else if (alpha () < 255) {
1385
1386 if (m_transp.get() == 0) { 1390 if (m_transp.get() == 0) {
1387 m_transp.reset(new Transparent(FbPixmap::getRootPixmap(screenNumber()), 1391 m_transp.reset(new Transparent(FbPixmap::getRootPixmap(screenNumber()),
1388 m_real_frame_pm.drawable(), alpha(), 1392 m_real_frame_pm.drawable(), alpha(),
@@ -1484,7 +1488,6 @@ void Menu::renderTransp(int x, int y,
1484 if (m_transp->source() != root) 1488 if (m_transp->source() != root)
1485 m_transp->setSource(root, screenNumber()); 1489 m_transp->setSource(root, screenNumber());
1486 1490
1487
1488 if (m_transp->dest() != m_real_frame_pm.drawable()) 1491 if (m_transp->dest() != m_real_frame_pm.drawable())
1489 m_transp->setDest(m_real_frame_pm.drawable(), screenNumber()); 1492 m_transp->setDest(m_real_frame_pm.drawable(), screenNumber());
1490 1493
diff --git a/src/FbTk/Transparent.cc b/src/FbTk/Transparent.cc
index b6521b9..f8ca2a8 100644
--- a/src/FbTk/Transparent.cc
+++ b/src/FbTk/Transparent.cc
@@ -19,7 +19,7 @@
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: Transparent.cc,v 1.8 2004/09/11 15:52:23 rathnor Exp $ 22// $Id: Transparent.cc,v 1.9 2004/09/12 14:56:20 rathnor Exp $
23 23
24#include "Transparent.hh" 24#include "Transparent.hh"
25#include "App.hh" 25#include "App.hh"
@@ -99,26 +99,67 @@ namespace FbTk {
99 99
100bool Transparent::s_init = false; 100bool Transparent::s_init = false;
101bool Transparent::s_render = false; 101bool Transparent::s_render = false;
102bool Transparent::s_composite = false;
102 103
103Transparent::Transparent(Drawable src, Drawable dest, unsigned char alpha, int screen_num): 104void Transparent::init() {
104 m_alpha_pic(0), m_src_pic(0), m_dest_pic(0),
105 m_source(src), m_dest(dest), m_alpha(alpha) {
106
107 Display *disp = FbTk::App::instance()->display(); 105 Display *disp = FbTk::App::instance()->display();
108 106
109 // check for RENDER support 107 int major_opcode, first_event, first_error;
110 if (!s_init) { 108 if (XQueryExtension(disp, "RENDER",
111 int major_opcode, first_event, first_error; 109 &major_opcode,
112 if (XQueryExtension(disp, "RENDER", 110 &first_event, &first_error) == False) {
111 s_render = false;
112 s_composite = false;
113 } else { // we have RENDER support
114 s_render = true;
115
116 if (XQueryExtension(disp, "Composite",
113 &major_opcode, 117 &major_opcode,
114 &first_event, &first_error) == False) { 118 &first_event, &first_error) == False) {
115 s_render = false; 119 s_composite = false;
116 } else { // we got RENDER support 120 } else { // we have Composite support
117 s_render = true; 121 s_composite = true;
118 } 122 }
119 s_init = true;
120 } 123 }
124 s_init = true;
125}
121 126
127void Transparent::usePseudoTransparent(bool no_composite) {
128 if (s_composite != no_composite)
129 return;
130
131 s_init = false;
132 init(); // only use render if we have it
133
134 if (no_composite)
135 s_composite = false;
136}
137
138bool Transparent::haveComposite(bool for_real) {
139 if (for_real) {
140 Display *disp = FbTk::App::instance()->display();
141 int major_opcode, first_event, first_error;
142
143 return (XQueryExtension(disp, "Composite",
144 &major_opcode,
145 &first_event, &first_error) == True);
146 } else {
147 if (!s_init)
148 init();
149
150 return s_composite;
151 }
152}
153
154Transparent::Transparent(Drawable src, Drawable dest, unsigned char alpha, int screen_num):
155 m_alpha_pic(0), m_src_pic(0), m_dest_pic(0),
156 m_source(src), m_dest(dest), m_alpha(alpha) {
157
158 Display *disp = FbTk::App::instance()->display();
159
160 // check for Extension support
161 if (!s_init)
162 init();
122 163
123#ifdef HAVE_XRENDER 164#ifdef HAVE_XRENDER
124 if (!s_render) 165 if (!s_render)
@@ -126,7 +167,6 @@ Transparent::Transparent(Drawable src, Drawable dest, unsigned char alpha, int s
126 167
127 allocAlpha(m_alpha); 168 allocAlpha(m_alpha);
128 169
129
130 XRenderPictFormat *format = 170 XRenderPictFormat *format =
131 XRenderFindVisualFormat(disp, 171 XRenderFindVisualFormat(disp,
132 DefaultVisual(disp, screen_num)); 172 DefaultVisual(disp, screen_num));
diff --git a/src/FbTk/Transparent.hh b/src/FbTk/Transparent.hh
index fe29826..9aeeead 100644
--- a/src/FbTk/Transparent.hh
+++ b/src/FbTk/Transparent.hh
@@ -19,7 +19,7 @@
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: Transparent.hh,v 1.3 2003/05/13 21:16:27 fluxgen Exp $ 22// $Id: Transparent.hh,v 1.4 2004/09/12 14:56:20 rathnor Exp $
23 23
24#ifndef FBTK_TRANSPARENT_HH 24#ifndef FBTK_TRANSPARENT_HH
25#define FBTK_TRANSPARENT_HH 25#define FBTK_TRANSPARENT_HH
@@ -50,6 +50,10 @@ public:
50 Drawable dest() const { return m_dest; } 50 Drawable dest() const { return m_dest; }
51 Drawable source() const { return m_source; } 51 Drawable source() const { return m_source; }
52 52
53 static bool haveComposite(bool for_real = false);
54 static bool haveRender() { if (!s_init) init(); return s_render; }
55 static void usePseudoTransparent(bool no_composite);
56
53private: 57private:
54 void freeAlpha(); 58 void freeAlpha();
55 void allocAlpha(unsigned char newval); 59 void allocAlpha(unsigned char newval);
@@ -61,7 +65,8 @@ private:
61 65
62 static bool s_init; 66 static bool s_init;
63 static bool s_render; ///< wheter we have RENDER support 67 static bool s_render; ///< wheter we have RENDER support
64 68 static bool s_composite; ///< wheter we have Composite support
69 static void init();
65}; 70};
66 71
67}; // end namespace FbTk 72}; // end namespace FbTk