#include "gtkbindings.h"
#include "gtkcontainer.h"
#include "gtkmarshalers.h"
+#include "gtkintl.h"
#include "gtkalias.h"
/*
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);
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;
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),
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),
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 */
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);
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 */
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);
}
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 */
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 */
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;
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;
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,
GtkHSV *hsv;
HSVPrivate *priv;
double x, y;
- gint ix, iy;
GdkModifierType mods;
hsv = GTK_HSV (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);
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;
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);
(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;
}
}
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),
{
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);