diff options
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/common-defs.h | 1 | ||||
-rw-r--r-- | src/familiar-players-db.vala | 22 | ||||
-rw-r--r-- | src/metadata-widget.c | 322 | ||||
-rw-r--r-- | src/music-player-bridge.vala | 6 | ||||
-rw-r--r-- | src/player-controller.vala | 17 | ||||
-rw-r--r-- | src/pulse-manager.c | 4 | ||||
-rw-r--r-- | src/title-menu-item.vala | 8 | ||||
-rw-r--r-- | src/title-widget.c | 46 | ||||
-rw-r--r-- | src/title-widget.h | 3 | ||||
-rw-r--r-- | src/transport-widget.c | 18 | ||||
-rw-r--r-- | src/transport-widget.h | 9 | ||||
-rw-r--r-- | vapi/common-defs.vapi | 1 |
13 files changed, 219 insertions, 240 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index b23e9c1..563b755 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -76,6 +76,8 @@ music_bridge_VALAFLAGS = \ --pkg gee-1.0 \ --pkg Indicate-0.2 \ --pkg Dbusmenu-Glib-0.2 \ + --pkg DbusmenuGtk-0.2 \ + --pkg gtk+-2.0 \ --pkg common-defs \ --pkg dbus-glib-1 \ --pkg gio-unix-2.0 \ diff --git a/src/common-defs.h b/src/common-defs.h index e268aaa..27dfd32 100644 --- a/src/common-defs.h +++ b/src/common-defs.h @@ -41,6 +41,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #define DBUSMENU_TITLE_MENUITEM_TYPE "x-canonical-sound-menu-player-title-type" #define DBUSMENU_TITLE_MENUITEM_NAME "x-canonical-sound-menu-player-title-name" +#define DBUSMENU_TITLE_MENUITEM_ICON "x-canonical-sound-menu-player-title-icon" #define DBUSMENU_TITLE_MENUITEM_RUNNING "x-canonical-sound-menu-player-title-running" #define DBUSMENU_SCRUB_MENUITEM_TYPE "x-canonical-sound-menu-player-scrub-type" diff --git a/src/familiar-players-db.vala b/src/familiar-players-db.vala index b8ce91c..af7d07f 100644 --- a/src/familiar-players-db.vala +++ b/src/familiar-players-db.vala @@ -159,5 +159,25 @@ public class FamiliarPlayersDB : GLib.Object { return this.players_DB.keys; } - + + public static string? fetch_icon_name(string desktop_path) + { + KeyFile desktop_keyfile = new KeyFile (); + try{ + desktop_keyfile.load_from_file (desktop_path, KeyFileFlags.NONE); + } + catch(GLib.FileError error){ + warning("Error loading keyfile"); + return null; + } + try{ + return desktop_keyfile.get_string (KeyFileDesktop.GROUP, + KeyFileDesktop.KEY_ICON); + } + catch(GLib.KeyFileError error){ + warning("Error trying to fetch the icon name from the keyfile"); + return null; + } + } + }
\ No newline at end of file diff --git a/src/metadata-widget.c b/src/metadata-widget.c index 0e8aa3b..a1aa860 100644 --- a/src/metadata-widget.c +++ b/src/metadata-widget.c @@ -3,6 +3,7 @@ Copyright 2010 Canonical Ltd. Authors: Conor Curran <conor.curran@canonical.com> + Mirco Müller <mirco.mueller@canonical.com> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License version 3, as published @@ -26,7 +27,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #include "common-defs.h" #include <gtk/gtk.h> #include <glib.h> - +#include "transport-widget.h" typedef struct _MetadataWidgetPrivate MetadataWidgetPrivate; @@ -62,13 +63,14 @@ static void metadata_widget_property_update (DbusmenuMenuitem* item, gchar* property, GValue* value, gpointer userdata); -static void metadata_widget_style_labels(MetadataWidget* self, - GtkLabel* label); -static void image_set_from_pixbuf (GtkWidget *widget, - MetadataWidget* metadata, - GdkPixbuf *source); -static void draw_album_art_placeholder(GtkWidget *metadata); - +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, + guint time, + gpointer user_data); G_DEFINE_TYPE (MetadataWidget, metadata_widget, GTK_TYPE_MENU_ITEM); @@ -99,19 +101,21 @@ metadata_widget_init (MetadataWidget *self) // image priv->album_art = gtk_image_new(); - priv->image_path = g_string_new(dbusmenu_menuitem_property_get(priv->twin_item, DBUSMENU_METADATA_MENUITEM_ARTURL)); + priv->image_path = g_string_new(dbusmenu_menuitem_property_get(priv->twin_item, + DBUSMENU_METADATA_MENUITEM_ARTURL)); priv->old_image_path = g_string_new(""); - //g_debug("Metadata::At startup and image path = %s", priv->image_path->str); g_signal_connect(priv->album_art, "expose-event", G_CALLBACK(metadata_image_expose), GTK_WIDGET(self)); gtk_widget_set_size_request(GTK_WIDGET(priv->album_art), 60, 60); - gtk_box_pack_start (GTK_BOX (priv->hbox), priv->album_art, FALSE, FALSE, 0); - + gtk_box_pack_start (GTK_BOX (priv->hbox), + priv->album_art, + FALSE, + FALSE, + 1); priv->theme_change_occured = FALSE; - GtkWidget* vbox = gtk_vbox_new(FALSE, 0); // artist @@ -130,7 +134,7 @@ metadata_widget_init (MetadataWidget *self) piece = gtk_label_new(dbusmenu_menuitem_property_get( priv->twin_item, DBUSMENU_METADATA_MENUITEM_TITLE) ); gtk_misc_set_alignment(GTK_MISC(piece), (gfloat)0, (gfloat)0); - gtk_misc_set_padding (GTK_MISC(piece), (gfloat)10, (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)); @@ -153,12 +157,13 @@ metadata_widget_init (MetadataWidget *self) gtk_box_pack_start (GTK_BOX (priv->hbox), vbox, FALSE, FALSE, 0); - gtk_widget_show_all (priv->hbox); - - g_signal_connect(self, "style-set", G_CALLBACK(metadata_widget_set_style), GTK_WIDGET(self)); - - gtk_widget_set_size_request(GTK_WIDGET(self), 200, 65); - gtk_container_add (GTK_CONTAINER (self), hbox); + g_signal_connect(self, "style-set", + G_CALLBACK(metadata_widget_set_style), GTK_WIDGET(self)); + g_signal_connect (self, "selection-received", + G_CALLBACK(metadata_widget_selection_received_event_callback), + GTK_WIDGET(self)); + gtk_widget_set_size_request(GTK_WIDGET(self), 200, 75); + gtk_container_add (GTK_CONTAINER (self), hbox); } static void @@ -183,7 +188,8 @@ metadata_image_expose (GtkWidget *metadata, GdkEventExpose *event, gpointer user { g_return_val_if_fail(IS_METADATA_WIDGET(user_data), FALSE); MetadataWidget* widget = METADATA_WIDGET(user_data); - MetadataWidgetPrivate * priv = METADATA_WIDGET_GET_PRIVATE(widget); + MetadataWidgetPrivate * priv = METADATA_WIDGET_GET_PRIVATE(widget); + 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){ @@ -195,12 +201,12 @@ metadata_image_expose (GtkWidget *metadata, GdkEventExpose *event, gpointer user if(GDK_IS_PIXBUF(pixbuf) == FALSE){ //g_debug("problem loading the downloaded image just use the placeholder instead"); draw_album_art_placeholder(metadata); - return TRUE; + return TRUE; } pixbuf = gdk_pixbuf_scale_simple(pixbuf,60, 60, GDK_INTERP_BILINEAR); - image_set_from_pixbuf (metadata, widget, pixbuf); + gtk_image_set_from_pixbuf(GTK_IMAGE(priv->album_art), pixbuf); g_string_erase(priv->old_image_path, 0, -1); - g_string_overwrite(priv->old_image_path, 0, priv->image_path->str); + g_string_overwrite(priv->old_image_path, 0, priv->image_path->str); g_object_unref(pixbuf); } @@ -210,20 +216,19 @@ metadata_image_expose (GtkWidget *metadata, GdkEventExpose *event, gpointer user return TRUE; } + + static void -draw_album_art_placeholder(GtkWidget *metadata) -{ - cairo_t *cr; - cr = gdk_cairo_create (metadata->window); - GtkStyle *style; - style = gtk_widget_get_style (metadata); - - GtkAllocation alloc; - gtk_widget_get_allocation (metadata, &alloc); - - cairo_rectangle (cr, +draw_gradient (cairo_t* cr, + GtkAllocation alloc, + CairoColorRGB rgba_start, + CairoColorRGB rgba_end) +{ + cairo_pattern_t* pattern = NULL; + cairo_rectangle (cr, alloc.x, alloc.y, alloc.width, alloc.height); + cairo_clip(cr); cairo_move_to (cr, alloc.x , alloc.y); @@ -236,17 +241,82 @@ draw_album_art_placeholder(GtkWidget *metadata) cairo_close_path (cr); - cairo_set_source_rgba (cr, - style->fg[0].red/65535.0, - style->fg[0].green/65535.0, - style->fg[0].blue/65535.0, - 0.6); - cairo_set_line_width (cr, 2.0); - - cairo_stroke (cr); + cairo_set_line_width (cr, 3.0); + CairoColorRGB darkened_top_color; + CairoColorRGB light_bottom_color; + + _color_shade (&rgba_start, 0.6, &darkened_top_color); + _color_shade (&rgba_end, 0.7, &light_bottom_color); + + pattern = cairo_pattern_create_linear (alloc.x, + alloc.y, + alloc.x, + alloc.y + alloc.height); + + cairo_pattern_add_color_stop_rgba (pattern, + 0.4f, + darkened_top_color.r, + darkened_top_color.g, + darkened_top_color.b, + 1.0f); + cairo_pattern_add_color_stop_rgba (pattern, + 1.0f, + light_bottom_color.r, + light_bottom_color.g, + light_bottom_color.b, + 1.0f); + cairo_set_source (cr, pattern); + cairo_stroke (cr); + cairo_pattern_destroy (pattern); +} - // Draw the eight note - PangoLayout *layout; +static void +draw_album_border(GtkWidget *metadata, gboolean selected) +{ + cairo_t *cr; + cr = gdk_cairo_create (metadata->window); + GtkStyle *style; + style = gtk_widget_get_style (metadata); + + GtkAllocation alloc; + gtk_widget_get_allocation (metadata, &alloc); + gint offset = 1; + + alloc.width = alloc.width + (offset * 2); + alloc.height = alloc.height + (offset * 2) - 7; + alloc.x = alloc.x - offset; + alloc.y = alloc.y - offset + 3; + + CairoColorRGB bg_normal, fg_normal; + + bg_normal.r = style->bg[0].red/65535.0; + bg_normal.g = style->bg[0].green/65535.0; + bg_normal.b = style->bg[0].blue/65535.0; + + gint state = selected ? 5 : 0; + + fg_normal.r = style->fg[state].red/65535.0; + fg_normal.g = style->fg[state].green/65535.0; + fg_normal.b = style->fg[state].blue/65535.0; + + draw_gradient(cr, + alloc, + bg_normal, + fg_normal); +} + +static void +draw_album_art_placeholder(GtkWidget *metadata) +{ + cairo_t *cr; + cr = gdk_cairo_create (metadata->window); + GtkStyle *style; + style = gtk_widget_get_style (metadata); + + GtkAllocation alloc; + gtk_widget_get_allocation (metadata, &alloc); + + PangoLayout *layout; PangoFontDescription *desc; layout = pango_cairo_create_layout(cr); PangoContext* pcontext = pango_cairo_create_context(cr); @@ -269,7 +339,7 @@ draw_album_art_placeholder(GtkWidget *metadata) 0.8); pango_cairo_update_layout(cr, layout); - cairo_move_to (cr, alloc.x + alloc.width/6, alloc.y); + cairo_move_to (cr, alloc.x + alloc.width/6, alloc.y + alloc.height/8); pango_cairo_show_layout(cr, layout); g_object_unref(layout); @@ -279,6 +349,20 @@ draw_album_art_placeholder(GtkWidget *metadata) } +static void +metadata_widget_selection_received_event_callback ( GtkWidget *widget, + GtkSelectionData *data, + guint time, + 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); + g_debug("metadata_widget_selection_request_event_callback"); + draw_album_border(widget, TRUE); +} + /* Suppress/consume keyevents */ static gboolean metadata_widget_button_press_event (GtkWidget *menuitem, @@ -295,7 +379,6 @@ metadata_widget_button_press_event (GtkWidget *menuitem, DBUSMENU_METADATA_MENUITEM_TITLE), dbusmenu_menuitem_property_get(priv->twin_item, DBUSMENU_METADATA_MENUITEM_ALBUM)); - //g_debug("contents to be copied will be : %s", contents); gtk_clipboard_set_text (board, contents, -1); gtk_clipboard_store (board); g_free(contents); @@ -343,150 +426,6 @@ metadata_widget_property_update(DbusmenuMenuitem* item, gchar* property, } } - -static cairo_surface_t * -surface_from_pixbuf (GdkPixbuf *pixbuf) -{ - cairo_surface_t *surface; - cairo_t *cr; - - surface = cairo_image_surface_create (gdk_pixbuf_get_has_alpha (pixbuf) ? - CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24, - gdk_pixbuf_get_width (pixbuf), - gdk_pixbuf_get_height (pixbuf)); - cr = cairo_create (surface); - gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0); - cairo_paint (cr); - cairo_destroy (cr); - - return surface; -} - -static void -rounded_rectangle (cairo_t *cr, - gdouble aspect, - gdouble x, - gdouble y, - gdouble corner_radius, - gdouble width, - gdouble height) -{ - gdouble radius; - gdouble degrees; - - radius = corner_radius / aspect; - degrees = G_PI / 180.0; - cairo_new_sub_path (cr); - cairo_arc (cr, - x + width - radius, - y + radius, - radius, - -90 * degrees, - 0 * degrees); - cairo_arc (cr, - x + width - radius, - y + height - radius, - radius, - 0 * degrees, - 90 * degrees); - cairo_arc (cr, - x + radius, - y + height - radius, - radius, - 90 * degrees, - 180 * degrees); - cairo_arc (cr, - x + radius, - y + radius, - radius, - 180 * degrees, - 270 * degrees); - - cairo_close_path (cr); -} - -static void -image_set_from_pixbuf (GtkWidget *widget, - MetadataWidget* metadata, - GdkPixbuf *source) -{ - cairo_t *cr; - cairo_t *cr_mask; - cairo_surface_t *surface; - GdkPixmap *pixmap; - GdkPixmap *bitmask; - int w; - int h; - int frame_width; - double radius; - GdkColor color; - double r; - double g; - double b; - - MetadataWidgetPrivate* priv = METADATA_WIDGET_GET_PRIVATE(metadata); - GtkImage* image = GTK_IMAGE(priv->album_art); - frame_width = 3; - - w = gdk_pixbuf_get_width (source) + frame_width * 2; - h = gdk_pixbuf_get_height (source) + frame_width * 2; - - radius = 10; - - pixmap = gdk_pixmap_new (gtk_widget_get_window (widget), w, h, -1); - bitmask = gdk_pixmap_new (gtk_widget_get_window (widget), w, h, 1); - - if (gtk_widget_get_window (widget) == NULL) - return; - - cr = gdk_cairo_create (pixmap); - cr_mask = gdk_cairo_create (bitmask); - - /* setup mask */ - cairo_rectangle (cr_mask, 0, 0, w, h); - cairo_set_operator (cr_mask, CAIRO_OPERATOR_CLEAR); - cairo_fill (cr_mask); - - rounded_rectangle (cr_mask, 1.0, 0.5, 0.5, radius, w - 1, h - 1); - cairo_set_operator (cr_mask, CAIRO_OPERATOR_OVER); - cairo_set_source_rgb (cr_mask, 1, 1, 1); - cairo_fill (cr_mask); - - color = gtk_widget_get_style (GTK_WIDGET (image))->bg [GTK_STATE_NORMAL]; - r = (float)color.red / 65535.0; - g = (float)color.green / 65535.0; - b = (float)color.blue / 65535.0; - - /* set up image */ - cairo_rectangle (cr, 0, 0, w, h); - cairo_set_source_rgb (cr, r, g, b); - cairo_fill (cr); - - rounded_rectangle (cr, - 1.0, - frame_width + 0.5, - frame_width + 0.5, - radius, - w - frame_width * 2 - 1, - h - frame_width * 2 - 1); - cairo_set_source_rgba (cr, 0.5, 0.5, 0.5, 0.3); - cairo_fill_preserve (cr); - - surface = surface_from_pixbuf (source); - cairo_set_source_surface (cr, surface, frame_width, frame_width); - cairo_fill (cr); - - gtk_image_set_from_pixmap (image, pixmap, bitmask); - - cairo_surface_destroy (surface); - - g_object_unref (bitmask); - g_object_unref (pixmap); - - cairo_destroy (cr_mask); - cairo_destroy (cr); -} - static void metadata_widget_style_labels(MetadataWidget* self, GtkLabel* label) { @@ -542,7 +481,6 @@ metadata_widget_set_twin_item(MetadataWidget* self, } } - /** * transport_new: * @returns: a new #MetadataWidget. diff --git a/src/music-player-bridge.vala b/src/music-player-bridge.vala index 4bb0e6b..f13c2f4 100644 --- a/src/music-player-bridge.vala +++ b/src/music-player-bridge.vala @@ -24,7 +24,6 @@ using GLib; public class MusicPlayerBridge : GLib.Object { - private Listener listener; private Dbusmenu.Menuitem root_menu; private HashMap<string, PlayerController> registered_clients; @@ -51,7 +50,7 @@ public class MusicPlayerBridge : GLib.Object DesktopAppInfo info = new DesktopAppInfo.from_filename(app); if(info == null){ - warning("Could not create a desktopappinfo instance from app: %s", app); + warning("Could not create a desktopappinfo instance from app,: %s , moving on to the next client", app); continue; } @@ -60,6 +59,7 @@ public class MusicPlayerBridge : GLib.Object PlayerController ctrl = new PlayerController(this.root_menu, app_info, mpris_key, + playersDB.fetch_icon_name(app), calculate_menu_position(), PlayerController.state.OFFLINE); this.registered_clients.set(mpris_key, ctrl); @@ -105,9 +105,11 @@ public class MusicPlayerBridge : GLib.Object PlayerController ctrl = new PlayerController ( bridge.root_menu, app_info, mpris_key, + playersDB.fetch_icon_name(path), bridge.calculate_menu_position(), PlayerController.state.READY ); bridge.registered_clients.set(mpris_key, ctrl); + debug("successfully created appinfo and instance from path and set it on the respective instance"); } else{ bridge.registered_clients[mpris_key].update_state(PlayerController.state.READY); diff --git a/src/player-controller.vala b/src/player-controller.vala index cc2e4e1..537eccc 100644 --- a/src/player-controller.vala +++ b/src/player-controller.vala @@ -19,6 +19,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. */ using Dbusmenu; +using DbusmenuGtk; using Gee; public class PlayerController : GLib.Object @@ -49,10 +50,12 @@ public class PlayerController : GLib.Object public Mpris2Controller mpris_bridge; public AppInfo? app_info { get; set;} public int menu_offset { get; set;} + public string icon_name { get; set; } public PlayerController(Dbusmenu.Menuitem root, GLib.AppInfo app, string mpris_name, + string icon_name, int offset, state initial_state) { @@ -60,12 +63,13 @@ public class PlayerController : GLib.Object this.app_info = app; this.name = format_player_name(this.app_info.get_name()); this.mpris_name = mpris_name; + this.icon_name = icon_name; this.custom_items = new ArrayList<PlayerItem>(); this.current_state = initial_state; this.menu_offset = offset; construct_widgets(); establish_mpris_connection(); - this.update_layout(); + this.update_layout(); } public void update_state(state new_state) @@ -161,16 +165,6 @@ public class PlayerController : GLib.Object } } - private static string format_client_name(string client_name) - { - string formatted = client_name; - if(formatted.length > 1){ - formatted = client_name.up(1).concat(client_name.slice(1, client_name.length)); - debug("PlayerController->format_client_name - : %s", formatted); - } - return formatted; - } - private static string format_player_name(owned string app_info_name) { string result = app_info_name.down().strip(); @@ -200,4 +194,5 @@ public class PlayerController : GLib.Object this.update_state(state.DISCONNECTED); } } + }
\ No newline at end of file diff --git a/src/pulse-manager.c b/src/pulse-manager.c index 1ff1598..14633fe 100644 --- a/src/pulse-manager.c +++ b/src/pulse-manager.c @@ -534,10 +534,10 @@ static void context_state_callback(pa_context *c, void *userdata) { switch (pa_context_get_state(c)) { case PA_CONTEXT_UNCONNECTED: - /* g_debug("unconnected");*/ + g_debug("unconnected"); break; case PA_CONTEXT_CONNECTING: - /* g_debug("connecting - waiting for the server to become available");*/ + g_debug("connecting - waiting for the server to become available"); break; case PA_CONTEXT_AUTHORIZING: /* g_debug("authorizing");*/ diff --git a/src/title-menu-item.vala b/src/title-menu-item.vala index bb3d103..64ddebf 100644 --- a/src/title-menu-item.vala +++ b/src/title-menu-item.vala @@ -27,7 +27,9 @@ public class TitleMenuitem : PlayerItem { Object(item_type: MENUITEM_TYPE, owner: parent); this.property_set(MENUITEM_NAME, parent.name); - this.property_set_bool(MENUITEM_RUNNING, false); + debug("title init - icon name = %s", parent.icon_name); + this.property_set(MENUITEM_ICON, parent.icon_name); + this.property_set_bool(MENUITEM_RUNNING, false); } public override void handle_event(string name, GLib.Value input_value, uint timestamp) @@ -50,6 +52,8 @@ public class TitleMenuitem : PlayerItem { HashSet<string> attrs = new HashSet<string>(); attrs.add(MENUITEM_NAME); - return attrs; + attrs.add(MENUITEM_RUNNING); + attrs.add(MENUITEM_ICON); + return attrs; } }
\ No newline at end of file diff --git a/src/title-widget.c b/src/title-widget.c index 3003e10..5bc2a93 100644 --- a/src/title-widget.c +++ b/src/title-widget.c @@ -58,43 +58,50 @@ static gboolean title_widget_triangle_draw_cb (GtkWidget *widget, G_DEFINE_TYPE (TitleWidget, title_widget, GTK_TYPE_IMAGE_MENU_ITEM); - - static void title_widget_class_init (TitleWidgetClass *klass) { - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - widget_class->button_press_event = title_widget_button_press_event; + widget_class->button_press_event = title_widget_button_press_event; - g_type_class_add_private (klass, sizeof (TitleWidgetPrivate)); + g_type_class_add_private (klass, sizeof (TitleWidgetPrivate)); - gobject_class->dispose = title_widget_dispose; - gobject_class->finalize = title_widget_finalize; + gobject_class->dispose = title_widget_dispose; + gobject_class->finalize = title_widget_finalize; } static void title_widget_init (TitleWidget *self) { //g_debug("TitleWidget::title_widget_init"); +} + +static void +title_widget_set_icon(TitleWidget *self) +{ + TitleWidgetPrivate *priv = TITLE_WIDGET_GET_PRIVATE(self); - gint padding = 0; + gchar* icon_name = g_strdup(dbusmenu_menuitem_property_get(priv->twin_item, + DBUSMENU_TITLE_MENUITEM_ICON)); + gint padding = 0; gtk_widget_style_get(GTK_WIDGET(self), "horizontal-padding", &padding, NULL); gint width, height; gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &width, &height); - GtkWidget * icon = gtk_image_new_from_icon_name("sound-icon", GTK_ICON_SIZE_MENU); + GtkWidget * icon = gtk_image_new_from_icon_name(icon_name, + GTK_ICON_SIZE_MENU); gtk_widget_set_size_request(icon, width + 5 /* ref triangle is 5x9 pixels */ + 1 /* padding */, height); gtk_misc_set_alignment(GTK_MISC(icon), 0.5 /* right aligned */, 0); - gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(self), GTK_WIDGET(icon)); - gtk_widget_show(icon); - + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(self), GTK_WIDGET(icon)); + gtk_widget_show(icon); + g_free(icon_name); } static void @@ -132,11 +139,19 @@ title_widget_property_update(DbusmenuMenuitem* item, gchar* property, { g_return_if_fail (IS_TITLE_WIDGET (userdata)); TitleWidget* mitem = TITLE_WIDGET(userdata); - + g_debug("PROPERTY UPDATE FOR THE TITLE"); if(g_ascii_strcasecmp(DBUSMENU_TITLE_MENUITEM_NAME, property) == 0){ gtk_menu_item_set_label (GTK_MENU_ITEM(mitem), g_value_get_string(value)); } + else if(g_ascii_strcasecmp(DBUSMENU_TITLE_MENUITEM_ICON, property) == 0){ + g_debug("changing the icon data on the title - %s", + g_value_get_string(value)); + GtkWidget * icon = gtk_image_new_from_icon_name(g_value_get_string(value), + GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mitem), GTK_WIDGET(icon)); + + } } static void @@ -159,6 +174,7 @@ title_widget_set_twin_item(TitleWidget* self, gtk_menu_item_set_label (GTK_MENU_ITEM(self), dbusmenu_menuitem_property_get(priv->twin_item, DBUSMENU_TITLE_MENUITEM_NAME)); + title_widget_set_icon(self); } static gboolean @@ -217,7 +233,7 @@ title_widget_new(DbusmenuMenuitem *item) { GtkWidget* widget = g_object_new (TITLE_WIDGET_TYPE, NULL); - gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (widget), TRUE); + gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (widget), TRUE); title_widget_set_twin_item((TitleWidget*)widget, item); return widget; diff --git a/src/title-widget.h b/src/title-widget.h index 574a2b1..029aba4 100644 --- a/src/title-widget.h +++ b/src/title-widget.h @@ -20,7 +20,8 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #define __TITLE_WIDGET_H__ #include <gtk/gtkimagemenuitem.h> -#include <libdbusmenu-gtk/menuitem.h> +#include <libdbusmenu-glib/menuitem.h> + G_BEGIN_DECLS diff --git a/src/transport-widget.c b/src/transport-widget.c index 7ada71a..26b7a98 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -69,7 +69,6 @@ Uses code from ctk #define INNER_COMPRESSED_START_SHADE 0.95 #define INNER_COMPRESSED_END_SHADE 1.05 - typedef struct _TransportWidgetPrivate TransportWidgetPrivate; struct _TransportWidgetPrivate @@ -80,14 +79,6 @@ struct _TransportWidgetPrivate DbusmenuMenuitem* twin_item; }; -typedef struct -{ - double r; - double g; - double b; -} CairoColorRGB; - - #define TRANSPORT_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRANSPORT_WIDGET_TYPE, TransportWidgetPrivate)) /* Gobject boiler plate */ @@ -117,7 +108,6 @@ static void transport_widget_menu_hidden ( GtkWidget *menu, static void transport_widget_notify ( GObject *item, GParamSpec *pspec, gpointer user_data ); - static TransportWidgetEvent transport_widget_determine_button_event ( TransportWidget* button, GdkEventButton* event); static void transport_widget_react_to_button_release ( TransportWidget* button, @@ -159,8 +149,8 @@ transport_widget_init (TransportWidget *self) previous_list = g_list_insert(previous_list, GINT_TO_POINTER(60), 2); previous_list = g_list_insert(previous_list, GINT_TO_POINTER(34), 3); g_hash_table_insert(priv->command_coordinates, - GINT_TO_POINTER(TRANSPORT_PREVIOUS), - previous_list); + GINT_TO_POINTER(TRANSPORT_PREVIOUS), + previous_list); GList* play_list = NULL; play_list = g_list_insert(play_list, GINT_TO_POINTER(58), 0); @@ -182,7 +172,7 @@ transport_widget_init (TransportWidget *self) GINT_TO_POINTER(TRANSPORT_NEXT), next_list); - gtk_widget_set_size_request(GTK_WIDGET(self), 200, 50); + gtk_widget_set_size_request(GTK_WIDGET(self), 200, 43); g_signal_connect (G_OBJECT(self), "notify", G_CALLBACK (transport_widget_notify), @@ -742,7 +732,7 @@ _color_hls_to_rgb (gdouble *h, } } -static void +void _color_shade (const CairoColorRGB *a, float k, CairoColorRGB *b) { double red; diff --git a/src/transport-widget.h b/src/transport-widget.h index 337ccdf..6ccce05 100644 --- a/src/transport-widget.h +++ b/src/transport-widget.h @@ -55,6 +55,15 @@ struct _TransportWidget { GtkMenuItem parent; }; +typedef struct +{ + double r; + double g; + double b; +} CairoColorRGB; + + +void _color_shade (const CairoColorRGB *a, float k, CairoColorRGB *b); GType transport_widget_get_type (void); GtkWidget* transport_widget_new ( DbusmenuMenuitem *item ); diff --git a/vapi/common-defs.vapi b/vapi/common-defs.vapi index 9d49a92..6938420 100644 --- a/vapi/common-defs.vapi +++ b/vapi/common-defs.vapi @@ -36,6 +36,7 @@ namespace DbusmenuTransport{ namespace DbusmenuTitle{ public const string MENUITEM_TYPE; public const string MENUITEM_NAME; + public const string MENUITEM_ICON; public const string MENUITEM_RUNNING; } |