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 = >K_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