From 41416ba7f8944ac60a6c1d84409d05a2d9e4d787 Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Wed, 22 Jun 2011 15:19:49 -0400 Subject: port to gtk3 --- configure.ac | 57 +++++++++++++++++++++++++++++++++++++------------ src/Makefile.am | 4 ++-- src/indicator-sound.c | 56 ++++++++++++++++++++++++++++++++++-------------- src/metadata-widget.c | 12 ++++++----- src/metadata-widget.h | 6 +++++- src/transport-widget.c | 40 ++++++++++++++++++++++------------ src/transport-widget.h | 5 ++++- src/voip-input-widget.h | 5 +++++ src/volume-widget.h | 5 +++++ 9 files changed, 137 insertions(+), 53 deletions(-) diff --git a/configure.ac b/configure.ac index ab02d4e..0758182 100644 --- a/configure.ac +++ b/configure.ac @@ -23,11 +23,22 @@ AC_CONFIG_MACRO_DIR([m4]) m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) +########################### +# GTK+ version option +########################### + +AC_ARG_WITH([gtk], + [AS_HELP_STRING([--with-gtk], + [Which version of gtk to use for the indicator @<:@default=3@:>@])], + [], + [with_gtk=3]) + ########################### # Dependencies ########################### -GTK_REQUIRED_VERSION=2.12 +GTK_REQUIRED_VERSION=2.22 +GTK3_REQUIRED_VERSION=3.0 INDICATOR_REQUIRED_VERSION=0.3.19 DBUSMENUGTK_REQUIRED_VERSION=0.3.101 POLKIT_REQUIRED_VERSION=0.92 @@ -37,12 +48,22 @@ DBUSMENUGLIB_REQUIRED_VERSION=0.3.101 GIO_2_0_REQUIRED_VERSION=2.25.13 LIBNOTIFY_REQUIRED_VERSION=0.7.0 -PKG_CHECK_MODULES(APPLET, gtk+-2.0 >= $GTK_REQUIRED_VERSION - indicator >= $INDICATOR_REQUIRED_VERSION - dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION - libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS - libnotify >= $LIBNOTIFY_REQUIRED_VERSION) - +AS_IF([test "x$with_gtk" = x3], + [PKG_CHECK_MODULES(APPLET, gtk+-3.0 >= $GTK3_REQUIRED_VERSION + indicator3 >= $INDICATOR_REQUIRED_VERSION + dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION + libido3-0.1 >= $INDICATOR_DISPLAY_OBJECTS + libnotify >= $LIBNOTIFY_REQUIRED_VERSION) + ], + [test "x$with_gtk" = x2], + [PKG_CHECK_MODULES(APPLET, gtk+-2.0 >= $GTK_REQUIRED_VERSION + indicator >= $INDICATOR_REQUIRED_VERSION + dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION + libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS + libnotify >= $LIBNOTIFY_REQUIRED_VERSION) + ], + [AC_MSG_FAILURE([Value for --with-gtk was neither 2 nor 3])] +) AC_SUBST(APPLET_CFLAGS) AC_SUBST(APPLET_LIBS) @@ -53,7 +74,7 @@ AC_SUBST(PULSEAUDIO_CFLAGS) AC_SUBST(PULSEAUDIO_LIBS) PKG_CHECK_MODULES(SOUNDSERVICE, dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION - indicator >= $INDICATOR_REQUIRED_VERSION + indicator3 >= $INDICATOR_REQUIRED_VERSION gee-1.0 gio-unix-2.0 libxml-2.0) @@ -81,13 +102,20 @@ AC_ARG_ENABLE(localinstall, AS_HELP_STRING([--enable-localinstall], [install all # Indicator Info ########################### -if test "x$with_localinstall" = "xyes"; then +AS_IF([test "x$with_localinstall" = "xyes"], + [ INDICATORDIR="${libdir}/indicators/2/" - INDICATORICONSDIR="${datadir}/indicator-applet/icons/" -else - INDICATORDIR=`$PKG_CONFIG --variable=indicatordir indicator` - INDICATORICONSDIR=`$PKG_CONFIG --variable=iconsdir indicator` -fi + INDICATORICONSDIR="${datadir}/indicator-sound/icons/" + ], + [AS_IF([test "x$with_gtk" = "x2"], + [ + INDICATORDIR=`$PKG_CONFIG --variable=indicatordir indicator` + INDICATORICONSDIR=`$PKG_CONFIG --variable=iconsdir indicator` + ], + [ + INDICATORDIR=`$PKG_CONFIG --variable=indicatordir indicator3` + INDICATORICONSDIR=`$PKG_CONFIG --variable=iconsdir indicator3` + ])]) AC_SUBST(INDICATORDIR) AC_SUBST(INDICATORICONSDIR) @@ -160,4 +188,5 @@ AC_MSG_NOTICE([ SUS Indicator Configuration: Prefix: $prefix + GTK+: $with_gtk ]) diff --git a/src/Makefile.am b/src/Makefile.am index c546f0f..e35f871 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -118,11 +118,11 @@ DBUS_SPECS = \ gen-%.xml.h: %.xml @echo "Building $@ from $<" - @echo "extern const char * _$(subst -,_,$(subst .,_,$(basename $<)));" > $@ + @echo "extern const char * _$(subst -,_,$(subst .,_,$(basename $(notdir $<))));" > $@ gen-%.xml.c: %.xml @echo "Building $@ from $<" - @echo "const char * _$(subst -,_,$(subst .,_,$(basename $<))) = " > $@ + @echo "const char * _$(subst -,_,$(subst .,_,$(basename $(notdir $<)))) = " > $@ @sed -e "s:\":\\\\\":g" -e s:^:\": -e s:\$$:\\\\n\": $< >> $@ @echo ";" >> $@ diff --git a/src/indicator-sound.c b/src/indicator-sound.c index f2ec0a2..b8c0351 100644 --- a/src/indicator-sound.c +++ b/src/indicator-sound.c @@ -23,7 +23,11 @@ with this program. If not, see . #include #include #include +#if GTK_CHECK_VERSION(3, 0, 0) +#include +#else #include +#endif #include #include @@ -459,6 +463,26 @@ new_voip_slider_widget (DbusmenuMenuitem * newitem, //UI callbacks /******************************************************************/ +static GtkWidget * +get_current_item (GtkContainer * container) +{ + GList *children = gtk_container_get_children (container); + GList *iter; + GtkWidget *rv = NULL; + + /* Suprisingly, GTK+ doesn't really let us query "what is the currently + selected item?". But it does note it internally by prelighting the + widget, so we watch for that. */ + for (iter = children; iter; iter = iter->next) { + if (gtk_widget_get_state (GTK_WIDGET (iter->data)) & GTK_STATE_PRELIGHT) { + rv = GTK_WIDGET (iter->data); + break; + } + } + + return rv; +} + /** key_press_cb: **/ @@ -473,7 +497,7 @@ key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer data) IndicatorSoundPrivate* priv = INDICATOR_SOUND_GET_PRIVATE(indicator); GtkWidget *menuitem; - menuitem = GTK_MENU_SHELL (widget)->active_menu_item; + menuitem = get_current_item (GTK_CONTAINER (widget)); if (IDO_IS_SCALE_MENU_ITEM(menuitem) == TRUE){ gdouble current_value = 0; @@ -502,19 +526,19 @@ key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer data) } switch (event->keyval) { - case GDK_Right: + case GDK_KEY_Right: digested = TRUE; new_value = current_value + five_percent; break; - case GDK_Left: + case GDK_KEY_Left: digested = TRUE; new_value = current_value - five_percent; break; - case GDK_plus: + case GDK_KEY_plus: digested = TRUE; new_value = current_value + five_percent; break; - case GDK_minus: + case GDK_KEY_minus: digested = TRUE; new_value = current_value - five_percent; break; @@ -542,12 +566,12 @@ key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer data) } switch (event->keyval) { - case GDK_Right: + case GDK_KEY_Right: transport_widget_react_to_key_press_event ( transport_widget, TRANSPORT_ACTION_NEXT ); digested = TRUE; break; - case GDK_Left: + case GDK_KEY_Left: transport_widget_react_to_key_press_event ( transport_widget, TRANSPORT_ACTION_PREVIOUS ); digested = TRUE; @@ -557,8 +581,8 @@ key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer data) TRANSPORT_ACTION_PLAY_PAUSE ); digested = TRUE; break; - case GDK_Up: - case GDK_Down: + case GDK_KEY_Up: + case GDK_KEY_Down: digested = FALSE; break; default: @@ -585,7 +609,7 @@ key_release_cb(GtkWidget* widget, GdkEventKey* event, gpointer data) GtkWidget *menuitem; - menuitem = GTK_MENU_SHELL (widget)->active_menu_item; + menuitem = get_current_item (GTK_CONTAINER (widget)); if (IS_TRANSPORT_WIDGET(menuitem) == TRUE) { TransportWidget* transport_widget = NULL; GList* elem; @@ -597,12 +621,12 @@ key_release_cb(GtkWidget* widget, GdkEventKey* event, gpointer data) } switch (event->keyval) { - case GDK_Right: + case GDK_KEY_Right: transport_widget_react_to_key_release_event ( transport_widget, TRANSPORT_ACTION_NEXT ); digested = TRUE; break; - case GDK_Left: + case GDK_KEY_Left: transport_widget_react_to_key_release_event ( transport_widget, TRANSPORT_ACTION_PREVIOUS ); digested = TRUE; @@ -612,8 +636,8 @@ key_release_cb(GtkWidget* widget, GdkEventKey* event, gpointer data) TRANSPORT_ACTION_PLAY_PAUSE ); digested = TRUE; break; - case GDK_Up: - case GDK_Down: + case GDK_KEY_Up: + case GDK_KEY_Down: digested = FALSE; break; default: @@ -643,9 +667,9 @@ indicator_sound_scroll (IndicatorObject *io, gint delta, GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE (slider)); //g_debug("indicator-sound-scroll - current slider value %f", value); if (direction == INDICATOR_OBJECT_SCROLL_UP) { - value += adj->step_increment; + value += gtk_adjustment_get_step_increment (adj); } else { - value -= adj->step_increment; + value -= gtk_adjustment_get_step_increment (adj); } //g_debug("indicator-sound-scroll - update slider with value %f", value); volume_widget_update(VOLUME_WIDGET(priv->volume_widget), value, "scroll updates"); diff --git a/src/metadata-widget.c b/src/metadata-widget.c index f687d0c..5c1db2f 100644 --- a/src/metadata-widget.c +++ b/src/metadata-widget.c @@ -267,7 +267,7 @@ static void draw_album_border(GtkWidget *metadata, gboolean selected) { cairo_t *cr; - cr = gdk_cairo_create (metadata->window); + cr = gdk_cairo_create (gtk_widget_get_window (metadata)); GtkStyle *style; style = gtk_widget_get_style (metadata); @@ -357,7 +357,7 @@ static void draw_album_art_placeholder(GtkWidget *metadata) { cairo_t *cr; - cr = gdk_cairo_create (metadata->window); + cr = gdk_cairo_create (gtk_widget_get_window (metadata)); GtkStyle *style; style = gtk_widget_get_style (metadata); @@ -659,10 +659,12 @@ metadata_widget_icon_triangle_draw_cb (GtkWidget *widget, style = gtk_widget_get_style (widget); - cr = (cairo_t*) gdk_cairo_create (widget->window); + cr = (cairo_t*) gdk_cairo_create (gtk_widget_get_window (widget)); - x = widget->allocation.x; - y = widget->allocation.y; + GtkAllocation allocation; + gtk_widget_get_allocation (widget, &allocation); + x = allocation.x; + y = allocation.y; // Draw player icon if (priv->icon_buf != NULL){ diff --git a/src/metadata-widget.h b/src/metadata-widget.h index 30b629c..b0123a3 100644 --- a/src/metadata-widget.h +++ b/src/metadata-widget.h @@ -19,8 +19,12 @@ with this program. If not, see . #ifndef __METADATA_WIDGET_H__ #define __METADATA_WIDGET_H__ -#include +#include +#if GTK_CHECK_VERSION(3, 0, 0) +#include +#else #include +#endif G_BEGIN_DECLS diff --git a/src/transport-widget.c b/src/transport-widget.c index f05c4c1..f9b5319 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -104,8 +104,10 @@ G_DEFINE_TYPE (TransportWidget, transport_widget, GTK_TYPE_MENU_ITEM); /* essentials */ static void transport_widget_set_twin_item ( TransportWidget* self, DbusmenuMenuitem* twin_item); +#if ! GTK_CHECK_VERSION(3, 0, 0) static gboolean transport_widget_expose ( GtkWidget *button, GdkEventExpose *event); -static void draw (GtkWidget* button, cairo_t *cr); +#endif +static gboolean draw (GtkWidget* button, cairo_t *cr); /* UI and dbusmenu callbacks */ static gboolean transport_widget_button_press_event (GtkWidget *menuitem, @@ -133,8 +135,8 @@ static void transport_widget_react_to_button_release ( TransportWidget* button, TransportAction command); static void transport_widget_toggle_play_pause ( TransportWidget* button, TransportState update); -static void transport_widget_select (GtkItem* menu, gpointer Userdata); -static void transport_widget_deselect (GtkItem* menu, gpointer Userdata); +static void transport_widget_select (GtkWidget* menu, gpointer Userdata); +static void transport_widget_deselect (GtkWidget* menu, gpointer Userdata); static TransportAction transport_widget_collision_detection (gint x, gint y); static void transport_widget_start_timing (TransportWidget* widget); static gboolean transport_widget_trigger_seek (gpointer userdata); @@ -155,7 +157,11 @@ transport_widget_class_init (TransportWidgetClass *klass) widget_class->button_release_event = transport_widget_button_release_event; widget_class->motion_notify_event = transport_widget_motion_notify_event; widget_class->leave_notify_event = transport_widget_leave_notify_event; +#if GTK_CHECK_VERSION(3, 0, 0) + widget_class->draw = draw; +#else widget_class->expose_event = transport_widget_expose; +#endif gobject_class->dispose = transport_widget_dispose; gobject_class->finalize = transport_widget_finalize; @@ -212,11 +218,11 @@ transport_widget_init (TransportWidget *self) "notify", G_CALLBACK (transport_widget_notify), NULL); - g_signal_connect (GTK_ITEM(self), + g_signal_connect (G_OBJECT(self), "select", G_CALLBACK (transport_widget_select), NULL); - g_signal_connect (GTK_ITEM(self), + g_signal_connect (G_OBJECT(self), "deselect", G_CALLBACK (transport_widget_deselect), NULL); @@ -236,11 +242,12 @@ transport_widget_finalize (GObject *object) G_OBJECT_CLASS (transport_widget_parent_class)->finalize (object); } +#if ! GTK_CHECK_VERSION(3, 0, 0) static gboolean transport_widget_expose (GtkWidget *button, GdkEventExpose *event) { cairo_t *cr; - cr = gdk_cairo_create (button->window); + cr = gdk_cairo_create (gtk_widget_get_window (button)); //g_debug("In the playbutton's expose method, x = %i, y=%i and width: %i and height: %i'"); cairo_rectangle (cr, @@ -253,6 +260,7 @@ transport_widget_expose (GtkWidget *button, GdkEventExpose *event) cairo_destroy (cr); return FALSE; } +#endif gboolean transport_widget_is_selected ( TransportWidget* widget ) @@ -434,7 +442,7 @@ transport_widget_button_release_event (GtkWidget *menuitem, } static void -transport_widget_select (GtkItem* item, gpointer Userdata) +transport_widget_select (GtkWidget* item, gpointer Userdata) { TransportWidget* transport = TRANSPORT_WIDGET(item); TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE ( transport ); @@ -442,7 +450,7 @@ transport_widget_select (GtkItem* item, gpointer Userdata) } static void -transport_widget_deselect (GtkItem* item, gpointer Userdata) +transport_widget_deselect (GtkWidget* item, gpointer Userdata) { TransportWidget* transport = TRANSPORT_WIDGET(item); TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE ( transport ); @@ -1214,20 +1222,22 @@ _surface_blur (cairo_surface_t* surface, cairo_surface_mark_dirty (surface); } -static void +static gboolean draw (GtkWidget* button, cairo_t *cr) { - g_return_if_fail(IS_TRANSPORT_WIDGET(button)); - g_return_if_fail( cr != NULL ); + g_return_val_if_fail(IS_TRANSPORT_WIDGET(button), FALSE); + g_return_val_if_fail(cr != NULL, FALSE); TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(button); cairo_surface_t* surf = NULL; cairo_t* cr_surf = NULL; - cairo_translate (cr, button->allocation.x, button->allocation.y); + GtkAllocation allocation; + gtk_widget_get_allocation (button, &allocation); + cairo_translate (cr, allocation.x, allocation.y); - //g_debug("button x allocation = %i", button->allocation.x); - //g_debug("button y allocation = %i", button->allocation.y); + //g_debug("button x allocation = %i", allocation.x); + //g_debug("button y allocation = %i", allocation.y); GtkStyle *style; @@ -1795,6 +1805,8 @@ draw (GtkWidget* button, cairo_t *cr) FALSE); _finalize (cr, &cr_surf, &surf, PAUSE_X-0.5f, PAUSE_Y); } + + return FALSE; } static void diff --git a/src/transport-widget.h b/src/transport-widget.h index e5e91dc..8c2ce48 100644 --- a/src/transport-widget.h +++ b/src/transport-widget.h @@ -20,8 +20,11 @@ with this program. If not, see . #define __TRANSPORT_WIDGET_H__ #include -#include +#if GTK_CHECK_VERSION(3, 0, 0) +#include +#else #include +#endif #include "common-defs.h" diff --git a/src/voip-input-widget.h b/src/voip-input-widget.h index 29912f0..0e90665 100644 --- a/src/voip-input-widget.h +++ b/src/voip-input-widget.h @@ -21,7 +21,12 @@ with this program. If not, see . #include #include +#include +#if GTK_CHECK_VERSION(3, 0, 0) +#include +#else #include +#endif G_BEGIN_DECLS diff --git a/src/volume-widget.h b/src/volume-widget.h index 7012473..3deb99c 100644 --- a/src/volume-widget.h +++ b/src/volume-widget.h @@ -21,7 +21,12 @@ with this program. If not, see . #include #include +#include +#if GTK_CHECK_VERSION(3, 0, 0) +#include +#else #include +#endif #include G_BEGIN_DECLS -- cgit v1.2.3 From 4b03b559fa3b69930ae3d2dc769de1b9cc1a7c44 Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Mon, 27 Jun 2011 07:57:31 -0400 Subject: fix gtk3 not drawing transport widget at all --- src/transport-widget.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/transport-widget.c b/src/transport-widget.c index f9b5319..79eef63 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -1232,12 +1232,14 @@ draw (GtkWidget* button, cairo_t *cr) cairo_surface_t* surf = NULL; cairo_t* cr_surf = NULL; +#if ! GTK_CHECK_VERSION(3, 0, 0) GtkAllocation allocation; gtk_widget_get_allocation (button, &allocation); cairo_translate (cr, allocation.x, allocation.y); //g_debug("button x allocation = %i", allocation.x); //g_debug("button y allocation = %i", allocation.y); +#endif GtkStyle *style; -- cgit v1.2.3 From 7cb291db26cc9eaac065e8583626eeff755d7c5a Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Mon, 27 Jun 2011 14:54:46 +0100 Subject: metadatawidget now drawing the album art --- src/metadata-widget.c | 272 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 202 insertions(+), 70 deletions(-) diff --git a/src/metadata-widget.c b/src/metadata-widget.c index 5c1db2f..2c9960b 100644 --- a/src/metadata-widget.c +++ b/src/metadata-widget.c @@ -55,9 +55,6 @@ static void metadata_widget_class_init (MetadataWidgetClass *klass); static void metadata_widget_init (MetadataWidget *self); static void metadata_widget_dispose (GObject *object); static void metadata_widget_finalize (GObject *object); -static gboolean metadata_image_expose (GtkWidget *image, - GdkEventExpose *event, - gpointer user_data); static void metadata_widget_set_style (GtkWidget* button, GtkStyle* style); static void metadata_widget_set_twin_item (MetadataWidget* self, DbusmenuMenuitem* twin_item); @@ -72,15 +69,28 @@ static void metadata_widget_property_update (DbusmenuMenuitem* item, gpointer userdata); static void metadata_widget_style_labels ( MetadataWidget* self, GtkLabel* label); -static void draw_album_art_placeholder ( GtkWidget *metadata); -static void draw_album_border ( GtkWidget *metadata, gboolean selected); +static void draw_album_art_placeholder (GtkWidget *metadata); +static void draw_album_border (GtkWidget *metadata, gboolean selected); static void metadata_widget_selection_received_event_callback( GtkWidget *widget, GtkSelectionData *data, guint time, gpointer user_data); -static gboolean metadata_widget_icon_triangle_draw_cb ( GtkWidget *image, - GdkEventExpose *event, - gpointer user_data ); + +#if GTK_CHECK_VERSION(3, 0, 0) +static gboolean metadata_widget_icon_triangle_draw_cb_gtk_3 (GtkWidget *image, + cairo_t* cr, + gpointer user_data); +static gboolean metadata_image_expose_gtk_3 (GtkWidget *image, + cairo_t* cr, + gpointer user_data); +#else +static gboolean metadata_widget_icon_triangle_draw_cb (GtkWidget *image, + GdkEventExpose *event, + gpointer user_data); +static gboolean metadata_image_expose (GtkWidget *image, + GdkEventExpose *event, + gpointer user_data); +#endif static void metadata_widget_set_icon (MetadataWidget *self); static void metadata_widget_handle_resizing (MetadataWidget* self); @@ -102,8 +112,6 @@ metadata_widget_class_init (MetadataWidgetClass *klass) gobject_class->finalize = metadata_widget_finalize; } - - static void metadata_widget_init (MetadataWidget *self) { @@ -122,14 +130,23 @@ metadata_widget_init (MetadataWidget *self) priv->image_path = g_string_new(""); priv->old_image_path = g_string_new(""); + #if GTK_CHECK_VERSION(3, 0, 0) + g_signal_connect(priv->album_art, "draw", + G_CALLBACK(metadata_image_expose_gtk_3), + GTK_WIDGET(self)); + + g_signal_connect_after (GTK_WIDGET(self), "draw", + G_CALLBACK(metadata_widget_icon_triangle_draw_cb_gtk_3), + GTK_WIDGET(self)); + #else g_signal_connect(priv->album_art, "expose-event", G_CALLBACK(metadata_image_expose), GTK_WIDGET(self)); g_signal_connect_after (GTK_WIDGET(self), "expose-event", G_CALLBACK(metadata_widget_icon_triangle_draw_cb), - GTK_WIDGET(self)); - + GTK_WIDGET(self)); + #endif gtk_box_pack_start (GTK_BOX (priv->meta_data_h_box), priv->album_art, FALSE, @@ -211,13 +228,16 @@ metadata_widget_finalize (GObject *object) G_OBJECT_CLASS (metadata_widget_parent_class)->finalize (object); } - /** * We override the expose method to enable primitive drawing of the * empty album art image and rounded rectangles on the album art. */ + +#if GTK_CHECK_VERSION(3, 0, 0) static gboolean -metadata_image_expose (GtkWidget *metadata, GdkEventExpose *event, gpointer user_data) +metadata_image_expose_gtk_3 (GtkWidget *metadata, + cairo_t* cr, + gpointer user_data) { g_return_val_if_fail(IS_METADATA_WIDGET(user_data), FALSE); MetadataWidget* widget = METADATA_WIDGET(user_data); @@ -252,7 +272,117 @@ metadata_image_expose (GtkWidget *metadata, GdkEventExpose *event, gpointer user g_string_erase (priv->old_image_path, 0, -1); g_string_overwrite (priv->old_image_path, 0, priv->image_path->str); + g_object_unref(pixbuf); + } + return FALSE; + } + gtk_image_clear (GTK_IMAGE(priv->album_art)); + gtk_widget_set_size_request(GTK_WIDGET(priv->album_art), 60, 60); + draw_album_art_placeholder(metadata); + return FALSE; +} + +// Draw the triangle if the player is running ... +static gboolean +metadata_widget_icon_triangle_draw_cb_gtk_3 (GtkWidget *widget, + cairo_t* cr, + gpointer user_data) +{ + + g_return_val_if_fail(IS_METADATA_WIDGET(user_data), FALSE); + MetadataWidget* meta = METADATA_WIDGET(user_data); + MetadataWidgetPrivate * priv = METADATA_WIDGET_GET_PRIVATE(meta); + + GtkStyle *style; + int x, y, arrow_width, arrow_height; + + gint offset = 3; + arrow_width = 5; + arrow_height = 9; + + style = gtk_widget_get_style (widget); + + GtkAllocation allocation; + gtk_widget_get_allocation (widget, &allocation); + x = allocation.x; + y = allocation.y; + + g_debug ("icon expose method"); + + if (cr == NULL){ + g_debug ("Cairo context is null, get out of here"); + return; + } + // Draw player icon + if (priv->icon_buf != NULL){ + gdk_cairo_set_source_pixbuf (cr, + priv->icon_buf, + x + arrow_width + 1, + y + offset); + cairo_paint (cr); + } + + // Draw triangle but only if the player is running. + if (dbusmenu_menuitem_property_get_bool (priv->twin_item, + DBUSMENU_METADATA_MENUITEM_PLAYER_RUNNING)){ + y += (double)arrow_height/2.0 + offset; + cairo_set_line_width (cr, 1.0); + + cairo_move_to (cr, x, y); + cairo_line_to (cr, x, y + arrow_height); + cairo_line_to (cr, x + arrow_width, y + (double)arrow_height/2.0); + cairo_close_path (cr); + cairo_set_source_rgb (cr, style->fg[gtk_widget_get_state(widget)].red/65535.0, + style->fg[gtk_widget_get_state(widget)].green/65535.0, + style->fg[gtk_widget_get_state(widget)].blue/65535.0); + cairo_fill (cr); + } + + cairo_destroy (cr); + return FALSE; +} + +// GTK 2 Expose handler +#else + +static gboolean +metadata_image_expose (GtkWidget *metadata, + GdkEventExpose *event, + gpointer user_data) +{ + g_return_val_if_fail(IS_METADATA_WIDGET(user_data), FALSE); + MetadataWidget* widget = METADATA_WIDGET(user_data); + MetadataWidgetPrivate * priv = METADATA_WIDGET_GET_PRIVATE(widget); + + if ( TRUE == dbusmenu_menuitem_property_get_bool (DBUSMENU_MENUITEM(priv->twin_item), + DBUSMENU_METADATA_MENUITEM_HIDE_TRACK_DETAILS)) + { + return FALSE; + } + + draw_album_border(metadata, FALSE); + + if(priv->image_path->len > 0){ + if(g_string_equal(priv->image_path, priv->old_image_path) == FALSE || + priv->theme_change_occured == TRUE){ + priv->theme_change_occured = FALSE; + GdkPixbuf* pixbuf; + pixbuf = gdk_pixbuf_new_from_file_at_size(priv->image_path->str, 60, 60, NULL); + + if(GDK_IS_PIXBUF(pixbuf) == FALSE){ + gtk_image_clear ( GTK_IMAGE(priv->album_art)); + gtk_widget_set_size_request(GTK_WIDGET(priv->album_art), 60, 60); + draw_album_art_placeholder(metadata); + return FALSE; + } + + gtk_image_set_from_pixbuf(GTK_IMAGE(priv->album_art), pixbuf); + gtk_widget_set_size_request(GTK_WIDGET(priv->album_art), + gdk_pixbuf_get_width(pixbuf), + gdk_pixbuf_get_height(pixbuf)); + g_string_erase (priv->old_image_path, 0, -1); + g_string_overwrite (priv->old_image_path, 0, priv->image_path->str); g_object_unref(pixbuf); } return FALSE; @@ -263,6 +393,64 @@ metadata_image_expose (GtkWidget *metadata, GdkEventExpose *event, gpointer user return FALSE; } + +// Draw the triangle if the player is running ... +static gboolean +metadata_widget_icon_triangle_draw_cb (GtkWidget *widget, + GdkEventExpose *event, + gpointer user_data) +{ + g_return_val_if_fail(IS_METADATA_WIDGET(user_data), FALSE); + MetadataWidget* meta = METADATA_WIDGET(user_data); + MetadataWidgetPrivate * priv = METADATA_WIDGET_GET_PRIVATE(meta); + + GtkStyle *style; + cairo_t *cr; + int x, y, arrow_width, arrow_height; + + gint offset = 3; + arrow_width = 5; + arrow_height = 9; + + style = gtk_widget_get_style (widget); + + cr = (cairo_t*) gdk_cairo_create (gtk_widget_get_window (widget)); + + GtkAllocation allocation; + gtk_widget_get_allocation (widget, &allocation); + x = allocation.x; + y = allocation.y; + + // Draw player icon + if (priv->icon_buf != NULL){ + gdk_cairo_set_source_pixbuf (cr, + priv->icon_buf, + x + arrow_width + 1, + y + offset); + cairo_paint (cr); + } + + // Draw triangle but only if the player is running. + if (dbusmenu_menuitem_property_get_bool (priv->twin_item, + DBUSMENU_METADATA_MENUITEM_PLAYER_RUNNING)){ + y += (double)arrow_height/2.0 + offset; + cairo_set_line_width (cr, 1.0); + + cairo_move_to (cr, x, y); + cairo_line_to (cr, x, y + arrow_height); + cairo_line_to (cr, x + arrow_width, y + (double)arrow_height/2.0); + cairo_close_path (cr); + cairo_set_source_rgb (cr, style->fg[gtk_widget_get_state(widget)].red/65535.0, + style->fg[gtk_widget_get_state(widget)].green/65535.0, + style->fg[gtk_widget_get_state(widget)].blue/65535.0); + cairo_fill (cr); + } + + cairo_destroy (cr); + return FALSE; +} +#endif + static void draw_album_border(GtkWidget *metadata, gboolean selected) { @@ -639,62 +827,6 @@ metadata_widget_set_twin_item (MetadataWidget* self, metadata_widget_handle_resizing (self); } -// Draw the triangle if the player is running ... -static gboolean -metadata_widget_icon_triangle_draw_cb (GtkWidget *widget, - GdkEventExpose *event, - gpointer user_data) -{ - g_return_val_if_fail(IS_METADATA_WIDGET(user_data), FALSE); - MetadataWidget* meta = METADATA_WIDGET(user_data); - MetadataWidgetPrivate * priv = METADATA_WIDGET_GET_PRIVATE(meta); - - GtkStyle *style; - cairo_t *cr; - int x, y, arrow_width, arrow_height; - - gint offset = 3; - arrow_width = 5; - arrow_height = 9; - - style = gtk_widget_get_style (widget); - - cr = (cairo_t*) gdk_cairo_create (gtk_widget_get_window (widget)); - - GtkAllocation allocation; - gtk_widget_get_allocation (widget, &allocation); - x = allocation.x; - y = allocation.y; - - // Draw player icon - if (priv->icon_buf != NULL){ - gdk_cairo_set_source_pixbuf (cr, - priv->icon_buf, - x + arrow_width + 1, - y + offset); - cairo_paint (cr); - } - - // Draw triangle but only if the player is running. - if (dbusmenu_menuitem_property_get_bool (priv->twin_item, - DBUSMENU_METADATA_MENUITEM_PLAYER_RUNNING)){ - y += (double)arrow_height/2.0 + offset; - cairo_set_line_width (cr, 1.0); - - cairo_move_to (cr, x, y); - cairo_line_to (cr, x, y + arrow_height); - cairo_line_to (cr, x + arrow_width, y + (double)arrow_height/2.0); - cairo_close_path (cr); - cairo_set_source_rgb (cr, style->fg[gtk_widget_get_state(widget)].red/65535.0, - style->fg[gtk_widget_get_state(widget)].green/65535.0, - style->fg[gtk_widget_get_state(widget)].blue/65535.0); - cairo_fill (cr); - } - - cairo_destroy (cr); - return FALSE; -} - /** * transport_new: * @returns: a new #MetadataWidget. -- cgit v1.2.3 From b71505f2ebffc8b4c8766a6f2b5147fb61ee931e Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 28 Jun 2011 10:45:06 +0100 Subject: gtk widgets behaving themselves finally in gtk3 --- src/metadata-widget.c | 76 +++++++++++++++++++++++++++++++++++++++----------- src/transport-widget.c | 8 +++--- 2 files changed, 63 insertions(+), 21 deletions(-) diff --git a/src/metadata-widget.c b/src/metadata-widget.c index 2c9960b..7681be6 100644 --- a/src/metadata-widget.c +++ b/src/metadata-widget.c @@ -46,6 +46,7 @@ struct _MetadataWidgetPrivate GtkWidget* player_label; GdkPixbuf* icon_buf; DbusmenuMenuitem* twin_item; + gint current_height; }; #define METADATA_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), METADATA_WIDGET_TYPE, MetadataWidgetPrivate)) @@ -58,6 +59,13 @@ static void metadata_widget_finalize (GObject *object); static void metadata_widget_set_style (GtkWidget* button, GtkStyle* style); static void metadata_widget_set_twin_item (MetadataWidget* self, DbusmenuMenuitem* twin_item); +static void metadata_get_preferred_width (GtkWidget *widget, + gint *minimal_width, + gint *natural_width); +static void metadata_get_preferred_height (GtkWidget *widget, + gint *minimal_width, + gint *natural_width); + // keyevent consumers static gboolean metadata_widget_button_release_event (GtkWidget *menuitem, @@ -70,6 +78,7 @@ static void metadata_widget_property_update (DbusmenuMenuitem* item, static void metadata_widget_style_labels ( MetadataWidget* self, GtkLabel* label); static void draw_album_art_placeholder (GtkWidget *metadata); + static void draw_album_border (GtkWidget *metadata, gboolean selected); static void metadata_widget_selection_received_event_callback( GtkWidget *widget, GtkSelectionData *data, @@ -106,12 +115,36 @@ metadata_widget_class_init (MetadataWidgetClass *klass) widget_class->button_release_event = metadata_widget_button_release_event; + #if GTK_CHECK_VERSION(3, 0, 0) + widget_class->get_preferred_width = metadata_get_preferred_width; + widget_class->get_preferred_height = metadata_get_preferred_height; + #endif g_type_class_add_private (klass, sizeof (MetadataWidgetPrivate)); gobject_class->dispose = metadata_widget_dispose; gobject_class->finalize = metadata_widget_finalize; } +#if GTK_CHECK_VERSION(3, 0, 0) +static void +metadata_get_preferred_width (GtkWidget *widget, + gint *minimal_width, + gint *natural_width) +{ + *minimal_width = *natural_width = 200; +} + +static void +metadata_get_preferred_height (GtkWidget *widget, + gint *minimal_height, + gint *natural_height) +{ + //MetadataWidget* self = METADATA_WIDGET (widget); + //MetadataWidgetPrivate * priv = METADATA_WIDGET_GET_PRIVATE(self); + *minimal_height = *natural_height = 95;//priv->current_height; +} +#endif + static void metadata_widget_init (MetadataWidget *self) { @@ -124,13 +157,14 @@ metadata_widget_init (MetadataWidget *self) hbox = gtk_hbox_new(FALSE, 0); priv->meta_data_h_box = hbox; - + priv->current_height = 1; + // image priv->album_art = gtk_image_new(); priv->image_path = g_string_new(""); priv->old_image_path = g_string_new(""); - #if GTK_CHECK_VERSION(3, 0, 0) + #if GTK_CHECK_VERSION(3, 0, 0) g_signal_connect(priv->album_art, "draw", G_CALLBACK(metadata_image_expose_gtk_3), GTK_WIDGET(self)); @@ -206,9 +240,14 @@ metadata_widget_init (MetadataWidget *self) priv->player_label = player_label; gtk_box_pack_start (GTK_BOX(outer_v_box), priv->player_label, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(outer_v_box), priv->meta_data_h_box, FALSE, FALSE, 0); gtk_container_add (GTK_CONTAINER (self), outer_v_box); + + gtk_widget_show_all (priv->meta_data_h_box); + gtk_widget_set_no_show_all (priv->meta_data_h_box, TRUE); + gtk_widget_hide (priv->meta_data_h_box); } static void @@ -249,8 +288,8 @@ metadata_image_expose_gtk_3 (GtkWidget *metadata, return FALSE; } - draw_album_border(metadata, FALSE); - + draw_album_border (metadata, FALSE); + if(priv->image_path->len > 0){ if(g_string_equal(priv->image_path, priv->old_image_path) == FALSE || priv->theme_change_occured == TRUE){ @@ -305,14 +344,8 @@ metadata_widget_icon_triangle_draw_cb_gtk_3 (GtkWidget *widget, GtkAllocation allocation; gtk_widget_get_allocation (widget, &allocation); x = allocation.x; - y = allocation.y; - - g_debug ("icon expose method"); + y = 0; - if (cr == NULL){ - g_debug ("Cairo context is null, get out of here"); - return; - } // Draw player icon if (priv->icon_buf != NULL){ gdk_cairo_set_source_pixbuf (cr, @@ -328,6 +361,8 @@ metadata_widget_icon_triangle_draw_cb_gtk_3 (GtkWidget *widget, y += (double)arrow_height/2.0 + offset; cairo_set_line_width (cr, 1.0); + //g_debug ("triangle drawing"); + cairo_move_to (cr, x, y); cairo_line_to (cr, x, y + arrow_height); cairo_line_to (cr, x + arrow_width, y + (double)arrow_height/2.0); @@ -338,7 +373,6 @@ metadata_widget_icon_triangle_draw_cb_gtk_3 (GtkWidget *widget, cairo_fill (cr); } - cairo_destroy (cr); return FALSE; } @@ -695,25 +729,33 @@ metadata_widget_handle_resizing (MetadataWidget* self) { MetadataWidgetPrivate * priv = METADATA_WIDGET_GET_PRIVATE(self); + g_debug ("SHOW/HIDE TRACK DETAILS - %i", dbusmenu_menuitem_property_get_bool (priv->twin_item, DBUSMENU_METADATA_MENUITEM_HIDE_TRACK_DETAILS)); + if (dbusmenu_menuitem_property_get_bool (priv->twin_item, DBUSMENU_METADATA_MENUITEM_HIDE_TRACK_DETAILS) == TRUE){ + // TODO + // revert to hide + #if GTK_CHECK_VERSION(3, 0, 0) + gtk_widget_show (priv->meta_data_h_box); + #else gtk_widget_hide (priv->meta_data_h_box); gtk_widget_hide (priv->artist_label); gtk_widget_hide (priv->piece_label); gtk_widget_hide (priv->container_label); gtk_widget_hide (priv->album_art); - gtk_widget_hide (priv->meta_data_v_box); - gtk_widget_set_size_request(GTK_WIDGET(self), 200, 20); + gtk_widget_hide (priv->meta_data_v_box); + #endif } else{ - + #if GTK_CHECK_VERSION(3, 0, 0) + gtk_widget_show (priv->meta_data_h_box); + #else gtk_widget_show (priv->meta_data_h_box); gtk_widget_show (priv->artist_label); gtk_widget_show (priv->piece_label); gtk_widget_show (priv->container_label); gtk_widget_show (priv->album_art); - gtk_widget_show (priv->meta_data_v_box); - gtk_widget_set_size_request(GTK_WIDGET(self), 200, 95); + #endif } gtk_widget_queue_draw(GTK_WIDGET(self)); } diff --git a/src/transport-widget.c b/src/transport-widget.c index 79eef63..2c2bd48 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -31,7 +31,7 @@ Uses code from ctk #define RECT_WIDTH 130.0f #define Y 7.0f -#define X 80.0f +#define X 70.0f #define INNER_RADIUS 12.5 #define MIDDLE_RADIUS 13.0f #define OUTER_RADIUS 14.5f @@ -43,16 +43,16 @@ Uses code from ctk #define TRI_WIDTH 11.0f #define TRI_HEIGHT 13.0f #define TRI_OFFSET 6.0f -#define PREV_X 78.0f +#define PREV_X 68.0f #define PREV_Y 13.0f -#define NEXT_X 156.0f +#define NEXT_X 146.0f #define NEXT_Y 13.0f //prev_y #define PAUSE_WIDTH 21.0f #define PAUSE_HEIGHT 27.0f #define BAR_WIDTH 4.5f #define BAR_HEIGHT 24.0f #define BAR_OFFSET 10.0f -#define PAUSE_X 121.0f +#define PAUSE_X 111.0f #define PAUSE_Y 7.0f #define PLAY_WIDTH 28.0f #define PLAY_HEIGHT 29.0f -- cgit v1.2.3 From 61d2139ecadae8ba301fc7b760dc514541868ecc Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 28 Jun 2011 11:39:16 +0100 Subject: colours of buttons and blank album art background fixed --- src/metadata-widget.c | 5 +++++ src/transport-widget.c | 11 ++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/metadata-widget.c b/src/metadata-widget.c index 7681be6..d522358 100644 --- a/src/metadata-widget.c +++ b/src/metadata-widget.c @@ -490,6 +490,11 @@ draw_album_border(GtkWidget *metadata, gboolean selected) { cairo_t *cr; cr = gdk_cairo_create (gtk_widget_get_window (metadata)); + #if GTK_CHECK_VERSION(3, 0, 0) + gtk_style_context_add_class (gtk_widget_get_style_context (metadata), + "menu"); + #endif + GtkStyle *style; style = gtk_widget_get_style (metadata); diff --git a/src/transport-widget.c b/src/transport-widget.c index 2c2bd48..11e0f91 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -1235,14 +1235,15 @@ draw (GtkWidget* button, cairo_t *cr) #if ! GTK_CHECK_VERSION(3, 0, 0) GtkAllocation allocation; gtk_widget_get_allocation (button, &allocation); - cairo_translate (cr, allocation.x, allocation.y); - - //g_debug("button x allocation = %i", allocation.x); - //g_debug("button y allocation = %i", allocation.y); + cairo_translate (cr, allocation.x, allocation.y); #endif GtkStyle *style; - + +#if GTK_CHECK_VERSION(3, 0, 0) + gtk_style_context_add_class (gtk_widget_get_style_context (button), + "menu"); +#endif CairoColorRGB bg_color, fg_color, bg_selected, bg_prelight; CairoColorRGB color_middle[2], color_middle_prelight[2], color_outer[2], color_outer_prelight[2], color_play_outer[2], color_play_outer_prelight[2], -- cgit v1.2.3 From f11a6bb0c8bc68d0a6972e94140f7b5d96881dba Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 28 Jun 2011 14:50:44 +0100 Subject: bumped for release --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 0758182..bfc86f8 100644 --- a/configure.ac +++ b/configure.ac @@ -1,10 +1,10 @@ -AC_INIT(indicator-sound, 0.7.1, conor.curran@canonical.com) +AC_INIT(indicator-sound, 0.7.2, conor.curran@canonical.com) AC_PREREQ(2.53) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(indicator-sound, 0.7.1) +AM_INIT_AUTOMAKE(indicator-sound, 0.7.2) AM_MAINTAINER_MODE -- cgit v1.2.3 From 53d9d91cee9213f6858176a00f99d656cb115c4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Sat, 2 Jul 2011 05:31:37 +0200 Subject: Compile under gtk+-2.0 We need to properly check for indicator/indicator3 also for soundservice, to make this compile with gtk+-3 --- configure.ac | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/configure.ac b/configure.ac index bfc86f8..e18ae22 100644 --- a/configure.ac +++ b/configure.ac @@ -48,12 +48,23 @@ DBUSMENUGLIB_REQUIRED_VERSION=0.3.101 GIO_2_0_REQUIRED_VERSION=2.25.13 LIBNOTIFY_REQUIRED_VERSION=0.7.0 +PKG_CHECK_MODULES(PULSEAUDIO, libpulse-mainloop-glib >= $PULSE_AUDIO_REQUIRED_VERSION + gio-unix-2.0) +AC_SUBST(PULSEAUDIO_CFLAGS) +AC_SUBST(PULSEAUDIO_LIBS) + AS_IF([test "x$with_gtk" = x3], [PKG_CHECK_MODULES(APPLET, gtk+-3.0 >= $GTK3_REQUIRED_VERSION indicator3 >= $INDICATOR_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido3-0.1 >= $INDICATOR_DISPLAY_OBJECTS libnotify >= $LIBNOTIFY_REQUIRED_VERSION) + + PKG_CHECK_MODULES(SOUNDSERVICE, dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION + indicator3 + gee-1.0 + gio-unix-2.0 + libxml-2.0) ], [test "x$with_gtk" = x2], [PKG_CHECK_MODULES(APPLET, gtk+-2.0 >= $GTK_REQUIRED_VERSION @@ -61,23 +72,18 @@ AS_IF([test "x$with_gtk" = x3], dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS libnotify >= $LIBNOTIFY_REQUIRED_VERSION) + + PKG_CHECK_MODULES(SOUNDSERVICE, dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION + indicator + gee-1.0 + gio-unix-2.0 + libxml-2.0) ], [AC_MSG_FAILURE([Value for --with-gtk was neither 2 nor 3])] ) AC_SUBST(APPLET_CFLAGS) AC_SUBST(APPLET_LIBS) - -PKG_CHECK_MODULES(PULSEAUDIO, libpulse-mainloop-glib >= $PULSE_AUDIO_REQUIRED_VERSION - gio-unix-2.0) -AC_SUBST(PULSEAUDIO_CFLAGS) -AC_SUBST(PULSEAUDIO_LIBS) - -PKG_CHECK_MODULES(SOUNDSERVICE, dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION - indicator3 >= $INDICATOR_REQUIRED_VERSION - gee-1.0 - gio-unix-2.0 - libxml-2.0) AC_SUBST(SOUNDSERVICE_CFLAGS) AC_SUBST(SOUNDSERVICE_LIBS) -- cgit v1.2.3 From 458442a3554c306f93fca1efb95103ba9ec6c8ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Sat, 2 Jul 2011 05:32:23 +0200 Subject: Use the "entry-scrolled" signal instead of the old ones It follows the API change of libindicator --- src/indicator-sound.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/indicator-sound.c b/src/indicator-sound.c index b8c0351..76bf710 100644 --- a/src/indicator-sound.c +++ b/src/indicator-sound.c @@ -72,8 +72,8 @@ static GtkLabel * get_label (IndicatorObject * io); static GtkImage * get_icon (IndicatorObject * io); static GtkMenu * get_menu (IndicatorObject * io); static const gchar * get_accessible_desc (IndicatorObject * io); -static void indicator_sound_scroll (IndicatorObject* io, - gint delta, +static void indicator_sound_scroll (IndicatorObject * io, + IndicatorObjectEntry * entry, gint delta, IndicatorScrollDirection direction); //key/moust event handlers @@ -124,7 +124,7 @@ indicator_sound_class_init (IndicatorSoundClass *klass) io_class->get_image = get_icon; io_class->get_menu = get_menu; io_class->get_accessible_desc = get_accessible_desc; - io_class->scroll = indicator_sound_scroll; + io_class->entry_scrolled = indicator_sound_scroll; } static void @@ -648,8 +648,8 @@ key_release_cb(GtkWidget* widget, GdkEventKey* event, gpointer data) } static void -indicator_sound_scroll (IndicatorObject *io, gint delta, - IndicatorScrollDirection direction) +indicator_sound_scroll (IndicatorObject * io, IndicatorObjectEntry * entry, + gint delta, IndicatorScrollDirection direction) { //g_debug("indicator-sound-scroll - current slider value"); IndicatorSoundPrivate* priv = INDICATOR_SOUND_GET_PRIVATE(INDICATOR_SOUND (io)); -- cgit v1.2.3 From ffd0bd8160dde014d14f31cf3c5f0ab904aee654 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 6 Jul 2011 12:50:58 +0100 Subject: fixed the collapsing and expanding of the metadata widget, removed some unnecessary gtk3 stuff I thought that was necessary, tidied metadatawidget plus added a timeout for the metadata prop update query --- src/metadata-widget.c | 58 ++-------------------------------- src/mpris2-controller.vala | 78 +++++++++++++++++++++++----------------------- src/player-item.vala | 2 ++ 3 files changed, 43 insertions(+), 95 deletions(-) diff --git a/src/metadata-widget.c b/src/metadata-widget.c index d522358..f3f856c 100644 --- a/src/metadata-widget.c +++ b/src/metadata-widget.c @@ -59,14 +59,6 @@ static void metadata_widget_finalize (GObject *object); static void metadata_widget_set_style (GtkWidget* button, GtkStyle* style); static void metadata_widget_set_twin_item (MetadataWidget* self, DbusmenuMenuitem* twin_item); -static void metadata_get_preferred_width (GtkWidget *widget, - gint *minimal_width, - gint *natural_width); -static void metadata_get_preferred_height (GtkWidget *widget, - gint *minimal_width, - gint *natural_width); - - // keyevent consumers static gboolean metadata_widget_button_release_event (GtkWidget *menuitem, GdkEventButton *event); @@ -85,7 +77,7 @@ static void metadata_widget_selection_received_event_callback( GtkWidget guint time, gpointer user_data); -#if GTK_CHECK_VERSION(3, 0, 0) +#if GTK_CHECK_VERSION(3, 0, 0) static gboolean metadata_widget_icon_triangle_draw_cb_gtk_3 (GtkWidget *image, cairo_t* cr, gpointer user_data); @@ -115,36 +107,12 @@ metadata_widget_class_init (MetadataWidgetClass *klass) widget_class->button_release_event = metadata_widget_button_release_event; - #if GTK_CHECK_VERSION(3, 0, 0) - widget_class->get_preferred_width = metadata_get_preferred_width; - widget_class->get_preferred_height = metadata_get_preferred_height; - #endif g_type_class_add_private (klass, sizeof (MetadataWidgetPrivate)); gobject_class->dispose = metadata_widget_dispose; gobject_class->finalize = metadata_widget_finalize; } -#if GTK_CHECK_VERSION(3, 0, 0) -static void -metadata_get_preferred_width (GtkWidget *widget, - gint *minimal_width, - gint *natural_width) -{ - *minimal_width = *natural_width = 200; -} - -static void -metadata_get_preferred_height (GtkWidget *widget, - gint *minimal_height, - gint *natural_height) -{ - //MetadataWidget* self = METADATA_WIDGET (widget); - //MetadataWidgetPrivate * priv = METADATA_WIDGET_GET_PRIVATE(self); - *minimal_height = *natural_height = 95;//priv->current_height; -} -#endif - static void metadata_widget_init (MetadataWidget *self) { @@ -712,10 +680,7 @@ metadata_widget_property_update(DbusmenuMenuitem* item, gchar* property, else if(g_ascii_strcasecmp(DBUSMENU_METADATA_MENUITEM_ARTURL, property) == 0){ g_string_erase(priv->image_path, 0, -1); g_string_overwrite(priv->image_path, 0, g_variant_get_string (value, NULL)); - // if its a remote image queue a redraw incase the download took too long - //if (g_str_has_prefix(g_variant_get_string (value, NULL), g_get_user_cache_dir())){ gtk_widget_queue_draw(GTK_WIDGET(mitem)); - //} } else if (g_ascii_strcasecmp (DBUSMENU_METADATA_MENUITEM_PLAYER_NAME, property) == 0){ gtk_label_set_label (GTK_LABEL (priv->player_label), @@ -734,33 +699,14 @@ metadata_widget_handle_resizing (MetadataWidget* self) { MetadataWidgetPrivate * priv = METADATA_WIDGET_GET_PRIVATE(self); - g_debug ("SHOW/HIDE TRACK DETAILS - %i", dbusmenu_menuitem_property_get_bool (priv->twin_item, DBUSMENU_METADATA_MENUITEM_HIDE_TRACK_DETAILS)); + //g_debug ("SHOW/HIDE TRACK DETAILS - %i", dbusmenu_menuitem_property_get_bool (priv->twin_item, DBUSMENU_METADATA_MENUITEM_HIDE_TRACK_DETAILS)); if (dbusmenu_menuitem_property_get_bool (priv->twin_item, DBUSMENU_METADATA_MENUITEM_HIDE_TRACK_DETAILS) == TRUE){ - // TODO - // revert to hide - #if GTK_CHECK_VERSION(3, 0, 0) - gtk_widget_show (priv->meta_data_h_box); - #else gtk_widget_hide (priv->meta_data_h_box); - gtk_widget_hide (priv->artist_label); - gtk_widget_hide (priv->piece_label); - gtk_widget_hide (priv->container_label); - gtk_widget_hide (priv->album_art); - gtk_widget_hide (priv->meta_data_v_box); - #endif } else{ - #if GTK_CHECK_VERSION(3, 0, 0) - gtk_widget_show (priv->meta_data_h_box); - #else gtk_widget_show (priv->meta_data_h_box); - gtk_widget_show (priv->artist_label); - gtk_widget_show (priv->piece_label); - gtk_widget_show (priv->container_label); - gtk_widget_show (priv->album_art); - #endif } gtk_widget_queue_draw(GTK_WIDGET(self)); } diff --git a/src/mpris2-controller.vala b/src/mpris2-controller.vala index 2975066..8eeac08 100644 --- a/src/mpris2-controller.vala +++ b/src/mpris2-controller.vala @@ -19,10 +19,6 @@ with this program. If not, see . using Dbusmenu; using Transport; -/* - This class will entirely replace mpris-controller.vala hence why there is no - point in trying to get encorporate both into the same object model. - */ public class Mpris2Controller : GLib.Object { public MprisRoot mpris2_root {get; construct;} @@ -60,12 +56,22 @@ public class Mpris2Controller : GLib.Object critical("Problems connecting to the session bus - %s", e.message); } } - + /* + * property_changed_cb + * Called when a property changed signal is emitted from any of mpris + * objects on the bus. + * Note that the signal will be received by each instance for each player + * and at that moment there is no way to know what player that signal + * came from therefore it is necessary to query each relevant property + * to update the respective dbusmenuitem property inorder to keep the UI in sync + * Please also note due to some race condition in the depths of gdbus + * a timeout is needed between receiving the prop update and query the respective property. + * This can be seen at various points below. + */ public void property_changed_cb ( string interface_source, HashTable changed_properties, string[] invalid ) { - //debug("properties-changed for interface %s and owner %s", interface_source, this.owner.dbus_name); if ( changed_properties == null || interface_source.has_prefix ( MPRIS_PREFIX ) == false ){ warning("Property-changed hash is null or this is an interface that doesn't concern us"); @@ -73,31 +79,18 @@ public class Mpris2Controller : GLib.Object } Variant? play_v = changed_properties.lookup("PlaybackStatus"); if(play_v != null){ - // Race condition sometimes appears with the playback status - // 200ms timeout ensures we have the correct playback status at all times. string state = this.player.PlaybackStatus; - //debug("in the property update and the playback status = %s and update = %s", state, (string)play_v); Timeout.add ( 200, ensure_correct_playback_status ); Transport.State p = (Transport.State)this.determine_play_state(state); (this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(p); } Variant? meta_v = changed_properties.lookup("Metadata"); - if(meta_v != null){ - GLib.HashTable changed_updates = clean_metadata(); - PlayerItem metadata = this.owner.custom_items[PlayerController.widget_order.METADATA]; - metadata.reset (MetadataMenuitem.relevant_attributes_for_ui()); - metadata.update ( changed_updates, - MetadataMenuitem.relevant_attributes_for_ui()); - MetadataMenuitem md = this.owner.custom_items[PlayerController.widget_order.METADATA] as MetadataMenuitem; - bool collapsing = !metadata.populated(MetadataMenuitem.relevant_attributes_for_ui()); - md.should_collapse(collapsing); - - debug ("Should metadata collapse %s", collapsing.to_string()); + if(meta_v != null) + { + Timeout.add ( 200, ensure_correct_metadata ); } Variant? playlist_v = changed_properties.lookup("ActivePlaylist"); if ( playlist_v != null && this.owner.use_playlists == true ){ - // Once again A GDBus race condition, the property_changed signal is sent - // before the value is set on the respective property. Timeout.add (300, this.fetch_active_playlist); } Variant? playlist_count_v = changed_properties.lookup("PlaylistCount"); @@ -116,9 +109,23 @@ public class Mpris2Controller : GLib.Object md.alter_label (this.mpris2_root.Identity); } } - - private bool ensure_correct_playback_status(){ - //debug("TEST playback status = %s", this.player.PlaybackStatus); + + private bool ensure_correct_metadata () + { + GLib.HashTable changed_updates = clean_metadata(); + PlayerItem metadata = this.owner.custom_items[PlayerController.widget_order.METADATA]; + metadata.reset (MetadataMenuitem.relevant_attributes_for_ui()); + metadata.update ( changed_updates, + MetadataMenuitem.relevant_attributes_for_ui()); + MetadataMenuitem md = this.owner.custom_items[PlayerController.widget_order.METADATA] as MetadataMenuitem; + bool collapsing = !metadata.populated(MetadataMenuitem.relevant_attributes_for_ui()); + md.should_collapse(collapsing); + + return false; + } + + private bool ensure_correct_playback_status() + { Transport.State p = (Transport.State)this.determine_play_state(this.player.PlaybackStatus); (this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(p); return false; @@ -130,19 +137,16 @@ public class Mpris2Controller : GLib.Object Variant? artist_v = this.player.Metadata.lookup("xesam:artist"); if(artist_v != null){ - Variant? v_artists = this.player.Metadata.lookup("xesam:artist"); - //debug("artists is of type %s", v_artists.get_type_string ()); string display_artists; - if(v_artists.get_type_string() == "s"){ - //debug("SPOTIFY is that you ?"); - display_artists = v_artists.get_string(); + // Accomodate Spotify (should return 'as' and not 's') + if(artist_v.get_type_string() == "s"){ + display_artists = artist_v.get_string(); } else{ - string[] artists = v_artists.dup_strv(); + string[] artists = artist_v.dup_strv(); display_artists = string.joinv(", ", artists); } changed_updates.replace("xesam:artist", display_artists); - //debug("artist : %s", (string)changed_updates.lookup("xesam:artist")); } return changed_updates; } @@ -181,7 +185,6 @@ public class Mpris2Controller : GLib.Object public void transport_update(Transport.Action command) { - //debug("transport_event input = %i", (int)command); if(command == Transport.Action.PLAY_PAUSE){ this.player.PlayPause.begin(); } @@ -192,11 +195,9 @@ public class Mpris2Controller : GLib.Object this.player.Next.begin(); } else if(command == Transport.Action.REWIND){ - //debug("transport_event rewind = %i", (int)command); this.player.Seek.begin(-500000); } else if(command == Transport.Action.FORWIND){ - //debug("transport_event input = %i", (int)command); this.player.Seek.begin(400000); } } @@ -230,12 +231,10 @@ public class Mpris2Controller : GLib.Object false); } catch (IOError e){ - //debug("Could not fetch playlists because %s", e.message); return; } if( current_playlists != null ){ - //debug( "Size of the playlist array = %i", current_playlists.length ); PlaylistsMenuitem playlists_item = this.owner.custom_items[PlayerController.widget_order.PLAYLISTS] as PlaylistsMenuitem; playlists_item.update(current_playlists); } @@ -248,7 +247,8 @@ public class Mpris2Controller : GLib.Object private bool fetch_active_playlist() { if (this.playlists.ActivePlaylist.valid == false){ - //debug(" We don't have an active playlist"); + // TODO + // What happens here ? } PlaylistsMenuitem playlists_item = this.owner.custom_items[PlayerController.widget_order.PLAYLISTS] as PlaylistsMenuitem; playlists_item.active_playlist_update ( this.playlists.ActivePlaylist.details ); @@ -261,7 +261,7 @@ public class Mpris2Controller : GLib.Object this.playlists.ActivatePlaylist.begin(path); } catch(IOError e){ - //debug("Could not activate playlist %s because %s", (string)path, e.message); + warning ("Could not activate playlist %s because %s", (string)path, e.message); } } } diff --git a/src/player-item.vala b/src/player-item.vala index 162dbea..7867653 100644 --- a/src/player-item.vala +++ b/src/player-item.vala @@ -61,6 +61,8 @@ public class PlayerItem : Dbusmenu.Menuitem //debug("search key = %s", search_key); Variant? v = data.lookup(search_key); + if (v == null) continue; + if (v.is_of_type ( VariantType.STRING )){ string update = v.get_string().strip(); //debug("with value : %s", update); -- cgit v1.2.3 From 0fbfa4d67da89c27a67c3b0144ecdd7f0b39185f Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 7 Jul 2011 11:18:29 +0100 Subject: removed another debug@ --- src/metadata-widget.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/metadata-widget.c b/src/metadata-widget.c index f3f856c..d34f1fc 100644 --- a/src/metadata-widget.c +++ b/src/metadata-widget.c @@ -698,9 +698,7 @@ static void metadata_widget_handle_resizing (MetadataWidget* self) { MetadataWidgetPrivate * priv = METADATA_WIDGET_GET_PRIVATE(self); - - //g_debug ("SHOW/HIDE TRACK DETAILS - %i", dbusmenu_menuitem_property_get_bool (priv->twin_item, DBUSMENU_METADATA_MENUITEM_HIDE_TRACK_DETAILS)); - + if (dbusmenu_menuitem_property_get_bool (priv->twin_item, DBUSMENU_METADATA_MENUITEM_HIDE_TRACK_DETAILS) == TRUE){ gtk_widget_hide (priv->meta_data_h_box); -- cgit v1.2.3 From 8aaa84d760edf04412e8a80c1b876cc74e709cb6 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 7 Jul 2011 17:02:53 +0100 Subject: autofoo fixes for the new libindicator --- configure.ac | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index e18ae22..7cc74a4 100644 --- a/configure.ac +++ b/configure.ac @@ -55,26 +55,26 @@ AC_SUBST(PULSEAUDIO_LIBS) AS_IF([test "x$with_gtk" = x3], [PKG_CHECK_MODULES(APPLET, gtk+-3.0 >= $GTK3_REQUIRED_VERSION - indicator3 >= $INDICATOR_REQUIRED_VERSION + indicator3-0.4 >= $INDICATOR_REQUIRED_VERSION dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido3-0.1 >= $INDICATOR_DISPLAY_OBJECTS libnotify >= $LIBNOTIFY_REQUIRED_VERSION) PKG_CHECK_MODULES(SOUNDSERVICE, dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION - indicator3 + indicator3-0.4 gee-1.0 gio-unix-2.0 libxml-2.0) ], [test "x$with_gtk" = x2], [PKG_CHECK_MODULES(APPLET, gtk+-2.0 >= $GTK_REQUIRED_VERSION - indicator >= $INDICATOR_REQUIRED_VERSION + indicator-0.4 >= $INDICATOR_REQUIRED_VERSION dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS libnotify >= $LIBNOTIFY_REQUIRED_VERSION) PKG_CHECK_MODULES(SOUNDSERVICE, dbusmenu-glib-0.4 >= $DBUSMENUGLIB_REQUIRED_VERSION - indicator + indicator-0.4 gee-1.0 gio-unix-2.0 libxml-2.0) -- cgit v1.2.3 From 14f54b95128ac1d17d1c7aa8b2bcf46853fff3d5 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 7 Jul 2011 17:14:07 +0100 Subject: bumped for new release --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 7cc74a4..e6642f8 100644 --- a/configure.ac +++ b/configure.ac @@ -1,10 +1,10 @@ -AC_INIT(indicator-sound, 0.7.2, conor.curran@canonical.com) +AC_INIT(indicator-sound, 0.7.3, conor.curran@canonical.com) AC_PREREQ(2.53) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(indicator-sound, 0.7.2) +AM_INIT_AUTOMAKE(indicator-sound, 0.7.3) AM_MAINTAINER_MODE -- cgit v1.2.3 From 9cf6078cf0fa9a074fe1fe4ba11c73be71f610ad Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 7 Jul 2011 15:38:10 -0500 Subject: Using the right pkgconfig file for the indicator directories. --- configure.ac | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index e6642f8..184de39 100644 --- a/configure.ac +++ b/configure.ac @@ -115,12 +115,12 @@ AS_IF([test "x$with_localinstall" = "xyes"], ], [AS_IF([test "x$with_gtk" = "x2"], [ - INDICATORDIR=`$PKG_CONFIG --variable=indicatordir indicator` - INDICATORICONSDIR=`$PKG_CONFIG --variable=iconsdir indicator` + INDICATORDIR=`$PKG_CONFIG --variable=indicatordir indicator-0.4` + INDICATORICONSDIR=`$PKG_CONFIG --variable=iconsdir indicator-0.4` ], [ - INDICATORDIR=`$PKG_CONFIG --variable=indicatordir indicator3` - INDICATORICONSDIR=`$PKG_CONFIG --variable=iconsdir indicator3` + INDICATORDIR=`$PKG_CONFIG --variable=indicatordir indicator3-0.4` + INDICATORICONSDIR=`$PKG_CONFIG --variable=iconsdir indicator3-0.4` ])]) AC_SUBST(INDICATORDIR) AC_SUBST(INDICATORICONSDIR) -- cgit v1.2.3 From 2040bd4fac080fea48853ff98c6d05c1cab68c18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 8 Jul 2011 04:46:19 +0200 Subject: Compile with indicator-0.4 --- configure.ac | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index e6642f8..184de39 100644 --- a/configure.ac +++ b/configure.ac @@ -115,12 +115,12 @@ AS_IF([test "x$with_localinstall" = "xyes"], ], [AS_IF([test "x$with_gtk" = "x2"], [ - INDICATORDIR=`$PKG_CONFIG --variable=indicatordir indicator` - INDICATORICONSDIR=`$PKG_CONFIG --variable=iconsdir indicator` + INDICATORDIR=`$PKG_CONFIG --variable=indicatordir indicator-0.4` + INDICATORICONSDIR=`$PKG_CONFIG --variable=iconsdir indicator-0.4` ], [ - INDICATORDIR=`$PKG_CONFIG --variable=indicatordir indicator3` - INDICATORICONSDIR=`$PKG_CONFIG --variable=iconsdir indicator3` + INDICATORDIR=`$PKG_CONFIG --variable=indicatordir indicator3-0.4` + INDICATORICONSDIR=`$PKG_CONFIG --variable=iconsdir indicator3-0.4` ])]) AC_SUBST(INDICATORDIR) AC_SUBST(INDICATORICONSDIR) -- cgit v1.2.3 From 5f35f5e36e90e32aed5105434ee1ecae7c09806b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Sun, 17 Jul 2011 04:40:00 +0200 Subject: Added MuteWidget item to control the mute-menu-item remotely It's basically a GtkMenuItem that can be activated to change the mute status. --- src/Makefile.am | 2 + src/mute-widget.c | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/mute-widget.h | 67 ++++++++++++++++++++++++++ 3 files changed, 210 insertions(+) create mode 100644 src/mute-widget.c create mode 100644 src/mute-widget.h diff --git a/src/Makefile.am b/src/Makefile.am index e35f871..60c7249 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -18,6 +18,8 @@ libsoundmenu_la_SOURCES = \ transport-widget.h \ metadata-widget.c \ metadata-widget.h \ + mute-widget.c \ + mute-widget.h \ volume-widget.c \ volume-widget.h \ voip-input-widget.c \ diff --git a/src/mute-widget.c b/src/mute-widget.c new file mode 100644 index 0000000..97c87ff --- /dev/null +++ b/src/mute-widget.c @@ -0,0 +1,141 @@ +/* +Copyright 2011 Canonical Ltd. + +Authors: + Marco Trevisan (Treviño) + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see . +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "mute-widget.h" +#include "common-defs.h" +#include "indicator-sound.h" + +typedef struct _MuteWidgetPrivate MuteWidgetPrivate; + +struct _MuteWidgetPrivate +{ + DbusmenuMenuitem *item; + GtkMenuItem *gitem; +}; + +#define MUTE_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MUTE_WIDGET_TYPE, MuteWidgetPrivate)) + +/* Prototypes */ +static void mute_widget_class_init (MuteWidgetClass *klass); +static void mute_widget_init (MuteWidget *self); +static void mute_widget_dispose (GObject *object); +static void mute_widget_finalize (GObject *object); + +G_DEFINE_TYPE (MuteWidget, mute_widget, G_TYPE_OBJECT); + +static void +mute_widget_class_init (MuteWidgetClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + gobject_class->dispose = mute_widget_dispose; + gobject_class->finalize = mute_widget_finalize; + g_type_class_add_private (klass, sizeof (MuteWidgetPrivate)); +} + +static void +mute_widget_init (MuteWidget *self) +{ + MuteWidgetPrivate *priv = MUTE_WIDGET_GET_PRIVATE(self); + priv->item = NULL; + priv->gitem = GTK_MENU_ITEM(gtk_menu_item_new ()); +} + +static void +mute_widget_dispose (GObject *object) +{ + G_OBJECT_CLASS (mute_widget_parent_class)->dispose (object); +} + +static void +mute_widget_finalize (GObject *object) +{ + MuteWidget *self = MUTE_WIDGET (object); + MuteWidgetPrivate *priv = MUTE_WIDGET_GET_PRIVATE(self); + + g_object_unref (priv->item); + g_object_unref (G_OBJECT (priv->gitem)); + G_OBJECT_CLASS (mute_widget_parent_class)->finalize (object); +} + +GtkMenuItem * +mute_widget_get_menu_item(MuteWidget *self) +{ + MuteWidgetPrivate *priv = MUTE_WIDGET_GET_PRIVATE(self); + return priv->gitem; +} + +MuteStatus +mute_widget_get_status (MuteWidget *self) +{ + g_return_val_if_fail(self, MUTE_STATUS_UNAVAILABLE); + MuteStatus status = MUTE_STATUS_UNAVAILABLE; + MuteWidgetPrivate *priv = MUTE_WIDGET_GET_PRIVATE(self); + + GVariant *vstatus = dbusmenu_menuitem_property_get_variant(priv->item, + DBUSMENU_MUTE_MENUITEM_VALUE); + + if (g_variant_is_of_type (vstatus, G_VARIANT_TYPE_BOOLEAN)) + { + if (g_variant_get_boolean (vstatus)) + status = MUTE_STATUS_MUTED; + else + status = MUTE_STATUS_UNMUTED; + } + + return status; +} + +void mute_widget_toggle (MuteWidget *self) +{ + g_return_if_fail (self); + MuteWidgetPrivate *priv = MUTE_WIDGET_GET_PRIVATE(self); + gtk_menu_item_activate (priv->gitem); +} + +/** + * mute_widget_new: + * @returns: a new #MuteWidget. + **/ +MuteWidget * +mute_widget_new (DbusmenuMenuitem *item) +{ + MuteWidget* widget = g_object_new(MUTE_WIDGET_TYPE, NULL); + MuteWidgetPrivate* priv = MUTE_WIDGET_GET_PRIVATE(widget); + priv->item = g_object_ref(item); + + GVariant *label = dbusmenu_menuitem_property_get_variant(priv->item, + DBUSMENU_MENUITEM_PROP_LABEL); + + if (g_variant_is_of_type(label, G_VARIANT_TYPE_STRING)) + gtk_menu_item_set_label(priv->gitem, g_variant_get_string(label, NULL)); + + if (label) + { + g_debug("Added a new Mute Widget %s", g_variant_print(label, FALSE)); + g_variant_unref(label); + } + + return widget; +} diff --git a/src/mute-widget.h b/src/mute-widget.h new file mode 100644 index 0000000..95130a1 --- /dev/null +++ b/src/mute-widget.h @@ -0,0 +1,67 @@ +/* +Copyright 2011 Canonical Ltd. + +Authors: + Marco Trevisan (Treviño) + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see . +*/ +#ifndef __MUTE_WIDGET_H__ +#define __MUTE_WIDGET_H__ + +#include +#include +#include +#if GTK_CHECK_VERSION(3, 0, 0) +#include +#else +#include +#endif +#include + +G_BEGIN_DECLS + +#define MUTE_WIDGET_TYPE (mute_widget_get_type ()) +#define MUTE_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MUTE_WIDGET_TYPE, MuteWidget)) +#define MUTE_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MUTE_WIDGET_TYPE, MuteWidgetClass)) +#define IS_MUTE_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MUTE_WIDGET_TYPE)) +#define IS_MUTE_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MUTE_WIDGET_TYPE)) +#define MUTE_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MUTE_WIDGET_TYPE, MuteWidgetClass)) + +typedef struct _MuteWidget MuteWidget; +typedef struct _MuteWidgetClass MuteWidgetClass; + +struct _MuteWidgetClass { + GObjectClass parent_class; +}; + +struct _MuteWidget { + GObject parent; +}; + +typedef enum { + MUTE_STATUS_UNAVAILABLE, + MUTE_STATUS_MUTED, + MUTE_STATUS_UNMUTED +} MuteStatus; + +GType mute_widget_get_type (void) G_GNUC_CONST; +MuteWidget* mute_widget_new (DbusmenuMenuitem *item); +MuteStatus mute_widget_get_status (MuteWidget *self); +void mute_widget_toggle (MuteWidget *self); +GtkMenuItem *mute_widget_get_menu_item (MuteWidget *self); + +G_END_DECLS + +#endif + -- cgit v1.2.3 From 4e86af2e6f0fe204731441fb63ab0159fb0863a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Sun, 17 Jul 2011 04:40:52 +0200 Subject: mute-menu-item: export type to allow to handle it remotely --- src/mute-menu-item.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/mute-menu-item.c b/src/mute-menu-item.c index 2876be3..0e6a46f 100644 --- a/src/mute-menu-item.c +++ b/src/mute-menu-item.c @@ -63,6 +63,11 @@ mute_menu_item_init (MuteMenuItem *self) MuteMenuItemPrivate* priv = MUTE_MENU_ITEM_GET_PRIVATE(self); priv->button = NULL; priv->button = dbusmenu_menuitem_new(); + + dbusmenu_menuitem_property_set(priv->button, + DBUSMENU_MENUITEM_PROP_TYPE, + DBUSMENU_MUTE_MENUITEM_TYPE); + dbusmenu_menuitem_property_set_bool (priv->button, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); -- cgit v1.2.3 From 6c14ce6ac83759bba2575d13705541352dad6441 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Sun, 17 Jul 2011 16:13:15 +0200 Subject: indicator-sound: handle the mute-menu-item and toggle it Handle the mute menu item with a mute widget, then associate the secondary_activate libindicator signal to a function that toggles the status of mute_widget, to apply the change in all the indicator-sound framework. --- src/indicator-sound.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/indicator-sound.c b/src/indicator-sound.c index 76bf710..a7ba95c 100644 --- a/src/indicator-sound.c +++ b/src/indicator-sound.c @@ -39,6 +39,7 @@ with this program. If not, see . #include "voip-input-widget.h" #include "dbus-shared-names.h" #include "sound-state-manager.h" +#include "mute-widget.h" #include "gen-sound-service.xml.h" #include "common-defs.h" @@ -49,6 +50,7 @@ struct _IndicatorSoundPrivate { GtkWidget* volume_widget; GtkWidget* voip_widget; + MuteWidget *mute_widget; GList* transport_widgets_list; GDBusProxy *dbus_proxy; SoundStateManager* state_manager; @@ -75,6 +77,10 @@ static const gchar * get_accessible_desc (IndicatorObject * io); static void indicator_sound_scroll (IndicatorObject * io, IndicatorObjectEntry * entry, gint delta, IndicatorScrollDirection direction); +static void indicator_sound_middle_click (IndicatorObject * io, + IndicatorObjectEntry * entry, + guint time, gint x, gint y, + gpointer data); //key/moust event handlers static gboolean key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer data); @@ -97,6 +103,10 @@ static gboolean new_metadata_widget (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client, gpointer user_data); +static gboolean new_mute_widget (DbusmenuMenuitem * newitem, + DbusmenuMenuitem * parent, + DbusmenuClient * client, + gpointer user_data); // DBUS communication static GDBusNodeInfo *node_info = NULL; @@ -125,6 +135,7 @@ indicator_sound_class_init (IndicatorSoundClass *klass) io_class->get_menu = get_menu; io_class->get_accessible_desc = get_accessible_desc; io_class->entry_scrolled = indicator_sound_scroll; + io_class->secondary_activate = indicator_sound_middle_click; } static void @@ -137,6 +148,7 @@ indicator_sound_init (IndicatorSound *self) IndicatorSoundPrivate* priv = INDICATOR_SOUND_GET_PRIVATE(self); priv->volume_widget = NULL; priv->voip_widget = NULL; + priv->mute_widget = NULL; priv->dbus_proxy = NULL; GList* t_list = NULL; priv->transport_widgets_list = t_list; @@ -207,6 +219,9 @@ get_menu (IndicatorObject * io) dbusmenu_client_add_type_handler (DBUSMENU_CLIENT(client), DBUSMENU_METADATA_MENUITEM_TYPE, new_metadata_widget); + dbusmenu_client_add_type_handler (DBUSMENU_CLIENT(client), + DBUSMENU_MUTE_MENUITEM_TYPE, + new_mute_widget); // Note: Not ideal but all key handling needs to be managed here and then // delegated to the appropriate widget. g_signal_connect (menu, "key-press-event", G_CALLBACK(key_press_cb), io); @@ -459,6 +474,36 @@ new_voip_slider_widget (DbusmenuMenuitem * newitem, return TRUE; } +static gboolean +new_mute_widget(DbusmenuMenuitem * newitem, + DbusmenuMenuitem * parent, + DbusmenuClient * client, + gpointer user_data) +{ + IndicatorObject *io = NULL; + + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(newitem), FALSE); + g_return_val_if_fail(DBUSMENU_IS_GTKCLIENT(client), FALSE); + + io = g_object_get_data (G_OBJECT (client), "indicator"); + IndicatorSoundPrivate* priv = INDICATOR_SOUND_GET_PRIVATE(INDICATOR_SOUND (io)); + + if (priv->mute_widget != NULL){ + g_object_unref (priv->mute_widget); + priv->mute_widget = NULL; + } + + priv->mute_widget = mute_widget_new(newitem); + GtkMenuItem *item = mute_widget_get_menu_item (priv->mute_widget); + + dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), + newitem, + item, + parent); + + return TRUE; +} + /*******************************************************************/ //UI callbacks /******************************************************************/ @@ -677,6 +722,16 @@ indicator_sound_scroll (IndicatorObject * io, IndicatorObjectEntry * entry, sound_state_manager_show_notification (priv->state_manager, value); } +static void +indicator_sound_middle_click (IndicatorObject * io, IndicatorObjectEntry * entry, + guint time, gint x, gint y, gpointer data) +{ + IndicatorSoundPrivate* priv = INDICATOR_SOUND_GET_PRIVATE(INDICATOR_SOUND (io)); + g_return_if_fail (priv); + + mute_widget_toggle(priv->mute_widget); +} + void update_accessible_desc (IndicatorObject * io) { -- cgit v1.2.3 From a2871b1b51c2f26a5778a6f15c5cae6650cc8fff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 21 Jul 2011 18:12:12 +0200 Subject: X and Y pointer position aren't exported anymore by libindicator Dropping them! --- src/indicator-sound.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/indicator-sound.c b/src/indicator-sound.c index a7ba95c..7c72900 100644 --- a/src/indicator-sound.c +++ b/src/indicator-sound.c @@ -79,8 +79,7 @@ static void indicator_sound_scroll (IndicatorObject * io, IndicatorScrollDirection direction); static void indicator_sound_middle_click (IndicatorObject * io, IndicatorObjectEntry * entry, - guint time, gint x, gint y, - gpointer data); + guint time, gpointer data); //key/moust event handlers static gboolean key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer data); @@ -724,7 +723,7 @@ indicator_sound_scroll (IndicatorObject * io, IndicatorObjectEntry * entry, static void indicator_sound_middle_click (IndicatorObject * io, IndicatorObjectEntry * entry, - guint time, gint x, gint y, gpointer data) + guint time, gpointer data) { IndicatorSoundPrivate* priv = INDICATOR_SOUND_GET_PRIVATE(INDICATOR_SOUND (io)); g_return_if_fail (priv); -- cgit v1.2.3 From 11c1764fc6b46b364720c64993dffef972598c3a Mon Sep 17 00:00:00 2001 From: Harry van Haaren Date: Wed, 27 Jul 2011 13:23:48 +0100 Subject: Transport-widget has offscreen_window and spinner --- src/transport-widget.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index 11e0f91..b26147c 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -76,6 +76,9 @@ typedef struct _TransportWidgetPrivate TransportWidgetPrivate; struct _TransportWidgetPrivate { + GtkWidget* offscreen_window; + GtkWidget* spinner; + TransportAction current_command; TransportAction key_event; TransportAction motion_event; @@ -170,7 +173,12 @@ transport_widget_class_init (TransportWidgetClass *klass) static void transport_widget_init (TransportWidget *self) { - TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(self); + TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(self); + + priv->spinner = gtk_spinner_new(); + priv->offscreen_window = gtk_offscreen_window_new(); + gtk_container_add( GTK_CONTAINER(priv->offscreen_window), priv->spinner); + priv->current_command = TRANSPORT_ACTION_NO_ACTION; priv->current_state = TRANSPORT_STATE_PAUSED; priv->key_event = TRANSPORT_ACTION_NO_ACTION; @@ -1755,9 +1763,8 @@ draw (GtkWidget* button, cairo_t *cr) } else if(priv->current_state == TRANSPORT_STATE_LAUNCHING) { -/* g_debug ("launching in draw"); -*/ + _setup (&cr_surf, &surf, PLAY_WIDTH+6, PLAY_HEIGHT+6); _mask_play (cr_surf, PLAY_PADDING, -- cgit v1.2.3 From 25f98c314a2e61968511c2eeefd7354cadb9439f Mon Sep 17 00:00:00 2001 From: Harry van Haaren Date: Wed, 27 Jul 2011 16:24:08 +0100 Subject: Updated debugs, added spinner start / stop on transport_launching --- src/transport-widget.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index b26147c..76c94aa 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -177,7 +177,7 @@ transport_widget_init (TransportWidget *self) priv->spinner = gtk_spinner_new(); priv->offscreen_window = gtk_offscreen_window_new(); - gtk_container_add( GTK_CONTAINER(priv->offscreen_window), priv->spinner); + gtk_container_add( GTK_CONTAINER(priv->offscreen_window), priv->spinner); priv->current_command = TRANSPORT_ACTION_NO_ACTION; priv->current_state = TRANSPORT_STATE_PAUSED; @@ -257,7 +257,7 @@ transport_widget_expose (GtkWidget *button, GdkEventExpose *event) cairo_t *cr; cr = gdk_cairo_create (gtk_widget_get_window (button)); - //g_debug("In the playbutton's expose method, x = %i, y=%i and width: %i and height: %i'"); + g_debug("In the playbutton's expose method, x = %i, y=%i and width: %i and height: %i'"); cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height); @@ -283,7 +283,7 @@ transport_widget_toggle_play_pause(TransportWidget* button, { TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(button); priv->current_state = update; - //g_debug("TransportWidget::toggle play state : %i", priv->current_state); + g_debug("TransportWidget::toggle play state : %i", priv->current_state); gtk_widget_queue_draw (GTK_WIDGET(button)); } @@ -314,6 +314,8 @@ static gboolean transport_widget_motion_notify_event (GtkWidget *menuitem, GdkEventMotion *event) { + g_debug("transport_widget_motion_notify_event()"); + g_return_val_if_fail ( IS_TRANSPORT_WIDGET(menuitem), FALSE ); TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE ( TRANSPORT_WIDGET(menuitem) ); TransportAction result = transport_widget_determine_motion_event ( TRANSPORT_WIDGET(menuitem), @@ -335,6 +337,8 @@ static gboolean transport_widget_leave_notify_event (GtkWidget *menuitem, GdkEventCrossing *event) { + g_debug("transport_widget_leave_notify_event()"); + g_return_val_if_fail ( IS_TRANSPORT_WIDGET(menuitem), FALSE ); TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE ( TRANSPORT_WIDGET(menuitem) ); @@ -349,6 +353,8 @@ static gboolean transport_widget_button_press_event (GtkWidget *menuitem, GdkEventButton *event) { + g_debug("transport_widget_button_press_event()"); + g_return_val_if_fail ( IS_TRANSPORT_WIDGET(menuitem), FALSE ); TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE ( TRANSPORT_WIDGET(menuitem) ); TransportAction result = transport_widget_determine_button_event ( TRANSPORT_WIDGET(menuitem), @@ -1236,7 +1242,9 @@ draw (GtkWidget* button, cairo_t *cr) g_return_val_if_fail(IS_TRANSPORT_WIDGET(button), FALSE); g_return_val_if_fail(cr != NULL, FALSE); TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(button); - + + //g_debug("transport-widget draw()"); + cairo_surface_t* surf = NULL; cairo_t* cr_surf = NULL; @@ -1763,7 +1771,7 @@ draw (GtkWidget* button, cairo_t *cr) } else if(priv->current_state == TRANSPORT_STATE_LAUNCHING) { - g_debug ("launching in draw"); + //g_debug ("===launching in draw==="); _setup (&cr_surf, &surf, PLAY_WIDTH+6, PLAY_HEIGHT+6); _mask_play (cr_surf, @@ -1839,9 +1847,7 @@ transport_widget_fade_playbutton (gpointer userdata) { TransportWidget* bar = (TransportWidget*)userdata; g_return_val_if_fail(IS_TRANSPORT_WIDGET(bar), FALSE); -/* - g_debug ("fade in /out timeout"); -*/ + //g_debug ("fade in /out timeout"); TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(bar); if (priv->launching_transparency == 1.0f){ priv->fade_out = TRUE; @@ -1874,13 +1880,14 @@ transport_widget_property_update(DbusmenuMenuitem* item, gchar* property, if(g_ascii_strcasecmp(DBUSMENU_TRANSPORT_MENUITEM_PLAY_STATE, property) == 0) { TransportState new_state = (TransportState)g_variant_get_int32(value); - //g_debug("transport_widget_update_state - with value %i", update_value); + //g_debug("transport_widget_update_state - with value %i", new_state); if (new_state == TRANSPORT_STATE_LAUNCHING){ priv->current_state = TRANSPORT_STATE_LAUNCHING; priv->launching_timer = g_timeout_add (100, transport_widget_fade_playbutton, bar); - //g_debug("TransportWidget::toggle play state : %i", priv->current_state); + g_debug("TransportWidget::toggle play state : %i", priv->current_state); + gtk_spinner_start( (GtkSpinner*)priv->spinner); } else{ if (priv->launching_timer != 0){ @@ -1890,6 +1897,7 @@ transport_widget_property_update(DbusmenuMenuitem* item, gchar* property, priv->launching_transparency = 1.0f; } transport_widget_toggle_play_pause(bar, new_state); + gtk_spinner_stop( (GtkSpinner*)priv->spinner); } } } -- cgit v1.2.3 From b7e9be00dc76778b7e5148c1a343c0ff6133f2d9 Mon Sep 17 00:00:00 2001 From: Harry van Haaren Date: Wed, 27 Jul 2011 17:14:59 +0100 Subject: Implemented spinner to cairo interface, assertion of offscreen_window GDK_IS_WINDOW failing --- src/player-controller.vala | 3 ++- src/transport-widget.c | 25 +++++++++++++++++++------ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/player-controller.vala b/src/player-controller.vala index a08f692..00b486e 100644 --- a/src/player-controller.vala +++ b/src/player-controller.vala @@ -143,11 +143,12 @@ public class PlayerController : GLib.Object public void update_layout() { - debug ("a call to update layout"); + debug ("player-controller update_layout()"); PlaylistsMenuitem playlists_menuitem = this.custom_items[widget_order.PLAYLISTS] as PlaylistsMenuitem; MetadataMenuitem metadata_menuitem = this.custom_items[widget_order.METADATA] as MetadataMenuitem; if(this.current_state != state.CONNECTED){ // TODO + debug("\tthis.current_state != state.CONNECTED, setting Transport property bool to %s now",this.app_info.get_id() ); metadata_menuitem.should_collapse (true); playlists_menuitem.root_item.property_set_bool (MENUITEM_PROP_VISIBLE, false ); diff --git a/src/transport-widget.c b/src/transport-widget.c index 76c94aa..bd189a2 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -177,6 +177,10 @@ transport_widget_init (TransportWidget *self) priv->spinner = gtk_spinner_new(); priv->offscreen_window = gtk_offscreen_window_new(); + + g_assert(priv->spinner); + g_assert(priv->offscreen_window); + gtk_container_add( GTK_CONTAINER(priv->offscreen_window), priv->spinner); priv->current_command = TRANSPORT_ACTION_NO_ACTION; @@ -257,7 +261,7 @@ transport_widget_expose (GtkWidget *button, GdkEventExpose *event) cairo_t *cr; cr = gdk_cairo_create (gtk_widget_get_window (button)); - g_debug("In the playbutton's expose method, x = %i, y=%i and width: %i and height: %i'"); + //g_debug("In the playbutton's expose method, x = %i, y=%i and width: %i and height: %i'"); cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height); @@ -283,7 +287,7 @@ transport_widget_toggle_play_pause(TransportWidget* button, { TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(button); priv->current_state = update; - g_debug("TransportWidget::toggle play state : %i", priv->current_state); + //g_debug("TransportWidget::toggle play state : %i", priv->current_state); gtk_widget_queue_draw (GTK_WIDGET(button)); } @@ -314,7 +318,7 @@ static gboolean transport_widget_motion_notify_event (GtkWidget *menuitem, GdkEventMotion *event) { - g_debug("transport_widget_motion_notify_event()"); + //g_debug("transport_widget_motion_notify_event()"); g_return_val_if_fail ( IS_TRANSPORT_WIDGET(menuitem), FALSE ); TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE ( TRANSPORT_WIDGET(menuitem) ); @@ -337,7 +341,7 @@ static gboolean transport_widget_leave_notify_event (GtkWidget *menuitem, GdkEventCrossing *event) { - g_debug("transport_widget_leave_notify_event()"); + //g_debug("transport_widget_leave_notify_event()"); g_return_val_if_fail ( IS_TRANSPORT_WIDGET(menuitem), FALSE ); TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE ( TRANSPORT_WIDGET(menuitem) ); @@ -353,7 +357,7 @@ static gboolean transport_widget_button_press_event (GtkWidget *menuitem, GdkEventButton *event) { - g_debug("transport_widget_button_press_event()"); + //g_debug("transport_widget_button_press_event()"); g_return_val_if_fail ( IS_TRANSPORT_WIDGET(menuitem), FALSE ); TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE ( TRANSPORT_WIDGET(menuitem) ); @@ -1771,8 +1775,16 @@ draw (GtkWidget* button, cairo_t *cr) } else if(priv->current_state == TRANSPORT_STATE_LAUNCHING) { - //g_debug ("===launching in draw==="); + g_debug ("launching in draw"); + + GtkOffscreenWindow* tmp_offscreen_win = (GtkOffscreenWindow*)priv->offscreen_window; + + cairo_t *tmp_cr = cairo_create( gtk_offscreen_window_get_surface( tmp_offscreen_win ) ); + + cairo_set_source_surface( tmp_cr, surf, 0, 0 ); + cairo_paint(tmp_cr); + /* _setup (&cr_surf, &surf, PLAY_WIDTH+6, PLAY_HEIGHT+6); _mask_play (cr_surf, PLAY_PADDING, @@ -1822,6 +1834,7 @@ draw (GtkWidget* button, cairo_t *cr) BUTTON_LAUNCHING_END, FALSE); _finalize (cr, &cr_surf, &surf, PAUSE_X-0.5f, PAUSE_Y); + */ } return FALSE; -- cgit v1.2.3 From 116ed984defc9ddf1191c5ba9599b072e5888240 Mon Sep 17 00:00:00 2001 From: Harry van Haaren Date: Thu, 28 Jul 2011 10:33:44 +0100 Subject: Using gtk_render_activity() to draw the spinner --- src/transport-widget.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/transport-widget.c b/src/transport-widget.c index bd189a2..3d766ee 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -1777,12 +1777,38 @@ draw (GtkWidget* button, cairo_t *cr) { g_debug ("launching in draw"); + GtkStyleContext *style_context = gtk_style_context_new (); + + GtkWidgetPath *widget_path = gtk_widget_path_new (); + gtk_widget_path_iter_set_name (widget_path, -1 , "indicator-sound-spinner"); + gtk_widget_path_append_type (widget_path, GTK_TYPE_SPINNER); + + gtk_style_context_set_path (style_context, widget_path); + gtk_style_context_add_class (style_context, GTK_STYLE_CLASS_SPINNER); + +/* + gtk_style_context_notify_state_change(style_context, + gtk_widget_get_window(self), + NULL, + GTK_STATE_ACTIVE, + TRUE); +*/ + gtk_render_activity (style_context, cr, 106, 6 , 30, 30); + + //cairo_mark_dirty (cr); + + gtk_widget_path_free (widget_path); + g_object_unref (style_context); + + + /* GtkOffscreenWindow* tmp_offscreen_win = (GtkOffscreenWindow*)priv->offscreen_window; cairo_t *tmp_cr = cairo_create( gtk_offscreen_window_get_surface( tmp_offscreen_win ) ); cairo_set_source_surface( tmp_cr, surf, 0, 0 ); cairo_paint(tmp_cr); + */ /* _setup (&cr_surf, &surf, PLAY_WIDTH+6, PLAY_HEIGHT+6); -- cgit v1.2.3 From bd4277e440221ae75e450d1fe967cfc5e46140ab Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 28 Jul 2011 11:37:13 +0100 Subject: fixed the resizing bug --- src/metadata-widget.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/metadata-widget.c b/src/metadata-widget.c index d34f1fc..ee9957f 100644 --- a/src/metadata-widget.c +++ b/src/metadata-widget.c @@ -77,7 +77,12 @@ static void metadata_widget_selection_received_event_callback( GtkWidget guint time, gpointer user_data); + + #if GTK_CHECK_VERSION(3, 0, 0) +static void metadata_widget_get_preferred_width (GtkWidget* self, + gint* minimum_width, + gint* natural_width); static gboolean metadata_widget_icon_triangle_draw_cb_gtk_3 (GtkWidget *image, cairo_t* cr, gpointer user_data); @@ -106,7 +111,9 @@ metadata_widget_class_init (MetadataWidgetClass *klass) GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); widget_class->button_release_event = metadata_widget_button_release_event; - + #if GTK_CHECK_VERSION(3, 0, 0) + widget_class->get_preferred_width = metadata_widget_get_preferred_width; + #endif g_type_class_add_private (klass, sizeof (MetadataWidgetPrivate)); gobject_class->dispose = metadata_widget_dispose; @@ -163,6 +170,7 @@ metadata_widget_init (MetadataWidget *self) gtk_misc_set_alignment(GTK_MISC(artist), (gfloat)0, (gfloat)0); gtk_misc_set_padding (GTK_MISC(artist), (gfloat)10, (gfloat)0); gtk_widget_set_size_request (artist, 140, 15); + gtk_label_set_ellipsize(GTK_LABEL(artist), PANGO_ELLIPSIZE_MIDDLE); metadata_widget_style_labels(self, GTK_LABEL(artist)); priv->artist_label = artist; @@ -172,6 +180,7 @@ metadata_widget_init (MetadataWidget *self) piece = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(piece), (gfloat)0, (gfloat)0); gtk_misc_set_padding (GTK_MISC(piece), (gfloat)10, (gfloat)-5); + gtk_widget_set_size_request (piece, 140, 15); gtk_label_set_ellipsize(GTK_LABEL(piece), PANGO_ELLIPSIZE_MIDDLE); metadata_widget_style_labels(self, GTK_LABEL(piece)); @@ -183,6 +192,7 @@ metadata_widget_init (MetadataWidget *self) gtk_misc_set_alignment(GTK_MISC(container), (gfloat)0, (gfloat)0); gtk_misc_set_padding (GTK_MISC(container), (gfloat)10, (gfloat)0); gtk_widget_set_size_request (container, 140, 15); + gtk_label_set_ellipsize(GTK_LABEL(container), PANGO_ELLIPSIZE_MIDDLE); metadata_widget_style_labels(self, GTK_LABEL(container)); priv->container_label = container; @@ -215,6 +225,7 @@ metadata_widget_init (MetadataWidget *self) gtk_widget_show_all (priv->meta_data_h_box); gtk_widget_set_no_show_all (priv->meta_data_h_box, TRUE); + gtk_widget_hide (priv->meta_data_h_box); } @@ -235,12 +246,19 @@ metadata_widget_finalize (GObject *object) G_OBJECT_CLASS (metadata_widget_parent_class)->finalize (object); } + +#if GTK_CHECK_VERSION(3, 0, 0) +static void +metadata_widget_get_preferred_width (GtkWidget* self, + gint* minimum_width, + gint* natural_width) +{ + *minimum_width = *natural_width = 200; +} /** * We override the expose method to enable primitive drawing of the * empty album art image and rounded rectangles on the album art. */ - -#if GTK_CHECK_VERSION(3, 0, 0) static gboolean metadata_image_expose_gtk_3 (GtkWidget *metadata, cairo_t* cr, -- cgit v1.2.3 From 88880cb32a353f84985831596ea80d54bc31d23d Mon Sep 17 00:00:00 2001 From: Harry van Haaren Date: Thu, 28 Jul 2011 11:38:41 +0100 Subject: Made Spinner variables static, cairo surface isn't being drawn properly --- src/transport-widget.c | 52 ++++++++++++++++++-------------------------------- 1 file changed, 19 insertions(+), 33 deletions(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index 3d766ee..bace76a 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -76,9 +76,6 @@ typedef struct _TransportWidgetPrivate TransportWidgetPrivate; struct _TransportWidgetPrivate { - GtkWidget* offscreen_window; - GtkWidget* spinner; - TransportAction current_command; TransportAction key_event; TransportAction motion_event; @@ -93,6 +90,9 @@ struct _TransportWidgetPrivate gboolean fade_out; }; +static GtkStyleContext *spinner_style_context; +static GtkWidgetPath *spinner_widget_path; + // TODO refactor the UI handlers, consolidate functionality between key press /release // and button press / release. #define TRANSPORT_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRANSPORT_WIDGET_TYPE, TransportWidgetPrivate)) @@ -175,13 +175,15 @@ transport_widget_init (TransportWidget *self) { TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(self); - priv->spinner = gtk_spinner_new(); - priv->offscreen_window = gtk_offscreen_window_new(); + spinner_widget_path = gtk_widget_path_new(); + spinner_style_context = gtk_style_context_new(); - g_assert(priv->spinner); - g_assert(priv->offscreen_window); - - gtk_container_add( GTK_CONTAINER(priv->offscreen_window), priv->spinner); + gtk_widget_path_iter_set_name (spinner_widget_path, -1 , "IndicatorSoundSpinner"); + gtk_widget_path_append_type (spinner_widget_path, GTK_TYPE_SPINNER); + + gtk_style_context_set_path (spinner_style_context, spinner_widget_path); + gtk_style_context_add_class (spinner_style_context, GTK_STYLE_CLASS_SPINNER); + gtk_style_context_set_state (spinner_style_context, GTK_STATE_FLAG_ACTIVE); priv->current_command = TRANSPORT_ACTION_NO_ACTION; priv->current_state = TRANSPORT_STATE_PAUSED; @@ -245,12 +247,16 @@ transport_widget_init (TransportWidget *self) static void transport_widget_dispose (GObject *object) { + g_object_unref (spinner_style_context); + G_OBJECT_CLASS (transport_widget_parent_class)->dispose (object); } static void transport_widget_finalize (GObject *object) { + gtk_widget_path_free (spinner_widget_path); + G_OBJECT_CLASS (transport_widget_parent_class)->finalize (object); } @@ -1777,29 +1783,11 @@ draw (GtkWidget* button, cairo_t *cr) { g_debug ("launching in draw"); - GtkStyleContext *style_context = gtk_style_context_new (); - - GtkWidgetPath *widget_path = gtk_widget_path_new (); - gtk_widget_path_iter_set_name (widget_path, -1 , "indicator-sound-spinner"); - gtk_widget_path_append_type (widget_path, GTK_TYPE_SPINNER); - - gtk_style_context_set_path (style_context, widget_path); - gtk_style_context_add_class (style_context, GTK_STYLE_CLASS_SPINNER); - -/* - gtk_style_context_notify_state_change(style_context, - gtk_widget_get_window(self), - NULL, - GTK_STATE_ACTIVE, - TRUE); -*/ - gtk_render_activity (style_context, cr, 106, 6 , 30, 30); - - //cairo_mark_dirty (cr); - - gtk_widget_path_free (widget_path); - g_object_unref (style_context); + gtk_style_context_set_state (spinner_style_context, GTK_STATE_FLAG_ACTIVE); + gtk_render_activity (spinner_style_context, cr, 106, 6 , 30, 30); + // need to redraw the cairo context here, cairo_paint() doesn't seem to do it + cairo_paint(cr); /* GtkOffscreenWindow* tmp_offscreen_win = (GtkOffscreenWindow*)priv->offscreen_window; @@ -1926,7 +1914,6 @@ transport_widget_property_update(DbusmenuMenuitem* item, gchar* property, transport_widget_fade_playbutton, bar); g_debug("TransportWidget::toggle play state : %i", priv->current_state); - gtk_spinner_start( (GtkSpinner*)priv->spinner); } else{ if (priv->launching_timer != 0){ @@ -1936,7 +1923,6 @@ transport_widget_property_update(DbusmenuMenuitem* item, gchar* property, priv->launching_transparency = 1.0f; } transport_widget_toggle_play_pause(bar, new_state); - gtk_spinner_stop( (GtkSpinner*)priv->spinner); } } } -- cgit v1.2.3 From e5350911b2abaca40482bbacbda92e64f2e6d8bb Mon Sep 17 00:00:00 2001 From: Harry van Haaren Date: Thu, 28 Jul 2011 12:31:36 +0100 Subject: added debug info in draw() of spinner animation --- src/transport-widget.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index bace76a..b20966f 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -183,7 +183,7 @@ transport_widget_init (TransportWidget *self) gtk_style_context_set_path (spinner_style_context, spinner_widget_path); gtk_style_context_add_class (spinner_style_context, GTK_STYLE_CLASS_SPINNER); - gtk_style_context_set_state (spinner_style_context, GTK_STATE_FLAG_ACTIVE); + gtk_style_context_set_state (spinner_style_context, GTK_STATE_FLAG_NORMAL); priv->current_command = TRANSPORT_ACTION_NO_ACTION; priv->current_state = TRANSPORT_STATE_PAUSED; @@ -267,7 +267,7 @@ transport_widget_expose (GtkWidget *button, GdkEventExpose *event) cairo_t *cr; cr = gdk_cairo_create (gtk_widget_get_window (button)); - //g_debug("In the playbutton's expose method, x = %i, y=%i and width: %i and height: %i'"); + g_debug("In the playbutton's expose method, x = %i, y=%i and width: %i and height: %i'"); cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height); @@ -1781,9 +1781,15 @@ draw (GtkWidget* button, cairo_t *cr) } else if(priv->current_state == TRANSPORT_STATE_LAUNCHING) { - g_debug ("launching in draw"); + gdouble progress; + gtk_style_context_state_is_running(spinner_style_context, GTK_STATE_ACTIVE, &progress); + + GtkStateFlags state = gtk_style_context_get_state(spinner_style_context); + // state 0 = NORMAL + // state 1 = ACTIVE + + g_debug ("launching in draw state: %i, %f", state ,progress ); - gtk_style_context_set_state (spinner_style_context, GTK_STATE_FLAG_ACTIVE); gtk_render_activity (spinner_style_context, cr, 106, 6 , 30, 30); // need to redraw the cairo context here, cairo_paint() doesn't seem to do it @@ -1914,6 +1920,7 @@ transport_widget_property_update(DbusmenuMenuitem* item, gchar* property, transport_widget_fade_playbutton, bar); g_debug("TransportWidget::toggle play state : %i", priv->current_state); + gtk_style_context_set_state (spinner_style_context, GTK_STATE_FLAG_ACTIVE); } else{ if (priv->launching_timer != 0){ -- cgit v1.2.3 From 4a74ac2d00bf6d093447a27cea421ad6ea6810f2 Mon Sep 17 00:00:00 2001 From: Harry van Haaren Date: Thu, 28 Jul 2011 12:52:59 +0100 Subject: Added debug info, setting gtk-animations to enabled in theme --- src/transport-widget.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index b20966f..81fbac6 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -178,7 +178,16 @@ transport_widget_init (TransportWidget *self) spinner_widget_path = gtk_widget_path_new(); spinner_style_context = gtk_style_context_new(); - gtk_widget_path_iter_set_name (spinner_widget_path, -1 , "IndicatorSoundSpinner"); + + /* + gtk_settings_set_string_property( gtk_settings_get_default(), + "gtk-enable-animations", + const gchar *v_string, + const gchar *origin); */ + + //g_object_set (gtk_settings_get_default (), "gtk-enable-animations", TRUE, NULL); + + gtk_widget_path_iter_set_name (spinner_widget_path, 0 , "IndicatorSoundSpinner"); gtk_widget_path_append_type (spinner_widget_path, GTK_TYPE_SPINNER); gtk_style_context_set_path (spinner_style_context, spinner_widget_path); -- cgit v1.2.3 From c53c671e8e453068d1ee0b9186d6e337797b4d60 Mon Sep 17 00:00:00 2001 From: Harry van Haaren Date: Thu, 28 Jul 2011 13:32:58 +0100 Subject: Fixed assertion of WidgetPath --- src/transport-widget.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index 81fbac6..c1ff794 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -187,8 +187,12 @@ transport_widget_init (TransportWidget *self) //g_object_set (gtk_settings_get_default (), "gtk-enable-animations", TRUE, NULL); - gtk_widget_path_iter_set_name (spinner_widget_path, 0 , "IndicatorSoundSpinner"); gtk_widget_path_append_type (spinner_widget_path, GTK_TYPE_SPINNER); + gtk_widget_path_iter_set_name (spinner_widget_path, 1 , "IndicatorSoundSpinner"); + + gtk_widget_path_iter_add_class(spinner_widget_path,-1,GTK_STYLE_CLASS_SPINNER); + + gtk_style_context_add_class(spinner_style_context,GTK_STYLE_CLASS_SPINNER); gtk_style_context_set_path (spinner_style_context, spinner_widget_path); gtk_style_context_add_class (spinner_style_context, GTK_STYLE_CLASS_SPINNER); @@ -1790,6 +1794,8 @@ draw (GtkWidget* button, cairo_t *cr) } else if(priv->current_state == TRANSPORT_STATE_LAUNCHING) { + gtk_style_context_set_state (spinner_style_context, GTK_STATE_FLAG_ACTIVE); + gdouble progress; gtk_style_context_state_is_running(spinner_style_context, GTK_STATE_ACTIVE, &progress); @@ -1929,7 +1935,6 @@ transport_widget_property_update(DbusmenuMenuitem* item, gchar* property, transport_widget_fade_playbutton, bar); g_debug("TransportWidget::toggle play state : %i", priv->current_state); - gtk_style_context_set_state (spinner_style_context, GTK_STATE_FLAG_ACTIVE); } else{ if (priv->launching_timer != 0){ -- cgit v1.2.3 From db5e00800fb527e9b88cc7c8c1b29ac44b5eee29 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 28 Jul 2011 15:07:17 +0100 Subject: tidied style context method calls, more visibility added around querying if the transition is actually running --- src/transport-widget.c | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index c1ff794..5b3001a 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -1259,6 +1259,8 @@ _surface_blur (cairo_surface_t* surface, cairo_surface_mark_dirty (surface); } +static gdouble progress = 0.0; + static gboolean draw (GtkWidget* button, cairo_t *cr) { @@ -1794,20 +1796,19 @@ draw (GtkWidget* button, cairo_t *cr) } else if(priv->current_state == TRANSPORT_STATE_LAUNCHING) { - gtk_style_context_set_state (spinner_style_context, GTK_STATE_FLAG_ACTIVE); - - gdouble progress; - gtk_style_context_state_is_running(spinner_style_context, GTK_STATE_ACTIVE, &progress); - - GtkStateFlags state = gtk_style_context_get_state(spinner_style_context); - // state 0 = NORMAL - // state 1 = ACTIVE - - g_debug ("launching in draw state: %i, %f", state ,progress ); - gtk_render_activity (spinner_style_context, cr, 106, 6 , 30, 30); + GtkStateFlags state = gtk_style_context_get_state(spinner_style_context); + // state 0 = NORMAL + // state 1 = ACTIVE - // need to redraw the cairo context here, cairo_paint() doesn't seem to do it + g_debug ("launching in draw state: %i and progress %f", state, progress ); + gtk_render_activity (spinner_style_context, cr, 106, 6 , 30, 30); + g_debug ("context style is running ? = %i", + gtk_style_context_state_is_running (spinner_style_context, + GTK_STATE_ACTIVE, + &progress)); + + // need to redraw the cairo context here, cairo_paint() doesn't seem to do it cairo_paint(cr); /* @@ -1912,6 +1913,7 @@ transport_widget_fade_playbutton (gpointer userdata) gtk_widget_queue_draw (GTK_WIDGET(bar)); return TRUE; } + /** * transport_widget_update_state() * Callback for updates from the other side of dbus @@ -1930,6 +1932,14 @@ transport_widget_property_update(DbusmenuMenuitem* item, gchar* property, TransportState new_state = (TransportState)g_variant_get_int32(value); //g_debug("transport_widget_update_state - with value %i", new_state); if (new_state == TRANSPORT_STATE_LAUNCHING){ + gtk_style_context_notify_state_change (spinner_style_context, + gtk_widget_get_window ( GTK_WIDGET(userdata)), + NULL, + GTK_STATE_PRELIGHT, + TRUE); + + gtk_style_context_set_state (spinner_style_context, GTK_STATE_FLAG_ACTIVE); + priv->current_state = TRANSPORT_STATE_LAUNCHING; priv->launching_timer = g_timeout_add (100, transport_widget_fade_playbutton, -- cgit v1.2.3 From 34c2bb5248b5b408781b2c38c48841899c9df266 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 28 Jul 2011 16:23:02 +0100 Subject: clean up debug trace --- src/transport-widget.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index 5b3001a..66bb748 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -1801,7 +1801,9 @@ draw (GtkWidget* button, cairo_t *cr) // state 0 = NORMAL // state 1 = ACTIVE - g_debug ("launching in draw state: %i and progress %f", state, progress ); + g_debug ("Is state active: %i and progress %f", + state == GTK_STATE_FLAG_ACTIVE, + progress ); gtk_render_activity (spinner_style_context, cr, 106, 6 , 30, 30); g_debug ("context style is running ? = %i", gtk_style_context_state_is_running (spinner_style_context, -- cgit v1.2.3 From e11aae188afec1fe6c84c65170251c20d890d08e Mon Sep 17 00:00:00 2001 From: Andrea Cimitan Date: Thu, 28 Jul 2011 19:22:09 +0200 Subject: Cimi's fix for spinner --- src/transport-widget.c | 62 +++++++++++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index 66bb748..aeaa2d0 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -90,8 +90,9 @@ struct _TransportWidgetPrivate gboolean fade_out; }; -static GtkStyleContext *spinner_style_context; -static GtkWidgetPath *spinner_widget_path; +static GList *transport_widget_list = NULL; +static GtkStyleContext *spinner_style_context = NULL; +static GtkWidgetPath *spinner_widget_path = NULL; // TODO refactor the UI handlers, consolidate functionality between key press /release // and button press / release. @@ -174,11 +175,23 @@ static void transport_widget_init (TransportWidget *self) { TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(self); - - spinner_widget_path = gtk_widget_path_new(); - spinner_style_context = gtk_style_context_new(); - - + + if (transport_widget_list == NULL){ + /* append the object to the static linked list. */ + transport_widget_list = g_list_append (transport_widget_list, self); + + /* create widget path */ + spinner_widget_path = gtk_widget_path_new(); + + gtk_widget_path_iter_set_name (spinner_widget_path, -1 , "IndicatorSoundSpinner"); + gtk_widget_path_append_type (spinner_widget_path, GTK_TYPE_SPINNER); + + /* create style context and append path */ + spinner_style_context = gtk_style_context_new(); + + gtk_style_context_set_path (spinner_style_context, spinner_widget_path); + gtk_style_context_add_class (spinner_style_context, GTK_STYLE_CLASS_SPINNER); + } /* gtk_settings_set_string_property( gtk_settings_get_default(), "gtk-enable-animations", @@ -187,17 +200,6 @@ transport_widget_init (TransportWidget *self) //g_object_set (gtk_settings_get_default (), "gtk-enable-animations", TRUE, NULL); - gtk_widget_path_append_type (spinner_widget_path, GTK_TYPE_SPINNER); - gtk_widget_path_iter_set_name (spinner_widget_path, 1 , "IndicatorSoundSpinner"); - - gtk_widget_path_iter_add_class(spinner_widget_path,-1,GTK_STYLE_CLASS_SPINNER); - - gtk_style_context_add_class(spinner_style_context,GTK_STYLE_CLASS_SPINNER); - - gtk_style_context_set_path (spinner_style_context, spinner_widget_path); - gtk_style_context_add_class (spinner_style_context, GTK_STYLE_CLASS_SPINNER); - gtk_style_context_set_state (spinner_style_context, GTK_STATE_FLAG_NORMAL); - priv->current_command = TRANSPORT_ACTION_NO_ACTION; priv->current_state = TRANSPORT_STATE_PAUSED; priv->key_event = TRANSPORT_ACTION_NO_ACTION; @@ -260,7 +262,19 @@ transport_widget_init (TransportWidget *self) static void transport_widget_dispose (GObject *object) { - g_object_unref (spinner_style_context); + transport_widget_list = g_list_remove (transport_widget_list, object); + + if (transport_widget_list == NULL){ + if (spinner_widget_path != NULL){ + gtk_widget_path_free (spinner_widget_path); + spinner_widget_path = NULL; + } + + if (spinner_style_context != NULL){ + g_object_unref (spinner_style_context); + spinner_style_context = NULL; + } + } G_OBJECT_CLASS (transport_widget_parent_class)->dispose (object); } @@ -268,7 +282,7 @@ transport_widget_dispose (GObject *object) static void transport_widget_finalize (GObject *object) { - gtk_widget_path_free (spinner_widget_path); + G_OBJECT_CLASS (transport_widget_parent_class)->finalize (object); } @@ -1804,14 +1818,15 @@ draw (GtkWidget* button, cairo_t *cr) g_debug ("Is state active: %i and progress %f", state == GTK_STATE_FLAG_ACTIVE, progress ); + gtk_render_activity (spinner_style_context, cr, 106, 6 , 30, 30); + g_debug ("context style is running ? = %i", gtk_style_context_state_is_running (spinner_style_context, GTK_STATE_ACTIVE, &progress)); // need to redraw the cairo context here, cairo_paint() doesn't seem to do it - cairo_paint(cr); /* GtkOffscreenWindow* tmp_offscreen_win = (GtkOffscreenWindow*)priv->offscreen_window; @@ -1937,11 +1952,10 @@ transport_widget_property_update(DbusmenuMenuitem* item, gchar* property, gtk_style_context_notify_state_change (spinner_style_context, gtk_widget_get_window ( GTK_WIDGET(userdata)), NULL, - GTK_STATE_PRELIGHT, + GTK_STATE_FLAG_ACTIVE, TRUE); - gtk_style_context_set_state (spinner_style_context, GTK_STATE_FLAG_ACTIVE); - + priv->current_state = TRANSPORT_STATE_LAUNCHING; priv->launching_timer = g_timeout_add (100, transport_widget_fade_playbutton, -- cgit v1.2.3 From 5fcbaa67209c40c752b8b3c2b78cb26233b7ccb8 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 28 Jul 2011 18:53:59 +0100 Subject: bumped version for release --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 184de39..47d8350 100644 --- a/configure.ac +++ b/configure.ac @@ -1,10 +1,10 @@ -AC_INIT(indicator-sound, 0.7.3, conor.curran@canonical.com) +AC_INIT(indicator-sound, 0.7.4, conor.curran@canonical.com) AC_PREREQ(2.53) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(indicator-sound, 0.7.3) +AM_INIT_AUTOMAKE(indicator-sound, 0.7.4) AM_MAINTAINER_MODE -- cgit v1.2.3 From 65982386494b0ffe4ff8bdf4be698e8b7616f561 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Fri, 29 Jul 2011 16:06:41 +0100 Subject: ifdefs needed for gtk2 compilation --- src/Makefile.am | 2 +- src/transport-widget.c | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 60c7249..9c56c0e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -109,7 +109,7 @@ indicator_sound_service_SOURCES = \ gen-sound-service.xml.c \ $(music_bridge_VALASOURCES:.vala=.c) -indicator_sound_service_CFLAGS = $(PULSEAUDIO_CFLAGS) $(SOUNDSERVICE_CFLAGS) $(GCONF_CFLAGS) -DLIBEXECDIR=\"$(libexecdir)\" -Wall +indicator_sound_service_CFLAGS = $(PULSEAUDIO_CFLAGS) $(SOUNDSERVICE_CFLAGS) $(GCONF_CFLAGS) -DLIBEXECDIR=\"$(libexecdir)\" -Wall -Werror indicator_sound_service_LDADD = $(PULSEAUDIO_LIBS) $(SOUNDSERVICE_LIBS) $(GCONF_LIBS) ######################### diff --git a/src/transport-widget.c b/src/transport-widget.c index 898472e..564b76f 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -87,9 +87,11 @@ struct _TransportWidgetPrivate gint skip_frequency; }; +#if GTK_CHECK_VERSION(3, 0, 0) static GList *transport_widget_list = NULL; static GtkStyleContext *spinner_style_context = NULL; static GtkWidgetPath *spinner_widget_path = NULL; +#endif // TODO refactor the UI handlers, consolidate functionality between key press /release // and button press / release. @@ -171,7 +173,7 @@ static void transport_widget_init (TransportWidget *self) { TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(self); - + #if GTK_CHECK_VERSION(3, 0, 0) if (transport_widget_list == NULL){ /* append the object to the static linked list. */ transport_widget_list = g_list_append (transport_widget_list, self); @@ -188,7 +190,7 @@ transport_widget_init (TransportWidget *self) gtk_style_context_set_path (spinner_style_context, spinner_widget_path); gtk_style_context_add_class (spinner_style_context, GTK_STYLE_CLASS_SPINNER); } - + #endif priv->current_command = TRANSPORT_ACTION_NO_ACTION; priv->current_state = TRANSPORT_STATE_PAUSED; priv->key_event = TRANSPORT_ACTION_NO_ACTION; @@ -248,6 +250,7 @@ transport_widget_init (TransportWidget *self) static void transport_widget_dispose (GObject *object) { + #if GTK_CHECK_VERSION(3, 0, 0) transport_widget_list = g_list_remove (transport_widget_list, object); if (transport_widget_list == NULL){ @@ -261,7 +264,7 @@ transport_widget_dispose (GObject *object) spinner_style_context = NULL; } } - + #endif G_OBJECT_CLASS (transport_widget_parent_class)->dispose (object); } @@ -280,7 +283,6 @@ transport_widget_expose (GtkWidget *button, GdkEventExpose *event) cairo_t *cr; cr = gdk_cairo_create (gtk_widget_get_window (button)); - g_debug("In the playbutton's expose method, x = %i, y=%i and width: %i and height: %i'"); cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height); @@ -1791,10 +1793,13 @@ draw (GtkWidget* button, cairo_t *cr) FALSE); _finalize (cr, &cr_surf, &surf, PAUSE_X-0.5f, PAUSE_Y); } + #if GTK_CHECK_VERSION(3, 0, 0) else if(priv->current_state == TRANSPORT_STATE_LAUNCHING) { + gtk_render_activity (spinner_style_context, cr, 106, 6 , 30, 30); } + #endif return FALSE; } @@ -1831,12 +1836,14 @@ transport_widget_property_update(DbusmenuMenuitem* item, gchar* property, TransportState new_state = (TransportState)g_variant_get_int32(value); //g_debug("transport_widget_update_state - with value %i", new_state); if (new_state == TRANSPORT_STATE_LAUNCHING){ + #if GTK_CHECK_VERSION(3, 0, 0) gtk_style_context_notify_state_change (spinner_style_context, gtk_widget_get_window ( GTK_WIDGET(userdata)), NULL, GTK_STATE_FLAG_ACTIVE, TRUE); gtk_style_context_set_state (spinner_style_context, GTK_STATE_FLAG_ACTIVE); + #endif priv->current_state = TRANSPORT_STATE_LAUNCHING; g_debug("TransportWidget::toggle play state : %i", priv->current_state); -- cgit v1.2.3 From c60b7f972eb8faa1b06366dfebdb4a220d565f1e Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Fri, 29 Jul 2011 17:18:02 +0100 Subject: bumped for release and removed -Werror from makefile.am until valac fixes its issues --- configure.ac | 4 ++-- src/Makefile.am | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 47d8350..25f861a 100644 --- a/configure.ac +++ b/configure.ac @@ -1,10 +1,10 @@ -AC_INIT(indicator-sound, 0.7.4, conor.curran@canonical.com) +AC_INIT(indicator-sound, 0.7.4.1, conor.curran@canonical.com) AC_PREREQ(2.53) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(indicator-sound, 0.7.4) +AM_INIT_AUTOMAKE(indicator-sound, 0.7.4.1) AM_MAINTAINER_MODE diff --git a/src/Makefile.am b/src/Makefile.am index 9c56c0e..60c7249 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -109,7 +109,7 @@ indicator_sound_service_SOURCES = \ gen-sound-service.xml.c \ $(music_bridge_VALASOURCES:.vala=.c) -indicator_sound_service_CFLAGS = $(PULSEAUDIO_CFLAGS) $(SOUNDSERVICE_CFLAGS) $(GCONF_CFLAGS) -DLIBEXECDIR=\"$(libexecdir)\" -Wall -Werror +indicator_sound_service_CFLAGS = $(PULSEAUDIO_CFLAGS) $(SOUNDSERVICE_CFLAGS) $(GCONF_CFLAGS) -DLIBEXECDIR=\"$(libexecdir)\" -Wall indicator_sound_service_LDADD = $(PULSEAUDIO_LIBS) $(SOUNDSERVICE_LIBS) $(GCONF_LIBS) ######################### -- cgit v1.2.3