aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Makefile.am2
-rw-r--r--src/common-defs.h1
-rw-r--r--src/familiar-players-db.vala22
-rw-r--r--src/metadata-widget.c322
-rw-r--r--src/music-player-bridge.vala6
-rw-r--r--src/player-controller.vala17
-rw-r--r--src/pulse-manager.c4
-rw-r--r--src/title-menu-item.vala8
-rw-r--r--src/title-widget.c46
-rw-r--r--src/title-widget.h3
-rw-r--r--src/transport-widget.c18
-rw-r--r--src/transport-widget.h9
-rw-r--r--vapi/common-defs.vapi1
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;
}