experimental Xdamage support
authorBrenden Matthews <brenden1@rty.ca>
Wed, 24 May 2006 06:34:37 +0000 (06:34 +0000)
committerBrenden Matthews <brenden1@rty.ca>
Wed, 24 May 2006 06:34:37 +0000 (06:34 +0000)
git-svn-id: https://conky.svn.sourceforge.net/svnroot/conky/trunk/conky1@659 7f574dfc-610e-0410-a909-a81674777703

configure.in
src/conky.c

index 71eb3e7..f1f529c 100644 (file)
@@ -398,6 +398,7 @@ if test "x$want_x11" = "xyes"; then
        AC_DEFINE(X11, 1, [Define if you want to use X11])
        AC_DEFINE(HAVE_X11, 1, [Define if you have X11])
        AM_CONDITIONAL(BUILD_X11, true)
+       AC_CHECK_LIB(Xdamage, XDamageQueryExtension, [AC_DEFINE([HAVE_XDAMAGE], 1, [Xdamage]) LIBS="$LIBS -lXdamage"], [AC_MSG_ERROR([something went wrong when checking for Xdamage])])
        if test $dah != "no"; then
                AC_DEFINE(DOUBLE_BUFFER, 1, [Define if you want support for the DBE extension])
                AC_CHECK_LIB(Xext, XdbeQueryExtension, [AC_DEFINE([HAVE_XDBE], 1, [Xdbe]) LIBS="$LIBS -lXext"],
index 9e272df..931fc24 100644 (file)
@@ -26,6 +26,7 @@
 #include <sys/time.h>
 #ifdef X11
 #include <X11/Xutil.h>
+#include <X11/extensions/Xdamage.h>
 #endif /* X11 */
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -5539,6 +5540,16 @@ static void main_loop()
 
 #ifdef X11
        Region region = XCreateRegion();
+       int event_base, error_base;
+       if (!XDamageQueryExtension (display, &event_base, &error_base)) {
+               ERR("Xdamage extension unavailable");
+       }
+       Window root = RootWindow(display, screen);
+       Damage damage = XDamageCreate(display, root, XDamageReportRawRectangles);
+/*     XserverRegion region2 = XFixesCreateRegion(display, 0, 0);
+       XserverRegion part = XFixesCreateRegion(display, 0, 0);*/
+       XserverRegion region2 = XFixesCreateRegionFromWindow(display, window.window, 0);
+       XserverRegion part = XFixesCreateRegionFromWindow(display, window.window, 0);
 #endif /* X11 */
 
        info.looped = 0;
@@ -5552,6 +5563,8 @@ static void main_loop()
 #endif
 
 #ifdef X11
+               XDamageSubtract(display, damage, region2, None);
+               XFixesSetRegion(display, region2, 0, 0);
                XFlush(display);
 
                /* wait for X event or timeout */
@@ -5752,6 +5765,11 @@ static void main_loop()
 #endif
 
                        default:
+                               if (ev.type == event_base + XDamageNotify) {
+                                                               XDamageNotifyEvent  *dev = (XDamageNotifyEvent *) &ev;
+               XFixesSetRegion(display, part, &dev->area, 1);
+               XFixesUnionRegion(display, region2, region2, part);
+                                       }
                                break;
                        }
                }