]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkhsv.c
fix recent files issues
[~andy/gtk] / gtk / gtkhsv.c
index 36908b707ffb27b482f4b03d4041c57541f5497c..0bd8ff2decb78aedff2a26622783332b9bc0c0d2 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,
@@ -917,26 +884,6 @@ gtk_hsv_motion (GtkWidget      *widget,
 
 /* Redrawing */
 
-static void
-set_source_surface (cairo_t         *cr,
-                   cairo_surface_t *surface)
-{
-  cairo_pattern_t *pattern;
-  cairo_matrix_t *matrix;
-  double x, y;
-
-  pattern = cairo_pattern_create_for_surface (surface);
-  
-  cairo_current_point (cr, &x, &y);
-  matrix = cairo_matrix_create ();
-  cairo_matrix_translate (matrix, -x, -y);
-  cairo_pattern_set_matrix (pattern, matrix);
-  cairo_matrix_destroy (matrix);
-
-  cairo_set_source (cr, pattern);
-  cairo_pattern_destroy (pattern);
-}
-
 /* Paints the hue ring */
 static void
 paint_ring (GtkHSV      *hsv,
@@ -1018,8 +965,7 @@ paint_ring (GtkHSV      *hsv,
   /* Now draw the value marker onto the source image, so that it
    * will get properly clipped at the edges of the ring
    */
-  source_cr = cairo_create ();
-  cairo_set_target_surface (source_cr, source);
+  source_cr = cairo_create (source);
   
   r = priv->h;
   g = 1.0;
@@ -1042,8 +988,7 @@ paint_ring (GtkHSV      *hsv,
 
   cairo_save (cr);
     
-  cairo_move_to (cr, x, y);
-  set_source_surface (cr, source);
+  cairo_set_source_surface (cr, source, x, y);
   cairo_surface_destroy (source);
 
   cairo_set_line_width (cr, priv->ring_width);
@@ -1102,7 +1047,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;
@@ -1200,10 +1145,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);
                
@@ -1211,6 +1160,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;
       }
     }
 
@@ -1220,8 +1174,7 @@ paint_triangle (GtkHSV      *hsv,
   
   /* Draw a triangle with the image as a source */
 
-  cairo_move_to (cr, x, y);
-  set_source_surface (cr, source);
+  cairo_set_source_surface (cr, source, x, y);
   cairo_surface_destroy (source);
   
   cairo_move_to (cr, x1, y1);
@@ -1321,14 +1274,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),
@@ -1432,7 +1386,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);