#define RATIO_TOLERANCE 0.000001
#define SCROLL_FADE_TIMEOUT 100
#define MOTION_EVENTS_PER_SECOND 25
-#define CURSOR_STOPPED_TIMEOUT 80
-#define MAX_SPEED_THRESHOLD 250
+#define CURSOR_STOPPED_TIMEOUT 200
+#define MAX_SPEED_THRESHOLD 290
#define PANNABLE_MAX_WIDTH 788
#define PANNABLE_MAX_HEIGHT 378
gboolean enabled;
gboolean button_pressed;
guint32 last_time; /* Last event time, to stop infinite loops */
+ guint32 last_press_time;
gint last_type;
gboolean last_in;
gboolean moved;
guint direction_error_margin;
gdouble vel_x;
gdouble vel_y;
+ gdouble old_vel_x;
+ gdouble old_vel_y;
GdkWindow *child;
gint child_width;
gint child_height;
"Maximum scroll velocity",
"Maximum distance the child widget should scroll "
"per 'frame', in pixels per frame.",
- 0, G_MAXDOUBLE, 500,
+ 0, G_MAXDOUBLE, 3500,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
"Minimum velocity that is considered 'fast': "
"children widgets won't receive button presses. "
"Expressed as a fraction of the maximum velocity.",
- 0, 1, 0.02,
+ 0, 1, 0.01,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
"Deceleration multiplier",
"The multiplier used when decelerating when in "
"acceleration scrolling mode.",
- 0, 1.0, 0.93,
+ 0, 1.0, 0.85,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
"Time before starting to fade the scrollbar",
"Time the scrollbar is going to be visible if the widget is not in"
"action in miliseconds",
- 0, G_MAXUINT, 3000,
+ 0, G_MAXUINT, 1000,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
priv->moved = FALSE;
priv->button_pressed = FALSE;
priv->last_time = 0;
+ priv->last_press_time = 0;
priv->last_type = 0;
priv->vscroll_visible = TRUE;
priv->hscroll_visible = TRUE;
priv->idle_id = 0;
priv->vel_x = 0;
priv->vel_y = 0;
+ priv->old_vel_x = 0;
+ priv->old_vel_y = 0;
priv->scroll_indicator_alpha = 0.0;
priv->scroll_indicator_timeout = 0;
priv->motion_event_scroll_timeout = 0;
priv->scroll_indicator_alpha);
priv->last_time = event->time;
+ priv->last_press_time = event->time;
priv->last_type = 1;
priv->scroll_to_x = -1;
priv->button_pressed = TRUE;
/* Stop scrolling on mouse-down (so you can flick, then hold to stop) */
+ priv->old_vel_x = priv->vel_x;
+ priv->old_vel_y = priv->vel_y;
priv->vel_x = 0;
priv->vel_y = 0;
if (priv->idle_id) {
return FALSE;
}
+ hildon_pannable_area_scroll (area, priv->vel_x, priv->vel_y);
+
+ gdk_window_process_updates (GTK_WIDGET (area)->window, FALSE);
+
if (!priv->button_pressed) {
/* Decelerate gradually when pointer is raised */
if ((!priv->overshot_dist_y) &&
return FALSE;
}
- hildon_pannable_area_scroll (area, priv->vel_x, priv->vel_y);
-
- gdk_window_process_updates (GTK_WIDGET (area)->window, FALSE);
-
return TRUE;
}
gint x, y;
gdouble dx, dy;
GdkWindow *child;
+ gboolean force_fast = TRUE;
if (((event->time == priv->last_time) && (priv->last_type == 3))
|| (gtk_bin_get_child (GTK_BIN (widget)) == NULL)
priv->button_pressed = FALSE;
+ /* if widget was moving fast in the panning, increase speed even more */
+ if ((event->time - priv->last_press_time < 125) &&
+ ((ABS (priv->old_vel_x) > priv->vmin) ||
+ (ABS (priv->old_vel_y) > priv->vmin)) &&
+ ((ABS (priv->old_vel_x) > 40) ||
+ (ABS (priv->old_vel_y) > 40)))
+ {
+ gint symbol = 0;
+
+ if (priv->vel_x != 0)
+ symbol = ((priv->vel_x * priv->old_vel_x) > 0) ? 1 : -1;
+
+ priv->vel_x = symbol *
+ (priv->old_vel_x + ((priv->old_vel_x > 0) ? priv->vmax : -priv->vmax));
+
+ symbol = 0;
+
+ if (priv->vel_y != 0)
+ symbol = ((priv->vel_y * priv->old_vel_y) > 0) ? 1 : -1;
+
+ priv->vel_y = symbol *
+ (priv->old_vel_y + ((priv->old_vel_y > 0) ? priv->vmax : -priv->vmax));
+
+ force_fast = FALSE;
+ }
+
if ((ABS (priv->vel_y) >= priv->vmin) ||
(ABS (priv->vel_x) >= priv->vmin)) {
priv->scroll_indicator_alpha = 1.0;
- if (ABS (priv->vel_x) > MAX_SPEED_THRESHOLD)
- priv->vel_x = (priv->vel_x > 0) ? priv->vmax : -priv->vmax;
+ if (force_fast) {
+ if (ABS (priv->vel_x) > MAX_SPEED_THRESHOLD)
+ priv->vel_x = (priv->vel_x > 0) ? priv->vmax : -priv->vmax;
- if (ABS (priv->vel_y) > MAX_SPEED_THRESHOLD)
- priv->vel_y = (priv->vel_y > 0) ? priv->vmax : -priv->vmax;
+ if (ABS (priv->vel_y) > MAX_SPEED_THRESHOLD)
+ priv->vel_y = (priv->vel_y > 0) ? priv->vmax : -priv->vmax;
+ }
if (!priv->idle_id)
priv->idle_id = gdk_threads_add_timeout_full (G_PRIORITY_HIGH_IDLE + 20,
fct += fct_i;
}
- priv->vel_factor = fct;
+ priv->vel_factor = fct;
}
/**