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 --- src/metadata-widget.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'src/metadata-widget.c') 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){ -- 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(-) (limited to 'src/metadata-widget.c') 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(-) (limited to 'src/metadata-widget.c') 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(-) (limited to 'src/metadata-widget.c') 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 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(-) (limited to 'src/metadata-widget.c') 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(-) (limited to 'src/metadata-widget.c') 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 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(-) (limited to 'src/metadata-widget.c') 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