From 5a9881a144df8a9c36f9d5b96ea53e872c76949b Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 8 Jun 2010 14:26:57 +0100 Subject: new transport bar --- src/Makefile.am | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/Makefile.am') diff --git a/src/Makefile.am b/src/Makefile.am index a1ecece..716cab2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -47,7 +47,8 @@ sound-service-server.h: $(srcdir)/sound-service.xml # libsoundmenu vala ##################### music_bridge_VALASOURCES = \ - music-player-bridge.vala + music-player-bridge.vala \ + transport-menu-item.vala music_bridge_VALAFLAGS = \ --ccode \ -- cgit v1.2.3 From 744083d4483291a87f4f348d6937257d8887cfb1 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 8 Jun 2010 18:09:48 +0100 Subject: moving in the right direction --- src/Makefile.am | 4 +++- src/indicator-sound.c | 2 ++ src/music-player-bridge.vala | 9 ++++----- src/sound-service.c | 6 +++--- src/transport-bar.c | 25 ++++++++++++------------- src/transport-bar.h | 4 ++-- src/transport-menu-item.vala | 2 +- 7 files changed, 27 insertions(+), 25 deletions(-) (limited to 'src/Makefile.am') diff --git a/src/Makefile.am b/src/Makefile.am index 716cab2..f7fb1a1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -9,6 +9,8 @@ soundmenulib_LTLIBRARIES = libsoundmenu.la libsoundmenu_la_SOURCES = \ common-defs.h \ indicator-sound.h \ + transport-bar.c \ + transport-bar.h \ indicator-sound.c \ dbus-shared-names.h \ sound-service-client.h @@ -88,7 +90,7 @@ indicator_sound_service_SOURCES = \ slider-menu-item.c \ $(music_bridge_VALASOURCES:.vala=.c) -indicator_sound_service_CFLAGS = $(PULSEAUDIO_CFLAGS) $(SOUNDSERVICE_CFLAGS) $(GCONF_CFLAGS) -DLIBEXECDIR=\"$(libexecdir)\" -Wall -Werror +indicator_sound_service_CFLAGS = $(PULSEAUDIO_CFLAGS) $(SOUNDSERVICE_CFLAGS) $(GCONF_CFLAGS) -DLIBEXECDIR=\"$(libexecdir)\" -Wall indicator_sound_service_LDADD = $(PULSEAUDIO_LIBS) $(SOUNDSERVICE_LIBS) $(GCONF_LIBS) ######################### diff --git a/src/indicator-sound.c b/src/indicator-sound.c index 31f023e..e13c52b 100755 --- a/src/indicator-sound.c +++ b/src/indicator-sound.c @@ -38,6 +38,7 @@ with this program. If not, see . #include #include "indicator-sound.h" +#include "transport-bar" #include "dbus-shared-names.h" #include "sound-service-client.h" #include "common-defs.h" @@ -312,6 +313,7 @@ new_slider_item(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuC static gboolean new_transport_bar(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client) { g_debug("indicator-sound: new_transport_bar() called "); + TransportBar* bar = transport_bar_new(); return TRUE; } diff --git a/src/music-player-bridge.vala b/src/music-player-bridge.vala index cd5d65d..dc66101 100644 --- a/src/music-player-bridge.vala +++ b/src/music-player-bridge.vala @@ -48,11 +48,10 @@ public class MusicPlayerBridge : GLib.Object if(server_is_not_of_interest(type)) return; string client_name = type.split(".")[1]; if (root_menu != null && client_name != null){ - Dbusmenu.Menuitem client_item = new Dbusmenu.Menuitem(); - - client_item.property_set(MENUITEM_PROP_LABEL, client_name.concat(" is registered")); - registered_clients.set(client_name, client_item); - root_menu.child_append(client_item); + TransportMenuItem transport_item = new TransportMenuItem(); + //client_item.property_set(MENUITEM_PROP_LABEL, client_name.concat(" is registered")); + registered_clients.set(client_name, transport_item); + root_menu.child_append(transport_item); debug("client of name %s has successfully registered with us", client_name); } } diff --git a/src/sound-service.c b/src/sound-service.c index e20de30..3ec7a60 100644 --- a/src/sound-service.c +++ b/src/sound-service.c @@ -44,9 +44,9 @@ 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); + // TODO: uncomment for release !! + //close_pulse_activites(); + //g_main_loop_quit(mainloop); } return; } diff --git a/src/transport-bar.c b/src/transport-bar.c index ef1edb4..8573cae 100644 --- a/src/transport-bar.c +++ b/src/transport-bar.c @@ -24,11 +24,16 @@ with this program. If not, see . #include #include "transport-bar.h" #include "common-defs.h" +#include typedef struct _TransportBarPrivate TransportBarPrivate; struct _TransportBarPrivate { + GtkWidget* hBox; + GtkWidget* previous_button; + GtkWidget* play_button; + GtkWidget* next_button; }; #define TRANSPORT_BAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRANSPORT_BAR_TYPE, TransportBarPrivate)) @@ -38,7 +43,6 @@ static void transport_bar_class_init (TransportBarClass *klass); static void transport_bar_init (TransportBar *self); static void transport_bar_dispose (GObject *object); static void transport_bar_finalize (GObject *object); -//static void handle_event (DbusmenuMenuitem * mi, const gchar * name, const GValue * value, guint timestamp); G_DEFINE_TYPE (TransportBar, transport_bar, DBUSMENU_TYPE_MENUITEM); static void @@ -51,8 +55,6 @@ transport_bar_class_init (TransportBarClass *klass) object_class->dispose = transport_bar_dispose; object_class->finalize = transport_bar_finalize; - //DbusmenuMenuitemClass * mclass = DBUSMENU_MENUITEM_CLASS(klass); - //mclass->handle_event = handle_event; return; } @@ -60,6 +62,13 @@ static void transport_bar_init (TransportBar *self) { g_debug("Building new Transport Item"); + hBox = gtk_hbox_new(TRUE, 2)); + previous_button = gtk_button_new_with_label("Previous")); + next_button = gtk_button_new_with_label("Next")); + play_button = gtk_button_new_with_label("Play")); + gtk_container_add((GtkContainer*) hBox, previous_button); + gtk_container_add((GtkContainer*) hBox, next_button); + gtk_container_add((GtkContainer*) hBox, play_button); return; } @@ -76,19 +85,9 @@ transport_bar_finalize (GObject *object) G_OBJECT_CLASS (transport_bar_parent_class)->finalize (object); } - -//static void -//handle_event (DbusmenuMenuitem * mi, const gchar * name, const GValue * value, guint timestamp) -//{ -// g_debug("TransportBar -> handle event caught!"); -//} - - - TransportBar* transport_bar_new() { TransportBar *self = g_object_new(TRANSPORT_BAR_TYPE, NULL); - //dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_TRANSPORT_MENUITEM_TYPE); return self; } diff --git a/src/transport-bar.h b/src/transport-bar.h index 77a1a97..e931298 100644 --- a/src/transport-bar.h +++ b/src/transport-bar.h @@ -40,8 +40,8 @@ struct _TransportBarClass { struct _TransportBar { }; -GType transport_item_get_type (void); -TransportBar* transport_item_new(); +GType transport_bar_get_type (void); +TransportBar* transport_bar_new(); G_END_DECLS diff --git a/src/transport-menu-item.vala b/src/transport-menu-item.vala index 812ef6a..11120b0 100644 --- a/src/transport-menu-item.vala +++ b/src/transport-menu-item.vala @@ -11,7 +11,7 @@ public class TransportMenuItem : Dbusmenu.Menuitem this.property_set(MENUITEM_PROP_TYPE, DBUSMENU_TRANSPORT_MENUITEM_TYPE); } - public override void handle_event(string name, GLib.Value value, uint timestamp) + public override void handle_event(string name, GLib.Value input_value, uint timestamp) { debug("TransportItem -> handle event caught!"); } -- cgit v1.2.3 From c98d1cd6c1f1bc875eae17d77680c8ce5d6acb5f Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 10 Jun 2010 12:46:17 +0100 Subject: player controller object underway --- src/Makefile.am | 3 ++- src/music-player-bridge.vala | 19 +++++------------- src/player-controller.vala | 47 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 15 deletions(-) create mode 100644 src/player-controller.vala (limited to 'src/Makefile.am') diff --git a/src/Makefile.am b/src/Makefile.am index f7fb1a1..3479cb9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -50,7 +50,8 @@ sound-service-server.h: $(srcdir)/sound-service.xml ##################### music_bridge_VALASOURCES = \ music-player-bridge.vala \ - transport-menu-item.vala + transport-menu-item.vala \ + player-controller.vala music_bridge_VALAFLAGS = \ --ccode \ diff --git a/src/music-player-bridge.vala b/src/music-player-bridge.vala index 92f9dc5..89f633b 100644 --- a/src/music-player-bridge.vala +++ b/src/music-player-bridge.vala @@ -7,11 +7,11 @@ public class MusicPlayerBridge : GLib.Object private Listener listener; private Dbusmenu.Menuitem root_menu; - private HashMap registered_clients; + private HashMap registered_clients; public MusicPlayerBridge() { - registered_clients = new HashMap (); + registered_clients = new HashMap (); listener = Listener.ref_default(); listener.indicator_added.connect(on_indicator_added); listener.indicator_removed.connect(on_indicator_removed); @@ -48,15 +48,8 @@ public class MusicPlayerBridge : GLib.Object if(server_is_not_of_interest(type)) return; string client_name = type.split(".")[1]; if (root_menu != null && client_name != null){ - Dbusmenu.Menuitem client_item = new Dbusmenu.Menuitem(); - client_item.property_set(MENUITEM_PROP_LABEL, client_name.concat(" is registered")); - TransportMenuItem transport_item = new TransportMenuItem(); - root_menu.child_append(client_item); - root_menu.child_append(transport_item); - - registered_clients.set(client_name, client_item); - // hackery -> need to wrap player sections into its own object - registered_clients.set("transport", transport_item); + PlayerController ctrl = new PlayerController(root_menu, client_name, true); + registered_clients.set(client_name, ctrl); debug("client of name %s has successfully registered with us", client_name); } } @@ -67,10 +60,8 @@ public class MusicPlayerBridge : GLib.Object if(server_is_not_of_interest(type)) return; string client_name = type.split(".")[1]; if (root_menu != null && client_name != null){ - root_menu.child_delete(registered_clients[client_name]); - root_menu.child_delete(registered_clients["transport"]); + registered_clients[client_name].vanish(); registered_clients.remove(client_name); - registered_clients.remove("transport"); debug("Successively removed menu_item for client %s from registered_clients", client_name); } } diff --git a/src/player-controller.vala b/src/player-controller.vala new file mode 100644 index 0000000..9cdf527 --- /dev/null +++ b/src/player-controller.vala @@ -0,0 +1,47 @@ +using Dbusmenu; +using Gee; + +public class PlayerController : GLib.Object +{ + private Dbusmenu.Menuitem root_menu; + private string name; + private bool is_active; + private ArrayList custom_items; + + public PlayerController(Dbusmenu.Menuitem root, string client_name, bool active) + { + this.root_menu = root; + this.name = format_client_name(client_name); + this.is_active = active; + this.custom_items = new ArrayList(); + //Dbusmenu.Menuitem[]; + self_construct(); + } + + public void self_construct() + { + Dbusmenu.Menuitem client_item = new Dbusmenu.Menuitem(); + this.custom_items.add(client_item); + client_item.property_set(MENUITEM_PROP_LABEL, this.name.concat("")); + TransportMenuItem transport_item = new TransportMenuItem(); + this.custom_items.add(transport_item); + root_menu.child_append(client_item); + root_menu.child_append(transport_item); + } + + public void vanish() + { + foreach(Dbusmenu.Menuitem item in this.custom_items){ + root_menu.child_delete(item); + } + } + + public static string format_client_name(string client_name) + { + debug("PlayerController->format_client_name"); + //string first_letter = client_name.slice(1); + //debug("PlayerController->format_client_name - first_letter: %s", first_letter); + return client_name; + } + +} \ No newline at end of file -- cgit v1.2.3 From 448e45e3fa53620804ab8ec9c5940946f45a8b62 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Fri, 11 Jun 2010 15:09:07 +0100 Subject: new widget for the metadata --- src/Makefile.am | 3 + src/common-defs.h | 8 +- src/metadata-menu-item.vala | 26 +++++++ src/metadata-widget.c | 179 +++++++++++++++++++++++++++++++++++++++++++ src/metadata-widget.c~ | 179 +++++++++++++++++++++++++++++++++++++++++++ src/metadata-widget.h | 51 ++++++++++++ src/metadata-widget.h~ | 51 ++++++++++++ src/player-controller.vala | 17 ++-- src/transport-bar.c | 51 +++++++++--- src/transport-bar.h | 3 +- src/transport-menu-item.vala | 10 +-- 11 files changed, 551 insertions(+), 27 deletions(-) create mode 100644 src/metadata-menu-item.vala create mode 100644 src/metadata-widget.c create mode 100644 src/metadata-widget.c~ create mode 100644 src/metadata-widget.h create mode 100644 src/metadata-widget.h~ (limited to 'src/Makefile.am') diff --git a/src/Makefile.am b/src/Makefile.am index 3479cb9..b28903b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -11,6 +11,8 @@ libsoundmenu_la_SOURCES = \ indicator-sound.h \ transport-bar.c \ transport-bar.h \ + metadata-widget.c \ + metadata-widget.h \ indicator-sound.c \ dbus-shared-names.h \ sound-service-client.h @@ -51,6 +53,7 @@ sound-service-server.h: $(srcdir)/sound-service.xml music_bridge_VALASOURCES = \ music-player-bridge.vala \ transport-menu-item.vala \ + metadata-menu-item.vala \ player-controller.vala music_bridge_VALAFLAGS = \ diff --git a/src/common-defs.h b/src/common-defs.h index 5393400..e38b15f 100644 --- a/src/common-defs.h +++ b/src/common-defs.h @@ -27,4 +27,10 @@ with this program. If not, see . /* DBUS Custom Items */ #define DBUSMENU_SLIDER_MENUITEM_TYPE "x-canonical-ido-slider-item" #define DBUSMENU_TRANSPORT_MENUITEM_TYPE "x-canonical-transport-bar" -#define DBUSMENU_TRANSPORT_MENUITEM_STATE "x-canonical-transport-state" \ No newline at end of file +#define DBUSMENU_TRANSPORT_MENUITEM_STATE "x-canonical-transport-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_PIECE = "x-canonical-metadata-text-piece"; +#define DBUSMENU_METADATA_MENUITEM_TEXT_CONTAINER = "x-canonical-metadata-text-container"; +#define DBUSMENU_METADATA_MENUITEM_IMAGE = "x-canonical-metadata-image"; diff --git a/src/metadata-menu-item.vala b/src/metadata-menu-item.vala new file mode 100644 index 0000000..0f6d7d5 --- /dev/null +++ b/src/metadata-menu-item.vala @@ -0,0 +1,26 @@ +using Dbusmenu; +using Gee; + +public class MetadataMenuitem : Dbusmenu.Menuitem +{ + /* Not ideal duplicate definition of const - see common-defs/h */ + const string DBUSMENU_METADATA_MENUITEM_TYPE = "x-canonical-metadata-menu-item"; + const string DBUSMENU_METADATA_MENUITEM_TEXT_ARTIST = "x-canonical-metadata-text-artist"; + const string DBUSMENU_METADATA_MENUITEM_TEXT_PIECE = "x-canonical-metadata-text-piece"; + const string DBUSMENU_METADATA_MENUITEM_TEXT_CONTAINER = "x-canonical-metadata-text-container"; + const string DBUSMENU_METADATA_MENUITEM_IMAGE = "x-canonical-metadata-image"; + + public MetadataMenuitem() + { + this.property_set(MENUITEM_PROP_TYPE, DBUSMENU_METADATA_MENUITEM_TYPE); + this.property_set(DBUSMENU_METADATA_MENUITEM_TEXT_ARTIST, "Sonnamble"); + this.property_set(DBUSMENU_METADATA_MENUITEM_TEXT_PIECE, "Nocturne"); + this.property_set(DBUSMENU_METADATA_MENUITEM_TEXT_CONTAINER, "Seven Months in E minor"); + this.property_set(DBUSMENU_METADATA_MENUITEM_IMAGE, ""); + } + + public override void handle_event(string name, GLib.Value input_value, uint timestamp) + { + debug("MetadataItem -> handle event caught!"); + } +} \ No newline at end of file diff --git a/src/metadata-widget.c b/src/metadata-widget.c new file mode 100644 index 0000000..5e20f15 --- /dev/null +++ b/src/metadata-widget.c @@ -0,0 +1,179 @@ +/* +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 "metadata-widget.h" +#include "common-defs.h" +#include + +// TODO: think about leakage: ted ! + + + +static DbusmenuMenuitem* twin_item; + +typedef struct _MetadataWidgetPrivate MetadataWidgetPrivate; + +struct _MetadataWidgetPrivate +{ + GtkWidget* hbox; +}; + +#define METADATA_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), METADATA_WIDGET_TYPE, MetadataWidgetPrivate)) + +/* Prototypes */ +static void metadata_widget_class_init (MetadataWidgetClass *klass); +static void metadata_widget_init (MetadataWidget *self); +static void metadata_widget_dispose (GObject *object); +static void metadata_widget_finalize (GObject *object); +// keyevent consumers +static gboolean metadata_widget_button_press_event (GtkWidget *menuitem, + GdkEventButton *event); +static gboolean metadata_widget_button_release_event (GtkWidget *menuitem, + GdkEventButton *event); + + +// Dbusmenuitem update callback +static void metadata_widget_update_state(gchar * property, + GValue * value, + gpointer userdata); + + + +G_DEFINE_TYPE (MetadataWidget, metadata_widget, GTK_TYPE_MENU_ITEM); + + + +static void +metadata_widget_class_init (MetadataWidgetClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + widget_class->button_press_event = metadata_widget_button_press_event; + widget_class->button_release_event = metadata_widget_button_release_event; + + g_type_class_add_private (klass, sizeof (MetadataWidgetPrivate)); + + gobject_class->dispose = metadata_widget_dispose; + gobject_class->finalize = metadata_widget_finalize; + +} + +static void +metadata_widget_init (MetadataWidget *self) +{ + g_debug("MetadataWidget::metadata_widget_init"); + + MetadataWidgetPrivate * priv = METADATA_WIDGET_GET_PRIVATE(self); + GtkWidget *hbox; + + hbox = gtk_hbox_new(TRUE, 2); + + g_signal_connect(G_OBJECT(twin_item), "property-changed", G_CALLBACK(metadata_widget_update_state), self); + + gtk_widget_show_all (priv->hbox); + gtk_container_add (GTK_CONTAINER (self), hbox); + +} + +static void +metadata_widget_dispose (GObject *object) +{ + //if(IS_METADATA_WIDGET(object) == TRUE){ + // MetadataWidget * priv = METADATA_WIDGET_GET_PRIVATE(METADATA_WIDGET(object)); + // g_object_unref(priv->previous_button); + //} + G_OBJECT_CLASS (metadata_widget_parent_class)->dispose (object); +} + +static void +metadata_widget_finalize (GObject *object) +{ + G_OBJECT_CLASS (metadata_widget_parent_class)->finalize (object); +} + +/* Suppress/consume keyevents */ +static gboolean +metadata_widget_button_press_event (GtkWidget *menuitem, + GdkEventButton *event) +{ + g_debug("MetadataWidget::menu_press_event"); + return TRUE; +} + +static gboolean +metadata_widget_button_release_event (GtkWidget *menuitem, + GdkEventButton *event) +{ + g_debug("MetadataWidget::menu_release_event"); + return TRUE; +} + + +//TODO figure out why the userdata is not what I expect it to be. +static void metadata_widget_update_state(gchar *property, GValue *value, gpointer userdata) +{ + //MetadataWidget* bar = (MetadataWidget*)userdata; + // TODO problem line + //if(IS_METADATA_WIDGET(bar)){ + //g_debug("after line 1!!"); + + //MetadataWidget *priv = METADATA_WIDGET_GET_PRIVATE(bar); + //g_debug("after line 2!!"); + //gchar* label = "changed"; + //g_debug("after line 3!!"); + //gtk_button_set_label(GTK_BUTTON(priv->play_button), g_strdup(label)); + //} + //if(GTK_IS_BUTTON(GTK_BUTTON(priv->play_button))){ + + // gtk_button_set_label(GTK_BUTTON(priv->play_button), g_strdup(label)); + // g_debug("its a button"); + //} + //else{ + //g_debug("No Goddamn button!!"); + //} + //} + g_debug("metadata_widget_update_state - with property %s", property); + + if (value == NULL){ + g_debug("value is null"); + return; + } + // TODO problem line + //gchar* input = g_strdup(g_value_get_string(value)); + //g_debug("metadata_widget_update_state - with value %s", input); + +} + + /** + * transport_new: + * @returns: a new #MetadataWidget. + **/ +GtkWidget* +metadata_widget_new(DbusmenuMenuitem *item) +{ + twin_item = item; + return g_object_new(METADATA_WIDGET_TYPE, NULL); +} + diff --git a/src/metadata-widget.c~ b/src/metadata-widget.c~ new file mode 100644 index 0000000..39a42db --- /dev/null +++ b/src/metadata-widget.c~ @@ -0,0 +1,179 @@ +/* +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 "metadata-widget.h" +#include "common-defs.h" +#include + +// TODO: think about leakage: ted ! + + + +static DbusmenuMenuitem* twin_item; + +typedef struct _MetadataWidgetPrivate MetadataWidgetPrivate; + +struct _MetadataWidgetPrivate +{ + GtkWidget* hbox; +}; + +#define METADATA_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), METADATA_WIDGET_TYPE, MetadataWidgetPrivate)) + +/* Prototypes */ +static void metadata_widget_class_init (MetadataWidgetClass *klass); +static void metadata_widget_init (MetadataWidget *self); +static void metadata_widget_dispose (GObject *object); +static void metadata_widget_finalize (GObject *object); +// keyevent consumers +static gboolean metadata_widget_button_press_event (GtkWidget *menuitem, + GdkEventButton *event); +static gboolean metadata_widget_button_release_event (GtkWidget *menuitem, + GdkEventButton *event); + + +// Dbusmenuitem update callback +static void metadata_widget_update_state(gchar * property, + GValue * value, + gpointer userdata); + + + +G_DEFINE_TYPE (MetadataWidget, metadata_widget, GTK_TYPE_MENU_ITEM); + + + +static void +metadata_widget_class_init (MetadataWidgetClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + widget_class->button_press_event = metadata_widget_press_event; + widget_class->button_release_event = metadata_widget_button_release_event; + + g_type_class_add_private (klass, sizeof (MetadataWidgetPrivate)); + + gobject_class->dispose = metadata_widget_dispose; + gobject_class->finalize = metadata_widget_finalize; + +} + +static void +metadata_widget_init (MetadataWidget *self) +{ + g_debug("MetadataWidget::metadata_widget_init"); + + MetadataWidgetPrivate * priv = METADATA_WIDGET_GET_PRIVATE(self); + GtkWidget *hbox; + + hbox = gtk_hbox_new(TRUE, 2); + + g_signal_connect(G_OBJECT(twin_item), "property-changed", G_CALLBACK(metadata_widget_update_state), self); + + gtk_widget_show_all (priv->hbox); + gtk_container_add (GTK_CONTAINER (self), hbox); + +} + +static void +metadata_widget_dispose (GObject *object) +{ + //if(IS_METADATA_WIDGET(object) == TRUE){ + // MetadataWidget * priv = METADATA_WIDGET_GET_PRIVATE(METADATA_WIDGET(object)); + // g_object_unref(priv->previous_button); + //} + G_OBJECT_CLASS (metadata_widget_parent_class)->dispose (object); +} + +static void +metadata_widget_finalize (GObject *object) +{ + G_OBJECT_CLASS (metadata_widget_parent_class)->finalize (object); +} + +/* Suppress/consume keyevents */ +static gboolean +metadata_widget_button_press_event (GtkWidget *menuitem, + GdkEventButton *event) +{ + g_debug("MetadataWidget::menu_press_event"); + return TRUE; +} + +static gboolean +metadata_widget_button_release_event (GtkWidget *menuitem, + GdkEventButton *event) +{ + g_debug("MetadataWidget::menu_release_event"); + return TRUE; +} + + +//TODO figure out why the userdata is not what I expect it to be. +static void metadata_widget_update_state(gchar *property, GValue *value, gpointer userdata) +{ + //MetadataWidget* bar = (MetadataWidget*)userdata; + // TODO problem line + //if(IS_METADATA_WIDGET(bar)){ + //g_debug("after line 1!!"); + + //MetadataWidget *priv = METADATA_WIDGET_GET_PRIVATE(bar); + //g_debug("after line 2!!"); + //gchar* label = "changed"; + //g_debug("after line 3!!"); + //gtk_button_set_label(GTK_BUTTON(priv->play_button), g_strdup(label)); + //} + //if(GTK_IS_BUTTON(GTK_BUTTON(priv->play_button))){ + + // gtk_button_set_label(GTK_BUTTON(priv->play_button), g_strdup(label)); + // g_debug("its a button"); + //} + //else{ + //g_debug("No Goddamn button!!"); + //} + //} + g_debug("metadata_widget_update_state - with property %s", property); + + if (value == NULL){ + g_debug("value is null"); + return; + } + // TODO problem line + //gchar* input = g_strdup(g_value_get_string(value)); + //g_debug("metadata_widget_update_state - with value %s", input); + +} + + /** + * transport_new: + * @returns: a new #MetadataWidget. + **/ +GtkWidget* +metadata_widget_new(DbusmenuMenuitem *item) +{ + twin_item = item; + return g_object_new(METADATA_WIDGET_TYPE, NULL); +} + diff --git a/src/metadata-widget.h b/src/metadata-widget.h new file mode 100644 index 0000000..ce7df5f --- /dev/null +++ b/src/metadata-widget.h @@ -0,0 +1,51 @@ +/* +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 __METADATA_WIDGET_H__ +#define __METADATA_WIDGET_H__ + +#include +#include + +G_BEGIN_DECLS + +#define METADATA_WIDGET_TYPE (metadata_widget_get_type ()) +#define METADATA_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), METADATA_WIDGET_TYPE, TransportBar)) +#define METADATA_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), METADATA_WIDGET_TYPE, MetadataWidgetClass)) +#define IS_METADATA_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), METADATA_WIDGET_TYPE)) +#define IS_METADATA_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), METADATA_WIDGET_TYPE)) +#define METADATA_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), METADATA_WIDGET_TYPE, MetadataWidgetClass)) + +typedef struct _MetadataWidget MetadataWidget; +typedef struct _MetadataWidgetClass MetadataWidgetClass; + +struct _MetadataWidgetClass { + GtkMenuItemClass parent_class; +}; + +struct _MetadataWidget { + GtkMenuItem parent; +}; + +GType metadata_widget_get_type (void); +GtkWidget* metadata_widget_new(DbusmenuMenuitem *twin_item); + +G_END_DECLS + +#endif + diff --git a/src/metadata-widget.h~ b/src/metadata-widget.h~ new file mode 100644 index 0000000..edffdf2 --- /dev/null +++ b/src/metadata-widget.h~ @@ -0,0 +1,51 @@ +/* +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 __METADATA_WIDGET_H__ +#define __METADATA_WIDGET_H__ + +#include +#include + +G_BEGIN_DECLS + +#define METADATA_WIDGET_TYPE (metadata_widget_get_type ()) +#define METADATA_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), METADATA_WIDGET_TYPE, TransportBar)) +#define METADATA_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), METADATA_WIDGET_TYPE, TransportBarClass)) +#define IS_METADATA_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), METADATA_WIDGET_TYPE)) +#define IS_METADATA_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), METADATA_WIDGET_TYPE)) +#define METADATA_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), METADATA_WIDGET_TYPE, TransportBarClass)) + +typedef struct _TransportBar TransportBar; +typedef struct _TransportBarClass TransportBarClass; + +struct _TransportBarClass { + GtkMenuItemClass parent_class; +}; + +struct _TransportBar { + GtkMenuItem parent; +}; + +GType metadata_widget_get_type (void); +GtkWidget* metadata_widget_new(DbusmenuMenuitem *twin_item); + +G_END_DECLS + +#endif + diff --git a/src/player-controller.vala b/src/player-controller.vala index a92d8bf..26ad1ff 100644 --- a/src/player-controller.vala +++ b/src/player-controller.vala @@ -8,7 +8,7 @@ public class PlayerController : GLib.Object private bool is_active; private ArrayList custom_items; - // TODO: pass in the appropriate position for the menu + // TODO: pass in the appropriate position for the menu (to handle multiple players) public PlayerController(Dbusmenu.Menuitem root, string client_name, bool active) { this.root_menu = root; @@ -38,8 +38,12 @@ public class PlayerController : GLib.Object title_item.property_set(MENUITEM_PROP_ICON_NAME, "applications-multimedia"); this.custom_items.add(title_item); + // Metadata item + MetadataMenuitem metadata_item = new MetadataMenuitem(); + this.custom_items.add(metadata_item); + // Transport item - TransportMenuItem transport_item = new TransportMenuItem(); + TransportMenuitem transport_item = new TransportMenuitem(); this.custom_items.add(transport_item); int offset = 2; @@ -48,12 +52,6 @@ public class PlayerController : GLib.Object } return true; } -// if(!root_menu.child_add_position(client_item, 2) || -// !root_menu.child_add_position(transport_item, 3)){ -// //TODO raise here! -// return false; -// } -// return true; private static string format_client_name(string client_name) @@ -62,8 +60,7 @@ public class PlayerController : GLib.Object if(formatted.len() > 1){ formatted = client_name.up(1).concat(client_name.slice(1, client_name.len())); debug("PlayerController->format_client_name - : %s", formatted); - } - + } return formatted; } diff --git a/src/transport-bar.c b/src/transport-bar.c index 46611dc..02d9a45 100644 --- a/src/transport-bar.c +++ b/src/transport-bar.c @@ -29,6 +29,9 @@ with this program. If not, see . // TODO: think about leakage: ted ! + +static DbusmenuMenuitem* twin_item; + typedef struct _TransportBarPrivate TransportBarPrivate; struct _TransportBarPrivate @@ -66,10 +69,13 @@ static gboolean transport_bar_play_button_trigger (GtkWidget *widget, GdkEventButton *event, gpointer user_data); static void transport_bar_update_state(gchar * property, - GValue * value); + GValue * value, + gpointer userdata); G_DEFINE_TYPE (TransportBar, transport_bar, GTK_TYPE_MENU_ITEM); + + static void transport_bar_class_init (TransportBarClass *klass) { @@ -138,7 +144,7 @@ transport_bar_init (TransportBar *self) g_signal_connect(priv->play_button, "button-press-event", G_CALLBACK(transport_bar_play_button_trigger), NULL); priv->hbox = hbox; - g_signal_connect(DBUSMENU_MENUITEM(self), "property-changed", G_CALLBACK(transport_bar_update_state), NULL); + g_signal_connect(G_OBJECT(twin_item), "property-changed", G_CALLBACK(transport_bar_update_state), self); gtk_widget_show_all (priv->hbox); gtk_container_add (GTK_CONTAINER (self), hbox); @@ -188,22 +194,49 @@ transport_bar_play_button_trigger(GtkWidget* widget, return FALSE; } -static void transport_bar_update_state(gchar *property, GValue *value) -{ - g_debug("transport_bar_update_state - %s", property); -} - -void transport_bar_connect_with_other_half(TransportBar *self, DbusmenuMenuitem *twin_item) +//TODO figure out why the userdata is not what I expect it to be. +static void transport_bar_update_state(gchar *property, GValue *value, gpointer userdata) { + //TransportBar* bar = (TransportBar*)userdata; + // TODO problem line + //if(IS_TRANSPORT_BAR(bar)){ + //g_debug("after line 1!!"); + + //TransportBarPrivate *priv = TRANSPORT_BAR_GET_PRIVATE(bar); + //g_debug("after line 2!!"); + //gchar* label = "changed"; + //g_debug("after line 3!!"); + //gtk_button_set_label(GTK_BUTTON(priv->play_button), g_strdup(label)); + //} + //if(GTK_IS_BUTTON(GTK_BUTTON(priv->play_button))){ + // gtk_button_set_label(GTK_BUTTON(priv->play_button), g_strdup(label)); + // g_debug("its a button"); + //} + //else{ + //g_debug("No Goddamn button!!"); + //} + //} + g_debug("transport_bar_update_state - with property %s", property); + + if (value == NULL){ + g_debug("value is null"); + return; + } + // TODO problem line + //gchar* input = g_strdup(g_value_get_string(value)); + //g_debug("transport_bar_update_state - with value %s", input); + } + /** * transport_new: * @returns: a new #TransportBar. **/ GtkWidget* -transport_bar_new() +transport_bar_new(DbusmenuMenuitem *item) { + twin_item = item; return g_object_new(TRANSPORT_BAR_TYPE, NULL); } diff --git a/src/transport-bar.h b/src/transport-bar.h index 93136e1..8a791ff 100644 --- a/src/transport-bar.h +++ b/src/transport-bar.h @@ -43,8 +43,7 @@ struct _TransportBar { }; GType transport_bar_get_type (void); -GtkWidget* transport_bar_new(); -void connect_with_other_half(DbusmenuMenuitem *twin_item); +GtkWidget* transport_bar_new(DbusmenuMenuitem *twin_item); G_END_DECLS diff --git a/src/transport-menu-item.vala b/src/transport-menu-item.vala index 9af52d1..0ecc9b1 100644 --- a/src/transport-menu-item.vala +++ b/src/transport-menu-item.vala @@ -1,21 +1,21 @@ using Dbusmenu; using Gee; -public class TransportMenuItem : Dbusmenu.Menuitem +public class TransportMenuitem : Dbusmenu.Menuitem { /* Not ideal duplicate definition of const - see common-defs/h */ const string DBUSMENU_TRANSPORT_MENUITEM_TYPE = "x-canonical-transport-bar"; const string DBUSMENU_TRANSPORT_MENUITEM_STATE = "x-canonical-transport-state"; - public TransportMenuItem() + public TransportMenuitem() { this.property_set(MENUITEM_PROP_TYPE, DBUSMENU_TRANSPORT_MENUITEM_TYPE); - this.property_set(MENUITEM_PROP_TYPE, DBUSMENU_TRANSPORT_MENUITEM_STATE); + this.property_set(DBUSMENU_TRANSPORT_MENUITEM_STATE, "play"); } public override void handle_event(string name, GLib.Value input_value, uint timestamp) { + this.property_set(DBUSMENU_TRANSPORT_MENUITEM_STATE, "1"); debug("TransportItem -> handle event caught!"); - } - + } } \ No newline at end of file -- cgit v1.2.3 From b5684bb4f3480c59d63a02b5f658382d7b0e52a7 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Mon, 14 Jun 2010 19:48:11 +0100 Subject: rename of transport-bar --- src/Makefile.am | 4 +-- src/indicator-sound.c | 6 ++-- src/metadata-widget.c | 52 ++++++++++++++++++++-------- src/metadata-widget.c~ | 57 ++++++++++++++++++++++--------- src/transport-bar.c | 92 +++++++++++++++++++++++++------------------------- src/transport-bar.h | 28 +++++++-------- 6 files changed, 144 insertions(+), 95 deletions(-) (limited to 'src/Makefile.am') diff --git a/src/Makefile.am b/src/Makefile.am index b28903b..2a19c3d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -9,8 +9,8 @@ soundmenulib_LTLIBRARIES = libsoundmenu.la libsoundmenu_la_SOURCES = \ common-defs.h \ indicator-sound.h \ - transport-bar.c \ - transport-bar.h \ + transport-widget.c \ + transport-widget.h \ metadata-widget.c \ metadata-widget.h \ indicator-sound.c \ diff --git a/src/indicator-sound.c b/src/indicator-sound.c index af2a6f9..ebafd9a 100755 --- a/src/indicator-sound.c +++ b/src/indicator-sound.c @@ -38,7 +38,7 @@ with this program. If not, see . #include #include "indicator-sound.h" -#include "transport-bar.h" +#include "transport-widget.h" #include "metadata-widget.h" #include "dbus-shared-names.h" #include "sound-service-client.h" @@ -314,7 +314,7 @@ new_slider_item(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuC } static gboolean -new_transport_bar(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client) +new_transport_widget(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client) { g_debug("indicator-sound: new_transport_bar() called "); @@ -323,7 +323,7 @@ new_transport_bar(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbusmen g_return_val_if_fail(DBUSMENU_IS_MENUITEM(newitem), FALSE); g_return_val_if_fail(DBUSMENU_IS_GTKCLIENT(client), FALSE); - bar = transport_bar_new(newitem); + bar = transport_widget_new(newitem); GtkMenuItem *menu_transport_bar = GTK_MENU_ITEM(bar); dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, menu_transport_bar, parent); diff --git a/src/metadata-widget.c b/src/metadata-widget.c index 70542e9..a451ad7 100644 --- a/src/metadata-widget.c +++ b/src/metadata-widget.c @@ -34,7 +34,10 @@ struct _MetadataWidgetPrivate { GtkWidget* hbox; GtkWidget* album_art; - gchar* our_path; + gchar* our_path; + GtkWidget* artist_label; + GtkWidget* piece_label; + GtkWidget* container_label; }; #define METADATA_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), METADATA_WIDGET_TYPE, MetadataWidgetPrivate)) @@ -49,13 +52,11 @@ static gboolean metadata_widget_button_press_event (GtkWidget *menuitem, GdkEventButton *event); static gboolean metadata_widget_button_release_event (GtkWidget *menuitem, GdkEventButton *event); - - -// Dbusmenuitem update callback +// Dbusmenuitem properties update callback static void metadata_widget_update_state(gchar * property, GValue * value, gpointer userdata); - +//static void update_content( G_DEFINE_TYPE (MetadataWidget, metadata_widget, GTK_TYPE_MENU_ITEM); @@ -84,22 +85,47 @@ metadata_widget_init (MetadataWidget *self) g_debug("MetadataWidget::metadata_widget_init"); MetadataWidgetPrivate * priv = METADATA_WIDGET_GET_PRIVATE(self); - GtkWidget *hbox; - hbox = gtk_hbox_new(TRUE, 2); + GtkWidget *hbox; + hbox = gtk_hbox_new(TRUE, 0); + priv->hbox = hbox; + + // image const gchar* path = dbusmenu_menuitem_property_get(twin_item, DBUSMENU_METADATA_MENUITEM_IMAGE_PATH); - g_debug("MetadataWidget:init - path = %s", path); - priv->our_path = g_strdup(path); + GdkPixbuf* pixbuf; + pixbuf=gdk_pixbuf_new_from_file(path, NULL); + pixbuf=gdk_pixbuf_scale_simple(pixbuf,60,60,GDK_INTERP_BILINEAR); + priv->album_art = gtk_image_new_from_pixbuf(pixbuf); + g_object_unref(pixbuf); + gtk_box_pack_start (GTK_BOX (priv->hbox), priv->album_art, FALSE, FALSE, 0); + GtkWidget* vbox = gtk_vbox_new(TRUE, 0); + + // artist + GtkWidget* artist; + artist = gtk_label_new(dbusmenu_menuitem_property_get(twin_item, DBUSMENU_METADATA_MENUITEM_TEXT_ARTIST)); + priv->artist_label = artist; + gtk_box_pack_start (GTK_BOX (vbox), priv->artist_label, FALSE, FALSE, 0); + + // piece + GtkWidget* piece; + piece = gtk_label_new(dbusmenu_menuitem_property_get(twin_item, DBUSMENU_METADATA_MENUITEM_TEXT_PIECE)); + priv->piece_label = piece; + gtk_box_pack_start (GTK_BOX (vbox), priv->piece_label, FALSE, FALSE, 0); - priv->album_art = gtk_image_new_from_file(priv->our_path); + // container + GtkWidget* container; + container = gtk_label_new(dbusmenu_menuitem_property_get(twin_item, DBUSMENU_METADATA_MENUITEM_TEXT_CONTAINER)); + priv->container_label = container; + gtk_box_pack_start (GTK_BOX (vbox), priv->container_label, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (priv->hbox), vbox, FALSE, FALSE, 0); + g_signal_connect(G_OBJECT(twin_item), "property-changed", G_CALLBACK(metadata_widget_update_state), self); - - gtk_widget_show_all (priv->hbox); + gtk_widget_show_all (priv->hbox); gtk_container_add (GTK_CONTAINER (self), hbox); } @@ -133,8 +159,6 @@ metadata_widget_button_release_event (GtkWidget *menuitem, return TRUE; } - -//TODO figure out why the userdata is not what I expect it to be. static void metadata_widget_update_state(gchar *property, GValue *value, gpointer userdata) { g_debug("metadata_widget_update_state - with property %s", property); diff --git a/src/metadata-widget.c~ b/src/metadata-widget.c~ index df58de5..add3c36 100644 --- a/src/metadata-widget.c~ +++ b/src/metadata-widget.c~ @@ -34,7 +34,10 @@ struct _MetadataWidgetPrivate { GtkWidget* hbox; GtkWidget* album_art; - gchar* our_path; + gchar* our_path; + GtkWidget* artist_label; + GtkWidget* piece_label; + GtkWidget* container_label; }; #define METADATA_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), METADATA_WIDGET_TYPE, MetadataWidgetPrivate)) @@ -49,13 +52,11 @@ static gboolean metadata_widget_button_press_event (GtkWidget *menuitem, GdkEventButton *event); static gboolean metadata_widget_button_release_event (GtkWidget *menuitem, GdkEventButton *event); - - -// Dbusmenuitem update callback +// Dbusmenuitem properties update callback static void metadata_widget_update_state(gchar * property, GValue * value, gpointer userdata); - +//static void update_content( G_DEFINE_TYPE (MetadataWidget, metadata_widget, GTK_TYPE_MENU_ITEM); @@ -84,22 +85,48 @@ metadata_widget_init (MetadataWidget *self) g_debug("MetadataWidget::metadata_widget_init"); MetadataWidgetPrivate * priv = METADATA_WIDGET_GET_PRIVATE(self); - GtkWidget *hbox; - hbox = gtk_hbox_new(TRUE, 2); - - //const gchar* path = dbusmenu_menuitem_property_get(twin_item, DBUSMENU_METADATA_MENUITEM_IMAGE_PATH); - - //g_debug("MetadataWidget:init - path = %s", path); + GtkWidget *hbox; + hbox = gtk_hbox_new(TRUE, 0); + priv->hbox = hbox; + + // image + const gchar* path = dbusmenu_menuitem_property_get(twin_item, DBUSMENU_METADATA_MENUITEM_IMAGE_PATH); + g_debug("MetadataWidget:init - path = %s", path); priv->our_path = g_strdup(path); + GdkPixbuf* pixbuf; + pixbuf=gdk_pixbuf_new_from_file(path, NULL); + pixbuf=gdk_pixbuf_scale_simple(pixbuf,60,60,GDK_INTERP_BILINEAR); + priv->album_art = gtk_image_new_from_pixbuf(pixbuf); + g_object_unref(pixbuf); + gtk_box_pack_start (GTK_BOX (priv->hbox), priv->album_art, FALSE, FALSE, 0); + GtkWidget* vbox = gtk_vbox_new(TRUE, 0); + + // artist + GtkWidget* artist; + artist = gtk_label_new(dbusmenu_menuitem_property_get(twin_item, DBUSMENU_METADATA_MENUITEM_TEXT_ARTIST)); + priv->artist_label = artist; + gtk_box_pack_start (GTK_BOX (vbox), priv->artist_label, FALSE, FALSE, 0); + + + // piece + GtkWidget* piece; + piece = gtk_label_new(dbusmenu_menuitem_property_get(twin_item, DBUSMENU_METADATA_MENUITEM_TEXT_PIECE)); + priv->piece_label = piece; + gtk_box_pack_start (GTK_BOX (vbox), priv->piece_label, FALSE, FALSE, 0); - priv->album_art = gtk_image_new_from_file(priv->our_path); + // container + GtkWidget* container; + container = gtk_label_new(dbusmenu_menuitem_property_get(twin_item, DBUSMENU_METADATA_MENUITEM_TEXT_CONTAINER)); + priv->container_label = container; + gtk_box_pack_start (GTK_BOX (vbox), priv->container_label, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (priv->hbox), vbox, FALSE, FALSE, 0); + g_signal_connect(G_OBJECT(twin_item), "property-changed", G_CALLBACK(metadata_widget_update_state), self); - - gtk_widget_show_all (priv->hbox); + gtk_widget_show_all (priv->hbox); gtk_container_add (GTK_CONTAINER (self), hbox); } @@ -133,8 +160,6 @@ metadata_widget_button_release_event (GtkWidget *menuitem, return TRUE; } - -//TODO figure out why the userdata is not what I expect it to be. static void metadata_widget_update_state(gchar *property, GValue *value, gpointer userdata) { g_debug("metadata_widget_update_state - with property %s", property); diff --git a/src/transport-bar.c b/src/transport-bar.c index 96ae287..bc2ee40 100644 --- a/src/transport-bar.c +++ b/src/transport-bar.c @@ -30,9 +30,9 @@ with this program. If not, see . static DbusmenuMenuitem* twin_item; -typedef struct _TransportBarPrivate TransportBarPrivate; +typedef struct _TransportWidgetPrivate TransportWidgetPrivate; -struct _TransportBarPrivate +struct _TransportWidgetPrivate { GtkWidget* hbox; GtkWidget* previous_button; @@ -50,46 +50,46 @@ enum { static guint signals[LAST_SIGNAL] = { 0 }; -#define TRANSPORT_BAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRANSPORT_BAR_TYPE, TransportBarPrivate)) +#define TRANSPORT_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRANSPORT_WIDGET_TYPE, TransportWidgetPrivate)) /* Gobject boiler plate */ -static void transport_bar_class_init (TransportBarClass *klass); -static void transport_bar_init (TransportBar *self); -static void transport_bar_dispose (GObject *object); -static void transport_bar_finalize (GObject *object); +static void transport_widget_class_init (TransportWidgetClass *klass); +static void transport_widget_init (TransportWidget *self); +static void transport_widget_dispose (GObject *object); +static void transport_widget_finalize (GObject *object); /* UI and dbus callbacks */ -static gboolean transport_bar_button_press_event (GtkWidget *menuitem, +static gboolean transport_widget_button_press_event (GtkWidget *menuitem, GdkEventButton *event); -static gboolean transport_bar_button_release_event (GtkWidget *menuitem, +static gboolean transport_widget_button_release_event (GtkWidget *menuitem, GdkEventButton *event); -static gboolean transport_bar_play_button_trigger (GtkWidget *widget, +static gboolean transport_widget_play_button_trigger (GtkWidget *widget, GdkEventButton *event, gpointer user_data); -static void transport_bar_update_state(DbusmenuMenuitem* item, +static void transport_widget_update_state(DbusmenuMenuitem* item, gchar * property, GValue * value, gpointer userdata); // utility methods -static gchar* transport_bar_determine_play_label(gchar* state); +static gchar* transport_widget_determine_play_label(gchar* state); -G_DEFINE_TYPE (TransportBar, transport_bar, GTK_TYPE_MENU_ITEM); +G_DEFINE_TYPE (TransportWidget, transport_widget, GTK_TYPE_MENU_ITEM); static void -transport_bar_class_init (TransportBarClass *klass) +transport_widget_class_init (TransportWidgetClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - widget_class->button_press_event = transport_bar_button_press_event; - widget_class->button_release_event = transport_bar_button_release_event; + widget_class->button_press_event = transport_widget_button_press_event; + widget_class->button_release_event = transport_widget_button_release_event; - g_type_class_add_private (klass, sizeof (TransportBarPrivate)); + g_type_class_add_private (klass, sizeof (TransportWidgetPrivate)); - gobject_class->dispose = transport_bar_dispose; - gobject_class->finalize = transport_bar_finalize; + gobject_class->dispose = transport_widget_dispose; + gobject_class->finalize = transport_widget_finalize; signals[PLAY] = g_signal_new ("play", G_OBJECT_CLASS_TYPE (gobject_class), @@ -126,11 +126,11 @@ transport_bar_class_init (TransportBarClass *klass) } static void -transport_bar_init (TransportBar *self) +transport_widget_init (TransportWidget *self) { - g_debug("TransportBar::transport_bar_init"); + g_debug("TransportWidget::transport_widget_init"); - TransportBarPrivate * priv = TRANSPORT_BAR_GET_PRIVATE(self); + TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE(self); GtkWidget *hbox; hbox = gtk_hbox_new(TRUE, 2); @@ -142,10 +142,10 @@ transport_bar_init (TransportBar *self) gtk_box_pack_start (GTK_BOX (hbox), priv->play_button, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), priv->next_button, FALSE, FALSE, 0); - g_signal_connect(priv->play_button, "button-press-event", G_CALLBACK(transport_bar_play_button_trigger), NULL); + g_signal_connect(priv->play_button, "button-press-event", G_CALLBACK(transport_widget_play_button_trigger), NULL); priv->hbox = hbox; - g_signal_connect(G_OBJECT(twin_item), "property-changed", G_CALLBACK(transport_bar_update_state), self); + g_signal_connect(G_OBJECT(twin_item), "property-changed", G_CALLBACK(transport_widget_update_state), self); gtk_widget_show_all (priv->hbox); gtk_container_add (GTK_CONTAINER (self), hbox); @@ -153,67 +153,67 @@ transport_bar_init (TransportBar *self) } static void -transport_bar_dispose (GObject *object) +transport_widget_dispose (GObject *object) { //if(IS_TRANSPORT_BAR(object) == TRUE){ - // TransportBarPrivate * priv = TRANSPORT_BAR_GET_PRIVATE(TRANSPORT_BAR(object)); + // TransportWidgetPrivate * priv = TRANSPORT_BAR_GET_PRIVATE(TRANSPORT_BAR(object)); // g_object_unref(priv->previous_button); //} - G_OBJECT_CLASS (transport_bar_parent_class)->dispose (object); + G_OBJECT_CLASS (transport_widget_parent_class)->dispose (object); } static void -transport_bar_finalize (GObject *object) +transport_widget_finalize (GObject *object) { - G_OBJECT_CLASS (transport_bar_parent_class)->finalize (object); + G_OBJECT_CLASS (transport_widget_parent_class)->finalize (object); } /* keyevents */ static gboolean -transport_bar_button_press_event (GtkWidget *menuitem, +transport_widget_button_press_event (GtkWidget *menuitem, GdkEventButton *event) { - g_debug("TransportBar::menu_press_event"); + g_debug("TransportWidget::menu_press_event"); return FALSE; } static gboolean -transport_bar_button_release_event (GtkWidget *menuitem, +transport_widget_button_release_event (GtkWidget *menuitem, GdkEventButton *event) { - g_debug("TransportBar::menu_release_event"); + g_debug("TransportWidget::menu_release_event"); return FALSE; } /* Individual keyevents on the buttons */ static gboolean -transport_bar_play_button_trigger(GtkWidget* widget, +transport_widget_play_button_trigger(GtkWidget* widget, GdkEventButton *event, gpointer user_data) { - g_debug("TransportBar::PLAY button_press_event"); + g_debug("TransportWidget::PLAY button_press_event"); return FALSE; } /** -* transport_bar_update_state() +* transport_widget_update_state() * Callback for updates from the other side of dbus **/ -static void transport_bar_update_state(DbusmenuMenuitem* item, gchar* property, +static void transport_widget_update_state(DbusmenuMenuitem* item, gchar* property, GValue* value, gpointer userdata) { - g_debug("transport_bar_update_state - with property %s", property); + g_debug("transport_widget_update_state - with property %s", property); gchar* input = g_strdup(g_value_get_string(value)); - g_debug("transport_bar_update_state - with value %s", input); + g_debug("transport_widget_update_state - with value %s", input); - TransportBar* bar = (TransportBar*)userdata; - TransportBarPrivate *priv = TRANSPORT_BAR_GET_PRIVATE(bar); + TransportWidget* bar = (TransportWidget*)userdata; + TransportWidgetPrivate *priv = TRANSPORT_WIDGET_GET_PRIVATE(bar); - gtk_button_set_label(GTK_BUTTON(priv->play_button), g_strdup(transport_bar_determine_play_label(property))); + gtk_button_set_label(GTK_BUTTON(priv->play_button), g_strdup(transport_widget_determine_play_label(property))); } // will be needed for image swapping -static gchar* transport_bar_determine_play_label(gchar* state) +static gchar* transport_widget_determine_play_label(gchar* state) { gchar* label = ">"; if(g_strcmp0(state, "pause") == 0){ @@ -227,12 +227,12 @@ static gchar* transport_bar_determine_play_label(gchar* state) /** * transport_new: - * @returns: a new #TransportBar. + * @returns: a new #TransportWidget. **/ GtkWidget* -transport_bar_new(DbusmenuMenuitem *item) +transport_widget_new(DbusmenuMenuitem *item) { twin_item = item; - return g_object_new(TRANSPORT_BAR_TYPE, NULL); + return g_object_new(TRANSPORT_WIDGET_TYPE, NULL); } diff --git a/src/transport-bar.h b/src/transport-bar.h index 8a791ff..1d1aa6e 100644 --- a/src/transport-bar.h +++ b/src/transport-bar.h @@ -16,34 +16,34 @@ 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 __TRANSPORT_BAR_H__ -#define __TRANSPORT_BAR_H__ +#ifndef __TRANSPORT_WIDGET_H__ +#define __TRANSPORT_WIDGET_H__ #include #include G_BEGIN_DECLS -#define TRANSPORT_BAR_TYPE (transport_bar_get_type ()) -#define TRANSPORT_BAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TRANSPORT_BAR_TYPE, TransportBar)) -#define TRANSPORT_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TRANSPORT_BAR_TYPE, TransportBarClass)) -#define IS_TRANSPORT_BAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TRANSPORT_BAR_TYPE)) -#define IS_TRANSPORT_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TRANSPORT_BAR_TYPE)) -#define TRANSPORT_BAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TRANSPORT_BAR_TYPE, TransportBarClass)) +#define TRANSPORT_WIDGET_TYPE (transport_widget_get_type ()) +#define TRANSPORT_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TRANSPORT_WIDGET_TYPE, TransportWidget)) +#define TRANSPORT_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TRANSPORT_WIDGET_TYPE, TransportWidgetClass)) +#define IS_TRANSPORT_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TRANSPORT_WIDGET_TYPE)) +#define IS_TRANSPORT_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TRANSPORT_WIDGET_TYPE)) +#define TRANSPORT_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TRANSPORT_WIDGET_TYPE, TransportWidgetClass)) -typedef struct _TransportBar TransportBar; -typedef struct _TransportBarClass TransportBarClass; +typedef struct _TransportWidget TransportWidget; +typedef struct _TransportWidgetClass TransportWidgetClass; -struct _TransportBarClass { +struct _TransportWidgetClass { GtkMenuItemClass parent_class; }; -struct _TransportBar { +struct _TransportWidget { GtkMenuItem parent; }; -GType transport_bar_get_type (void); -GtkWidget* transport_bar_new(DbusmenuMenuitem *twin_item); +GType transport_widget_get_type (void); +GtkWidget* transport_widget_new(DbusmenuMenuitem *twin_item); G_END_DECLS -- cgit v1.2.3