diff options
author | Søren Sandmann <sandmann@redhat.com> | 2005-02-24 20:24:12 +0000 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@src.gnome.org> | 2005-02-24 20:24:12 +0000 |
commit | 950f4580289a7890fb9f1802e7eb352882e927e0 (patch) | |
tree | 000e0c6e16ebf494224f01756d49388b8a569a05 | |
parent | b49a290dc5fe5627c8a4657715dd53591257f490 (diff) | |
download | metacity-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-- | ChangeLog | 5 | ||||
-rw-r--r-- | src/compositor.c | 33 | ||||
-rw-r--r-- | src/compositor.h | 2 | ||||
-rw-r--r-- | src/cwindow.c | 31 | ||||
-rw-r--r-- | src/display.c | 6 | ||||
-rw-r--r-- | src/ui.h | 2 | ||||
-rw-r--r-- | src/window.c | 6 |
7 files changed, 62 insertions, 23 deletions
@@ -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, @@ -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 |