diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/FbTk/FbPixmap.cc | 8 | ||||
-rw-r--r-- | src/FbTk/FbWindow.cc | 37 | ||||
-rw-r--r-- | src/FbTk/FbWindow.hh | 9 |
3 files changed, 50 insertions, 4 deletions
diff --git a/src/FbTk/FbPixmap.cc b/src/FbTk/FbPixmap.cc index 675e838..30f2c05 100644 --- a/src/FbTk/FbPixmap.cc +++ b/src/FbTk/FbPixmap.cc | |||
@@ -25,6 +25,7 @@ | |||
25 | #include "App.hh" | 25 | #include "App.hh" |
26 | #include "GContext.hh" | 26 | #include "GContext.hh" |
27 | #include "Transparent.hh" | 27 | #include "Transparent.hh" |
28 | #include "FbWindow.hh" | ||
28 | 29 | ||
29 | #include <X11/Xutil.h> | 30 | #include <X11/Xutil.h> |
30 | #include <X11/Xatom.h> | 31 | #include <X11/Xatom.h> |
@@ -390,9 +391,14 @@ void FbPixmap::rootwinPropertyNotify(int screen_num, Atom atom) { | |||
390 | void FbPixmap::setRootPixmap(int screen_num, Pixmap pm) { | 391 | void FbPixmap::setRootPixmap(int screen_num, Pixmap pm) { |
391 | if (!m_root_pixmaps) { | 392 | if (!m_root_pixmaps) { |
392 | m_root_pixmaps = new Pixmap[ScreenCount(display())]; | 393 | m_root_pixmaps = new Pixmap[ScreenCount(display())]; |
394 | for (int i=0; i < ScreenCount(display()); ++i) | ||
395 | m_root_pixmaps[i] = None; | ||
393 | } | 396 | } |
394 | 397 | ||
395 | m_root_pixmaps[screen_num] = pm; | 398 | if (m_root_pixmaps[screen_num] != pm) { |
399 | m_root_pixmaps[screen_num] = pm; | ||
400 | FbWindow::updatedAlphaBackground(screen_num); | ||
401 | } | ||
396 | } | 402 | } |
397 | 403 | ||
398 | Pixmap FbPixmap::getRootPixmap(int screen_num, bool force_update) { | 404 | Pixmap FbPixmap::getRootPixmap(int screen_num, bool force_update) { |
diff --git a/src/FbTk/FbWindow.cc b/src/FbTk/FbWindow.cc index a380312..8f204b1 100644 --- a/src/FbTk/FbWindow.cc +++ b/src/FbTk/FbWindow.cc | |||
@@ -118,8 +118,10 @@ FbWindow::FbWindow(Window client):FbDrawable(), m_parent(0), | |||
118 | FbWindow::~FbWindow() { | 118 | FbWindow::~FbWindow() { |
119 | 119 | ||
120 | // Need to free xrender pics before destroying window | 120 | // Need to free xrender pics before destroying window |
121 | if (m_transparent.get() != 0) | 121 | if (m_transparent.get() != 0) { |
122 | removeAlphaWin(*this); | ||
122 | m_transparent.reset(0); | 123 | m_transparent.reset(0); |
124 | } | ||
123 | 125 | ||
124 | if (m_window != 0) { | 126 | if (m_window != 0) { |
125 | // so we don't get any dangling eventhandler for this window | 127 | // so we don't get any dangling eventhandler for this window |
@@ -127,6 +129,7 @@ FbWindow::~FbWindow() { | |||
127 | if (m_destroy) | 129 | if (m_destroy) |
128 | XDestroyWindow(display(), m_window); | 130 | XDestroyWindow(display(), m_window); |
129 | } | 131 | } |
132 | |||
130 | } | 133 | } |
131 | 134 | ||
132 | void FbWindow::setBackgroundColor(const FbTk::Color &bg_color) { | 135 | void FbWindow::setBackgroundColor(const FbTk::Color &bg_color) { |
@@ -319,8 +322,10 @@ void FbWindow::updateTransparent(int the_x, int the_y, unsigned int the_width, u | |||
319 | void FbWindow::setAlpha(unsigned char alpha) { | 322 | void FbWindow::setAlpha(unsigned char alpha) { |
320 | #ifdef HAVE_XRENDER | 323 | #ifdef HAVE_XRENDER |
321 | if (FbTk::Transparent::haveComposite()) { | 324 | if (FbTk::Transparent::haveComposite()) { |
322 | if (m_transparent.get() != 0) | 325 | if (m_transparent.get() != 0) { |
326 | removeAlphaWin(*this); | ||
323 | m_transparent.reset(0); | 327 | m_transparent.reset(0); |
328 | } | ||
324 | 329 | ||
325 | // don't setOpaque, let controlling objects do that | 330 | // don't setOpaque, let controlling objects do that |
326 | // since it's only needed on toplevel windows | 331 | // since it's only needed on toplevel windows |
@@ -330,10 +335,13 @@ void FbWindow::setAlpha(unsigned char alpha) { | |||
330 | 335 | ||
331 | if (m_transparent.get() == 0 && alpha < 255) { | 336 | if (m_transparent.get() == 0 && alpha < 255) { |
332 | m_transparent.reset(new Transparent(FbPixmap::getRootPixmap(screenNumber()), window(), alpha, screenNumber())); | 337 | m_transparent.reset(new Transparent(FbPixmap::getRootPixmap(screenNumber()), window(), alpha, screenNumber())); |
338 | addAlphaWin(*this); | ||
333 | } else if (alpha < 255 && alpha != m_transparent->alpha()) | 339 | } else if (alpha < 255 && alpha != m_transparent->alpha()) |
334 | m_transparent->setAlpha(alpha); | 340 | m_transparent->setAlpha(alpha); |
335 | else if (alpha == 255) | 341 | else if (alpha == 255) { |
342 | removeAlphaWin(*this); | ||
336 | m_transparent.reset(0); // destroy transparent object | 343 | m_transparent.reset(0); // destroy transparent object |
344 | } | ||
337 | } | 345 | } |
338 | #endif // HAVE_XRENDER | 346 | #endif // HAVE_XRENDER |
339 | } | 347 | } |
@@ -592,6 +600,29 @@ void FbWindow::sendConfigureNotify(int x, int y, | |||
592 | 600 | ||
593 | } | 601 | } |
594 | 602 | ||
603 | FbWindow::FbWinList FbWindow::m_alpha_wins; | ||
604 | |||
605 | void FbWindow::addAlphaWin(FbWindow &win) { | ||
606 | m_alpha_wins.insert(&win); | ||
607 | } | ||
608 | |||
609 | void FbWindow::removeAlphaWin(FbWindow &win) { | ||
610 | FbWinList::iterator it = m_alpha_wins.find(&win); | ||
611 | if (it != m_alpha_wins.end()) | ||
612 | m_alpha_wins.erase(it); | ||
613 | } | ||
614 | |||
615 | void FbWindow::updatedAlphaBackground(int screen) { | ||
616 | FbWinList::iterator it = m_alpha_wins.begin(); | ||
617 | FbWinList::iterator it_end = m_alpha_wins.end(); | ||
618 | for (; it != it_end; ++it) { | ||
619 | if ((*it)->screenNumber() == screen) { | ||
620 | (*it)->updateBackground(false); | ||
621 | (*it)->clear(); | ||
622 | } | ||
623 | } | ||
624 | } | ||
625 | |||
595 | bool operator == (Window win, const FbWindow &fbwin) { | 626 | bool operator == (Window win, const FbWindow &fbwin) { |
596 | return win == fbwin.window(); | 627 | return win == fbwin.window(); |
597 | } | 628 | } |
diff --git a/src/FbTk/FbWindow.hh b/src/FbTk/FbWindow.hh index d09ed90..3a5d18d 100644 --- a/src/FbTk/FbWindow.hh +++ b/src/FbTk/FbWindow.hh | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <X11/Xlib.h> | 29 | #include <X11/Xlib.h> |
30 | #include <memory> | 30 | #include <memory> |
31 | #include <string> | 31 | #include <string> |
32 | #include <set> | ||
32 | 33 | ||
33 | namespace FbTk { | 34 | namespace FbTk { |
34 | 35 | ||
@@ -194,6 +195,8 @@ public: | |||
194 | /// forces full background change, recalcing of alpha values if necessary | 195 | /// forces full background change, recalcing of alpha values if necessary |
195 | void updateBackground(bool only_if_alpha); | 196 | void updateBackground(bool only_if_alpha); |
196 | 197 | ||
198 | static void updatedAlphaBackground(int screen); | ||
199 | |||
197 | protected: | 200 | protected: |
198 | /// creates a window with x window client (m_window = client) | 201 | /// creates a window with x window client (m_window = client) |
199 | explicit FbWindow(Window client); | 202 | explicit FbWindow(Window client); |
@@ -226,6 +229,12 @@ private: | |||
226 | Pixmap m_lastbg_pm; | 229 | Pixmap m_lastbg_pm; |
227 | 230 | ||
228 | FbWindowRenderer *m_renderer; | 231 | FbWindowRenderer *m_renderer; |
232 | |||
233 | static void addAlphaWin(FbWindow &win); | ||
234 | static void removeAlphaWin(FbWindow &win); | ||
235 | |||
236 | typedef std::set<FbWindow *> FbWinList; | ||
237 | static FbWinList m_alpha_wins; | ||
229 | }; | 238 | }; |
230 | 239 | ||
231 | bool operator == (Window win, const FbWindow &fbwin); | 240 | bool operator == (Window win, const FbWindow &fbwin); |