r223 - in trunk/src/target/OM-2007: artwork/themes/openmoko-standard/gtk-2.0 examples/openmoko-finger-demo openmoko-libs/libmokoui

mickey at gta01.hmw-consulting.de mickey at gta01.hmw-consulting.de
Tue Nov 14 00:33:44 CET 2006


Author: mickey
Date: 2006-11-13 23:33:43 +0000 (Mon, 13 Nov 2006)
New Revision: 223

Added:
   trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/mokofingerwheel
   trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/wheel.png
   trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/wheel_p.png
Modified:
   trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/gtkrc
   trunk/src/target/OM-2007/examples/openmoko-finger-demo/demo-main.c
   trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-application.c
   trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-application.h
   trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-finger-wheel.c
   trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-finger-wheel.h
   trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-window.c
Log:
mokoui: MokoFingerWheel now shown/hidden properly :D


Modified: trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/gtkrc
===================================================================
--- trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/gtkrc	2006-11-13 18:47:30 UTC (rev 222)
+++ trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/gtkrc	2006-11-13 23:33:43 UTC (rev 223)
@@ -96,6 +96,7 @@
 include "gtkbutton"
 
 include "mokofingerbutton"
+include "mokofingerwheel"
 include "mokomenubox"
 include "mokopanedwindow"
 include "mokotoolbox"

Added: trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/mokofingerwheel
===================================================================
--- trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/mokofingerwheel	2006-11-13 18:47:30 UTC (rev 222)
+++ trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/mokofingerwheel	2006-11-13 23:33:43 UTC (rev 223)
@@ -0,0 +1,10 @@
+style "mokofingerwheel" {
+    bg_pixmap[NORMAL] = "wheel.png"
+    bg_pixmap[PRELIGHT] = "wheel.png"
+    bg_pixmap[ACTIVE] = "wheel_p.png"
+
+    MokoFixed::size-request = { 0, 152, 0, 152 }
+    MokoFixed::cargo-border = { 10, 43, 108, 140 }
+}
+widget "*.mokofingerwheel" style "mokofingerwheel"
+

Added: trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/wheel.png
===================================================================
(Binary files differ)


Property changes on: trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/wheel.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/wheel_p.png
===================================================================
(Binary files differ)


Property changes on: trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/wheel_p.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Modified: trunk/src/target/OM-2007/examples/openmoko-finger-demo/demo-main.c
===================================================================
--- trunk/src/target/OM-2007/examples/openmoko-finger-demo/demo-main.c	2006-11-13 18:47:30 UTC (rev 222)
+++ trunk/src/target/OM-2007/examples/openmoko-finger-demo/demo-main.c	2006-11-13 23:33:43 UTC (rev 223)
@@ -35,8 +35,6 @@
 #include <gtk/gtkvbox.h>
 #include <gtk/gtkentry.h>
 
-#include <stdlib.h>
-
 void cb_orange_button_clicked( GtkButton* button, MokoFingerWindow* window )
 {
     g_debug( "openmoko-finger-demo: orange button clicked" );

Modified: trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-application.c
===================================================================
--- trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-application.c	2006-11-13 18:47:30 UTC (rev 222)
+++ trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-application.c	2006-11-13 23:33:43 UTC (rev 223)
@@ -22,13 +22,15 @@
 #include <X11/Xatom.h>
 #include <gdk/gdkx.h>
 
-#define MOKO_APPLICATION_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), MOKO_TYPE_APPLICATION, MokoApplicationPriv));
+G_DEFINE_TYPE (MokoApplication, moko_application, G_TYPE_OBJECT)
 
-typedef struct _MokoApplicationPriv
+#define MOKO_APPLICATION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MOKO_TYPE_APPLICATION, MokoApplicationPrivate));
+
+typedef struct _MokoApplicationPrivate
 {
+    //FIXME hildon cruft, do we need all this?
     gboolean killable;
     gboolean is_topmost;
-    GdkWindow *group_leader;
     guint window_count;
     GtkWidget *common_application_menu;
     GtkWidget *common_filter_menu;
@@ -36,8 +38,12 @@
     GSList *windows;
     Window window_group;
     gchar *name;
-} MokoApplicationPriv;
 
+    // our stuff
+    MokoWindow* main_window;
+
+} MokoApplicationPrivate;
+
 enum
 {
     PROP_0,
@@ -50,32 +56,9 @@
 static void moko_application_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec);
 static void moko_application_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec);
 
