r256 - in trunk/src/target/OM-2007: artwork/themes/openmoko-standard/gtk-2.0 openmoko-libs/libmokoui

mickey at gta01.hmw-consulting.de mickey at gta01.hmw-consulting.de
Fri Nov 24 17:39:35 CET 2006


Author: mickey
Date: 2006-11-24 16:39:34 +0000 (Fri, 24 Nov 2006)
New Revision: 256

Modified:
   trunk/src/target/OM-2007/artwork/themes/openmoko-standard/gtk-2.0/mokofingertoolbox.png
   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-tool-box.c
Log:
mokoui: moko-finger-tool-box now starting to be usable


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

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-24 09:51:32 UTC (rev 255)
+++ trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-application.c	2006-11-24 16:39:34 UTC (rev 256)
@@ -93,7 +93,6 @@
     }
 
     g_free (priv->name);
-
 }
 
 static void moko_application_class_init (MokoApplicationClass *self)
@@ -234,3 +233,14 @@
     priv->main_window = window;
     //FIXME g_object_ref the window?
 }
+
+/** moko_application_get_style_pixmap_dir
+ *
+ * @return the style pixmap directory
+ * @note this is not necessarily $GTK_DATA_DIR/themes/$THEME_NAME/gtk-2.0/
+ **/
+gchar* moko_application_get_style_pixmap_dir()
+{
+    GtkStyle* style = gtk_rc_get_style_by_paths( gtk_settings_get_default(), "GtkWidget", "GtkWidget", GTK_TYPE_WIDGET );
+    return g_path_get_dirname( style->rc_style->bg_pixmap_name[GTK_STATE_NORMAL] );
+}

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-24 09:51:32 UTC (rev 255)
+++ trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-application.h	2006-11-24 16:39:34 UTC (rev 256)
@@ -51,5 +51,7 @@
 void moko_application_set_main_window(MokoApplication* self, MokoWindow* window);
 MokoWindow* moko_application_get_main_window(MokoApplication* self);
 
+gchar* moko_application_get_style_pixmap_dir(void);
+
 G_END_DECLS
 #endif /* _MOKO_APPLICATION_H_ */

Modified: trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-finger-tool-box.c
===================================================================
--- trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-finger-tool-box.c	2006-11-24 09:51:32 UTC (rev 255)
+++ trunk/src/target/OM-2007/openmoko-libs/libmokoui/moko-finger-tool-box.c	2006-11-24 16:39:34 UTC (rev 256)
@@ -26,6 +26,9 @@
 
 #define MOKO_FINGER_TOOL_BOX_GET_PRIVATE(o)     (G_TYPE_INSTANCE_GET_PRIVATE ((o), MOKO_TYPE_FINGER_TOOL_BOX, MokoFingerToolBoxPrivate))
 
+#define OUTER_PADDING 35
+#define INNER_PADDING 10
+
 static void moko_finger_tool_box_show(GtkWidget* widget);
 static void moko_finger_tool_box_hide(GtkWidget* widget);
 
@@ -33,6 +36,8 @@
 
 typedef struct _MokoFingerToolBoxPrivate
 {
+    GdkBitmap* mask;
+
     MokoPixmapButton* leftarrow;
     GtkHBox* hbox;
     MokoPixmapButton* rightarrow;
@@ -82,12 +87,10 @@
     object_class->finalize = moko_finger_tool_box_finalize;
 }
 
-static gboolean
-cb_expose(GtkWidget *widget, GdkEventExpose *event, MokoFingerToolBox* self)
+static void
+cb_size_allocate(GtkWidget* widget, GtkAllocation* allocation, MokoFingerToolBox* self)
 {
-    if ( GTK_WIDGET(self)->window != event->window )
-        return;
-    g_debug( "configure" );
+    g_debug( "size allocate %d, %d, %d, %d", allocation->x, allocation->y, allocation->width, allocation->height );
 
     MokoFingerToolBoxPrivate* priv = MOKO_FINGER_TOOL_BOX_GET_PRIVATE(self);
 
@@ -145,18 +148,65 @@
 
     g_debug( "left button = %d, right button = %d", priv->leftArrowVisible, priv->rightArrowVisible );
 
-    return FALSE;
+
+    //g_object_unref(G_OBJECT(alphapixbuf));
+    //g_object_unref(G_OBJECT(pixbuf));
+    //gtk_widget_shape_combine_mask(priv->popup, mask, 0, 0);
+
 }
 
 static void
