Re: Wimp tab rendering patch



On Sun, 2007-04-01 at 11:20 -0500, Cody Russell wrote:
> On Sun, 2007-04-01 at 11:03 +0200, Arnaud Charlet wrote:
> > > When the tabs are on the left, right, or bottom then the results are
> > > worse.
> > 
> > Right, that's the main issue with this patch. Strange that I get not so
> > good results even with top tabs.
> > 
> > > The bug #399253 is, I think, a separate issue.. that happens
> > > when the notebook receives expose events or something.  As it is right
> > > now (without your patch), the tabs look pretty decent when they're first
> > > drawn or when the entire widget exposes.. but when it receives partial
> > > expose events it gets really screwed up.  I tried looking into that, but
> > > didn't put much time into it.
> > 
> > In the mean time, I've reverted the draw_extension function in msw_style.c
> > to what it was in Gtk+ 2.8.20 to avoid this very annoying (to us) glitch,
> > seems to be good enough for now, and certainly better than having bad redraws.

Sorry, here's a better version of that patch.  The last one leaked a
pixmap.

/ Cody
Index: msw_style.c
===================================================================
--- msw_style.c	(revision 17574)
+++ msw_style.c	(working copy)
@@ -2466,18 +2466,12 @@
 	      }
 	    else if (real_gap_side == GTK_POS_BOTTOM)
 	      {
-		x2 = x;
-		y2 = y + (state_type == GTK_STATE_NORMAL ? 0 : notebook->tab_vborder);
+		x2 = 0;
+		y2 = 0;
 		w2 = width;
 		h2 = height - (state_type == GTK_STATE_NORMAL ? 0 : notebook->tab_vborder * 2);
-		target = window;
-
-		/* If we are currently drawing the right-most tab (any state)... */
-		if (widget->allocation.x + widget->allocation.width - border_width == x + width)
-		  {
-		    x2--;
-		    w2--;
-		  }
+		pixmap = gdk_pixmap_new (window, w2, h2, -1);
+		target = pixmap;
 	      }
 
 	    if (xp_theme_draw (target, tab_part, style, x2, y2, w2, h2, state_type, NULL /*area*/))
@@ -2526,10 +2520,23 @@
 				   h2--;
 				 }
 			     }
+                           else if (real_gap_side == GTK_POS_BOTTOM)
+                             {
+				x2 = x;
+				y2 = y + (state_type == GTK_STATE_NORMAL ? 0 : notebook->tab_vborder);
+				w2 = width;
+				h2 = height - (state_type == GTK_STATE_NORMAL ? 0 : notebook->tab_vborder * 2);
+				/* If we are currently drawing the right-most tab (any state)... */
+				if (widget->allocation.x + widget->allocation.width - border_width == x + width)
+				  {
+				    x2--;
+				    w2--;
+				  }
+                             }
 
 			   gdk_draw_pixbuf (window, NULL, pixbuf, 0, 0, x2, y2, w2, h2, GDK_RGB_DITHER_NONE, 0, 0);
 
-			   if (real_gap_side == GTK_POS_LEFT || real_gap_side == GTK_POS_RIGHT)
+			   if (real_gap_side == GTK_POS_LEFT || real_gap_side == GTK_POS_RIGHT || real_gap_side == GTK_POS_BOTTOM)
 			     {
 			       g_object_unref (pixmap);
 			     }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]