diff options
author | Tristan Van Berkom <tristan.van.berkom@gmail.com> | 2010-08-30 14:56:28 +0900 |
---|---|---|
committer | Tristan Van Berkom <tristan.van.berkom@gmail.com> | 2010-08-30 14:56:28 +0900 |
commit | 54d44a9bd04cfbed8426614fc69c027a46f41a14 (patch) | |
tree | 34bdf65a6e8d5d6d4016154345d1d803ba0da379 /gtk/gtkhsv.c | |
parent | b3b22c31b997fb85b3319b392a1a69407703184c (diff) | |
parent | 67194ed77b153eb5a7eb6c596f3c20e274b7787a (diff) | |
download | gtk+-native-layout.tar.gz |
Merge branch 'master' into native-layoutnative-layout
Conflicts:
gtk/gtkplug.c
gtk/gtkscrolledwindow.c
Diffstat (limited to 'gtk/gtkhsv.c')
-rw-r--r-- | gtk/gtkhsv.c | 176 |
1 files changed, 101 insertions, 75 deletions
diff --git a/gtk/gtkhsv.c b/gtk/gtkhsv.c index c8758b297c..9d936a0062 100644 --- a/gtk/gtkhsv.c +++ b/gtk/gtkhsv.c @@ -56,7 +56,7 @@ typedef enum { } DragMode; /* Private part of the GtkHSV structure */ -struct _GtkHSVPriv +struct _GtkHSVPrivate { /* Color value */ double h; @@ -195,16 +195,16 @@ gtk_hsv_class_init (GtkHSVClass *class) "move", 1, G_TYPE_ENUM, GTK_DIR_LEFT); - g_type_class_add_private (gobject_class, sizeof (GtkHSVPriv)); + g_type_class_add_private (gobject_class, sizeof (GtkHSVPrivate)); } /* Object initialization function for the HSV color selector */ static void gtk_hsv_init (GtkHSV *hsv) { - GtkHSVPriv *priv; + GtkHSVPrivate *priv; - priv = G_TYPE_INSTANCE_GET_PRIVATE (hsv, GTK_TYPE_HSV, GtkHSVPriv); + priv = G_TYPE_INSTANCE_GET_PRIVATE (hsv, GTK_TYPE_HSV, GtkHSVPrivate); hsv->priv = priv; @@ -235,7 +235,7 @@ static void gtk_hsv_map (GtkWidget *widget) { GtkHSV *hsv = GTK_HSV (widget); - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; GTK_WIDGET_CLASS (gtk_hsv_parent_class)->map (widget); @@ -248,7 +248,7 @@ static void gtk_hsv_unmap (GtkWidget *widget) { GtkHSV *hsv = GTK_HSV (widget); - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; gdk_window_hide (priv->window); @@ -260,7 +260,8 @@ static void gtk_hsv_realize (GtkWidget *widget) { GtkHSV *hsv = GTK_HSV (widget); - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; + GtkAllocation allocation; GdkWindow *parent_window; GdkWindowAttr attr; int attr_mask; @@ -268,12 +269,14 @@ gtk_hsv_realize (GtkWidget *widget) gtk_widget_set_realized (widget, TRUE); /* Create window */ - + + gtk_widget_get_allocation (widget, &allocation); + attr.window_type = GDK_WINDOW_CHILD; - attr.x = widget->allocation.x; - attr.y = widget->allocation.y; - attr.width = widget->allocation.width; - attr.height = widget->allocation.height; + attr.x = allocation.x; + attr.y = allocation.y; + attr.width = allocation.width; + attr.height = allocation.height; attr.wclass = GDK_INPUT_ONLY; attr.event_mask = gtk_widget_get_events (widget); attr.event_mask |= (GDK_KEY_PRESS_MASK @@ -282,18 +285,16 @@ gtk_hsv_realize (GtkWidget *widget) | GDK_POINTER_MOTION_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); - attr_mask = GDK_WA_X | GDK_WA_Y; - + parent_window = gtk_widget_get_parent_window (widget); - - widget->window = parent_window; - g_object_ref (widget->window); - + gtk_widget_set_window (widget, parent_window); + g_object_ref (parent_window); + priv->window = gdk_window_new (parent_window, &attr, attr_mask); gdk_window_set_user_data (priv->window, hsv); - - widget->style = gtk_style_attach (widget->style, widget->window); + + gtk_widget_style_attach (widget); } /* Unrealize handler for the HSV color selector */ @@ -301,7 +302,7 @@ static void gtk_hsv_unrealize (GtkWidget *widget) { GtkHSV *hsv = GTK_HSV (widget); - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; gdk_window_set_user_data (priv->window, NULL); gdk_window_destroy (priv->window); @@ -316,7 +317,7 @@ gtk_hsv_size_request (GtkWidget *widget, GtkRequisition *requisition) { GtkHSV *hsv = GTK_HSV (widget); - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; gint focus_width; gint focus_pad; @@ -335,10 +336,10 @@ gtk_hsv_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GtkHSV *hsv = GTK_HSV (widget); - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; + + gtk_widget_set_allocation (widget, allocation); - widget->allocation = *allocation; - if (gtk_widget_get_realized (widget)) gdk_window_move_resize (priv->window, allocation->x, @@ -510,14 +511,18 @@ compute_triangle (GtkHSV *hsv, gint *vx, gint *vy) { - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; + GtkAllocation allocation; + GtkWidget *widget = GTK_WIDGET (hsv); gdouble center_x; gdouble center_y; gdouble inner, outer; gdouble angle; - center_x = GTK_WIDGET (hsv)->allocation.width / 2.0; - center_y = GTK_WIDGET (hsv)->allocation.height / 2.0; + gtk_widget_get_allocation (widget, &allocation); + + center_x = allocation.width / 2.0; + center_y = allocation.height / 2.0; outer = priv->size / 2.0; inner = outer - priv->ring_width; angle = priv->h * 2.0 * G_PI; @@ -536,14 +541,18 @@ is_in_ring (GtkHSV *hsv, gdouble x, gdouble y) { - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; + GtkAllocation allocation; + GtkWidget *widget = GTK_WIDGET (hsv); gdouble dx, dy, dist; gdouble center_x; gdouble center_y; gdouble inner, outer; - center_x = GTK_WIDGET (hsv)->allocation.width / 2.0; - center_y = GTK_WIDGET (hsv)->allocation.height / 2.0; + gtk_widget_get_allocation (widget, &allocation); + + center_x = allocation.width / 2.0; + center_y = allocation.height / 2.0; outer = priv->size / 2.0; inner = outer - priv->ring_width; @@ -562,14 +571,18 @@ compute_sv (GtkHSV *hsv, gdouble *s, gdouble *v) { + GtkWidget *widget = GTK_WIDGET (hsv); + GtkAllocation allocation; int ihx, ihy, isx, isy, ivx, ivy; double hx, hy, sx, sy, vx, vy; double center_x; double center_y; + gtk_widget_get_allocation (widget, &allocation); + compute_triangle (hsv, &ihx, &ihy, &isx, &isy, &ivx, &ivy); - center_x = GTK_WIDGET (hsv)->allocation.width / 2.0; - center_y = GTK_WIDGET (hsv)->allocation.height / 2.0; + center_x = allocation.width / 2.0; + center_y = allocation.height / 2.0; hx = ihx - center_x; hy = center_y - ihy; sx = isx - center_x; @@ -665,13 +678,17 @@ compute_v (GtkHSV *hsv, gdouble x, gdouble y) { + GtkAllocation allocation; + GtkWidget *widget = GTK_WIDGET (hsv); double center_x; double center_y; double dx, dy; double angle; - center_x = GTK_WIDGET (hsv)->allocation.width / 2.0; - center_y = GTK_WIDGET (hsv)->allocation.height / 2.0; + gtk_widget_get_allocation (widget, &allocation); + + center_x = allocation.width / 2.0; + center_y = allocation.height / 2.0; dx = x - center_x; dy = center_y - y; @@ -688,7 +705,7 @@ static void set_cross_grab (GtkHSV *hsv, guint32 time) { - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; GdkCursor *cursor; cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (hsv)), @@ -708,7 +725,7 @@ gtk_hsv_grab_broken (GtkWidget *widget, GdkEventGrabBroken *event) { GtkHSV *hsv = GTK_HSV (widget); - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; priv->mode = DRAG_NONE; @@ -721,7 +738,7 @@ gtk_hsv_button_press (GtkWidget *widget, GdkEventButton *event) { GtkHSV *hsv = GTK_HSV (widget); - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; double x, y; if (priv->mode != DRAG_NONE || event->button != 1) @@ -771,7 +788,7 @@ gtk_hsv_button_release (GtkWidget *widget, GdkEventButton *event) { GtkHSV *hsv = GTK_HSV (widget); - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; DragMode mode; gdouble x, y; @@ -809,7 +826,7 @@ gtk_hsv_motion (GtkWidget *widget, GdkEventMotion *event) { GtkHSV *hsv = GTK_HSV (widget); - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; GdkModifierType mods; double x, y; @@ -851,7 +868,8 @@ paint_ring (GtkHSV *hsv, gint width, gint height) { - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; + GtkAllocation allocation; GtkWidget *widget = GTK_WIDGET (hsv); int xx, yy; gdouble dx, dy, dist; @@ -872,11 +890,11 @@ paint_ring (GtkHSV *hsv, "focus-line-width", &focus_width, "focus-padding", &focus_pad, NULL); - - priv = hsv->priv; - center_x = widget->allocation.width / 2.0; - center_y = widget->allocation.height / 2.0; + gtk_widget_get_allocation (widget, &allocation); + + center_x = allocation.width / 2.0; + center_y = allocation.height / 2.0; outer = priv->size / 2.0; inner = outer - priv->ring_width; @@ -1002,7 +1020,7 @@ paint_triangle (GtkHSV *hsv, gint width, gint height) { - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; GtkWidget *widget = GTK_WIDGET (hsv); gint hx, hy, sx, sy, vx, vy; /* HSV vertices */ gint x1, y1, r1, g1, b1; /* First vertex in scanline order */ @@ -1182,6 +1200,7 @@ paint_triangle (GtkHSV *hsv, if (gtk_widget_has_focus (widget) && !priv->focus_on_ring) { + GtkAllocation allocation; gint focus_width; gint focus_pad; @@ -1189,16 +1208,18 @@ paint_triangle (GtkHSV *hsv, "focus-line-width", &focus_width, "focus-padding", &focus_pad, NULL); - - gtk_paint_focus (widget->style, widget->window, + + gtk_widget_get_allocation (widget, &allocation); + + gtk_paint_focus (gtk_widget_get_style (widget), + gtk_widget_get_window (widget), gtk_widget_get_state (widget), NULL, widget, detail, - widget->allocation.x + xx - FOCUS_RADIUS - focus_width - focus_pad, - widget->allocation.y + yy - FOCUS_RADIUS - focus_width - focus_pad, + allocation.x + xx - FOCUS_RADIUS - focus_width - focus_pad, + allocation.y + yy - FOCUS_RADIUS - focus_width - focus_pad, 2 * (FOCUS_RADIUS + focus_width + focus_pad), 2 * (FOCUS_RADIUS + focus_width + focus_pad)); } - } /* Paints the contents of the HSV color selector */ @@ -1220,38 +1241,43 @@ gtk_hsv_expose (GtkWidget *widget, GdkEventExpose *event) { GtkHSV *hsv = GTK_HSV (widget); - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; + GtkAllocation allocation; GdkRectangle rect, dest; + GdkWindow *window; cairo_t *cr; - if (!(event->window == widget->window && gtk_widget_is_drawable (widget))) + window = gtk_widget_get_window (widget); + + if (!(event->window == window && gtk_widget_is_drawable (widget))) return FALSE; - rect.x = widget->allocation.x; - rect.y = widget->allocation.y; - rect.width = widget->allocation.width; - rect.height = widget->allocation.height; - + gtk_widget_get_allocation (widget, &allocation); + + rect.x = allocation.x; + rect.y = allocation.y; + rect.width = allocation.width; + rect.height = allocation.height; + if (!gdk_rectangle_intersect (&event->area, &rect, &dest)) return FALSE; - - cr = gdk_cairo_create (widget->window); - cairo_translate (cr, widget->allocation.x, widget->allocation.y); + cr = gdk_cairo_create (window); + + cairo_translate (cr, allocation.x, allocation.y); paint (hsv, cr, - dest.x - widget->allocation.x, - dest.y - widget->allocation.y, + dest.x - allocation.x, + dest.y - allocation.y, dest.width, dest.height); cairo_destroy (cr); if (gtk_widget_has_focus (widget) && priv->focus_on_ring) - gtk_paint_focus (widget->style, widget->window, + gtk_paint_focus (gtk_widget_get_style (widget), + window, gtk_widget_get_state (widget), &event->area, widget, NULL, - widget->allocation.x, - widget->allocation.y, - widget->allocation.width, - widget->allocation.height); + allocation.x, allocation.y, + allocation.width, allocation.height); return FALSE; } @@ -1261,7 +1287,7 @@ gtk_hsv_focus (GtkWidget *widget, GtkDirectionType dir) { GtkHSV *hsv = GTK_HSV (widget); - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; if (!gtk_widget_has_focus (widget)) { @@ -1345,7 +1371,7 @@ gtk_hsv_set_color (GtkHSV *hsv, gdouble s, gdouble v) { - GtkHSVPriv *priv; + GtkHSVPrivate *priv; g_return_if_fail (GTK_IS_HSV (hsv)); g_return_if_fail (h >= 0.0 && h <= 1.0); @@ -1381,7 +1407,7 @@ gtk_hsv_get_color (GtkHSV *hsv, double *s, double *v) { - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; g_return_if_fail (GTK_IS_HSV (hsv)); @@ -1412,7 +1438,7 @@ gtk_hsv_set_metrics (GtkHSV *hsv, gint size, gint ring_width) { - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; int same_size; g_return_if_fail (GTK_IS_HSV (hsv)); @@ -1448,7 +1474,7 @@ gtk_hsv_get_metrics (GtkHSV *hsv, gint *size, gint *ring_width) { - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; g_return_if_fail (GTK_IS_HSV (hsv)); @@ -1479,7 +1505,7 @@ gtk_hsv_get_metrics (GtkHSV *hsv, gboolean gtk_hsv_is_adjusting (GtkHSV *hsv) { - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; g_return_val_if_fail (GTK_IS_HSV (hsv), FALSE); @@ -1570,7 +1596,7 @@ static void gtk_hsv_move (GtkHSV *hsv, GtkDirectionType dir) { - GtkHSVPriv *priv = hsv->priv; + GtkHSVPrivate *priv = hsv->priv; gdouble hue, sat, val; gint hx, hy, sx, sy, vx, vy; /* HSV vertices */ gint x, y; /* position in triangle */ |