+cb_configure(GtkWidget* widget, GtkAllocation* a, MokoFingerToolBox* self)
+{
+    //FIXME unref all existing pixmaps, check whether we really need to draw new ones
+
+    g_debug( "generating pixmaps for size = %d, %d", a->width, a->height );
+
+    MokoFingerToolBoxPrivate* priv = MOKO_FINGER_TOOL_BOX_GET_PRIVATE(self);
+
+    //FIXME generate all possible combinations of mask images, not just one w/ 4 buttons
+
+    gtk_widget_ensure_style( GTK_WIDGET(self) );
+    GtkStyle* style = gtk_rc_get_style( GTK_WIDGET(self) );
+    g_assert( style->rc_style );
+
+    GdkPixbuf* background = gdk_pixbuf_new_from_file( style->rc_style->bg_pixmap_name[GTK_STATE_NORMAL], NULL);
+    GdkPixbuf* pixbuf = gdk_pixbuf_scale_simple( background, a->width, a->height, GDK_INTERP_BILINEAR );
+    GdkPixbuf* button = gdk_pixbuf_new_from_file( g_build_filename( moko_application_get_style_pixmap_dir(), "btn_type03.png", NULL ), NULL );
+    guint w = gdk_pixbuf_get_width( button );
+    guint h = gdk_pixbuf_get_height( button );
+    guint x = OUTER_PADDING - 1;
+    guint y = 0;
+
+    gdk_pixbuf_copy_area( background, 0, 0, gdk_pixbuf_get_width( background ), gdk_pixbuf_get_height( background ), pixbuf, 0, 0 );
+
+    for ( int i = 0; i < 4; ++i )
+    {
+        //gdk_pixbuf_copy_area( button, 0, 0, w, h, pixbuf, x, y );
+
+        gdk_pixbuf_composite( button, pixbuf, x, y, w, h, x, y+2, 1, 1, GDK_INTERP_NEAREST, 255 );
+        x += w + INNER_PADDING - 2;
+    }
+#ifdef CRAZY_DEBUG_CODE
+    GtkWindow* window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
+    GtkImage* image = gtk_image_new_from_pixbuf( pixbuf );
+    gtk_container_add( GTK_CONTAINER(window), GTK_WIDGET(image) );
+    gtk_widget_show( image );
+    gtk_widget_show( window );
+#endif
+    GdkPixmap* pixmap;
+    gdk_pixbuf_render_pixmap_and_mask( pixbuf, &pixmap, &priv->mask, 1);
+    g_object_unref( pixmap );
+    gtk_widget_shape_combine_mask(priv->popup, priv->mask, 0, 0);
+}
+
+static void
 cb_left_button_pressed(GtkWidget* widget, MokoFingerToolBox* self)
 {
     g_debug( "left button pressed" );
     MokoFingerToolBoxPrivate* priv = MOKO_FINGER_TOOL_BOX_GET_PRIVATE(self);
     priv->leftButton -= priv->maxButtonsPerPage;
-    // force redraw
-    gtk_widget_queue_draw( priv->hbox );
-
+    //FIXME force redraw
 }
 
 static void
@@ -166,12 +216,12 @@
     MokoFingerToolBoxPrivate* priv = MOKO_FINGER_TOOL_BOX_GET_PRIVATE(self);
     priv->leftButton += priv->maxButtonsPerPage;
     // force redraw
-    gtk_widget_queue_draw( priv->hbox );
+    //FIXME force redraw
 }
 
 static void moko_finger_tool_box_show(GtkWidget* widget)
 {
-    gtk_widget_ensure_style( widget ); //FIXME needed here?
+    //gtk_widget_ensure_style( widget ); //FIXME needed here?
     g_debug( "moko_finger_wheel_show" );
     GTK_WIDGET_CLASS(parent_class)->show(widget);
     MokoFingerToolBoxPrivate* priv = MOKO_FINGER_TOOL_BOX_GET_PRIVATE(widget);
@@ -190,19 +240,13 @@
         //g_debug( "WINDOW geometry is %d, %d * %d, %d", x, y, w, h );
         int absx;
         int absy;
+
+        g_signal_connect_after( G_OBJECT(widget), "size_allocate", G_CALLBACK(cb_size_allocate), widget );
+
         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 + w - req.width, 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));
-
-        //gtk_widget_shape_combine_mask(priv->popup, mask, 0, 0);
     }
     gtk_widget_show( priv->popup );
 }
@@ -220,13 +264,14 @@
 {
     MokoFingerToolBoxPrivate* priv = MOKO_FINGER_TOOL_BOX_GET_PRIVATE(self);
     gtk_widget_set_name( GTK_WIDGET(self), "mokofingertoolbox" );
-    gtk_alignment_set_padding( GTK_ALIGNMENT(self), 0, 0, 35, 0 );
+    //FIXME get from theme
+    gtk_alignment_set_padding( GTK_ALIGNMENT(self), 0, 0, OUTER_PADDING, 0 );
     priv->leftarrow = MOKO_PIXMAP_BUTTON( moko_pixmap_button_new() );
     gtk_widget_set_name( GTK_WIDGET(priv->leftarrow), "mokofingertoolbox-leftarrow" );
     priv->rightarrow = MOKO_PIXMAP_BUTTON( moko_pixmap_button_new() );
     gtk_widget_set_name( GTK_WIDGET(priv->rightarrow), "mokofingertoolbox-rightarrow" );
 
-    priv->hbox = gtk_hbox_new( FALSE, 10 );
+    priv->hbox = gtk_hbox_new( FALSE, INNER_PADDING );
     gtk_container_add( GTK_CONTAINER(self), GTK_WIDGET(priv->hbox) );
 
     gtk_box_pack_start( GTK_BOX(priv->hbox), priv->leftarrow, FALSE, FALSE, 0 );
@@ -234,11 +279,11 @@
 
     gtk_widget_show( GTK_WIDGET(priv->hbox) );
 
-    g_signal_connect( G_OBJECT(self), "expose-event", G_CALLBACK(cb_expose), self );
-
     g_signal_connect( G_OBJECT(priv->leftarrow), "clicked", G_CALLBACK(cb_left_button_pressed), self );
     g_signal_connect( G_OBJECT(priv->rightarrow), "clicked", G_CALLBACK(cb_right_button_pressed), self );
 
+    g_signal_connect_after( G_OBJECT(self), "size-allocate", G_CALLBACK(cb_configure), self );
+
     //FIXME link with wheel
     gtk_widget_set_size_request( GTK_WIDGET(self), 350, 104 );
 }
@@ -266,6 +311,8 @@
 
     gtk_box_pack_start( GTK_BOX(priv->hbox), b, FALSE, FALSE, 0 );
     gtk_widget_show( GTK_WIDGET(b) );
+    // save button for inside the expose event we want to get its shape
+    //if ( !priv->button ) priv->button = b;
 
     // force redraw
     gtk_widget_queue_draw( priv->hbox );





More information about the commitlog mailing list