-GType moko_application_get_type (void)
-{
-    static GType program_type = 0;
-
-    if (!program_type)
-    {
-        static const GTypeInfo program_info =
-        {
-            sizeof(MokoApplicationClass),
-            NULL,       /* base_init */
-            NULL,       /* base_finalize */
-            (GClassInitFunc) moko_application_class_init,
-            NULL,       /* class_finalize */
-            NULL,       /* class_data */
-            sizeof(MokoApplication),
-            0,  /* n_preallocs */
-            (GInstanceInitFunc) moko_application_init,
-        };
-        program_type = g_type_register_static(G_TYPE_OBJECT, "MokoApplication", &program_info, 0);
-    }
-    return program_type;
-}
-
 static void moko_application_init (MokoApplication *self)
 {
-    MokoApplicationPriv *priv = MOKO_APPLICATION_GET_PRIVATE (self);
+    MokoApplicationPrivate *priv = MOKO_APPLICATION_GET_PRIVATE (self);
 
     priv->killable = FALSE;
     priv->window_count = 0;
@@ -89,7 +72,7 @@
 
 static void moko_application_finalize (GObject *self)
 {
-    MokoApplicationPriv *priv = MOKO_APPLICATION_GET_PRIVATE (MOKO_APPLICATION(self));
+    MokoApplicationPrivate *priv = MOKO_APPLICATION_GET_PRIVATE (MOKO_APPLICATION(self));
 
     if (priv->common_toolbar)
     {
@@ -117,7 +100,7 @@
 {
     GObjectClass *object_class = G_OBJECT_CLASS(self);
 
-    g_type_class_add_private (self, sizeof(MokoApplicationPriv));
+    g_type_class_add_private (self, sizeof(MokoApplicationPrivate));
 
     /* Set up object virtual functions */
     object_class->finalize = moko_application_finalize;
@@ -162,7 +145,7 @@
 
 static void moko_application_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec)
 {
-    MokoApplicationPriv *priv = MOKO_APPLICATION_GET_PRIVATE (object);
+    MokoApplicationPrivate *priv = MOKO_APPLICATION_GET_PRIVATE (object);
 
     switch (property_id)
     {
@@ -210,12 +193,12 @@
     return GDK_FILTER_CONTINUE;
 }
 
-/* Public methods */
+/* Public API */
 
 /**
  * moko_application_get_instance:
  *
- * Return value: Returns the #MokoApplication for the current process.
+ * @return the #MokoApplication for the current process.
  * The object is created on the first call.
  **/
 MokoApplication* moko_application_get_instance (void)
@@ -224,9 +207,30 @@
 
     if (!program)
     {
-        program = g_object_new (MOKO_TYPE_APPLICATION, NULL);
+        program = g_object_new(MOKO_TYPE_APPLICATION, NULL);
     }
 
     return program;
 }
 
+/** moko_application_get_main_window
+ *
+ * @return the main #MokoWindow for the current #MokoApplication.
+ **/
+MokoWindow* moko_application_get_main_window(MokoApplication* self)
+{
+    MokoApplicationPrivate* priv = MOKO_APPLICATION_GET_PRIVATE(self);
+    return priv->main_window;
+}
+/** moko_application_set_main_window
+ *
+ * set the main #MokoWindow for this application
+ * @note usually there is no need to call this explicitly since
+ * it happens automatically when you create the first #MokoWindow
+ **/
+void moko_application_set_main_window(MokoApplication* self, MokoWindow* window)
+{
+    MokoApplicationPrivate* priv = MOKO_APPLICATION_GET_PRIVATE(self);
+    priv->main_window = window;
+    //FIXME g_object_ref the window?
+}

Modified: trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-application.h
===================================================================
--- trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-application.h	2006-11-13 18:47:30 UTC (rev 222)
+++ trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-application.h	2006-11-13 23:33:43 UTC (rev 223)
@@ -20,10 +20,13 @@
 #ifndef _MOKO_APPLICATION_H_
 #define _MOKO_APPLICATION_H_
 
-#include <glib-object.h>
+#include "moko-window.h"
+
 #include <gtk/gtkmenu.h>
 #include <gtk/gtktoolbar.h>
 
+#include <glib-object.h>
+
 G_BEGIN_DECLS
 
 #define MOKO_TYPE_APPLICATION (moko_application_get_type())
@@ -44,8 +47,9 @@
 
 /* Public methods */
 MokoApplication* moko_application_get_instance(void);
+gboolean moko_application_get_is_topmost(MokoApplication* self);
+void moko_application_set_main_window(MokoApplication* self, MokoWindow* window);
+MokoWindow* moko_application_get_main_window(MokoApplication* self);
 
-gboolean moko_application_get_is_topmost (MokoApplication* self);
-
 G_END_DECLS
 #endif /* _MOKO_APPLICATION_H_ */

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-13 18:47:30 UTC (rev 222)
+++ trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-finger-wheel.c	2006-11-13 23:33:43 UTC (rev 223)
@@ -16,18 +16,26 @@
  *  Current Version: $Rev$ ($Date: 2006/10/05 17:38:14 $) [$Author: mickey $]
  */
 
+#include "moko-application.h"
 #include "moko-finger-wheel.h"
 
+#include <gtk/gtkbutton.h>
+#include <gtk/gtkwindow.h>
+
 G_DEFINE_TYPE (MokoFingerWheel, moko_finger_wheel, MOKO_TYPE_FIXED)
 
-#define FINGER_WHEEL_PRIVATE(o)     (G_TYPE_INSTANCE_GET_PRIVATE ((o), MOKO_TYPE_FINGER_WHEEL, MokoFingerWheelPrivate))
+#define MOKO_FINGER_WHEEL_GET_PRIVATE(o)     (G_TYPE_INSTANCE_GET_PRIVATE ((o), MOKO_TYPE_FINGER_WHEEL, MokoFingerWheelPrivate))
 
+static MokoFixedClass *parent_class = NULL;
+
 typedef struct _MokoFingerWheelPrivate
 {
+    GtkWindow* popup;
 } MokoFingerWheelPrivate;
 
 /* forward declarations */
-/* ... */
+static void moko_finger_wheel_show (GtkWidget* widget);
+static void moko_finger_wheel_hide (GtkWidget* widget);
 
 static void
 moko_finger_wheel_dispose (GObject *object)
@@ -46,12 +54,17 @@
 moko_finger_wheel_class_init (MokoFingerWheelClass *klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
+    parent_class = g_type_class_peek_parent(klass);
 
     /* register private data */
     g_type_class_add_private (klass, sizeof (MokoFingerWheelPrivate));
 
     /* hook virtual methods */
-    /* ... */
+    GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
+    widget_class->show = moko_finger_wheel_show;
+    widget_class->hide = moko_finger_wheel_hide;
+    //widget_class->show_all = moko_finger_wheel_show;
+    //widget_class->hide_all = moko_finger_wheel_hide;
 
     /* install properties */
     /* ... */
@@ -63,10 +76,58 @@
 static void
 moko_finger_wheel_init (MokoFingerWheel *self)
 {
+    gtk_widget_set_name( GTK_WIDGET(self), "mokofingerwheel" );
 }
 
-MokoFingerWheel*
+GtkWidget*
 moko_finger_wheel_new (void)
 {
-    return g_object_new (MOKO_TYPE_FINGER_WHEEL, NULL);
+    return GTK_WIDGET(g_object_new(moko_finger_wheel_get_type(), NULL));
 }
+
+static void moko_finger_wheel_show (GtkWidget* widget)
+{
+    gtk_widget_ensure_style( widget ); //FIXME needed here?
+    g_debug( "moko_finger_wheel_show" );
+    GTK_WIDGET_CLASS(parent_class)->show(widget);
+    MokoFingerWheelPrivate* priv = MOKO_FINGER_WHEEL_GET_PRIVATE(widget);
+    if ( !priv->popup )
+    {
+        priv->popup = gtk_window_new(GTK_WINDOW_POPUP);
+        gtk_widget_set_name( GTK_WIDGET(priv->popup), "transparent" );
+        gtk_container_add( GTK_CONTAINER(priv->popup), widget );
+        MokoWindow* window = moko_application_get_main_window( moko_application_get_instance() );
+        GtkRequisition req;
+        gtk_widget_size_request( widget, &req );
+        //g_debug( "My requisition is %d, %d", req.width, req.height );
+        int x, y, w, h;
+        gdk_window_get_geometry( GTK_WIDGET(window)->window, &x, &y, &w, &h, NULL );
+        //g_debug( "WINDOW geometry is %d, %d * %d, %d", x, y, w, h );
+        int absx;
+        int absy;
+        gdk_window_get_origin( GTK_WIDGET(window)->window, &absx, &absy );
+        GtkAllocation* alloc = &GTK_WIDGET(window)->allocation;
+        //g_debug( "WINDOW allocation is %d, %d * %d, %d", alloc->x, alloc->y, alloc->width, alloc->height );
+        gtk_window_move( priv->popup, absx, absy + h - req.height );
+
+        //FIXME Isn't there a way to get this as a mask directly from the style without having to reload it?
+        GdkPixbuf* pixbuf = gdk_pixbuf_new_from_file(GTK_WIDGET(widget)->style->rc_style->bg_pixmap_name[GTK_STATE_NORMAL], NULL);
+        GdkPixmap* pixmap;
+        GdkBitmap* mask;
+        gdk_pixbuf_render_pixmap_and_mask(pixbuf, &pixmap, &mask, 128);
+        g_object_unref(G_OBJECT(pixbuf));
+
+        //GdkPixmap* mask = GTK_WIDGET(widget)->style->bg_pixmap[GTK_STATE_NORMAL];
+        gtk_widget_shape_combine_mask(priv->popup, mask, 0, 0);
+    }
+    gtk_widget_show( priv->popup );
+}
+
+static void moko_finger_wheel_hide (GtkWidget* widget)
+{
+    g_debug( "moko_finger_wheel_hide" );
+    GTK_WIDGET_CLASS(parent_class)->hide(widget);
+    MokoFingerWheelPrivate* priv = MOKO_FINGER_WHEEL_GET_PRIVATE(widget);
+    gtk_widget_hide( priv->popup );
+}
+

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-13 18:47:30 UTC (rev 222)
+++ trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-finger-wheel.h	2006-11-13 23:33:43 UTC (rev 223)
@@ -42,7 +42,7 @@
 
 GType moko_finger_wheel_get_type (void);
 
-MokoFingerWheel* moko_finger_wheel_new (void);
+GtkWidget* moko_finger_wheel_new (void);
 
 G_END_DECLS
 

Modified: trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-window.c
===================================================================
--- trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-window.c	2006-11-13 18:47:30 UTC (rev 222)
+++ trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-window.c	2006-11-13 23:33:43 UTC (rev 223)
@@ -16,6 +16,8 @@
  *
  *  Current Version: $Rev$ ($Date$) [$Author$]
  */
+
+#include "moko-application.h"
 #include "moko-window.h"
 
 /* add your signals here */
@@ -47,6 +49,9 @@
 {
     g_debug( "moko_window_init" );
     gtk_widget_set_size_request( GTK_WIDGET(self), 480, 640 ); //FIXME get from style
+    MokoApplication* app = moko_application_get_instance();
+    g_assert( !moko_application_get_main_window( app ) ); // fail if someone creates more than one MokoWindow per application
+    moko_application_set_main_window( app, self );
 }
 
 GtkWidget* moko_window_new() /* Construction */





More information about the commitlog mailing list