Author: beatle
Date: 2006-09-20 17:07:42 -0400 (Wed, 20 Sep 2006)
New Revision: 3393

Removed:
   trunk/app/compiz/debian/patches/000_composite-overlay-window.patch
   trunk/app/compiz/debian/patches/001_aiglx-defaults.patch
   trunk/app/compiz/debian/patches/003_composite-cube-logo.patch
   trunk/app/compiz/debian/patches/004_fbconfig-depth-fix.patch
Modified:
   trunk/app/compiz/debian/changelog
   trunk/app/compiz/debian/compiz.wrapper
   trunk/app/compiz/debian/patches/series
   trunk/app/compiz/gnome/window-decorator/gnome-window-decorator.c
   trunk/app/compiz/include/compiz.h
   trunk/app/compiz/plugins/switcher.c
   trunk/app/compiz/src/display.c
   trunk/app/compiz/src/event.c
   trunk/app/compiz/src/main.c
   trunk/app/compiz/src/screen.c
Log:
* Update to latest git version:
  + Drop 000_composite-overlay-window.patch, applied upstream.
  + Drop 004_fbconfig-depth-fix.patch, applied upstream.
  + Drop 001_aiglx-defaults.patch and set AIGLX defaults in compiz.wrapper.

* Add --use-cow to compiz command-line in compiz.wrapper so that the composite
  overlay window is used.

* Drop 003_composite-cube-logo.patch, because I don't really know what it's
  good for.


Modified: trunk/app/compiz/debian/changelog
===================================================================
--- trunk/app/compiz/debian/changelog   2006-09-20 18:06:20 UTC (rev 3392)
+++ trunk/app/compiz/debian/changelog   2006-09-20 21:07:42 UTC (rev 3393)
@@ -4,11 +4,7 @@
   * Now installs the compiz schema during postinst and removes it during
     prerm.
   * Added patches by Kristian Høgsberg to make compiz work on AIGLX:
-    + 000_composite-overlay-window.patch
-    + 001_aiglx-defaults.patch
     + 002_tfp-server-extension.patch
-    + 003_composite-cube-logo.patch
-    + 004_fbconfig-depth-fix.patch
     + 005_glfinish.patch
   * No longer build the compiz-kde package, because it is unusable.
   * Now installs the window settings configuration plugin into the right
@@ -20,5 +16,5 @@
   * Add 010_snap-by-default.patch to turn snapping on by default.
   * Revised the gnome-window-decorator manpage.
 
- -- Thierry Reding <[EMAIL PROTECTED]>  Wed, 20 Sep 2006 14:50:17 +0200
+ -- Thierry Reding <[EMAIL PROTECTED]>  Wed, 20 Sep 2006 22:54:17 +0200
 

Modified: trunk/app/compiz/debian/compiz.wrapper
===================================================================
--- trunk/app/compiz/debian/compiz.wrapper      2006-09-20 18:06:20 UTC (rev 
3392)
+++ trunk/app/compiz/debian/compiz.wrapper      2006-09-20 21:07:42 UTC (rev 
3393)
@@ -6,5 +6,5 @@
 fi
 
 # always load the gconf plugin
-/usr/bin/compiz.real $@ gconf & exit;
+/usr/bin/compiz.real --strict-binding --indirect-rendering --use-cow $@ gconf
 

