diff --git a/ChangeLog b/ChangeLog index af33dd7f59..b0017dde57 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2005-01-18 Matthias Clasen + + Avoid X errors when running against servers which + implement XRender < 0.4. (#164427, Albert Chin) + + * gdk/x11/gdkprivate-x11.h: + * gdk/x11/gdkdrawable-x11.c (_gdk_x11_have_render_with_trapezoids): + New function to check for trapezoid support in XRender. + (gdk_x11_draw_trapezoids, _gdk_x11_drawable_draw_xtrapezoids): + Use it here. + + * gdk/x11/gdkdisplay-x11.h (struct _GdkDisplayX11): Add a + separate have_render_with_trapezoids field. + + * gdk/x11/gdkdisplay-x11.c (gdk_display_open): Initialize it. + 2005-01-17 Matthias Clasen * gtk/gtkiconview.c: Remove debug output. (#164376, Jens Finke) diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index af33dd7f59..b0017dde57 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,19 @@ +2005-01-18 Matthias Clasen + + Avoid X errors when running against servers which + implement XRender < 0.4. (#164427, Albert Chin) + + * gdk/x11/gdkprivate-x11.h: + * gdk/x11/gdkdrawable-x11.c (_gdk_x11_have_render_with_trapezoids): + New function to check for trapezoid support in XRender. + (gdk_x11_draw_trapezoids, _gdk_x11_drawable_draw_xtrapezoids): + Use it here. + + * gdk/x11/gdkdisplay-x11.h (struct _GdkDisplayX11): Add a + separate have_render_with_trapezoids field. + + * gdk/x11/gdkdisplay-x11.c (gdk_display_open): Initialize it. + 2005-01-17 Matthias Clasen * gtk/gtkiconview.c: Remove debug output. (#164376, Jens Finke) diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index af33dd7f59..b0017dde57 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,19 @@ +2005-01-18 Matthias Clasen + + Avoid X errors when running against servers which + implement XRender < 0.4. (#164427, Albert Chin) + + * gdk/x11/gdkprivate-x11.h: + * gdk/x11/gdkdrawable-x11.c (_gdk_x11_have_render_with_trapezoids): + New function to check for trapezoid support in XRender. + (gdk_x11_draw_trapezoids, _gdk_x11_drawable_draw_xtrapezoids): + Use it here. + + * gdk/x11/gdkdisplay-x11.h (struct _GdkDisplayX11): Add a + separate have_render_with_trapezoids field. + + * gdk/x11/gdkdisplay-x11.c (gdk_display_open): Initialize it. + 2005-01-17 Matthias Clasen * gtk/gtkiconview.c: Remove debug output. (#164376, Jens Finke) diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c index df791419a3..4f29331ec0 100644 --- a/gdk/x11/gdkdisplay-x11.c +++ b/gdk/x11/gdkdisplay-x11.c @@ -206,6 +206,7 @@ gdk_display_open (const gchar *display_name) display_x11->leader_window_title_set = FALSE; display_x11->have_render = GDK_UNKNOWN; + display_x11->have_render_with_trapezoids = GDK_UNKNOWN; #ifdef HAVE_XFIXES if (XFixesQueryExtension (display_x11->xdisplay, diff --git a/gdk/x11/gdkdisplay-x11.h b/gdk/x11/gdkdisplay-x11.h index 198bf6a727..9392657736 100644 --- a/gdk/x11/gdkdisplay-x11.h +++ b/gdk/x11/gdkdisplay-x11.h @@ -78,6 +78,7 @@ struct _GdkDisplayX11 gboolean use_xshm; gboolean have_shm_pixmaps; GdkTristate have_render; + GdkTristate have_render_with_trapezoids; gboolean have_xfixes; gint xfixes_event_base; diff --git a/gdk/x11/gdkdrawable-x11.c b/gdk/x11/gdkdrawable-x11.c index 371f648839..72dfb35592 100644 --- a/gdk/x11/gdkdrawable-x11.c +++ b/gdk/x11/gdkdrawable-x11.c @@ -321,6 +321,36 @@ _gdk_x11_have_render (GdkDisplay *display) return x11display->have_render == GDK_YES; } +gboolean +_gdk_x11_have_render_with_trapezoids (GdkDisplay *display) +{ + Display *xdisplay = GDK_DISPLAY_XDISPLAY (display); + GdkDisplayX11 *x11display = GDK_DISPLAY_X11 (display); + + if (x11display->have_render_with_trapezoids == GDK_UNKNOWN) + if (!_gdk_x11_have_render (display)) + x11display->have_render_with_trapezoids = GDK_NO; + else + { + /* + * Require protocol >= 0.4 for CompositeTrapezoids support. + */ + int major_version, minor_version; + +#define XRENDER_TETRAPEZOIDS_MAJOR 0 +#define XRENDER_TETRAPEZOIDS_MINOR 4 + + if (XRenderQueryVersion (xdisplay, &major_version, + &minor_version)) + if ((major_version < XRENDER_TETRAPEZOIDS_MAJOR) || + ((major_version == XRENDER_TETRAPEZOIDS_MAJOR) && + (minor_version < XRENDER_TETRAPEZOIDS_MINOR))) + x11display->have_render_with_trapezoids = GDK_NO; + } + + return x11display->have_render_with_trapezoids == GDK_YES; +} + static XftDraw * gdk_x11_drawable_get_xft_draw (GdkDrawable *drawable) { @@ -1496,7 +1526,7 @@ gdk_x11_draw_trapezoids (GdkDrawable *drawable, XTrapezoid *xtrapezoids; gint i; - if (!_gdk_x11_have_render (display)) + if (!_gdk_x11_have_render_with_trapezoids (display)) { GdkDrawable *wrapper = GDK_DRAWABLE_IMPL_X11 (drawable)->wrapper; GDK_DRAWABLE_CLASS (parent_class)->draw_trapezoids (wrapper, gc, @@ -1603,7 +1633,7 @@ _gdk_x11_drawable_draw_xtrapezoids (GdkDrawable *drawable, XftDraw *draw; - if (!_gdk_x11_have_render (display)) + if (!_gdk_x11_have_render_with_trapezoids (display)) { /* This is the case of drawing the borders of the unknown glyph box * without render on the display, we need to feed it back to diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h index d48940fb5e..3152375d96 100644 --- a/gdk/x11/gdkprivate-x11.h +++ b/gdk/x11/gdkprivate-x11.h @@ -108,7 +108,9 @@ gint _gdk_send_xevent (GdkDisplay *display, GType _gdk_gc_x11_get_type (void); -gboolean _gdk_x11_have_render (GdkDisplay *display); +gboolean _gdk_x11_have_render (GdkDisplay *display); +gboolean _gdk_x11_have_render_with_trapezoids (GdkDisplay *display); + Picture _gdk_x11_gc_get_fg_picture (GdkGC *gc); void _gdk_gc_x11_get_fg_xft_color (GdkGC *gc, XftColor *xftcolor);