r253 - trunk/src/target/OM-2007/openmoko-libs/libmokoui
caowai_song at gta01.hmw-consulting.de
caowai_song at gta01.hmw-consulting.de
Fri Nov 24 10:25:14 CET 2006
Author: caowai_song
Date: 2006-11-24 09:25:10 +0000 (Fri, 24 Nov 2006)
New Revision: 253
Modified:
trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-finger-wheel.c
trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-finger-wheel.h
Log:
--Chaowei Song
Add there signal to the moko finger wheel widget. They are press_left_up,
press_right_down, and press_bottom.
Modified: trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-finger-wheel.c
===================================================================
--- trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-finger-wheel.c 2006-11-24 08:55:12 UTC (rev 252)
+++ trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-finger-wheel.c 2006-11-24 09:25:10 UTC (rev 253)
@@ -22,11 +22,19 @@
#include <gtk/gtkbutton.h>
#include <gtk/gtkwindow.h>
+enum {
+ PRESS_LEFT_UP,
+ PRESS_RIGHT_DOWN,
+ PRESS_BOTTOM,
+ LAST_SIGNAL
+};
+
G_DEFINE_TYPE (MokoFingerWheel, moko_finger_wheel, MOKO_TYPE_FIXED)
#define MOKO_FINGER_WHEEL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MOKO_TYPE_FINGER_WHEEL, MokoFingerWheelPrivate))
static MokoFixedClass *parent_class = NULL;
+static guint wheel_signals[LAST_SIGNAL] = { 0 };
typedef struct _MokoFingerWheelPrivate
{
@@ -77,11 +85,48 @@
object_class->dispose = moko_finger_wheel_dispose;
object_class->finalize = moko_finger_wheel_finalize;
+
+ /** Init the moko finger wheel signal to null */
+ klass->press_left_up = NULL;
+ klass->press_right_down = NULL;
+ klass->press_bottom = NULL;
+
+ /** Press the left up area */
+ wheel_signals[PRESS_LEFT_UP] =
+ g_signal_new ("press_left_up",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (MokoFingerWheelClass, press_left_up),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ /** Press the right down area */
+ wheel_signals[PRESS_RIGHT_DOWN] =
+ g_signal_new ("press_right_down",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (MokoFingerWheelClass, press_right_down),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ /** Press the bottom area */
+ wheel_signals[PRESS_BOTTOM] =
+ g_signal_new ("press_bottom",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (MokoFingerWheelClass, press_bottom),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
}
static void
moko_finger_wheel_init(MokoFingerWheel *self)
{
+ self->area_id = LAST_SIGNAL;
gtk_widget_set_name( GTK_WIDGET(self), "mokofingerwheel" );
}
@@ -166,6 +211,59 @@
gtk_widget_hide( priv->popup );
}
+/**
+ * @brief Caculate the area that user checked
+ */
+static void moko_finger_wheel_button_check_area (GtkWidget* widget, GdkEventButton* event)
+{
+ GtkRequisition req;
+
+ g_return_if_fail (MOKO_IS_FINGER_WHEEL (widget));
+
+ gtk_widget_size_request( widget, &req );
+ g_debug ("moko_finger_wheel_button_check_area");
+ g_debug ("The event x=%d, y=%d", (int)event->x, (int)event->y);
+ g_debug ("The req width=%d, height=%d", req.width, req.height);
+ if ( ((int)event->x) < ((int)req.width/2))
+ {
+ if ( ((int)event->y) < ((int)req.height/2))
+ {
+ MOKO_FINGER_WHEEL (widget)->area_id = PRESS_LEFT_UP;
+ }
+ else
+ {
+ MOKO_FINGER_WHEEL (widget)->area_id = PRESS_BOTTOM;
+ }
+ }
+ else
+ {
+ if ( ((int)event->y) < ((int)req.height/2))
+ {
+ MOKO_FINGER_WHEEL (widget)->area_id = LAST_SIGNAL;
+ }
+ else
+ {
+ MOKO_FINGER_WHEEL (widget)->area_id = PRESS_RIGHT_DOWN;
+ }
+ }
+}
+
+/**
+ * @brief Emit the signal
+ */
+static void moko_finger_wheel_button_emit_signal (GtkWidget* widget, GdkEventButton* event)
+{
+ g_return_if_fail (MOKO_IS_FINGER_WHEEL (widget));
+
+ if ((MOKO_FINGER_WHEEL (widget)->area_id <PRESS_LEFT_UP) ||
+ (MOKO_FINGER_WHEEL (widget)->area_id >= LAST_SIGNAL))
+ {
+ return;
+ }
+
+ g_signal_emit (widget, wheel_signals[MOKO_FINGER_WHEEL (widget)->area_id], 0);
+}
+
static gint moko_finger_wheel_button_press(GtkWidget* widget, GdkEventButton* event)
{
g_debug( "moko_finger_wheel_button_press" );
@@ -173,6 +271,9 @@
gtk_grab_add( widget );
gtk_widget_set_state( widget, GTK_STATE_ACTIVE );
gtk_style_set_background (widget->style, widget->window, GTK_STATE_ACTIVE);
+
+ moko_finger_wheel_button_check_area (widget, event);
+
return TRUE;
}
@@ -203,5 +304,7 @@
gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);
gtk_widget_set_state( widget, GTK_STATE_NORMAL );
gtk_grab_remove( widget );
+
+ moko_finger_wheel_button_emit_signal (widget, event);
return TRUE;
}
Modified: trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-finger-wheel.h
===================================================================
--- trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-finger-wheel.h 2006-11-24 08:55:12 UTC (rev 252)
+++ trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-finger-wheel.h 2006-11-24 09:25:10 UTC (rev 253)
@@ -34,10 +34,15 @@
typedef struct {
MokoFixed parent;
+ gint area_id;
} MokoFingerWheel;
typedef struct {
MokoFixedClass parent_class;
+
+ void (* press_left_up) (GtkWidget *button);
+ void (* press_right_down) (GtkWidget *button);
+ void (* press_bottom) (GtkWidget *button);
} MokoFingerWheelClass;
GType moko_finger_wheel_get_type (void);
More information about the commitlog
mailing list