Compare commits

...

5 Commits

Author SHA1 Message Date
Carlos Garnacho
3b658d9fa0 range: Avoid animations during slider drag
If the drag gesture gets a GtkGesture::updated signal, the user
is directly interacting through pointer/touch with the range slider,
animating the adjustment value change in this situation can produce
perceived lag, so set the value immediately when this is happening.
2014-07-08 19:59:49 +02:00
Carlos Garnacho
4cec2c6571 textview: Fix cursor positioning oddities when scrolling through Pg Up/Down
Use the adjustment target value when repositioning the cursor, and remove the
checks that ensured the cursor was made onscreen immediately, as there will
be definitely a delay on animated adjustment changes.
2014-07-08 19:59:49 +02:00
Carlos Garnacho
0c2610709c textview: Use adjustment animations in gtk_text_view_scroll_to_iter()
This makes keyboard-triggered scrolling animated, as this function is
used underneath in order to make the cursor onscreen after it is
displaced.
2014-07-08 19:59:49 +02:00
Carlos Garnacho
2443ac9c35 textview: Use the adjustment target value to figure out if keynav failed
When moving the cursor, compare current adjustment value with the post-animation
target value, in order to avoid false "keynav failed" positives as the animation
hasn't started yet, so dx/dy are still 0 at that time.
2014-07-08 19:59:49 +02:00
Carlos Garnacho
0d9acd12d8 adjustment: Add private gtk_adjustment_get_target_value() method
This call returns either the target value if there is an ongoing animation,
or the current value if there is no animation.
2014-07-08 19:59:49 +02:00
4 changed files with 35 additions and 20 deletions

View File

@@ -428,6 +428,17 @@ gtk_adjustment_get_value (GtkAdjustment *adjustment)
return adjustment->priv->value;
}
gdouble
gtk_adjustment_get_target_value (GtkAdjustment *adjustment)
{
g_return_val_if_fail (GTK_IS_ADJUSTMENT (adjustment), 0.0);
if (adjustment->priv->tick_id)
return adjustment->priv->target;
else
return adjustment->priv->value;
}
static void
adjustment_set_value (GtkAdjustment *adjustment,
gdouble value)

View File

@@ -29,6 +29,7 @@ void gtk_adjustment_enable_animation (GtkAdjustment *adjustment,
guint duration);
void gtk_adjustment_animate_to_value (GtkAdjustment *adjustment,
gdouble value);
gdouble gtk_adjustment_get_target_value (GtkAdjustment *adjustment);
G_END_DECLS

View File

