Hey Erwann,

Can we move this repository out onto opensolaris.org? Dermot's probably the guy
to ask about it to preserve the history.


Glynn

Erwann Chenede wrote:
> Hi All,
> 
> Here is a diff for the nimbus theme engine which fixes 6514195, 6530991
> and 6453340.
> For 6514195, 6530991 the problem was to check for sane image dimensions
> before drawing them,
> For 6453340 the problem was that the cached clipping GC mechanism wasn't
> multihead ready.
> 
> Here is the diff for spec-files:
> 
> 
> Index: base-specs/nimbus.spec
> ===================================================================
> --- base-specs/nimbus.spec      (revision 10875)
> +++ base-specs/nimbus.spec      (working copy)
> @@ -9,7 +9,7 @@
> #
> Name:         nimbus
> Summary:      Engine for GTK2 Nimbus Theme
> -Version:      0.0.4
> +Version:      0.0.5
> %define tarball_version %{version}
> Release:      1
> License:      LGPL
> 
> Here is the diff from nimbus:
> 
> 
> Index: ChangeLog
> ===================================================================
> RCS file: /sgnome/cvsroots/jds/Nimbus/ChangeLog,v
> retrieving revision 1.19
> diff -u -b -r1.19 ChangeLog
> --- ChangeLog    11 Oct 2006 15:11:31 -0000    1.19
> +++ ChangeLog    14 Mar 2007 16:21:53 -0000
> @@ -1,3 +1,9 @@
> +2007-03-14 Erwann Chenede - <erwann.chenede at sun.com>
> +
> +  * gtk-engine/nimbus_style.c : added sanity checks to fix : 6514195,
> 6530991.
> +    I've rewritten to caching routine for clipping GC's as it wasn't
> +    multihead proof. it fixes 6453340
> +
> 2006-10-11 Erwann Chenede - <erwann.chenede at sun.com>
> 
>   * gtk-engine/gtk-2.0/dialog* : changed image size
> Index: configure.in
> ===================================================================
> RCS file: /sgnome/cvsroots/jds/Nimbus/configure.in,v
> retrieving revision 1.8
> diff -u -b -r1.8 configure.in
> --- configure.in    11 Oct 2006 15:11:31 -0000    1.8
> +++ configure.in    14 Mar 2007 16:21:53 -0000
> @@ -2,7 +2,7 @@
> ACLOCAL="$ACLOCAL $ACLOCAL_FLAGS"
> 
> AC_INIT(metacity)
> -AM_INIT_AUTOMAKE(nimbus, 0.0.4)
> +AM_INIT_AUTOMAKE(nimbus, 0.0.5)
> DISTDIR=${PACKAGE}-${VERSION}
> AM_MAINTAINER_MODE
> 
> Index: gtk-engine/nimbus_style.c
> ===================================================================
> RCS file: /sgnome/cvsroots/jds/Nimbus/gtk-engine/nimbus_style.c,v
> retrieving revision 1.16
> diff -u -b -r1.16 nimbus_style.c
> --- gtk-engine/nimbus_style.c    11 Oct 2006 15:11:31 -0000    1.16
> +++ gtk-engine/nimbus_style.c    14 Mar 2007 16:21:53 -0000
> @@ -104,22 +104,52 @@
> 
> static GtkStyleClass *parent_class;
> 
> +static gboolean check_sane_pixbuf_value (int src_x, int src_y, int
> width, int height, GdkPixbuf *pixbuf)
> +{
> +  /*printf ("checking src_x = %d, int src_y = %d, int width = %d, int
> height = %d , pixbuf->height = %d, pixbuf->width = %d\n",
> +      src_x, src_y, width, height, gdk_pixbuf_get_width (pixbuf),
> gdk_pixbuf_get_height (pixbuf));*/
> +
> +  if (!(width >= 0 && height >= 0))
> +    {
> +      /* printf (" (%d >= 0 && %d >= 0) is false\n", width, height); */
> +      return FALSE;
> +    }
> +  if (!(src_x >= 0 && src_x + width <= gdk_pixbuf_get_width (pixbuf)))
> +    {
> +      /* printf (" (%d >= 0 && %d + %d <= %d) is false\n", src_x ,
> src_x,  width , gdk_pixbuf_get_width (pixbuf)); */
> +      return FALSE;
> +    }
> +  if (!(src_y >= 0 && src_y + height <= gdk_pixbuf_get_height (pixbuf)))
> +    {
> +      /* printf (" (%d >= 0 && %d + %d <= %d) is false\n", src_y,
> src_y,  height, gdk_pixbuf_get_height (pixbuf)); */
> +      return FALSE;
> +    }
> +  return TRUE;
> +}
> static GdkGC *
> get_clipping_gc (GdkWindow* window, GdkRectangle *clip)
> {
> -  static GdkGC *clipping_gc = NULL;
> -  if (clip)
> -    {
> -      if (!clipping_gc)
> -    clipping_gc = gdk_gc_new (window);
> +  GdkGC *gc;
> +  static GSList *clipping_gc_list = NULL;
> +  GSList* tmp = clipping_gc_list;
>      -      gdk_gc_set_clip_rectangle (clipping_gc, clip);
> -      return clipping_gc;
> +  while (tmp)
> +    {
> +      gc = (GdkGC *) tmp->data;
> +      if (gdk_gc_get_screen (gc) ==
> +      gdk_drawable_get_screen (GDK_DRAWABLE (window)))
> +    {
> +      gdk_gc_set_clip_rectangle (gc, clip);
> +      return gc;
>     }
> -  return NULL;
> +      tmp = tmp->next;
> +    }
> +  gc =  gdk_gc_new (window);
> +  gdk_gc_set_clip_rectangle (gc, clip);
> +  clipping_gc_list = g_slist_append (clipping_gc_list, gc);
> +  return gc;
> }
>  
> -
> static GtkWidget *print_ancestors (GtkWidget *widget)
> {
>   GtkWidget *tmp;
> @@ -1143,6 +1173,8 @@
>   if ((state_type != GTK_STATE_INSENSITIVE) && drop_shadow && draw_bottom)
>     {
>       nimbus_init_button_drop_shadow (rc, state_type, width);
> +
> +      if (check_sane_pixbuf_value (0, 0, width - (bottom_left_c_w +
> bottom_right_c_w),  gdk_pixbuf_get_height (rc->drop_shadow[state_type]),
> rc->drop_shadow[state_type]))
>       gdk_draw_pixbuf (window,
>                get_clipping_gc (window, area),
>                rc->drop_shadow[state_type],
> @@ -1218,7 +1250,6 @@
>            gdk_pixbuf_get_width (progress->corner_bottom_left),
>            gdk_pixbuf_get_height (progress->corner_bottom_left),
>            GDK_RGB_DITHER_NONE,0,0);
> -
>   gdk_draw_pixbuf (window,                        get_clipping_gc
> (window, area),
>            progress->corner_bottom_right,
> @@ -1230,6 +1261,7 @@
>            GDK_RGB_DITHER_NONE,0,0);
>   /* lines */
>  
> +  if (check_sane_pixbuf_value (0, 0, gdk_pixbuf_get_width
> (progress->border_left), height - 1, progress->border_left))
>   gdk_draw_pixbuf (window,                        get_clipping_gc
> (window, area),
>            progress->border_left,
> @@ -1240,6 +1272,8 @@
>            height - 1,
>            GDK_RGB_DITHER_NONE,0,0);
> 
> +  if (check_sane_pixbuf_value (0,0, gdk_pixbuf_get_width
> (progress->border_right), height - 1, progress->border_right))
> +
>   gdk_draw_pixbuf (window,                        get_clipping_gc
> (window, area),
>            progress->border_right,
> @@ -1250,6 +1284,8 @@
>            height - 1,
>            GDK_RGB_DITHER_NONE,0,0);
> 
> +
> +  if (check_sane_pixbuf_value (0,0,width + 1,  gdk_pixbuf_get_height
> (progress->border_top),  progress->border_top))
>   gdk_draw_pixbuf (window,                        get_clipping_gc
> (window, area),
>            progress->border_top,
> @@ -1260,6 +1296,7 @@
>            gdk_pixbuf_get_height (progress->border_top),
>            GDK_RGB_DITHER_NONE,0,0);
> 
> +  if (check_sane_pixbuf_value (0,0, width + 1,   gdk_pixbuf_get_height
> (progress->border_bottom), progress->border_bottom))
>   gdk_draw_pixbuf (window,                        get_clipping_gc
> (window, area),
>            progress->border_bottom,
> 
> 

Reply via email to