#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;
"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;
if (!priv->scroll_indicator_timeout)
priv->scroll_indicator_timeout =
- gdk_threads_add_timeout (SCROLL_FADE_TIMEOUT,
- (GSourceFunc) hildon_pannable_area_scroll_indicator_fade,
- area);
+ gdk_threads_add_timeout_full (G_PRIORITY_HIGH_IDLE + 20,
+ SCROLL_FADE_TIMEOUT,
+ (GSourceFunc) hildon_pannable_area_scroll_indicator_fade,
+ area,
+ NULL);
}
static void
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) {
priv->motion_x = 0;
priv->motion_y = 0;
- priv->motion_event_scroll_timeout = gdk_threads_add_timeout
- ((gint) (1000.0 / (gdouble) MOTION_EVENTS_PER_SECOND),
- (GSourceFunc) hildon_pannable_area_motion_event_scroll_timeout, area);
+ priv->motion_event_scroll_timeout = gdk_threads_add_timeout_full
+ (G_PRIORITY_HIGH_IDLE + 20,
+ (gint) (1000.0 / (gdouble) MOTION_EVENTS_PER_SECOND),
+ (GSourceFunc) hildon_pannable_area_motion_event_scroll_timeout, area, NULL);
}
}
(priv->mode != HILDON_PANNABLE_AREA_MODE_AUTO)) {
if (!priv->idle_id)
- priv->idle_id = gdk_threads_add_timeout ((gint)
- (1000.0 / (gdouble) priv->sps),
- (GSourceFunc)
- hildon_pannable_area_timeout, area);
+ priv->idle_id = gdk_threads_add_timeout_full
+ (G_PRIORITY_HIGH_IDLE + 20,
+ (gint)(1000.0 / (gdouble) priv->sps),
+ (GSourceFunc)
+ hildon_pannable_area_timeout, area, NULL);
}
}
}
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 ((gint) (1000.0 / (gdouble) priv->sps),
- (GSourceFunc)
- hildon_pannable_area_timeout, widget);
+ priv->idle_id = gdk_threads_add_timeout_full (G_PRIORITY_HIGH_IDLE + 20,
+ (gint) (1000.0 / (gdouble) priv->sps),
+ (GSourceFunc) hildon_pannable_area_timeout,
+ widget, NULL);
} else {
if (priv->center_on_child_focus_pending) {
hildon_pannable_area_center_on_child_focus (area);
hildon_pannable_area_launch_fade_timeout (area, 1.0);
if (!priv->idle_id)
- priv->idle_id = gdk_threads_add_timeout ((gint) (1000.0 / (gdouble) priv->sps),
- (GSourceFunc)
- hildon_pannable_area_timeout, area);
+ priv->idle_id = gdk_threads_add_timeout_full (G_PRIORITY_HIGH_IDLE + 20,
+ (gint) (1000.0 / (gdouble) priv->sps),
+ (GSourceFunc) hildon_pannable_area_timeout,
+ area, NULL);
}
/**