From f383ead1168dde3374dabc2040035907d4ab484d Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Mon, 12 Jul 2010 16:13:48 +0100 Subject: the beginnings of the scrub bar --- src/scrub-menu-item.vala | 0 src/scrub-widget.c | 0 src/scrub-widget.h | 0 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/scrub-menu-item.vala create mode 100644 src/scrub-widget.c create mode 100644 src/scrub-widget.h diff --git a/src/scrub-menu-item.vala b/src/scrub-menu-item.vala new file mode 100644 index 0000000..e69de29 diff --git a/src/scrub-widget.c b/src/scrub-widget.c new file mode 100644 index 0000000..e69de29 diff --git a/src/scrub-widget.h b/src/scrub-widget.h new file mode 100644 index 0000000..e69de29 -- cgit v1.2.3 From 4325e0092d77cc2d993c7305c49d0517f3defb0e Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 13 Jul 2010 12:18:08 +0100 Subject: prep work done for scrub bar --- src/Makefile.am | 2 + src/common-defs.h | 17 ++++--- src/metadata-menu-item.vala | 10 ++-- src/metadata-widget.c | 12 ++--- src/mpris-controller.vala | 10 ++-- src/music-player-bridge.vala | 5 +- src/player-controller.vala | 19 ++++--- src/scrub-menu-item.vala | 43 ++++++++++++++++ src/scrub-widget.c | 117 +++++++++++++++++++++++++++++++++++++++++++ src/scrub-widget.h | 52 +++++++++++++++++++ src/sound-service.c | 4 +- src/title-menu-item.vala | 8 ++- src/title-widget.c | 5 +- vapi/common-defs.vapi | 15 ++++-- 14 files changed, 275 insertions(+), 44 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 79ba7d2..a02c5a4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -18,6 +18,7 @@ libsoundmenu_la_SOURCES = \ indicator-sound.c \ title-widget.c \ title-widget.h \ + scrub-widget.h \ dbus-shared-names.h \ sound-service-client.h @@ -58,6 +59,7 @@ music_bridge_VALASOURCES = \ music-player-bridge.vala \ transport-menu-item.vala \ metadata-menu-item.vala \ + scrub-menu-item.vala \ title-menu-item.vala \ player-controller.vala \ mpris-controller-v2.vala \ diff --git a/src/common-defs.h b/src/common-defs.h index 9c1fbab..3b54dd0 100644 --- a/src/common-defs.h +++ b/src/common-defs.h @@ -29,11 +29,16 @@ with this program. If not, see . #define DBUSMENU_TRANSPORT_MENUITEM_TYPE "x-canonical-transport-bar" #define DBUSMENU_TRANSPORT_MENUITEM_PLAY_STATE "x-canonical-transport-play-state" -#define DBUSMENU_METADATA_MENUITEM_TYPE "x-canonical-metadata-menu-item" -#define DBUSMENU_METADATA_MENUITEM_TEXT_ARTIST "x-canonical-metadata-text-artist" -#define DBUSMENU_METADATA_MENUITEM_TEXT_TITLE "x-canonical-metadata-text-title" -#define DBUSMENU_METADATA_MENUITEM_TEXT_ALBUM "x-canonical-metadata-text-album" -#define DBUSMENU_METADATA_MENUITEM_ARTURL "x-canonical-metadata-arturl" +#define DBUSMENU_METADATA_MENUITEM_TYPE "x-canonical-sound-menu-player-metadata-menu-item" +#define DBUSMENU_METADATA_MENUITEM_ARTIST "x-canonical-sound-menu-player-metadata-artist" +#define DBUSMENU_METADATA_MENUITEM_TITLE "x-canonical-sound-menu-player-metadata-title" +#define DBUSMENU_METADATA_MENUITEM_ALBUM "x-canonical-sound-menu-player-metadata-album" +#define DBUSMENU_METADATA_MENUITEM_ARTURL "x-canonical-sound-menu-player-metadata-arturl" #define DBUSMENU_TITLE_MENUITEM_TYPE "x-canonical-sound-menu-player-title-menu-item" -#define DBUSMENU_TITLE_MENUITEM_TEXT_NAME "x-canonical-sound-menu-player-title-name" +#define DBUSMENU_TITLE_MENUITEM_NAME "x-canonical-sound-menu-player-title-name" + +#define DBUSMENU_SCRUB_MENUITEM_TYPE "x-canonical-sound-menu-player-scrub-menu-item" +#define DBUSMENU_SCRUB_MENUITEM_DURATION "x-canonical-sound-menu-player-scrub-duration" +#define DBUSMENU_SCRUB_MENUITEM_POSITION "x-canonical-sound-menu-player-scrub-position" + diff --git a/src/metadata-menu-item.vala b/src/metadata-menu-item.vala index cfcb3bc..3af9ff1 100644 --- a/src/metadata-menu-item.vala +++ b/src/metadata-menu-item.vala @@ -31,17 +31,17 @@ public class MetadataMenuitem : PlayerItem public static HashSet attributes_format() { HashSet attrs = new HashSet(); - attrs.add(MENUITEM_TEXT_TITLE); - attrs.add(MENUITEM_TEXT_ARTIST); - attrs.add(MENUITEM_TEXT_ALBUM); + attrs.add(MENUITEM_TITLE); + attrs.add(MENUITEM_ARTIST); + attrs.add(MENUITEM_ALBUM); attrs.add(MENUITEM_ARTURL); return attrs; } public bool populated() { - return (this.property_get(MENUITEM_TEXT_TITLE) != null && - this.property_get(MENUITEM_TEXT_TITLE) != ""); + return (this.property_get(MENUITEM_TITLE) != null && + this.property_get(MENUITEM_TITLE) != ""); } } \ No newline at end of file diff --git a/src/metadata-widget.c b/src/metadata-widget.c index 8235725..dce9226 100644 --- a/src/metadata-widget.c +++ b/src/metadata-widget.c @@ -109,7 +109,7 @@ metadata_widget_init (MetadataWidget *self) // artist GtkWidget* artist; artist = gtk_label_new(dbusmenu_menuitem_property_get(twin_item, - DBUSMENU_METADATA_MENUITEM_TEXT_ARTIST)); + DBUSMENU_METADATA_MENUITEM_ARTIST)); gtk_misc_set_alignment(GTK_MISC(artist), (gfloat)0, (gfloat)0); gtk_label_set_width_chars(GTK_LABEL(artist), 15); @@ -121,7 +121,7 @@ metadata_widget_init (MetadataWidget *self) // piece GtkWidget* piece; piece = gtk_label_new(dbusmenu_menuitem_property_get(twin_item, - DBUSMENU_METADATA_MENUITEM_TEXT_TITLE)); + DBUSMENU_METADATA_MENUITEM_TITLE)); gtk_misc_set_alignment(GTK_MISC(piece), (gfloat)0, (gfloat)0); gtk_label_set_width_chars(GTK_LABEL(piece), 12); gtk_label_set_ellipsize(GTK_LABEL(piece), PANGO_ELLIPSIZE_MIDDLE); @@ -132,7 +132,7 @@ metadata_widget_init (MetadataWidget *self) // container GtkWidget* container; container = gtk_label_new(dbusmenu_menuitem_property_get(twin_item, - DBUSMENU_METADATA_MENUITEM_TEXT_ALBUM)); + DBUSMENU_METADATA_MENUITEM_ALBUM)); gtk_misc_set_alignment(GTK_MISC(container), (gfloat)0, (gfloat)0); gtk_label_set_width_chars(GTK_LABEL(container), 15); gtk_label_set_ellipsize(GTK_LABEL(container), PANGO_ELLIPSIZE_MIDDLE); @@ -202,15 +202,15 @@ metadata_widget_property_update(DbusmenuMenuitem* item, gchar* property, MetadataWidget* mitem = METADATA_WIDGET(userdata); MetadataWidgetPrivate * priv = METADATA_WIDGET_GET_PRIVATE(mitem); - if(g_ascii_strcasecmp(DBUSMENU_METADATA_MENUITEM_TEXT_ARTIST, property) == 0){ + if(g_ascii_strcasecmp(DBUSMENU_METADATA_MENUITEM_ARTIST, property) == 0){ gtk_label_set_text(GTK_LABEL(priv->artist_label), g_value_get_string(value)); style_artist_text(mitem); } - else if(g_ascii_strcasecmp(DBUSMENU_METADATA_MENUITEM_TEXT_TITLE, property) == 0){ + else if(g_ascii_strcasecmp(DBUSMENU_METADATA_MENUITEM_TITLE, property) == 0){ gtk_label_set_text(GTK_LABEL(priv->piece_label), g_value_get_string(value)); style_title_text(mitem); } - else if(g_ascii_strcasecmp(DBUSMENU_METADATA_MENUITEM_TEXT_ALBUM, property) == 0){ + else if(g_ascii_strcasecmp(DBUSMENU_METADATA_MENUITEM_ALBUM, property) == 0){ gtk_label_set_text(GTK_LABEL(priv->container_label), g_value_get_string(value)); style_album_text(mitem); } diff --git a/src/mpris-controller.vala b/src/mpris-controller.vala index 8dd0cc9..c3f21d8 100644 --- a/src/mpris-controller.vala +++ b/src/mpris-controller.vala @@ -56,8 +56,8 @@ public class MprisController : GLib.Object status st = this.mpris_player.GetStatus(); int play_state = st.playback; debug("GetStatusChange - play state %i", play_state); - (this.owner.custom_items[this.owner.TRANSPORT] as TransportMenuitem).change_play_state(play_state); - this.owner.custom_items[this.owner.METADATA].update(this.mpris_player.GetMetadata(), + (this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(play_state); + this.owner.custom_items[PlayerController.widget_order.METADATA].update(this.mpris_player.GetMetadata(), MetadataMenuitem.attributes_format()); } @@ -66,8 +66,8 @@ public class MprisController : GLib.Object private void onTrackChange(dynamic DBus.Object mpris_client, HashTable ht) { debug("onTrackChange"); - this.owner.custom_items[this.owner.METADATA].reset(MetadataMenuitem.attributes_format()); - this.owner.custom_items[this.owner.METADATA].update(ht, + this.owner.custom_items[PlayerController.widget_order.METADATA].reset(MetadataMenuitem.attributes_format()); + this.owner.custom_items[PlayerController.widget_order.METADATA].update(ht, MetadataMenuitem.attributes_format()); } @@ -117,7 +117,7 @@ public class MprisController : GLib.Object Value v = Value(typeof(int)); v.set_int(play_state); ht.insert("state", v); - this.owner.custom_items[this.owner.TRANSPORT].update(ht, TransportMenuitem.attributes_format()); + this.owner.custom_items[PlayerController.widget_order.TRANSPORT].update(ht, TransportMenuitem.attributes_format()); } diff --git a/src/music-player-bridge.vala b/src/music-player-bridge.vala index 2f87b2d..3ee7b55 100644 --- a/src/music-player-bridge.vala +++ b/src/music-player-bridge.vala @@ -77,7 +77,7 @@ public class MusicPlayerBridge : GLib.Object return 2; } else{ - return (2 + (this.registered_clients.size * 4)); + return (2 + (this.registered_clients.size * PlayerController.WIDGET_QUANTITY)); } } @@ -93,9 +93,8 @@ public class MusicPlayerBridge : GLib.Object this.registered_clients[client_name].update_state(PlayerController.state.READY); this.registered_clients[client_name].activate(); } - //else init a new one else{ - + //else init a new one PlayerController ctrl = new PlayerController(root_menu, client_name, calculate_menu_position(), diff --git a/src/player-controller.vala b/src/player-controller.vala index d272d14..db81ee2 100644 --- a/src/player-controller.vala +++ b/src/player-controller.vala @@ -23,8 +23,16 @@ using Gee; public class PlayerController : GLib.Object { - public const int METADATA = 2; - private const int TRANSPORT = 3; + public const int WIDGET_QUANTITY = 4;//for now //5; + + public static enum widget_order{ + SEPARATOR, + TITLE, + METADATA, + TRANSPORT + } + //public const int METADATA = 2; + //private const int TRANSPORT = 3; public enum state{ OFFLINE, @@ -51,7 +59,6 @@ public class PlayerController : GLib.Object this.custom_items = new ArrayList(); this.update_state(initial_state); this.menu_offset = offset; - debug("offset = %i", offset); construct_widgets(); establish_mpris_connection(); update_layout(); @@ -66,7 +73,7 @@ public class PlayerController : GLib.Object public void activate() { this.establish_mpris_connection(); - this.custom_items[METADATA].property_set_bool(MENUITEM_PROP_VISIBLE, true); + this.custom_items[widget_order.METADATA].property_set_bool(MENUITEM_PROP_VISIBLE, true); } /* @@ -126,8 +133,8 @@ public class PlayerController : GLib.Object visibility = false; } debug("about the set the visibility on both the transport and metadata widget to %s", visibility.to_string()); - this.custom_items[TRANSPORT].property_set_bool(MENUITEM_PROP_VISIBLE, visibility); - this.custom_items[METADATA].property_set_bool(MENUITEM_PROP_VISIBLE, visibility); + this.custom_items[widget_order.TRANSPORT].property_set_bool(MENUITEM_PROP_VISIBLE, visibility); + this.custom_items[widget_order.METADATA].property_set_bool(MENUITEM_PROP_VISIBLE, visibility); // DEBUG if(this.mpris_adaptor == null){ warning("Why is the mpris object null"); diff --git a/src/scrub-menu-item.vala b/src/scrub-menu-item.vala index e69de29..409494a 100644 --- a/src/scrub-menu-item.vala +++ b/src/scrub-menu-item.vala @@ -0,0 +1,43 @@ +/* +Copyright 2010 Canonical Ltd. + +Authors: + Conor Curran + +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 +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see . +*/ + +using Dbusmenu; +using DbusmenuScrub; +using Gee; + +public class ScrubMenuitem : PlayerItem +{ + public ScrubMenuitem(PlayerController parent) + { + Object(item_type: MENUITEM_TYPE); + } + + public override void handle_event(string name, GLib.Value input_value, uint timestamp) + { + debug("handle_event for owner %s with owner state = %i", this.owner.name, this.owner.current_state); + } + + public static HashSet attributes_format() + { + HashSet attrs = new HashSet(); + attrs.add(MENUITEM_DURATION); + attrs.add(MENUITEM_POSITION); + return attrs; + } +} \ No newline at end of file diff --git a/src/scrub-widget.c b/src/scrub-widget.c index e69de29..f5e1eda 100644 --- a/src/scrub-widget.c +++ b/src/scrub-widget.c @@ -0,0 +1,117 @@ +/* +Copyright 2010 Canonical Ltd. + +Authors: + Conor Curran + +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 +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see . +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "scrub-widget.h" +#include "common-defs.h" + + +typedef struct _ScrubWidgetPrivate ScrubWidgetPrivate; + +struct _ScrubWidgetPrivate +{ + DbusmenuMenuitem* twin_item; +}; + +#define SCRUB_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SCRUB_WIDGET_TYPE, ScrubWidgetPrivate)) + +/* Prototypes */ +static void scrub_widget_class_init (ScrubWidgetClass *klass); +static void scrub_widget_init (ScrubWidget *self); +static void scrub_widget_dispose (GObject *object); +static void scrub_widget_finalize (GObject *object); + +static void scrub_widget_property_update(DbusmenuMenuitem* item, gchar* property, + GValue* value, gpointer userdata); +static void scrub_widget_set_twin_item( ScrubWidget* self, + DbusmenuMenuitem* twin_item); + +G_DEFINE_TYPE (ScrubWidget, scrub_widget, G_TYPE_OBJECT); + +static void +scrub_widget_class_init (ScrubWidgetClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (ScrubWidgetPrivate)); + + gobject_class->dispose = scrub_widget_dispose; + gobject_class->finalize = scrub_widget_finalize; +} + +static void +scrub_widget_init (ScrubWidget *self) +{ + g_debug("ScrubWidget::scrub_widget_init"); + //ScrubWidgetPrivate * priv = SCRUB_WIDGET_GET_PRIVATE(self); +} + +static void +scrub_widget_dispose (GObject *object) +{ + G_OBJECT_CLASS (scrub_widget_parent_class)->dispose (object); +} + +static void +scrub_widget_finalize (GObject *object) +{ + G_OBJECT_CLASS (scrub_widget_parent_class)->finalize (object); +} + +static void +scrub_widget_property_update(DbusmenuMenuitem* item, gchar* property, + GValue* value, gpointer userdata) +{ + g_return_if_fail (IS_SCRUB_WIDGET (userdata)); + //ScrubWidget* mitem = SCRUB_WIDGET(userdata); + //ScrubWidgetPrivate * priv = SCRUB_WIDGET_GET_PRIVATE(mitem); + + if(g_ascii_strcasecmp(DBUSMENU_SCRUB_MENUITEM_DURATION, property) == 0){ + } + else if(g_ascii_strcasecmp(DBUSMENU_SCRUB_MENUITEM_POSITION, property) == 0){ + } +} + +static void +scrub_widget_set_twin_item(ScrubWidget* self, + DbusmenuMenuitem* twin_item) +{ + ScrubWidgetPrivate * priv = SCRUB_WIDGET_GET_PRIVATE(self); + priv->twin_item = twin_item; + + g_signal_connect(G_OBJECT(twin_item), "property-changed", + G_CALLBACK(scrub_widget_property_update), self); +} + + /** + * scrub_widget_new: + * @returns: a new #ScrubWidget. + **/ +GtkWidget* +scrub_widget_new(DbusmenuMenuitem *item) +{ + GtkWidget* widget = g_object_new(SCRUB_WIDGET_TYPE, NULL); + scrub_widget_set_twin_item((ScrubWidget*)widget, item); + return widget; +} + diff --git a/src/scrub-widget.h b/src/scrub-widget.h index e69de29..2b72c74 100644 --- a/src/scrub-widget.h +++ b/src/scrub-widget.h @@ -0,0 +1,52 @@ +s/* +Copyright 2010 Canonical Ltd. + +Authors: + Conor Curran + +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 +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see . +*/ +#ifndef __SCRUB_WIDGET_H__ +#define __SCRUB_WIDGET_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define SCRUB_WIDGET_TYPE (scrub_widget_get_type ()) +#define SCRUB_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SCRUB_WIDGET_TYPE, ScrubWidget)) +#define SCRUB_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SCRUB_WIDGET_TYPE, ScrubWidgetClass)) +#define IS_SCRUB_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SCRUB_WIDGET_TYPE)) +#define IS_SCRUB_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SCRUB_WIDGET_TYPE)) +#define SCRUB_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SCRUB_WIDGET_TYPE, ScrubWidgetClass)) + +typedef struct _ScrubWidget ScrubWidget; +typedef struct _ScrubWidgetClass ScrubWidgetClass; + +struct _ScrubWidgetClass { + GObjectClass parent_class; +}; + +struct _ScrubWidget { + GObject parent; +}; + +GType scrub_widget_get_type (void) G_GNUC_CONST; +GtkWidget* scrub_widget_new(DbusmenuMenuitem *twin_item); + +G_END_DECLS + +#endif + diff --git a/src/sound-service.c b/src/sound-service.c index 8f4e941..a5f3941 100644 --- a/src/sound-service.c +++ b/src/sound-service.c @@ -43,8 +43,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-menu-item.vala b/src/title-menu-item.vala index 8183821..d7e16df 100644 --- a/src/title-menu-item.vala +++ b/src/title-menu-item.vala @@ -26,13 +26,11 @@ public class TitleMenuitem : PlayerItem public TitleMenuitem(PlayerController parent) { Object(item_type: MENUITEM_TYPE, owner: parent); - this.property_set(MENUITEM_TEXT_NAME, parent.name); + this.property_set(MENUITEM_NAME, parent.name); } public override void handle_event(string name, GLib.Value input_value, uint timestamp) - { - debug("handle_event for owner %s with owner state = %i and title menu name %s", this.owner.name, this.owner.current_state, property_get(MENUITEM_TEXT_NAME)); - + { if(this.owner.current_state == PlayerController.state.OFFLINE) { this.owner.instantiate(); @@ -43,7 +41,7 @@ public class TitleMenuitem : PlayerItem public static HashSet attributes_format() { HashSet attrs = new HashSet(); - attrs.add(MENUITEM_TEXT_NAME); + attrs.add(MENUITEM_NAME); return attrs; } } \ No newline at end of file diff --git a/src/title-widget.c b/src/title-widget.c index 7e48940..5de2fb8 100644 --- a/src/title-widget.c +++ b/src/title-widget.c @@ -23,6 +23,7 @@ with this program. If not, see . #include #include "title-widget.h" +#include "scrub-widget.h" #include "common-defs.h" #include #include @@ -152,7 +153,7 @@ title_widget_property_update(DbusmenuMenuitem* item, gchar* property, TitleWidget* mitem = TITLE_WIDGET(userdata); TitleWidgetPrivate * priv = TITLE_WIDGET_GET_PRIVATE(mitem); - if(g_ascii_strcasecmp(DBUSMENU_TITLE_MENUITEM_TEXT_NAME, property) == 0){ + if(g_ascii_strcasecmp(DBUSMENU_TITLE_MENUITEM_NAME, property) == 0){ gtk_label_set_text(GTK_LABEL(priv->name), g_value_get_string(value)); title_widget_style_name_text(mitem); } @@ -167,7 +168,7 @@ title_widget_set_twin_item(TitleWidget* self, g_signal_connect(G_OBJECT(twin_item), "property-changed", G_CALLBACK(title_widget_property_update), self); priv->name = gtk_label_new(dbusmenu_menuitem_property_get(priv->twin_item, - DBUSMENU_TITLE_MENUITEM_TEXT_NAME)); + DBUSMENU_TITLE_MENUITEM_NAME)); gtk_misc_set_padding(GTK_MISC(priv->name), 10, 0); gtk_box_pack_start (GTK_BOX (priv->hbox), priv->name, FALSE, FALSE, 0); diff --git a/vapi/common-defs.vapi b/vapi/common-defs.vapi index 6649b26..24344ce 100644 --- a/vapi/common-defs.vapi +++ b/vapi/common-defs.vapi @@ -20,9 +20,9 @@ with this program. If not, see . [CCode (cheader_filename = "common-defs.h")] namespace DbusmenuMetadata{ public const string MENUITEM_TYPE; - public const string MENUITEM_TEXT_ARTIST; - public const string MENUITEM_TEXT_TITLE; - public const string MENUITEM_TEXT_ALBUM; + public const string MENUITEM_ARTIST; + public const string MENUITEM_TITLE; + public const string MENUITEM_ALBUM; public const string MENUITEM_ARTURL; } @@ -35,5 +35,12 @@ namespace DbusmenuTransport{ [CCode (cheader_filename = "common-defs.h")] namespace DbusmenuTitle{ public const string MENUITEM_TYPE; - public const string MENUITEM_TEXT_NAME; + public const string MENUITEM_NAME; +} + +[CCode (cheader_filename = "common-defs.h")] +namespace DbusmenuScrub{ + public const string MENUITEM_TYPE; + public const string MENUITEM_POSITION; + public const string MENUITEM_DURATION; } \ No newline at end of file -- cgit v1.2.3 From 07a314b698c43f47d706a1b87b8101a2f6edc4db Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 13 Jul 2010 13:52:04 +0100 Subject: typo fixed --- src/Makefile.am | 1 + src/scrub-widget.c | 1 - src/scrub-widget.h | 4 ++-- src/sound-service-dbus.h | 1 - src/title-widget.c | 1 - 5 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index a02c5a4..ed3e394 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -18,6 +18,7 @@ libsoundmenu_la_SOURCES = \ indicator-sound.c \ title-widget.c \ title-widget.h \ + scrub-widget.c \ scrub-widget.h \ dbus-shared-names.h \ sound-service-client.h diff --git a/src/scrub-widget.c b/src/scrub-widget.c index f5e1eda..748cd19 100644 --- a/src/scrub-widget.c +++ b/src/scrub-widget.c @@ -25,7 +25,6 @@ with this program. If not, see . #include "scrub-widget.h" #include "common-defs.h" - typedef struct _ScrubWidgetPrivate ScrubWidgetPrivate; struct _ScrubWidgetPrivate diff --git a/src/scrub-widget.h b/src/scrub-widget.h index 2b72c74..32455e3 100644 --- a/src/scrub-widget.h +++ b/src/scrub-widget.h @@ -1,4 +1,4 @@ -s/* +/* Copyright 2010 Canonical Ltd. Authors: @@ -44,7 +44,7 @@ struct _ScrubWidget { }; GType scrub_widget_get_type (void) G_GNUC_CONST; -GtkWidget* scrub_widget_new(DbusmenuMenuitem *twin_item); +GtkWidget* scrub_widget_new(DbusmenuMenuitem* twin_item); G_END_DECLS diff --git a/src/sound-service-dbus.h b/src/sound-service-dbus.h index 258b610..72556ad 100644 --- a/src/sound-service-dbus.h +++ b/src/sound-service-dbus.h @@ -33,7 +33,6 @@ G_BEGIN_DECLS #define IS_SOUND_SERVICE_DBUS_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), SOUND_SERVICE_DBUS_TYPE)) #define SOUND_SERVICE_DBUS_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), SOUND_SERVICE_DBUS_TYPE, SoundServiceDbusClass)) - typedef struct _SoundServiceDbus SoundServiceDbus; typedef struct _SoundServiceDbusClass SoundServiceDbusClass; typedef struct _SoundData SoundData; diff --git a/src/title-widget.c b/src/title-widget.c index 5de2fb8..8037eb7 100644 --- a/src/title-widget.c +++ b/src/title-widget.c @@ -23,7 +23,6 @@ with this program. If not, see . #include #include "title-widget.h" -#include "scrub-widget.h" #include "common-defs.h" #include #include -- cgit v1.2.3 From ec287ed34db17df23ab16d9199fbbb48bd6b246f Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 13 Jul 2010 14:06:55 +0100 Subject: fixed silly previous problem --- src/play-button.c | 2 +- src/sound-service.c | 4 ++-- src/transport-widget.c | 13 +++++++------ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/play-button.c b/src/play-button.c index d6d243c..f712209 100644 --- a/src/play-button.c +++ b/src/play-button.c @@ -361,7 +361,7 @@ determine_button_event(GtkWidget* button, GdkEventButton* event) { g_debug("event x coordinate = %f", event->x); g_debug("event y coordinate = %f", event->y); - gint result = 0; + gint result = -1; // For now very simple rectangular collision detection if(event->x > 55 && event->x < 95 && event->y > 22 && event->y < 46){ diff --git a/src/sound-service.c b/src/sound-service.c index 8f4e941..a5f3941 100644 --- a/src/sound-service.c +++ b/src/sound-service.c @@ -43,8 +43,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 f02200e..9450ea5 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -149,12 +149,13 @@ transport_widget_button_press_event (GtkWidget *menuitem, gint result = determine_button_event(priv->play_button, event); - GValue value = {0}; - g_value_init(&value, G_TYPE_INT); - g_debug("TransportWidget::menu_press_event - going to send value %i", result); - g_value_set_int(&value, result); - dbusmenu_menuitem_handle_event (priv->twin_item, "Transport state change", &value, 0); - + if(result >= 0){ + GValue value = {0}; + g_value_init(&value, G_TYPE_INT); + g_debug("TransportWidget::menu_press_event - going to send value %i", result); + g_value_set_int(&value, result); + dbusmenu_menuitem_handle_event (priv->twin_item, "Transport state change", &value, 0); + } return TRUE; } -- cgit v1.2.3 From 3866f14c102eec187e6fddbb7cf470df148053a3 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 13 Jul 2010 17:31:19 +0100 Subject: button press background done --- src/play-button.c | 114 ++++++++++++++++++++++++++++++++++++++++--------- src/play-button.h | 2 + src/transport-widget.c | 11 +++-- 3 files changed, 102 insertions(+), 25 deletions(-) diff --git a/src/play-button.c b/src/play-button.c index f712209..0d3b1f3 100644 --- a/src/play-button.c +++ b/src/play-button.c @@ -60,6 +60,8 @@ enum { NEXT }; +static const gint NO_COMMAND = -1; + typedef struct _PlayButtonPrivate PlayButtonPrivate; struct _PlayButtonPrivate @@ -69,6 +71,7 @@ struct _PlayButtonPrivate GdkColor background_colour_bg_light; GdkColor foreground_colour_fg; GdkColor foreground_colour_bg; + gint current_command; }; #define PLAY_BUTTON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PLAY_BUTTON_TYPE, PlayButtonPrivate)) @@ -324,6 +327,8 @@ play_button_class_init (PlayButtonClass *klass) static void play_button_init (PlayButton *self) { + PlayButtonPrivate* priv = PLAY_BUTTON_GET_PRIVATE(self); + priv->current_command = NO_COMMAND; gtk_widget_set_size_request(GTK_WIDGET(self), 200, 80); } @@ -361,7 +366,8 @@ determine_button_event(GtkWidget* button, GdkEventButton* event) { g_debug("event x coordinate = %f", event->x); g_debug("event y coordinate = %f", event->y); - gint result = -1; + gint result = NO_COMMAND; + // For now very simple rectangular collision detection if(event->x > 55 && event->x < 95 && event->y > 22 && event->y < 46){ @@ -379,6 +385,45 @@ determine_button_event(GtkWidget* button, GdkEventButton* event) return result; } +void +play_button_react_to_button_press(GtkWidget* button, gint command) +{ + g_return_if_fail(IS_PLAY_BUTTON(button)); + PlayButtonPrivate* priv = PLAY_BUTTON_GET_PRIVATE(button); + priv->current_command = command; + + cairo_t *cr; + cr = gdk_cairo_create (button->window); + + + /*cairo_rectangle (cr, + event->area.x, event->area.y, + event->area.width, event->area.height); + + cairo_clip(cr);*/ + draw (button, cr); + cairo_destroy (cr); +} + + +void +play_button_react_to_button_release(GtkWidget* button) +{ + g_return_if_fail(IS_PLAY_BUTTON(button)); + PlayButtonPrivate* priv = PLAY_BUTTON_GET_PRIVATE(button); + priv->current_command = NO_COMMAND; + cairo_t *cr; + cr = gdk_cairo_create (button->window); + /*cairo_rectangle (cr, + event->area.x, event->area.y, + event->area.width, event->area.height); + + cairo_clip(cr);*/ + draw (button, cr); + cairo_destroy (cr); + +} + void play_button_set_style(GtkWidget* button, GtkStyle* style) { @@ -615,6 +660,9 @@ _finalize (cairo_t* cr, static void draw (GtkWidget* button, cairo_t *cr) { + g_return_if_fail(IS_PLAY_BUTTON(button)); + PlayButtonPrivate* priv = PLAY_BUTTON_GET_PRIVATE(button); + cairo_surface_t* surf = NULL; cairo_t* cr_surf = NULL; @@ -627,7 +675,8 @@ draw (GtkWidget* button, cairo_t *cr) double BUTTON_START[] = {252.0f / 255.0f, 251.0f / 255.0f, 251.0f / 255.0f,1.0f}; double BUTTON_END[] = {186.0f / 255.0f,180.0f / 255.0f, 170.0f / 255.0f, 1.0f}; double BUTTON_SHADOW[] = {0.0f / 255.0f, 0.0f / 255.0f, 0.0f / 255.0f, 0.75f}; - + double INNER_COMPRESSED_END[] = {61.0f / 255.0f, 60.0f / 255.0f, 57.0f / 255.0f, 1.0f}; + double INNER_COMPRESSED_START[] = {36.0f / 255.0f, 35.0f / 255.0f, 33.0f / 255.0f, 1.0f}; // prev/next-background draw_gradient (cr, @@ -644,13 +693,32 @@ draw (GtkWidget* button, cairo_t *cr) MIDDLE_RADIUS, MIDDLE_START, MIDDLE_END); - draw_gradient (cr, - X, - Y + 2, - RECT_WIDTH - 4, - INNER_RADIUS, - INNER_START, - INNER_END); + draw_gradient (cr, + X, + Y + 2, + RECT_WIDTH - 4, + INNER_RADIUS, + INNER_START, + INNER_END); + + if(priv->current_command == PREVIOUS){ + draw_gradient (cr, + X, + Y + 2, + RECT_WIDTH/2, + INNER_RADIUS, + INNER_COMPRESSED_START, + INNER_COMPRESSED_END); + } + else if(priv->current_command == NEXT){ + draw_gradient (cr, + RECT_WIDTH / 2 + X, + Y + 2, + (RECT_WIDTH - 7)/2, + INNER_RADIUS, + INNER_COMPRESSED_START, + INNER_COMPRESSED_END); + } // play/pause-background draw_circle (cr, @@ -670,7 +738,16 @@ draw (GtkWidget* button, cairo_t *cr) Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) + 2.0f, CIRCLE_RADIUS - 2.0f, INNER_START, - INNER_END); + INNER_END); + if(priv->current_command == PLAY_PAUSE){ + draw_circle (cr, + X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 4.5f + 2.0f, + Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) + 2.0f, + CIRCLE_RADIUS - 2.0f, + INNER_COMPRESSED_START, + INNER_COMPRESSED_END); + } + // draw previous-button drop-shadow _setup (&cr_surf, &surf, PREV_WIDTH, PREV_HEIGHT); @@ -700,13 +777,13 @@ draw (GtkWidget* button, cairo_t *cr) 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 @@ -791,8 +868,7 @@ draw (GtkWidget* button, cairo_t *cr) **/ GtkWidget* play_button_new() -{ - +{ GtkWidget* widget = g_object_new(PLAY_BUTTON_TYPE, NULL); gtk_widget_set_app_paintable (widget, TRUE); return widget; diff --git a/src/play-button.h b/src/play-button.h index 3eaabcc..37b3624 100644 --- a/src/play-button.h +++ b/src/play-button.h @@ -44,6 +44,8 @@ struct _PlayButton { GType play_button_get_type (void); void play_button_set_style(GtkWidget* button, GtkStyle* style); gint determine_button_event(GtkWidget* button, GdkEventButton* event); +void play_button_react_to_button_press(GtkWidget* button, gint command); +void play_button_react_to_button_release(GtkWidget* button); GtkWidget* play_button_new(); diff --git a/src/transport-widget.c b/src/transport-widget.c index 9450ea5..da4f7ad 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -137,9 +137,7 @@ static gboolean transport_widget_button_press_event (GtkWidget *menuitem, GdkEventButton *event) { - if(IS_TRANSPORT_WIDGET(menuitem) == FALSE){ - return FALSE; - } + g_return_val_if_fail(IS_TRANSPORT_WIDGET(menuitem), FALSE); TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE(TRANSPORT_WIDGET(menuitem)); @@ -155,6 +153,7 @@ transport_widget_button_press_event (GtkWidget *menuitem, g_debug("TransportWidget::menu_press_event - going to send value %i", result); g_value_set_int(&value, result); dbusmenu_menuitem_handle_event (priv->twin_item, "Transport state change", &value, 0); + play_button_react_to_button_press(priv->play_button, result); } return TRUE; } @@ -165,9 +164,9 @@ transport_widget_button_release_event (GtkWidget *menuitem, GdkEventButton *event) { g_debug("TransportWidget::menu_release_event"); - if(IS_TRANSPORT_WIDGET(menuitem) == FALSE){ - return FALSE; - } + g_return_val_if_fail(IS_TRANSPORT_WIDGET(menuitem), FALSE); + TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE(TRANSPORT_WIDGET(menuitem)); + play_button_react_to_button_release(priv->play_button); return TRUE; } -- cgit v1.2.3 From 858c43dbd4be74c8979bc778b83a1642784a7e02 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 13 Jul 2010 18:12:45 +0100 Subject: moving towards the play button pause button swap --- src/play-button.c | 8 +++++++- src/play-button.h | 1 + src/transport-widget.c | 11 ++++++----- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/play-button.c b/src/play-button.c index 0d3b1f3..bcb46f0 100644 --- a/src/play-button.c +++ b/src/play-button.c @@ -53,13 +53,19 @@ Uses code from ctk #define PAUSE_X 77.0f #define PAUSE_Y 15.0f -// Transport events +// Transport Manual events enum { PREVIOUS, PLAY_PAUSE, NEXT }; +// Transport updates +enum{ + PAUSE, + PLAY +}; + static const gint NO_COMMAND = -1; typedef struct _PlayButtonPrivate PlayButtonPrivate; diff --git a/src/play-button.h b/src/play-button.h index 37b3624..e82d59c 100644 --- a/src/play-button.h +++ b/src/play-button.h @@ -46,6 +46,7 @@ void play_button_set_style(GtkWidget* button, GtkStyle* style); gint determine_button_event(GtkWidget* button, GdkEventButton* event); void play_button_react_to_button_press(GtkWidget* button, gint command); void play_button_react_to_button_release(GtkWidget* button); +void play_button_toggle_play_pause(GtkWidget* button, int update); GtkWidget* play_button_new(); diff --git a/src/transport-widget.c b/src/transport-widget.c index da4f7ad..17dfee1 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -180,12 +180,13 @@ transport_widget_property_update(DbusmenuMenuitem* item, gchar* property, GValue* value, gpointer userdata) { g_debug("transport_widget_update_state - with property %s", property); - //int update_value = g_value_get_int(value); - //g_debug("transport_widget_update_state - with value %i", update_value); - - //TransportWidget* bar = (TransportWidget*)userdata; - //TransportWidgetPrivate *priv = TRANSPORT_WIDGET_GET_PRIVATE(bar); + TransportWidget* bar = (TransportWidget*)userdata; + g_return_val_if_fail(IS_TRANSPORT_WIDGET(bar), FALSE); + TransportWidgetPrivate *priv = TRANSPORT_WIDGET_GET_PRIVATE(bar); + int update_value = g_value_get_int(value); + g_debug("transport_widget_update_state - with value %i", update_value); + play_button_toggle_play_pause(priv->play_button, update_value); } /** -- cgit v1.2.3 From bf4f73249f5b6bf4c9196f251382c5a6cec9634f Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 14 Jul 2010 18:03:32 +0100 Subject: scrub bar almost working - vala Glib value bugs again are biting me --- configure.ac | 2 +- src/indicator-sound.c | 29 ++++++++++++++- src/mpris-controller.vala | 19 ++++++++-- src/player-controller.vala | 18 +++++---- src/player-item.vala | 4 +- src/scrub-menu-item.vala | 6 ++- src/scrub-widget.c | 92 +++++++++++++++++++++++++++++++++++++++++----- src/scrub-widget.h | 1 + 8 files changed, 145 insertions(+), 26 deletions(-) diff --git a/configure.ac b/configure.ac index 0a41bc5..8aeb96d 100644 --- a/configure.ac +++ b/configure.ac @@ -33,7 +33,7 @@ INDICATOR_REQUIRED_VERSION=0.3.6 DBUSMENUGTK_REQUIRED_VERSION=0.2.2 POLKIT_REQUIRED_VERSION=0.92 PULSE_AUDIO_REQUIRED_VERSION=0.9.19 -INDICATOR_DISPLAY_OBJECTS=0.1.4 +INDICATOR_DISPLAY_OBJECTS=0.1.8 INDICATE_REQUIRED_VERSION=0.4.1 DBUSMENUGLIB_REQUIRED_VERSION=0.3.1 diff --git a/src/indicator-sound.c b/src/indicator-sound.c index a2d9762..e18125a 100644 --- a/src/indicator-sound.c +++ b/src/indicator-sound.c @@ -41,6 +41,7 @@ with this program. If not, see . #include "transport-widget.h" #include "metadata-widget.h" #include "title-widget.h" +#include "scrub-widget.h" #include "dbus-shared-names.h" #include "sound-service-client.h" #include "common-defs.h" @@ -94,10 +95,11 @@ static void slider_grabbed(GtkWidget *widget, gpointer user_data); static void slider_released(GtkWidget *widget, gpointer user_data); static void style_changed_cb(GtkWidget *widget, gpointer user_data); -//player widgets related +//player widget realisation methods static gboolean new_transport_widget(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); static gboolean new_metadata_widget(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); static gboolean new_title_widget(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); +static gboolean new_scrub_bar_widget(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); // DBUS communication static DBusGProxy *sound_dbus_proxy = NULL; @@ -246,7 +248,9 @@ get_menu (IndicatorObject * io) dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(client), DBUSMENU_TRANSPORT_MENUITEM_TYPE, new_transport_widget); dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(client), DBUSMENU_METADATA_MENUITEM_TYPE, new_metadata_widget); 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. + dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(client), DBUSMENU_SCRUB_MENUITEM_TYPE, new_scrub_bar_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), NULL); return GTK_MENU(menu); } @@ -274,6 +278,7 @@ new_slider_item(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuC io = g_object_get_data (G_OBJECT (client), "indicator"); volume_slider = ido_scale_menu_item_new_with_range ("Volume", initial_volume_percent, 0, 100, 1); + ido_scale_menu_item_set_style (IDO_SCALE_MENU_ITEM (volume_slider), IDO_SCALE_MENU_ITEM_STYLE_IMAGE); g_object_set(volume_slider, "reverse-scroll-events", TRUE, NULL); g_signal_connect (volume_slider, @@ -373,6 +378,26 @@ new_title_widget(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbusmenu return TRUE; } +static gboolean +new_scrub_bar_widget(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client) +{ + g_debug("indicator-sound: new_scrub_bar_widget"); + + GtkWidget* scrub_bar = NULL; + + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(newitem), FALSE); + g_return_val_if_fail(DBUSMENU_IS_GTKCLIENT(client), FALSE); + + scrub_bar = scrub_widget_new (newitem); + GtkMenuItem *menu_scrub_widget = GTK_MENU_ITEM(scrub_widget_get_ido_bar(SCRUB_WIDGET(scrub_bar))); + + gtk_widget_show_all(scrub_widget_get_ido_bar(SCRUB_WIDGET(scrub_bar))); + + dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, menu_scrub_widget, parent); + + return TRUE; +} + static void connection_changed (IndicatorServiceManager * sm, gboolean connected, gpointer userdata) diff --git a/src/mpris-controller.vala b/src/mpris-controller.vala index c3f21d8..afe9190 100644 --- a/src/mpris-controller.vala +++ b/src/mpris-controller.vala @@ -71,10 +71,6 @@ public class MprisController : GLib.Object MetadataMenuitem.attributes_format()); } - /** - * TRUE => Playing - * FALSE => Paused - **/ public void transport_event(TransportMenuitem.action command) { debug("transport_event input = %i", (int)command); @@ -101,6 +97,21 @@ public class MprisController : GLib.Object } } + public void set_position(double position) + { + debug("Set position with pos (0-100) %f", position); + HashTable data = this.mpris_player.GetMetadata(); + Value? time_value = data.lookup("time"); + if(time_value == null){ + warning("Can't fetch the duration of the track therefore cant set the position"); + return; + } + uint32 total_time = time_value.get_uint32(); + debug("total time of track = %i", (int)total_time); + double new_time_position = total_time * position/100.0; + this.mpris_player.SetPosition((int)(new_time_position * 1000)); + } + public bool connected() { return (this.mpris_player != null); diff --git a/src/player-controller.vala b/src/player-controller.vala index db81ee2..48416b9 100644 --- a/src/player-controller.vala +++ b/src/player-controller.vala @@ -23,16 +23,15 @@ using Gee; public class PlayerController : GLib.Object { - public const int WIDGET_QUANTITY = 4;//for now //5; + public const int WIDGET_QUANTITY = 5; public static enum widget_order{ SEPARATOR, TITLE, METADATA, + SCRUB, TRANSPORT } - //public const int METADATA = 2; - //private const int TRANSPORT = 3; public enum state{ OFFLINE, @@ -134,14 +133,14 @@ public class PlayerController : GLib.Object } debug("about the set the visibility on both the transport and metadata widget to %s", visibility.to_string()); this.custom_items[widget_order.TRANSPORT].property_set_bool(MENUITEM_PROP_VISIBLE, visibility); - this.custom_items[widget_order.METADATA].property_set_bool(MENUITEM_PROP_VISIBLE, visibility); + this.custom_items[widget_order.SCRUB].property_set_bool(MENUITEM_PROP_VISIBLE, visibility); + this.custom_items[widget_order.METADATA].property_set_bool(MENUITEM_PROP_VISIBLE, visibility); // DEBUG if(this.mpris_adaptor == null){ warning("Why is the mpris object null"); } } - - + private void construct_widgets() { // Separator item @@ -154,11 +153,16 @@ public class PlayerController : GLib.Object // Metadata item MetadataMenuitem metadata_item = new MetadataMenuitem(); this.custom_items.add(metadata_item); - + + // Scrub item + ScrubMenuitem scrub_item = new ScrubMenuitem(this); + this.custom_items.add(scrub_item); + // Transport item TransportMenuitem transport_item = new TransportMenuitem(this); this.custom_items.add(transport_item); + foreach(PlayerItem item in this.custom_items){ root_menu.child_add_position(item, this.menu_offset + this.custom_items.index_of(item)); } diff --git a/src/player-item.vala b/src/player-item.vala index 3e10b7b..e7f7c67 100644 --- a/src/player-item.vala +++ b/src/player-item.vala @@ -47,7 +47,8 @@ public class PlayerItem : Dbusmenu.Menuitem if(ensure_valid_updates(data, attributes) == false){ debug("PlayerItem::Update -> The hashtable update does not contain what we were expecting - just leave it!"); return; - } + } + foreach(string property in attributes){ string[] input_keys = property.split("-"); string search_key = input_keys[input_keys.length-1 : input_keys.length][0]; @@ -57,6 +58,7 @@ public class PlayerItem : Dbusmenu.Menuitem if (v.holds (typeof (string))){ string update = v.get_string().strip(); debug("with value : %s", update); + // Special case for the arturl URI's. if(property.contains("arturl")){ try{ update = Filename.from_uri(update.strip()); diff --git a/src/scrub-menu-item.vala b/src/scrub-menu-item.vala index 409494a..9988378 100644 --- a/src/scrub-menu-item.vala +++ b/src/scrub-menu-item.vala @@ -25,12 +25,14 @@ public class ScrubMenuitem : PlayerItem { public ScrubMenuitem(PlayerController parent) { - Object(item_type: MENUITEM_TYPE); + debug("Transport object constructor - service side"); + Object(item_type: MENUITEM_TYPE, owner: parent); } public override void handle_event(string name, GLib.Value input_value, uint timestamp) { - debug("handle_event for owner %s with owner state = %i", this.owner.name, this.owner.current_state); + debug("handle_event for owner %s with value: %f", this.owner.name, input_value.get_double()); + this.owner.mpris_adaptor.set_position(input_value.get_double()); } public static HashSet attributes_format() diff --git a/src/scrub-widget.c b/src/scrub-widget.c index 748cd19..4595ede 100644 --- a/src/scrub-widget.c +++ b/src/scrub-widget.c @@ -24,12 +24,15 @@ with this program. If not, see . #include #include "scrub-widget.h" #include "common-defs.h" +#include typedef struct _ScrubWidgetPrivate ScrubWidgetPrivate; struct _ScrubWidgetPrivate { DbusmenuMenuitem* twin_item; + GtkWidget* ido_scrub_bar; + GtkStyle* style; }; #define SCRUB_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SCRUB_WIDGET_TYPE, ScrubWidgetPrivate)) @@ -39,11 +42,17 @@ static void scrub_widget_class_init (ScrubWidgetClass *klass); static void scrub_widget_init (ScrubWidget *self); static void scrub_widget_dispose (GObject *object); static void scrub_widget_finalize (GObject *object); - -static void scrub_widget_property_update(DbusmenuMenuitem* item, gchar* property, - GValue* value, gpointer userdata); +static void scrub_widget_property_update( DbusmenuMenuitem* item, gchar* property, + GValue* value, gpointer userdata); static void scrub_widget_set_twin_item( ScrubWidget* self, DbusmenuMenuitem* twin_item); +static void scrub_widget_parent_changed ( GtkWidget *widget, gpointer user_data); +static gchar* scrub_widget_format_time(gint time); +static gboolean scrub_widget_change_value_cb (GtkRange *range, + GtkScrollType scroll, + gdouble value, + gpointer user_data); + G_DEFINE_TYPE (ScrubWidget, scrub_widget, G_TYPE_OBJECT); @@ -58,11 +67,26 @@ scrub_widget_class_init (ScrubWidgetClass *klass) gobject_class->finalize = scrub_widget_finalize; } + static void scrub_widget_init (ScrubWidget *self) { g_debug("ScrubWidget::scrub_widget_init"); - //ScrubWidgetPrivate * priv = SCRUB_WIDGET_GET_PRIVATE(self); + ScrubWidgetPrivate * priv = SCRUB_WIDGET_GET_PRIVATE(self); + + priv->ido_scrub_bar = ido_scale_menu_item_new_with_range ("Scrub", 0, 0, 100, 1); + ido_scale_menu_item_set_style (IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), IDO_SCALE_MENU_ITEM_STYLE_LABEL); + ido_scale_menu_item_set_primary_label(IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), "00:00"); + ido_scale_menu_item_set_secondary_label(IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), "05:35"); + g_object_set(priv->ido_scrub_bar, "reverse-scroll-events", TRUE, NULL); + + //g_signal_connect (priv->ido_scrub_bar, + // "notify::parent", G_CALLBACK (scrub_widget_parent_changed), + // NULL); + + // register slider changes listening on the range + GtkWidget* scrub_widget = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_scrub_bar); + g_signal_connect(scrub_widget, "change-value", G_CALLBACK(scrub_widget_change_value_cb), self); } static void @@ -82,15 +106,27 @@ scrub_widget_property_update(DbusmenuMenuitem* item, gchar* property, GValue* value, gpointer userdata) { g_return_if_fail (IS_SCRUB_WIDGET (userdata)); - //ScrubWidget* mitem = SCRUB_WIDGET(userdata); - //ScrubWidgetPrivate * priv = SCRUB_WIDGET_GET_PRIVATE(mitem); + ScrubWidget* mitem = SCRUB_WIDGET(userdata); + ScrubWidgetPrivate * priv = SCRUB_WIDGET_GET_PRIVATE(mitem); - if(g_ascii_strcasecmp(DBUSMENU_SCRUB_MENUITEM_DURATION, property) == 0){ + if(g_ascii_strcasecmp(DBUSMENU_SCRUB_MENUITEM_DURATION, property) == 0){ + ido_scale_menu_item_set_secondary_label(IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), + scrub_widget_format_time(g_value_get_int(value))); } - else if(g_ascii_strcasecmp(DBUSMENU_SCRUB_MENUITEM_POSITION, property) == 0){ + else if(g_ascii_strcasecmp(DBUSMENU_SCRUB_MENUITEM_POSITION, property) == 0){ + ido_scale_menu_item_set_primary_label(IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), + scrub_widget_format_time(g_value_get_int(value))); } } +/*static void +scrub_widget_parent_changed (GtkWidget *widget, + gpointer user_data) +{ + gtk_widget_set_size_request (widget, 200, -1); + g_debug("slider parent changed"); +}*/ + static void scrub_widget_set_twin_item(ScrubWidget* self, DbusmenuMenuitem* twin_item) @@ -99,7 +135,45 @@ scrub_widget_set_twin_item(ScrubWidget* self, priv->twin_item = twin_item; g_signal_connect(G_OBJECT(twin_item), "property-changed", - G_CALLBACK(scrub_widget_property_update), self); + G_CALLBACK(scrub_widget_property_update), self); +} + +static gboolean +scrub_widget_change_value_cb (GtkRange *range, + GtkScrollType scroll, + gdouble new_value, + gpointer user_data) +{ + g_return_val_if_fail (IS_SCRUB_WIDGET (user_data), FALSE); + ScrubWidget* mitem = SCRUB_WIDGET(user_data); + ScrubWidgetPrivate * priv = SCRUB_WIDGET_GET_PRIVATE(mitem); + + GValue value = {0}; + g_value_init(&value, G_TYPE_DOUBLE); + gdouble clamped = CLAMP(new_value, 0, 100); + g_value_set_double(&value, clamped); + g_debug("scrub-widget-change-value callback - = %f", clamped); + dbusmenu_menuitem_handle_event (priv->twin_item, "scrubbing", &value, 0); + return FALSE; +} + +GtkWidget* +scrub_widget_get_ido_bar(ScrubWidget* self) +{ + ScrubWidgetPrivate * priv = SCRUB_WIDGET_GET_PRIVATE(self); + return priv->ido_scrub_bar; +} + +static gchar* +scrub_widget_format_time(gint time) +{ + // Assuming its in seconds for now ... + gint minutes = time/60; + gint seconds = time % 60; + gchar* prefix="0"; + if(minutes > 9) + prefix=""; + return g_strdup_printf("%s%i:%i", prefix, minutes, seconds); } /** diff --git a/src/scrub-widget.h b/src/scrub-widget.h index 32455e3..cebe890 100644 --- a/src/scrub-widget.h +++ b/src/scrub-widget.h @@ -45,6 +45,7 @@ struct _ScrubWidget { GType scrub_widget_get_type (void) G_GNUC_CONST; GtkWidget* scrub_widget_new(DbusmenuMenuitem* twin_item); +GtkWidget* scrub_widget_get_ido_bar(ScrubWidget* self); G_END_DECLS -- cgit v1.2.3 From 4823b3c35b8e8c1334ad947286abf0d88b6de701 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 14 Jul 2010 23:36:29 +0100 Subject: positionset now working - tested with vlc --- src/familiar-players-db.vala | 18 ++++++++++-------- src/mpris-controller.vala | 11 +++++------ src/sound-service.c | 4 ++-- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/familiar-players-db.vala b/src/familiar-players-db.vala index b83caa3..2bc0a3c 100644 --- a/src/familiar-players-db.vala +++ b/src/familiar-players-db.vala @@ -51,18 +51,20 @@ public class FamiliarPlayersDB : GLib.Object } private bool create_key_file(){ + bool result = false; if (test(this.file_name, GLib.FileTest.EXISTS)) { this.key_file = new KeyFile(); try{ - if (this.key_file.load_from_file(this.file_name, KeyFileFlags.NONE) == true) { - return true; - } + result = this.key_file.load_from_file(this.file_name, KeyFileFlags.NONE); } - catch(FileError e){ - warning("FamiliarPlayersDB - error trying to load KeyFile"); + catch(GLib.KeyFileError e){ + warning("FamiliarPlayersDB::create_key_file() - KeyFileError"); } + catch(GLib.FileError e){ + warning("FamiliarPlayersDB::create_key_file() - FileError"); + } } - return false; + return result; } private bool check_for_keys(){ @@ -87,7 +89,7 @@ public class FamiliarPlayersDB : GLib.Object } return true; } - catch(FileError error){ + catch(GLib.KeyFileError error){ warning("Error loading the Desktop string list"); return false; } @@ -108,7 +110,7 @@ public class FamiliarPlayersDB : GLib.Object try{ data = keyfile.to_data(out data_length); } - catch(Error e){ + catch(GLib.KeyFileError e){ warning("Problems dumping keyfile to a string"); return false; } diff --git a/src/mpris-controller.vala b/src/mpris-controller.vala index afe9190..f40614c 100644 --- a/src/mpris-controller.vala +++ b/src/mpris-controller.vala @@ -26,8 +26,6 @@ public class MprisController : GLib.Object public dynamic DBus.Object mpris_player{get; construct;} public PlayerController owner {get; construct;} public string mpris_interface {get; construct;} - private string name; - struct status { public int32 playback; @@ -99,17 +97,18 @@ public class MprisController : GLib.Object public void set_position(double position) { - debug("Set position with pos (0-100) %f", position); + //debug("Set position with pos (0-100) %f", position); HashTable data = this.mpris_player.GetMetadata(); Value? time_value = data.lookup("time"); if(time_value == null){ warning("Can't fetch the duration of the track therefore cant set the position"); return; } - uint32 total_time = time_value.get_uint32(); - debug("total time of track = %i", (int)total_time); + uint32 total_time = time_value.get_uint(); + //debug("total time of track = %i", (int)total_time); double new_time_position = total_time * position/100.0; - this.mpris_player.SetPosition((int)(new_time_position * 1000)); + //debug("new position = %f", (new_time_position * 1000)); + this.mpris_player.PositionSet((int32)(new_time_position * 1000)); } public bool connected() diff --git a/src/sound-service.c b/src/sound-service.c index a5f3941..8f4e941 100644 --- a/src/sound-service.c +++ b/src/sound-service.c @@ -43,8 +43,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 6bab9d75b22aa21ed27e4961e6dbf4bbcdd2e94c Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 15 Jul 2010 13:23:52 +0100 Subject: label text updating according to position and duration and scrub bar positioning now working --- src/common-defs.h | 2 +- src/mpris-controller.vala | 17 +++++++++++- src/player-item.vala | 5 ++++ src/scrub-menu-item.vala | 7 ++++- src/scrub-widget.c | 66 +++++++++++++++++++++++++++++++++-------------- src/sound-service.c | 1 - 6 files changed, 75 insertions(+), 23 deletions(-) diff --git a/src/common-defs.h b/src/common-defs.h index 3b54dd0..76e9558 100644 --- a/src/common-defs.h +++ b/src/common-defs.h @@ -39,6 +39,6 @@ with this program. If not, see . #define DBUSMENU_TITLE_MENUITEM_NAME "x-canonical-sound-menu-player-title-name" #define DBUSMENU_SCRUB_MENUITEM_TYPE "x-canonical-sound-menu-player-scrub-menu-item" -#define DBUSMENU_SCRUB_MENUITEM_DURATION "x-canonical-sound-menu-player-scrub-duration" +#define DBUSMENU_SCRUB_MENUITEM_DURATION "x-canonical-sound-menu-player-scrub-time" #define DBUSMENU_SCRUB_MENUITEM_POSITION "x-canonical-sound-menu-player-scrub-position" diff --git a/src/mpris-controller.vala b/src/mpris-controller.vala index f40614c..5e4dce2 100644 --- a/src/mpris-controller.vala +++ b/src/mpris-controller.vala @@ -50,23 +50,38 @@ public class MprisController : GLib.Object this.mpris_player.TrackChange += onTrackChange; this.mpris_player.StatusChange += onStatusChange; + initial_update(); + } + private void initial_update() + { status st = this.mpris_player.GetStatus(); int play_state = st.playback; debug("GetStatusChange - play state %i", play_state); (this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(play_state); this.owner.custom_items[PlayerController.widget_order.METADATA].update(this.mpris_player.GetMetadata(), MetadataMenuitem.attributes_format()); + this.owner.custom_items[PlayerController.widget_order.SCRUB].update(this.mpris_player.GetMetadata(), + ScrubMenuitem.attributes_format()); + // temporary fix + ScrubMenuitem scrub = this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem; + scrub.update_position(this.mpris_player.PositionGet()); } - private void onTrackChange(dynamic DBus.Object mpris_client, HashTable ht) { debug("onTrackChange"); this.owner.custom_items[PlayerController.widget_order.METADATA].reset(MetadataMenuitem.attributes_format()); + this.owner.custom_items[PlayerController.widget_order.SCRUB].reset(ScrubMenuitem.attributes_format()); this.owner.custom_items[PlayerController.widget_order.METADATA].update(ht, MetadataMenuitem.attributes_format()); + debug("about to update the duration on the scrub bar"); + this.owner.custom_items[PlayerController.widget_order.SCRUB].update(this.mpris_player.GetMetadata(), + ScrubMenuitem.attributes_format()); + // temporary fix + ScrubMenuitem scrub = this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem; + scrub.update_position(this.mpris_player.PositionGet()); } public void transport_event(TransportMenuitem.action command) diff --git a/src/player-item.vala b/src/player-item.vala index e7f7c67..4bdb60d 100644 --- a/src/player-item.vala +++ b/src/player-item.vala @@ -38,6 +38,7 @@ public class PlayerItem : Dbusmenu.Menuitem foreach(string s in attrs){ debug("attempting to set prop %s to null", s); this.property_set(s, null); + this.property_set_int(s, 0); } } @@ -73,6 +74,10 @@ public class PlayerItem : Dbusmenu.Menuitem debug("with value : %i", v.get_int()); this.property_set_int(property, v.get_int()); } + else if (v.holds (typeof (uint))){ + debug("with value : %i", (int)v.get_uint()); + this.property_set_int(property, (int)v.get_uint()); + } else if(v.holds (typeof (bool))){ this.property_set_bool(property, v.get_boolean()); } diff --git a/src/scrub-menu-item.vala b/src/scrub-menu-item.vala index 9988378..cfd6312 100644 --- a/src/scrub-menu-item.vala +++ b/src/scrub-menu-item.vala @@ -25,7 +25,6 @@ public class ScrubMenuitem : PlayerItem { public ScrubMenuitem(PlayerController parent) { - debug("Transport object constructor - service side"); Object(item_type: MENUITEM_TYPE, owner: parent); } @@ -34,6 +33,12 @@ public class ScrubMenuitem : PlayerItem debug("handle_event for owner %s with value: %f", this.owner.name, input_value.get_double()); this.owner.mpris_adaptor.set_position(input_value.get_double()); } + + public void update_position(int32 new_position) + { + this.property_set_int(MENUITEM_POSITION, new_position); + } + public static HashSet attributes_format() { diff --git a/src/scrub-widget.c b/src/scrub-widget.c index 4595ede..799f81e 100644 --- a/src/scrub-widget.c +++ b/src/scrub-widget.c @@ -32,7 +32,6 @@ struct _ScrubWidgetPrivate { DbusmenuMenuitem* twin_item; GtkWidget* ido_scrub_bar; - GtkStyle* style; }; #define SCRUB_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SCRUB_WIDGET_TYPE, ScrubWidgetPrivate)) @@ -46,8 +45,10 @@ static void scrub_widget_property_update( DbusmenuMenuitem* item, gchar* propert GValue* value, gpointer userdata); static void scrub_widget_set_twin_item( ScrubWidget* self, DbusmenuMenuitem* twin_item); -static void scrub_widget_parent_changed ( GtkWidget *widget, gpointer user_data); static gchar* scrub_widget_format_time(gint time); +static void scrub_widget_set_ido_position(ScrubWidget* self, + gint position, + gint duration); static gboolean scrub_widget_change_value_cb (GtkRange *range, GtkScrollType scroll, gdouble value, @@ -76,13 +77,8 @@ scrub_widget_init (ScrubWidget *self) priv->ido_scrub_bar = ido_scale_menu_item_new_with_range ("Scrub", 0, 0, 100, 1); ido_scale_menu_item_set_style (IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), IDO_SCALE_MENU_ITEM_STYLE_LABEL); - ido_scale_menu_item_set_primary_label(IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), "00:00"); - ido_scale_menu_item_set_secondary_label(IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), "05:35"); + g_object_set(priv->ido_scrub_bar, "reverse-scroll-events", TRUE, NULL); - - //g_signal_connect (priv->ido_scrub_bar, - // "notify::parent", G_CALLBACK (scrub_widget_parent_changed), - // NULL); // register slider changes listening on the range GtkWidget* scrub_widget = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_scrub_bar); @@ -103,30 +99,30 @@ scrub_widget_finalize (GObject *object) static void scrub_widget_property_update(DbusmenuMenuitem* item, gchar* property, - GValue* value, gpointer userdata) + GValue* value, gpointer userdata) { + g_debug("scrub-widget::property_update"); + g_return_if_fail (IS_SCRUB_WIDGET (userdata)); ScrubWidget* mitem = SCRUB_WIDGET(userdata); ScrubWidgetPrivate * priv = SCRUB_WIDGET_GET_PRIVATE(mitem); if(g_ascii_strcasecmp(DBUSMENU_SCRUB_MENUITEM_DURATION, property) == 0){ + g_debug("scrub-widget::update length = %i", g_value_get_int(value)); ido_scale_menu_item_set_secondary_label(IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), scrub_widget_format_time(g_value_get_int(value))); } else if(g_ascii_strcasecmp(DBUSMENU_SCRUB_MENUITEM_POSITION, property) == 0){ + g_debug("scrub-widget::update position = %i", g_value_get_int(value)); ido_scale_menu_item_set_primary_label(IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), - scrub_widget_format_time(g_value_get_int(value))); + scrub_widget_format_time(g_value_get_int(value)/1000)); } + scrub_widget_set_ido_position(mitem, + dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_POSITION)/1000, + dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_DURATION)); + } -/*static void -scrub_widget_parent_changed (GtkWidget *widget, - gpointer user_data) -{ - gtk_widget_set_size_request (widget, 200, -1); - g_debug("slider parent changed"); -}*/ - static void scrub_widget_set_twin_item(ScrubWidget* self, DbusmenuMenuitem* twin_item) @@ -136,6 +132,19 @@ scrub_widget_set_twin_item(ScrubWidget* self, g_signal_connect(G_OBJECT(twin_item), "property-changed", G_CALLBACK(scrub_widget_property_update), self); + + gchar* left_text = scrub_widget_format_time(dbusmenu_menuitem_property_get_int(priv->twin_item, + DBUSMENU_SCRUB_MENUITEM_POSITION)/1000); + gchar* right_text = scrub_widget_format_time(dbusmenu_menuitem_property_get_int(priv->twin_item, + DBUSMENU_SCRUB_MENUITEM_DURATION)); + scrub_widget_set_ido_position(self, + dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_POSITION)/1000, + dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_DURATION)); + + ido_scale_menu_item_set_primary_label(IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), left_text); + ido_scale_menu_item_set_secondary_label(IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), right_text); + g_free(left_text); + g_free(right_text); } static gboolean @@ -171,10 +180,29 @@ scrub_widget_format_time(gint time) gint minutes = time/60; gint seconds = time % 60; gchar* prefix="0"; + gchar* seconds_prefix="0"; if(minutes > 9) prefix=""; - return g_strdup_printf("%s%i:%i", prefix, minutes, seconds); + if(seconds > 9) + seconds_prefix=""; + return g_strdup_printf("%s%i:%s%i", prefix, minutes, seconds_prefix, seconds); } + +static void +scrub_widget_set_ido_position(ScrubWidget* self, + gint position, + gint duration) +{ + ScrubWidgetPrivate * priv = SCRUB_WIDGET_GET_PRIVATE(self); + gdouble ido_position = position/(gdouble)duration * 100.0; + g_debug("scrub_widget_set_ido_position - pos: %i, duration: %i, ido_pos: %f", position, duration, ido_position); + GtkWidget *slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_scrub_bar); + GtkRange *range = (GtkRange*)slider; + if(duration == 0) + ido_position = 0.0; + gtk_range_set_value(range, ido_position); +} + /** * scrub_widget_new: diff --git a/src/sound-service.c b/src/sound-service.c index 8f4e941..8768cd3 100644 --- a/src/sound-service.c +++ b/src/sound-service.c @@ -39,7 +39,6 @@ should follow it. void service_shutdown (IndicatorService *service, gpointer user_data) { - if (mainloop != NULL) { g_debug("Service shutdown !"); // TODO: uncomment for release !! -- cgit v1.2.3 From 42f71fbdeb2beb78a3c4381caaa75c66e5b1b6b4 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 15 Jul 2010 15:46:54 +0100 Subject: tidied up some enums using typedefs and some more bits and pieces --- src/play-button.c | 48 +++++++++++++++++++----------------------------- src/play-button.h | 11 +++++++++-- src/sound-service.c | 4 ++-- src/transport-widget.c | 10 +++++----- 4 files changed, 35 insertions(+), 38 deletions(-) diff --git a/src/play-button.c b/src/play-button.c index bcb46f0..a488105 100644 --- a/src/play-button.c +++ b/src/play-button.c @@ -53,12 +53,6 @@ Uses code from ctk #define PAUSE_X 77.0f #define PAUSE_Y 15.0f -// Transport Manual events -enum { - PREVIOUS, - PLAY_PAUSE, - NEXT -}; // Transport updates enum{ @@ -66,18 +60,16 @@ enum{ PLAY }; -static const gint NO_COMMAND = -1; - typedef struct _PlayButtonPrivate PlayButtonPrivate; struct _PlayButtonPrivate { - GdkColor background_colour_fg; - GdkColor background_colour_bg_dark; - GdkColor background_colour_bg_light; - GdkColor foreground_colour_fg; - GdkColor foreground_colour_bg; - gint current_command; + GdkColor background_colour_fg; + GdkColor background_colour_bg_dark; + GdkColor background_colour_bg_light; + GdkColor foreground_colour_fg; + GdkColor foreground_colour_bg; + PlayButtonEvent current_command; }; #define PLAY_BUTTON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PLAY_BUTTON_TYPE, PlayButtonPrivate)) @@ -334,7 +326,7 @@ static void play_button_init (PlayButton *self) { PlayButtonPrivate* priv = PLAY_BUTTON_GET_PRIVATE(self); - priv->current_command = NO_COMMAND; + priv->current_command = TRANSPORT_NADA; gtk_widget_set_size_request(GTK_WIDGET(self), 200, 80); } @@ -367,32 +359,30 @@ play_button_expose (GtkWidget *button, GdkEventExpose *event) } -gint +PlayButtonEvent determine_button_event(GtkWidget* button, GdkEventButton* event) { g_debug("event x coordinate = %f", event->x); g_debug("event y coordinate = %f", event->y); - gint result = NO_COMMAND; - + PlayButtonEvent button_event = TRANSPORT_NADA; // For now very simple rectangular collision detection if(event->x > 55 && event->x < 95 && event->y > 22 && event->y < 46){ - result = PREVIOUS; + button_event = TRANSPORT_PREVIOUS; } else if(event->x > 101 && event->x < 133 && event->y > 20 && event->y < 47){ - result = PLAY_PAUSE; + button_event = TRANSPORT_PLAY_PAUSE; } else if(event->x > 137 && event->x < 179 && event->y > 22 && event->y < 46){ - result = NEXT; - } - - return result; + button_event = TRANSPORT_NEXT; + } + return button_event; } void -play_button_react_to_button_press(GtkWidget* button, gint command) +play_button_react_to_button_press(GtkWidget* button, PlayButtonEvent command) { g_return_if_fail(IS_PLAY_BUTTON(button)); PlayButtonPrivate* priv = PLAY_BUTTON_GET_PRIVATE(button); @@ -417,7 +407,7 @@ play_button_react_to_button_release(GtkWidget* button) { g_return_if_fail(IS_PLAY_BUTTON(button)); PlayButtonPrivate* priv = PLAY_BUTTON_GET_PRIVATE(button); - priv->current_command = NO_COMMAND; + priv->current_command = TRANSPORT_NADA; cairo_t *cr; cr = gdk_cairo_create (button->window); /*cairo_rectangle (cr, @@ -707,7 +697,7 @@ draw (GtkWidget* button, cairo_t *cr) INNER_START, INNER_END); - if(priv->current_command == PREVIOUS){ + if(priv->current_command == TRANSPORT_PREVIOUS){ draw_gradient (cr, X, Y + 2, @@ -716,7 +706,7 @@ draw (GtkWidget* button, cairo_t *cr) INNER_COMPRESSED_START, INNER_COMPRESSED_END); } - else if(priv->current_command == NEXT){ + else if(priv->current_command == TRANSPORT_NEXT){ draw_gradient (cr, RECT_WIDTH / 2 + X, Y + 2, @@ -745,7 +735,7 @@ draw (GtkWidget* button, cairo_t *cr) CIRCLE_RADIUS - 2.0f, INNER_START, INNER_END); - if(priv->current_command == PLAY_PAUSE){ + if(priv->current_command == TRANSPORT_PLAY_PAUSE){ draw_circle (cr, X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 4.5f + 2.0f, Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) + 2.0f, diff --git a/src/play-button.h b/src/play-button.h index e82d59c..6f646b5 100644 --- a/src/play-button.h +++ b/src/play-button.h @@ -33,6 +33,13 @@ G_BEGIN_DECLS typedef struct _PlayButton PlayButton; typedef struct _PlayButtonClass PlayButtonClass; +typedef enum { + TRANSPORT_PREVIOUS, + TRANSPORT_PLAY_PAUSE, + TRANSPORT_NEXT, + TRANSPORT_NADA +}PlayButtonEvent; + struct _PlayButtonClass { GtkDrawingAreaClass parent_class; }; @@ -43,8 +50,8 @@ struct _PlayButton { GType play_button_get_type (void); void play_button_set_style(GtkWidget* button, GtkStyle* style); -gint determine_button_event(GtkWidget* button, GdkEventButton* event); -void play_button_react_to_button_press(GtkWidget* button, gint command); +PlayButtonEvent determine_button_event(GtkWidget* button, GdkEventButton* event); +void play_button_react_to_button_press(GtkWidget* button, PlayButtonEvent command); void play_button_react_to_button_release(GtkWidget* button); void play_button_toggle_play_pause(GtkWidget* button, int update); diff --git a/src/sound-service.c b/src/sound-service.c index a5f3941..8f4e941 100644 --- a/src/sound-service.c +++ b/src/sound-service.c @@ -43,8 +43,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 17dfee1..3174afe 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -145,13 +145,13 @@ transport_widget_button_press_event (GtkWidget *menuitem, parent = gtk_widget_get_parent (GTK_WIDGET (menuitem)); - gint result = determine_button_event(priv->play_button, event); + PlayButtonEvent result = determine_button_event(priv->play_button, event); - if(result >= 0){ + if(result != TRANSPORT_NADA){ GValue value = {0}; g_value_init(&value, G_TYPE_INT); - g_debug("TransportWidget::menu_press_event - going to send value %i", result); - g_value_set_int(&value, result); + g_debug("TransportWidget::menu_press_event - going to send value %i", (int)result); + g_value_set_int(&value, (int)result); dbusmenu_menuitem_handle_event (priv->twin_item, "Transport state change", &value, 0); play_button_react_to_button_press(priv->play_button, result); } @@ -181,7 +181,7 @@ transport_widget_property_update(DbusmenuMenuitem* item, gchar* property, { g_debug("transport_widget_update_state - with property %s", property); TransportWidget* bar = (TransportWidget*)userdata; - g_return_val_if_fail(IS_TRANSPORT_WIDGET(bar), FALSE); + g_return_if_fail(IS_TRANSPORT_WIDGET(bar)); TransportWidgetPrivate *priv = TRANSPORT_WIDGET_GET_PRIVATE(bar); int update_value = g_value_get_int(value); -- cgit v1.2.3 From 05b905d4712ed4064d82401621eacbdfbcb54312 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 15 Jul 2010 15:51:45 +0100 Subject: added skeleton implementation for play pause toggle method - coming next --- src/play-button.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/play-button.c b/src/play-button.c index a488105..cac2bc3 100644 --- a/src/play-button.c +++ b/src/play-button.c @@ -418,7 +418,13 @@ play_button_react_to_button_release(GtkWidget* button) draw (button, cr); cairo_destroy (cr); -} +} + +void +play_button_toggle_play_pause(GtkWidget* button, int update) +{ +} + void play_button_set_style(GtkWidget* button, GtkStyle* style) -- cgit v1.2.3 From d92a4492dcfca6030f8a9b32c111e582ba4e8f96 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 20 Jul 2010 12:24:43 +0200 Subject: play pause both graphically and functionally now working --- src/mpris-controller.vala | 57 +++++------- src/play-button.c | 222 ++++++++++++++++++++++++++++++++++------------ src/play-button.h | 7 +- src/transport-widget.c | 2 +- 4 files changed, 193 insertions(+), 95 deletions(-) diff --git a/src/mpris-controller.vala b/src/mpris-controller.vala index 5e4dce2..8e43131 100644 --- a/src/mpris-controller.vala +++ b/src/mpris-controller.vala @@ -29,9 +29,9 @@ public class MprisController : GLib.Object struct status { public int32 playback; - //public int32 shuffle; // Not used just yet - //public int32 repeat; - //public int32 endless; + public int32 shuffle; + public int32 repeat; + public int32 endless; } public MprisController(PlayerController ctrl, string inter="org.freedesktop.MediaPlayer"){ @@ -46,7 +46,7 @@ public class MprisController : GLib.Object } this.mpris_player = this.connection.get_object ("org.mpris.".concat(this.owner.name.down()) , "/Player", this.mpris_interface); - debug("just attempting to establish an mpris connection to %s, %s, %s", "org.mpris.".concat(this.owner.name.down()) , "/Player", this.mpris_interface); + debug("Attempting to establish an mpris connection to %s, %s, %s", "org.mpris.".concat(this.owner.name.down()) , "/Player", this.mpris_interface); this.mpris_player.TrackChange += onTrackChange; this.mpris_player.StatusChange += onStatusChange; @@ -69,38 +69,12 @@ public class MprisController : GLib.Object } - private void onTrackChange(dynamic DBus.Object mpris_client, HashTable ht) - { - debug("onTrackChange"); - this.owner.custom_items[PlayerController.widget_order.METADATA].reset(MetadataMenuitem.attributes_format()); - this.owner.custom_items[PlayerController.widget_order.SCRUB].reset(ScrubMenuitem.attributes_format()); - this.owner.custom_items[PlayerController.widget_order.METADATA].update(ht, - MetadataMenuitem.attributes_format()); - debug("about to update the duration on the scrub bar"); - this.owner.custom_items[PlayerController.widget_order.SCRUB].update(this.mpris_player.GetMetadata(), - ScrubMenuitem.attributes_format()); - // temporary fix - ScrubMenuitem scrub = this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem; - scrub.update_position(this.mpris_player.PositionGet()); - } - public void transport_event(TransportMenuitem.action command) { debug("transport_event input = %i", (int)command); if(command == TransportMenuitem.action.PLAY_PAUSE){ - status st = this.mpris_player.GetStatus(); - bool play_state = st.playback == 1; - debug("toggle_playback - initial play state %i", (int)play_state); - bool new_play_state = !play_state; - debug("toggle_playback - new play state %i", (int)new_play_state); - if(new_play_state == true){ - debug("about to play"); - this.mpris_player.Play(); - } - else{ - debug("about to pause"); - this.mpris_player.Pause(); - } + debug("transport_event PLAY_PAUSE"); + this.mpris_player.Pause(); } else if(command == TransportMenuitem.action.PREVIOUS){ this.mpris_player.Prev(); @@ -133,7 +107,7 @@ public class MprisController : GLib.Object private void onStatusChange(dynamic DBus.Object mpris_client, status st) { - debug("onStatusChange - signal received"); + debug("onStatusChange - signal received"); status* status = &st; unowned ValueArray ar = (ValueArray)status; int play_state = ar.get_nth(0).get_int(); @@ -144,6 +118,21 @@ public class MprisController : GLib.Object ht.insert("state", v); this.owner.custom_items[PlayerController.widget_order.TRANSPORT].update(ht, TransportMenuitem.attributes_format()); } - + + private void onTrackChange(dynamic DBus.Object mpris_client, HashTable ht) + { + debug("onTrackChange"); + this.owner.custom_items[PlayerController.widget_order.METADATA].reset(MetadataMenuitem.attributes_format()); + this.owner.custom_items[PlayerController.widget_order.SCRUB].reset(ScrubMenuitem.attributes_format()); + this.owner.custom_items[PlayerController.widget_order.METADATA].update(ht, + MetadataMenuitem.attributes_format()); + debug("about to update the duration on the scrub bar"); + this.owner.custom_items[PlayerController.widget_order.SCRUB].update(this.mpris_player.GetMetadata(), + ScrubMenuitem.attributes_format()); + // temporary fix + ScrubMenuitem scrub = this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem; + scrub.update_position(this.mpris_player.PositionGet()); + } + } diff --git a/src/play-button.c b/src/play-button.c index cac2bc3..539b2b2 100644 --- a/src/play-button.c +++ b/src/play-button.c @@ -52,13 +52,9 @@ Uses code from ctk #define BAR_OFFSET 10.0f #define PAUSE_X 77.0f #define PAUSE_Y 15.0f - - -// Transport updates -enum{ - PAUSE, - PLAY -}; +#define PLAY_WIDTH 28.0f +#define PLAY_HEIGHT 29.0f +#define PLAY_PADDING 5.0f typedef struct _PlayButtonPrivate PlayButtonPrivate; @@ -70,6 +66,8 @@ struct _PlayButtonPrivate GdkColor foreground_colour_fg; GdkColor foreground_colour_bg; PlayButtonEvent current_command; + PlayButtonState current_state; + GHashTable* command_coordinates; }; #define PLAY_BUTTON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PLAY_BUTTON_TYPE, PlayButtonPrivate)) @@ -87,7 +85,7 @@ G_DEFINE_TYPE (PlayButton, play_button, GTK_TYPE_DRAWING_AREA); /// internal helper functions ////////////////////////////////////////////////// -static double +/*static double _align (double val) { double fract = val - (int) val; @@ -96,7 +94,7 @@ _align (double val) return (double) ((int) val + 0.5f); else return val; -} +}*/ static inline void _blurinner (guchar* pixel, @@ -309,8 +307,7 @@ _surface_blur (cairo_surface_t* surface, static void play_button_class_init (PlayButtonClass *klass) -{ - +{ GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GtkWidgetClass* widget_class = GTK_WIDGET_CLASS (klass); @@ -327,6 +324,41 @@ play_button_init (PlayButton *self) { PlayButtonPrivate* priv = PLAY_BUTTON_GET_PRIVATE(self); priv->current_command = TRANSPORT_NADA; + priv->current_state = PAUSE; + priv->command_coordinates = g_hash_table_new_full(g_direct_hash, + g_direct_equal, + NULL, + g_list_free); + GList* previous_list = NULL; + previous_list = g_list_insert(previous_list, GINT_TO_POINTER(15), 0); + previous_list = g_list_insert(previous_list, GINT_TO_POINTER(10), 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, + GINT_TO_POINTER(TRANSPORT_PREVIOUS), + previous_list); + + GList* play_list = NULL; + play_list = g_list_insert(play_list, GINT_TO_POINTER(60), 0); + play_list = g_list_insert(play_list, GINT_TO_POINTER(10), 1); + play_list = g_list_insert(play_list, GINT_TO_POINTER(45), 2); + play_list = g_list_insert(play_list, GINT_TO_POINTER(40), 3); + + g_hash_table_insert(priv->command_coordinates, + GINT_TO_POINTER(TRANSPORT_PLAY_PAUSE), + play_list); + + GList* next_list = NULL; + next_list = g_list_insert(next_list, GINT_TO_POINTER(100), 0); + next_list = g_list_insert(next_list, GINT_TO_POINTER(10), 1); + next_list = g_list_insert(next_list, GINT_TO_POINTER(60), 2); + next_list = g_list_insert(next_list, GINT_TO_POINTER(34), 3); + + g_hash_table_insert(priv->command_coordinates, + GINT_TO_POINTER(TRANSPORT_NEXT), + next_list); + gtk_widget_set_size_request(GTK_WIDGET(self), 200, 80); } @@ -391,12 +423,13 @@ play_button_react_to_button_press(GtkWidget* button, PlayButtonEvent command) cairo_t *cr; cr = gdk_cairo_create (button->window); - - /*cairo_rectangle (cr, - event->area.x, event->area.y, - event->area.width, event->area.height); - - cairo_clip(cr);*/ + GList* list = g_hash_table_lookup(priv->command_coordinates, GINT_TO_POINTER(command)); + cairo_rectangle(cr, + GPOINTER_TO_INT(g_list_nth_data(list, 0)), + GPOINTER_TO_INT(g_list_nth_data(list, 1)), + GPOINTER_TO_INT(g_list_nth_data(list, 2)), + GPOINTER_TO_INT(g_list_nth_data(list, 3))); + cairo_clip(cr); draw (button, cr); cairo_destroy (cr); } @@ -407,22 +440,32 @@ play_button_react_to_button_release(GtkWidget* button) { g_return_if_fail(IS_PLAY_BUTTON(button)); PlayButtonPrivate* priv = PLAY_BUTTON_GET_PRIVATE(button); - priv->current_command = TRANSPORT_NADA; cairo_t *cr; + cr = gdk_cairo_create (button->window); - /*cairo_rectangle (cr, - event->area.x, event->area.y, - event->area.width, event->area.height); + GList* list = g_hash_table_lookup(priv->command_coordinates, + GINT_TO_POINTER(priv->current_command)); + + priv->current_command = TRANSPORT_NADA; + + cairo_rectangle(cr, + GPOINTER_TO_INT(g_list_nth_data(list, 0)), + GPOINTER_TO_INT(g_list_nth_data(list, 1)), + GPOINTER_TO_INT(g_list_nth_data(list, 2)), + GPOINTER_TO_INT(g_list_nth_data(list, 3))); - cairo_clip(cr);*/ + cairo_clip(cr); draw (button, cr); cairo_destroy (cr); } -void -play_button_toggle_play_pause(GtkWidget* button, int update) +void +play_button_toggle_play_pause(GtkWidget* button, PlayButtonState update) { + PlayButtonPrivate* priv = PLAY_BUTTON_GET_PRIVATE(button); + priv->current_state = update; + g_debug("PlayButton::toggle play state : %i", priv->current_state); } @@ -607,6 +650,24 @@ _mask_pause (cairo_t* cr, } +static void +_mask_play (cairo_t* cr, + double x, + double y, + double tri_width, + double tri_height + /*double tri_offset*/) +{ + if (!cr) + return; + + cairo_move_to (cr, x, y); + cairo_line_to (cr, x + tri_width, y + tri_height / 2.0f); + cairo_line_to (cr, x, y + tri_height); + cairo_close_path (cr); + +} + static void _fill (cairo_t* cr, double x_start, @@ -826,41 +887,84 @@ draw (GtkWidget* button, cairo_t *cr) _finalize (cr, &cr_surf, &surf, NEXT_X, NEXT_Y); // draw pause-button drop-shadow - _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); - _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_START, - BUTTON_END, - TRUE); - _finalize (cr, &cr_surf, &surf, PAUSE_X, PAUSE_Y); + 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 (cr, &cr_surf, &surf, PAUSE_X, PAUSE_Y + 1.0f); + + // 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); + _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); + _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); + cairo_surface_write_to_png(surf, "/tmp/drop_shadow.png"); + _surface_blur (surf, 1); + _finalize (cr, &cr_surf, &surf, PAUSE_X, PAUSE_Y + 1.0f); + // draw play-button + _setup (&cr_surf, &surf, PLAY_WIDTH, PLAY_HEIGHT); + cairo_set_line_width (cr, 10.5); + cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join(cr, CAIRO_LINE_JOIN_ROUND); + _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_START, + BUTTON_END, + FALSE); + cairo_surface_write_to_png(surf, "/tmp/play.png"); + + _finalize (cr, &cr_surf, &surf, PAUSE_X, PAUSE_Y); + } + } diff --git a/src/play-button.h b/src/play-button.h index 6f646b5..727a489 100644 --- a/src/play-button.h +++ b/src/play-button.h @@ -40,6 +40,11 @@ typedef enum { TRANSPORT_NADA }PlayButtonEvent; +typedef enum { + PLAY, + PAUSE +}PlayButtonState; + struct _PlayButtonClass { GtkDrawingAreaClass parent_class; }; @@ -53,7 +58,7 @@ void play_button_set_style(GtkWidget* button, GtkStyle* style); PlayButtonEvent determine_button_event(GtkWidget* button, GdkEventButton* event); void play_button_react_to_button_press(GtkWidget* button, PlayButtonEvent command); void play_button_react_to_button_release(GtkWidget* button); -void play_button_toggle_play_pause(GtkWidget* button, int update); +void play_button_toggle_play_pause(GtkWidget* button, PlayButtonState update); GtkWidget* play_button_new(); diff --git a/src/transport-widget.c b/src/transport-widget.c index 3174afe..c616fff 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -186,7 +186,7 @@ transport_widget_property_update(DbusmenuMenuitem* item, gchar* property, TransportWidgetPrivate *priv = TRANSPORT_WIDGET_GET_PRIVATE(bar); int update_value = g_value_get_int(value); g_debug("transport_widget_update_state - with value %i", update_value); - play_button_toggle_play_pause(priv->play_button, update_value); + play_button_toggle_play_pause(priv->play_button, (PlayButtonState)update_value); } /** -- cgit v1.2.3 From 48f11cbfef431334442fbb3bf3c2e06b7da76d29 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 20 Jul 2010 17:21:12 +0200 Subject: proper scrubbing underway --- src/scrub-widget.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++-- src/sound-service.c | 4 ++-- 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/src/scrub-widget.c b/src/scrub-widget.c index dbbbdf3..4a63701 100644 --- a/src/scrub-widget.c +++ b/src/scrub-widget.c @@ -25,6 +25,7 @@ with this program. If not, see . #include "scrub-widget.h" #include "common-defs.h" #include +#include typedef struct _ScrubWidgetPrivate ScrubWidgetPrivate; @@ -32,6 +33,7 @@ struct _ScrubWidgetPrivate { DbusmenuMenuitem* twin_item; GtkWidget* ido_scrub_bar; + IdoTimeline* time_line; }; #define SCRUB_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SCRUB_WIDGET_TYPE, ScrubWidgetPrivate)) @@ -54,6 +56,13 @@ static gboolean scrub_widget_change_value_cb (GtkRange *range, gdouble value, gpointer user_data); +static void scrub_widget_timeline_frame_cb(IdoTimeline *timeline, + gdouble progress, + gpointer userdata); +static void scrub_widget_timeline_started_cb(IdoTimeline *timeline, + gpointer userdata); +static void scrub_widget_timeline_finished_cb(IdoTimeline *timeline, + gpointer userdata); G_DEFINE_TYPE (ScrubWidget, scrub_widget, G_TYPE_OBJECT); @@ -76,13 +85,19 @@ scrub_widget_init (ScrubWidget *self) ScrubWidgetPrivate * priv = SCRUB_WIDGET_GET_PRIVATE(self); priv->ido_scrub_bar = ido_scale_menu_item_new_with_range ("Scrub", IDO_RANGE_STYLE_SMALL, 0, 0, 100, 1); - ido_scale_menu_item_set_style (IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), IDO_SCALE_MENU_ITEM_STYLE_LABEL); + priv->time_line = ido_timeline_new(0); + ido_scale_menu_item_set_style (IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), IDO_SCALE_MENU_ITEM_STYLE_LABEL); + //ido_timeline_set_fps(priv->time_line, .00000001); g_object_set(priv->ido_scrub_bar, "reverse-scroll-events", TRUE, NULL); // register slider changes listening on the range GtkWidget* scrub_widget = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_scrub_bar); g_signal_connect(scrub_widget, "change-value", G_CALLBACK(scrub_widget_change_value_cb), self); + g_signal_connect(priv->time_line, "frame", G_CALLBACK(scrub_widget_timeline_frame_cb), self); + g_signal_connect(priv->time_line, "started", G_CALLBACK(scrub_widget_timeline_started_cb), self); + g_signal_connect(priv->time_line, "finished", G_CALLBACK(scrub_widget_timeline_finished_cb), self); + } static void @@ -111,6 +126,11 @@ scrub_widget_property_update(DbusmenuMenuitem* item, gchar* property, g_debug("scrub-widget::update length = %i", g_value_get_int(value)); ido_scale_menu_item_set_secondary_label(IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), scrub_widget_format_time(g_value_get_int(value))); + ido_timeline_set_duration(priv->time_line, g_value_get_int(value)); + ido_timeline_start(priv->time_line); + g_debug("timeline is running: %i", (gint)ido_timeline_is_running(priv->time_line)); + g_debug("timeline duration = %i", ido_timeline_get_duration(priv->time_line)); + //ido_timeline_set_fps(priv->time_line, 0.5); } else if(g_ascii_strcasecmp(DBUSMENU_SCRUB_MENUITEM_POSITION, property) == 0){ g_debug("scrub-widget::update position = %i", g_value_get_int(value)); @@ -203,8 +223,49 @@ scrub_widget_set_ido_position(ScrubWidget* self, gtk_range_set_value(range, ido_position); } +static void +scrub_widget_timeline_frame_cb( IdoTimeline *timeline, + gdouble progress, + gpointer user_data) +{ + g_debug("Timeline CB : %f", progress); + g_return_if_fail (IS_SCRUB_WIDGET (user_data)); + ScrubWidget* mitem = SCRUB_WIDGET(user_data); + ScrubWidgetPrivate * priv = SCRUB_WIDGET_GET_PRIVATE(mitem); + gint position = progress * dbusmenu_menuitem_property_get_int(priv->twin_item, + DBUSMENU_SCRUB_MENUITEM_DURATION); + gchar* left_text = scrub_widget_format_time(position); + ido_scale_menu_item_set_primary_label(IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), left_text); + GtkWidget *slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_scrub_bar); + GtkRange *range = (GtkRange*)slider; + gtk_range_set_value(range, progress * 100); + + g_debug("position in seconds %i and in words %s", position, left_text); + g_debug("timeline is running: %i", (gint)ido_timeline_is_running(priv->time_line)); + g_debug("timeline duration = %i", ido_timeline_get_duration(priv->time_line)); + + g_free(left_text); +} + +static void +scrub_widget_timeline_started_cb( IdoTimeline *timeline, + gpointer user_data) +{ + g_debug("Timeline Started!"); +} - /** +static void +scrub_widget_timeline_finished_cb(IdoTimeline *timeline, + gpointer user_data) +{ + g_debug("Timeline Finished!"); + g_return_if_fail (IS_SCRUB_WIDGET (user_data)); + ScrubWidget* mitem = SCRUB_WIDGET(user_data); + ScrubWidgetPrivate * priv = SCRUB_WIDGET_GET_PRIVATE(mitem); + ido_timeline_rewind(priv->time_line); +} + +/** * scrub_widget_new: * @returns: a new #ScrubWidget. **/ diff --git a/src/sound-service.c b/src/sound-service.c index 8768cd3..16fa87c 100644 --- a/src/sound-service.c +++ b/src/sound-service.c @@ -42,8 +42,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 928fbf4bab7659ec523ae16adc052ca42fece589 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 21 Jul 2010 11:56:15 +0200 Subject: scrub bar working --- src/common-defs.h | 1 + src/mpris-controller.vala | 1 + src/player-item.vala | 4 ++-- src/scrub-menu-item.vala | 4 ++-- src/scrub-widget.c | 39 ++++++++++++++++++++++++--------------- vapi/common-defs.vapi | 1 + 6 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/common-defs.h b/src/common-defs.h index 76e9558..208c8cb 100644 --- a/src/common-defs.h +++ b/src/common-defs.h @@ -41,4 +41,5 @@ with this program. If not, see . #define DBUSMENU_SCRUB_MENUITEM_TYPE "x-canonical-sound-menu-player-scrub-menu-item" #define DBUSMENU_SCRUB_MENUITEM_DURATION "x-canonical-sound-menu-player-scrub-time" #define DBUSMENU_SCRUB_MENUITEM_POSITION "x-canonical-sound-menu-player-scrub-position" +#define DBUSMENU_SCRUB_MENUITEM_PLAY_STATE "x-canonical-sound-menu-player-scrub-play-state" diff --git a/src/mpris-controller.vala b/src/mpris-controller.vala index 8e43131..9586b3d 100644 --- a/src/mpris-controller.vala +++ b/src/mpris-controller.vala @@ -117,6 +117,7 @@ public class MprisController : GLib.Object v.set_int(play_state); ht.insert("state", v); this.owner.custom_items[PlayerController.widget_order.TRANSPORT].update(ht, TransportMenuitem.attributes_format()); + this.owner.custom_items[PlayerController.widget_order.SCRUB].update(ht, ScrubMenuitem.attributes_format()); } private void onTrackChange(dynamic DBus.Object mpris_client, HashTable ht) diff --git a/src/player-item.vala b/src/player-item.vala index 4bdb60d..2952f71 100644 --- a/src/player-item.vala +++ b/src/player-item.vala @@ -89,10 +89,10 @@ public class PlayerItem : Dbusmenu.Menuitem if(data == null){ return false; } - if(data.size() < attributes.size){ + /*if(data.size() < attributes.size){ warning("update hash was too small for the target"); return false; - } + }*/ return true; } diff --git a/src/scrub-menu-item.vala b/src/scrub-menu-item.vala index cfd6312..29fa903 100644 --- a/src/scrub-menu-item.vala +++ b/src/scrub-menu-item.vala @@ -37,14 +37,14 @@ public class ScrubMenuitem : PlayerItem public void update_position(int32 new_position) { this.property_set_int(MENUITEM_POSITION, new_position); - } - + } public static HashSet attributes_format() { HashSet attrs = new HashSet(); attrs.add(MENUITEM_DURATION); attrs.add(MENUITEM_POSITION); + attrs.add(MENUITEM_PLAY_STATE); return attrs; } } \ No newline at end of file diff --git a/src/scrub-widget.c b/src/scrub-widget.c index 4a63701..925acb3 100644 --- a/src/scrub-widget.c +++ b/src/scrub-widget.c @@ -77,7 +77,6 @@ scrub_widget_class_init (ScrubWidgetClass *klass) gobject_class->finalize = scrub_widget_finalize; } - static void scrub_widget_init (ScrubWidget *self) { @@ -88,7 +87,7 @@ scrub_widget_init (ScrubWidget *self) priv->time_line = ido_timeline_new(0); ido_scale_menu_item_set_style (IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), IDO_SCALE_MENU_ITEM_STYLE_LABEL); - //ido_timeline_set_fps(priv->time_line, .00000001); + //ido_timeline_set_fps(priv->time_line, 0.000001f); g_object_set(priv->ido_scrub_bar, "reverse-scroll-events", TRUE, NULL); // register slider changes listening on the range @@ -125,22 +124,33 @@ scrub_widget_property_update(DbusmenuMenuitem* item, gchar* property, if(g_ascii_strcasecmp(DBUSMENU_SCRUB_MENUITEM_DURATION, property) == 0){ g_debug("scrub-widget::update length = %i", g_value_get_int(value)); ido_scale_menu_item_set_secondary_label(IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), - scrub_widget_format_time(g_value_get_int(value))); - ido_timeline_set_duration(priv->time_line, g_value_get_int(value)); - ido_timeline_start(priv->time_line); + scrub_widget_format_time(g_value_get_int(value))); + ido_timeline_set_duration(priv->time_line, g_value_get_int(value) * 1000); g_debug("timeline is running: %i", (gint)ido_timeline_is_running(priv->time_line)); g_debug("timeline duration = %i", ido_timeline_get_duration(priv->time_line)); - //ido_timeline_set_fps(priv->time_line, 0.5); + scrub_widget_set_ido_position(mitem, + dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_POSITION)/1000, + dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_DURATION)); } else if(g_ascii_strcasecmp(DBUSMENU_SCRUB_MENUITEM_POSITION, property) == 0){ g_debug("scrub-widget::update position = %i", g_value_get_int(value)); ido_scale_menu_item_set_primary_label(IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), scrub_widget_format_time(g_value_get_int(value)/1000)); - } - scrub_widget_set_ido_position(mitem, - dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_POSITION)/1000, - dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_DURATION)); - + scrub_widget_set_ido_position(mitem, + dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_POSITION)/1000, + dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_DURATION)); + + } + else if(g_ascii_strcasecmp(DBUSMENU_SCRUB_MENUITEM_PLAY_STATE, property) == 0){ + if(g_value_get_int(value) == 0){ + g_debug("START TIMELINE"); + ido_timeline_start(priv->time_line); + } + else{ + g_debug("PAUSE TIMELINE"); + ido_timeline_pause(priv->time_line); + } + } } static void @@ -153,8 +163,7 @@ scrub_widget_set_twin_item(ScrubWidget* self, g_signal_connect(G_OBJECT(twin_item), "property-changed", G_CALLBACK(scrub_widget_property_update), self); - gchar* left_text = scrub_widget_format_time(dbusmenu_menuitem_property_get_int(priv->twin_item, - DBUSMENU_SCRUB_MENUITEM_POSITION)/1000); + gchar* left_text = scrub_widget_format_time(dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_POSITION)/1000); gchar* right_text = scrub_widget_format_time(dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_DURATION)); scrub_widget_set_ido_position(self, @@ -259,10 +268,10 @@ scrub_widget_timeline_finished_cb(IdoTimeline *timeline, gpointer user_data) { g_debug("Timeline Finished!"); - g_return_if_fail (IS_SCRUB_WIDGET (user_data)); + /*g_return_if_fail (IS_SCRUB_WIDGET (user_data)); ScrubWidget* mitem = SCRUB_WIDGET(user_data); ScrubWidgetPrivate * priv = SCRUB_WIDGET_GET_PRIVATE(mitem); - ido_timeline_rewind(priv->time_line); + ido_timeline_rewind(priv->time_line);*/ } /** diff --git a/vapi/common-defs.vapi b/vapi/common-defs.vapi index 24344ce..c083e2a 100644 --- a/vapi/common-defs.vapi +++ b/vapi/common-defs.vapi @@ -43,4 +43,5 @@ namespace DbusmenuScrub{ public const string MENUITEM_TYPE; public const string MENUITEM_POSITION; public const string MENUITEM_DURATION; + public const string MENUITEM_PLAY_STATE; } \ No newline at end of file -- cgit v1.2.3 From cf97680d74aa9ab00cd55359d9e16acdad9f057f Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 22 Jul 2010 19:56:43 +0200 Subject: trying to set the time line --- src/metadata-menu-item.vala | 6 +-- src/mpris-controller.vala | 13 ++--- src/music-player-bridge.vala | 7 ++- src/play-button.c | 5 +- src/player-controller.vala | 13 +++-- src/scrub-widget.c | 120 +++++++++++++++++++++++++++++++++++-------- src/sound-service.c | 4 +- src/transport-menu-item.vala | 1 + 8 files changed, 124 insertions(+), 45 deletions(-) diff --git a/src/metadata-menu-item.vala b/src/metadata-menu-item.vala index 3af9ff1..388ef81 100644 --- a/src/metadata-menu-item.vala +++ b/src/metadata-menu-item.vala @@ -38,10 +38,10 @@ public class MetadataMenuitem : PlayerItem return attrs; } - public bool populated() + public bool not_populated() { - return (this.property_get(MENUITEM_TITLE) != null && - this.property_get(MENUITEM_TITLE) != ""); + return (this.property_get(MENUITEM_TITLE) == null && + this.property_get(MENUITEM_TITLE) == ""); } } \ No newline at end of file diff --git a/src/mpris-controller.vala b/src/mpris-controller.vala index 9586b3d..8ecd20a 100644 --- a/src/mpris-controller.vala +++ b/src/mpris-controller.vala @@ -65,8 +65,7 @@ public class MprisController : GLib.Object ScrubMenuitem.attributes_format()); // temporary fix ScrubMenuitem scrub = this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem; - scrub.update_position(this.mpris_player.PositionGet()); - + scrub.update_position(this.mpris_player.PositionGet()); } public void transport_event(TransportMenuitem.action command) @@ -86,7 +85,7 @@ public class MprisController : GLib.Object public void set_position(double position) { - //debug("Set position with pos (0-100) %f", position); + debug("Set position with pos (0-100) %f", position); HashTable data = this.mpris_player.GetMetadata(); Value? time_value = data.lookup("time"); if(time_value == null){ @@ -94,10 +93,12 @@ public class MprisController : GLib.Object return; } uint32 total_time = time_value.get_uint(); - //debug("total time of track = %i", (int)total_time); + debug("total time of track = %i", (int)total_time); double new_time_position = total_time * position/100.0; - //debug("new position = %f", (new_time_position * 1000)); - this.mpris_player.PositionSet((int32)(new_time_position * 1000)); + debug("new position = %f", (new_time_position * 1000)); + this.mpris_player.PositionSet((int32)(new_time_position)); + ScrubMenuitem scrub = this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem; + scrub.update_position(this.mpris_player.PositionGet()); } public bool connected() diff --git a/src/music-player-bridge.vala b/src/music-player-bridge.vala index 3ee7b55..352ea7f 100644 --- a/src/music-player-bridge.vala +++ b/src/music-player-bridge.vala @@ -35,7 +35,7 @@ public class MusicPlayerBridge : GLib.Object playersDB = new FamiliarPlayersDB(); registered_clients = new HashMap (); listener = Listener.ref_default(); - listener.indicator_added.connect(on_indicator_added); + listener.indicator_added += on_indicator_added; listener.indicator_removed.connect(on_indicator_removed); listener.indicator_modified.connect(on_indicator_modified); listener.server_added.connect(on_server_added); @@ -99,8 +99,7 @@ public class MusicPlayerBridge : GLib.Object client_name, calculate_menu_position(), PlayerController.state.READY); - registered_clients.set(client_name, ctrl); - + registered_clients.set(client_name, ctrl); debug("New Client of name %s has successfully registered with us", client_name); } // irregardless check that it has a desktop file if not kick off a request for it @@ -162,7 +161,7 @@ public class MusicPlayerBridge : GLib.Object { debug("MusicPlayerBridge-> on_server_count_changed with value %u", i); } - public void on_indicator_added(Indicate.ListenerServer object, Indicate.ListenerIndicator p0) + public void on_indicator_added(ListenerServer object, ListenerIndicator p0) { debug("MusicPlayerBridge-> on_indicator_added"); } diff --git a/src/play-button.c b/src/play-button.c index 539b2b2..1aeff12 100644 --- a/src/play-button.c +++ b/src/play-button.c @@ -328,7 +328,7 @@ play_button_init (PlayButton *self) priv->command_coordinates = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, - g_list_free); + (GDestroyNotify)g_list_free); GList* previous_list = NULL; previous_list = g_list_insert(previous_list, GINT_TO_POINTER(15), 0); previous_list = g_list_insert(previous_list, GINT_TO_POINTER(10), 1); @@ -939,7 +939,6 @@ draw (GtkWidget* button, cairo_t *cr) BUTTON_SHADOW, BUTTON_SHADOW, FALSE); - cairo_surface_write_to_png(surf, "/tmp/drop_shadow.png"); _surface_blur (surf, 1); _finalize (cr, &cr_surf, &surf, PAUSE_X, PAUSE_Y + 1.0f); // draw play-button @@ -960,8 +959,6 @@ draw (GtkWidget* button, cairo_t *cr) BUTTON_START, BUTTON_END, FALSE); - cairo_surface_write_to_png(surf, "/tmp/play.png"); - _finalize (cr, &cr_surf, &surf, PAUSE_X, PAUSE_Y); } diff --git a/src/player-controller.vala b/src/player-controller.vala index 48416b9..f824d6f 100644 --- a/src/player-controller.vala +++ b/src/player-controller.vala @@ -60,13 +60,14 @@ public class PlayerController : GLib.Object this.menu_offset = offset; construct_widgets(); establish_mpris_connection(); - update_layout(); + this.update_layout(); } public void update_state(state new_state) { debug("update_state - player controller %s : new state %i", this.name, new_state); this.current_state = new_state; + //this.update_layout(); } public void activate() @@ -125,10 +126,12 @@ public class PlayerController : GLib.Object } } - private void update_layout() + public void update_layout() { bool visibility = true; - if(this.current_state != state.CONNECTED){ + MetadataMenuitem meta_item = this.custom_items[widget_order.METADATA] as MetadataMenuitem; + if(this.current_state != state.CONNECTED /*|| + meta_item.not_populated()*/){ visibility = false; } debug("about the set the visibility on both the transport and metadata widget to %s", visibility.to_string()); @@ -136,8 +139,8 @@ public class PlayerController : GLib.Object this.custom_items[widget_order.SCRUB].property_set_bool(MENUITEM_PROP_VISIBLE, visibility); this.custom_items[widget_order.METADATA].property_set_bool(MENUITEM_PROP_VISIBLE, visibility); // DEBUG - if(this.mpris_adaptor == null){ - warning("Why is the mpris object null"); + if(visibility == false){ + warning("Update layout of client %s is setting widgets to invisibile!", this.name); } } diff --git a/src/scrub-widget.c b/src/scrub-widget.c index 925acb3..fa290e0 100644 --- a/src/scrub-widget.c +++ b/src/scrub-widget.c @@ -34,6 +34,7 @@ struct _ScrubWidgetPrivate DbusmenuMenuitem* twin_item; GtkWidget* ido_scrub_bar; IdoTimeline* time_line; + gboolean scrubbing; }; #define SCRUB_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SCRUB_WIDGET_TYPE, ScrubWidgetPrivate)) @@ -63,6 +64,12 @@ static void scrub_widget_timeline_started_cb(IdoTimeline *timeline, gpointer userdata); static void scrub_widget_timeline_finished_cb(IdoTimeline *timeline, gpointer userdata); +static gdouble scrub_widget_calculate_progress(ScrubWidget* widget); +static void scrub_widget_check_play_state(ScrubWidget* self); +static void scrub_widget_slider_grabbed(GtkWidget *widget, gpointer user_data); +static void scrub_widget_slider_released(GtkWidget *widget, gpointer user_data); + + G_DEFINE_TYPE (ScrubWidget, scrub_widget, G_TYPE_OBJECT); @@ -87,8 +94,8 @@ scrub_widget_init (ScrubWidget *self) priv->time_line = ido_timeline_new(0); ido_scale_menu_item_set_style (IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), IDO_SCALE_MENU_ITEM_STYLE_LABEL); - //ido_timeline_set_fps(priv->time_line, 0.000001f); g_object_set(priv->ido_scrub_bar, "reverse-scroll-events", TRUE, NULL); + priv->scrubbing = FALSE; // register slider changes listening on the range GtkWidget* scrub_widget = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_scrub_bar); @@ -96,7 +103,8 @@ scrub_widget_init (ScrubWidget *self) g_signal_connect(priv->time_line, "frame", G_CALLBACK(scrub_widget_timeline_frame_cb), self); g_signal_connect(priv->time_line, "started", G_CALLBACK(scrub_widget_timeline_started_cb), self); g_signal_connect(priv->time_line, "finished", G_CALLBACK(scrub_widget_timeline_finished_cb), self); - + g_signal_connect(priv->ido_scrub_bar, "slider-grabbed", G_CALLBACK(scrub_widget_slider_grabbed), self); + g_signal_connect(priv->ido_scrub_bar, "slider-released", G_CALLBACK(scrub_widget_slider_released), self); } static void @@ -125,34 +133,51 @@ scrub_widget_property_update(DbusmenuMenuitem* item, gchar* property, g_debug("scrub-widget::update length = %i", g_value_get_int(value)); ido_scale_menu_item_set_secondary_label(IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), scrub_widget_format_time(g_value_get_int(value))); + ido_timeline_set_duration(priv->time_line, g_value_get_int(value) * 1000); + ido_timeline_rewind(priv->time_line); + scrub_widget_check_play_state(mitem); g_debug("timeline is running: %i", (gint)ido_timeline_is_running(priv->time_line)); g_debug("timeline duration = %i", ido_timeline_get_duration(priv->time_line)); + scrub_widget_set_ido_position(mitem, dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_POSITION)/1000, dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_DURATION)); } else if(g_ascii_strcasecmp(DBUSMENU_SCRUB_MENUITEM_POSITION, property) == 0){ g_debug("scrub-widget::update position = %i", g_value_get_int(value)); + ido_timeline_pause(priv->time_line); ido_scale_menu_item_set_primary_label(IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), scrub_widget_format_time(g_value_get_int(value)/1000)); - scrub_widget_set_ido_position(mitem, - dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_POSITION)/1000, - dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_DURATION)); + + ido_timeline_set_progress(priv->time_line, scrub_widget_calculate_progress(mitem)*1000); + scrub_widget_set_ido_position(mitem, g_value_get_int(value)/1000, + dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_DURATION)); + ido_timeline_start(priv->time_line); } else if(g_ascii_strcasecmp(DBUSMENU_SCRUB_MENUITEM_PLAY_STATE, property) == 0){ - if(g_value_get_int(value) == 0){ - g_debug("START TIMELINE"); - ido_timeline_start(priv->time_line); - } - else{ - g_debug("PAUSE TIMELINE"); - ido_timeline_pause(priv->time_line); - } + scrub_widget_check_play_state(mitem); } } +static void +scrub_widget_check_play_state(ScrubWidget* self) +{ + ScrubWidgetPrivate * priv = SCRUB_WIDGET_GET_PRIVATE(self); + gint play_state = dbusmenu_menuitem_property_get_int(priv->twin_item, + DBUSMENU_SCRUB_MENUITEM_PLAY_STATE); + + if(play_state == 0){ + g_debug("START TIMELINE"); + ido_timeline_start(priv->time_line); + } + else{ + g_debug("PAUSE TIMELINE"); + ido_timeline_pause(priv->time_line); + } +} + static void scrub_widget_set_twin_item(ScrubWidget* self, DbusmenuMenuitem* twin_item) @@ -167,8 +192,8 @@ scrub_widget_set_twin_item(ScrubWidget* self, gchar* right_text = scrub_widget_format_time(dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_DURATION)); scrub_widget_set_ido_position(self, - dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_POSITION)/1000, - dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_DURATION)); + dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_POSITION)/1000, + dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_DURATION)); ido_scale_menu_item_set_primary_label(IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), left_text); ido_scale_menu_item_set_secondary_label(IDO_SCALE_MENU_ITEM(priv->ido_scrub_bar), right_text); @@ -182,7 +207,7 @@ scrub_widget_change_value_cb (GtkRange *range, gdouble new_value, gpointer user_data) { - g_return_val_if_fail (IS_SCRUB_WIDGET (user_data), FALSE); + /*g_return_val_if_fail (IS_SCRUB_WIDGET (user_data), FALSE); ScrubWidget* mitem = SCRUB_WIDGET(user_data); ScrubWidgetPrivate * priv = SCRUB_WIDGET_GET_PRIVATE(mitem); @@ -190,8 +215,13 @@ scrub_widget_change_value_cb (GtkRange *range, g_value_init(&value, G_TYPE_DOUBLE); gdouble clamped = CLAMP(new_value, 0, 100); g_value_set_double(&value, clamped); - g_debug("scrub-widget-change-value callback - = %f", clamped); - dbusmenu_menuitem_handle_event (priv->twin_item, "scrubbing", &value, 0); + //g_debug("scrub-widget-change-value callback - = %f", clamped); + if(priv->scrubbing == FALSE){ + dbusmenu_menuitem_handle_event (priv->twin_item, "scrubbing", &value, 0); + } + else{ + g_debug("blocking scrubbing because the slider is still grabbed" + }*/ return FALSE; } @@ -232,15 +262,36 @@ scrub_widget_set_ido_position(ScrubWidget* self, gtk_range_set_value(range, ido_position); } +static gdouble +scrub_widget_calculate_progress(ScrubWidget* widget) +{ + ScrubWidgetPrivate * priv = SCRUB_WIDGET_GET_PRIVATE(widget); + gint position = dbusmenu_menuitem_property_get_int(priv->twin_item, + DBUSMENU_SCRUB_MENUITEM_POSITION)/1000; + gint duration = dbusmenu_menuitem_property_get_int(priv->twin_item, + DBUSMENU_SCRUB_MENUITEM_DURATION); + gdouble ido_position = position/(gdouble)duration; + g_debug("scrub_widget_calculate_progress %f", ido_position); + + return ido_position; +} + + static void scrub_widget_timeline_frame_cb( IdoTimeline *timeline, gdouble progress, gpointer user_data) { - g_debug("Timeline CB : %f", progress); + + //g_debug("Timeline CB : %f", progress); g_return_if_fail (IS_SCRUB_WIDGET (user_data)); ScrubWidget* mitem = SCRUB_WIDGET(user_data); ScrubWidgetPrivate * priv = SCRUB_WIDGET_GET_PRIVATE(mitem); + if(priv->scrubbing == TRUE) + { + //g_debug("don't update the slider or timeline, slider is being scrubbed"); + return; + } gint position = progress * dbusmenu_menuitem_property_get_int(priv->twin_item, DBUSMENU_SCRUB_MENUITEM_DURATION); gchar* left_text = scrub_widget_format_time(position); @@ -249,13 +300,39 @@ scrub_widget_timeline_frame_cb( IdoTimeline *timeline, GtkRange *range = (GtkRange*)slider; gtk_range_set_value(range, progress * 100); - g_debug("position in seconds %i and in words %s", position, left_text); + /*g_debug("position in seconds %i and in words %s", position, left_text); g_debug("timeline is running: %i", (gint)ido_timeline_is_running(priv->time_line)); g_debug("timeline duration = %i", ido_timeline_get_duration(priv->time_line)); - + */ g_free(left_text); } + +static void +scrub_widget_slider_released(GtkWidget *widget, gpointer user_data) +{ + ScrubWidget* mitem = SCRUB_WIDGET(user_data); + ScrubWidgetPrivate * priv = SCRUB_WIDGET_GET_PRIVATE(mitem); + priv->scrubbing = FALSE; + GtkWidget *slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)priv->ido_scrub_bar); + gdouble new_value = gtk_range_get_value(GTK_RANGE(slider)); + g_debug("okay set the scrub position with %f", new_value); + GValue value = {0}; + g_value_init(&value, G_TYPE_DOUBLE); + gdouble clamped = CLAMP(new_value, 0, 100); + g_value_set_double(&value, clamped); + dbusmenu_menuitem_handle_event (priv->twin_item, "scrubbing", &value, 0); +} + +static void +scrub_widget_slider_grabbed(GtkWidget *widget, gpointer user_data) +{ + ScrubWidget* mitem = SCRUB_WIDGET(user_data); + ScrubWidgetPrivate * priv = SCRUB_WIDGET_GET_PRIVATE(mitem); + priv->scrubbing = TRUE; + +} + static void scrub_widget_timeline_started_cb( IdoTimeline *timeline, gpointer user_data) @@ -286,3 +363,4 @@ scrub_widget_new(DbusmenuMenuitem *item) return widget; } + diff --git a/src/sound-service.c b/src/sound-service.c index 16fa87c..8768cd3 100644 --- a/src/sound-service.c +++ b/src/sound-service.c @@ -42,8 +42,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-menu-item.vala b/src/transport-menu-item.vala index 8e837c2..3d6dcdd 100644 --- a/src/transport-menu-item.vala +++ b/src/transport-menu-item.vala @@ -32,6 +32,7 @@ public class TransportMenuitem : PlayerItem public TransportMenuitem(PlayerController parent) { Object(item_type: MENUITEM_TYPE, owner: parent); + this.property_set_int(MENUITEM_PLAY_STATE, 1); } public void change_play_state(int state) -- cgit v1.2.3 From c7316aef6047ef29ab71fbcd34d6932fb0e521ad Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 22 Jul 2010 20:28:54 +0200 Subject: prep for 0.3.8 release --- configure.ac | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 222a3da..8dcaaea 100644 --- a/configure.ac +++ b/configure.ac @@ -1,10 +1,10 @@ -AC_INIT(indicator-sound, 0.3.7, conor.curran@canonical.com) +AC_INIT(indicator-sound, 0.3.8, conor.curran@canonical.com) AC_PREREQ(2.53) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(indicator-sound, 0.3.7) +AM_INIT_AUTOMAKE(indicator-sound, 0.3.8) AM_MAINTAINER_MODE @@ -33,7 +33,7 @@ INDICATOR_REQUIRED_VERSION=0.3.6 DBUSMENUGTK_REQUIRED_VERSION=0.2.2 POLKIT_REQUIRED_VERSION=0.92 PULSE_AUDIO_REQUIRED_VERSION=0.9.19 -INDICATOR_DISPLAY_OBJECTS=0.1.9 +INDICATOR_DISPLAY_OBJECTS=0.1.10 INDICATE_REQUIRED_VERSION=0.4.1 DBUSMENUGLIB_REQUIRED_VERSION=0.3.1 -- cgit v1.2.3