From 5a419e83132124e99b2112a6533ab018297bc19c Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 13 Oct 2010 16:05:51 +0100 Subject: basic border around album art instead of rounded corners - boo --- src/metadata-widget.c | 126 +++++++++++++------------------------------------- src/title-widget.c | 18 ++++---- 2 files changed, 39 insertions(+), 105 deletions(-) diff --git a/src/metadata-widget.c b/src/metadata-widget.c index cbbaeff..fd36c01 100644 --- a/src/metadata-widget.c +++ b/src/metadata-widget.c @@ -62,12 +62,10 @@ 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); G_DEFINE_TYPE (MetadataWidget, metadata_widget, GTK_TYPE_MENU_ITEM); @@ -183,7 +181,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); if(priv->image_path->len > 0){ if(g_string_equal(priv->image_path, priv->old_image_path) == FALSE || priv->theme_change_occured == TRUE){ @@ -196,9 +195,9 @@ metadata_image_expose (GtkWidget *metadata, GdkEventExpose *event, gpointer user //g_debug("problem loading the downloaded image just use the placeholder instead"); draw_album_art_placeholder(metadata); 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); @@ -211,8 +210,8 @@ metadata_image_expose (GtkWidget *metadata, GdkEventExpose *event, gpointer user } static void -draw_album_art_placeholder(GtkWidget *metadata) -{ +draw_album_border(GtkWidget *metadata) +{ cairo_t *cr; cr = gdk_cairo_create (metadata->window); GtkStyle *style; @@ -220,7 +219,13 @@ draw_album_art_placeholder(GtkWidget *metadata) GtkAllocation alloc; gtk_widget_get_allocation (metadata, &alloc); - + gint offset = 2; + + alloc.width = alloc.width + (offset * 2); + alloc.height = alloc.height + (offset * 2); + alloc.x = alloc.x - offset; + alloc.y = alloc.y - offset; + cairo_rectangle (cr, alloc.x, alloc.y, alloc.width, alloc.height); @@ -234,6 +239,7 @@ draw_album_art_placeholder(GtkWidget *metadata) cairo_line_to(cr, alloc.x, alloc.y + alloc.height); cairo_line_to(cr, alloc.x, alloc.y); + cairo_close_path (cr); cairo_set_source_rgba (cr, @@ -243,8 +249,20 @@ draw_album_art_placeholder(GtkWidget *metadata) 0.6); cairo_set_line_width (cr, 2.0); - cairo_stroke (cr); + cairo_stroke (cr); +} +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); + // Draw the eight note PangoLayout *layout; PangoFontDescription *desc; @@ -405,87 +423,6 @@ rounded_rectangle (cairo_t *cr, 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) @@ -517,7 +454,6 @@ metadata_widget_set_twin_item(MetadataWidget* self, G_CALLBACK(metadata_widget_property_update), self); } - /** * transport_new: * @returns: a new #MetadataWidget. diff --git a/src/title-widget.c b/src/title-widget.c index 3003e10..5e86b4d 100644 --- a/src/title-widget.c +++ b/src/title-widget.c @@ -58,20 +58,18 @@ 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 @@ -92,7 +90,7 @@ title_widget_init (TitleWidget *self) + 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_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(self), GTK_WIDGET(icon)); gtk_widget_show(icon); } @@ -217,7 +215,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; -- cgit v1.2.3 From 000862e2eae0d894e1f81df6b13c14d19f407d48 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 13 Oct 2010 17:06:45 +0100 Subject: space for icon path in config --- src/common-defs.h | 1 + src/transport-widget.c | 18 +++++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) 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 . #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/transport-widget.c b/src/transport-widget.c index e7f0b4d..1f023a9 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -135,12 +135,12 @@ transport_widget_class_init (TransportWidgetClass *klass) g_type_class_add_private (klass, sizeof (TransportWidgetPrivate)); - widget_class->button_press_event = transport_widget_button_press_event; - widget_class->button_release_event = transport_widget_button_release_event; + widget_class->button_press_event = transport_widget_button_press_event; + widget_class->button_release_event = transport_widget_button_release_event; widget_class->expose_event = transport_widget_expose; gobject_class->dispose = transport_widget_dispose; - gobject_class->finalize = transport_widget_finalize; + gobject_class->finalize = transport_widget_finalize; } static void @@ -158,7 +158,7 @@ transport_widget_init (TransportWidget *self) previous_list = g_list_insert(previous_list, GINT_TO_POINTER(5), 1); 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, + g_hash_table_insert(priv->command_coordinates, GINT_TO_POINTER(TRANSPORT_PREVIOUS), previous_list); @@ -182,11 +182,11 @@ transport_widget_init (TransportWidget *self) GINT_TO_POINTER(TRANSPORT_NEXT), next_list); - gtk_widget_set_size_request(GTK_WIDGET(self), 200, 50); - g_signal_connect (G_OBJECT(self), - "notify::parent", - G_CALLBACK (transport_widget_notify), - NULL); + gtk_widget_set_size_request(GTK_WIDGET(self), 200, 43); + g_signal_connect (G_OBJECT(self), + "notify::parent", + G_CALLBACK (transport_widget_notify), + NULL); } static void -- cgit v1.2.3 From e2792ab0a1dfd8ca0c96b59b675fa09e8cd0e5d7 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 14 Oct 2010 17:58:42 +0100 Subject: moving towards getting the icon across the divide --- src/Makefile.am | 2 ++ src/music-player-bridge.vala | 14 ++++++++++++-- src/player-controller.vala | 16 ++++++++++++++++ src/sound-service.c | 4 ++-- src/title-widget.c | 3 +++ src/title-widget.h | 2 ++ 6 files changed, 37 insertions(+), 4 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/music-player-bridge.vala b/src/music-player-bridge.vala index 9ba4ef6..e109dec 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 registered_clients; @@ -61,8 +60,12 @@ public class MusicPlayerBridge : GLib.Object calculate_menu_position(), PlayerController.state.OFFLINE); ctrl.app_info = app_info; - if(ctrl.app_info == null) + if(ctrl.app_info == null){ warning("for some reason the app info is null"); + } + else{ + ctrl.set_icon_path(); + } this.registered_clients.set(determine_key(app), ctrl); } } @@ -102,6 +105,13 @@ public class MusicPlayerBridge : GLib.Object bridge.calculate_menu_position(), PlayerController.state.READY); ctrl.set("app_info", app_info); + if(ctrl.app_info == null){ + warning("for some reason the app info is null"); + } + else{ + ctrl.set_icon_path(); + } + bridge.registered_clients.set(determine_key(path), ctrl); debug("successfully created appinfo and instance from path and set it on the respective instance"); } diff --git a/src/player-controller.vala b/src/player-controller.vala index d5b79e7..4b5144a 100644 --- a/src/player-controller.vala +++ b/src/player-controller.vala @@ -19,6 +19,7 @@ with this program. If not, see . */ using Dbusmenu; +using DbusmenuGtk; using Gee; public class PlayerController : GLib.Object @@ -62,6 +63,7 @@ public class PlayerController : GLib.Object construct_widgets(); establish_mpris_connection(); this.update_layout(); + } public void update_state(state new_state) @@ -167,6 +169,20 @@ public class PlayerController : GLib.Object return formatted; } + public void set_icon_path() + { + if(this.app_info != null){ + /*Gtk.IconTheme icon_t = Gtk.IconTheme.get_default(); + Gtk.IconInfo iconInfo = icon_t.lookup_icon(app_info.get_icon(), + getIconSize(), + Gtk.ICON_LOOKUP_USE_BUILTIN);*/ + //return iconInfo.load_icon(); + dbusmenu_menuitem_property_set_image(this.custom_items[widget_order.TITLE], + MENUITEM_PROP_ICON_DATA, + app_info.get_icon()); + } + } + // Temporarily we will need to handle to different mpris implemenations // Do it for now - a couple of weeks should see this messy carry on out of // the codebase. diff --git a/src/sound-service.c b/src/sound-service.c index f19379d..51f5f37 100644 --- a/src/sound-service.c +++ b/src/sound-service.c @@ -41,8 +41,8 @@ service_shutdown (IndicatorService *service, gpointer user_data) if (mainloop != NULL) { g_debug("Service shutdown !"); //TODO: uncomment for release !! - close_pulse_activites(); - g_main_loop_quit(mainloop); + //close_pulse_activites(); + //g_main_loop_quit(mainloop); } return; } diff --git a/src/title-widget.c b/src/title-widget.c index 5e86b4d..d9faa57 100644 --- a/src/title-widget.c +++ b/src/title-widget.c @@ -135,6 +135,9 @@ title_widget_property_update(DbusmenuMenuitem* item, gchar* property, gtk_menu_item_set_label (GTK_MENU_ITEM(mitem), g_value_get_string(value)); } + /*else(g_ascii_strcasecmp(DBUSMENU_MENUITEM_PROP_ICON_DATA, property) == 0){ + g_debug("changing the icon data on the title"); + }*/ } static void diff --git a/src/title-widget.h b/src/title-widget.h index 574a2b1..1e25775 100644 --- a/src/title-widget.h +++ b/src/title-widget.h @@ -21,6 +21,8 @@ with this program. If not, see . #include #include +#include + G_BEGIN_DECLS -- cgit v1.2.3 From 2d40c713f6d5fab70c952e757d0690c7dad63d2d Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Fri, 15 Oct 2010 13:59:45 +0100 Subject: updates done for now --- src/familiar-players-db.vala | 22 +++++++++++++++++++++- src/music-player-bridge.vala | 36 +++++------------------------------- src/player-controller.vala | 39 +++++++++++++++++++++------------------ src/title-menu-item.vala | 8 ++++++-- src/title-widget.c | 30 ++++++++++++++++++++++-------- src/title-widget.h | 1 - vapi/common-defs.vapi | 1 + 7 files changed, 76 insertions(+), 61 deletions(-) diff --git a/src/familiar-players-db.vala b/src/familiar-players-db.vala index 894447c..76cc2f1 100644 --- a/src/familiar-players-db.vala +++ b/src/familiar-players-db.vala @@ -153,5 +153,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/music-player-bridge.vala b/src/music-player-bridge.vala index e109dec..9ab1b3c 100644 --- a/src/music-player-bridge.vala +++ b/src/music-player-bridge.vala @@ -56,17 +56,12 @@ public class MusicPlayerBridge : GLib.Object GLib.AppInfo app_info = info as GLib.AppInfo; PlayerController ctrl = new PlayerController(this.root_menu, - truncate_player_name(app_info.get_name()), + app_info, + playersDB.fetch_icon_name(app), calculate_menu_position(), PlayerController.state.OFFLINE); ctrl.app_info = app_info; - if(ctrl.app_info == null){ - warning("for some reason the app info is null"); - } - else{ - ctrl.set_icon_path(); - } - this.registered_clients.set(determine_key(app), ctrl); + this.registered_clients.set(determine_key(app), ctrl); } } @@ -96,22 +91,14 @@ public class MusicPlayerBridge : GLib.Object { MusicPlayerBridge bridge = data as MusicPlayerBridge; AppInfo? app_info = create_app_info(path); - var name = truncate_player_name(app_info.get_name()); if(path.contains("/") && bridge.playersDB.already_familiar(path) == false){ debug("About to store desktop file path: %s", path); bridge.playersDB.insert(path); PlayerController ctrl = new PlayerController(bridge.root_menu, - name, + app_info, + playersDB.fetch_icon_name(path), bridge.calculate_menu_position(), PlayerController.state.READY); - ctrl.set("app_info", app_info); - if(ctrl.app_info == null){ - warning("for some reason the app info is null"); - } - else{ - ctrl.set_icon_path(); - } - bridge.registered_clients.set(determine_key(path), ctrl); debug("successfully created appinfo and instance from path and set it on the respective instance"); } @@ -163,19 +150,6 @@ public class MusicPlayerBridge : GLib.Object return app_info; } - private static string truncate_player_name(owned string app_info_name) - { - string result = app_info_name.down().strip(); - - var tokens = result.split(" "); - - if(tokens.length > 1){ - result = tokens[0]; - } - debug("truncate player name %s", result); - return result; - } - private static string? determine_key(owned string path) { var tokens = path.split("/"); diff --git a/src/player-controller.vala b/src/player-controller.vala index 4b5144a..06a5b4e 100644 --- a/src/player-controller.vala +++ b/src/player-controller.vala @@ -49,21 +49,24 @@ 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, - string client_name, + AppInfo app_info, + string icon_name, int offset, state initial_state) { this.root_menu = root; - this.name = format_client_name(client_name.strip()); + this.app_info = app_info; + this.icon_name = icon_name; + this.name = format_client_name(truncate_player_name(app_info.get_name())); this.custom_items = new ArrayList(); 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) @@ -168,20 +171,6 @@ public class PlayerController : GLib.Object } return formatted; } - - public void set_icon_path() - { - if(this.app_info != null){ - /*Gtk.IconTheme icon_t = Gtk.IconTheme.get_default(); - Gtk.IconInfo iconInfo = icon_t.lookup_icon(app_info.get_icon(), - getIconSize(), - Gtk.ICON_LOOKUP_USE_BUILTIN);*/ - //return iconInfo.load_icon(); - dbusmenu_menuitem_property_set_image(this.custom_items[widget_order.TITLE], - MENUITEM_PROP_ICON_DATA, - app_info.get_icon()); - } - } // Temporarily we will need to handle to different mpris implemenations // Do it for now - a couple of weeks should see this messy carry on out of @@ -199,4 +188,18 @@ public class PlayerController : GLib.Object this.update_state(state.DISCONNECTED); } } + + private static string truncate_player_name(owned string app_info_name) + { + string result = app_info_name.down().strip(); + + var tokens = result.split(" "); + + if(tokens.length > 1){ + result = tokens[0]; + } + debug("truncate player name %s", result); + return result; + } + } \ No newline at end of file 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 attrs = new HashSet(); 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 d9faa57..344d0a7 100644 --- a/src/title-widget.c +++ b/src/title-widget.c @@ -76,14 +76,23 @@ 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 = 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 */ @@ -91,8 +100,7 @@ title_widget_init (TitleWidget *self) 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_widget_show(icon); } static void @@ -130,14 +138,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(g_ascii_strcasecmp(DBUSMENU_MENUITEM_PROP_ICON_DATA, property) == 0){ - g_debug("changing the icon data on the title"); - }*/ + 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 @@ -160,6 +173,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 diff --git a/src/title-widget.h b/src/title-widget.h index 1e25775..029aba4 100644 --- a/src/title-widget.h +++ b/src/title-widget.h @@ -20,7 +20,6 @@ with this program. If not, see . #define __TITLE_WIDGET_H__ #include -#include #include 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; } -- cgit v1.2.3 From 65eeb5213f9c74b33595f085d20b5d14e7b8026b Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Fri, 22 Oct 2010 11:08:17 -0400 Subject: push new background work --- src/metadata-widget.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++---- src/transport-widget.c | 12 +------- src/transport-widget.h | 9 ++++++ 3 files changed, 88 insertions(+), 17 deletions(-) diff --git a/src/metadata-widget.c b/src/metadata-widget.c index fd36c01..52716ae 100644 --- a/src/metadata-widget.c +++ b/src/metadata-widget.c @@ -3,6 +3,7 @@ Copyright 2010 Canonical Ltd. Authors: Conor Curran + Mirco Müller 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 . #include "common-defs.h" #include #include - +#include "transport-widget.h" typedef struct _MetadataWidgetPrivate MetadataWidgetPrivate; @@ -41,6 +42,7 @@ struct _MetadataWidgetPrivate GtkWidget* piece_label; GtkWidget* container_label; DbusmenuMenuitem* twin_item; + gint artwork_offset; }; #define METADATA_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), METADATA_WIDGET_TYPE, MetadataWidgetPrivate)) @@ -99,6 +101,7 @@ metadata_widget_init (MetadataWidget *self) priv->album_art = gtk_image_new(); priv->image_path = g_string_new(dbusmenu_menuitem_property_get(priv->twin_item, DBUSMENU_METADATA_MENUITEM_ARTURL)); priv->old_image_path = g_string_new(""); + priv->artwork_offset = 2; //g_debug("Metadata::At startup and image path = %s", priv->image_path->str); g_signal_connect(priv->album_art, "expose-event", @@ -106,7 +109,11 @@ metadata_widget_init (MetadataWidget *self) 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, + priv->artwork_offset * 2); priv->theme_change_occured = FALSE; @@ -156,7 +163,7 @@ metadata_widget_init (MetadataWidget *self) 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); + gtk_container_add (GTK_CONTAINER (self), hbox); } static void @@ -209,6 +216,56 @@ metadata_image_expose (GtkWidget *metadata, GdkEventExpose *event, gpointer user return TRUE; } + +static void +draw_gradient (cairo_t* cr, + GtkAllocation alloc, + double* rgba_start, + double* 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); + cairo_line_to(cr, alloc.x + alloc.width, + alloc.y); + cairo_line_to(cr, alloc.x + alloc.width, + alloc.y + alloc.height); + cairo_line_to(cr, alloc.x, alloc.y + alloc.height); + cairo_line_to(cr, alloc.x, alloc.y); + + cairo_close_path (cr); + + cairo_set_line_width (cr, 3.0); + CairoColorRGB darkened_top_color; + + _color_shade (&rgba_end, 0.8, &color_button[2]); + + pattern = cairo_pattern_create_linear (alloc.x, + alloc.y, + alloc.x, + alloc.y + alloc.height); + cairo_pattern_add_color_stop_rgba (pattern, + 0.0f, + rgba_start[0], + rgba_start[1], + rgba_start[2], + rgba_start[3]); + cairo_pattern_add_color_stop_rgba (pattern, + 1.0f, + rgba_end[0], + rgba_end[1], + rgba_end[2], + rgba_end[3]); + cairo_set_source (cr, pattern); + cairo_stroke (cr); + cairo_pattern_destroy (pattern); +} + static void draw_album_border(GtkWidget *metadata) { @@ -225,8 +282,23 @@ draw_album_border(GtkWidget *metadata) alloc.height = alloc.height + (offset * 2); alloc.x = alloc.x - offset; alloc.y = alloc.y - offset; - - cairo_rectangle (cr, + + double start_colour[] = { style->bg[0].red/65535.0, + style->bg[0].green/65535.0, + style->bg[0].blue/65535.0, + 1.0f }; + + double end_colour[] = { style->fg[0].red/65535.0, + style->fg[0].green/65535.0, + style->fg[0].blue/65535.0, + 1.0f}; + + draw_gradient(cr, + alloc, + start_colour, + end_colour); + + /*cairo_rectangle (cr, alloc.x, alloc.y, alloc.width, alloc.height); cairo_clip(cr); @@ -249,7 +321,7 @@ draw_album_border(GtkWidget *metadata) 0.6); cairo_set_line_width (cr, 2.0); - cairo_stroke (cr); + cairo_stroke (cr);*/ } static void diff --git a/src/transport-widget.c b/src/transport-widget.c index 1f023a9..ad044da 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 ( TransportWidget *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, @@ -743,7 +733,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 ); -- cgit v1.2.3 From 79ecf263348fa4da51d3ac014f8cf796a520de06 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Fri, 22 Oct 2010 16:09:55 -0400 Subject: metadata album art border done --- src/metadata-widget.c | 169 ++++++++++++-------------------------------------- 1 file changed, 40 insertions(+), 129 deletions(-) diff --git a/src/metadata-widget.c b/src/metadata-widget.c index 52716ae..911b35a 100644 --- a/src/metadata-widget.c +++ b/src/metadata-widget.c @@ -42,7 +42,6 @@ struct _MetadataWidgetPrivate GtkWidget* piece_label; GtkWidget* container_label; DbusmenuMenuitem* twin_item; - gint artwork_offset; }; #define METADATA_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), METADATA_WIDGET_TYPE, MetadataWidgetPrivate)) @@ -99,10 +98,9 @@ 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(""); - priv->artwork_offset = 2; - //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), @@ -113,10 +111,8 @@ metadata_widget_init (MetadataWidget *self) priv->album_art, FALSE, FALSE, - priv->artwork_offset * 2); - + 1); priv->theme_change_occured = FALSE; - GtkWidget* vbox = gtk_vbox_new(FALSE, 0); // artist @@ -135,7 +131,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)); @@ -158,11 +154,9 @@ 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_widget_set_size_request(GTK_WIDGET(self), 200, 75); gtk_container_add (GTK_CONTAINER (self), hbox); } @@ -201,12 +195,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); 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); } @@ -220,8 +214,8 @@ metadata_image_expose (GtkWidget *metadata, GdkEventExpose *event, gpointer user static void draw_gradient (cairo_t* cr, GtkAllocation alloc, - double* rgba_start, - double* rgba_end) + CairoColorRGB rgba_start, + CairoColorRGB rgba_end) { cairo_pattern_t* pattern = NULL; cairo_rectangle (cr, @@ -242,25 +236,28 @@ draw_gradient (cairo_t* cr, cairo_set_line_width (cr, 3.0); CairoColorRGB darkened_top_color; + CairoColorRGB light_bottom_color; - _color_shade (&rgba_end, 0.8, &color_button[2]); + _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.0f, - rgba_start[0], - rgba_start[1], - rgba_start[2], - rgba_start[3]); + 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, - rgba_end[0], - rgba_end[1], - rgba_end[2], - rgba_end[3]); + 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); @@ -276,52 +273,28 @@ draw_album_border(GtkWidget *metadata) GtkAllocation alloc; gtk_widget_get_allocation (metadata, &alloc); - gint offset = 2; + gint offset = 1; alloc.width = alloc.width + (offset * 2); - alloc.height = alloc.height + (offset * 2); + alloc.height = alloc.height + (offset * 2) - 7; alloc.x = alloc.x - offset; - alloc.y = alloc.y - offset; - - double start_colour[] = { style->bg[0].red/65535.0, - style->bg[0].green/65535.0, - style->bg[0].blue/65535.0, - 1.0f }; + alloc.y = alloc.y - offset + 3; - double end_colour[] = { style->fg[0].red/65535.0, - style->fg[0].green/65535.0, - style->fg[0].blue/65535.0, - 1.0f}; - - draw_gradient(cr, - alloc, - start_colour, - end_colour); - - /*cairo_rectangle (cr, - alloc.x, alloc.y, - alloc.width, alloc.height); - cairo_clip(cr); + CairoColorRGB bg_normal, fg_normal; - cairo_move_to (cr, alloc.x , alloc.y); - cairo_line_to(cr, alloc.x + alloc.width, - alloc.y); - cairo_line_to(cr, alloc.x + alloc.width, - alloc.y + alloc.height); - cairo_line_to(cr, alloc.x, alloc.y + alloc.height); - cairo_line_to(cr, alloc.x, alloc.y); + 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; + fg_normal.r = style->fg[0].red/65535.0; + fg_normal.g = style->fg[0].green/65535.0; + fg_normal.b = style->fg[0].blue/65535.0; - 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);*/ + draw_gradient(cr, + alloc, + bg_normal, + fg_normal); } static void @@ -334,9 +307,8 @@ draw_album_art_placeholder(GtkWidget *metadata) GtkAllocation alloc; gtk_widget_get_allocation (metadata, &alloc); - - // Draw the eight note - PangoLayout *layout; + + PangoLayout *layout; PangoFontDescription *desc; layout = pango_cairo_create_layout(cr); PangoContext* pcontext = pango_cairo_create_context(cr); @@ -359,7 +331,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); @@ -434,67 +406,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 metadata_widget_style_labels(MetadataWidget* self, GtkLabel* label) -- cgit v1.2.3 From 2f409b95c5c1c0c7107f4503c01687b3a913780f Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 27 Oct 2010 11:48:29 -0400 Subject: more tweaks --- src/metadata-widget.c | 45 ++++++++++++++++++++++++++++++++------------- src/pulse-manager.c | 4 ++-- src/sound-service.c | 4 ++-- 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/metadata-widget.c b/src/metadata-widget.c index 911b35a..38f2c4c 100644 --- a/src/metadata-widget.c +++ b/src/metadata-widget.c @@ -66,8 +66,11 @@ static void metadata_widget_property_update (DbusmenuMenuitem* item, static void metadata_widget_style_labels ( MetadataWidget* self, GtkLabel* label); static void draw_album_art_placeholder ( GtkWidget *metadata); -static void draw_album_border ( GtkWidget *metadata); - +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); @@ -154,8 +157,11 @@ metadata_widget_init (MetadataWidget *self) gtk_box_pack_start (GTK_BOX (priv->hbox), vbox, FALSE, FALSE, 0); - g_signal_connect(self, "style-set", G_CALLBACK(metadata_widget_set_style), GTK_WIDGET(self)); - + 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); } @@ -183,7 +189,7 @@ 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); - draw_album_border(metadata); + 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){ @@ -211,6 +217,7 @@ metadata_image_expose (GtkWidget *metadata, GdkEventExpose *event, gpointer user } + static void draw_gradient (cairo_t* cr, GtkAllocation alloc, @@ -264,7 +271,7 @@ draw_gradient (cairo_t* cr, } static void -draw_album_border(GtkWidget *metadata) +draw_album_border(GtkWidget *metadata, gboolean selected) { cairo_t *cr; cr = gdk_cairo_create (metadata->window); @@ -286,10 +293,11 @@ draw_album_border(GtkWidget *metadata) bg_normal.g = style->bg[0].green/65535.0; bg_normal.b = style->bg[0].blue/65535.0; - fg_normal.r = style->fg[0].red/65535.0; - fg_normal.g = style->fg[0].green/65535.0; - fg_normal.b = style->fg[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, @@ -341,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, @@ -357,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); @@ -405,8 +426,6 @@ metadata_widget_property_update(DbusmenuMenuitem* item, gchar* property, } } - - static void metadata_widget_style_labels(MetadataWidget* self, GtkLabel* label) { diff --git a/src/pulse-manager.c b/src/pulse-manager.c index 8779525..20238e7 100644 --- a/src/pulse-manager.c +++ b/src/pulse-manager.c @@ -490,10 +490,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/sound-service.c b/src/sound-service.c index 51f5f37..f19379d 100644 --- a/src/sound-service.c +++ b/src/sound-service.c @@ -41,8 +41,8 @@ service_shutdown (IndicatorService *service, gpointer user_data) if (mainloop != NULL) { g_debug("Service shutdown !"); //TODO: uncomment for release !! - //close_pulse_activites(); - //g_main_loop_quit(mainloop); + close_pulse_activites(); + g_main_loop_quit(mainloop); } return; } -- cgit v1.2.3 From 6c1c1d706fa7e8670ce3fb46329647e20a307911 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Fri, 5 Nov 2010 15:19:52 +0000 Subject: refactored the constructor for the player controller enforcing app_info pattern --- src/music-player-bridge.vala | 56 +++++++++++++++++--------------------------- src/player-controller.vala | 19 +++++++++++++-- 2 files changed, 39 insertions(+), 36 deletions(-) diff --git a/src/music-player-bridge.vala b/src/music-player-bridge.vala index 57f5636..4bb0e6b 100644 --- a/src/music-player-bridge.vala +++ b/src/music-player-bridge.vala @@ -56,15 +56,13 @@ public class MusicPlayerBridge : GLib.Object } GLib.AppInfo app_info = info as GLib.AppInfo; + var mpris_key = determine_key(app); PlayerController ctrl = new PlayerController(this.root_menu, - truncate_player_name(app_info.get_name()), - determine_key(app), + app_info, + mpris_key, calculate_menu_position(), PlayerController.state.OFFLINE); - ctrl.app_info = app_info; - if(ctrl.app_info == null) - warning("for some reason the app info is null"); - this.registered_clients.set(determine_key(app), ctrl); + this.registered_clients.set(mpris_key, ctrl); } } @@ -94,24 +92,27 @@ public class MusicPlayerBridge : GLib.Object { MusicPlayerBridge bridge = data as MusicPlayerBridge; AppInfo? app_info = create_app_info(path); - var name = truncate_player_name(app_info.get_name()); - if(path.contains("/") && bridge.playersDB.already_familiar(path) == false){ - debug("About to store desktop file path: %s", path); + if ( app_info == null ){ + warning ( "Could not create app_info for path %s \n Getting out of here ", path); + return; + } + + var mpris_key = determine_key(path); + + if(bridge.playersDB.already_familiar(path) == false){ + debug("New client has registered that we have seen before: %s", path); bridge.playersDB.insert(path); - PlayerController ctrl = new PlayerController(bridge.root_menu, - name, - determine_key(path), - bridge.calculate_menu_position(), - PlayerController.state.READY); - ctrl.set("app_info", app_info); - bridge.registered_clients.set(determine_key(path), ctrl); - debug("successfully created appinfo and instance from path and set it on the respective instance"); + PlayerController ctrl = new PlayerController ( bridge.root_menu, + app_info, + mpris_key, + bridge.calculate_menu_position(), + PlayerController.state.READY ); + bridge.registered_clients.set(mpris_key, ctrl); } else{ - var key = determine_key(path); - bridge.registered_clients[key].update_state(PlayerController.state.READY); - bridge.registered_clients[key].activate(); - debug("Ignoring desktop file path callback because the db cache file has it already: %s", path); + bridge.registered_clients[mpris_key].update_state(PlayerController.state.READY); + bridge.registered_clients[mpris_key].activate(); + debug("Ignoring desktop file path callback because the db cache file has it already: %s \n", path); } } @@ -155,19 +156,6 @@ public class MusicPlayerBridge : GLib.Object return app_info; } - private static string truncate_player_name(owned string app_info_name) - { - string result = app_info_name.down().strip(); - - var tokens = result.split(" "); - - if(tokens.length > 1){ - result = tokens[0]; - } - debug("truncate player name %s", result); - return result; - } - private static string? determine_key(owned string path) { var tokens = path.split("/"); diff --git a/src/player-controller.vala b/src/player-controller.vala index f9cbe71..cc2e4e1 100644 --- a/src/player-controller.vala +++ b/src/player-controller.vala @@ -51,13 +51,14 @@ public class PlayerController : GLib.Object public int menu_offset { get; set;} public PlayerController(Dbusmenu.Menuitem root, - string client_name, + GLib.AppInfo app, string mpris_name, int offset, state initial_state) { this.root_menu = root; - this.name = format_client_name(client_name.strip()); + this.app_info = app; + this.name = format_player_name(this.app_info.get_name()); this.mpris_name = mpris_name; this.custom_items = new ArrayList(); this.current_state = initial_state; @@ -170,6 +171,20 @@ public class PlayerController : GLib.Object return formatted; } + private static string format_player_name(owned string app_info_name) + { + string result = app_info_name.down().strip(); + var tokens = result.split(" "); + if(tokens.length > 1){ + result = tokens[0]; + } + if(result.length > 1){ + result = result.up(1).concat(result.slice(1, result.length)); + debug("PlayerController->format_player_name - : %s", result); + } + return result; + } + // Temporarily we will need to handle to different mpris implemenations // Do it for now - a couple of weeks should see this messy carry on out of // the codebase. -- cgit v1.2.3 From fc0e9301d7c4cbeb7476d833b6e550bc719508cf Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Fri, 5 Nov 2010 15:28:59 +0000 Subject: changed default app to banshee --- src/familiar-players-db.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/familiar-players-db.vala b/src/familiar-players-db.vala index 28ac286..b8ce91c 100644 --- a/src/familiar-players-db.vala +++ b/src/familiar-players-db.vala @@ -29,7 +29,7 @@ public class FamiliarPlayersDB : GLib.Object { private const string GROUP_NAME = "Seen Database"; private const string KEY_NAME = "DesktopFiles"; - private const string DEFAULT_APP_DESKTOP = "/usr/share/applications/rhythmbox.desktop"; + private const string DEFAULT_APP_DESKTOP = "/usr/share/applications/banshee-1.desktop"; private HashMap players_DB; private string file_name; private string dir_name; -- cgit v1.2.3 From fa06a4441287f76de3033f15cf1346b4e91004c4 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Fri, 5 Nov 2010 17:39:06 +0000 Subject: tidy up unwanted deps --- src/Makefile.am | 1 - src/player-controller.vala | 1 - 2 files changed, 2 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 563b755..68091b3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -76,7 +76,6 @@ 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 \ diff --git a/src/player-controller.vala b/src/player-controller.vala index 537eccc..7d3aad0 100644 --- a/src/player-controller.vala +++ b/src/player-controller.vala @@ -19,7 +19,6 @@ with this program. If not, see . */ using Dbusmenu; -using DbusmenuGtk; using Gee; public class PlayerController : GLib.Object -- cgit v1.2.3 From dd80c00e460cf1857eb8a76b62e2058b49f62d88 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Fri, 5 Nov 2010 17:43:57 +0000 Subject: tidy up unwanted deps --- src/Makefile.am | 1 - src/player-controller.vala | 5 ++--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 68091b3..b23e9c1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -76,7 +76,6 @@ music_bridge_VALAFLAGS = \ --pkg gee-1.0 \ --pkg Indicate-0.2 \ --pkg Dbusmenu-Glib-0.2 \ - --pkg gtk+-2.0 \ --pkg common-defs \ --pkg dbus-glib-1 \ --pkg gio-unix-2.0 \ diff --git a/src/player-controller.vala b/src/player-controller.vala index 7d3aad0..e2ae4d7 100644 --- a/src/player-controller.vala +++ b/src/player-controller.vala @@ -192,6 +192,5 @@ public class PlayerController : GLib.Object else{ this.update_state(state.DISCONNECTED); } - } - -} \ No newline at end of file + } +} -- cgit v1.2.3 From aa60d69555c1a7d991457d8152d96908ad72869d Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 10 Nov 2010 13:31:31 +0000 Subject: more ui tweaks --- src/metadata-widget.c | 84 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 74 insertions(+), 10 deletions(-) diff --git a/src/metadata-widget.c b/src/metadata-widget.c index a1aa860..29ac627 100644 --- a/src/metadata-widget.c +++ b/src/metadata-widget.c @@ -217,7 +217,7 @@ metadata_image_expose (GtkWidget *metadata, GdkEventExpose *event, gpointer user } - +/* static void draw_gradient (cairo_t* cr, GtkAllocation alloc, @@ -268,7 +268,7 @@ draw_gradient (cairo_t* cr, cairo_set_source (cr, pattern); cairo_stroke (cr); cairo_pattern_destroy (pattern); -} +}*/ static void draw_album_border(GtkWidget *metadata, gboolean selected) @@ -299,10 +299,65 @@ draw_album_border(GtkWidget *metadata, gboolean selected) 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); + CairoColorRGB dark_top_color; + CairoColorRGB light_bottom_color; + CairoColorRGB background_color; + + _color_shade ( &bg_normal, 0.93, &background_color ); + _color_shade ( &bg_normal, 0.23, &dark_top_color ); + _color_shade ( &fg_normal, 0.55, &light_bottom_color ); + + cairo_rectangle (cr, + alloc.x, alloc.y, + alloc.width, alloc.height); + + cairo_set_line_width (cr, 1.0); + + cairo_clip ( cr ); + + cairo_move_to (cr, alloc.x, alloc.y ); + cairo_line_to (cr, alloc.x + alloc.width, + alloc.y ); + cairo_line_to ( cr, alloc.x + alloc.width, + alloc.y + alloc.height ); + cairo_line_to ( cr, alloc.x, alloc.y + alloc.height ); + cairo_line_to ( cr, alloc.x, alloc.y); + cairo_close_path (cr); + + cairo_set_source_rgba ( cr, + background_color.r, + background_color.g, + background_color.b, + 1.0 ); + + cairo_fill ( cr ); + + cairo_move_to (cr, alloc.x, alloc.y ); + cairo_line_to (cr, alloc.x + alloc.width, + alloc.y ); + + cairo_close_path (cr); + cairo_set_source_rgba ( cr, + dark_top_color.r, + dark_top_color.g, + dark_top_color.b, + 1.0 ); + + cairo_stroke ( cr ); + + cairo_move_to ( cr, alloc.x + alloc.width, + alloc.y + alloc.height ); + cairo_line_to ( cr, alloc.x, alloc.y + alloc.height ); + + cairo_close_path (cr); + cairo_set_source_rgba ( cr, + light_bottom_color.r, + light_bottom_color.g, + light_bottom_color.b, + 1.0); + + cairo_stroke ( cr ); + cairo_destroy (cr); } static void @@ -332,11 +387,20 @@ draw_album_art_placeholder(GtkWidget *metadata) pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); + CairoColorRGB fg_normal, light_bottom_color; + + fg_normal.r = style->fg[0].red/65535.0; + fg_normal.g = style->fg[0].green/65535.0; + fg_normal.b = style->fg[0].blue/65535.0; + + _color_shade ( &fg_normal, 0.78, &light_bottom_color ); + + cairo_set_source_rgba (cr, - style->fg[0].red/65535.0, - style->fg[0].green/65535.0, - style->fg[0].blue/65535.0, - 0.8); + light_bottom_color.r, + light_bottom_color.g, + light_bottom_color.b, + 1.0); pango_cairo_update_layout(cr, layout); cairo_move_to (cr, alloc.x + alloc.width/6, alloc.y + alloc.height/8); -- cgit v1.2.3 From 9cbe93fc2a05f51bd8c849d492654c96d21e4c1a Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 10 Nov 2010 14:33:27 +0000 Subject: fixed the metadata visibility when there is nothing to show --- src/metadata-widget.c | 54 --------------------------------------------------- src/player-item.vala | 6 ++---- 2 files changed, 2 insertions(+), 58 deletions(-) diff --git a/src/metadata-widget.c b/src/metadata-widget.c index 29ac627..ac8355c 100644 --- a/src/metadata-widget.c +++ b/src/metadata-widget.c @@ -216,60 +216,6 @@ metadata_image_expose (GtkWidget *metadata, GdkEventExpose *event, gpointer user return TRUE; } - -/* -static void -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); - cairo_line_to(cr, alloc.x + alloc.width, - alloc.y); - cairo_line_to(cr, alloc.x + alloc.width, - alloc.y + alloc.height); - cairo_line_to(cr, alloc.x, alloc.y + alloc.height); - cairo_line_to(cr, alloc.x, alloc.y); - - cairo_close_path (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); -}*/ - static void draw_album_border(GtkWidget *metadata, gboolean selected) { diff --git a/src/player-item.vala b/src/player-item.vala index 68ae6ef..51471d1 100644 --- a/src/player-item.vala +++ b/src/player-item.vala @@ -87,9 +87,7 @@ public class PlayerItem : Dbusmenu.Menuitem this.property_set_bool(property, v.get_boolean()); } } - if(this.property_get_bool(MENUITEM_PROP_VISIBLE) == false){ - this.property_set_bool(MENUITEM_PROP_VISIBLE, true); - } + this.property_set_bool(MENUITEM_PROP_VISIBLE, populated(attributes)); } public bool populated(HashSet attrs) @@ -97,8 +95,8 @@ public class PlayerItem : Dbusmenu.Menuitem foreach(string prop in attrs){ debug("populated ? - prop: %s", prop); int value_int = property_get_int(prop); - debug("populated ? - prop %s and value %i", prop, value_int); if(property_get_int(prop) != EMPTY){ + debug("populated - prop %s and value %i", prop, value_int); return true; } } -- cgit v1.2.3 From 5fd2c5e12a059ab8c59306676d18dfc56c818077 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 10 Nov 2010 15:44:40 +0000 Subject: bumped version no in prep for release --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 300662b..f10eedc 100644 --- a/configure.ac +++ b/configure.ac @@ -1,10 +1,10 @@ -AC_INIT(indicator-sound, 0.5.0, conor.curran@canonical.com) +AC_INIT(indicator-sound, 0.5.1, conor.curran@canonical.com) AC_PREREQ(2.53) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(indicator-sound, 0.5.0) +AM_INIT_AUTOMAKE(indicator-sound, 0.5.1) AM_MAINTAINER_MODE -- cgit v1.2.3 From ee981578fa2261bdea4a3c6bd0beaf89e7ed11e8 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Fri, 12 Nov 2010 18:00:37 +0000 Subject: icon loading now assumes there is an app name plus -panel lying around from the theme --- src/title-widget.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/title-widget.c b/src/title-widget.c index 5bc2a93..73f846a 100644 --- a/src/title-widget.c +++ b/src/title-widget.c @@ -32,7 +32,7 @@ typedef struct _TitleWidgetPrivate TitleWidgetPrivate; struct _TitleWidgetPrivate { - DbusmenuMenuitem* twin_item; + DbusmenuMenuitem* twin_item; }; #define TITLE_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TITLE_WIDGET_TYPE, TitleWidgetPrivate)) @@ -83,25 +83,23 @@ title_widget_set_icon(TitleWidget *self) { TitleWidgetPrivate *priv = TITLE_WIDGET_GET_PRIVATE(self); - 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(icon_name, - GTK_ICON_SIZE_MENU); - - gtk_widget_set_size_request(icon, width + GString* app_panel = g_string_new ( g_utf8_strdown ( dbusmenu_menuitem_property_get(priv->twin_item, DBUSMENU_TITLE_MENUITEM_NAME), + -1 )); + g_string_append(app_panel, "-panel"); + GtkWidget * icon = gtk_image_new_from_icon_name( g_string_free ( app_panel, FALSE), + 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); - g_free(icon_name); } static void -- cgit v1.2.3 From 41284d027bd0c0eeff0e83e10b365f98a6977f59 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Mon, 15 Nov 2010 13:17:22 +0000 Subject: keyboard handling for the transport controls underway --- src/indicator-sound.c | 33 ++++++++++++++++++++++++++++++++- src/sound-service.c | 4 ++-- src/transport-widget.c | 21 ++++++++++++++++++++- src/transport-widget.h | 2 ++ 4 files changed, 56 insertions(+), 4 deletions(-) diff --git a/src/indicator-sound.c b/src/indicator-sound.c index 13f1529..53a4876 100644 --- a/src/indicator-sound.c +++ b/src/indicator-sound.c @@ -47,6 +47,7 @@ typedef struct _IndicatorSoundPrivate IndicatorSoundPrivate; struct _IndicatorSoundPrivate { GtkWidget* volume_widget; + GtkWidget* transport_widget; }; #define INDICATOR_SOUND_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), INDICATOR_SOUND_TYPE, IndicatorSoundPrivate)) @@ -241,11 +242,16 @@ new_transport_widget(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbus //g_debug("indicator-sound: new_transport_bar() called "); GtkWidget* bar = NULL; + IndicatorObject *io = NULL; g_return_val_if_fail(DBUSMENU_IS_MENUITEM(newitem), FALSE); g_return_val_if_fail(DBUSMENU_IS_GTKCLIENT(client), FALSE); bar = transport_widget_new(newitem); + io = g_object_get_data (G_OBJECT (client), "indicator"); + IndicatorSoundPrivate* priv = INDICATOR_SOUND_GET_PRIVATE(INDICATOR_SOUND (io)); + priv->transport_widget = bar; + GtkMenuItem *menu_transport_bar = GTK_MENU_ITEM(bar); gtk_widget_show_all(bar); @@ -706,9 +712,34 @@ key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer data) new_value = CLAMP(new_value, 0, 100); if (new_value != current_value && current_state != STATE_MUTED) { //g_debug("Attempting to set the range from the key listener to %f", new_value); - volume_widget_update(VOLUME_WIDGET(priv->volume_widget), new_value); + volume_widget_update(VOLUME_WIDGET(priv->volume_widget), new_value); } } + if (IS_TRANSPORT_WIDGET(menuitem) == TRUE) { + switch (event->keyval) { + case GDK_Right: + transport_widget_react_to_key_event ( TRANSPORT_WIDGET ( priv->transport_widget ), + TRANSPORT_NEXT ); + digested = TRUE; + break; + case GDK_Left: + transport_widget_react_to_key_event ( TRANSPORT_WIDGET ( priv->transport_widget ), + TRANSPORT_PREVIOUS ); + digested = TRUE; + break; + case GDK_KEY_space: + transport_widget_react_to_key_event ( TRANSPORT_WIDGET ( priv->transport_widget ), + TRANSPORT_PLAY_PAUSE ); + digested = TRUE; + break; + case GDK_Up: + case GDK_Down: + digested = FALSE; + break; + default: + break; + } + } return digested; } diff --git a/src/sound-service.c b/src/sound-service.c index f19379d..51f5f37 100644 --- a/src/sound-service.c +++ b/src/sound-service.c @@ -41,8 +41,8 @@ service_shutdown (IndicatorService *service, gpointer user_data) if (mainloop != NULL) { g_debug("Service shutdown !"); //TODO: uncomment for release !! - close_pulse_activites(); - g_main_loop_quit(mainloop); + //close_pulse_activites(); + //g_main_loop_quit(mainloop); } return; } diff --git a/src/transport-widget.c b/src/transport-widget.c index 26b7a98..3329acc 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -270,7 +270,6 @@ transport_widget_button_release_event (GtkWidget *menuitem, g_return_val_if_fail(IS_TRANSPORT_WIDGET(menuitem), FALSE); TransportWidget* transport = TRANSPORT_WIDGET(menuitem); TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE ( transport ); - TransportWidgetEvent result = transport_widget_determine_button_event ( transport, event ); if(result != TRANSPORT_NADA){ @@ -289,6 +288,26 @@ transport_widget_button_release_event (GtkWidget *menuitem, return TRUE; } +void +transport_widget_react_to_key_event ( TransportWidget* transport, + TransportWidgetEvent transport_event ) +{ + if(transport_event != TRANSPORT_NADA){ + TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE ( transport ); + GValue value = {0}; + g_value_init(&value, G_TYPE_INT); + //g_debug("TransportWidget::menu_press_event - going to send value %i", (int)result); + g_value_set_int(&value, (int)transport_event); + dbusmenu_menuitem_handle_event ( priv->twin_item, + "Transport state change", + &value, + 0 ); + } + + transport_widget_react_to_button_release ( transport, + transport_event ); +} + static TransportWidgetEvent transport_widget_determine_button_event( TransportWidget* button, GdkEventButton* event ) diff --git a/src/transport-widget.h b/src/transport-widget.h index 6ccce05..470b1cd 100644 --- a/src/transport-widget.h +++ b/src/transport-widget.h @@ -66,6 +66,8 @@ typedef struct void _color_shade (const CairoColorRGB *a, float k, CairoColorRGB *b); GType transport_widget_get_type (void); GtkWidget* transport_widget_new ( DbusmenuMenuitem *item ); +void transport_widget_react_to_key_event ( TransportWidget* widget, + TransportWidgetEvent transport_event ); G_END_DECLS -- cgit v1.2.3 From eaee3afe6312a04ce41daed8d380ac5e49616ed6 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Mon, 15 Nov 2010 17:18:19 +0000 Subject: key handling all set up --- src/indicator-sound.c | 3 +-- src/sound-service.c | 4 ++-- src/transport-widget.c | 43 +++++++++++++++++++++++++++++++++++++++---- src/transport-widget.h | 1 - 4 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/indicator-sound.c b/src/indicator-sound.c index 53a4876..b39d064 100644 --- a/src/indicator-sound.c +++ b/src/indicator-sound.c @@ -715,7 +715,7 @@ key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer data) volume_widget_update(VOLUME_WIDGET(priv->volume_widget), new_value); } } - if (IS_TRANSPORT_WIDGET(menuitem) == TRUE) { + else if (IS_TRANSPORT_WIDGET(menuitem) == TRUE) { switch (event->keyval) { case GDK_Right: transport_widget_react_to_key_event ( TRANSPORT_WIDGET ( priv->transport_widget ), @@ -761,7 +761,6 @@ indicator_sound_scroll (IndicatorObject *io, gint delta, IndicatorScrollDirectio if (device_available == FALSE || current_state == STATE_MUTED) return; - IndicatorSoundPrivate* priv = INDICATOR_SOUND_GET_PRIVATE(INDICATOR_SOUND (io)); GtkWidget* slider_widget = volume_widget_get_ido_slider(VOLUME_WIDGET(priv->volume_widget)); diff --git a/src/sound-service.c b/src/sound-service.c index 51f5f37..f19379d 100644 --- a/src/sound-service.c +++ b/src/sound-service.c @@ -41,8 +41,8 @@ service_shutdown (IndicatorService *service, gpointer user_data) if (mainloop != NULL) { g_debug("Service shutdown !"); //TODO: uncomment for release !! - //close_pulse_activites(); - //g_main_loop_quit(mainloop); + close_pulse_activites(); + g_main_loop_quit(mainloop); } return; } diff --git a/src/transport-widget.c b/src/transport-widget.c index 3329acc..63fec4b 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -77,6 +77,7 @@ struct _TransportWidgetPrivate TransportWidgetState current_state; GHashTable* command_coordinates; DbusmenuMenuitem* twin_item; + gboolean has_focus; }; #define TRANSPORT_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRANSPORT_WIDGET_TYPE, TransportWidgetPrivate)) @@ -114,6 +115,9 @@ static void transport_widget_react_to_button_release ( TransportWidget* button, TransportWidgetEvent command); static void transport_widget_toggle_play_pause ( TransportWidget* button, TransportWidgetState update); +static void transport_widget_select (GtkItem* menu, gpointer Userdata); +static void transport_widget_deselect (GtkItem* menu, gpointer Userdata); + /// Init functions ////////////////////////////////////////////////////////// @@ -139,6 +143,7 @@ transport_widget_init (TransportWidget *self) TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(self); priv->current_command = TRANSPORT_NADA; priv->current_state = PAUSE; + priv->has_focus = FALSE; priv->command_coordinates = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, @@ -171,12 +176,20 @@ transport_widget_init (TransportWidget *self) g_hash_table_insert(priv->command_coordinates, GINT_TO_POINTER(TRANSPORT_NEXT), next_list); - gtk_widget_set_size_request(GTK_WIDGET(self), 200, 43); g_signal_connect (G_OBJECT(self), "notify", G_CALLBACK (transport_widget_notify), - NULL); + NULL); + g_signal_connect (GTK_ITEM(self), + "select", + G_CALLBACK (transport_widget_select), + NULL); + g_signal_connect (GTK_ITEM(self), + "deselect", + G_CALLBACK (transport_widget_deselect), + NULL); + } static void @@ -249,7 +262,6 @@ transport_widget_button_press_event (GtkWidget *menuitem, { g_return_val_if_fail ( IS_TRANSPORT_WIDGET(menuitem), FALSE ); TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE ( TRANSPORT_WIDGET(menuitem) ); - TransportWidgetEvent result = transport_widget_determine_button_event ( TRANSPORT_WIDGET(menuitem), event); if(result != TRANSPORT_NADA){ @@ -282,12 +294,27 @@ transport_widget_button_release_event (GtkWidget *menuitem, &value, 0 ); } - transport_widget_react_to_button_release ( transport, result ); return TRUE; } +static void +transport_widget_select (GtkItem* item, gpointer Userdata) +{ + TransportWidget* transport = TRANSPORT_WIDGET(item); + TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE ( transport ); + priv->has_focus = TRUE; +} + +static void +transport_widget_deselect (GtkItem* item, gpointer Userdata) +{ + TransportWidget* transport = TRANSPORT_WIDGET(item); + TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE ( transport ); + priv->has_focus = FALSE; +} + void transport_widget_react_to_key_event ( TransportWidget* transport, TransportWidgetEvent transport_event ) @@ -308,6 +335,14 @@ transport_widget_react_to_key_event ( TransportWidget* transport, transport_event ); } +void +transport_widget_focus_update ( TransportWidget* transport, gboolean focus ) +{ + TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE ( transport ); + priv->has_focus = focus; + g_debug("new focus update = %i", focus); +} + static TransportWidgetEvent transport_widget_determine_button_event( TransportWidget* button, GdkEventButton* event ) diff --git a/src/transport-widget.h b/src/transport-widget.h index 470b1cd..58a224c 100644 --- a/src/transport-widget.h +++ b/src/transport-widget.h @@ -68,7 +68,6 @@ GType transport_widget_get_type (void); GtkWidget* transport_widget_new ( DbusmenuMenuitem *item ); void transport_widget_react_to_key_event ( TransportWidget* widget, TransportWidgetEvent transport_event ); - G_END_DECLS #endif -- cgit v1.2.3 From 225bdefba8a4b98f8ca126ddf33bc1fe9b062ea8 Mon Sep 17 00:00:00 2001 From: Andrea Cimitan Date: Tue, 16 Nov 2010 11:13:23 +0100 Subject: focus the play button --- src/transport-widget.c | 89 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 70 insertions(+), 19 deletions(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index dc79221..b08ce1a 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -645,6 +645,28 @@ _finalize (cairo_t* cr, cairo_destroy (*cr_surf); } +static void +_finalize_repaint (cairo_t* cr, + cairo_t** cr_surf, + cairo_surface_t** surf, + double x, + double y, + int repaints) +{ + if (!cr || !cr_surf || !surf) + return; + + while (repaints > 0) + { + cairo_set_source_surface (cr, *surf, x, y); + cairo_paint (cr); + repaints--; + } + + cairo_surface_destroy (*surf); + cairo_destroy (*cr_surf); +} + static void _color_rgb_to_hls (gdouble *r, gdouble *g, @@ -1063,8 +1085,8 @@ draw (GtkWidget* button, cairo_t *cr) GtkStyle *style; - CairoColorRGB bg_color, fg_color; - CairoColorRGB color_inner[2], color_middle[2], color_outer[2], color_button[3], color_button_outer[2], color_button_shadow, color_inner_compressed[2]; + CairoColorRGB bg_color, fg_color, bg_selected; + CairoColorRGB color_inner[2], color_middle[2], color_outer[2], color_button[4], color_button_outer[2], color_button_shadow, color_inner_compressed[2]; style = gtk_widget_get_style (button); @@ -1073,6 +1095,10 @@ draw (GtkWidget* button, cairo_t *cr) bg_color.g = style->bg[0].green/65535.0; bg_color.b = style->bg[0].blue/65535.0; + bg_selected.r = style->bg[GTK_STATE_SELECTED].red/65535.0; + bg_selected.g = style->bg[GTK_STATE_SELECTED].green/65535.0; + bg_selected.b = style->bg[GTK_STATE_SELECTED].blue/65535.0; + fg_color.r = style->fg[0].red/65535.0; fg_color.g = style->fg[0].green/65535.0; fg_color.b = style->fg[0].blue/65535.0; @@ -1089,6 +1115,7 @@ draw (GtkWidget* button, cairo_t *cr) _color_shade (&fg_color, BUTTON_START_SHADE, &color_button[0]); _color_shade (&fg_color, BUTTON_END_SHADE, &color_button[1]); _color_shade (&bg_color, BUTTON_SHADOW_SHADE, &color_button[2]); + _color_shade (&bg_selected, 1.0, &color_button[3]); _color_shade (&bg_color, INNER_COMPRESSED_START_SHADE, &color_inner_compressed[0]); _color_shade (&bg_color, INNER_COMPRESSED_END_SHADE, &color_inner_compressed[1]); @@ -1102,6 +1129,7 @@ draw (GtkWidget* button, cairo_t *cr) double BUTTON_END[] = {color_button[0].r, color_button[0].g, color_button[0].b, 1.0f}; double BUTTON_START[] = {color_button[1].r, color_button[1].g, color_button[1].b, 1.0f}; double BUTTON_SHADOW[] = {color_button[2].r, color_button[2].g, color_button[2].b, 0.75f}; + double BUTTON_SHADOW_FOCUS[] = {color_button[3].r, color_button[3].g, color_button[3].b, 1.0f}; double INNER_COMPRESSED_END[] = {color_inner_compressed[1].r, color_inner_compressed[1].g, color_inner_compressed[1].b, 1.0f}; double INNER_COMPRESSED_START[] = {color_inner_compressed[0].r, color_inner_compressed[0].g, color_inner_compressed[0].b, 1.0f}; @@ -1195,6 +1223,7 @@ draw (GtkWidget* button, cairo_t *cr) SHADOW_BUTTON, SHADOW_BUTTON); } + // play/pause border if(priv->current_command == TRANSPORT_PLAY_PAUSE){ draw_circle (cr, @@ -1323,7 +1352,7 @@ draw (GtkWidget* button, cairo_t *cr) BUTTON_SHADOW, TRUE); _surface_blur (surf, 1); - _finalize (cr, &cr_surf, &surf, PAUSE_X, PAUSE_Y + 1.0f); + _finalize_repaint (cr, &cr_surf, &surf, PAUSE_X, PAUSE_Y + 1.0f, 3); // draw pause-button _setup (&cr_surf, &surf, PAUSE_WIDTH, PAUSE_HEIGHT); @@ -1344,22 +1373,44 @@ draw (GtkWidget* button, cairo_t *cr) _finalize (cr, &cr_surf, &surf, PAUSE_X, PAUSE_Y); } else if(priv->current_state == PAUSE){ - _setup (&cr_surf, &surf, PLAY_WIDTH, PLAY_HEIGHT); - _mask_play (cr_surf, - PLAY_PADDING, - PLAY_PADDING, - PLAY_WIDTH - (2*PLAY_PADDING), - PLAY_HEIGHT - (2*PLAY_PADDING)); - _fill (cr_surf, - PLAY_PADDING, - PLAY_PADDING, - PLAY_WIDTH - (2*PLAY_PADDING), - PLAY_HEIGHT - (2*PLAY_PADDING), - BUTTON_SHADOW, - BUTTON_SHADOW, - FALSE); - _surface_blur (surf, 1); - _finalize (cr, &cr_surf, &surf, PAUSE_X-0.75f, PAUSE_Y + 1.0f); + if (priv->has_focus) + { + _setup (&cr_surf, &surf, PLAY_WIDTH+6, PLAY_HEIGHT+6); + _mask_play (cr_surf, + PLAY_PADDING, + PLAY_PADDING, + PLAY_WIDTH - (2*PLAY_PADDING), + PLAY_HEIGHT - (2*PLAY_PADDING)); + _fill (cr_surf, + PLAY_PADDING, + PLAY_PADDING, + PLAY_WIDTH - (2*PLAY_PADDING), + PLAY_HEIGHT - (2*PLAY_PADDING), + BUTTON_SHADOW_FOCUS, + BUTTON_SHADOW_FOCUS, + FALSE); + _surface_blur (surf, 3); + _finalize_repaint (cr, &cr_surf, &surf, PAUSE_X-0.5f, PAUSE_Y + 0.5f, 3); + } + else + { + _setup (&cr_surf, &surf, PLAY_WIDTH, PLAY_HEIGHT); + _mask_play (cr_surf, + PLAY_PADDING, + PLAY_PADDING, + PLAY_WIDTH - (2*PLAY_PADDING), + PLAY_HEIGHT - (2*PLAY_PADDING)); + _fill (cr_surf, + PLAY_PADDING, + PLAY_PADDING, + PLAY_WIDTH - (2*PLAY_PADDING), + PLAY_HEIGHT - (2*PLAY_PADDING), + BUTTON_SHADOW, + BUTTON_SHADOW, + FALSE); + _surface_blur (surf, 1); + _finalize (cr, &cr_surf, &surf, PAUSE_X-0.75f, PAUSE_Y + 1.0f); + } // draw play-button _setup (&cr_surf, &surf, PLAY_WIDTH, PLAY_HEIGHT); cairo_set_line_width (cr, 10.5); -- cgit v1.2.3 From 9c5e8107b0d034a422e3397858a91c51b695f3f2 Mon Sep 17 00:00:00 2001 From: Andrea Cimitan Date: Tue, 16 Nov 2010 11:24:23 +0100 Subject: applied to all buttons --- src/transport-widget.c | 171 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 120 insertions(+), 51 deletions(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index b08ce1a..88a352d 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -1261,23 +1261,46 @@ draw (GtkWidget* button, cairo_t *cr) } // draw previous-button drop-shadow - _setup (&cr_surf, &surf, PREV_WIDTH, PREV_HEIGHT); - _mask_prev (cr_surf, - (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, - (PREV_HEIGHT - TRI_HEIGHT) / 2.0f, - TRI_WIDTH, - TRI_HEIGHT, - TRI_OFFSET); - _fill (cr_surf, - (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, - (PREV_HEIGHT - TRI_HEIGHT) / 2.0f, - (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, - (double) TRI_HEIGHT, - BUTTON_SHADOW, - BUTTON_SHADOW, - FALSE); - _surface_blur (surf, 1); - _finalize (cr, &cr_surf, &surf, PREV_X, PREV_Y + 1.0f); + if (priv->has_focus) + { + _setup (&cr_surf, &surf, PREV_WIDTH+6, PREV_HEIGHT+6); + _mask_prev (cr_surf, + (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, + (PREV_HEIGHT - TRI_HEIGHT) / 2.0f, + TRI_WIDTH, + TRI_HEIGHT, + TRI_OFFSET); + _fill (cr_surf, + (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, + (PREV_HEIGHT - TRI_HEIGHT) / 2.0f, + (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, + (double) TRI_HEIGHT, + BUTTON_SHADOW_FOCUS, + BUTTON_SHADOW_FOCUS, + FALSE); + _surface_blur (surf, 3); + _finalize_repaint (cr, &cr_surf, &surf, PREV_X, PREV_Y + 0.5f, 3); + } + else + { + _setup (&cr_surf, &surf, PREV_WIDTH, PREV_HEIGHT); + _mask_prev (cr_surf, + (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, + (PREV_HEIGHT - TRI_HEIGHT) / 2.0f, + TRI_WIDTH, + TRI_HEIGHT, + TRI_OFFSET); + _fill (cr_surf, + (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, + (PREV_HEIGHT - TRI_HEIGHT) / 2.0f, + (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, + (double) TRI_HEIGHT, + BUTTON_SHADOW, + BUTTON_SHADOW, + FALSE); + _surface_blur (surf, 1); + _finalize (cr, &cr_surf, &surf, PREV_X, PREV_Y + 1.0f); + } // draw previous-button _setup (&cr_surf, &surf, PREV_WIDTH, PREV_HEIGHT); @@ -1298,23 +1321,46 @@ draw (GtkWidget* button, cairo_t *cr) _finalize (cr, &cr_surf, &surf, PREV_X, PREV_Y); // draw next-button drop-shadow - _setup (&cr_surf, &surf, NEXT_WIDTH, NEXT_HEIGHT); - _mask_next (cr_surf, - (NEXT_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, - (NEXT_HEIGHT - TRI_HEIGHT) / 2.0f, - TRI_WIDTH, - TRI_HEIGHT, - TRI_OFFSET); - _fill (cr_surf, - (NEXT_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, - (NEXT_HEIGHT - TRI_HEIGHT) / 2.0f, - (NEXT_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, - (double) TRI_HEIGHT, - BUTTON_SHADOW, - BUTTON_SHADOW, - FALSE); - _surface_blur (surf, 1); - _finalize (cr, &cr_surf, &surf, NEXT_X, NEXT_Y + 1.0f); + if (priv->has_focus) + { + _setup (&cr_surf, &surf, NEXT_WIDTH+6, NEXT_HEIGHT+6); + _mask_next (cr_surf, + (NEXT_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, + (NEXT_HEIGHT - TRI_HEIGHT) / 2.0f, + TRI_WIDTH, + TRI_HEIGHT, + TRI_OFFSET); + _fill (cr_surf, + (NEXT_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, + (NEXT_HEIGHT - TRI_HEIGHT) / 2.0f, + (NEXT_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, + (double) TRI_HEIGHT, + BUTTON_SHADOW_FOCUS, + BUTTON_SHADOW_FOCUS, + FALSE); + _surface_blur (surf, 3); + _finalize_repaint (cr, &cr_surf, &surf, NEXT_X, NEXT_Y + 0.5f, 3); + } + else + { + _setup (&cr_surf, &surf, NEXT_WIDTH, NEXT_HEIGHT); + _mask_next (cr_surf, + (NEXT_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, + (NEXT_HEIGHT - TRI_HEIGHT) / 2.0f, + TRI_WIDTH, + TRI_HEIGHT, + TRI_OFFSET); + _fill (cr_surf, + (NEXT_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, + (NEXT_HEIGHT - TRI_HEIGHT) / 2.0f, + (NEXT_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, + (double) TRI_HEIGHT, + BUTTON_SHADOW, + BUTTON_SHADOW, + FALSE); + _surface_blur (surf, 1); + _finalize (cr, &cr_surf, &surf, NEXT_X, NEXT_Y + 1.0f); + } // draw next-button _setup (&cr_surf, &surf, NEXT_WIDTH, NEXT_HEIGHT); @@ -1336,23 +1382,46 @@ draw (GtkWidget* button, cairo_t *cr) // draw pause-button drop-shadow if(priv->current_state == PLAY){ - _setup (&cr_surf, &surf, PAUSE_WIDTH, PAUSE_HEIGHT); - _mask_pause (cr_surf, - (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, - (PAUSE_HEIGHT - BAR_HEIGHT) / 2.0f, - BAR_WIDTH, - BAR_HEIGHT - 2.0f * BAR_WIDTH, - BAR_OFFSET); - _fill (cr_surf, - (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, - (PAUSE_HEIGHT - BAR_HEIGHT) / 2.0f, - (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, - (double) BAR_HEIGHT, - BUTTON_SHADOW, - BUTTON_SHADOW, - TRUE); - _surface_blur (surf, 1); - _finalize_repaint (cr, &cr_surf, &surf, PAUSE_X, PAUSE_Y + 1.0f, 3); + if (priv->has_focus) + { + _setup (&cr_surf, &surf, PAUSE_WIDTH+6, PAUSE_HEIGHT+6); + _mask_pause (cr_surf, + (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, + (PAUSE_HEIGHT - BAR_HEIGHT) / 2.0f, + BAR_WIDTH, + BAR_HEIGHT - 2.0f * BAR_WIDTH, + BAR_OFFSET); + _fill (cr_surf, + (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, + (PAUSE_HEIGHT - BAR_HEIGHT) / 2.0f, + (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, + (double) BAR_HEIGHT, + BUTTON_SHADOW_FOCUS, + BUTTON_SHADOW_FOCUS, + TRUE); + _surface_blur (surf, 3); + _finalize_repaint (cr, &cr_surf, &surf, PAUSE_X, PAUSE_Y + 0.5f, 3); + } + else + { + _setup (&cr_surf, &surf, PAUSE_WIDTH, PAUSE_HEIGHT); + _mask_pause (cr_surf, + (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, + (PAUSE_HEIGHT - BAR_HEIGHT) / 2.0f, + BAR_WIDTH, + BAR_HEIGHT - 2.0f * BAR_WIDTH, + BAR_OFFSET); + _fill (cr_surf, + (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, + (PAUSE_HEIGHT - BAR_HEIGHT) / 2.0f, + (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, + (double) BAR_HEIGHT, + BUTTON_SHADOW, + BUTTON_SHADOW, + TRUE); + _surface_blur (surf, 1); + _finalize (cr, &cr_surf, &surf, PAUSE_X, PAUSE_Y + 1.0f); + } // draw pause-button _setup (&cr_surf, &surf, PAUSE_WIDTH, PAUSE_HEIGHT); -- cgit v1.2.3 From 6c882bee8faa60b3eeac4246adfcfdc10a5cadbf Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 16 Nov 2010 19:52:02 +0000 Subject: title widget icon implemented as discussed at uds --- src/title-widget.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/title-widget.c b/src/title-widget.c index 73f846a..0754958 100644 --- a/src/title-widget.c +++ b/src/title-widget.c @@ -85,23 +85,40 @@ title_widget_set_icon(TitleWidget *self) 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); + + GString* banshee_string = g_string_new ( "banshee" ); GString* app_panel = g_string_new ( g_utf8_strdown ( dbusmenu_menuitem_property_get(priv->twin_item, DBUSMENU_TITLE_MENUITEM_NAME), - -1 )); - g_string_append(app_panel, "-panel"); - GtkWidget * icon = gtk_image_new_from_icon_name( g_string_free ( app_panel, FALSE), - GTK_ICON_SIZE_MENU ); + -1 )); + GtkWidget * icon = NULL; + + // Not ideal but apparently we want the banshee icon to be the greyscale one + // and any others to be the icon from the desktop file => colour. + if ( g_string_equal ( banshee_string, app_panel ) == TRUE && + gtk_icon_theme_has_icon ( gtk_icon_theme_get_default(), app_panel->str ) ){ + g_string_append ( app_panel, "-panel" ); + icon = gtk_image_new_from_icon_name ( app_panel->str, + GTK_ICON_SIZE_MENU ); + } + else{ + icon = gtk_image_new_from_icon_name ( g_strdup (dbusmenu_menuitem_property_get ( priv->twin_item, DBUSMENU_TITLE_MENUITEM_ICON )), + GTK_ICON_SIZE_MENU ); + } + g_string_free ( app_panel, FALSE) ; + g_string_free ( banshee_string, FALSE) ; + 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_widget_show(icon); } + + static void title_widget_dispose (GObject *object) { -- cgit v1.2.3 From f301b9c10c8e867acf076a3351060703d0049652 Mon Sep 17 00:00:00 2001 From: Andrea Cimitan Date: Wed, 17 Nov 2010 11:27:40 +0100 Subject: implementing the focus/key_press thing --- src/indicator-sound.c | 60 +++++++++++++++++++++++++++++++++++++++++++++----- src/transport-widget.c | 40 +++++++++++++++++++++++++-------- src/transport-widget.h | 6 +++-- 3 files changed, 89 insertions(+), 17 deletions(-) diff --git a/src/indicator-sound.c b/src/indicator-sound.c index b39d064..d4e5f3f 100644 --- a/src/indicator-sound.c +++ b/src/indicator-sound.c @@ -72,6 +72,7 @@ static void indicator_sound_scroll (IndicatorObject* io, gint delta, Indicato //Slider related static gboolean new_volume_slider_widget(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); static gboolean key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer data); +static gboolean key_release_cb(GtkWidget* widget, GdkEventKey* event, gpointer data); static void style_changed_cb(GtkWidget *widget, gpointer user_data); //player widget realisation methods @@ -222,7 +223,8 @@ get_menu (IndicatorObject * io) dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(client), DBUSMENU_TITLE_MENUITEM_TYPE, new_title_widget); // register Key-press listening on the menu widget as the slider does not allow this. g_signal_connect(menu, "key-press-event", G_CALLBACK(key_press_cb), io); - + g_signal_connect(menu, "key-release-event", G_CALLBACK(key_release_cb), io); + return GTK_MENU(menu); } @@ -718,17 +720,63 @@ key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer data) else if (IS_TRANSPORT_WIDGET(menuitem) == TRUE) { switch (event->keyval) { case GDK_Right: - transport_widget_react_to_key_event ( TRANSPORT_WIDGET ( priv->transport_widget ), - TRANSPORT_NEXT ); + transport_widget_react_to_key_press_event ( TRANSPORT_WIDGET ( priv->transport_widget ), + TRANSPORT_NEXT ); + digested = TRUE; + break; + case GDK_Left: + transport_widget_react_to_key_press_event ( TRANSPORT_WIDGET ( priv->transport_widget ), + TRANSPORT_PREVIOUS ); + digested = TRUE; + break; + case GDK_KEY_space: + transport_widget_react_to_key_press_event ( TRANSPORT_WIDGET ( priv->transport_widget ), + TRANSPORT_PLAY_PAUSE ); + digested = TRUE; + break; + case GDK_Up: + case GDK_Down: + digested = FALSE; + break; + default: + break; + } + } + return digested; +} + + +/** +key_release_cb: +**/ +static gboolean +key_release_cb(GtkWidget* widget, GdkEventKey* event, gpointer data) +{ + gboolean digested = FALSE; + + g_return_val_if_fail(IS_INDICATOR_SOUND(data), FALSE); + + IndicatorSound *indicator = INDICATOR_SOUND (data); + + IndicatorSoundPrivate* priv = INDICATOR_SOUND_GET_PRIVATE(indicator); + + GtkWidget *menuitem; + + menuitem = GTK_MENU_SHELL (widget)->active_menu_item; + if (IS_TRANSPORT_WIDGET(menuitem) == TRUE) { + switch (event->keyval) { + case GDK_Right: + transport_widget_react_to_key_release_event ( TRANSPORT_WIDGET ( priv->transport_widget ), + TRANSPORT_NEXT ); digested = TRUE; break; case GDK_Left: - transport_widget_react_to_key_event ( TRANSPORT_WIDGET ( priv->transport_widget ), - TRANSPORT_PREVIOUS ); + transport_widget_react_to_key_release_event ( TRANSPORT_WIDGET ( priv->transport_widget ), + TRANSPORT_PREVIOUS ); digested = TRUE; break; case GDK_KEY_space: - transport_widget_react_to_key_event ( TRANSPORT_WIDGET ( priv->transport_widget ), + transport_widget_react_to_key_release_event ( TRANSPORT_WIDGET ( priv->transport_widget ), TRANSPORT_PLAY_PAUSE ); digested = TRUE; break; diff --git a/src/transport-widget.c b/src/transport-widget.c index 88a352d..8c674a6 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -77,6 +77,7 @@ typedef struct _TransportWidgetPrivate TransportWidgetPrivate; struct _TransportWidgetPrivate { TransportWidgetEvent current_command; + TransportWidgetEvent key_event; TransportWidgetState current_state; GHashTable* command_coordinates; DbusmenuMenuitem* twin_item; @@ -146,6 +147,7 @@ transport_widget_init (TransportWidget *self) TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(self); priv->current_command = TRANSPORT_NADA; priv->current_state = PAUSE; + priv->key_event = TRANSPORT_NADA; priv->has_focus = FALSE; priv->command_coordinates = g_hash_table_new_full(g_direct_hash, g_direct_equal, @@ -267,6 +269,7 @@ transport_widget_button_press_event (GtkWidget *menuitem, TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE ( TRANSPORT_WIDGET(menuitem) ); TransportWidgetEvent result = transport_widget_determine_button_event ( TRANSPORT_WIDGET(menuitem), event); + if(result != TRANSPORT_NADA){ priv->current_command = result; cairo_t *cr; @@ -319,8 +322,24 @@ transport_widget_deselect (GtkItem* item, gpointer Userdata) } void -transport_widget_react_to_key_event ( TransportWidget* transport, - TransportWidgetEvent transport_event ) +transport_widget_react_to_key_press_event ( TransportWidget* transport, + TransportWidgetEvent transport_event ) +{ + if(transport_event != TRANSPORT_NADA){ + TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE ( transport ); + priv->current_command = transport_event; + priv->key_event = transport_event; + + cairo_t *cr; + cr = gdk_cairo_create ( GTK_WIDGET(transport)->window ); + draw ( GTK_WIDGET(transport), cr ); + cairo_destroy (cr); + } +} + +void +transport_widget_react_to_key_release_event ( TransportWidget* transport, + TransportWidgetEvent transport_event ) { if(transport_event != TRANSPORT_NADA){ TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE ( transport ); @@ -378,7 +397,9 @@ transport_widget_react_to_button_release ( TransportWidget* button, TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(button); if(priv->current_command == TRANSPORT_NADA){ //g_debug("returning from the playbutton release because my previous command was nada"); - return; + + /* Update the drawing in any case, should not hurt :) */ + // return; } else if(priv->current_command != TRANSPORT_NADA && command != TRANSPORT_NADA){ @@ -386,11 +407,12 @@ transport_widget_react_to_button_release ( TransportWidget* button, } cairo_t *cr; cr = gdk_cairo_create ( GTK_WIDGET(button)->window ); - priv->current_command = TRANSPORT_NADA; + priv->current_command = TRANSPORT_NADA; + priv->key_event = TRANSPORT_NADA; draw ( GTK_WIDGET(button), cr ); cairo_destroy (cr); -} +} /// internal helper functions ////////////////////////////////////////////////// @@ -1261,7 +1283,7 @@ draw (GtkWidget* button, cairo_t *cr) } // draw previous-button drop-shadow - if (priv->has_focus) + if (priv->has_focus && priv->key_event == TRANSPORT_PREVIOUS) { _setup (&cr_surf, &surf, PREV_WIDTH+6, PREV_HEIGHT+6); _mask_prev (cr_surf, @@ -1321,7 +1343,7 @@ draw (GtkWidget* button, cairo_t *cr) _finalize (cr, &cr_surf, &surf, PREV_X, PREV_Y); // draw next-button drop-shadow - if (priv->has_focus) + if (priv->has_focus && priv->key_event == TRANSPORT_NEXT) { _setup (&cr_surf, &surf, NEXT_WIDTH+6, NEXT_HEIGHT+6); _mask_next (cr_surf, @@ -1382,7 +1404,7 @@ draw (GtkWidget* button, cairo_t *cr) // draw pause-button drop-shadow if(priv->current_state == PLAY){ - if (priv->has_focus) + if (priv->has_focus && (priv->key_event == TRANSPORT_NADA || priv->key_event == TRANSPORT_PLAY_PAUSE)) { _setup (&cr_surf, &surf, PAUSE_WIDTH+6, PAUSE_HEIGHT+6); _mask_pause (cr_surf, @@ -1442,7 +1464,7 @@ draw (GtkWidget* button, cairo_t *cr) _finalize (cr, &cr_surf, &surf, PAUSE_X, PAUSE_Y); } else if(priv->current_state == PAUSE){ - if (priv->has_focus) + if (priv->has_focus && (priv->key_event == TRANSPORT_NADA || priv->key_event == TRANSPORT_PLAY_PAUSE)) { _setup (&cr_surf, &surf, PLAY_WIDTH+6, PLAY_HEIGHT+6); _mask_play (cr_surf, diff --git a/src/transport-widget.h b/src/transport-widget.h index 58a224c..7c087fb 100644 --- a/src/transport-widget.h +++ b/src/transport-widget.h @@ -66,8 +66,10 @@ typedef struct void _color_shade (const CairoColorRGB *a, float k, CairoColorRGB *b); GType transport_widget_get_type (void); GtkWidget* transport_widget_new ( DbusmenuMenuitem *item ); -void transport_widget_react_to_key_event ( TransportWidget* widget, - TransportWidgetEvent transport_event ); +void transport_widget_react_to_key_press_event ( TransportWidget* widget, + TransportWidgetEvent transport_event ); +void transport_widget_react_to_key_release_event ( TransportWidget* widget, + TransportWidgetEvent transport_event ); G_END_DECLS #endif -- cgit v1.2.3 From ca946b13d56c7df56d30c8824baf8e943b07dd3e Mon Sep 17 00:00:00 2001 From: Andrea Cimitan Date: Wed, 17 Nov 2010 12:01:10 +0100 Subject: indents --- src/transport-widget.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index 8c674a6..8b42bd0 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -330,9 +330,9 @@ transport_widget_react_to_key_press_event ( TransportWidget* transport, priv->current_command = transport_event; priv->key_event = transport_event; - cairo_t *cr; - cr = gdk_cairo_create ( GTK_WIDGET(transport)->window ); - draw ( GTK_WIDGET(transport), cr ); + cairo_t *cr; + cr = gdk_cairo_create ( GTK_WIDGET(transport)->window ); + draw ( GTK_WIDGET(transport), cr ); cairo_destroy (cr); } } -- cgit v1.2.3 From 7889e51f4346844c63aa8c11d127134d4ce292e9 Mon Sep 17 00:00:00 2001 From: Andrea Cimitan Date: Wed, 17 Nov 2010 12:11:56 +0100 Subject: Added printf for debugging --- src/transport-widget.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index 8b42bd0..f8aca57 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -329,7 +329,7 @@ transport_widget_react_to_key_press_event ( TransportWidget* transport, TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE ( transport ); priv->current_command = transport_event; priv->key_event = transport_event; - + printf("transport_widget_react_to_key_press_event: before drawing\n"); cairo_t *cr; cr = gdk_cairo_create ( GTK_WIDGET(transport)->window ); draw ( GTK_WIDGET(transport), cr ); @@ -352,7 +352,7 @@ transport_widget_react_to_key_release_event ( TransportWidget* transport, &value, 0 ); } - + printf("transport_widget_react_to_key_release_event: before transport_widget_react_to_key_release_event\n"); transport_widget_react_to_button_release ( transport, transport_event ); } @@ -397,14 +397,16 @@ transport_widget_react_to_button_release ( TransportWidget* button, TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(button); if(priv->current_command == TRANSPORT_NADA){ //g_debug("returning from the playbutton release because my previous command was nada"); - + printf("transport_widget_react_to_button_release: inside if(priv->current_command == TRANSPORT_NADA)\n"); /* Update the drawing in any case, should not hurt :) */ // return; } else if(priv->current_command != TRANSPORT_NADA && command != TRANSPORT_NADA){ priv->current_command = command; + printf("transport_widget_react_to_button_release: inside if(priv->current_command != TRANSPORT_NADA && command != TRANSPORT_NADA)\n"); } + printf("transport_widget_react_to_button_release: before drawing\n"); cairo_t *cr; cr = gdk_cairo_create ( GTK_WIDGET(button)->window ); -- cgit v1.2.3 From a9dea58aef77180c83d8827690f11b9a5acb56fc Mon Sep 17 00:00:00 2001 From: Andrea Cimitan Date: Wed, 17 Nov 2010 13:10:31 +0100 Subject: commented the prints and try to realize the widget in press event --- src/transport-widget.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index f8aca57..fffbdef 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -213,7 +213,7 @@ static gboolean transport_widget_expose (GtkWidget *button, GdkEventExpose *event) { cairo_t *cr; - cr = gdk_cairo_create (button->window); + cr = gdk_cairo_create (button); //g_debug("In the playbutton's expose method, x = %i, y=%i and width: %i and height: %i'"); cairo_rectangle (cr, @@ -329,7 +329,9 @@ transport_widget_react_to_key_press_event ( TransportWidget* transport, TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE ( transport ); priv->current_command = transport_event; priv->key_event = transport_event; - printf("transport_widget_react_to_key_press_event: before drawing\n"); +/* printf("transport_widget_react_to_key_press_event: before drawing\n");*/ + gtk_widget_realize ( GTK_WIDGET(transport) ); + cairo_t *cr; cr = gdk_cairo_create ( GTK_WIDGET(transport)->window ); draw ( GTK_WIDGET(transport), cr ); @@ -352,7 +354,7 @@ transport_widget_react_to_key_release_event ( TransportWidget* transport, &value, 0 ); } - printf("transport_widget_react_to_key_release_event: before transport_widget_react_to_key_release_event\n"); +/* printf("transport_widget_react_to_key_release_event: before transport_widget_react_to_key_release_event\n");*/ transport_widget_react_to_button_release ( transport, transport_event ); } @@ -397,16 +399,16 @@ transport_widget_react_to_button_release ( TransportWidget* button, TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(button); if(priv->current_command == TRANSPORT_NADA){ //g_debug("returning from the playbutton release because my previous command was nada"); - printf("transport_widget_react_to_button_release: inside if(priv->current_command == TRANSPORT_NADA)\n"); +/* printf("transport_widget_react_to_button_release: inside if(priv->current_command == TRANSPORT_NADA)\n");*/ /* Update the drawing in any case, should not hurt :) */ // return; } else if(priv->current_command != TRANSPORT_NADA && command != TRANSPORT_NADA){ priv->current_command = command; - printf("transport_widget_react_to_button_release: inside if(priv->current_command != TRANSPORT_NADA && command != TRANSPORT_NADA)\n"); +/* printf("transport_widget_react_to_button_release: inside if(priv->current_command != TRANSPORT_NADA && command != TRANSPORT_NADA)\n");*/ } - printf("transport_widget_react_to_button_release: before drawing\n"); +/* printf("transport_widget_react_to_button_release: before drawing\n");*/ cairo_t *cr; cr = gdk_cairo_create ( GTK_WIDGET(button)->window ); -- cgit v1.2.3 From 8a1071905651219598cd04ee06ecafe6ceafaa67 Mon Sep 17 00:00:00 2001 From: Andrea Cimitan Date: Wed, 17 Nov 2010 13:17:05 +0100 Subject: ops :) --- src/transport-widget.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index fffbdef..abccb7d 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -213,7 +213,7 @@ static gboolean transport_widget_expose (GtkWidget *button, GdkEventExpose *event) { cairo_t *cr; - cr = gdk_cairo_create (button); + cr = gdk_cairo_create (button->window); //g_debug("In the playbutton's expose method, x = %i, y=%i and width: %i and height: %i'"); cairo_rectangle (cr, -- cgit v1.2.3 From f5aa1d3501cb44f31ce94a1ec188355b41926c95 Mon Sep 17 00:00:00 2001 From: Andrea Cimitan Date: Wed, 17 Nov 2010 15:58:47 +0100 Subject: prelight state, redrawings are causing bugs --- src/transport-widget.c | 562 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 363 insertions(+), 199 deletions(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index abccb7d..1588308 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -64,8 +64,8 @@ Uses code from ctk #define OUTER_START_SHADE 0.75 #define OUTER_END_SHADE 1.3 #define SHADOW_BUTTON_SHADE 0.8 -#define OUTER_BUTTON_START_SHADE 0.7 -#define OUTER_BUTTON_END_SHADE 1.38 +#define OUTER_PLAY_START_SHADE 0.7 +#define OUTER_PLAY_END_SHADE 1.38 #define BUTTON_START_SHADE 1.1 #define BUTTON_END_SHADE 0.9 #define BUTTON_SHADOW_SHADE 0.8 @@ -78,6 +78,7 @@ struct _TransportWidgetPrivate { TransportWidgetEvent current_command; TransportWidgetEvent key_event; + TransportWidgetEvent motion_event; TransportWidgetState current_state; GHashTable* command_coordinates; DbusmenuMenuitem* twin_item; @@ -103,7 +104,11 @@ static void draw (GtkWidget* button, cairo_t *cr); static gboolean transport_widget_button_press_event (GtkWidget *menuitem, GdkEventButton *event); static gboolean transport_widget_button_release_event (GtkWidget *menuitem, - GdkEventButton *event); + GdkEventButton *event); +static gboolean transport_widget_motion_notify_event (GtkWidget *menuitem, + GdkEventMotion *event); +static gboolean transport_widget_leave_notify_event (GtkWidget *menuitem, + GdkEventCrossing *event); static void transport_widget_property_update ( DbusmenuMenuitem* item, gchar * property, GValue * value, @@ -115,6 +120,8 @@ static void transport_widget_notify ( GObject *item, gpointer user_data ); static TransportWidgetEvent transport_widget_determine_button_event ( TransportWidget* button, GdkEventButton* event); +static TransportWidgetEvent transport_widget_determine_motion_event ( TransportWidget* button, + GdkEventMotion* event); static void transport_widget_react_to_button_release ( TransportWidget* button, TransportWidgetEvent command); static void transport_widget_toggle_play_pause ( TransportWidget* button, @@ -134,7 +141,9 @@ transport_widget_class_init (TransportWidgetClass *klass) g_type_class_add_private (klass, sizeof (TransportWidgetPrivate)); widget_class->button_press_event = transport_widget_button_press_event; - widget_class->button_release_event = transport_widget_button_release_event; + widget_class->button_release_event = transport_widget_button_release_event; + widget_class->motion_notify_event = transport_widget_motion_notify_event; + widget_class->leave_notify_event = transport_widget_leave_notify_event; widget_class->expose_event = transport_widget_expose; gobject_class->dispose = transport_widget_dispose; @@ -148,6 +157,7 @@ transport_widget_init (TransportWidget *self) priv->current_command = TRANSPORT_NADA; priv->current_state = PAUSE; priv->key_event = TRANSPORT_NADA; + priv->motion_event = TRANSPORT_NADA; priv->has_focus = FALSE; priv->command_coordinates = g_hash_table_new_full(g_direct_hash, g_direct_equal, @@ -260,6 +270,40 @@ transport_widget_menu_hidden ( GtkWidget *menu, transport_widget_react_to_button_release(transport, TRANSPORT_NADA); } +static gboolean +transport_widget_motion_notify_event (GtkWidget *menuitem, + GdkEventMotion *event) +{ + g_return_val_if_fail ( IS_TRANSPORT_WIDGET(menuitem), FALSE ); + TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE ( TRANSPORT_WIDGET(menuitem) ); + TransportWidgetEvent result = transport_widget_determine_motion_event ( TRANSPORT_WIDGET(menuitem), + event); + + priv->motion_event = result; + cairo_t *cr; + cr = gdk_cairo_create (menuitem->window); + draw ( menuitem, cr ); + cairo_destroy ( cr ); + + return TRUE; +} + +static gboolean +transport_widget_leave_notify_event (GtkWidget *menuitem, + GdkEventCrossing *event) +{ + g_return_val_if_fail ( IS_TRANSPORT_WIDGET(menuitem), FALSE ); + TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE ( TRANSPORT_WIDGET(menuitem) ); + + priv->motion_event = TRANSPORT_NADA; + cairo_t *cr; + cr = gdk_cairo_create (menuitem->window); + draw ( menuitem, cr ); + cairo_destroy ( cr ); + + return TRUE; +} + /* keyevents */ static gboolean transport_widget_button_press_event (GtkWidget *menuitem, @@ -390,6 +434,28 @@ transport_widget_determine_button_event( TransportWidget* button, return button_event; } +static TransportWidgetEvent +transport_widget_determine_motion_event( TransportWidget* button, + GdkEventMotion* event ) +{ +/* g_debug("event x coordinate = %f", event->x);*/ +/* g_debug("event y coordinate = %f", event->y);*/ + TransportWidgetEvent motion_event = TRANSPORT_NADA; + // For now very simple rectangular collision detection + if(event->x > 67 && event->x < 112 + && event->y > 12 && event->y < 40){ + motion_event = TRANSPORT_PREVIOUS; + } + else if(event->x > 111 && event->x < 153 + && event->y > 5 && event->y < 47){ + motion_event = TRANSPORT_PLAY_PAUSE; + } + else if(event->x > 152 && event->x < 197 + && event->y > 12 && event->y < 40){ + motion_event = TRANSPORT_NEXT; + } + return motion_event; +} static void transport_widget_react_to_button_release ( TransportWidget* button, @@ -1111,16 +1177,21 @@ draw (GtkWidget* button, cairo_t *cr) GtkStyle *style; - CairoColorRGB bg_color, fg_color, bg_selected; - CairoColorRGB color_inner[2], color_middle[2], color_outer[2], color_button[4], color_button_outer[2], color_button_shadow, color_inner_compressed[2]; + CairoColorRGB bg_color, fg_color, bg_selected, bg_prelight; + CairoColorRGB color_middle[2], color_middle_prelight[2], color_outer[2], color_outer_prelight[2], + color_play_outer[2], color_play_outer_prelight[2], + color_button[4], color_button_shadow, color_inner[2], color_inner_compressed[2]; style = gtk_widget_get_style (button); - bg_color.r = style->bg[0].red/65535.0; bg_color.g = style->bg[0].green/65535.0; bg_color.b = style->bg[0].blue/65535.0; + bg_prelight.r = style->bg[GTK_STATE_PRELIGHT].red/65535.0; + bg_prelight.g = style->bg[GTK_STATE_PRELIGHT].green/65535.0; + bg_prelight.b = style->bg[GTK_STATE_PRELIGHT].blue/65535.0; + bg_selected.r = style->bg[GTK_STATE_SELECTED].red/65535.0; bg_selected.g = style->bg[GTK_STATE_SELECTED].green/65535.0; bg_selected.b = style->bg[GTK_STATE_SELECTED].blue/65535.0; @@ -1129,77 +1200,71 @@ draw (GtkWidget* button, cairo_t *cr) fg_color.g = style->fg[0].green/65535.0; fg_color.b = style->fg[0].blue/65535.0; + _color_shade (&bg_color, MIDDLE_START_SHADE, &color_middle[0]); + _color_shade (&bg_color, MIDDLE_END_SHADE, &color_middle[1]); + _color_shade (&bg_prelight, MIDDLE_START_SHADE, &color_middle_prelight[0]); + _color_shade (&bg_prelight, MIDDLE_END_SHADE, &color_middle_prelight[1]); + _color_shade (&bg_color, OUTER_START_SHADE, &color_outer[0]); + _color_shade (&bg_color, OUTER_END_SHADE, &color_outer[1]); + _color_shade (&bg_prelight, OUTER_START_SHADE, &color_outer_prelight[0]); + _color_shade (&bg_prelight, OUTER_END_SHADE, &color_outer_prelight[1]); + _color_shade (&bg_color, OUTER_PLAY_START_SHADE, &color_play_outer[0]); + _color_shade (&bg_color, OUTER_PLAY_END_SHADE, &color_play_outer[1]); + _color_shade (&bg_prelight, OUTER_PLAY_START_SHADE, &color_play_outer_prelight[0]); + _color_shade (&bg_prelight, OUTER_PLAY_END_SHADE, &color_play_outer_prelight[1]); _color_shade (&bg_color, INNER_START_SHADE, &color_inner[0]); _color_shade (&bg_color, INNER_END_SHADE, &color_inner[1]); - _color_shade (&bg_color, MIDDLE_START_SHADE, &color_middle[0]); - _color_shade (&bg_color, MIDDLE_END_SHADE, &color_middle[1]); - _color_shade (&bg_color, OUTER_START_SHADE, &color_outer[0]); - _color_shade (&bg_color, OUTER_END_SHADE, &color_outer[1]); - _color_shade (&bg_color, OUTER_BUTTON_START_SHADE, &color_button_outer[0]); - _color_shade (&bg_color, OUTER_BUTTON_END_SHADE, &color_button_outer[1]); - _color_shade (&bg_color, SHADOW_BUTTON_SHADE, &color_button_shadow); _color_shade (&fg_color, BUTTON_START_SHADE, &color_button[0]); _color_shade (&fg_color, BUTTON_END_SHADE, &color_button[1]); _color_shade (&bg_color, BUTTON_SHADOW_SHADE, &color_button[2]); + _color_shade (&bg_color, SHADOW_BUTTON_SHADE, &color_button_shadow); _color_shade (&bg_selected, 1.0, &color_button[3]); _color_shade (&bg_color, INNER_COMPRESSED_START_SHADE, &color_inner_compressed[0]); _color_shade (&bg_color, INNER_COMPRESSED_END_SHADE, &color_inner_compressed[1]); - double MIDDLE_END[] = {color_middle[0].r, color_middle[0].g, color_middle[0].b, 1.0f}; + double MIDDLE_END[] = {color_middle[0].r, color_middle[0].g, color_middle[0].b, 1.0f}; double MIDDLE_START[] = {color_middle[1].r, color_middle[1].g, color_middle[1].b, 1.0f}; - double SHADOW_BUTTON[] = {color_button_shadow.r, color_button_shadow.g, color_button_shadow.b, 0.16f}; - double OUTER_END[] = {color_outer[0].r, color_outer[0].g, color_outer[0].b, 1.0f}; + double MIDDLE_END_PRELIGHT[] = {color_middle_prelight[0].r, color_middle_prelight[0].g, color_middle_prelight[0].b, 1.0f}; + double MIDDLE_START_PRELIGHT[] = {color_middle_prelight[1].r, color_middle_prelight[1].g, color_middle_prelight[1].b, 1.0f}; + double OUTER_END[] = {color_outer[0].r, color_outer[0].g, color_outer[0].b, 1.0f}; double OUTER_START[] = {color_outer[1].r, color_outer[1].g, color_outer[1].b, 1.0f}; - double OUTER_BUTTON_END[] = {color_button_outer[0].r, color_button_outer[0].g, color_button_outer[0].b, 1.0f}; - double OUTER_BUTTON_START[] = {color_button_outer[1].r, color_button_outer[1].g, color_button_outer[1].b, 1.0f}; + double OUTER_END_PRELIGHT[] = {color_outer_prelight[0].r, color_outer_prelight[0].g, color_outer_prelight[0].b, 1.0f}; + double OUTER_START_PRELIGHT[] = {color_outer_prelight[1].r, color_outer_prelight[1].g, color_outer_prelight[1].b, 1.0f}; + double SHADOW_BUTTON[] = {color_button_shadow.r, color_button_shadow.g, color_button_shadow.b, 0.16f}; + double OUTER_PLAY_END[] = {color_play_outer[0].r, color_play_outer[0].g, color_play_outer[0].b, 1.0f}; + double OUTER_PLAY_START[] = {color_play_outer[1].r, color_play_outer[1].g, color_play_outer[1].b, 1.0f}; + double OUTER_PLAY_END_PRELIGHT[] = {color_play_outer_prelight[0].r, color_play_outer_prelight[0].g, color_play_outer_prelight[0].b, 1.0f}; + double OUTER_PLAY_START_PRELIGHT[] = {color_play_outer_prelight[1].r, color_play_outer_prelight[1].g, color_play_outer_prelight[1].b, 1.0f}; double BUTTON_END[] = {color_button[0].r, color_button[0].g, color_button[0].b, 1.0f}; double BUTTON_START[] = {color_button[1].r, color_button[1].g, color_button[1].b, 1.0f}; double BUTTON_SHADOW[] = {color_button[2].r, color_button[2].g, color_button[2].b, 0.75f}; double BUTTON_SHADOW_FOCUS[] = {color_button[3].r, color_button[3].g, color_button[3].b, 1.0f}; double INNER_COMPRESSED_END[] = {color_inner_compressed[1].r, color_inner_compressed[1].g, color_inner_compressed[1].b, 1.0f}; double INNER_COMPRESSED_START[] = {color_inner_compressed[0].r, color_inner_compressed[0].g, color_inner_compressed[0].b, 1.0f}; - - // prev/next-background -/* if(priv->current_command != TRANSPORT_PREVIOUS && priv->current_command != TRANSPORT_NEXT){*/ -/* draw_gradient (cr,*/ -/* X-0.25,*/ -/* Y-1,*/ -/* RECT_WIDTH+2,*/ -/* OUTER_RADIUS+1,*/ -/* SHADOW_BUTTON,*/ -/* SHADOW_BUTTON);*/ + + // prev/next shadow +/* if(priv->current_command != TRANSPORT_PREVIOUS && priv->current_command != TRANSPORT_NEXT)*/ +/* {*/ +/* draw_gradient (cr,*/ +/* X-0.25,*/ +/* Y-1,*/ +/* RECT_WIDTH+2,*/ +/* OUTER_RADIUS+1,*/ +/* SHADOW_BUTTON,*/ +/* SHADOW_BUTTON);*/ /* }*/ - draw_gradient (cr, - X, - Y, - RECT_WIDTH, - OUTER_RADIUS, - OUTER_START, - OUTER_END); - draw_gradient (cr, - X, - Y + 1, - RECT_WIDTH - 2, - MIDDLE_RADIUS, - MIDDLE_START, - MIDDLE_END); - draw_gradient (cr, - X, - Y + 2, - RECT_WIDTH - 4, - MIDDLE_RADIUS, - MIDDLE_START, - MIDDLE_END); - - if(priv->current_command == TRANSPORT_PREVIOUS){ - draw_gradient (cr, - X, - Y, - RECT_WIDTH/2, - OUTER_RADIUS, - OUTER_END, - OUTER_START); - + + //prev/next button + if(priv->current_command == TRANSPORT_PREVIOUS) + { + draw_gradient (cr, + X, + Y, + RECT_WIDTH/2, + OUTER_RADIUS, + OUTER_END, + OUTER_START); + draw_gradient (cr, X, Y + 1, @@ -1207,6 +1272,7 @@ draw (GtkWidget* button, cairo_t *cr) MIDDLE_RADIUS, INNER_COMPRESSED_START, INNER_COMPRESSED_END); + draw_gradient (cr, X, Y + 2, @@ -1214,15 +1280,16 @@ draw (GtkWidget* button, cairo_t *cr) MIDDLE_RADIUS, INNER_COMPRESSED_START, INNER_COMPRESSED_END); - } - else if(priv->current_command == TRANSPORT_NEXT){ + } + else if(priv->current_command == TRANSPORT_NEXT) + { draw_gradient (cr, - RECT_WIDTH / 2 + X, - Y, - RECT_WIDTH/2, - OUTER_RADIUS, - OUTER_END, - OUTER_START); + RECT_WIDTH / 2 + X, + Y, + RECT_WIDTH/2, + OUTER_RADIUS, + OUTER_END, + OUTER_START); draw_gradient (cr, RECT_WIDTH / 2 + X, @@ -1230,60 +1297,154 @@ draw (GtkWidget* button, cairo_t *cr) (RECT_WIDTH - 7)/2, MIDDLE_RADIUS, INNER_COMPRESSED_START, - INNER_COMPRESSED_END); + INNER_COMPRESSED_END); + draw_gradient (cr, RECT_WIDTH / 2 + X, Y + 2, (RECT_WIDTH - 7)/2, MIDDLE_RADIUS, INNER_COMPRESSED_START, - INNER_COMPRESSED_END); - } + INNER_COMPRESSED_END); + } + else if (priv->motion_event == TRANSPORT_PREVIOUS) + { + draw_gradient (cr, + X, + Y, + RECT_WIDTH/2, + OUTER_RADIUS, + OUTER_START_PRELIGHT, + OUTER_END_PRELIGHT); + + draw_gradient (cr, + X, + Y + 1, + RECT_WIDTH/2, + MIDDLE_RADIUS, + MIDDLE_START_PRELIGHT, + MIDDLE_END_PRELIGHT); + draw_gradient (cr, + X, + Y + 2, + RECT_WIDTH/2, + MIDDLE_RADIUS, + MIDDLE_START_PRELIGHT, + MIDDLE_END_PRELIGHT); + } + else if (priv->motion_event == TRANSPORT_NEXT) + { + draw_gradient (cr, + RECT_WIDTH / 2 + X, + Y, + RECT_WIDTH/2, + OUTER_RADIUS, - // play/pause shadow - if(priv->current_command != TRANSPORT_PLAY_PAUSE){ - draw_circle (cr, - X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f - 1.0f, - Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) - 1.0f, - CIRCLE_RADIUS + 1.0f, - SHADOW_BUTTON, - SHADOW_BUTTON); + OUTER_START_PRELIGHT, + OUTER_END_PRELIGHT); + + draw_gradient (cr, + RECT_WIDTH / 2 + X, + Y + 1, + (RECT_WIDTH - 7)/2, + MIDDLE_RADIUS, + MIDDLE_START_PRELIGHT, + MIDDLE_END_PRELIGHT); + + draw_gradient (cr, + RECT_WIDTH / 2 + X, + Y + 2, + (RECT_WIDTH - 7)/2, + MIDDLE_RADIUS, + MIDDLE_START_PRELIGHT, + MIDDLE_END_PRELIGHT); + } + else + { + draw_gradient (cr, + X, + Y, + RECT_WIDTH, + OUTER_RADIUS, + OUTER_START, + OUTER_END); + + draw_gradient (cr, + X, + Y + 1, + RECT_WIDTH - 2, + MIDDLE_RADIUS, + MIDDLE_START, + MIDDLE_END); + + draw_gradient (cr, + X, + Y + 2, + RECT_WIDTH - 4, + MIDDLE_RADIUS, + MIDDLE_START, + MIDDLE_END); } - // play/pause border - if(priv->current_command == TRANSPORT_PLAY_PAUSE){ + // play/pause shadow + if(priv->current_command != TRANSPORT_PLAY_PAUSE) + { draw_circle (cr, - X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f, - Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) , - CIRCLE_RADIUS, - OUTER_BUTTON_END, - OUTER_BUTTON_START); + X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f - 1.0f, + Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) - 1.0f, + CIRCLE_RADIUS + 1.0f, + SHADOW_BUTTON, + SHADOW_BUTTON); } - else { + + // play/pause button + if(priv->current_command == TRANSPORT_PLAY_PAUSE) + { + draw_circle (cr, + X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f, + Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) , + CIRCLE_RADIUS, + OUTER_PLAY_END, + OUTER_PLAY_START); + draw_circle (cr, - X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f, - Y - ((CIRCLE_RADIUS - OUTER_RADIUS)), - CIRCLE_RADIUS, - OUTER_BUTTON_START, - OUTER_BUTTON_END); + X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f + 1.25f, + Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) + 1.25f, + CIRCLE_RADIUS - 1.25, + INNER_COMPRESSED_START, + INNER_COMPRESSED_END); } + else if (priv->motion_event == TRANSPORT_PLAY_PAUSE) + { + draw_circle (cr, + X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f, + Y - ((CIRCLE_RADIUS - OUTER_RADIUS)), + CIRCLE_RADIUS, + OUTER_PLAY_START_PRELIGHT, + OUTER_PLAY_END_PRELIGHT); - // play/pause-background - if(priv->current_command == TRANSPORT_PLAY_PAUSE){ - draw_circle (cr, - X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f + 1.25f, - Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) + 1.25f, - CIRCLE_RADIUS - 1.25, - INNER_COMPRESSED_START, - INNER_COMPRESSED_END); + draw_circle (cr, + X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f + 1.25f, + Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) + 1.25f, + CIRCLE_RADIUS - 1.25, + MIDDLE_START_PRELIGHT, + MIDDLE_END_PRELIGHT); } - else { + else + { + draw_circle (cr, + X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f, + Y - ((CIRCLE_RADIUS - OUTER_RADIUS)), + CIRCLE_RADIUS, + OUTER_PLAY_START, + OUTER_PLAY_END); + draw_circle (cr, - X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f + 1.25f, - Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) + 1.25f, - CIRCLE_RADIUS - 1.25, - MIDDLE_START, - MIDDLE_END); + X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f + 1.25f, + Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) + 1.25f, + CIRCLE_RADIUS - 1.25, + MIDDLE_START, + MIDDLE_END); } // draw previous-button drop-shadow @@ -1291,11 +1452,11 @@ draw (GtkWidget* button, cairo_t *cr) { _setup (&cr_surf, &surf, PREV_WIDTH+6, PREV_HEIGHT+6); _mask_prev (cr_surf, - (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, - (PREV_HEIGHT - TRI_HEIGHT) / 2.0f, - TRI_WIDTH, - TRI_HEIGHT, - TRI_OFFSET); + (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, + (PREV_HEIGHT - TRI_HEIGHT) / 2.0f, + TRI_WIDTH, + TRI_HEIGHT, + TRI_OFFSET); _fill (cr_surf, (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, (PREV_HEIGHT - TRI_HEIGHT) / 2.0f, @@ -1311,11 +1472,11 @@ draw (GtkWidget* button, cairo_t *cr) { _setup (&cr_surf, &surf, PREV_WIDTH, PREV_HEIGHT); _mask_prev (cr_surf, - (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, - (PREV_HEIGHT - TRI_HEIGHT) / 2.0f, - TRI_WIDTH, - TRI_HEIGHT, - TRI_OFFSET); + (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, + (PREV_HEIGHT - TRI_HEIGHT) / 2.0f, + TRI_WIDTH, + TRI_HEIGHT, + TRI_OFFSET); _fill (cr_surf, (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, (PREV_HEIGHT - TRI_HEIGHT) / 2.0f, @@ -1331,19 +1492,19 @@ draw (GtkWidget* button, cairo_t *cr) // draw previous-button _setup (&cr_surf, &surf, PREV_WIDTH, PREV_HEIGHT); _mask_prev (cr_surf, - (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, - (PREV_HEIGHT - TRI_HEIGHT) / 2.0f, - TRI_WIDTH, - TRI_HEIGHT, - TRI_OFFSET); + (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, + (PREV_HEIGHT - TRI_HEIGHT) / 2.0f, + TRI_WIDTH, + TRI_HEIGHT, + TRI_OFFSET); _fill (cr_surf, - (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, - (PREV_HEIGHT - TRI_HEIGHT) / 2.0f, - (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, - (double) TRI_HEIGHT, - BUTTON_START, - BUTTON_END, - FALSE); + (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, + (PREV_HEIGHT - TRI_HEIGHT) / 2.0f, + (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, + (double) TRI_HEIGHT, + BUTTON_START, + BUTTON_END, + FALSE); _finalize (cr, &cr_surf, &surf, PREV_X, PREV_Y); // draw next-button drop-shadow @@ -1351,11 +1512,11 @@ draw (GtkWidget* button, cairo_t *cr) { _setup (&cr_surf, &surf, NEXT_WIDTH+6, NEXT_HEIGHT+6); _mask_next (cr_surf, - (NEXT_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, - (NEXT_HEIGHT - TRI_HEIGHT) / 2.0f, - TRI_WIDTH, - TRI_HEIGHT, - TRI_OFFSET); + (NEXT_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, + (NEXT_HEIGHT - TRI_HEIGHT) / 2.0f, + TRI_WIDTH, + TRI_HEIGHT, + TRI_OFFSET); _fill (cr_surf, (NEXT_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, (NEXT_HEIGHT - TRI_HEIGHT) / 2.0f, @@ -1371,11 +1532,11 @@ draw (GtkWidget* button, cairo_t *cr) { _setup (&cr_surf, &surf, NEXT_WIDTH, NEXT_HEIGHT); _mask_next (cr_surf, - (NEXT_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, - (NEXT_HEIGHT - TRI_HEIGHT) / 2.0f, - TRI_WIDTH, - TRI_HEIGHT, - TRI_OFFSET); + (NEXT_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, + (NEXT_HEIGHT - TRI_HEIGHT) / 2.0f, + TRI_WIDTH, + TRI_HEIGHT, + TRI_OFFSET); _fill (cr_surf, (NEXT_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, (NEXT_HEIGHT - TRI_HEIGHT) / 2.0f, @@ -1391,11 +1552,11 @@ draw (GtkWidget* button, cairo_t *cr) // draw next-button _setup (&cr_surf, &surf, NEXT_WIDTH, NEXT_HEIGHT); _mask_next (cr_surf, - (NEXT_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, - (NEXT_HEIGHT - TRI_HEIGHT) / 2.0f, - TRI_WIDTH, - TRI_HEIGHT, - TRI_OFFSET); + (NEXT_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, + (NEXT_HEIGHT - TRI_HEIGHT) / 2.0f, + TRI_WIDTH, + TRI_HEIGHT, + TRI_OFFSET); _fill (cr_surf, (NEXT_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f, (NEXT_HEIGHT - TRI_HEIGHT) / 2.0f, @@ -1407,24 +1568,25 @@ draw (GtkWidget* button, cairo_t *cr) _finalize (cr, &cr_surf, &surf, NEXT_X, NEXT_Y); // draw pause-button drop-shadow - if(priv->current_state == PLAY){ + if(priv->current_state == PLAY) + { if (priv->has_focus && (priv->key_event == TRANSPORT_NADA || priv->key_event == TRANSPORT_PLAY_PAUSE)) { _setup (&cr_surf, &surf, PAUSE_WIDTH+6, PAUSE_HEIGHT+6); _mask_pause (cr_surf, - (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, - (PAUSE_HEIGHT - BAR_HEIGHT) / 2.0f, - BAR_WIDTH, - BAR_HEIGHT - 2.0f * BAR_WIDTH, - BAR_OFFSET); + (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, + (PAUSE_HEIGHT - BAR_HEIGHT) / 2.0f, + BAR_WIDTH, + BAR_HEIGHT - 2.0f * BAR_WIDTH, + BAR_OFFSET); _fill (cr_surf, - (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, - (PAUSE_HEIGHT - BAR_HEIGHT) / 2.0f, - (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, - (double) BAR_HEIGHT, - BUTTON_SHADOW_FOCUS, - BUTTON_SHADOW_FOCUS, - TRUE); + (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, + (PAUSE_HEIGHT - BAR_HEIGHT) / 2.0f, + (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, + (double) BAR_HEIGHT, + BUTTON_SHADOW_FOCUS, + BUTTON_SHADOW_FOCUS, + TRUE); _surface_blur (surf, 3); _finalize_repaint (cr, &cr_surf, &surf, PAUSE_X, PAUSE_Y + 0.5f, 3); } @@ -1432,19 +1594,19 @@ draw (GtkWidget* button, cairo_t *cr) { _setup (&cr_surf, &surf, PAUSE_WIDTH, PAUSE_HEIGHT); _mask_pause (cr_surf, - (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, - (PAUSE_HEIGHT - BAR_HEIGHT) / 2.0f, - BAR_WIDTH, - BAR_HEIGHT - 2.0f * BAR_WIDTH, - BAR_OFFSET); + (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, + (PAUSE_HEIGHT - BAR_HEIGHT) / 2.0f, + BAR_WIDTH, + BAR_HEIGHT - 2.0f * BAR_WIDTH, + BAR_OFFSET); _fill (cr_surf, - (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, - (PAUSE_HEIGHT - BAR_HEIGHT) / 2.0f, - (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, - (double) BAR_HEIGHT, - BUTTON_SHADOW, - BUTTON_SHADOW, - TRUE); + (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, + (PAUSE_HEIGHT - BAR_HEIGHT) / 2.0f, + (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, + (double) BAR_HEIGHT, + BUTTON_SHADOW, + BUTTON_SHADOW, + TRUE); _surface_blur (surf, 1); _finalize (cr, &cr_surf, &surf, PAUSE_X, PAUSE_Y + 1.0f); } @@ -1452,38 +1614,39 @@ draw (GtkWidget* button, cairo_t *cr) // draw pause-button _setup (&cr_surf, &surf, PAUSE_WIDTH, PAUSE_HEIGHT); _mask_pause (cr_surf, - (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, - (PAUSE_HEIGHT - BAR_HEIGHT) / 2.0f, - BAR_WIDTH, - BAR_HEIGHT - 2.0f * BAR_WIDTH, - BAR_OFFSET); + (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, + (PAUSE_HEIGHT - BAR_HEIGHT) / 2.0f, + BAR_WIDTH, + BAR_HEIGHT - 2.0f * BAR_WIDTH, + BAR_OFFSET); _fill (cr_surf, - (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, - (PAUSE_HEIGHT - BAR_HEIGHT) / 2.0f, - (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, - (double) BAR_HEIGHT, - BUTTON_START, - BUTTON_END, - TRUE); + (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, + (PAUSE_HEIGHT - BAR_HEIGHT) / 2.0f, + (PAUSE_WIDTH - (2.0f * BAR_WIDTH + BAR_OFFSET)) / 2.0f, + (double) BAR_HEIGHT, + BUTTON_START, + BUTTON_END, + TRUE); _finalize (cr, &cr_surf, &surf, PAUSE_X, PAUSE_Y); } - else if(priv->current_state == PAUSE){ + else if(priv->current_state == PAUSE) + { if (priv->has_focus && (priv->key_event == TRANSPORT_NADA || priv->key_event == TRANSPORT_PLAY_PAUSE)) { _setup (&cr_surf, &surf, PLAY_WIDTH+6, PLAY_HEIGHT+6); _mask_play (cr_surf, - PLAY_PADDING, - PLAY_PADDING, - PLAY_WIDTH - (2*PLAY_PADDING), - PLAY_HEIGHT - (2*PLAY_PADDING)); + PLAY_PADDING, + PLAY_PADDING, + PLAY_WIDTH - (2*PLAY_PADDING), + PLAY_HEIGHT - (2*PLAY_PADDING)); _fill (cr_surf, PLAY_PADDING, PLAY_PADDING, PLAY_WIDTH - (2*PLAY_PADDING), PLAY_HEIGHT - (2*PLAY_PADDING), - BUTTON_SHADOW_FOCUS, - BUTTON_SHADOW_FOCUS, - FALSE); + BUTTON_SHADOW_FOCUS, + BUTTON_SHADOW_FOCUS, + FALSE); _surface_blur (surf, 3); _finalize_repaint (cr, &cr_surf, &surf, PAUSE_X-0.5f, PAUSE_Y + 0.5f, 3); } @@ -1491,21 +1654,22 @@ draw (GtkWidget* button, cairo_t *cr) { _setup (&cr_surf, &surf, PLAY_WIDTH, PLAY_HEIGHT); _mask_play (cr_surf, - PLAY_PADDING, - PLAY_PADDING, - PLAY_WIDTH - (2*PLAY_PADDING), - PLAY_HEIGHT - (2*PLAY_PADDING)); + PLAY_PADDING, + PLAY_PADDING, + PLAY_WIDTH - (2*PLAY_PADDING), + PLAY_HEIGHT - (2*PLAY_PADDING)); _fill (cr_surf, PLAY_PADDING, PLAY_PADDING, PLAY_WIDTH - (2*PLAY_PADDING), PLAY_HEIGHT - (2*PLAY_PADDING), - BUTTON_SHADOW, - BUTTON_SHADOW, - FALSE); + BUTTON_SHADOW, + BUTTON_SHADOW, + FALSE); _surface_blur (surf, 1); _finalize (cr, &cr_surf, &surf, PAUSE_X-0.75f, PAUSE_Y + 1.0f); } + // draw play-button _setup (&cr_surf, &surf, PLAY_WIDTH, PLAY_HEIGHT); cairo_set_line_width (cr, 10.5); @@ -1515,15 +1679,15 @@ draw (GtkWidget* button, cairo_t *cr) PLAY_PADDING, PLAY_PADDING, PLAY_WIDTH - (2*PLAY_PADDING), - PLAY_HEIGHT - (2*PLAY_PADDING)); + PLAY_HEIGHT - (2*PLAY_PADDING)); _fill (cr_surf, PLAY_PADDING, PLAY_PADDING, PLAY_WIDTH - (2*PLAY_PADDING), PLAY_HEIGHT - (2*PLAY_PADDING), - BUTTON_START, - BUTTON_END, - FALSE); + BUTTON_START, + BUTTON_END, + FALSE); _finalize (cr, &cr_surf, &surf, PAUSE_X-0.5f, PAUSE_Y); } } -- cgit v1.2.3 From 237041021ddb7d0c08542fbdca41d845b14dea82 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 17 Nov 2010 15:34:27 +0000 Subject: fixed the crashes and made the key presss/release work nicely with multiple players --- src/indicator-sound.c | 44 ++++++++++++++++++++++++++++++++++---------- src/transport-widget.c | 24 +++++++++++++++++++----- src/transport-widget.h | 1 + 3 files changed, 54 insertions(+), 15 deletions(-) diff --git a/src/indicator-sound.c b/src/indicator-sound.c index d4e5f3f..7797f49 100644 --- a/src/indicator-sound.c +++ b/src/indicator-sound.c @@ -47,7 +47,7 @@ typedef struct _IndicatorSoundPrivate IndicatorSoundPrivate; struct _IndicatorSoundPrivate { GtkWidget* volume_widget; - GtkWidget* transport_widget; + GList* transport_widgets_list; }; #define INDICATOR_SOUND_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), INDICATOR_SOUND_TYPE, IndicatorSoundPrivate)) @@ -156,6 +156,8 @@ indicator_sound_init (IndicatorSound *self) IndicatorSoundPrivate* priv = INDICATOR_SOUND_GET_PRIVATE(self); priv->volume_widget = NULL; + GList* t_list = NULL; + priv->transport_widgets_list = t_list; g_signal_connect(G_OBJECT(self->service), INDICATOR_SERVICE_MANAGER_SIGNAL_CONNECTION_CHANGE, @@ -176,6 +178,10 @@ indicator_sound_dispose (GObject *object) free_the_animation_list(); + IndicatorSoundPrivate* priv = INDICATOR_SOUND_GET_PRIVATE(INDICATOR_SOUND (self)); + + g_list_free ( priv->transport_widgets_list ); + G_OBJECT_CLASS (indicator_sound_parent_class)->dispose (object); return; } @@ -252,7 +258,7 @@ new_transport_widget(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbus bar = transport_widget_new(newitem); io = g_object_get_data (G_OBJECT (client), "indicator"); IndicatorSoundPrivate* priv = INDICATOR_SOUND_GET_PRIVATE(INDICATOR_SOUND (io)); - priv->transport_widget = bar; + priv->transport_widgets_list = g_list_append ( priv->transport_widgets_list, bar ); GtkMenuItem *menu_transport_bar = GTK_MENU_ITEM(bar); @@ -718,19 +724,28 @@ key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer data) } } else if (IS_TRANSPORT_WIDGET(menuitem) == TRUE) { + TransportWidget* transport_widget; + GList* elem; + + for ( elem = priv->transport_widgets_list; elem; elem = elem->next ) { + transport_widget = TRANSPORT_WIDGET ( elem->data ); + if ( transport_widget_is_selected( transport_widget ) ) + break; + } + switch (event->keyval) { case GDK_Right: - transport_widget_react_to_key_press_event ( TRANSPORT_WIDGET ( priv->transport_widget ), + transport_widget_react_to_key_press_event ( transport_widget, TRANSPORT_NEXT ); digested = TRUE; break; case GDK_Left: - transport_widget_react_to_key_press_event ( TRANSPORT_WIDGET ( priv->transport_widget ), + transport_widget_react_to_key_press_event ( transport_widget, TRANSPORT_PREVIOUS ); digested = TRUE; break; case GDK_KEY_space: - transport_widget_react_to_key_press_event ( TRANSPORT_WIDGET ( priv->transport_widget ), + transport_widget_react_to_key_press_event ( transport_widget, TRANSPORT_PLAY_PAUSE ); digested = TRUE; break; @@ -764,20 +779,29 @@ key_release_cb(GtkWidget* widget, GdkEventKey* event, gpointer data) menuitem = GTK_MENU_SHELL (widget)->active_menu_item; if (IS_TRANSPORT_WIDGET(menuitem) == TRUE) { + TransportWidget* transport_widget; + GList* elem; + + for(elem = priv->transport_widgets_list; elem; elem = elem->next) { + transport_widget = TRANSPORT_WIDGET (elem->data); + if ( transport_widget_is_selected( transport_widget ) ) + break; + } + switch (event->keyval) { case GDK_Right: - transport_widget_react_to_key_release_event ( TRANSPORT_WIDGET ( priv->transport_widget ), + transport_widget_react_to_key_release_event ( transport_widget, TRANSPORT_NEXT ); - digested = TRUE; + digested = TRUE; break; case GDK_Left: - transport_widget_react_to_key_release_event ( TRANSPORT_WIDGET ( priv->transport_widget ), + transport_widget_react_to_key_release_event ( transport_widget, TRANSPORT_PREVIOUS ); digested = TRUE; break; case GDK_KEY_space: - transport_widget_react_to_key_release_event ( TRANSPORT_WIDGET ( priv->transport_widget ), - TRANSPORT_PLAY_PAUSE ); + transport_widget_react_to_key_release_event ( transport_widget, + TRANSPORT_PLAY_PAUSE ); digested = TRUE; break; case GDK_Up: diff --git a/src/transport-widget.c b/src/transport-widget.c index 8b42bd0..64ac04a 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -193,8 +193,9 @@ transport_widget_init (TransportWidget *self) g_signal_connect (GTK_ITEM(self), "deselect", G_CALLBACK (transport_widget_deselect), - NULL); - + NULL); + gtk_widget_realize ( GTK_WIDGET (self) ); + } static void @@ -227,6 +228,13 @@ transport_widget_expose (GtkWidget *button, GdkEventExpose *event) return FALSE; } +gboolean +transport_widget_is_selected ( TransportWidget* widget ) +{ + TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(widget); + return priv->has_focus; +} + static void transport_widget_toggle_play_pause(TransportWidget* button, TransportWidgetState update) @@ -330,10 +338,14 @@ transport_widget_react_to_key_press_event ( TransportWidget* transport, priv->current_command = transport_event; priv->key_event = transport_event; + printf ( "transport widget - react to key press event -> is the window null: %i", + gtk_widget_get_window (GTK_WIDGET (transport) ) == NULL ); cairo_t *cr; + + printf("transport_widget_react_to_key_press_event: before drawing\n"); cr = gdk_cairo_create ( GTK_WIDGET(transport)->window ); draw ( GTK_WIDGET(transport), cr ); - cairo_destroy (cr); + cairo_destroy (cr); } } @@ -352,7 +364,7 @@ transport_widget_react_to_key_release_event ( TransportWidget* transport, &value, 0 ); } - + printf("transport_widget_react_to_key_release_event: before transport_widget_react_to_key_release_event\n"); transport_widget_react_to_button_release ( transport, transport_event ); } @@ -397,14 +409,16 @@ transport_widget_react_to_button_release ( TransportWidget* button, TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(button); if(priv->current_command == TRANSPORT_NADA){ //g_debug("returning from the playbutton release because my previous command was nada"); - + printf("transport_widget_react_to_button_release: inside if(priv->current_command == TRANSPORT_NADA)\n"); /* Update the drawing in any case, should not hurt :) */ // return; } else if(priv->current_command != TRANSPORT_NADA && command != TRANSPORT_NADA){ priv->current_command = command; + printf("transport_widget_react_to_button_release: inside if(priv->current_command != TRANSPORT_NADA && command != TRANSPORT_NADA)\n"); } + printf("transport_widget_react_to_button_release: before drawing\n"); cairo_t *cr; cr = gdk_cairo_create ( GTK_WIDGET(button)->window ); diff --git a/src/transport-widget.h b/src/transport-widget.h index 7c087fb..70ce6aa 100644 --- a/src/transport-widget.h +++ b/src/transport-widget.h @@ -70,6 +70,7 @@ void transport_widget_react_to_key_press_event ( TransportWidget* widget, TransportWidgetEvent transport_event ); void transport_widget_react_to_key_release_event ( TransportWidget* widget, TransportWidgetEvent transport_event ); +gboolean transport_widget_is_selected ( TransportWidget* widget ); G_END_DECLS #endif -- cgit v1.2.3 From acd7737d412eeeb9d072e13d2d9b1815f334de2c Mon Sep 17 00:00:00 2001 From: Andrea Cimitan Date: Wed, 17 Nov 2010 16:45:09 +0100 Subject: fixed the redraw --- src/transport-widget.c | 51 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index 1588308..eb1a8a7 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -1254,6 +1254,30 @@ draw (GtkWidget* button, cairo_t *cr) /* SHADOW_BUTTON);*/ /* }*/ + draw_gradient (cr, + X, + Y, + RECT_WIDTH, + OUTER_RADIUS, + OUTER_START, + OUTER_END); + + draw_gradient (cr, + X, + Y + 1, + RECT_WIDTH - 2, + MIDDLE_RADIUS, + MIDDLE_START, + MIDDLE_END); + + draw_gradient (cr, + X, + Y + 2, + RECT_WIDTH - 4, + MIDDLE_RADIUS, + MIDDLE_START, + MIDDLE_END); + //prev/next button if(priv->current_command == TRANSPORT_PREVIOUS) { @@ -1324,6 +1348,7 @@ draw (GtkWidget* button, cairo_t *cr) MIDDLE_RADIUS, MIDDLE_START_PRELIGHT, MIDDLE_END_PRELIGHT); + draw_gradient (cr, X, Y + 2, @@ -1359,32 +1384,6 @@ draw (GtkWidget* button, cairo_t *cr) MIDDLE_START_PRELIGHT, MIDDLE_END_PRELIGHT); } - else - { - draw_gradient (cr, - X, - Y, - RECT_WIDTH, - OUTER_RADIUS, - OUTER_START, - OUTER_END); - - draw_gradient (cr, - X, - Y + 1, - RECT_WIDTH - 2, - MIDDLE_RADIUS, - MIDDLE_START, - MIDDLE_END); - - draw_gradient (cr, - X, - Y + 2, - RECT_WIDTH - 4, - MIDDLE_RADIUS, - MIDDLE_START, - MIDDLE_END); - } // play/pause shadow if(priv->current_command != TRANSPORT_PLAY_PAUSE) -- cgit v1.2.3 From ba69a13a8b79fe1acceff439da98b6d547079a70 Mon Sep 17 00:00:00 2001 From: Andrea Cimitan Date: Wed, 17 Nov 2010 16:51:01 +0100 Subject: comment shadow code --- src/transport-widget.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index eb1a8a7..5618d23 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -1386,15 +1386,15 @@ draw (GtkWidget* button, cairo_t *cr) } // play/pause shadow - if(priv->current_command != TRANSPORT_PLAY_PAUSE) - { - draw_circle (cr, - X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f - 1.0f, - Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) - 1.0f, - CIRCLE_RADIUS + 1.0f, - SHADOW_BUTTON, - SHADOW_BUTTON); - } +/* if(priv->current_command != TRANSPORT_PLAY_PAUSE)*/ +/* {*/ +/* draw_circle (cr,*/ +/* X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f - 1.0f,*/ +/* Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) - 1.0f,*/ +/* CIRCLE_RADIUS + 1.0f,*/ +/* SHADOW_BUTTON,*/ +/* SHADOW_BUTTON);*/ +/* }*/ // play/pause button if(priv->current_command == TRANSPORT_PLAY_PAUSE) -- cgit v1.2.3 From 595ae6b37e22a7a4b8450caa918078308ea514e9 Mon Sep 17 00:00:00 2001 From: Andrea Cimitan Date: Wed, 17 Nov 2010 17:29:39 +0100 Subject: Final touch --- src/transport-widget.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index 5618d23..28aff6f 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -1230,7 +1230,7 @@ draw (GtkWidget* button, cairo_t *cr) double OUTER_START[] = {color_outer[1].r, color_outer[1].g, color_outer[1].b, 1.0f}; double OUTER_END_PRELIGHT[] = {color_outer_prelight[0].r, color_outer_prelight[0].g, color_outer_prelight[0].b, 1.0f}; double OUTER_START_PRELIGHT[] = {color_outer_prelight[1].r, color_outer_prelight[1].g, color_outer_prelight[1].b, 1.0f}; - double SHADOW_BUTTON[] = {color_button_shadow.r, color_button_shadow.g, color_button_shadow.b, 0.16f}; + double SHADOW_BUTTON[] = {color_button_shadow.r, color_button_shadow.g, color_button_shadow.b, 0.3f}; double OUTER_PLAY_END[] = {color_play_outer[0].r, color_play_outer[0].g, color_play_outer[0].b, 1.0f}; double OUTER_PLAY_START[] = {color_play_outer[1].r, color_play_outer[1].g, color_play_outer[1].b, 1.0f}; double OUTER_PLAY_END_PRELIGHT[] = {color_play_outer_prelight[0].r, color_play_outer_prelight[0].g, color_play_outer_prelight[0].b, 1.0f}; @@ -1364,7 +1364,6 @@ draw (GtkWidget* button, cairo_t *cr) Y, RECT_WIDTH/2, OUTER_RADIUS, - OUTER_START_PRELIGHT, OUTER_END_PRELIGHT); @@ -1386,15 +1385,21 @@ draw (GtkWidget* button, cairo_t *cr) } // play/pause shadow -/* if(priv->current_command != TRANSPORT_PLAY_PAUSE)*/ -/* {*/ -/* draw_circle (cr,*/ -/* X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f - 1.0f,*/ -/* Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) - 1.0f,*/ -/* CIRCLE_RADIUS + 1.0f,*/ -/* SHADOW_BUTTON,*/ -/* SHADOW_BUTTON);*/ -/* }*/ + if(priv->current_command != TRANSPORT_PLAY_PAUSE) + { + cairo_save (cr); + cairo_rectangle (cr, X, Y, RECT_WIDTH, MIDDLE_RADIUS*2); + cairo_clip (cr); + + draw_circle (cr, + X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f - 1.0f, + Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) - 1.0f, + CIRCLE_RADIUS + 1.0f, + SHADOW_BUTTON, + SHADOW_BUTTON); + + cairo_restore (cr); + } // play/pause button if(priv->current_command == TRANSPORT_PLAY_PAUSE) @@ -1415,10 +1420,11 @@ draw (GtkWidget* button, cairo_t *cr) } else if (priv->motion_event == TRANSPORT_PLAY_PAUSE) { + /* this subtle offset is to fix alpha borders, should be removed once this draw routine will be refactored */ draw_circle (cr, - X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f, - Y - ((CIRCLE_RADIUS - OUTER_RADIUS)), - CIRCLE_RADIUS, + X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f + 0.1, + Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) + 0.1, + CIRCLE_RADIUS - 0.1, OUTER_PLAY_START_PRELIGHT, OUTER_PLAY_END_PRELIGHT); -- cgit v1.2.3 From c2b222eca845810c2ca54ce11f6791dc715322c7 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 17 Nov 2010 17:44:00 +0000 Subject: removed commented code --- src/transport-widget.c | 31 ++----------------------------- 1 file changed, 2 insertions(+), 29 deletions(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index e814ce5..5be9d4a 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -474,11 +474,7 @@ transport_widget_react_to_button_release ( TransportWidget* button, { g_return_if_fail(IS_TRANSPORT_WIDGET(button)); TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(button); - if(priv->current_command == TRANSPORT_NADA){ - /* Update the drawing in any case, should not hurt :) */ - // return; - } - else if(priv->current_command != TRANSPORT_NADA && + if(priv->current_command != TRANSPORT_NADA && command != TRANSPORT_NADA){ priv->current_command = command; } @@ -504,10 +500,6 @@ draw_gradient (cairo_t* cr, { cairo_pattern_t* pattern = NULL; -/* cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD);*/ -/* cairo_save (cr);*/ -/* cairo_rectangle (cr, x-2.0*r, y, w+2*r, r*2);*/ -/* cairo_clip (cr);*/ cairo_move_to (cr, x, y); cairo_line_to (cr, x + w - 2.0f * r, y); cairo_arc (cr, @@ -525,12 +517,6 @@ draw_gradient (cairo_t* cr, 270.0f * G_PI / 180.0f); cairo_close_path (cr); -/* cairo_arc (cr,*/ -/* x+(w-2*r)/2+1, y+(CIRCLE_RADIUS)/2+2,*/ -/* CIRCLE_RADIUS+1,*/ -/* 0.0f * G_PI / 180.0f,*/ -/* 360.0f * G_PI / 180.0f);*/ - pattern = cairo_pattern_create_linear (x, y, x, y + 2.0f * r); cairo_pattern_add_color_stop_rgba (pattern, 0.0f, @@ -547,7 +533,6 @@ draw_gradient (cairo_t* cr, cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); -/* cairo_restore(cr);*/ } static void @@ -679,8 +664,7 @@ _mask_play (cairo_t* cr, double x, double y, double tri_width, - double tri_height - /*double tri_offset*/) + double tri_height) { if (!cr) return; @@ -1249,17 +1233,6 @@ draw (GtkWidget* button, cairo_t *cr) double INNER_COMPRESSED_END[] = {color_inner_compressed[1].r, color_inner_compressed[1].g, color_inner_compressed[1].b, 1.0f}; double INNER_COMPRESSED_START[] = {color_inner_compressed[0].r, color_inner_compressed[0].g, color_inner_compressed[0].b, 1.0f}; - // prev/next shadow -/* if(priv->current_command != TRANSPORT_PREVIOUS && priv->current_command != TRANSPORT_NEXT)*/ -/* {*/ -/* draw_gradient (cr,*/ -/* X-0.25,*/ -/* Y-1,*/ -/* RECT_WIDTH+2,*/ -/* OUTER_RADIUS+1,*/ -/* SHADOW_BUTTON,*/ -/* SHADOW_BUTTON);*/ -/* }*/ draw_gradient (cr, X, -- cgit v1.2.3 From 3ea42eb34e8cf787c98bb783d39c6f237381ffe2 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 18 Nov 2010 11:30:03 +0000 Subject: made the necessary changes to ensure compatibility with valac-0.12, and dealt with a compiler warning --- src/familiar-players-db.vala | 7 ++++++- src/fetch-file.vala | 2 +- src/metadata-menu-item.vala | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/familiar-players-db.vala b/src/familiar-players-db.vala index af7d07f..47ddc70 100644 --- a/src/familiar-players-db.vala +++ b/src/familiar-players-db.vala @@ -167,9 +167,14 @@ public class FamiliarPlayersDB : GLib.Object desktop_keyfile.load_from_file (desktop_path, KeyFileFlags.NONE); } catch(GLib.FileError error){ - warning("Error loading keyfile"); + warning("Error loading keyfile - FileError"); return null; } + catch(GLib.KeyFileError error){ + warning("Error loading keyfile - KeyFileError"); + return null; + } + try{ return desktop_keyfile.get_string (KeyFileDesktop.GROUP, KeyFileDesktop.KEY_ICON); diff --git a/src/fetch-file.vala b/src/fetch-file.vala index 1811cc1..e6fc11d 100644 --- a/src/fetch-file.vala +++ b/src/fetch-file.vala @@ -64,7 +64,7 @@ public class FetchFile : Object ssize_t bufsize = 1; do { try { - bufsize = yield this.stream.read_async (buffer, size, GLib.Priority.DEFAULT, null); + bufsize = yield this.stream.read_async (buffer, GLib.Priority.DEFAULT, null); if (bufsize < 1) { break;} if (bufsize != size) diff --git a/src/metadata-menu-item.vala b/src/metadata-menu-item.vala index 3f71653..c9ab4dd 100644 --- a/src/metadata-menu-item.vala +++ b/src/metadata-menu-item.vala @@ -133,7 +133,7 @@ public class MetadataMenuitem : PlayerItem { try{ PixbufLoader loader = new PixbufLoader (); - loader.write (update.data, update.len); + loader.write (update.data); loader.close (); Pixbuf icon = loader.get_pixbuf (); string path = this.album_art_cache_dir.concat("/downloaded-coverart-XXXXXX"); -- cgit v1.2.3 From 0d5c60e9161f4b1b4315bbfac7862ef662f577ee Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 18 Nov 2010 12:25:56 +0000 Subject: bumped version of valac and release version --- configure.ac | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index f10eedc..c8ae871 100644 --- a/configure.ac +++ b/configure.ac @@ -1,15 +1,15 @@ -AC_INIT(indicator-sound, 0.5.1, conor.curran@canonical.com) +AC_INIT(indicator-sound, 0.5.2, conor.curran@canonical.com) AC_PREREQ(2.53) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(indicator-sound, 0.5.1) +AM_INIT_AUTOMAKE(indicator-sound, 0.5.2) AM_MAINTAINER_MODE IT_PROG_INTLTOOL([0.35.0]) -AM_PROG_VALAC([0.7.8]) +AM_PROG_VALAC([0.11.2]) AS_IF([test -z "$VALAC"], [AC_MSG_ERROR(["No valac compiler found."])]) AC_ISC_POSIX -- cgit v1.2.3