@@ -156,6 +156,9 @@ struct _GtkRangePrivate
/* Fill level */
guint show_fill_level : 1;
guint restrict_to_fill_level : 1;
/* Whether dragging is ongoing */
guint in_drag : 1;
};
@@ -2909,6 +2912,7 @@ gtk_range_drag_gesture_update (GtkGestureDrag *gesture,
gtk_gesture_drag_get_start_point (gesture, &start_x, &start_y);
priv->mouse_x = start_x + offset_x;
priv->mouse_y = start_y + offset_y;
priv->in_drag = TRUE;
update_autoscroll_mode (range);
@@ -2922,6 +2926,7 @@ gtk_range_drag_gesture_end (GtkGestureDrag *gesture,
gdouble offset_y,
GtkRange *range)
{
range->priv->in_drag = FALSE;
stop_scrolling (range);
}
@@ -3997,7 +4002,11 @@ gtk_range_real_change_value (GtkRange *range,
priv->need_recalc = TRUE;
gtk_widget_queue_draw (GTK_WIDGET (range));
gtk_adjustment_animate_to_value (priv->adjustment, value);
if (priv->in_drag)
gtk_adjustment_set_value (priv->adjustment, value);
else
gtk_adjustment_animate_to_value (priv->adjustment, value);
}
return FALSE;

View File

@@ -2163,8 +2163,8 @@ gtk_text_view_scroll_to_iter (GtkTextView *text_view,
if (scroll_inc != 0)
{
gtk_adjustment_set_value (text_view->priv->vadjustment,
current_y_scroll + scroll_inc);
gtk_adjustment_animate_to_value (text_view->priv->vadjustment,
current_y_scroll + scroll_inc);
DV (g_print (" vert increment %d\n", scroll_inc));
}
@@ -2200,8 +2200,8 @@ gtk_text_view_scroll_to_iter (GtkTextView *text_view,
if (scroll_inc != 0)
{
gtk_adjustment_set_value (text_view->priv->hadjustment,
current_x_scroll + scroll_inc);
gtk_adjustment_animate_to_value (text_view->priv->hadjustment,
current_x_scroll + scroll_inc);
DV (g_print (" horiz increment %d\n", scroll_inc));
}
@@ -5858,10 +5858,11 @@ gtk_text_view_move_cursor (GtkTextView *text_view,
break;
}
old_xpos = priv->xoffset;
old_ypos = priv->yoffset;
old_xpos = gtk_adjustment_get_value (priv->hadjustment);
old_ypos = gtk_adjustment_get_value (priv->vadjustment);
gtk_text_view_move_viewport (text_view, scroll_step, count);
if ((old_xpos == priv->xoffset && old_ypos == priv->yoffset) &&
if ((old_xpos == gtk_adjustment_get_target_value (priv->hadjustment) &&
old_ypos == gtk_adjustment_get_target_value (priv->vadjustment)) &&
leave_direction != -1 &&
!gtk_widget_keynav_failed (GTK_WIDGET (text_view),
leave_direction))
@@ -6182,16 +6183,14 @@ gtk_text_view_scroll_pages (GtkTextView *text_view,
{
gtk_text_view_get_virtual_cursor_pos (text_view, NULL, &cursor_x_pos, &cursor_y_pos);
oldval = gtk_adjustment_get_value (adjustment);
newval = gtk_adjustment_get_value (adjustment);
oldval = newval = gtk_adjustment_get_target_value (adjustment);
newval += count * gtk_adjustment_get_page_increment (adjustment);
gtk_adjustment_animate_to_value (adjustment, newval);
cursor_y_pos += gtk_adjustment_get_value (adjustment) - oldval;
cursor_y_pos += newval - oldval;
gtk_text_layout_get_iter_at_pixel (priv->layout, &new_insert, cursor_x_pos, cursor_y_pos);
clamp_iter_onscreen (text_view, &new_insert);
move_cursor (text_view, &new_insert, extend_selection);
gtk_text_view_set_virtual_cursor_pos (text_view, cursor_x_pos, cursor_y_pos);
@@ -6201,7 +6200,6 @@ gtk_text_view_scroll_pages (GtkTextView *text_view,
* only guarantees 1 pixel onscreen.
*/
DV(g_print (G_STRLOC": scrolling onscreen\n"));
gtk_text_view_scroll_mark_onscreen (text_view, insert_mark);
return !gtk_text_iter_equal (&old_insert, &new_insert);
}
@@ -6266,16 +6264,13 @@ gtk_text_view_scroll_hpages (GtkTextView *text_view,
{
gtk_text_view_get_virtual_cursor_pos (text_view, NULL, &cursor_x_pos, &cursor_y_pos);
oldval = gtk_adjustment_get_value (adjustment);
newval = gtk_adjustment_get_value (adjustment);
oldval = newval = gtk_adjustment_get_target_value (adjustment);
newval += count * gtk_adjustment_get_page_increment (adjustment);
gtk_adjustment_animate_to_value (adjustment, newval);
cursor_x_pos += gtk_adjustment_get_value (adjustment) - oldval;
cursor_x_pos += newval - oldval;
gtk_text_layout_get_iter_at_pixel (priv->layout, &new_insert, cursor_x_pos, cursor_y_pos);
clamp_iter_onscreen (text_view, &new_insert);
move_cursor (text_view, &new_insert, extend_selection);
gtk_text_view_set_virtual_cursor_pos (text_view, cursor_x_pos, cursor_y_pos);
@@ -6291,7 +6286,6 @@ gtk_text_view_scroll_hpages (GtkTextView *text_view,
* only guarantees 1 pixel onscreen.
*/
DV(g_print (G_STRLOC": scrolling onscreen\n"));
gtk_text_view_scroll_mark_onscreen (text_view, insert_mark);
return !gtk_text_iter_equal (&old_insert, &new_insert);
}