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; 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 static void
adjustment_set_value (GtkAdjustment *adjustment, adjustment_set_value (GtkAdjustment *adjustment,
gdouble value) gdouble value)

View File

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

View File

@@ -156,6 +156,9 @@ struct _GtkRangePrivate
/* Fill level */ /* Fill level */
guint show_fill_level : 1; guint show_fill_level : 1;
guint restrict_to_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); gtk_gesture_drag_get_start_point (gesture, &start_x, &start_y);
priv->mouse_x = start_x + offset_x; priv->mouse_x = start_x + offset_x;
priv->mouse_y = start_y + offset_y; priv->mouse_y = start_y + offset_y;
priv->in_drag = TRUE;
update_autoscroll_mode (range); update_autoscroll_mode (range);
@@ -2922,6 +2926,7 @@ gtk_range_drag_gesture_end (GtkGestureDrag *gesture,
gdouble offset_y, gdouble offset_y,
GtkRange *range) GtkRange *range)
{ {
range->priv->in_drag = FALSE;
stop_scrolling (range); stop_scrolling (range);
} }
@@ -3997,7 +4002,11 @@ gtk_range_real_change_value (GtkRange *range,
priv->need_recalc = TRUE; priv->need_recalc = TRUE;
gtk_widget_queue_draw (GTK_WIDGET (range)); 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; return FALSE;

View File

@@ -2163,8 +2163,8 @@ gtk_text_view_scroll_to_iter (GtkTextView *text_view,
if (scroll_inc != 0) if (scroll_inc != 0)
{ {
gtk_adjustment_set_value (text_view->priv->vadjustment, gtk_adjustment_animate_to_value (text_view->priv->vadjustment,
current_y_scroll + scroll_inc); current_y_scroll + scroll_inc);
DV (g_print (" vert increment %d\n", 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) if (scroll_inc != 0)
{ {
gtk_adjustment_set_value (text_view->priv->hadjustment, gtk_adjustment_animate_to_value (text_view->priv->hadjustment,
current_x_scroll + scroll_inc); current_x_scroll + scroll_inc);
DV (g_print (" horiz increment %d\n", scroll_inc)); DV (g_print (" horiz increment %d\n", scroll_inc));
} }
@@ -5858,10 +5858,11 @@ gtk_text_view_move_cursor (GtkTextView *text_view,
break; break;
} }
old_xpos = priv->xoffset; old_xpos = gtk_adjustment_get_value (priv->hadjustment);
old_ypos = priv->yoffset; old_ypos = gtk_adjustment_get_value (priv->vadjustment);
gtk_text_view_move_viewport (text_view, scroll_step, count); 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 && leave_direction != -1 &&
!gtk_widget_keynav_failed (GTK_WIDGET (text_view), !gtk_widget_keynav_failed (GTK_WIDGET (text_view),
leave_direction)) 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); gtk_text_view_get_virtual_cursor_pos (text_view, NULL, &cursor_x_pos, &cursor_y_pos);
oldval = gtk_adjustment_get_value (adjustment); oldval = newval = gtk_adjustment_get_target_value (adjustment);
newval = gtk_adjustment_get_value (adjustment);
newval += count * gtk_adjustment_get_page_increment (adjustment); newval += count * gtk_adjustment_get_page_increment (adjustment);
gtk_adjustment_animate_to_value (adjustment, newval); 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); 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); move_cursor (text_view, &new_insert, extend_selection);
gtk_text_view_set_virtual_cursor_pos (text_view, cursor_x_pos, cursor_y_pos); 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. * only guarantees 1 pixel onscreen.
*/ */
DV(g_print (G_STRLOC": scrolling onscreen\n")); 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); 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); gtk_text_view_get_virtual_cursor_pos (text_view, NULL, &cursor_x_pos, &cursor_y_pos);
oldval = gtk_adjustment_get_value (adjustment); oldval = newval = gtk_adjustment_get_target_value (adjustment);
newval = gtk_adjustment_get_value (adjustment);
newval += count * gtk_adjustment_get_page_increment (adjustment); newval += count * gtk_adjustment_get_page_increment (adjustment);
gtk_adjustment_animate_to_value (adjustment, newval); 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); 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); move_cursor (text_view, &new_insert, extend_selection);
gtk_text_view_set_virtual_cursor_pos (text_view, cursor_x_pos, cursor_y_pos); 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. * only guarantees 1 pixel onscreen.
*/ */
DV(g_print (G_STRLOC": scrolling onscreen\n")); 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); return !gtk_text_iter_equal (&old_insert, &new_insert);
} }