]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkhsv.c
fix up if-condition to only set the true arrow type if show_sort_indicator
[~andy/gtk] / gtk / gtkhsv.c
index 20ca50c63c73f4841667354efe9f6e7d88dee65e..58c4494809d6ac2a8a7c97249d2b04f0f44ff652 100644 (file)
@@ -30,6 +30,7 @@
 #include "gtkbindings.h"
 #include "gtkcontainer.h"
 #include "gtkmarshalers.h"
+#include "gtkintl.h"
 #include "gtkalias.h"
 
 /*
@@ -87,8 +88,6 @@ enum {
   LAST_SIGNAL
 };
 
-static void     gtk_hsv_class_init     (GtkHSVClass      *class);
-static void     gtk_hsv_init           (GtkHSV           *hsv);
 static void     gtk_hsv_destroy        (GtkObject        *object);
 static void     gtk_hsv_map            (GtkWidget        *widget);
 static void     gtk_hsv_unmap          (GtkWidget        *widget);
@@ -106,64 +105,32 @@ static gint     gtk_hsv_motion         (GtkWidget        *widget,
                                        GdkEventMotion   *event);
 static gint     gtk_hsv_expose         (GtkWidget        *widget,
                                        GdkEventExpose   *event);
+static gboolean gtk_hsv_grab_broken    (GtkWidget          *widget,
+                                       GdkEventGrabBroken *event);
 static gboolean gtk_hsv_focus          (GtkWidget        *widget,
                                        GtkDirectionType  direction);
 static void     gtk_hsv_move           (GtkHSV           *hsv,
                                        GtkDirectionType  dir);
 
 static guint hsv_signals[LAST_SIGNAL];
-static GtkWidgetClass *parent_class;
 
-
-/**
- * gtk_hsv_get_type:
- * @void:
- *
- * Registers the &GtkHSV class if necessary, and returns the type ID associated
- * to it.
- *
- * Return value: The type ID of the &GtkHSV class.
- **/
-GType
-gtk_hsv_get_type (void)
-{
-  static GType hsv_type = 0;
-  
-  if (!hsv_type) {
-    static const GTypeInfo hsv_info = {
-      sizeof (GtkHSVClass),
-      NULL,            /* base_init */
-      NULL,            /* base_finalize */
-      (GClassInitFunc) gtk_hsv_class_init,
-      NULL,            /* class_finalize */
-      NULL,            /* class_data */
-      sizeof (GtkHSV),
-      0,               /* n_preallocs */
-      (GInstanceInitFunc) gtk_hsv_init,
-    };
-    
-    hsv_type = g_type_register_static (GTK_TYPE_WIDGET, "GtkHSV",
-                                      &hsv_info, 0);
-  }
-  
-  return hsv_type;
-}
+G_DEFINE_TYPE (GtkHSV, gtk_hsv, GTK_TYPE_WIDGET)
 
 /* Class initialization function for the HSV color selector */
 static void
 gtk_hsv_class_init (GtkHSVClass *class)
 {
+  GObjectClass   *gobject_class;
   GtkObjectClass *object_class;
   GtkWidgetClass *widget_class;
   GtkHSVClass    *hsv_class;
   GtkBindingSet  *binding_set;
   
+  gobject_class = (GObjectClass *) class;
   object_class = (GtkObjectClass *) class;
   widget_class = (GtkWidgetClass *) class;
   hsv_class = GTK_HSV_CLASS (class);
   
-  parent_class = g_type_class_peek_parent (class);
-  
   object_class->destroy = gtk_hsv_destroy;
   
   widget_class->map = gtk_hsv_map;
@@ -177,11 +144,12 @@ gtk_hsv_class_init (GtkHSVClass *class)
   widget_class->motion_notify_event = gtk_hsv_motion;
   widget_class->expose_event = gtk_hsv_expose;
   widget_class->focus = gtk_hsv_focus;
+  widget_class->grab_broken_event = gtk_hsv_grab_broken;
   
   hsv_class->move = gtk_hsv_move;
   
   hsv_signals[CHANGED] =
-    g_signal_new ("changed",
+    g_signal_new (I_("changed"),
                  G_OBJECT_CLASS_TYPE (object_class),
                  G_SIGNAL_RUN_FIRST,
                  G_STRUCT_OFFSET (GtkHSVClass, changed),
@@ -190,7 +158,7 @@ gtk_hsv_class_init (GtkHSVClass *class)
                  G_TYPE_NONE, 0);
 
   hsv_signals[MOVE] =
-    g_signal_new ("move",
+    g_signal_new (I_("move"),
                  G_OBJECT_CLASS_TYPE (object_class),
                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (GtkHSVClass, move),
@@ -229,6 +197,8 @@ gtk_hsv_class_init (GtkHSVClass *class)
   gtk_binding_entry_add_signal (binding_set, GDK_KP_Left, 0,
                                 "move", 1,
                                 G_TYPE_ENUM, GTK_DIR_LEFT);
+
+  g_type_class_add_private (gobject_class, sizeof (HSVPrivate));   
 }
 
 /* Object initialization function for the HSV color selector */
@@ -236,10 +206,11 @@ static void
 gtk_hsv_init (GtkHSV *hsv)
 {
   HSVPrivate *priv;
+
+  priv = G_TYPE_INSTANCE_GET_PRIVATE (hsv, GTK_TYPE_HSV, HSVPrivate);
   
-  priv = g_new0 (HSVPrivate, 1);
   hsv->priv = priv;
-  
+
   GTK_WIDGET_SET_FLAGS (hsv, GTK_NO_WINDOW);
   GTK_WIDGET_SET_FLAGS (hsv, GTK_CAN_FOCUS);
   
@@ -255,19 +226,7 @@ gtk_hsv_init (GtkHSV *hsv)
 static void
 gtk_hsv_destroy (GtkObject *object)
 {
-  GtkHSV *hsv;
-  
-  g_return_if_fail (GTK_IS_HSV (object));
-  
-  hsv = GTK_HSV (object);
-
-  if (hsv->priv)
-    {
-      g_free (hsv->priv);
-      hsv->priv = NULL;
-    }
-
-  GTK_OBJECT_CLASS (parent_class)->destroy (object);
+  GTK_OBJECT_CLASS (gtk_hsv_parent_class)->destroy (object);
 }
 
 /* Default signal handlers */
@@ -284,7 +243,7 @@ gtk_hsv_map (GtkWidget *widget)
   hsv = GTK_HSV (widget);
   priv = hsv->priv;
 
-  GTK_WIDGET_CLASS (parent_class)->map (widget);
+  GTK_WIDGET_CLASS (gtk_hsv_parent_class)->map (widget);
 
   gdk_window_show (priv->window);
 }
@@ -302,7 +261,7 @@ gtk_hsv_unmap (GtkWidget *widget)
 
   gdk_window_hide (priv->window);
 
-  GTK_WIDGET_CLASS (parent_class)->unmap (widget);
+  GTK_WIDGET_CLASS (gtk_hsv_parent_class)->unmap (widget);
 }                                                                           
                                       
 /* Realize handler for the HSV color selector */
@@ -370,8 +329,8 @@ gtk_hsv_unrealize (GtkWidget *widget)
   g_object_unref (priv->gc);
   priv->gc = NULL;
   
-  if (GTK_WIDGET_CLASS (parent_class)->unrealize)
-    GTK_WIDGET_CLASS (parent_class)->unrealize (widget);
+  if (GTK_WIDGET_CLASS (gtk_hsv_parent_class)->unrealize)
+    GTK_WIDGET_CLASS (gtk_hsv_parent_class)->unrealize (widget);
 }
 
 /* Size_request handler for the HSV color selector */
@@ -628,13 +587,10 @@ compute_sv (GtkHSV  *hsv,
            gdouble *s,
            gdouble *v)
 {
-  HSVPrivate *priv;
   int ihx, ihy, isx, isy, ivx, ivy;
   double hx, hy, sx, sy, vx, vy;
   double center;
   
-  priv = hsv->priv;
-  
   compute_triangle (hsv, &ihx, &ihy, &isx, &isy, &ivx, &ivy);
   center = GTK_WIDGET (hsv)->requisition.width / 2.0;
   hx = ihx - center;
@@ -732,13 +688,10 @@ compute_v (GtkHSV *hsv,
           gdouble x,
           gdouble y)
 {
-  HSVPrivate *priv;
   double center;
   double dx, dy;
   double angle;
   
-  priv = hsv->priv;
-  
   center = GTK_WIDGET (hsv)->requisition.width / 2.0;
   dx = x - center;
   dy = center - y;
@@ -773,6 +726,20 @@ set_cross_grab (GtkHSV *hsv,
   gdk_cursor_unref (cursor);
 }
 
+static gboolean 
+gtk_hsv_grab_broken (GtkWidget          *widget,
+                    GdkEventGrabBroken *event)
+{
+  GtkHSV *hsv = GTK_HSV (widget);
+  HSVPrivate *priv;
+  
+  priv = hsv->priv;
+  
+  priv->mode = DRAG_NONE;
+  
+  return TRUE;
+}
+
 /* Button_press_event handler for the HSV color selector */
 static gint
 gtk_hsv_button_press (GtkWidget      *widget,
@@ -875,7 +842,6 @@ gtk_hsv_motion (GtkWidget      *widget,
   GtkHSV *hsv;
   HSVPrivate *priv;
   double x, y;
-  gint ix, iy;
   GdkModifierType mods;
   
   hsv = GTK_HSV (widget);
@@ -884,18 +850,11 @@ gtk_hsv_motion (GtkWidget      *widget,
   if (priv->mode == DRAG_NONE)
     return FALSE;
   
-  if (event->is_hint)
-    {
-      gdk_window_get_pointer (priv->window, &ix, &iy, &mods);
-      x = ix;
-      y = iy;
-    }
-  else
-    {
-      x = event->x;
-      y = event->y;
-    }
-  
+  gdk_event_request_motions (event);
+  x = event->x;
+  y = event->y;
+  mods = event->state;
+
   if (priv->mode == DRAG_H)
     {
       gtk_hsv_set_color (hsv, compute_v (hsv, x, y), priv->s, priv->v);
@@ -1080,7 +1039,7 @@ paint_triangle (GtkHSV      *hsv,
   gint x2, y2, r2, g2, b2; /* Second vertex */
   gint x3, y3, r3, g3, b3; /* Third vertex */
   gint t;
-  guint32 *buf, *p;
+  guint32 *buf, *p, c;
   gint xl, xr, rl, rr, gl, gr, bl, br; /* Scanline data */
   gint xx, yy;
   gint x_interp, y_interp;
@@ -1178,10 +1137,14 @@ paint_triangle (GtkHSV      *hsv,
 
        x_start = MAX (xl - PAD, x);
        x_end = MIN (xr + PAD, x + width);
+       x_start = MIN (x_start, x_end);
 
-       p += (x_start - x);
+       c = (rl << 16) | (gl << 8) | bl;
 
-       for (xx = x_start; xx < x_end; xx++)
+       for (xx = x; xx < x_start; xx++)
+         *p++ = c;
+         
+       for (; xx < x_end; xx++)
          {
            x_interp = CLAMP (xx, xl, xr);
                
@@ -1189,6 +1152,11 @@ paint_triangle (GtkHSV      *hsv,
                    (LERP (gl, gr, xl, xr, x_interp) << 8) |
                    LERP (bl, br, xl, xr, x_interp));
          }
+
+       c = (rr << 16) | (gr << 8) | br;
+
+       for (; xx < x + width; xx++)
+         *p++ = c;
       }
     }
 
@@ -1298,14 +1266,15 @@ gtk_hsv_expose (GtkWidget      *widget,
   if (!gdk_rectangle_intersect (&event->area, &rect, &dest))
     return FALSE;
   
-  cr = gdk_drawable_create_cairo_context (widget->window);
+  cr = gdk_cairo_create (widget->window);
 
   cairo_translate (cr, widget->allocation.x, widget->allocation.y);
   paint (hsv, cr,
         dest.x - widget->allocation.x,
         dest.y - widget->allocation.y,
         dest.width, dest.height);
-  
+  cairo_destroy (cr);
+
   if (GTK_WIDGET_HAS_FOCUS (hsv) && priv->focus_on_ring)
     gtk_paint_focus (widget->style, widget->window,
                     GTK_WIDGET_STATE (widget),
@@ -1409,7 +1378,6 @@ gtk_hsv_set_color (GtkHSV *hsv,
 {
   HSVPrivate *priv;
   
-  g_return_if_fail (hsv != NULL);
   g_return_if_fail (GTK_IS_HSV (hsv));
   g_return_if_fail (h >= 0.0 && h <= 1.0);
   g_return_if_fail (s >= 0.0 && s <= 1.0);