summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann <sandmann@redhat.com>2005-02-24 20:24:12 +0000
committerSøren Sandmann Pedersen <ssp@src.gnome.org>2005-02-24 20:24:12 +0000
commit950f4580289a7890fb9f1802e7eb352882e927e0 (patch)
tree000e0c6e16ebf494224f01756d49388b8a569a05
parentb49a290dc5fe5627c8a4657715dd53591257f490 (diff)
downloadmetacity-950f4580289a7890fb9f1802e7eb352882e927e0.tar.gz
Support shaped windows, disable snow, don't draw background.
Thu Feb 24 15:17:09 2005 Søren Sandmann <sandmann@redhat.com> * src/compositor.c, src/cwindow.c: Support shaped windows, disable snow, don't draw background.
-rw-r--r--ChangeLog5
-rw-r--r--src/compositor.c33
-rw-r--r--src/compositor.h2
-rw-r--r--src/cwindow.c31
-rw-r--r--src/display.c6
-rw-r--r--src/ui.h2
-rw-r--r--src/window.c6
7 files changed, 62 insertions, 23 deletions
diff --git a/ChangeLog b/ChangeLog
index 7b480d0f..90f292a2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Thu Feb 24 15:17:09 2005 Søren Sandmann <sandmann@redhat.com>
+
+ * src/compositor.c, src/cwindow.c: Support shaped windows, disable
+ snow, don't draw background.
+
Sat Feb 12 19:52:09 2005 Søren Sandmann <sandmann@redhat.com>
* src/compositor.c (create_root_buffer): Get rid of shocking pink
diff --git a/src/compositor.c b/src/compositor.c
index 3c77ead2..3d7f46bc 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -303,14 +303,6 @@ create_root_buffer (MetaScreen *screen, Pixmap *pixmap)
value.function = GXcopy;
value.subwindow_mode = IncludeInferiors;
- gc = XCreateGC (display, buffer_pixmap,
- GCFunction | GCSubwindowMode, &value);
- XSetForeground (display, gc, WhitePixel (display, screen->number));
-
- XSetForeground (display, gc, 0x00000000);
-
- XFillRectangle (display, buffer_pixmap, gc, 0, 0, screen->width, screen->height);
-
format = XRenderFindVisualFormat (display,
DefaultVisual (display,
screen->number));
@@ -325,8 +317,6 @@ create_root_buffer (MetaScreen *screen, Pixmap *pixmap)
else
XFreePixmap (display, buffer_pixmap);
- XFreeGC (display, gc);
-
return buffer_picture;
}
@@ -434,7 +424,9 @@ paint_screen (MetaCompositor *compositor,
g_usleep (20000);
}
+#if 0
world_paint (compositor->world, buffer_picture);
+#endif
paint_buffer (screen, pixmap, damage_region);
@@ -481,11 +473,9 @@ do_repair (MetaCompositor *compositor)
#endif /* HAVE_COMPOSITE_EXTENSIONS */
#ifdef HAVE_COMPOSITE_EXTENSIONS
-static gboolean
-repair_now (void *data)
+gboolean
+meta_compositor_repair_now (MetaCompositor *compositor)
{
- MetaCompositor *compositor = data;
-
compositor->repair_idle = 0;
do_repair (compositor);
@@ -511,11 +501,13 @@ ensure_repair_idle (MetaCompositor *compositor)
g_print ("screen %p\n", world_get_screen (compositor->world));
+#if 0
g_timeout_add_full (G_PRIORITY_HIGH, 50, update_world, compositor, NULL);
+#endif
}
compositor->repair_idle = g_idle_add_full (META_PRIORITY_COMPOSITE,
- repair_now, compositor, NULL);
+ meta_compositor_repair_now, compositor, NULL);
meta_topic (META_DEBUG_COMPOSITOR, "Damage idle queued\n");
}
@@ -1215,7 +1207,7 @@ meta_compositor_start_compositing (MetaCompositor *compositor,
if (cwindow)
cwindow_thaw (cwindow);
- repair_now (compositor);
+ meta_compositor_repair_now (compositor);
}
static void
@@ -1316,6 +1308,7 @@ meta_compositor_genie (MetaCompositor *compositor,
{
Distortion distortion[2];
Picture buffer;
+ Pixmap pixmap;
quad_to_quad_interpolate (&start1, &end1, &distortion[0].destination, i/((double)STEPS - 1));
quad_to_quad_interpolate (&start2, &end2, &distortion[1].destination, i/((double)STEPS - 1));
@@ -1332,7 +1325,7 @@ meta_compositor_genie (MetaCompositor *compositor,
cwindow_set_transformation (cwindow, distortion, 2);
- buffer = create_root_buffer (window->screen, NULL);
+ buffer = create_root_buffer (window->screen, &pixmap);
{
XRectangle r;
@@ -1355,12 +1348,16 @@ meta_compositor_genie (MetaCompositor *compositor,
XFixesSetPictureClipRegion (compositor->display->xdisplay,
window->screen->root_picture, 0, 0, None);
/* Copy buffer to root window */
- paint_buffer (window->screen, buffer, None);
+ paint_buffer (window->screen, pixmap, None);
+
+ XFreePixmap (compositor->display->xdisplay, pixmap);
XRenderFreePicture (compositor->display->xdisplay, buffer);
XSync (compositor->display->xdisplay, False);
}
+
+ cwindow_set_transformation (cwindow, NULL, 0);
}
MetaDisplay *
diff --git a/src/compositor.h b/src/compositor.h
index 8cfffcc3..b9ac949d 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -66,5 +66,7 @@ void
meta_compositor_set_translucent (MetaCompositor *compositor,
MetaWindow *window,
gboolean translucent);
+gboolean
+meta_compositor_repair_now (MetaCompositor *compositor);
#endif /* META_COMPOSITOR_H */
diff --git a/src/cwindow.c b/src/cwindow.c
index a8a45e6b..9b85b86e 100644
--- a/src/cwindow.c
+++ b/src/cwindow.c
@@ -6,6 +6,7 @@
#include <X11/extensions/Xcomposite.h>
#include <math.h>
#include <string.h>
+#include <X11/extensions/shape.h>
#define SHADOW_RADIUS 6
#define SHADOW_OPACITY (.25)
@@ -155,19 +156,42 @@ cwindow_extents (CWindow *cwindow)
}
#endif /* HAVE_COMPOSITE_EXTENSIONS */
+static gboolean
+cwindow_has_alpha (CWindow *cwindow)
+{
+ XRenderPictFormat *format;
+
+ format = XRenderFindVisualFormat (cwindow_get_xdisplay (cwindow),
+ cwindow_get_visual (cwindow));
+
+ return format->direct.alpha;
+}
+
XserverRegion
cwindow_get_opaque_region (CWindow *cwindow)
{
XRectangle rect;
Geometry *geometry;
- if (cwindow->translucent)
+ if (cwindow->translucent || cwindow_get_input_only (cwindow) ||
+ !cwindow_get_viewable (cwindow) || cwindow_has_alpha (cwindow) ||
+ cwindow->n_distortions)
{
return XFixesCreateRegion (cwindow_get_xdisplay (cwindow), NULL, 0);
}
else
{
-
+ XserverRegion region = XFixesCreateRegionFromWindow (cwindow_get_xdisplay (cwindow),
+ cwindow->xwindow, ShapeBounding);
+
+ XFixesTranslateRegion (cwindow_get_xdisplay (cwindow),
+ region,
+ cwindow_get_x (cwindow),
+ cwindow_get_y (cwindow));
+
+ return region;
+#if 0
+
if (cwindow->freeze_info)
geometry = &cwindow->freeze_info->geometry;
else
@@ -179,6 +203,7 @@ cwindow_get_opaque_region (CWindow *cwindow)
rect.height = geometry->height;
return XFixesCreateRegion (cwindow_get_xdisplay (cwindow), &rect, 1);
+#endif
}
}
@@ -798,7 +823,7 @@ cwindow_draw (CWindow *cwindow, Picture destination)
XFixesSetPictureClipRegion (dpy, destination, 0, 0, shadow_clip);
- if (!cwindow->translucent)
+ if (!cwindow->translucent && !cwindow_has_alpha (cwindow))
{
create_shadow (cwindow);
diff --git a/src/display.c b/src/display.c
index 7b498a86..e15057c5 100644
--- a/src/display.c
+++ b/src/display.c
@@ -534,7 +534,11 @@ meta_display_open (const char *name)
display->xsync_event_base = 0;
}
else
- display->have_xsync = TRUE;
+ {
+ display->have_xsync = TRUE;
+ XSyncSetPriority (display->xdisplay, None, -10);
+ }
+
meta_verbose ("Attempted to init Xsync, found version %d.%d error base %d event base %d\n",
major, minor,
diff --git a/src/ui.h b/src/ui.h
index 2d4af4a0..34c81e2e 100644
--- a/src/ui.h
+++ b/src/ui.h
@@ -32,7 +32,7 @@
/* This is between GTK_PRIORITY_RESIZE (+10) and GTK_PRIORITY_REDRAW (+20) */
#define META_PRIORITY_RESIZE (G_PRIORITY_HIGH_IDLE + 15)
/* lower than GTK_PRIORITY_REDRAW */
-#define META_PRIORITY_COMPOSITE (G_PRIORITY_HIGH_IDLE + 25)
+#define META_PRIORITY_COMPOSITE (G_PRIORITY_HIGH_IDLE + 10)
typedef struct _MetaUI MetaUI;
diff --git a/src/window.c b/src/window.c
index f30da357..7dde3b67 100644
--- a/src/window.c
+++ b/src/window.c
@@ -731,7 +731,9 @@ meta_window_new_with_attrs (MetaDisplay *display,
if (window->frame)
{
meta_compositor_add_window (window->display->compositor, window->frame->xwindow, attrs);
+#if 0
meta_compositor_set_translucent (window->display->compositor, window, TRUE);
+#endif
}
return window;
@@ -2834,6 +2836,10 @@ meta_window_move_resize_internal (MetaWindow *window,
}
meta_window_refresh_resize_popup (window);
+
+#if 0
+ meta_compositor_repair_now (window->display->compositor);
+#endif
/* Invariants leaving this function are:
* a) window->rect and frame->rect reflect the actual