Deleted: trunk/app/compiz/debian/patches/000_composite-overlay-window.patch
===================================================================
--- trunk/app/compiz/debian/patches/000_composite-overlay-window.patch  
2006-09-20 18:06:20 UTC (rev 3392)
+++ trunk/app/compiz/debian/patches/000_composite-overlay-window.patch  
2006-09-20 21:07:42 UTC (rev 3393)
@@ -1,120 +0,0 @@
---- ./src/display.c.cow        2006-08-29 19:48:53.000000000 -0400
-+++ ./src/display.c    2006-08-29 18:11:46.000000000 -0400
-@@ -1998,7 +1998,7 @@
-                                          PAINT_SCREEN_REGION_MASK |
-                                          PAINT_SCREEN_FULL_MASK);
- 
--                      glXSwapBuffers (s->display->display, s->root);
-+                      glXSwapBuffers (s->display->display, s->output);
-                   }
-                   else if (s->damageMask & COMP_SCREEN_DAMAGE_REGION_MASK)
-                   {
-@@ -2022,7 +2022,7 @@
-                                   y = s->height - pBox->y2;
- 
-                                   (*s->copySubBuffer) (s->display->display,
--                                                       s->root,
-+                                                       s->output,
-                                                        pBox->x1, y,
-                                                        pBox->x2 - pBox->x1,
-                                                        pBox->y2 - pBox->y1);
-@@ -2071,7 +2071,7 @@
-                                              &s->region,
-                                              PAINT_SCREEN_FULL_MASK);
- 
--                          glXSwapBuffers (s->display->display, s->root);
-+                          glXSwapBuffers (s->display->display, s->output);
-                       }
-                   }
- 
---- ./src/screen.c.cow 2006-08-29 14:11:48.000000000 -0400
-+++ ./src/screen.c     2006-08-29 18:19:32.000000000 -0400
-@@ -40,6 +40,8 @@
- #include <X11/Xatom.h>
- #include <X11/Xproto.h>
- #include <X11/extensions/Xrandr.h>
-+#include <X11/extensions/Xcomposite.h>
-+#include <X11/extensions/shape.h>
- #include <X11/cursorfont.h>
- 
- #include <compiz.h>
-@@ -878,6 +880,25 @@
-                    (unsigned char *) data, 1);
- }
- 
-+static void
-+makeOutputWindow (CompScreen *s)
-+{
-+    Display       *dpy = s->display->display;
-+    XserverRegion region;
-+
-+    s->overlay   = XCompositeGetOverlayWindow (dpy, s->root);
-+    s->output    = s->overlay;
-+
-+    region = XFixesCreateRegion (dpy, NULL, 0);
-+
-+    XFixesSetWindowShapeRegion (dpy,
-+                              s->output,
-+                              ShapeInput,
-+                              0, 0, region);
-+
-+    XFixesDestroyRegion (dpy, region);
-+}
-+
- Bool
- addScreen (CompDisplay *display,
-          int         screenNum,
-@@ -1045,6 +1066,8 @@
- 
-     s->grabWindow = None;
- 
-+    makeOutputWindow (s);
-+
-     templ.visualid = XVisualIDFromVisual (s->attrib.visual);
- 
-     visinfo = XGetVisualInfo (dpy, VisualIDMask, &templ, &nvisinfo);
-@@ -1174,7 +1197,7 @@
-       s->copySubBuffer = (GLXCopySubBufferProc)
-           getProcAddress (s, "glXCopySubBufferMESA");
- 
--    glXMakeCurrent (dpy, s->root, s->ctx);
-+    glXMakeCurrent (dpy, s->output, s->ctx);
-     currentRoot = s->root;
- 
-     glExtensions = (const char *) glGetString (GL_EXTENSIONS);
-@@ -2844,7 +2867,7 @@
- {
-     if (currentRoot != s->root)
-     {
--      glXMakeCurrent (s->display->display, s->root, s->ctx);
-+      glXMakeCurrent (s->display->display, s->output, s->ctx);
-       currentRoot = s->root;
- 
-       s->pendingCommands = TRUE;
---- ./include/compiz.h.cow     2006-08-29 19:36:02.000000000 -0400
-+++ ./include/compiz.h 2006-08-29 15:46:43.000000000 -0400
-@@ -1288,6 +1288,8 @@
-     Region          damage;
-     unsigned long     damageMask;
-     Window          root;
-+    Window          overlay;
-+    Window          output;
-     XWindowAttributes attrib;
-     Window          grabWindow;
-     CompFBConfig      glxPixmapFBConfigs[MAX_DEPTH + 1];
---- ./src/event.c.cow  2006-08-29 21:37:29.000000000 -0400
-+++ ./src/event.c      2006-08-29 21:39:03.000000000 -0400
-@@ -1145,7 +1145,12 @@
-       s = findScreenAtDisplay (d, event->xcreatewindow.parent);
-       if (s)
-       {
--          addWindow (s, event->xcreatewindow.window, getTopWindow (s));
-+          /* The first time some client asks for the composite
-+           * overlay window, the X server creates it, which causes
-+           * an errorneous CreateNotify event.  We catch it and
-+           * ignore it. */
-+          if (s->overlay != event->xcreatewindow.window)
-+              addWindow (s, event->xcreatewindow.window, getTopWindow (s));
-       }
-       break;
-     case DestroyNotify:

Deleted: trunk/app/compiz/debian/patches/001_aiglx-defaults.patch
===================================================================
--- trunk/app/compiz/debian/patches/001_aiglx-defaults.patch    2006-09-20 
18:06:20 UTC (rev 3392)
+++ trunk/app/compiz/debian/patches/001_aiglx-defaults.patch    2006-09-20 
21:07:42 UTC (rev 3393)
@@ -1,56 +0,0 @@
-Change the compiz indirect rendering and tfp binding settings to
-
-From: Kristian Høgsberg <[EMAIL PROTECTED]>
-
-work with AIGLX.
----
-
- src/main.c |   16 +++++++++++++---
- 1 files changed, 13 insertions(+), 3 deletions(-)
-
-diff --git a/src/main.c b/src/main.c
-index 3d3a9c5..bbafd2b 100644
---- a/src/main.c
-+++ b/src/main.c
-@@ -78,8 +78,8 @@ CompWindow *lastFoundWindow = 0;
- CompWindow *lastDamagedWindow = 0;
- 
- Bool replaceCurrentWm = FALSE;
--Bool indirectRendering = FALSE;
--Bool strictBinding = FALSE;
-+Bool indirectRendering = TRUE;
-+Bool strictBinding = TRUE;
- 
- static void
- usage (void)
-@@ -90,8 +90,10 @@ usage (void)
-           "[--refresh-rate RATE]\n       "
-           "[--fast-filter] "
-           "[--indirect-rendering] "
-+          "[--direct-rendering]\n       "
-           "[--strict-binding] "
--          "[--test-mode]\n       "
-+          "[--xgl-binding] "
-+          "[--test-mode]\n       " 
-           "[--replace] "
-           "[--sm-disable] "
-           "[--sm-client-id ID] "
-@@ -182,10 +184,18 @@ main (int argc, char **argv)
-       {
-           indirectRendering = TRUE;
-       }
-+      else if (!strcmp (argv[i], "--direct-rendering"))
-+      {
-+          indirectRendering = FALSE;
-+      }
-       else if (!strcmp (argv[i], "--strict-binding"))
-       {
-           strictBinding = TRUE;
-       }
-+      else if (!strcmp (argv[i], "--xgl-binding"))
-+      {
-+          strictBinding = FALSE;
-+      }
-       else if (!strcmp (argv[i], "--replace"))
-       {
-           replaceCurrentWm = TRUE;

Deleted: trunk/app/compiz/debian/patches/003_composite-cube-logo.patch
===================================================================
--- trunk/app/compiz/debian/patches/003_composite-cube-logo.patch       
2006-09-20 18:06:20 UTC (rev 3392)
+++ trunk/app/compiz/debian/patches/003_composite-cube-logo.patch       
2006-09-20 21:07:42 UTC (rev 3393)
@@ -1,43 +0,0 @@
-Composite cube logo against background color.
-
-From: Kristian Høgsberg <[EMAIL PROTECTED]>
-
-
----
-
- plugins/cube.c |   17 +++++++++++++++++
- 1 files changed, 17 insertions(+), 0 deletions(-)
-
-diff --git a/plugins/cube.c b/plugins/cube.c
-index 31edd5c..339d843 100644
---- a/plugins/cube.c
-+++ b/plugins/cube.c
-@@ -1162,11 +1162,28 @@ cubePaintTransformedScreen (CompScreen         
- 
-       if (cs->invert == 1 && s->size == 4 && cs->texture.name)
-       {
-+          glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
-+
-+          glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
-+          glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE0);
-+          glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PRIMARY_COLOR);
-+          glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_TEXTURE0);
-+          glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
-+          glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
-+          glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA);
-+
-+          glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
-+          glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS);
-+          glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
-+
-           enableTexture (s, &cs->texture, COMP_TEXTURE_FILTER_GOOD);
-+
-           glTexCoordPointer (2, GL_FLOAT, 0, cs->tc);
-           glDrawArrays (GL_TRIANGLE_FAN, 0, cs->nvertices >> 1);
-           disableTexture (s, &cs->texture);
-           glDisableClientState (GL_TEXTURE_COORD_ARRAY);
-+
-+          glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
-       }
-       else
-       {

Deleted: trunk/app/compiz/debian/patches/004_fbconfig-depth-fix.patch
===================================================================
--- trunk/app/compiz/debian/patches/004_fbconfig-depth-fix.patch        
2006-09-20 18:06:20 UTC (rev 3392)
+++ trunk/app/compiz/debian/patches/004_fbconfig-depth-fix.patch        
2006-09-20 21:07:42 UTC (rev 3393)
@@ -1,31 +0,0 @@
-Make sure the depth of the corresponding match for the fbconfig we pick.
-
-From: Kristian Høgsberg <[EMAIL PROTECTED]>
-
-
----
-
- src/screen.c |   10 ++++++++++
- 1 files changed, 10 insertions(+), 0 deletions(-)
-
-diff --git a/src/screen.c b/src/screen.c
-index 9ec30d5..75c6abc 100644
---- a/src/screen.c
-+++ b/src/screen.c
-@@ -1309,6 +1309,16 @@ addScreen (CompDisplay *display,
- 
-       for (j = 0; j < nElements; j++)
-       {
-+          {
-+            XVisualInfo *vi;
-+            int visual_depth;
-+            vi = glXGetVisualFromFBConfig(dpy, fbConfigs[j]);
-+            visual_depth = vi->depth;
-+            XFree(vi);
-+            if (visual_depth != i)
-+              continue;
-+          }
-+
-           (*s->getFBConfigAttrib) (dpy,
-                                    fbConfigs[j],
-                                    GLX_ALPHA_SIZE,

Modified: trunk/app/compiz/debian/patches/series
===================================================================
--- trunk/app/compiz/debian/patches/series      2006-09-20 18:06:20 UTC (rev 
3392)
+++ trunk/app/compiz/debian/patches/series      2006-09-20 21:07:42 UTC (rev 
3393)
@@ -1,7 +1,3 @@
-000_composite-overlay-window.patch
-001_aiglx-defaults.patch
 002_tfp-server-extension.patch
-003_composite-cube-logo.patch
-004_fbconfig-depth-fix.patch
 005_glfinish.patch
 010_snap-by-default.patch

Modified: trunk/app/compiz/gnome/window-decorator/gnome-window-decorator.c
===================================================================
--- trunk/app/compiz/gnome/window-decorator/gnome-window-decorator.c    
2006-09-20 18:06:20 UTC (rev 3392)
+++ trunk/app/compiz/gnome/window-decorator/gnome-window-decorator.c    
2006-09-20 21:07:42 UTC (rev 3393)
@@ -105,6 +105,8 @@
 
 #define ICON_SPACE 20
 
+#define DOUBLE_CLICK_DISTANCE 8.0
+
 typedef struct _extents {
     gint left;
     gint right;
@@ -283,25 +285,25 @@
 
 static struct _pos {
     int x, y, w, h;
-    int xw, yh, ww, hh;
+    int xw, yh, ww, hh, yth, hth;
 } pos[3][3] = {
     {
-       {  0,  0, 10, 21,   0, 0, 0, 0 },
-       { 10,  0, -8,  6,   0, 0, 1, 0 },
-       {  2,  0, 10, 21,   1, 0, 0, 0 }
+       {  0,  0, 10, 21,   0, 0, 0, 0, 0, 1 },
+       { 10,  0, -8,  6,   0, 0, 1, 0, 0, 1 },
+       {  2,  0, 10, 21,   1, 0, 0, 0, 0, 1 }
     }, {
-       {  0, 10,  6, 11,   0, 0, 0, 1 },
-       {  6,  6,  0, 15,   0, 0, 1, 0 },
-       {  6, 10,  6, 11,   1, 0, 0, 1 }
+       {  0, 10,  6, 11,   0, 0, 0, 1, 1, 0 },
+       {  6,  6,  0, 15,   0, 0, 1, 0, 0, 1 },
+       {  6, 10,  6, 11,   1, 0, 0, 1, 1, 0 }
     }, {
-       {  0, 17, 10, 10,   0, 1, 0, 0 },
-       { 10, 21, -8,  6,   0, 1, 1, 0 },
-       {  2, 17, 10, 10,   1, 1, 0, 0 }
+       {  0, 17, 10, 10,   0, 1, 0, 0, 1, 0 },
+       { 10, 21, -8,  6,   0, 1, 1, 0, 1, 0 },
+       {  2, 17, 10, 10,   1, 1, 0, 0, 1, 0 }
     }
 }, bpos[3] = {
-    { 0, 6, 16, 16,   1, 0, 0, 0 },
-    { 0, 6, 16, 16,   1, 0, 0, 0 },
-    { 0, 6, 16, 16,   1, 0, 0, 0 }
+    { 0, 6, 16, 16,   1, 0, 0, 0, 0, 0 },
+    { 0, 6, 16, 16,   1, 0, 0, 0, 0, 0 },
+    { 0, 6, 16, 16,   1, 0, 0, 0, 0, 0 }
 };
 
 typedef struct _decor_color {
@@ -2417,9 +2419,9 @@
            if (d->actions & event_window_actions[i][j] && i >= k && i <= l)
            {
                x = pos[i][j].x + pos[i][j].xw * width;
-               y = pos[i][j].y + pos[i][j].yh * height;
+               y = pos[i][j].y + pos[i][j].yh * height + pos[i][j].yth * 
(titlebar_height - 17);
                w = pos[i][j].w + pos[i][j].ww * width;
-               h = pos[i][j].h + pos[i][j].hh * height;
+               h = pos[i][j].h + pos[i][j].hh * height + pos[i][j].hth * 
(titlebar_height - 17);
 
                XMapWindow (xdisplay, d->event_windows[i][j]);
                XMoveResizeWindow (xdisplay, d->event_windows[i][j],
@@ -2443,9 +2445,9 @@
        if (d->actions & button_actions[i])
        {
            x = bpos[i].x + bpos[i].xw * width;
-           y = bpos[i].y + bpos[i].yh * height;
+           y = bpos[i].y + bpos[i].yh * height + bpos[i].yth * 
(titlebar_height - 17);
            w = bpos[i].w + bpos[i].ww * width;
-           h = bpos[i].h + bpos[i].hh * height;
+           h = bpos[i].h + bpos[i].hh * height + bpos[i].hth + 
(titlebar_height - 17);
 
            x -= button_x;
            button_x += 16;
@@ -3504,13 +3506,17 @@
 
     switch (xevent->type) {
     case ButtonPress:
-       d->button_states[0] |= PRESSED_EVENT_WINDOW;
+       if (xevent->xbutton.button == 1)
+           d->button_states[0] |= PRESSED_EVENT_WINDOW;
        break;
     case ButtonRelease:
-       if (d->button_states[0] == (PRESSED_EVENT_WINDOW | IN_EVENT_WINDOW))
-           wnck_window_close (win, xevent->xbutton.time);
+       if (xevent->xbutton.button == 1)
+       {
+           if (d->button_states[0] == (PRESSED_EVENT_WINDOW | IN_EVENT_WINDOW))
+               wnck_window_close (win, xevent->xbutton.time);
 
-       d->button_states[0] &= ~PRESSED_EVENT_WINDOW;
+           d->button_states[0] &= ~PRESSED_EVENT_WINDOW;
+       }
        break;
     case EnterNotify:
        d->button_states[0] |= IN_EVENT_WINDOW;
@@ -3538,18 +3544,22 @@
 
     switch (xevent->type) {
     case ButtonPress:
-       d->button_states[1] |= PRESSED_EVENT_WINDOW;
+       if (xevent->xbutton.button == 1)
+           d->button_states[1] |= PRESSED_EVENT_WINDOW;
        break;
     case ButtonRelease:
-       if (d->button_states[1] == (PRESSED_EVENT_WINDOW | IN_EVENT_WINDOW))
+       if (xevent->xbutton.button == 1)
        {
-           if (wnck_window_is_maximized (win))
-               wnck_window_unmaximize (win);
-           else
-               wnck_window_maximize (win);
+           if (d->button_states[1] == (PRESSED_EVENT_WINDOW | IN_EVENT_WINDOW))
+           {
+               if (wnck_window_is_maximized (win))
+                   wnck_window_unmaximize (win);
+               else
+                   wnck_window_maximize (win);
+           }
+
+           d->button_states[1] &= ~PRESSED_EVENT_WINDOW;
        }
-
-       d->button_states[1] &= ~PRESSED_EVENT_WINDOW;
        break;
     case EnterNotify:
        d->button_states[1] |= IN_EVENT_WINDOW;
@@ -3574,13 +3584,17 @@
 
     switch (xevent->type) {
     case ButtonPress:
-       d->button_states[2] |= PRESSED_EVENT_WINDOW;
+       if (xevent->xbutton.button == 1)
+           d->button_states[2] |= PRESSED_EVENT_WINDOW;
        break;
     case ButtonRelease:
-       if (d->button_states[2] == (PRESSED_EVENT_WINDOW | IN_EVENT_WINDOW))
-           wnck_window_minimize (win);
+       if (xevent->xbutton.button == 1)
+       {
+           if (d->button_states[2] == (PRESSED_EVENT_WINDOW | IN_EVENT_WINDOW))
+               wnck_window_minimize (win);
 
-       d->button_states[2] &= ~PRESSED_EVENT_WINDOW;
+           d->button_states[2] &= ~PRESSED_EVENT_WINDOW;
+       }
        break;
     case EnterNotify:
        d->button_states[2] |= IN_EVENT_WINDOW;
@@ -3714,6 +3728,19 @@
     action_menu_mapped = TRUE;
 }
 
+static double
+square (double x)
+{
+    return x * x;
+}
+
+static double
+dist (double x1, double y1,
+      double x2, double y2)
+{
+    return sqrt (square (x1 - x2) + square (y1 - y2));
+}
+
 static void
 title_event (WnckWindow *win,
             XEvent     *xevent)
@@ -3721,15 +3748,19 @@
     static int   last_button_num = 0;
     static Window last_button_xwindow = None;
     static Time          last_button_time = 0;
+    static int   last_button_x = 0;
+    static int   last_button_y = 0;
 
     if (xevent->type != ButtonPress)
        return;
 
     if (xevent->xbutton.button == 1)
     {
-       if (xevent->xbutton.button == last_button_num     &&
-           xevent->xbutton.window == last_button_xwindow &&
-           xevent->xbutton.time < last_button_time + double_click_timeout)
+       if (xevent->xbutton.button == last_button_num                     &&
+           xevent->xbutton.window == last_button_xwindow                 &&
+           xevent->xbutton.time < last_button_time + double_click_timeout &&
+           dist (xevent->xbutton.x, xevent->xbutton.y,
+                 last_button_x, last_button_y) < DOUBLE_CLICK_DISTANCE)
        {
            switch (double_click_action) {
            case DOUBLE_CLICK_SHADE:
@@ -3750,12 +3781,16 @@
            last_button_num     = 0;
            last_button_xwindow = None;
            last_button_time    = 0;
+           last_button_x       = 0;
+           last_button_y       = 0;
        }
        else
        {
            last_button_num     = xevent->xbutton.button;
            last_button_xwindow = xevent->xbutton.window;
            last_button_time    = xevent->xbutton.time;
+           last_button_x       = xevent->xbutton.x;
+           last_button_y       = xevent->xbutton.y;
 
            restack_window (win, Above);
 

Modified: trunk/app/compiz/include/compiz.h
===================================================================
--- trunk/app/compiz/include/compiz.h   2006-09-20 18:06:20 UTC (rev 3392)
+++ trunk/app/compiz/include/compiz.h   2006-09-20 21:07:42 UTC (rev 3393)
@@ -196,6 +196,7 @@
 extern Bool       replaceCurrentWm;
 extern Bool       indirectRendering;
 extern Bool       strictBinding;
+extern Bool       useCow;
 
 extern int  defaultRefreshRate;
 extern char *defaultTextureFilter;
@@ -1302,6 +1303,8 @@
     Region           damage;
     unsigned long     damageMask;
     Window           root;
+    Window           overlay;
+    Window           output;
     XWindowAttributes attrib;
     Window           grabWindow;
     CompFBConfig      glxPixmapFBConfigs[MAX_DEPTH + 1];

Modified: trunk/app/compiz/plugins/switcher.c
===================================================================
--- trunk/app/compiz/plugins/switcher.c 2006-09-20 18:06:20 UTC (rev 3392)
+++ trunk/app/compiz/plugins/switcher.c 2006-09-20 21:07:42 UTC (rev 3393)
@@ -510,6 +510,12 @@
     CompWindow *w1 = *((CompWindow **) elem1);
     CompWindow *w2 = *((CompWindow **) elem2);
 
+    if (w1->mapNum && !w2->mapNum)
+       return -1;
+
+    if (w2->mapNum && !w1->mapNum)
+       return 1;
+    
     return w2->activeNum - w1->activeNum;
 }
 

Modified: trunk/app/compiz/src/display.c
===================================================================
--- trunk/app/compiz/src/display.c      2006-09-20 18:06:20 UTC (rev 3392)
+++ trunk/app/compiz/src/display.c      2006-09-20 21:07:42 UTC (rev 3393)
@@ -2018,7 +2018,7 @@
 
                        waitForVideoSync (s);
 
-                       glXSwapBuffers (s->display->display, s->root);
+                       glXSwapBuffers (s->display->display, s->output);
                    }
                    else if (s->damageMask & COMP_SCREEN_DAMAGE_REGION_MASK)
                    {
@@ -2044,7 +2044,7 @@
                                    y = s->height - pBox->y2;
 
                                    (*s->copySubBuffer) (s->display->display,
-                                                        s->root,
+                                                        s->output,
                                                         pBox->x1, y,
                                                         pBox->x2 - pBox->x1,
                                                         pBox->y2 - pBox->y1);
@@ -2095,7 +2095,7 @@
 
                            waitForVideoSync (s);
 
-                           glXSwapBuffers (s->display->display, s->root);
+                           glXSwapBuffers (s->display->display, s->output);
                        }
                    }
 

Modified: trunk/app/compiz/src/event.c
===================================================================
--- trunk/app/compiz/src/event.c        2006-09-20 18:06:20 UTC (rev 3392)
+++ trunk/app/compiz/src/event.c        2006-09-20 21:07:42 UTC (rev 3393)
@@ -1148,7 +1148,12 @@
        s = findScreenAtDisplay (d, event->xcreatewindow.parent);
        if (s)
        {
-           addWindow (s, event->xcreatewindow.window, getTopWindow (s));
+           /* The first time some client asks for the composite
+            * overlay window, the X server creates it, which causes
+            * an errorneous CreateNotify event.  We catch it and
+            * ignore it. */
+           if (s->overlay != event->xcreatewindow.window)
+               addWindow (s, event->xcreatewindow.window, getTopWindow (s));
        }
        break;
     case DestroyNotify:

Modified: trunk/app/compiz/src/main.c
===================================================================
--- trunk/app/compiz/src/main.c 2006-09-20 18:06:20 UTC (rev 3392)
+++ trunk/app/compiz/src/main.c 2006-09-20 21:07:42 UTC (rev 3393)
@@ -80,6 +80,7 @@
 Bool replaceCurrentWm = FALSE;
 Bool indirectRendering = FALSE;
 Bool strictBinding = FALSE;
+Bool useCow = FALSE;
 
 static void
 usage (void)
@@ -96,7 +97,7 @@
            "[--sm-disable] "
            "[--sm-client-id ID] "
            "[--version]\n       "
-           "[--help] "
+           "[--use-cow] [--help] "
            "[PLUGIN]...\n",
            programName);
 }
@@ -186,6 +187,10 @@
        {
            strictBinding = TRUE;
        }
+       else if (!strcmp (argv[i], "--use-cow"))
+       {
+           useCow = TRUE;
+       }
        else if (!strcmp (argv[i], "--replace"))
        {
            replaceCurrentWm = TRUE;

Modified: trunk/app/compiz/src/screen.c
===================================================================
--- trunk/app/compiz/src/screen.c       2006-09-20 18:06:20 UTC (rev 3392)
+++ trunk/app/compiz/src/screen.c       2006-09-20 21:07:42 UTC (rev 3393)
@@ -40,6 +40,8 @@
 #include <X11/Xatom.h>
 #include <X11/Xproto.h>
 #include <X11/extensions/Xrandr.h>
+#include <X11/extensions/Xcomposite.h>
+#include <X11/extensions/shape.h>
 #include <X11/cursorfont.h>
 
 #include <compiz.h>
@@ -889,6 +891,25 @@
                     (unsigned char *) data, 1);
 }
 
+static void
+makeOutputWindow (CompScreen *s)
+{
+    Display       *dpy = s->display->display;
+    XserverRegion region;
+
+    s->overlay   = XCompositeGetOverlayWindow (dpy, s->root);
+    s->output    = s->overlay;
+
+    region = XFixesCreateRegion (dpy, NULL, 0);
+
+    XFixesSetWindowShapeRegion (dpy,
+                               s->output,
+                               ShapeInput,
+                               0, 0, region);
+
+    XFixesDestroyRegion (dpy, region);
+}
+
 Bool
 addScreen (CompDisplay *display,
           int         screenNum,
@@ -1056,6 +1077,11 @@
 
     s->grabWindow = None;
 
+    if (useCow)
+       makeOutputWindow (s);
+    else
+       s->overlay = s->output = s->root;
+
     templ.visualid = XVisualIDFromVisual (s->attrib.visual);
 
     visinfo = XGetVisualInfo (dpy, VisualIDMask, &templ, &nvisinfo);
@@ -1192,7 +1218,7 @@
            getProcAddress (s, "glXWaitVideoSyncSGI");
     }
 
-    glXMakeCurrent (dpy, s->root, s->ctx);
+    glXMakeCurrent (dpy, s->output, s->ctx);
     currentRoot = s->root;
 
     glExtensions = (const char *) glGetString (GL_EXTENSIONS);
@@ -1324,6 +1350,20 @@
 
        for (j = 0; j < nElements; j++)
        {
+           XVisualInfo *vi;
+           int         visualDepth;
+
+           vi = glXGetVisualFromFBConfig (dpy, fbConfigs[j]);
+           if (vi == NULL)
+               continue;
+
+           visualDepth = vi->depth;
+
+           XFree (vi);
+
+           if (visualDepth != i)
+               continue;
+
            (*s->getFBConfigAttrib) (dpy,
                                     fbConfigs[j],
                                     GLX_ALPHA_SIZE,
@@ -2852,7 +2892,7 @@
 {
     if (currentRoot != s->root)
     {
-       glXMakeCurrent (s->display->display, s->root, s->ctx);
+       glXMakeCurrent (s->display->display, s->output, s->ctx);
        currentRoot = s->root;
 
        s->pendingCommands = TRUE;


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to