r3922 - in trunk/src/target/OM-2007.2/libraries/libmokoui2: . libmokoui

chris at sita.openmoko.org chris at sita.openmoko.org
Tue Jan 22 17:30:54 CET 2008


Author: chris
Date: 2008-01-22 17:30:52 +0100 (Tue, 22 Jan 2008)
New Revision: 3922

Modified:
   trunk/src/target/OM-2007.2/libraries/libmokoui2/ChangeLog
   trunk/src/target/OM-2007.2/libraries/libmokoui2/libmokoui/moko-finger-scroll.c
   trunk/src/target/OM-2007.2/libraries/libmokoui2/libmokoui/moko-finger-scroll.h
   trunk/src/target/OM-2007.2/libraries/libmokoui2/libmokoui/moko-type.h
Log:
        Patch by: Frank Li <frank.li at intel.com>

        * libmokoui/moko-finger-scroll.c: (moko_get_time_delta),
        (moko_finger_scroll_button_press_cb), (moko_finger_scroll_refresh),
        (moko_finger_scroll_timeout),
        (moko_finger_scroll_motion_notify_cb),
        (moko_finger_scroll_button_release_cb), (parent_set_cb),
        (moko_finger_scroll_get_property),
        (moko_finger_scroll_set_property), (moko_finger_scroll_class_init),
        (moko_finger_scroll_mode_get_type),
        (moko_finger_scroll_indicator_mode_get_type):
        * libmokoui/moko-finger-scroll.h:
        * libmokoui/moko-type.h:
        Add indicator display modes and new 'auto' scrolling mode


Modified: trunk/src/target/OM-2007.2/libraries/libmokoui2/ChangeLog
===================================================================
--- trunk/src/target/OM-2007.2/libraries/libmokoui2/ChangeLog	2008-01-22 16:28:04 UTC (rev 3921)
+++ trunk/src/target/OM-2007.2/libraries/libmokoui2/ChangeLog	2008-01-22 16:30:52 UTC (rev 3922)
@@ -1,5 +1,22 @@
 2008-01-22  Chris Lord  <chris at openedhand.com>
 
+	Patch by: Frank Li <frank.li at intel.com>
+
+	* libmokoui/moko-finger-scroll.c: (moko_get_time_delta),
+	(moko_finger_scroll_button_press_cb), (moko_finger_scroll_refresh),
+	(moko_finger_scroll_timeout),
+	(moko_finger_scroll_motion_notify_cb),
+	(moko_finger_scroll_button_release_cb), (parent_set_cb),
+	(moko_finger_scroll_get_property),
+	(moko_finger_scroll_set_property), (moko_finger_scroll_class_init),
+	(moko_finger_scroll_mode_get_type),
+	(moko_finger_scroll_indicator_mode_get_type):
+	* libmokoui/moko-finger-scroll.h:
+	* libmokoui/moko-type.h:
+	Add indicator display modes and new 'auto' scrolling mode
+
+2008-01-22  Chris Lord  <chris at openedhand.com>
+
 	* configure.ac:
 	python bindings disabled by default
 

Modified: trunk/src/target/OM-2007.2/libraries/libmokoui2/libmokoui/moko-finger-scroll.c
===================================================================
--- trunk/src/target/OM-2007.2/libraries/libmokoui2/libmokoui/moko-finger-scroll.c	2008-01-22 16:28:04 UTC (rev 3921)
+++ trunk/src/target/OM-2007.2/libraries/libmokoui2/libmokoui/moko-finger-scroll.c	2008-01-22 16:30:52 UTC (rev 3922)
@@ -56,6 +56,7 @@
 	guint32 last_time;	/* infinite loops */
 	gboolean moved;
 	GTimeVal click_start;
+	GTimeVal last_click;
 	gdouble vmin;
 	gdouble vmax;
 	gdouble decel;
@@ -78,6 +79,15 @@
 
 	GtkAdjustment *hadjust;
 	GtkAdjustment *vadjust;
