static void gimp_ruler_queue_pos_redraw (GimpRuler *ruler) { GimpRulerPrivate *priv = GIMP_RULER_GET_PRIVATE (ruler); const GdkRectangle rect = gimp_ruler_get_pos_rect (ruler, priv->position); gtk_widget_queue_draw_area (GTK_WIDGET(ruler), rect.x, rect.y, rect.width, rect.height); if (priv->last_pos_rect.width != 0 || priv->last_pos_rect.height != 0) { gtk_widget_queue_draw_area (GTK_WIDGET(ruler), priv->last_pos_rect.x, priv->last_pos_rect.y, priv->last_pos_rect.width, priv->last_pos_rect.height); priv->last_pos_rect.x = 0; priv->last_pos_rect.y = 0; priv->last_pos_rect.width = 0; priv->last_pos_rect.height = 0; } }
/** * gimp_ruler_set_position: * @ruler: a #GimpRuler * @position: the position to set the ruler to * * This sets the position of the ruler. * * Since: 2.8 */ void gimp_ruler_set_position (GimpRuler *ruler, gdouble position) { GimpRulerPrivate *priv; g_return_if_fail (GIMP_IS_RULER (ruler)); priv = GIMP_RULER_GET_PRIVATE (ruler); if (priv->position != position) { gdouble old_pos = priv->position; priv->position = position; g_object_notify (G_OBJECT (ruler), "position"); { GdkRectangle rect; rect = gimp_ruler_get_pos_rect (ruler, old_pos); gtk_widget_queue_draw_area (GTK_WIDGET(ruler), rect.x, rect.y, rect.width, rect.height); rect = gimp_ruler_get_pos_rect (ruler, position); gtk_widget_queue_draw_area (GTK_WIDGET(ruler), rect.x, rect.y, rect.width, rect.height); } } }
/** * gimp_ruler_set_position: * @ruler: a #GimpRuler * @position: the position to set the ruler to * * This sets the position of the ruler. * * Since: 2.8 */ void gimp_ruler_set_position (GimpRuler *ruler, gdouble position) { GimpRulerPrivate *priv; g_return_if_fail (GIMP_IS_RULER (ruler)); priv = GIMP_RULER_GET_PRIVATE (ruler); if (priv->position != position) { GdkRectangle rect; gint xdiff, ydiff; priv->position = position; g_object_notify (G_OBJECT (ruler), "position"); rect = gimp_ruler_get_pos_rect (ruler, priv->position); xdiff = rect.x - priv->last_pos_rect.x; ydiff = rect.y - priv->last_pos_rect.y; /* * If the position has changed far enough, queue a redraw immediately. * Otherwise, we only queue a redraw in a low priority idle handler, to * allow for other things (like updating the canvas) to run. * * TODO: This might not be necessary any more in GTK3 with the frame * clock. Investigate this more after the port to GTK3. */ if (priv->last_pos_rect.width != 0 && priv->last_pos_rect.height != 0 && (ABS (xdiff) > IMMEDIATE_REDRAW_THRESHOLD || ABS (ydiff) > IMMEDIATE_REDRAW_THRESHOLD)) { gimp_ruler_queue_pos_redraw (ruler); } else if (! priv->pos_redraw_idle_id) { priv->pos_redraw_idle_id = g_idle_add_full (G_PRIORITY_LOW, gimp_ruler_idle_queue_pos_redraw, ruler, NULL); } } }
static void gimp_ruler_draw_pos (GimpRuler *ruler, cairo_t *cr) { GtkWidget *widget = GTK_WIDGET (ruler); GtkStyleContext *context = gtk_widget_get_style_context (widget); GimpRulerPrivate *priv = GIMP_RULER_GET_PRIVATE (ruler); GdkRectangle pos_rect; if (! gtk_widget_is_drawable (widget)) return; pos_rect = gimp_ruler_get_pos_rect (ruler, gimp_ruler_get_position (ruler)); if ((pos_rect.width > 0) && (pos_rect.height > 0)) { GdkRGBA color; gtk_style_context_get_color (context, gtk_widget_get_state_flags (widget), &color); gdk_cairo_set_source_rgba (cr, &color); cairo_move_to (cr, pos_rect.x, pos_rect.y); if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) { cairo_line_to (cr, pos_rect.x + pos_rect.width / 2.0, pos_rect.y + pos_rect.height); cairo_line_to (cr, pos_rect.x + pos_rect.width, pos_rect.y); } else { cairo_line_to (cr, pos_rect.x + pos_rect.width, pos_rect.y + pos_rect.height / 2.0); cairo_line_to (cr, pos_rect.x, pos_rect.y + pos_rect.height); } cairo_fill (cr); } priv->last_pos_rect = pos_rect; }
static void gimp_ruler_draw_pos (GimpRuler *ruler, cairo_t *cr) { GtkWidget *widget = GTK_WIDGET (ruler); GtkStyle *style = gtk_widget_get_style (widget); GimpRulerPrivate *priv = GIMP_RULER_GET_PRIVATE (ruler); GtkStateType state = gtk_widget_get_state (widget); GdkRectangle pos_rect; if (! gtk_widget_is_drawable (widget)) return; pos_rect = gimp_ruler_get_pos_rect (ruler, gimp_ruler_get_position (ruler)); if ((pos_rect.width > 0) && (pos_rect.height > 0)) { gdk_cairo_set_source_color (cr, &style->fg[state]); cairo_move_to (cr, pos_rect.x, pos_rect.y); if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) { cairo_line_to (cr, pos_rect.x + pos_rect.width / 2.0, pos_rect.y + pos_rect.height); cairo_line_to (cr, pos_rect.x + pos_rect.width, pos_rect.y); } else { cairo_line_to (cr, pos_rect.x + pos_rect.width, pos_rect.y + pos_rect.height / 2.0); cairo_line_to (cr, pos_rect.x, pos_rect.y + pos_rect.height); } cairo_fill (cr); } }