This is an automated email from the git hooks/post-receive script. b l u e s a b r e p u s h e d a c o m m i t t o b r a n c h m a s t e r in repository panel-plugins/xfce4-pulseaudio-plugin.
commit 3e6ae84ac0c57b4c6dd918074e6f1e9b002466bc Author: Sean Davis <[email protected]> Date: Thu Sep 14 06:41:19 2017 -0400 Tidy up MprisMenuItem --- panel-plugin/mprismenuitem.c | 872 ++++++++++++++++++++++++------------------- panel-plugin/mprismenuitem.h | 22 +- 2 files changed, 489 insertions(+), 405 deletions(-) diff --git a/panel-plugin/mprismenuitem.c b/panel-plugin/mprismenuitem.c index 1f1c7c4..4c4b689 100644 --- a/panel-plugin/mprismenuitem.c +++ b/panel-plugin/mprismenuitem.c @@ -38,14 +38,6 @@ #include <libxfce4util/libxfce4util.h> -static gboolean mpris_menu_item_button_press_event (GtkWidget *menuitem, - GdkEventButton *event); -static gboolean mpris_menu_item_button_release_event (GtkWidget *menuitem, - GdkEventButton *event); -static void update_packing (MprisMenuItem *self); -static void mpris_menu_item_finalize (GObject *object); - - struct _MprisMenuItemPrivate { GtkWidget *title_label; @@ -75,11 +67,15 @@ struct _MprisMenuItemPrivate { GtkWidget *button_box; }; + + enum { MEDIA_NOTIFY, LAST_SIGNAL }; + + static guint signals[LAST_SIGNAL] = { 0 }; G_GNUC_BEGIN_IGNORE_DEPRECATIONS @@ -90,79 +86,182 @@ G_GNUC_END_IGNORE_DEPRECATIONS -static void -mpris_menu_item_class_init (MprisMenuItemClass *item_class) +/* Static Declarations */ +static void mpris_menu_item_finalize (GObject *object); +static void mpris_menu_item_raise (MprisMenuItem *item); +static void mpris_menu_item_launch (MprisMenuItem *item); +static void mpris_menu_item_raise_or_launch (MprisMenuItem *item); +static GtkWidget * mpris_menu_item_get_widget_at_event (MprisMenuItem *item, + GdkEventButton *event); +static gboolean mpris_menu_item_button_press_event (GtkWidget *item, + GdkEventButton *event); +static gboolean mpris_menu_item_button_release_event (GtkWidget *item, + GdkEventButton *event); +static void media_play_pause_clicked_event (GtkButton *button, + gpointer user_data); +static void media_go_previous_clicked_event (GtkButton *button, + gpointer user_data); +static void media_go_next_clicked_event (GtkButton *button, + gpointer user_data); +static void menu_item_activate_event (GtkMenuItem *item, + gpointer user_data); +static void media_notify (MprisMenuItem *item, + gchar *message); +static GtkWidget * track_info_label_new (void); +static void gtk_label_set_markup_printf_escaped (GtkLabel *label, + const gchar *format, + ...); +static void update_packing (MprisMenuItem *item); +static gchar * find_desktop_entry (const gchar *player_name); + + + +/* Public API */ +GtkWidget* +mpris_menu_item_new_with_player (const gchar *player, + const gchar *title, + const gchar *icon_name, + const gchar *filename) { - GObjectClass *gobject_class = G_OBJECT_CLASS (item_class); - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (item_class); + MprisMenuItem *menu_item; + MprisMenuItemPrivate *priv; - gobject_class->finalize = mpris_menu_item_finalize; - widget_class->button_press_event = mpris_menu_item_button_press_event; - widget_class->button_release_event = mpris_menu_item_button_release_event; + TRACE("entering"); - /** - * MprisMenuItem::media-notify: - * @menuitem: the #MprisMenuItem for which the value changed - * @value: the mpris signal to emit - * - * Emitted whenever the a media button is clicked. - */ - signals[MEDIA_NOTIFY] = g_signal_new ("media-notify", - TYPE_MPRIS_MENU_ITEM, - G_SIGNAL_RUN_LAST, - 0, NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, - 1, G_TYPE_STRING); + menu_item = MPRIS_MENU_ITEM (g_object_new (TYPE_MPRIS_MENU_ITEM, NULL)); - g_type_class_add_private (item_class, sizeof (MprisMenuItemPrivate)); + priv = GET_PRIVATE (menu_item); + + priv->player = g_strdup(player); + if (title != NULL) + priv->title = g_strdup(title); + else + priv->title = g_strdup(player); + priv->filename = g_strdup(filename); + + update_packing (menu_item); + + gtk_widget_add_events (GTK_WIDGET(menu_item), GDK_SCROLL_MASK|GDK_POINTER_MOTION_MASK|GDK_BUTTON_MOTION_MASK); + + gtk_image_set_from_icon_name (GTK_IMAGE (priv->image), icon_name, GTK_ICON_SIZE_LARGE_TOOLBAR); + + return GTK_WIDGET(menu_item); } -static void -gtk_label_set_markup_printf_escaped (GtkLabel *label, - const gchar *format, - ...) + + +GtkWidget* +mpris_menu_item_new_from_player_name (const gchar *player) { - va_list args; - gchar *str; + GtkWidget *widget = NULL; + GKeyFile *key_file; + gchar *file; + gchar *filename; + gchar *full_path; - va_start (args, format); - str = g_markup_vprintf_escaped (format, args); - gtk_label_set_markup (label, str); - va_end (args); + filename = find_desktop_entry (player); + if (filename == NULL) + { + g_free (filename); + return NULL; + } - g_free (str); + file = g_strconcat("applications/", filename, NULL); + g_free (filename); + + key_file = g_key_file_new(); + if (g_key_file_load_from_data_dirs (key_file, file, &full_path, G_KEY_FILE_NONE, NULL)) + { + gchar *name = g_key_file_get_string (key_file, "Desktop Entry", "Name", NULL); + gchar *icon_name = g_key_file_get_string (key_file, "Desktop Entry", "Icon", NULL); + + widget = mpris_menu_item_new_with_player (player, name, icon_name, full_path); + + g_free (name); + g_free (icon_name); + } + + g_key_file_free (key_file); + g_free (file); + + return widget; } -static void -media_notify (MprisMenuItem *item, gchar *message) + + +const gchar * +mpris_menu_item_get_player (MprisMenuItem *item) { - g_signal_emit (item, signals[MEDIA_NOTIFY], 0, message); + MprisMenuItemPrivate *priv; + + g_return_val_if_fail (IS_MPRIS_MENU_ITEM (item), NULL); + + priv = GET_PRIVATE (item); + + return priv->player; } -static void -media_play_pause_clicked_event (GtkButton *button, gpointer user_data) + + +void +mpris_menu_item_set_title (MprisMenuItem *item, + const gchar *title) { - MprisMenuItem *item = user_data; - media_notify (item, "PlayPause"); + MprisMenuItemPrivate *priv; + + g_return_if_fail (IS_MPRIS_MENU_ITEM (item)); + + priv = GET_PRIVATE (item); + + if (title == NULL || *title == '\0') + gtk_label_set_markup_printf_escaped (GTK_LABEL (priv->title_label), "<b>%s</b>", priv->title); + else + gtk_label_set_markup_printf_escaped (GTK_LABEL (priv->title_label), "<b>%s</b>", title); } -static void -media_go_previous_clicked_event (GtkButton *button, gpointer user_data) + + +void +mpris_menu_item_set_artist (MprisMenuItem *item, + const gchar *artist) { - MprisMenuItem *item = user_data; - media_notify (item, "Previous"); + MprisMenuItemPrivate *priv; + + g_return_if_fail (IS_MPRIS_MENU_ITEM (item)); + + priv = GET_PRIVATE (item); + + if (artist == NULL || *artist == '\0') + gtk_label_set_label (GTK_LABEL (priv->artist_label), NULL); + else + gtk_label_set_label (GTK_LABEL (priv->artist_label), artist); } -static void -media_go_next_clicked_event (GtkButton *button, gpointer user_data) + + +void +mpris_menu_item_set_can_go_previous (MprisMenuItem *item, + gboolean enabled) { - MprisMenuItem *item = user_data; - media_notify (item, "Next"); + MprisMenuItemPrivate *priv; + + g_return_if_fail (IS_MPRIS_MENU_ITEM (item)); + + priv = GET_PRIVATE (item); + + priv->can_go_previous = enabled; + + if (priv->is_running) + gtk_widget_set_sensitive (priv->go_previous, priv->can_go_previous); + else + gtk_widget_set_sensitive (priv->go_previous, FALSE); } -static void -mpris_menu_item_raise (MprisMenuItem *item) + + +void +mpris_menu_item_set_can_play (MprisMenuItem *item, + gboolean enabled) { MprisMenuItemPrivate *priv; @@ -170,38 +269,44 @@ mpris_menu_item_raise (MprisMenuItem *item) priv = GET_PRIVATE (item); + priv->can_play = enabled; + if (priv->is_running) - { - if (priv->can_raise) - { - media_notify (item, "Raise"); - } - } + gtk_widget_set_sensitive (priv->play_pause, priv->can_play); + else + gtk_widget_set_sensitive (priv->play_pause, FALSE); } -static void -mpris_menu_item_launch (MprisMenuItem *item) + + +void +mpris_menu_item_set_can_pause (MprisMenuItem *item, + gboolean enabled) { MprisMenuItemPrivate *priv; - GAppInfo *app_info; g_return_if_fail (IS_MPRIS_MENU_ITEM (item)); priv = GET_PRIVATE (item); - if (priv->is_running) - return; + priv->can_pause = enabled; - app_info = (GAppInfo*)g_desktop_app_info_new_from_filename (priv->filename); - if (app_info != NULL) + if (priv->is_running) { - g_app_info_launch (app_info, NULL, NULL, NULL); - g_object_unref (app_info); + if (priv->is_playing) + { + gtk_widget_set_sensitive (priv->play_pause, priv->can_pause); + } } + else + gtk_widget_set_sensitive (priv->play_pause, FALSE); } -static void -mpris_menu_item_raise_or_launch (MprisMenuItem *item) + + +void +mpris_menu_item_set_can_go_next (MprisMenuItem *item, + gboolean enabled) { MprisMenuItemPrivate *priv; @@ -209,120 +314,162 @@ mpris_menu_item_raise_or_launch (MprisMenuItem *item) priv = GET_PRIVATE (item); + priv->can_go_next = enabled; + if (priv->is_running) - mpris_menu_item_raise (item); + gtk_widget_set_sensitive (priv->go_next, priv->can_go_next); else - mpris_menu_item_launch (item); + gtk_widget_set_sensitive (priv->go_next, FALSE); } -static void -menu_item_activate_event (GtkMenuItem *mi, gpointer user_data) -{ - mpris_menu_item_raise_or_launch (MPRIS_MENU_ITEM (mi)); -} -static GtkWidget * -track_info_label_new (void) + +void +mpris_menu_item_set_can_raise (MprisMenuItem *item, + gboolean can_raise) { - GtkWidget *label; + MprisMenuItemPrivate *priv; - label = gtk_label_new (NULL); - gtk_label_set_width_chars (GTK_LABEL (label), 25); - gtk_label_set_max_width_chars (GTK_LABEL (label), 25); - gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE); + g_return_if_fail (IS_MPRIS_MENU_ITEM (item)); - gtk_label_set_xalign (GTK_LABEL (label), 0.0); - gtk_widget_set_halign (label, GTK_ALIGN_START); + priv = GET_PRIVATE (item); - return label; + priv->can_raise = can_raise; } -static void -update_packing (MprisMenuItem *self) + + +void +mpris_menu_item_set_is_running (MprisMenuItem *item, + gboolean running) { MprisMenuItemPrivate *priv; - GtkBox *hbox; - GtkBox *vbox; - GtkBox *button_box; - GtkStyleContext *ctx; - g_return_if_fail (IS_MPRIS_MENU_ITEM (self)); + g_return_if_fail (IS_MPRIS_MENU_ITEM (item)); - priv = GET_PRIVATE (self); + priv = GET_PRIVATE (item); - TRACE("entering"); + priv->is_running = running; - /* Create the widgets */ - hbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0)); - vbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 0)); + if (!priv->is_running) + { + mpris_menu_item_set_title (item, NULL); + mpris_menu_item_set_artist (item, _("Not currently playing")); + mpris_menu_item_set_can_play (item, FALSE); + mpris_menu_item_set_can_pause (item, FALSE); + mpris_menu_item_set_can_go_previous (item, FALSE); + mpris_menu_item_set_can_go_next (item, FALSE); + mpris_menu_item_set_is_playing (item, FALSE); + mpris_menu_item_set_is_stopped (item, TRUE); + } + else + { + mpris_menu_item_set_can_play (item, priv->can_play); + mpris_menu_item_set_can_pause (item, priv->can_pause); + mpris_menu_item_set_can_go_next (item, priv->can_go_next); + mpris_menu_item_set_can_go_previous (item, priv->can_go_previous); + mpris_menu_item_set_is_playing (item, priv->is_playing); + mpris_menu_item_set_is_stopped (item, priv->is_stopped); + } +} - button_box = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0)); - ctx = gtk_widget_get_style_context (GTK_WIDGET (button_box)); - gtk_style_context_add_class (ctx, "linked"); - priv->hbox = GTK_WIDGET(hbox); - priv->vbox = GTK_WIDGET(vbox); - priv->button_box = GTK_WIDGET(button_box); - priv->go_previous = gtk_button_new_from_icon_name ("media-skip-backward-symbolic", GTK_ICON_SIZE_MENU); - priv->play_pause = gtk_button_new_from_icon_name ("media-playback-start-symbolic", GTK_ICON_SIZE_MENU); - priv->go_next = gtk_button_new_from_icon_name ("media-skip-forward-symbolic", GTK_ICON_SIZE_MENU); +void +mpris_menu_item_set_is_playing (MprisMenuItem *item, + gboolean playing) +{ + MprisMenuItemPrivate *priv; - priv->title_label = track_info_label_new (); - priv->artist_label = track_info_label_new (); + g_return_if_fail (IS_MPRIS_MENU_ITEM (item)); - priv->image = gtk_image_new_from_icon_name ("audio-x-generic", GTK_ICON_SIZE_LARGE_TOOLBAR); + priv = GET_PRIVATE (item); - /* Pack the widgets */ -G_GNUC_BEGIN_IGNORE_DEPRECATIONS - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (self), priv->image); -G_GNUC_END_IGNORE_DEPRECATIONS - gtk_image_set_pixel_size (GTK_IMAGE (priv->image), 24); + priv->is_playing = playing; - gtk_box_pack_start (button_box, priv->go_previous, FALSE, FALSE, 0); - gtk_box_pack_start (button_box, priv->play_pause, FALSE, FALSE, 0); - gtk_box_pack_start (button_box, priv->go_next, FALSE, FALSE, 0); + if (priv->is_playing) + { + gtk_image_set_from_icon_name (GTK_IMAGE (gtk_button_get_image (GTK_BUTTON (priv->play_pause))), "media-playback-pause-symbolic", GTK_ICON_SIZE_LARGE_TOOLBAR); + gtk_widget_set_sensitive (priv->play_pause, priv->can_pause); + priv->is_stopped = FALSE; + } + else + { + gtk_image_set_from_icon_name (GTK_IMAGE (gtk_button_get_image (GTK_BUTTON (priv->play_pause))), "media-playback-start-symbolic", GTK_ICON_SIZE_LARGE_TOOLBAR); + gtk_widget_set_sensitive (priv->play_pause, priv->can_play); + } - gtk_box_pack_start (vbox, priv->title_label, FALSE, FALSE, 0); - gtk_box_pack_start (vbox, priv->artist_label, FALSE, FALSE, 0); + if (!priv->is_running) + { + gtk_widget_set_sensitive (priv->play_pause, FALSE); + } +} - gtk_box_pack_start (hbox, GTK_WIDGET (vbox), TRUE, TRUE, 0); - gtk_box_pack_start (hbox, GTK_WIDGET (button_box), FALSE, FALSE, 0); - /* Configure the widgets */ - mpris_menu_item_set_title (self, priv->player); - mpris_menu_item_set_artist (self, _("Not currently playing")); - g_signal_connect (priv->play_pause, "clicked", G_CALLBACK (media_play_pause_clicked_event), self); - g_signal_connect (priv->go_previous, "clicked", G_CALLBACK (media_go_previous_clicked_event), self); - g_signal_connect (priv->go_next, "clicked", G_CALLBACK (media_go_next_clicked_event), self); - g_signal_connect (self, "activate", G_CALLBACK (menu_item_activate_event), self); +void +mpris_menu_item_set_is_stopped (MprisMenuItem *item, + gboolean stopped) +{ + MprisMenuItemPrivate *priv; - /* Keep a reference to each */ - g_object_ref (priv->title_label); - g_object_ref (priv->artist_label); - g_object_ref (priv->button_box); - g_object_ref (priv->vbox); - g_object_ref (priv->hbox); - g_object_ref (priv->go_previous); - g_object_ref (priv->play_pause); - g_object_ref (priv->go_next); - g_object_ref (priv->image); + g_return_if_fail (IS_MPRIS_MENU_ITEM (item)); - /* And finally display them */ - gtk_widget_show_all (priv->button_box); - gtk_widget_show_all (priv->hbox); - gtk_widget_show_all (priv->vbox); + priv = GET_PRIVATE (item); + + priv->is_stopped = stopped; + + if (priv->is_stopped) + { + if (priv->is_playing) + { + mpris_menu_item_set_is_playing (item, FALSE); + } + + mpris_menu_item_set_title (item, NULL); + mpris_menu_item_set_artist (item, _("Not currently playing")); + } +} + + + +/* Private API */ +static void +mpris_menu_item_class_init (MprisMenuItemClass *item_class) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (item_class); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (item_class); + + gobject_class->finalize = mpris_menu_item_finalize; + widget_class->button_press_event = mpris_menu_item_button_press_event; + widget_class->button_release_event = mpris_menu_item_button_release_event; + + /** + * MprisMenuItem::media-notify: + * @menuitem: the #MprisMenuItem for which the value changed + * @value: the mpris signal to emit + * + * Emitted whenever the a media button is clicked. + */ + signals[MEDIA_NOTIFY] = g_signal_new ("media-notify", + TYPE_MPRIS_MENU_ITEM, + G_SIGNAL_RUN_LAST, + 0, NULL, NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, + 1, G_TYPE_STRING); - gtk_container_add (GTK_CONTAINER (self), priv->hbox); + g_type_class_add_private (item_class, sizeof (MprisMenuItemPrivate)); } + + static void -mpris_menu_item_init (MprisMenuItem *self) +mpris_menu_item_init (MprisMenuItem *item) { MprisMenuItemPrivate *priv; - priv = GET_PRIVATE (self); + priv = GET_PRIVATE (item); priv->title_label = NULL; priv->artist_label = NULL; @@ -338,14 +485,16 @@ mpris_menu_item_init (MprisMenuItem *self) priv->filename = NULL; } + + static void mpris_menu_item_finalize (GObject *object) { - MprisMenuItem *self; + MprisMenuItem *item; MprisMenuItemPrivate *priv; - self = MPRIS_MENU_ITEM (object); - priv = GET_PRIVATE (self); + item = MPRIS_MENU_ITEM (object); + priv = GET_PRIVATE (item); if (priv->player) g_free (priv->player); @@ -367,45 +516,104 @@ mpris_menu_item_finalize (GObject *object) (*G_OBJECT_CLASS (mpris_menu_item_parent_class)->finalize) (object); } + + +static void +mpris_menu_item_raise (MprisMenuItem *item) +{ + MprisMenuItemPrivate *priv; + + g_return_if_fail (IS_MPRIS_MENU_ITEM (item)); + + priv = GET_PRIVATE (item); + + if (priv->is_running && priv->can_raise) + media_notify (item, "Raise"); +} + + + +static void +mpris_menu_item_launch (MprisMenuItem *item) +{ + MprisMenuItemPrivate *priv; + GAppInfo *app_info; + + g_return_if_fail (IS_MPRIS_MENU_ITEM (item)); + + priv = GET_PRIVATE (item); + + if (priv->is_running) + return; + + app_info = (GAppInfo*)g_desktop_app_info_new_from_filename (priv->filename); + if (app_info != NULL) + { + g_app_info_launch (app_info, NULL, NULL, NULL); + g_object_unref (app_info); + } +} + + + +static void +mpris_menu_item_raise_or_launch (MprisMenuItem *item) +{ + MprisMenuItemPrivate *priv; + + g_return_if_fail (IS_MPRIS_MENU_ITEM (item)); + + priv = GET_PRIVATE (item); + + if (priv->is_running) + mpris_menu_item_raise (item); + else + mpris_menu_item_launch (item); +} + + + static GtkWidget * -mpris_menu_item_get_widget_at_event (MprisMenuItem *menuitem, +mpris_menu_item_get_widget_at_event (MprisMenuItem *item, GdkEventButton *event) { MprisMenuItemPrivate *priv; GtkAllocation alloc; gint x, y; - g_return_val_if_fail (IS_MPRIS_MENU_ITEM (menuitem), NULL); + g_return_val_if_fail (IS_MPRIS_MENU_ITEM (item), NULL); - priv = GET_PRIVATE (menuitem); + priv = GET_PRIVATE (item); gtk_widget_get_allocation (priv->button_box, &alloc); - gtk_widget_translate_coordinates (GTK_WIDGET (menuitem), priv->button_box, event->x, event->y, &x, &y); + gtk_widget_translate_coordinates (GTK_WIDGET (item), priv->button_box, event->x, event->y, &x, &y); if (x > 0 && x < alloc.width && y > 0 && y < alloc.height) { gtk_widget_get_allocation (priv->go_previous, &alloc); - gtk_widget_translate_coordinates (GTK_WIDGET (menuitem), priv->go_previous, event->x, event->y, &x, &y); + gtk_widget_translate_coordinates (GTK_WIDGET (item), priv->go_previous, event->x, event->y, &x, &y); if (x > 0 && x < alloc.width && y > 0 && y < alloc.height) return GTK_WIDGET (priv->go_previous); gtk_widget_get_allocation (priv->play_pause, &alloc); - gtk_widget_translate_coordinates (GTK_WIDGET (menuitem), priv->play_pause, event->x, event->y, &x, &y); + gtk_widget_translate_coordinates (GTK_WIDGET (item), priv->play_pause, event->x, event->y, &x, &y); if (x > 0 && x < alloc.width && y > 0 && y < alloc.height) return GTK_WIDGET (priv->play_pause); gtk_widget_get_allocation (priv->go_next, &alloc); - gtk_widget_translate_coordinates (GTK_WIDGET (menuitem), priv->go_next, event->x, event->y, &x, &y); + gtk_widget_translate_coordinates (GTK_WIDGET (item), priv->go_next, event->x, event->y, &x, &y); if (x > 0 && x < alloc.width && y > 0 && y < alloc.height) return GTK_WIDGET (priv->go_next); } - return GTK_WIDGET (menuitem); + return GTK_WIDGET (item); } + + static gboolean mpris_menu_item_button_press_event (GtkWidget *menuitem, GdkEventButton *event) @@ -426,6 +634,8 @@ mpris_menu_item_button_press_event (GtkWidget *menuitem, return TRUE; } + + static gboolean mpris_menu_item_button_release_event (GtkWidget *menuitem, GdkEventButton *event) @@ -446,258 +656,169 @@ mpris_menu_item_button_release_event (GtkWidget *menuitem, return TRUE; } -const gchar * -mpris_menu_item_get_player (MprisMenuItem *mi) -{ - MprisMenuItemPrivate *priv; - - g_return_val_if_fail (IS_MPRIS_MENU_ITEM (mi), NULL); - - priv = GET_PRIVATE (mi); - return priv->player; -} -void -mpris_menu_item_set_title (MprisMenuItem *item, - const gchar *title) +static void +media_play_pause_clicked_event (GtkButton *button, gpointer user_data) { - MprisMenuItemPrivate *priv; + MprisMenuItem *item = user_data; + media_notify (item, "PlayPause"); +} - g_return_if_fail (IS_MPRIS_MENU_ITEM (item)); - priv = GET_PRIVATE (item); - if (title == NULL || *title == '\0') - gtk_label_set_markup_printf_escaped (GTK_LABEL (priv->title_label), "<b>%s</b>", priv->title); - else - gtk_label_set_markup_printf_escaped (GTK_LABEL (priv->title_label), "<b>%s</b>", title); +static void +media_go_previous_clicked_event (GtkButton *button, gpointer user_data) +{ + MprisMenuItem *item = user_data; + media_notify (item, "Previous"); } -void -mpris_menu_item_set_artist (MprisMenuItem *item, - const gchar *artist) + + +static void +media_go_next_clicked_event (GtkButton *button, gpointer user_data) { - MprisMenuItemPrivate *priv; + MprisMenuItem *item = user_data; + media_notify (item, "Next"); +} - g_return_if_fail (IS_MPRIS_MENU_ITEM (item)); - priv = GET_PRIVATE (item); - if (artist == NULL || *artist == '\0') - gtk_label_set_label (GTK_LABEL (priv->artist_label), NULL); - else - gtk_label_set_label (GTK_LABEL (priv->artist_label), artist); +static void +menu_item_activate_event (GtkMenuItem *mi, gpointer user_data) +{ + mpris_menu_item_raise_or_launch (MPRIS_MENU_ITEM (mi)); } -void -mpris_menu_item_set_can_go_previous (MprisMenuItem *item, - gboolean enabled) -{ - MprisMenuItemPrivate *priv; - g_return_if_fail (IS_MPRIS_MENU_ITEM (item)); - priv = GET_PRIVATE (item); - - priv->can_go_previous = enabled; - - if (priv->is_running) - gtk_widget_set_sensitive (priv->go_previous, priv->can_go_previous); - else - gtk_widget_set_sensitive (priv->go_previous, FALSE); -} - -void -mpris_menu_item_set_can_play (MprisMenuItem *item, - gboolean enabled) +static void +media_notify (MprisMenuItem *item, + gchar *message) { - MprisMenuItemPrivate *priv; - - g_return_if_fail (IS_MPRIS_MENU_ITEM (item)); - - priv = GET_PRIVATE (item); + g_signal_emit (item, signals[MEDIA_NOTIFY], 0, message); +} - priv->can_play = enabled; - if (priv->is_running) - gtk_widget_set_sensitive (priv->play_pause, priv->can_play); - else - gtk_widget_set_sensitive (priv->play_pause, FALSE); -} -void -mpris_menu_item_set_can_pause (MprisMenuItem *item, - gboolean enabled) +static GtkWidget * +track_info_label_new (void) { - MprisMenuItemPrivate *priv; - - g_return_if_fail (IS_MPRIS_MENU_ITEM (item)); + GtkWidget *label; - priv = GET_PRIVATE (item); + label = gtk_label_new (NULL); + gtk_label_set_width_chars (GTK_LABEL (label), 25); + gtk_label_set_max_width_chars (GTK_LABEL (label), 25); + gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE); - priv->can_pause = enabled; + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_widget_set_halign (label, GTK_ALIGN_START); - if (priv->is_running) - { - if (priv->is_playing) - { - gtk_widget_set_sensitive (priv->play_pause, priv->can_pause); - } - } - else - gtk_widget_set_sensitive (priv->play_pause, FALSE); + return label; } -void -mpris_menu_item_set_can_go_next (MprisMenuItem *item, - gboolean enabled) -{ - MprisMenuItemPrivate *priv; - - g_return_if_fail (IS_MPRIS_MENU_ITEM (item)); - - priv = GET_PRIVATE (item); - - priv->can_go_next = enabled; - if (priv->is_running) - gtk_widget_set_sensitive (priv->go_next, priv->can_go_next); - else - gtk_widget_set_sensitive (priv->go_next, FALSE); -} -void -mpris_menu_item_set_is_playing (MprisMenuItem *item, - gboolean playing) +static void +gtk_label_set_markup_printf_escaped (GtkLabel *label, + const gchar *format, + ...) { - MprisMenuItemPrivate *priv; + va_list args; + gchar *str; - g_return_if_fail (IS_MPRIS_MENU_ITEM (item)); + va_start (args, format); + str = g_markup_vprintf_escaped (format, args); + gtk_label_set_markup (label, str); + va_end (args); - priv = GET_PRIVATE (item); + g_free (str); +} - priv->is_playing = playing; - if (priv->is_playing) - { - gtk_image_set_from_icon_name (GTK_IMAGE (gtk_button_get_image (GTK_BUTTON (priv->play_pause))), "media-playback-pause-symbolic", GTK_ICON_SIZE_LARGE_TOOLBAR); - gtk_widget_set_sensitive (priv->play_pause, priv->can_pause); - priv->is_stopped = FALSE; - } - else - { - gtk_image_set_from_icon_name (GTK_IMAGE (gtk_button_get_image (GTK_BUTTON (priv->play_pause))), "media-playback-start-symbolic", GTK_ICON_SIZE_LARGE_TOOLBAR); - gtk_widget_set_sensitive (priv->play_pause, priv->can_play); - } - if (!priv->is_running) - { - gtk_widget_set_sensitive (priv->play_pause, FALSE); - } -} - -void -mpris_menu_item_set_is_stopped (MprisMenuItem *item, - gboolean stopped) +static void +update_packing (MprisMenuItem *item) { MprisMenuItemPrivate *priv; + GtkBox *hbox; + GtkBox *vbox; + GtkBox *button_box; + GtkStyleContext *ctx; g_return_if_fail (IS_MPRIS_MENU_ITEM (item)); priv = GET_PRIVATE (item); - priv->is_stopped = stopped; - - if (priv->is_stopped) - { - if (priv->is_playing) - { - mpris_menu_item_set_is_playing (item, FALSE); - } - - mpris_menu_item_set_title (item, NULL); - mpris_menu_item_set_artist (item, _("Not currently playing")); - } -} - -void -mpris_menu_item_set_is_running (MprisMenuItem *item, - gboolean running) -{ - MprisMenuItemPrivate *priv; + TRACE("entering"); - g_return_if_fail (IS_MPRIS_MENU_ITEM (item)); + /* Create the widgets */ + hbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0)); + vbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 0)); - priv = GET_PRIVATE (item); + button_box = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0)); + ctx = gtk_widget_get_style_context (GTK_WIDGET (button_box)); + gtk_style_context_add_class (ctx, "linked"); - priv->is_running = running; + priv->hbox = GTK_WIDGET(hbox); + priv->vbox = GTK_WIDGET(vbox); + priv->button_box = GTK_WIDGET(button_box); - if (!priv->is_running) - { - mpris_menu_item_set_title (item, NULL); - mpris_menu_item_set_artist (item, _("Not currently playing")); - mpris_menu_item_set_can_play (item, FALSE); - mpris_menu_item_set_can_pause (item, FALSE); - mpris_menu_item_set_can_go_previous (item, FALSE); - mpris_menu_item_set_can_go_next (item, FALSE); - mpris_menu_item_set_is_playing (item, FALSE); - mpris_menu_item_set_is_stopped (item, TRUE); - } - else - { - mpris_menu_item_set_can_play (item, priv->can_play); - mpris_menu_item_set_can_pause (item, priv->can_pause); - mpris_menu_item_set_can_go_next (item, priv->can_go_next); - mpris_menu_item_set_can_go_previous (item, priv->can_go_previous); - mpris_menu_item_set_is_playing (item, priv->is_playing); - mpris_menu_item_set_is_stopped (item, priv->is_stopped); - } -} + priv->go_previous = gtk_button_new_from_icon_name ("media-skip-backward-symbolic", GTK_ICON_SIZE_MENU); + priv->play_pause = gtk_button_new_from_icon_name ("media-playback-start-symbolic", GTK_ICON_SIZE_MENU); + priv->go_next = gtk_button_new_from_icon_name ("media-skip-forward-symbolic", GTK_ICON_SIZE_MENU); -void -mpris_menu_item_set_can_raise (MprisMenuItem *item, - gboolean can_raise) -{ - MprisMenuItemPrivate *priv; + priv->title_label = track_info_label_new (); + priv->artist_label = track_info_label_new (); - g_return_if_fail (IS_MPRIS_MENU_ITEM (item)); + priv->image = gtk_image_new_from_icon_name ("audio-x-generic", GTK_ICON_SIZE_LARGE_TOOLBAR); - priv = GET_PRIVATE (item); + /* Pack the widgets */ +G_GNUC_BEGIN_IGNORE_DEPRECATIONS + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), priv->image); +G_GNUC_END_IGNORE_DEPRECATIONS + gtk_image_set_pixel_size (GTK_IMAGE (priv->image), 24); - priv->can_raise = can_raise; -} + gtk_box_pack_start (button_box, priv->go_previous, FALSE, FALSE, 0); + gtk_box_pack_start (button_box, priv->play_pause, FALSE, FALSE, 0); + gtk_box_pack_start (button_box, priv->go_next, FALSE, FALSE, 0); -GtkWidget* -mpris_menu_item_new_with_player (const gchar *player, - const gchar *title, - const gchar *icon_name, - const gchar *filename) -{ - MprisMenuItem *menu_item; - MprisMenuItemPrivate *priv; + gtk_box_pack_start (vbox, priv->title_label, FALSE, FALSE, 0); + gtk_box_pack_start (vbox, priv->artist_label, FALSE, FALSE, 0); - TRACE("entering"); + gtk_box_pack_start (hbox, GTK_WIDGET (vbox), TRUE, TRUE, 0); + gtk_box_pack_start (hbox, GTK_WIDGET (button_box), FALSE, FALSE, 0); - menu_item = MPRIS_MENU_ITEM (g_object_new (TYPE_MPRIS_MENU_ITEM, NULL)); + /* Configure the widgets */ + mpris_menu_item_set_title (item, priv->player); + mpris_menu_item_set_artist (item, _("Not currently playing")); - priv = GET_PRIVATE (menu_item); + g_signal_connect (priv->play_pause, "clicked", G_CALLBACK (media_play_pause_clicked_event), item); + g_signal_connect (priv->go_previous, "clicked", G_CALLBACK (media_go_previous_clicked_event), item); + g_signal_connect (priv->go_next, "clicked", G_CALLBACK (media_go_next_clicked_event), item); + g_signal_connect (item, "activate", G_CALLBACK (menu_item_activate_event), item); - priv->player = g_strdup(player); - if (title != NULL) - priv->title = g_strdup(title); - else - priv->title = g_strdup(player); - priv->filename = g_strdup(filename); + /* Keep a reference to each */ + g_object_ref (priv->title_label); + g_object_ref (priv->artist_label); + g_object_ref (priv->button_box); + g_object_ref (priv->vbox); + g_object_ref (priv->hbox); + g_object_ref (priv->go_previous); + g_object_ref (priv->play_pause); + g_object_ref (priv->go_next); + g_object_ref (priv->image); - update_packing (menu_item); + /* And finally display them */ + gtk_widget_show_all (priv->button_box); + gtk_widget_show_all (priv->hbox); + gtk_widget_show_all (priv->vbox); - gtk_widget_add_events (GTK_WIDGET(menu_item), GDK_SCROLL_MASK|GDK_POINTER_MOTION_MASK|GDK_BUTTON_MOTION_MASK); + gtk_container_add (GTK_CONTAINER (item), priv->hbox); +} - gtk_image_set_from_icon_name (GTK_IMAGE (priv->image), icon_name, GTK_ICON_SIZE_LARGE_TOOLBAR); - return GTK_WIDGET(menu_item); -} static gchar * find_desktop_entry (const gchar *player_name) @@ -739,40 +860,3 @@ find_desktop_entry (const gchar *player_name) return filename; } - -GtkWidget* -mpris_menu_item_new_from_player_name (const gchar *player) -{ - GtkWidget *widget = NULL; - GKeyFile *key_file; - gchar *file; - gchar *filename; - gchar *full_path; - - filename = find_desktop_entry (player); - if (filename == NULL) - { - g_free (filename); - return NULL; - } - - file = g_strconcat("applications/", filename, NULL); - g_free (filename); - - key_file = g_key_file_new(); - if (g_key_file_load_from_data_dirs (key_file, file, &full_path, G_KEY_FILE_NONE, NULL)) - { - gchar *name = g_key_file_get_string (key_file, "Desktop Entry", "Name", NULL); - gchar *icon_name = g_key_file_get_string (key_file, "Desktop Entry", "Icon", NULL); - - widget = mpris_menu_item_new_with_player (player, name, icon_name, full_path); - - g_free (name); - g_free (icon_name); - } - - g_key_file_free (key_file); - g_free (file); - - return widget; -} diff --git a/panel-plugin/mprismenuitem.h b/panel-plugin/mprismenuitem.h index 80b1c12..3442f05 100644 --- a/panel-plugin/mprismenuitem.h +++ b/panel-plugin/mprismenuitem.h @@ -66,36 +66,36 @@ GtkWidget *mpris_menu_item_new_with_player (const gchar *player, GtkWidget *mpris_menu_item_new_from_player_name (const gchar *player); -const gchar *mpris_menu_item_get_player (MprisMenuItem *mi); +const gchar *mpris_menu_item_get_player (MprisMenuItem *item); -void mpris_menu_item_set_title (MprisMenuItem *mi, +void mpris_menu_item_set_title (MprisMenuItem *item, const gchar *title); -void mpris_menu_item_set_artist (MprisMenuItem *mi, +void mpris_menu_item_set_artist (MprisMenuItem *item, const gchar *artist); -void mpris_menu_item_set_can_go_previous (MprisMenuItem *mi, +void mpris_menu_item_set_can_go_previous (MprisMenuItem *item, gboolean enabled); -void mpris_menu_item_set_can_play (MprisMenuItem *mi, +void mpris_menu_item_set_can_play (MprisMenuItem *item, gboolean enabled); -void mpris_menu_item_set_can_pause (MprisMenuItem *mi, +void mpris_menu_item_set_can_pause (MprisMenuItem *item, gboolean enabled); -void mpris_menu_item_set_can_go_next (MprisMenuItem *mi, +void mpris_menu_item_set_can_go_next (MprisMenuItem *item, gboolean enabled); -void mpris_menu_item_set_can_raise (MprisMenuItem *mi, +void mpris_menu_item_set_can_raise (MprisMenuItem *item, gboolean can_raise); -void mpris_menu_item_set_is_running (MprisMenuItem *mi, +void mpris_menu_item_set_is_running (MprisMenuItem *item, gboolean running); -void mpris_menu_item_set_is_playing (MprisMenuItem *mi, +void mpris_menu_item_set_is_playing (MprisMenuItem *item, gboolean playing); -void mpris_menu_item_set_is_stopped (MprisMenuItem *mi, +void mpris_menu_item_set_is_stopped (MprisMenuItem *item, gboolean stopped); G_END_DECLS -- To stop receiving notification emails like this one, please contact the administrator of this repository. _______________________________________________ Xfce4-commits mailing list [email protected] https://mail.xfce.org/mailman/listinfo/xfce4-commits