+	
+	gdouble click_x;
+	gdouble click_y;
+
+	guint event_mode;
+	
+	MokoFingerScrollIndicatorMode vindicator_mode;
+	MokoFingerScrollIndicatorMode hindicator_mode;
+
 };
 
 enum {
@@ -87,8 +97,28 @@
 	PROP_VELOCITY_MAX,
 	PROP_DECELERATION,
 	PROP_SPS,
+	PROP_VINDICATOR,
+	PROP_HINDICATOR,
+
 };
 
+static gdouble
+moko_get_time_delta (GTimeVal *start, GTimeVal *end)
+{
+	gdouble x, y;
+	
+	x = start->tv_sec;
+	x *= 1000000;
+	x += start->tv_usec;
+
+	y = end->tv_sec;
+	y *= 1000000;
+	y += end->tv_usec;
+	
+	return y-x;
+
+}
+
 /* Following function inherited from libhildondesktop */
 static GList *
 get_ordered_children (GdkWindow *window)
@@ -205,6 +235,9 @@
 	    ((event->time == priv->last_time) &&
 	     (event->type == priv->last_type))) return TRUE;
 
+	priv->click_x = event->x;
+	priv->click_y = event->y;
+
 	if (priv->clicked && priv->child) {
 		/* Widget stole focus on last click, send crossing-out event */
 		synth_crossing (priv->child, 0, 0, event->x_root, event->y_root,
@@ -257,6 +290,7 @@
 	} else
 		priv->child = NULL;
 
+
 	return TRUE;
 }
 
@@ -291,11 +325,31 @@
 	
 	/* Calculate if we need scroll indicators */
 	gtk_widget_size_request (widget, NULL);
-	hscroll = (priv->hadjust->upper - priv->hadjust->lower >
-		priv->hadjust->page_size) ? TRUE : FALSE;
-	vscroll = (priv->vadjust->upper - priv->vadjust->lower >
-		priv->vadjust->page_size) ? TRUE : FALSE;
 	
+	switch (priv->hindicator_mode) {
+	    case MOKO_FINGER_SCROLL_INDICATOR_MODE_SHOW :
+		hscroll = TRUE;
+		break;
+	    case MOKO_FINGER_SCROLL_INDICATOR_MODE_HIDE :
+		hscroll = FALSE;
+		break;
+	    default :
+		hscroll = (priv->hadjust->upper - priv->hadjust->lower >
+			priv->hadjust->page_size) ? TRUE : FALSE;
+	}
+	
+	switch (priv->vindicator_mode) {
+	    case MOKO_FINGER_SCROLL_INDICATOR_MODE_SHOW :
+		vscroll = TRUE;
+		break;
+	    case MOKO_FINGER_SCROLL_INDICATOR_MODE_HIDE :
+		vscroll = FALSE;
+		break;
+	    default :
+		vscroll = (priv->vadjust->upper - priv->vadjust->lower >
+			priv->vadjust->page_size) ? TRUE : FALSE;
+	}
+
 	/* TODO: Read ltr settings to decide which corner gets scroll
 	 * indicators?
 	 */
@@ -379,7 +433,7 @@
 	MokoFingerScrollPrivate *priv = FINGER_SCROLL_PRIVATE (scroll);
 	
 	if ((!priv->enabled) ||
-	    (priv->mode != MOKO_FINGER_SCROLL_MODE_ACCEL)) {
+	    (priv->mode == MOKO_FINGER_SCROLL_MODE_PUSH)) {
 		priv->idle_id = 0;
 		return FALSE;
 	}
@@ -391,6 +445,8 @@
 			priv->idle_id = 0;
 			return FALSE;
 		}
+	} else if (priv->mode == MOKO_FINGER_SCROLL_MODE_AUTO) {
+		return TRUE;
 	}
 	
 	moko_finger_scroll_scroll (scroll, priv->vel_x, priv->vel_y, &sx, &sy);
