diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.in | 5 | ||||
-rw-r--r-- | src/indicator-sound.c | 10 | ||||
-rw-r--r-- | src/metadata-widget.c | 60 | ||||
-rw-r--r-- | src/mpris2-controller.c | 291 | ||||
-rw-r--r-- | src/mpris2-controller.vala | 78 | ||||
-rw-r--r-- | src/player-item.c | 9 | ||||
-rw-r--r-- | src/player-item.vala | 2 |
7 files changed, 194 insertions, 261 deletions
diff --git a/src/Makefile.in b/src/Makefile.in index 6ffa65e..4617dd3 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -39,10 +39,7 @@ libexec_PROGRAMS = indicator-sound-service$(EXEEXT) subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/intltool.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs 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)); diff --git a/src/metadata-widget.c b/src/metadata-widget.c index d522358..d34f1fc 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), @@ -733,34 +698,13 @@ 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){ - // 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.c b/src/mpris2-controller.c index 0905795..8b3ad14 100644 --- a/src/mpris2-controller.c +++ b/src/mpris2-controller.c @@ -137,8 +137,8 @@ typedef struct _TransportMenuitemClass TransportMenuitemClass; typedef struct _MetadataMenuitem MetadataMenuitem; typedef struct _MetadataMenuitemClass MetadataMenuitemClass; -#define _g_hash_table_unref0(var) ((var == NULL) ? NULL : (var = (g_hash_table_unref (var), NULL))) #define _g_variant_unref0(var) ((var == NULL) ? NULL : (var = (g_variant_unref (var), NULL))) +#define _g_hash_table_unref0(var) ((var == NULL) ? NULL : (var = (g_hash_table_unref (var), NULL))) #define TYPE_PLAYLISTS_MENUITEM (playlists_menuitem_get_type ()) #define PLAYLISTS_MENUITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_PLAYLISTS_MENUITEM, PlaylistsMenuitem)) @@ -327,21 +327,23 @@ GType player_item_get_type (void) G_GNUC_CONST; GType player_controller_widget_order_get_type (void) G_GNUC_CONST; GType transport_menuitem_get_type (void) G_GNUC_CONST; void transport_menuitem_change_play_state (TransportMenuitem* self, TransportState update); -static GHashTable* mpris2_controller_clean_metadata (Mpris2Controller* self); -void player_item_reset (PlayerItem* self, GeeHashSet* attrs); -GeeHashSet* metadata_menuitem_relevant_attributes_for_ui (void); -void player_item_update (PlayerItem* self, GHashTable* data, GeeHashSet* attributes); -GType metadata_menuitem_get_type (void) G_GNUC_CONST; -gboolean player_item_populated (PlayerItem* self, GeeHashSet* attrs); -void metadata_menuitem_should_collapse (MetadataMenuitem* self, gboolean collapse); +static gboolean mpris2_controller_ensure_correct_metadata (Mpris2Controller* self); +static gboolean _mpris2_controller_ensure_correct_metadata_gsource_func (gpointer self); static gboolean _bool_equal (const gboolean* s1, const gboolean* s2); static gboolean mpris2_controller_fetch_active_playlist (Mpris2Controller* self); static gboolean _mpris2_controller_fetch_active_playlist_gsource_func (gpointer self); void mpris2_controller_fetch_playlists (Mpris2Controller* self, GAsyncReadyCallback _callback_, gpointer _user_data_); void mpris2_controller_fetch_playlists_finish (Mpris2Controller* self, GAsyncResult* _res_); +GType metadata_menuitem_get_type (void) G_GNUC_CONST; void metadata_menuitem_alter_label (MetadataMenuitem* self, const gchar* new_title); MprisRoot* mpris2_controller_get_mpris2_root (Mpris2Controller* self); gchar* mpris_root_get_Identity (MprisRoot* self); +static GHashTable* mpris2_controller_clean_metadata (Mpris2Controller* self); +void player_item_reset (PlayerItem* self, GeeHashSet* attrs); +GeeHashSet* metadata_menuitem_relevant_attributes_for_ui (void); +void player_item_update (PlayerItem* self, GHashTable* data, GeeHashSet* attributes); +gboolean player_item_populated (PlayerItem* self, GeeHashSet* attrs); +void metadata_menuitem_should_collapse (MetadataMenuitem* self, gboolean collapse); GHashTable* mpris_player_get_Metadata (MprisPlayer* self); static GVariant* _variant_new1 (const gchar* value); void mpris2_controller_initial_update (Mpris2Controller* self); @@ -418,19 +420,10 @@ static gboolean _mpris2_controller_ensure_correct_playback_status_gsource_func ( } -static gchar* bool_to_string (gboolean self) { - gchar* result = NULL; - if (self) { - gchar* _tmp0_; - _tmp0_ = g_strdup ("true"); - result = _tmp0_; - return result; - } else { - gchar* _tmp1_; - _tmp1_ = g_strdup ("false"); - result = _tmp1_; - return result; - } +static gboolean _mpris2_controller_ensure_correct_metadata_gsource_func (gpointer self) { + gboolean result; + result = mpris2_controller_ensure_correct_metadata (self); + return result; } @@ -463,20 +456,20 @@ void mpris2_controller_property_changed_cb (Mpris2Controller* self, const gchar* gconstpointer _tmp9_ = NULL; GVariant* _tmp10_; GVariant* meta_v; - gconstpointer _tmp25_ = NULL; - GVariant* _tmp26_; + gconstpointer _tmp11_ = NULL; + GVariant* _tmp12_; GVariant* playlist_v; - gboolean _tmp27_ = FALSE; - gconstpointer _tmp29_ = NULL; - GVariant* _tmp30_; + gboolean _tmp13_ = FALSE; + gconstpointer _tmp15_ = NULL; + GVariant* _tmp16_; GVariant* playlist_count_v; - gboolean _tmp31_ = FALSE; - gconstpointer _tmp33_ = NULL; - GVariant* _tmp34_; + gboolean _tmp17_ = FALSE; + gconstpointer _tmp19_ = NULL; + GVariant* _tmp20_; GVariant* playlist_orderings_v; - gboolean _tmp35_ = FALSE; - gconstpointer _tmp37_ = NULL; - GVariant* _tmp38_; + gboolean _tmp21_ = FALSE; + gconstpointer _tmp23_ = NULL; + GVariant* _tmp24_; GVariant* identity_v; g_return_if_fail (self != NULL); g_return_if_fail (interface_source != NULL); @@ -489,7 +482,7 @@ void mpris2_controller_property_changed_cb (Mpris2Controller* self, const gchar* _tmp0_ = _tmp1_ == FALSE; } if (_tmp0_) { - g_warning ("mpris2-controller.vala:71: Property-changed hash is null or this is an" \ + g_warning ("mpris2-controller.vala:77: Property-changed hash is null or this is an" \ " interface that doesn't concern us"); return; } @@ -520,111 +513,65 @@ void mpris2_controller_property_changed_cb (Mpris2Controller* self, const gchar* _tmp10_ = _g_variant_ref0 ((GVariant*) _tmp9_); meta_v = _tmp10_; if (meta_v != NULL) { - GHashTable* _tmp11_ = NULL; - GHashTable* changed_updates; - gpointer _tmp12_ = NULL; - PlayerItem* metadata; - GeeHashSet* _tmp13_ = NULL; - GeeHashSet* _tmp14_; - GeeHashSet* _tmp15_ = NULL; - GeeHashSet* _tmp16_; - gpointer _tmp17_ = NULL; - PlayerItem* _tmp18_; - MetadataMenuitem* md; - GeeHashSet* _tmp19_ = NULL; - GeeHashSet* _tmp20_; - gboolean _tmp21_; - gboolean _tmp22_; - gboolean collapsing; - gchar* _tmp23_ = NULL; - gchar* _tmp24_; - _tmp11_ = mpris2_controller_clean_metadata (self); - changed_updates = _tmp11_; - _tmp12_ = gee_abstract_list_get ((GeeAbstractList*) self->priv->_owner->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_METADATA); - metadata = (PlayerItem*) _tmp12_; - _tmp13_ = metadata_menuitem_relevant_attributes_for_ui (); - _tmp14_ = _tmp13_; - player_item_reset (metadata, _tmp14_); - _g_object_unref0 (_tmp14_); - _tmp15_ = metadata_menuitem_relevant_attributes_for_ui (); - _tmp16_ = _tmp15_; - player_item_update (metadata, changed_updates, _tmp16_); - _g_object_unref0 (_tmp16_); - _tmp17_ = gee_abstract_list_get ((GeeAbstractList*) self->priv->_owner->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_METADATA); - _tmp18_ = (PlayerItem*) _tmp17_; - md = IS_METADATA_MENUITEM (_tmp18_) ? ((MetadataMenuitem*) _tmp18_) : NULL; - _tmp19_ = metadata_menuitem_relevant_attributes_for_ui (); - _tmp20_ = _tmp19_; - _tmp21_ = player_item_populated (metadata, _tmp20_); - _tmp22_ = !_tmp21_; - _g_object_unref0 (_tmp20_); - collapsing = _tmp22_; - metadata_menuitem_should_collapse (md, collapsing); - _tmp23_ = bool_to_string (collapsing); - _tmp24_ = _tmp23_; - g_debug ("mpris2-controller.vala:95: Should metadata collapse %s", _tmp24_); - _g_free0 (_tmp24_); - _g_object_unref0 (md); - _g_object_unref0 (metadata); - _g_hash_table_unref0 (changed_updates); + g_timeout_add_full (G_PRIORITY_DEFAULT, (guint) 200, _mpris2_controller_ensure_correct_metadata_gsource_func, g_object_ref (self), g_object_unref); } - _tmp25_ = g_hash_table_lookup (changed_properties, "ActivePlaylist"); - _tmp26_ = _g_variant_ref0 ((GVariant*) _tmp25_); - playlist_v = _tmp26_; + _tmp11_ = g_hash_table_lookup (changed_properties, "ActivePlaylist"); + _tmp12_ = _g_variant_ref0 ((GVariant*) _tmp11_); + playlist_v = _tmp12_; if (playlist_v != NULL) { - gboolean _tmp28_; - _tmp28_ = TRUE; - _tmp27_ = _bool_equal (self->priv->_owner->use_playlists, &_tmp28_) == TRUE; + gboolean _tmp14_; + _tmp14_ = TRUE; + _tmp13_ = _bool_equal (self->priv->_owner->use_playlists, &_tmp14_) == TRUE; } else { - _tmp27_ = FALSE; + _tmp13_ = FALSE; } - if (_tmp27_) { + if (_tmp13_) { g_timeout_add_full (G_PRIORITY_DEFAULT, (guint) 300, _mpris2_controller_fetch_active_playlist_gsource_func, g_object_ref (self), g_object_unref); } - _tmp29_ = g_hash_table_lookup (changed_properties, "PlaylistCount"); - _tmp30_ = _g_variant_ref0 ((GVariant*) _tmp29_); - playlist_count_v = _tmp30_; + _tmp15_ = g_hash_table_lookup (changed_properties, "PlaylistCount"); + _tmp16_ = _g_variant_ref0 ((GVariant*) _tmp15_); + playlist_count_v = _tmp16_; if (playlist_count_v != NULL) { - gboolean _tmp32_; - _tmp32_ = TRUE; - _tmp31_ = _bool_equal (self->priv->_owner->use_playlists, &_tmp32_) == TRUE; + gboolean _tmp18_; + _tmp18_ = TRUE; + _tmp17_ = _bool_equal (self->priv->_owner->use_playlists, &_tmp18_) == TRUE; } else { - _tmp31_ = FALSE; + _tmp17_ = FALSE; } - if (_tmp31_) { + if (_tmp17_) { mpris2_controller_fetch_playlists (self, NULL, NULL); mpris2_controller_fetch_active_playlist (self); } - _tmp33_ = g_hash_table_lookup (changed_properties, "Orderings"); - _tmp34_ = _g_variant_ref0 ((GVariant*) _tmp33_); - playlist_orderings_v = _tmp34_; + _tmp19_ = g_hash_table_lookup (changed_properties, "Orderings"); + _tmp20_ = _g_variant_ref0 ((GVariant*) _tmp19_); + playlist_orderings_v = _tmp20_; if (playlist_orderings_v != NULL) { - gboolean _tmp36_; - _tmp36_ = TRUE; - _tmp35_ = _bool_equal (self->priv->_owner->use_playlists, &_tmp36_) == TRUE; + gboolean _tmp22_; + _tmp22_ = TRUE; + _tmp21_ = _bool_equal (self->priv->_owner->use_playlists, &_tmp22_) == TRUE; } else { - _tmp35_ = FALSE; + _tmp21_ = FALSE; } - if (_tmp35_) { + if (_tmp21_) { mpris2_controller_fetch_playlists (self, NULL, NULL); mpris2_controller_fetch_active_playlist (self); } - _tmp37_ = g_hash_table_lookup (changed_properties, "Identity"); - _tmp38_ = _g_variant_ref0 ((GVariant*) _tmp37_); - identity_v = _tmp38_; + _tmp23_ = g_hash_table_lookup (changed_properties, "Identity"); + _tmp24_ = _g_variant_ref0 ((GVariant*) _tmp23_); + identity_v = _tmp24_; if (identity_v != NULL) { - gpointer _tmp39_ = NULL; - PlayerItem* _tmp40_; + gpointer _tmp25_ = NULL; + PlayerItem* _tmp26_; MetadataMenuitem* md; - gchar* _tmp41_ = NULL; - gchar* _tmp42_; - _tmp39_ = gee_abstract_list_get ((GeeAbstractList*) self->priv->_owner->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_METADATA); - _tmp40_ = (PlayerItem*) _tmp39_; - md = IS_METADATA_MENUITEM (_tmp40_) ? ((MetadataMenuitem*) _tmp40_) : NULL; - _tmp41_ = mpris_root_get_Identity (self->priv->_mpris2_root); - _tmp42_ = _tmp41_; - metadata_menuitem_alter_label (md, _tmp42_); - _g_free0 (_tmp42_); + gchar* _tmp27_ = NULL; + gchar* _tmp28_; + _tmp25_ = gee_abstract_list_get ((GeeAbstractList*) self->priv->_owner->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_METADATA); + _tmp26_ = (PlayerItem*) _tmp25_; + md = IS_METADATA_MENUITEM (_tmp26_) ? ((MetadataMenuitem*) _tmp26_) : NULL; + _tmp27_ = mpris_root_get_Identity (self->priv->_mpris2_root); + _tmp28_ = _tmp27_; + metadata_menuitem_alter_label (md, _tmp28_); + _g_free0 (_tmp28_); _g_object_unref0 (md); } _g_variant_unref0 (identity_v); @@ -636,6 +583,55 @@ void mpris2_controller_property_changed_cb (Mpris2Controller* self, const gchar* } +static gboolean mpris2_controller_ensure_correct_metadata (Mpris2Controller* self) { + gboolean result = FALSE; + GHashTable* _tmp0_ = NULL; + GHashTable* changed_updates; + gpointer _tmp1_ = NULL; + PlayerItem* metadata; + GeeHashSet* _tmp2_ = NULL; + GeeHashSet* _tmp3_; + GeeHashSet* _tmp4_ = NULL; + GeeHashSet* _tmp5_; + gpointer _tmp6_ = NULL; + PlayerItem* _tmp7_; + MetadataMenuitem* md; + GeeHashSet* _tmp8_ = NULL; + GeeHashSet* _tmp9_; + gboolean _tmp10_; + gboolean _tmp11_; + gboolean collapsing; + g_return_val_if_fail (self != NULL, FALSE); + _tmp0_ = mpris2_controller_clean_metadata (self); + changed_updates = _tmp0_; + _tmp1_ = gee_abstract_list_get ((GeeAbstractList*) self->priv->_owner->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_METADATA); + metadata = (PlayerItem*) _tmp1_; + _tmp2_ = metadata_menuitem_relevant_attributes_for_ui (); + _tmp3_ = _tmp2_; + player_item_reset (metadata, _tmp3_); + _g_object_unref0 (_tmp3_); + _tmp4_ = metadata_menuitem_relevant_attributes_for_ui (); + _tmp5_ = _tmp4_; + player_item_update (metadata, changed_updates, _tmp5_); + _g_object_unref0 (_tmp5_); + _tmp6_ = gee_abstract_list_get ((GeeAbstractList*) self->priv->_owner->custom_items, (gint) PLAYER_CONTROLLER_WIDGET_ORDER_METADATA); + _tmp7_ = (PlayerItem*) _tmp6_; + md = IS_METADATA_MENUITEM (_tmp7_) ? ((MetadataMenuitem*) _tmp7_) : NULL; + _tmp8_ = metadata_menuitem_relevant_attributes_for_ui (); + _tmp9_ = _tmp8_; + _tmp10_ = player_item_populated (metadata, _tmp9_); + _tmp11_ = !_tmp10_; + _g_object_unref0 (_tmp9_); + collapsing = _tmp11_; + metadata_menuitem_should_collapse (md, collapsing); + result = FALSE; + _g_object_unref0 (md); + _g_object_unref0 (metadata); + _g_hash_table_unref0 (changed_updates); + return result; +} + + static gboolean mpris2_controller_ensure_correct_playback_status (Mpris2Controller* self) { gboolean result = FALSE; gchar* _tmp0_ = NULL; @@ -689,50 +685,36 @@ static GHashTable* mpris2_controller_clean_metadata (Mpris2Controller* self) { _g_hash_table_unref0 (_tmp2_); artist_v = _tmp5_; if (artist_v != NULL) { - GHashTable* _tmp6_ = NULL; - GHashTable* _tmp7_; - gconstpointer _tmp8_ = NULL; - GVariant* _tmp9_; - GVariant* _tmp10_; - GVariant* v_artists; gchar* display_artists = NULL; - const gchar* _tmp11_ = NULL; - gchar* _tmp17_; - _tmp6_ = mpris_player_get_Metadata (self->priv->_player); - _tmp7_ = _tmp6_; - _tmp8_ = g_hash_table_lookup (_tmp7_, "xesam:artist"); - _tmp9_ = _g_variant_ref0 ((GVariant*) _tmp8_); - _tmp10_ = _tmp9_; - _g_hash_table_unref0 (_tmp7_); - v_artists = _tmp10_; - _tmp11_ = g_variant_get_type_string (v_artists); - if (g_strcmp0 (_tmp11_, "s") == 0) { - const gchar* _tmp12_ = NULL; - gchar* _tmp13_; - _tmp12_ = g_variant_get_string (v_artists, NULL); - _tmp13_ = g_strdup (_tmp12_); + const gchar* _tmp6_ = NULL; + gchar* _tmp12_; + _tmp6_ = g_variant_get_type_string (artist_v); + if (g_strcmp0 (_tmp6_, "s") == 0) { + const gchar* _tmp7_ = NULL; + gchar* _tmp8_; + _tmp7_ = g_variant_get_string (artist_v, NULL); + _tmp8_ = g_strdup (_tmp7_); _g_free0 (display_artists); - display_artists = _tmp13_; + display_artists = _tmp8_; } else { - size_t _tmp14_; - gchar** _tmp15_ = NULL; + size_t _tmp9_; + gchar** _tmp10_ = NULL; gchar** artists; gint artists_length1; gint _artists_size_; - gchar* _tmp16_ = NULL; - _tmp15_ = g_variant_dup_strv (v_artists, &_tmp14_); - artists = _tmp15_; - artists_length1 = _tmp14_; - _artists_size_ = _tmp14_; - _tmp16_ = g_strjoinv (", ", artists); + gchar* _tmp11_ = NULL; + _tmp10_ = g_variant_dup_strv (artist_v, &_tmp9_); + artists = _tmp10_; + artists_length1 = _tmp9_; + _artists_size_ = _tmp9_; + _tmp11_ = g_strjoinv (", ", artists); _g_free0 (display_artists); - display_artists = _tmp16_; + display_artists = _tmp11_; artists = (_vala_array_free (artists, artists_length1, (GDestroyNotify) g_free), NULL); } - _tmp17_ = g_strdup ("xesam:artist"); - g_hash_table_replace (changed_updates, _tmp17_, _variant_new1 (display_artists)); + _tmp12_ = g_strdup ("xesam:artist"); + g_hash_table_replace (changed_updates, _tmp12_, _variant_new1 (display_artists)); _g_free0 (display_artists); - _g_variant_unref0 (v_artists); } result = changed_updates; _g_variant_unref0 (artist_v); @@ -1023,7 +1005,7 @@ static gboolean mpris2_controller_fetch_playlists_co (Mpris2ControllerFetchPlayl playlists_menuitem_update (data->playlists_item, data->current_playlists, data->current_playlists_length1); _g_object_unref0 (data->playlists_item); } else { - g_warning ("mpris2-controller.vala:243: Playlists are on but its returning no cur" \ + g_warning ("mpris2-controller.vala:242: Playlists are on but its returning no cur" \ "rent_playlists"); data->_tmp5_ = FALSE; data->_tmp6_ = __bool_dup0 (&data->_tmp5_); @@ -1082,6 +1064,7 @@ void mpris2_controller_activate_playlist (Mpris2Controller* self, const char* pa GError * e; e = _inner_error_; _inner_error_ = NULL; + g_warning ("mpris2-controller.vala:264: Could not activate playlist %s because %s", (const gchar*) path, e->message); _g_error_free0 (e); } __finally12: @@ -1279,7 +1262,7 @@ static GObject * mpris2_controller_constructor (GType type, guint n_construct_pr GError * e; e = _inner_error_; _inner_error_ = NULL; - g_critical ("mpris2-controller.vala:60: Problems connecting to the session bus - %s", e->message); + g_critical ("mpris2-controller.vala:56: Problems connecting to the session bus - %s", e->message); _g_error_free0 (e); } __finally13: 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 <http://www.gnu.org/licenses/>. 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<string, Variant?> 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<string, Variant?> 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<string, Variant?> 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.c b/src/player-item.c index 3c9cbeb..89c291d 100644 --- a/src/player-item.c +++ b/src/player-item.c @@ -56,6 +56,7 @@ typedef struct _PlayerController PlayerController; typedef struct _PlayerControllerClass PlayerControllerClass; #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL))) #define _g_free0(var) (var = (g_free (var), NULL)) +#define _g_variant_unref0(var) ((var == NULL) ? NULL : (var = (g_variant_unref (var), NULL))) #define TYPE_METADATA_MENUITEM (metadata_menuitem_get_type ()) #define METADATA_MENUITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_METADATA_MENUITEM, MetadataMenuitem)) @@ -66,7 +67,6 @@ typedef struct _PlayerControllerClass PlayerControllerClass; typedef struct _MetadataMenuitem MetadataMenuitem; typedef struct _MetadataMenuitemClass MetadataMenuitemClass; -#define _g_variant_unref0(var) ((var == NULL) ? NULL : (var = (g_variant_unref (var), NULL))) struct _PlayerItem { DbusmenuMenuitem parent_instance; @@ -237,6 +237,13 @@ void player_item_update (PlayerItem* self, GHashTable* data, GeeHashSet* attribu _tmp6_ = g_hash_table_lookup (data, search_key); _tmp7_ = _g_variant_ref0 ((GVariant*) _tmp6_); v = _tmp7_; + if (v == NULL) { + _g_variant_unref0 (v); + _g_free0 (search_key); + input_keys = (_vala_array_free (input_keys, input_keys_length1, (GDestroyNotify) g_free), NULL); + _g_free0 (property); + continue; + } _tmp8_ = g_variant_is_of_type (v, G_VARIANT_TYPE_STRING); if (_tmp8_) { const gchar* _tmp9_ = NULL; 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); |