From c8bcddf58b406b67c268aed38d7779816da0424b Mon Sep 17 00:00:00 2001
From: fluxgen <fluxgen>
Date: Sun, 14 Sep 2003 09:51:40 +0000
Subject: buffered background

---
 src/FbTk/FbWindow.cc | 28 +++++++++++++++++++++-------
 src/FbTk/FbWindow.hh |  4 +++-
 2 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/src/FbTk/FbWindow.cc b/src/FbTk/FbWindow.cc
index 6a623d9..f2201d1 100644
--- a/src/FbTk/FbWindow.cc
+++ b/src/FbTk/FbWindow.cc
@@ -19,7 +19,7 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
-// $Id: FbWindow.cc,v 1.25 2003/08/26 23:45:36 fluxgen Exp $
+// $Id: FbWindow.cc,v 1.26 2003/09/14 09:51:40 fluxgen Exp $
 
 #include "FbWindow.hh"
 
@@ -66,7 +66,8 @@ Pixmap getRootPixmap(int screen_num) {
 Display *FbWindow::s_display = 0;
 
 FbWindow::FbWindow():m_parent(0), m_screen_num(0), m_window(0), m_x(0), m_y(0), 
-                     m_width(0), m_height(0), m_border_width(0), m_depth(0), m_destroy(true) {
+                     m_width(0), m_height(0), m_border_width(0), m_depth(0), m_destroy(true),
+                     m_buffer_pm(0) {
 
     if (s_display == 0)
         s_display = App::instance()->display();
@@ -77,7 +78,8 @@ FbWindow::FbWindow(const FbWindow& the_copy):m_parent(the_copy.parent()),
                                              m_x(the_copy.x()), m_y(the_copy.y()), 
                                              m_width(the_copy.width()), m_height(the_copy.height()),
                                              m_border_width(the_copy.borderWidth()), 
-                                             m_depth(the_copy.depth()), m_destroy(true) {
+                                             m_depth(the_copy.depth()), m_destroy(true),
+                                             m_buffer_pm(0) {
     if (s_display == 0)
         s_display = App::instance()->display();
 
@@ -92,7 +94,8 @@ FbWindow::FbWindow(int screen_num,
                    int depth,
                    int class_type):
     m_screen_num(screen_num),
-    m_parent(0), m_destroy(true) {
+    m_parent(0), m_destroy(true),
+    m_buffer_pm(0) {
 	
     create(RootWindow(FbTk::App::instance()->display(), screen_num), 
            x, y, width, height, eventmask,
@@ -105,7 +108,8 @@ FbWindow::FbWindow(const FbWindow &parent,
                    bool override_redirect, 
                    int depth, int class_type):
     m_parent(&parent),
-    m_screen_num(parent.screenNumber()), m_destroy(true) { 
+    m_screen_num(parent.screenNumber()), m_destroy(true),
+    m_buffer_pm(0) { 
 
     create(parent.window(), x, y, width, height, eventmask, 
            override_redirect, depth, class_type);
@@ -115,7 +119,8 @@ FbWindow::FbWindow(const FbWindow &parent,
 
 FbWindow::FbWindow(Window client):m_parent(0), m_window(0),
                                   m_screen_num(0),
-                                  m_destroy(false) { // don't destroy this window
+                                  m_destroy(false),  // don't destroy this window
+                                  m_buffer_pm(0) {
 
     setNew(client);
 }
@@ -189,9 +194,14 @@ void FbWindow::updateTransparent(int the_x, int the_y, unsigned int the_width, u
     if (m_transparent->source() != root)
         m_transparent->setSource(root, screenNumber());
 
-    if (m_transparent->dest() != window())
+    if (m_buffer_pm) {
+        if (m_transparent->dest() != m_buffer_pm) {
+            m_transparent->setDest(m_buffer_pm, screenNumber());
+        }
+    } else if (m_transparent->dest() != window())
         m_transparent->setDest(window(), screenNumber());
 
+
     // get root position
 
     const FbWindow *root_parent = parent();
@@ -368,6 +378,10 @@ long FbWindow::eventMask() const {
     return 0;
 }
 
+void FbWindow::setBufferPixmap(Pixmap pm) {
+    m_buffer_pm = pm;
+}
+
 void FbWindow::updateGeometry() {
     if (m_window == 0)
         return;
diff --git a/src/FbTk/FbWindow.hh b/src/FbTk/FbWindow.hh
index 903ba03..dd80b7f 100644
--- a/src/FbTk/FbWindow.hh
+++ b/src/FbTk/FbWindow.hh
@@ -19,7 +19,7 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
-// $Id: FbWindow.hh,v 1.24 2003/09/10 21:26:28 fluxgen Exp $
+// $Id: FbWindow.hh,v 1.25 2003/09/14 09:51:40 fluxgen Exp $
 
 #ifndef FBTK_FBWINDOW_HH
 #define FBTK_FBWINDOW_HH
@@ -143,6 +143,7 @@ public:
 protected:
     /// creates a window with x window client (m_window = client)
     explicit FbWindow(Window client);
+    void setBufferPixmap(Pixmap pm);
     /// updates x,y, width, height and screen num from X window
     void updateGeometry();
 private:
@@ -164,6 +165,7 @@ private:
     int m_depth; ///< bit depth
     bool m_destroy; ///< wheter the x window was created before
     std::auto_ptr<FbTk::Transparent> m_transparent;
+    Pixmap m_buffer_pm;
 };
 
 bool operator == (Window win, const FbWindow &fbwin);
-- 
cgit v0.11.2