@@ -432,7 +488,7 @@
 	if ((!priv->moved) && (
 	     (ABS (x) > dnd_threshold) || (ABS (y) > dnd_threshold))) {
 		priv->moved = TRUE;
-		if (priv->mode == MOKO_FINGER_SCROLL_MODE_ACCEL) {
+		if (priv->mode != MOKO_FINGER_SCROLL_MODE_PUSH) {
 			priv->idle_id = g_timeout_add (
 				(gint)(1000.0/(gdouble)priv->sps),
 				(GSourceFunc)moko_finger_scroll_timeout,
@@ -465,6 +521,13 @@
 				 allocation.height) *
 				(priv->vmax-priv->vmin)) + priv->vmin);
 			break;
+		    case MOKO_FINGER_SCROLL_MODE_AUTO:
+			moko_finger_scroll_scroll (scroll, x, y, NULL, NULL);
+			priv->x = event->x;
+			priv->y = event->y;
+
+			break;
+				
 		    default :
 			break;
 		}
@@ -496,6 +559,7 @@
 	GTimeVal current;
 	gint x, y;
 	GdkWindow *child;
+	gdouble delta, speed_x, speed_y;
 	
 	if ((!priv->clicked) || (!priv->enabled) || (event->button != 1) ||
 	    ((event->time == priv->last_time) &&
@@ -503,11 +567,33 @@
 		return TRUE;
 
 	priv->last_type = event->type;
+	
 	priv->last_time = event->time;
 	g_get_current_time (&current);
 
 	priv->clicked = FALSE;
-		
+	
+	if (priv->mode == MOKO_FINGER_SCROLL_MODE_AUTO) {
+		delta = moko_get_time_delta (&priv->click_start, &current);
+		speed_x = event->x - priv->click_x;
+		speed_y = event->y - priv->click_y;
+	
+		speed_x = speed_x * 1000000 / delta;
+		speed_y = speed_y * 1000000 / delta;
+
+		priv->vel_x = speed_x * (gdouble)priv->sps / 1000;	
+		priv->vel_y = speed_y * (gdouble)priv->sps / 1000;
+
+		/*if( ABS(priv->vel_x )<20)
+		{
+			priv->vel_x = 0;
+		}
+		if(ABS(priv->vel_y )<20)
+		{	
+			priv->vel_y = 0;
+		}*/
+	}
+	
 	child = moko_finger_scroll_get_topmost (
 		GTK_BIN (priv->align)->child->window,
 		event->x, event->y, &x, &y);
@@ -634,8 +720,6 @@
 static void
 parent_set_cb (GtkWidget *widget, GtkObject *parent, MokoFingerScroll *scroll)
 {
-	MokoFingerScrollPrivate *priv = FINGER_SCROLL_PRIVATE (scroll);
-	
 	if (!parent) {
 		g_signal_handlers_disconnect_by_func (widget,
 			moko_finger_scroll_refresh, scroll);
@@ -678,7 +762,7 @@
 		g_value_set_boolean (value, priv->enabled);
 		break;
 	    case PROP_MODE :
-		g_value_set_int (value, priv->mode);
+		g_value_set_enum (value, priv->mode);
 		break;
 	    case PROP_VELOCITY_MIN :
 		g_value_set_double (value, priv->vmin);
@@ -692,6 +776,13 @@
 	    case PROP_SPS :
 		g_value_set_uint (value, priv->sps);
 		break;
+	    case PROP_VINDICATOR:
+		g_value_set_enum (value, priv->vindicator_mode);
+		break;
+	    case PROP_HINDICATOR:
+		g_value_set_enum (value, priv->hindicator_mode);
+		break;
+		 	
 	    default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 	}
@@ -710,7 +801,7 @@
 			GTK_EVENT_BOX (object), priv->enabled);
 		break;
 	    case PROP_MODE :
-		priv->mode = g_value_get_int (value);
+		priv->mode = g_value_get_enum (value);
 		break;
 	    case PROP_VELOCITY_MIN :
 		priv->vmin = g_value_get_double (value);
@@ -724,6 +815,13 @@
 	    case PROP_SPS :
 		priv->sps = g_value_get_uint (value);
 		break;
+	    case PROP_VINDICATOR:
+		priv->vindicator_mode = g_value_get_enum (value);
+		break;
+	    case PROP_HINDICATOR:
+		priv->hindicator_mode = g_value_get_enum (value);
+		break;
+
 	    default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 	}
@@ -810,14 +908,35 @@
 
 	g_object_class_install_property (
 		object_class,
+		PROP_VINDICATOR,
+		g_param_spec_enum (
+			"vindicator_mode",
+			"vindicator mode",
+			"Mode of the vertical scrolling indicator",
+			MOKO_TYPE_FINGER_SCROLL_INDICATOR_MODE,
+			MOKO_FINGER_SCROLL_INDICATOR_MODE_AUTO,
+			G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
+	g_object_class_install_property (
+		object_class,
+		PROP_HINDICATOR,
+		g_param_spec_enum (
+			"hindicator_mode",
+			"hindicator mode",
+			"Mode of the horizontal scrolling indicator",
+			MOKO_TYPE_FINGER_SCROLL_INDICATOR_MODE,
+			MOKO_FINGER_SCROLL_INDICATOR_MODE_AUTO,
+			G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+	
+	g_object_class_install_property (
+		object_class,
 		PROP_MODE,
-		g_param_spec_int (
+		g_param_spec_enum (
 			"mode",
 			"Scroll mode",
 			"Change the finger-scrolling mode.",
-			MOKO_FINGER_SCROLL_MODE_PUSH,
+			MOKO_TYPE_FINGER_SCROLL_MODE,
 			MOKO_FINGER_SCROLL_MODE_ACCEL,
-			MOKO_FINGER_SCROLL_MODE_ACCEL,
 			G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
 
 	g_object_class_install_property (
@@ -986,23 +1105,49 @@
 }
 
 GType 
-moko_finger_scroll_mode_get_type(void)
+moko_finger_scroll_mode_get_type (void)
 {
 	static GType etype = 0;
 	
 	if (etype == 0) {
-		static const GFlagsValue values[] = {
+		static const GEnumValue values[] = {
 			{ MOKO_FINGER_SCROLL_MODE_PUSH, 
 			  "MOKO_FINGER_SCROLL_MODE_PUSH", "" },
 			{ MOKO_FINGER_SCROLL_MODE_ACCEL, 
 			  "MOKO_FINGER_SCROLL_MODE_ACCEL", "" },
-			{0, NULL, NULL}
+			{ MOKO_FINGER_SCROLL_MODE_AUTO, 
+			  "MOKO_FINGER_SCROLL_MODE_AUTO", "" },
+			{ 0, NULL, NULL }
 		};
 
-		etype = g_flags_register_static (
+		etype = g_enum_register_static (
 			g_intern_static_string ("MokoFingerScrollMode"),
 			values);
 	}
 	
 	return etype;
 }
+
+GType
+moko_finger_scroll_indicator_mode_get_type (void)
+{
+	static GType etype = 0;
+	
+	if (etype == 0) {
+		static const GEnumValue values[] = {
+			{ MOKO_FINGER_SCROLL_INDICATOR_MODE_AUTO, 
+			  "MOKO_FINGER_SCROLL_INDICATOR_MODE_AUTO", "" },
+			{ MOKO_FINGER_SCROLL_INDICATOR_MODE_SHOW, 
+			  "MOKO_FINGER_SCROLL_INDICATOR_MODE_SHOW", "" },
+			{ MOKO_FINGER_SCROLL_INDICATOR_MODE_HIDE, 
+			  "MOKO_FINGER_SCROLL_INDICATOR_MODE_HIDE", "" },
+			{ 0, NULL, NULL }
+		};
+	
+		etype = g_enum_register_static (g_intern_static_string (
+			"MokoFingerScrollIndicatorMode"), values);
+	}
+	
+	return etype;
+}
+

Modified: trunk/src/target/OM-2007.2/libraries/libmokoui2/libmokoui/moko-finger-scroll.h
===================================================================
--- trunk/src/target/OM-2007.2/libraries/libmokoui2/libmokoui/moko-finger-scroll.h	2008-01-22 16:28:04 UTC (rev 3921)
+++ trunk/src/target/OM-2007.2/libraries/libmokoui2/libmokoui/moko-finger-scroll.h	2008-01-22 16:30:52 UTC (rev 3922)
@@ -22,15 +22,21 @@
 
 #include <glib-object.h>
 #include <gtk/gtk.h>
+#include "moko-type.h"
 
 G_BEGIN_DECLS
 
 #define MOKO_TYPE_FINGER_SCROLL moko_finger_scroll_get_type()
-#define MOKO_FINGER_SCROLL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MOKO_TYPE_FINGER_SCROLL, MokoFingerScroll))
-#define MOKO_FINGER_SCROLL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MOKO_TYPE_FINGER_SCROLL, MokoFingerScrollClass))
-#define MOKO_IS_FINGER_SCROLL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MOKO_TYPE_FINGER_SCROLL))
-#define MOKO_IS_FINGER_SCROLL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MOKO_TYPE_FINGER_SCROLL))
-#define MOKO_FINGER_SCROLL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MOKO_TYPE_FINGER_SCROLL, MokoFingerScrollClass))
+#define MOKO_FINGER_SCROLL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+	MOKO_TYPE_FINGER_SCROLL, MokoFingerScroll))
+#define MOKO_FINGER_SCROLL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), \
+	MOKO_TYPE_FINGER_SCROLL, MokoFingerScrollClass))
+#define MOKO_IS_FINGER_SCROLL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+	MOKO_TYPE_FINGER_SCROLL))
+#define MOKO_IS_FINGER_SCROLL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+	MOKO_TYPE_FINGER_SCROLL))
+#define MOKO_FINGER_SCROLL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+	MOKO_TYPE_FINGER_SCROLL, MokoFingerScrollClass))
 
 /**
  * MokoFingerScroll:
@@ -52,14 +58,23 @@
  * MokoFingerScrollMode:
  * @MOKO_FINGER_SCROLL_MODE_PUSH: Scrolling follows pointer
  * @MOKO_FINGER_SCROLL_MODE_ACCEL: Scrolling uses physics to "spin" the widget
+ * @MOKO_FINGER_SCROLL_MODE_AUTO: Automatically chooses between push and accel 
+ * modes, depending on input.
  *
  * Used to change the behaviour of the finger scrolling
  */
 typedef enum {
 	MOKO_FINGER_SCROLL_MODE_PUSH,
 	MOKO_FINGER_SCROLL_MODE_ACCEL,
+	MOKO_FINGER_SCROLL_MODE_AUTO
 } MokoFingerScrollMode;
 
+typedef enum {
+	MOKO_FINGER_SCROLL_INDICATOR_MODE_AUTO,
+	MOKO_FINGER_SCROLL_INDICATOR_MODE_SHOW,
+	MOKO_FINGER_SCROLL_INDICATOR_MODE_HIDE
+} MokoFingerScrollIndicatorMode;	
+
 GType moko_finger_scroll_get_type (void);
 
 GtkWidget* moko_finger_scroll_new (void);

Modified: trunk/src/target/OM-2007.2/libraries/libmokoui2/libmokoui/moko-type.h
===================================================================
--- trunk/src/target/OM-2007.2/libraries/libmokoui2/libmokoui/moko-type.h	2008-01-22 16:28:04 UTC (rev 3921)
+++ trunk/src/target/OM-2007.2/libraries/libmokoui2/libmokoui/moko-type.h	2008-01-22 16:30:52 UTC (rev 3922)
@@ -32,3 +32,4 @@
 G_END_DECLS
 
 #endif
+





More information about the commitlog mailing list