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 +- src/common-defs.h | 1 + src/indicator-sound.c | 197 ++++++++++++++++++++++--------------------- src/music-player-bridge.vala | 1 + src/slider-menu-item.c | 18 ++-- src/transport-bar.c | 94 +++++++++++++++++++++ src/transport-bar.h | 49 +++++++++++ src/transport-menu-item.vala | 19 +++++ 8 files changed, 277 insertions(+), 105 deletions(-) create mode 100644 src/transport-bar.c create mode 100644 src/transport-bar.h create mode 100644 src/transport-menu-item.vala 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 \ diff --git a/src/common-defs.h b/src/common-defs.h index 9be1da5..94c178e 100644 --- a/src/common-defs.h +++ b/src/common-defs.h @@ -27,3 +27,4 @@ with this program. If not, see . // DBUS items #define DBUSMENU_SLIDER_MENUITEM_TYPE "x-canonical-ido-slider-item" #define DBUSMENU_SLIDER_MENUITEM_PROP_VOLUME "volume" +#define DBUSMENU_TRANSPORT_MENUITEM_TYPE "x-canonical-transport-bar" diff --git a/src/indicator-sound.c b/src/indicator-sound.c index 18f48d8..31f023e 100755 --- a/src/indicator-sound.c +++ b/src/indicator-sound.c @@ -91,6 +91,9 @@ 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); +//transport bar related +static gboolean new_transport_bar(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); + // DBUS communication static DBusGProxy *sound_dbus_proxy = NULL; static void connection_changed (IndicatorServiceManager * sm, gboolean connected, gpointer userdata); @@ -150,9 +153,9 @@ indicator_sound_class_init (IndicatorSoundClass *klass) io_class->get_label = get_label; io_class->get_image = get_icon; io_class->get_menu = get_menu; - io_class->scroll = scroll; + io_class->scroll = scroll; - design_team_size = gtk_icon_size_register("design-team-size", 22, 22); + design_team_size = gtk_icon_size_register("design-team-size", 22, 22); return; } @@ -217,9 +220,9 @@ get_label (IndicatorObject * io) static GtkImage * get_icon (IndicatorObject * io) -{ - gchar* current_name = g_hash_table_lookup(volume_states, GINT_TO_POINTER(current_state)); - g_debug("At start-up attempting to set the image to %s", current_name); +{ + gchar* current_name = g_hash_table_lookup(volume_states, GINT_TO_POINTER(current_state)); + g_debug("At start-up attempting to set the image to %s", current_name); speaker_image = indicator_image_helper(current_name); gtk_widget_show(GTK_WIDGET(speaker_image)); return speaker_image; @@ -231,16 +234,15 @@ get_icon (IndicatorObject * io) static GtkMenu * get_menu (IndicatorObject * io) { - DbusmenuGtkMenu *menu = dbusmenu_gtkmenu_new(INDICATOR_SOUND_DBUS_NAME, INDICATOR_SOUND_DBUS_OBJECT); - DbusmenuGtkClient *client = dbusmenu_gtkmenu_get_client(menu); - - g_object_set_data (G_OBJECT (client), - "indicator", io); - dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(client), DBUSMENU_SLIDER_MENUITEM_TYPE, new_slider_item); + DbusmenuGtkMenu *menu = dbusmenu_gtkmenu_new(INDICATOR_SOUND_DBUS_NAME, INDICATOR_SOUND_DBUS_OBJECT); + DbusmenuGtkClient *client = dbusmenu_gtkmenu_get_client(menu); + g_object_set_data (G_OBJECT (client), "indicator", io); + dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(client), DBUSMENU_SLIDER_MENUITEM_TYPE, new_slider_item); + dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(client), DBUSMENU_TRANSPORT_MENUITEM_TYPE, new_transport_bar); - // 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); + // 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); } static void @@ -307,6 +309,13 @@ new_slider_item(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuC return TRUE; } +static gboolean new_transport_bar(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client) +{ + g_debug("indicator-sound: new_transport_bar() called "); + return TRUE; +} + + static void connection_changed (IndicatorServiceManager * sm, gboolean connected, gpointer userdata) { @@ -337,11 +346,11 @@ connection_changed (IndicatorServiceManager * sm, gboolean connected, gpointer u dbus_g_proxy_add_signal(sound_dbus_proxy, SIGNAL_SINK_AVAILABLE_UPDATE, G_TYPE_BOOLEAN, G_TYPE_INVALID); dbus_g_proxy_connect_signal(sound_dbus_proxy, SIGNAL_SINK_AVAILABLE_UPDATE, G_CALLBACK(catch_signal_sink_availability_update), NULL, NULL); - // Ensure we are in a coherent state with the service at start up. - // Preserve ordering! - fetch_volume_percent_from_dbus(); - fetch_mute_value_from_dbus(); - fetch_sink_availability_from_dbus(); + // Ensure we are in a coherent state with the service at start up. + // Preserve ordering! + fetch_volume_percent_from_dbus(); + fetch_mute_value_from_dbus(); + fetch_sink_availability_from_dbus(); } } else { @@ -645,7 +654,6 @@ catch_signal_sink_availability_update(DBusGProxy *proxy, gboolean available_valu /*******************************************************************/ //UI callbacks /******************************************************************/ - /** value_changed_event_cb: This callback will get triggered irregardless of whether its a user change or a programmatic change. @@ -692,94 +700,93 @@ key_press_cb: static gboolean key_press_cb(GtkWidget* widget, GdkEventKey* event, gpointer data) { - gboolean digested = FALSE; + gboolean digested = FALSE; - GtkWidget* slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)volume_slider); - GtkRange* range = (GtkRange*)slider; - gdouble current_value = gtk_range_get_value(range); - gdouble new_value = current_value; - const gdouble five_percent = 5; - GtkWidget *menuitem; - - menuitem = GTK_MENU_SHELL (widget)->active_menu_item; - if(IDO_IS_SCALE_MENU_ITEM(menuitem) == TRUE) + GtkWidget* slider = ido_scale_menu_item_get_scale((IdoScaleMenuItem*)volume_slider); + GtkRange* range = (GtkRange*)slider; + gdouble current_value = gtk_range_get_value(range); + gdouble new_value = current_value; + const gdouble five_percent = 5; + GtkWidget *menuitem; + + menuitem = GTK_MENU_SHELL (widget)->active_menu_item; + if(IDO_IS_SCALE_MENU_ITEM(menuitem) == TRUE) + { + switch(event->keyval) { - switch(event->keyval) - { - case GDK_Right: - digested = TRUE; - if(event->state & GDK_CONTROL_MASK) - { - new_value = 100; - } - else - { - new_value = current_value + five_percent; - } - break; - case GDK_Left: - digested = TRUE; - if(event->state & GDK_CONTROL_MASK) - { - new_value = 0; - } - else - { - new_value = current_value - five_percent; - } - break; - case GDK_plus: - digested = TRUE; - new_value = current_value + five_percent; - break; - case GDK_minus: - digested = TRUE; - new_value = current_value - five_percent; - break; - default: - break; - } - - new_value = CLAMP(new_value, 0, 100); - if(new_value != current_value && current_state != STATE_MUTED) - { - g_debug("Attempting to set the range from the key listener to %f", new_value); - // In order to ensure that the exterior filtering does not catch this, reset the exterior_vol_update - // to ensure these updates. - exterior_vol_update = OUT_OF_RANGE; - gtk_range_set_value(range, new_value); - } + case GDK_Right: + digested = TRUE; + if(event->state & GDK_CONTROL_MASK) + { + new_value = 100; + } + else + { + new_value = current_value + five_percent; + } + break; + case GDK_Left: + digested = TRUE; + if(event->state & GDK_CONTROL_MASK) + { + new_value = 0; + } + else + { + new_value = current_value - five_percent; + } + break; + case GDK_plus: + digested = TRUE; + new_value = current_value + five_percent; + break; + case GDK_minus: + digested = TRUE; + new_value = current_value - five_percent; + break; + default: + break; } - return digested; + + new_value = CLAMP(new_value, 0, 100); + if(new_value != current_value && current_state != STATE_MUTED) + { + g_debug("Attempting to set the range from the key listener to %f", new_value); + // In order to ensure that the exterior filtering does not catch this, reset the exterior_vol_update + // to ensure these updates. + exterior_vol_update = OUT_OF_RANGE; + gtk_range_set_value(range, new_value); + } + } + return digested; } static void style_changed_cb(GtkWidget *widget, gpointer user_data) { - g_debug("Just caught a style change event"); - update_state(current_state); - reset_mute_blocking_animation(); - update_state(current_state); - free_the_animation_list(); - prepare_blocked_animation(); + g_debug("Just caught a style change event"); + update_state(current_state); + reset_mute_blocking_animation(); + update_state(current_state); + free_the_animation_list(); + prepare_blocked_animation(); } static void scroll (IndicatorObject *io, gint delta, IndicatorScrollDirection direction) { - if (device_available == FALSE || current_state == STATE_MUTED) - return; + if (device_available == FALSE || current_state == STATE_MUTED) + return; - IndicatorSound *sound = INDICATOR_SOUND (io); - GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE (sound->slider)); - gdouble value = gtk_range_get_value (GTK_RANGE (sound->slider)); + IndicatorSound *sound = INDICATOR_SOUND (io); + GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE (sound->slider)); + gdouble value = gtk_range_get_value (GTK_RANGE (sound->slider)); - if (direction == INDICATOR_OBJECT_SCROLL_UP){ - value += adj->step_increment; - } - else{ - value -= adj->step_increment; - } - gtk_range_set_value (GTK_RANGE (sound->slider), - value); + if (direction == INDICATOR_OBJECT_SCROLL_UP){ + value += adj->step_increment; + } + else{ + value -= adj->step_increment; + } + gtk_range_set_value (GTK_RANGE (sound->slider), value); } diff --git a/src/music-player-bridge.vala b/src/music-player-bridge.vala index c2cfc7a..cd5d65d 100644 --- a/src/music-player-bridge.vala +++ b/src/music-player-bridge.vala @@ -49,6 +49,7 @@ public class MusicPlayerBridge : GLib.Object 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); diff --git a/src/slider-menu-item.c b/src/slider-menu-item.c index cb72524..8a21fcf 100644 --- a/src/slider-menu-item.c +++ b/src/slider-menu-item.c @@ -53,8 +53,8 @@ static void slider_menu_item_class_init (SliderMenuItemClass *klass) object_class->dispose = slider_menu_item_dispose; object_class->finalize = slider_menu_item_finalize; - DbusmenuMenuitemClass * mclass = DBUSMENU_MENUITEM_CLASS(klass); - mclass->handle_event = handle_event; + DbusmenuMenuitemClass * mclass = DBUSMENU_MENUITEM_CLASS(klass); + mclass->handle_event = handle_event; return; } @@ -81,10 +81,10 @@ static void handle_event (DbusmenuMenuitem * mi, const gchar * name, const GValue * value, guint timestamp) { g_debug("in the handle event method of slider_menu_item"); - gdouble volume_input = 0; - volume_input = g_value_get_double(value); - if(value != NULL) - set_sink_volume(volume_input); + gdouble volume_input = 0; + volume_input = g_value_get_double(value); + if(value != NULL) + set_sink_volume(volume_input); } @@ -92,9 +92,9 @@ handle_event (DbusmenuMenuitem * mi, const gchar * name, const GValue * value, g SliderMenuItem* slider_menu_item_new(gboolean sinks_available, gdouble start_volume) { SliderMenuItem *self = g_object_new(SLIDER_MENU_ITEM_TYPE, NULL); - dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_SLIDER_MENUITEM_TYPE); - dbusmenu_menuitem_property_set_bool(DBUSMENU_MENUITEM(self), DBUSMENU_MENUITEM_PROP_ENABLED, sinks_available); - dbusmenu_menuitem_property_set_bool(DBUSMENU_MENUITEM(self), DBUSMENU_MENUITEM_PROP_VISIBLE, sinks_available); + dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_SLIDER_MENUITEM_TYPE); + dbusmenu_menuitem_property_set_bool(DBUSMENU_MENUITEM(self), DBUSMENU_MENUITEM_PROP_ENABLED, sinks_available); + dbusmenu_menuitem_property_set_bool(DBUSMENU_MENUITEM(self), DBUSMENU_MENUITEM_PROP_VISIBLE, sinks_available); return self; } diff --git a/src/transport-bar.c b/src/transport-bar.c new file mode 100644 index 0000000..ef1edb4 --- /dev/null +++ b/src/transport-bar.c @@ -0,0 +1,94 @@ +/* +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 "transport-bar.h" +#include "common-defs.h" + +typedef struct _TransportBarPrivate TransportBarPrivate; + +struct _TransportBarPrivate +{ +}; + +#define TRANSPORT_BAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRANSPORT_BAR_TYPE, TransportBarPrivate)) + +/* Prototypes */ +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 +transport_bar_class_init (TransportBarClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (TransportBarPrivate)); + + object_class->dispose = transport_bar_dispose; + object_class->finalize = transport_bar_finalize; + + //DbusmenuMenuitemClass * mclass = DBUSMENU_MENUITEM_CLASS(klass); + //mclass->handle_event = handle_event; + return; +} + +static void +transport_bar_init (TransportBar *self) +{ + g_debug("Building new Transport Item"); + return; +} + +static void +transport_bar_dispose (GObject *object) +{ + G_OBJECT_CLASS (transport_bar_parent_class)->dispose (object); + return; +} + +static void +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 new file mode 100644 index 0000000..77a1a97 --- /dev/null +++ b/src/transport-bar.h @@ -0,0 +1,49 @@ +/* +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 __TRANSPORT_BAR_H__ +#define __TRANSPORT_BAR_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)) + +typedef struct _TransportBar TransportBar; +typedef struct _TransportBarClass TransportBarClass; + +struct _TransportBarClass { +}; + +struct _TransportBar { +}; + +GType transport_item_get_type (void); +TransportBar* transport_item_new(); + +G_END_DECLS + +#endif + diff --git a/src/transport-menu-item.vala b/src/transport-menu-item.vala new file mode 100644 index 0000000..812ef6a --- /dev/null +++ b/src/transport-menu-item.vala @@ -0,0 +1,19 @@ +using Dbusmenu; +using Gee; + +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"; + + public TransportMenuItem() + { + this.property_set(MENUITEM_PROP_TYPE, DBUSMENU_TRANSPORT_MENUITEM_TYPE); + } + + public override void handle_event(string name, GLib.Value value, uint timestamp) + { + debug("TransportItem -> handle event caught!"); + } + +} \ No newline at end of file -- 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(-) 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 664a45a398020f82f1e8f8e22f1627392a06a0c2 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 9 Jun 2010 12:13:59 +0100 Subject: buttons added - events being received --- src/indicator-sound.c | 112 ++++++++++++++++++++++++++++---------------------- src/transport-bar.c | 45 ++++++++++++-------- src/transport-bar.h | 7 ++-- 3 files changed, 94 insertions(+), 70 deletions(-) diff --git a/src/indicator-sound.c b/src/indicator-sound.c index e13c52b..48fde56 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" +#include "transport-bar.h" #include "dbus-shared-names.h" #include "sound-service-client.h" #include "common-defs.h" @@ -62,7 +62,7 @@ struct _IndicatorSoundClass { //GObject instance struct struct _IndicatorSound { IndicatorObject parent; - GtkWidget *slider; + GtkWidget *slider; IndicatorServiceManager *service; }; // GObject Boiler plate @@ -166,17 +166,17 @@ indicator_sound_init (IndicatorSound *self) { self->service = NULL; self->service = indicator_service_manager_new_version(INDICATOR_SOUND_DBUS_NAME, INDICATOR_SOUND_DBUS_VERSION); - prepare_state_machine(); - prepare_blocked_animation(); - animation_id = 0; - blocked_id = 0; - initial_mute = FALSE; - device_available = TRUE; - slider_in_direct_use = FALSE; - exterior_vol_update = OUT_OF_RANGE; + prepare_state_machine(); + prepare_blocked_animation(); + animation_id = 0; + blocked_id = 0; + initial_mute = FALSE; + device_available = TRUE; + slider_in_direct_use = FALSE; + exterior_vol_update = OUT_OF_RANGE; g_signal_connect(G_OBJECT(self->service), INDICATOR_SERVICE_MANAGER_SIGNAL_CONNECTION_CHANGE, G_CALLBACK(connection_changed), self); - return; + return; } static void @@ -188,9 +188,9 @@ indicator_sound_dispose (GObject *object) g_object_unref(G_OBJECT(self->service)); self->service = NULL; } - g_hash_table_destroy(volume_states); + g_hash_table_destroy(volume_states); - free_the_animation_list(); + free_the_animation_list(); G_OBJECT_CLASS (indicator_sound_parent_class)->dispose (object); return; @@ -199,11 +199,11 @@ indicator_sound_dispose (GObject *object) static void free_the_animation_list() { - if(blocked_animation_list != NULL){ - g_list_foreach (blocked_animation_list, (GFunc)g_object_unref, NULL); - g_list_free(blocked_animation_list); - blocked_animation_list = NULL; - } + if(blocked_animation_list != NULL){ + g_list_foreach (blocked_animation_list, (GFunc)g_object_unref, NULL); + g_list_free(blocked_animation_list); + blocked_animation_list = NULL; + } } static void @@ -313,7 +313,19 @@ 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(); + + GtkWidget* bar = NULL; + + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(newitem), FALSE); + g_return_val_if_fail(DBUSMENU_IS_GTKCLIENT(client), FALSE); + + bar = transport_bar_new(); + GtkMenuItem *menu_transport_bar = GTK_MENU_ITEM(bar); + + dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, menu_transport_bar, parent); + + gtk_widget_show_all(bar); + return TRUE; } @@ -387,34 +399,34 @@ Only called at startup. static void prepare_blocked_animation() { - gchar* blocked_name = g_hash_table_lookup(volume_states, GINT_TO_POINTER(STATE_MUTED_WHILE_INPUT)); - gchar* muted_name = g_hash_table_lookup(volume_states, GINT_TO_POINTER(STATE_MUTED)); + gchar* blocked_name = g_hash_table_lookup(volume_states, GINT_TO_POINTER(STATE_MUTED_WHILE_INPUT)); + gchar* muted_name = g_hash_table_lookup(volume_states, GINT_TO_POINTER(STATE_MUTED)); - GtkImage* temp_image = indicator_image_helper(muted_name); - GdkPixbuf* mute_buf = gtk_image_get_pixbuf(temp_image); + GtkImage* temp_image = indicator_image_helper(muted_name); + GdkPixbuf* mute_buf = gtk_image_get_pixbuf(temp_image); - temp_image = indicator_image_helper(blocked_name); - GdkPixbuf* blocked_buf = gtk_image_get_pixbuf(temp_image); + temp_image = indicator_image_helper(blocked_name); + GdkPixbuf* blocked_buf = gtk_image_get_pixbuf(temp_image); - if(mute_buf == NULL || blocked_buf == NULL){ - g_debug("Don bother with the animation, the theme aint got the goods !"); - return; - } + if(mute_buf == NULL || blocked_buf == NULL){ + g_debug("Don bother with the animation, the theme aint got the goods !"); + return; + } - int i; + int i; - // sample 51 snapshots - range : 0-256 - for(i = 0; i < 51; i++) - { - gdk_pixbuf_composite(mute_buf, blocked_buf, 0, 0, - gdk_pixbuf_get_width(mute_buf), - gdk_pixbuf_get_height(mute_buf), - 0, 0, 1, 1, GDK_INTERP_BILINEAR, MIN(255, i * 5)); - blocked_animation_list = g_list_append(blocked_animation_list, gdk_pixbuf_copy(blocked_buf)); - } - g_object_ref_sink(mute_buf); + // sample 51 snapshots - range : 0-256 + for(i = 0; i < 51; i++) + { + gdk_pixbuf_composite(mute_buf, blocked_buf, 0, 0, + gdk_pixbuf_get_width(mute_buf), + gdk_pixbuf_get_height(mute_buf), + 0, 0, 1, 1, GDK_INTERP_BILINEAR, MIN(255, i * 5)); + blocked_animation_list = g_list_append(blocked_animation_list, gdk_pixbuf_copy(blocked_buf)); + } + g_object_ref_sink(mute_buf); g_object_unref(mute_buf); - g_object_ref_sink(blocked_buf); + g_object_ref_sink(blocked_buf); g_object_unref(blocked_buf); } @@ -422,26 +434,26 @@ prepare_blocked_animation() gint get_state() { - return current_state; + return current_state; } gchar* get_state_image_name(gint state) { - return g_hash_table_lookup(volume_states, GINT_TO_POINTER(state)); + return g_hash_table_lookup(volume_states, GINT_TO_POINTER(state)); } void prepare_for_tests(IndicatorObject *io) { - prepare_state_machine(); - get_icon(io); + prepare_state_machine(); + get_icon(io); } void tidy_up_hash() { - g_hash_table_destroy(volume_states); + g_hash_table_destroy(volume_states); } static void @@ -449,13 +461,13 @@ update_state(const gint state) { /* g_debug("update state beginning - previous_state = %i", previous_state);*/ - previous_state = current_state; + previous_state = current_state; /* g_debug("update state 3rd line - previous_state = %i", previous_state);*/ - current_state = state; - gchar* image_name = g_hash_table_lookup(volume_states, GINT_TO_POINTER(current_state)); - indicator_image_helper_update(speaker_image, image_name); + current_state = state; + gchar* image_name = g_hash_table_lookup(volume_states, GINT_TO_POINTER(current_state)); + indicator_image_helper_update(speaker_image, image_name); } diff --git a/src/transport-bar.c b/src/transport-bar.c index 8573cae..34f590e 100644 --- a/src/transport-bar.c +++ b/src/transport-bar.c @@ -30,7 +30,7 @@ typedef struct _TransportBarPrivate TransportBarPrivate; struct _TransportBarPrivate { - GtkWidget* hBox; + GtkWidget* hbox; GtkWidget* previous_button; GtkWidget* play_button; GtkWidget* next_button; @@ -43,7 +43,8 @@ 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); -G_DEFINE_TYPE (TransportBar, transport_bar, DBUSMENU_TYPE_MENUITEM); + +G_DEFINE_TYPE (TransportBar, transport_bar, GTK_TYPE_MENU_ITEM); static void transport_bar_class_init (TransportBarClass *klass) @@ -54,29 +55,35 @@ transport_bar_class_init (TransportBarClass *klass) object_class->dispose = transport_bar_dispose; object_class->finalize = transport_bar_finalize; - - return; } 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; + g_debug("TransportBar::transport_bar_init"); + + TransportBarPrivate * priv = TRANSPORT_BAR_GET_PRIVATE(self); + GtkWidget *hbox; + + hbox = gtk_hbox_new(TRUE, 2); + priv->previous_button = gtk_button_new_with_label("Previous"); + priv->next_button = gtk_button_new_with_label("Next"); + priv->play_button = gtk_button_new_with_label("Play"); + + gtk_box_pack_start (GTK_BOX (hbox), priv->previous_button, FALSE, FALSE, 0); + 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); + + priv->hbox = hbox; + + gtk_widget_show_all (priv->hbox); + gtk_container_add (GTK_CONTAINER (self), hbox); } static void transport_bar_dispose (GObject *object) { G_OBJECT_CLASS (transport_bar_parent_class)->dispose (object); - return; } static void @@ -85,9 +92,13 @@ transport_bar_finalize (GObject *object) G_OBJECT_CLASS (transport_bar_parent_class)->finalize (object); } -TransportBar* +/** + * transport_new: + * @returns: a new #TransportBar. + **/ +GtkWidget* transport_bar_new() { - TransportBar *self = g_object_new(TRANSPORT_BAR_TYPE, NULL); - return self; + return g_object_new(TRANSPORT_BAR_TYPE, NULL); } + diff --git a/src/transport-bar.h b/src/transport-bar.h index e931298..e90e39c 100644 --- a/src/transport-bar.h +++ b/src/transport-bar.h @@ -19,8 +19,7 @@ with this program. If not, see . #ifndef __TRANSPORT_BAR_H__ #define __TRANSPORT_BAR_H__ -#include -#include +#include G_BEGIN_DECLS @@ -35,13 +34,15 @@ typedef struct _TransportBar TransportBar; typedef struct _TransportBarClass TransportBarClass; struct _TransportBarClass { + GtkMenuItemClass parent_class; }; struct _TransportBar { + GtkMenuItem parent; }; GType transport_bar_get_type (void); -TransportBar* transport_bar_new(); +GtkWidget* transport_bar_new(); G_END_DECLS -- cgit v1.2.3 From 8e51465790989d6b8ed8194a0d9a86fe7b3412d5 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 9 Jun 2010 18:36:12 +0100 Subject: play controls in progress --- src/music-player-bridge.vala | 11 +++++++++-- src/transport-bar.c | 42 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/src/music-player-bridge.vala b/src/music-player-bridge.vala index dc66101..92f9dc5 100644 --- a/src/music-player-bridge.vala +++ b/src/music-player-bridge.vala @@ -48,10 +48,15 @@ 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(); - //client_item.property_set(MENUITEM_PROP_LABEL, client_name.concat(" is registered")); - registered_clients.set(client_name, transport_item); + 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); debug("client of name %s has successfully registered with us", client_name); } } @@ -63,7 +68,9 @@ public class MusicPlayerBridge : GLib.Object 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.remove(client_name); + registered_clients.remove("transport"); debug("Successively removed menu_item for client %s from registered_clients", client_name); } } diff --git a/src/transport-bar.c b/src/transport-bar.c index 34f590e..bafd917 100644 --- a/src/transport-bar.c +++ b/src/transport-bar.c @@ -44,17 +44,29 @@ static void transport_bar_init (TransportBar *self); static void transport_bar_dispose (GObject *object); static void transport_bar_finalize (GObject *object); + +static gboolean transport_bar_button_press_event (GtkWidget *menuitem, + GdkEventButton *event); +static gboolean transport_bar_button_release_event (GtkWidget *menuitem, + GdkEventButton *event); + + G_DEFINE_TYPE (TransportBar, transport_bar, GTK_TYPE_MENU_ITEM); static void transport_bar_class_init (TransportBarClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + //GtkObjectClass *object_class = GTK_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; + g_type_class_add_private (klass, sizeof (TransportBarPrivate)); - object_class->dispose = transport_bar_dispose; - object_class->finalize = transport_bar_finalize; + gobject_class->dispose = transport_bar_dispose; + gobject_class->finalize = transport_bar_finalize; } static void @@ -66,9 +78,9 @@ transport_bar_init (TransportBar *self) GtkWidget *hbox; hbox = gtk_hbox_new(TRUE, 2); - priv->previous_button = gtk_button_new_with_label("Previous"); - priv->next_button = gtk_button_new_with_label("Next"); - priv->play_button = gtk_button_new_with_label("Play"); + priv->previous_button = gtk_button_new_with_label("<<"); + priv->next_button = gtk_button_new_with_label(">>"); + priv->play_button = gtk_button_new_with_label(">"); gtk_box_pack_start (GTK_BOX (hbox), priv->previous_button, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), priv->play_button, FALSE, FALSE, 0); @@ -77,6 +89,7 @@ transport_bar_init (TransportBar *self) priv->hbox = hbox; gtk_widget_show_all (priv->hbox); + gtk_widget_set_sensitive(GTK_WIDGET(self), FALSE); gtk_container_add (GTK_CONTAINER (self), hbox); } @@ -92,6 +105,23 @@ transport_bar_finalize (GObject *object) G_OBJECT_CLASS (transport_bar_parent_class)->finalize (object); } +/* keyevents */ +static gboolean +transport_bar_button_press_event (GtkWidget *menuitem, + GdkEventButton *event) +{ + g_debug("TransportBar::button_press_event"); + return TRUE; +} + +static gboolean +transport_bar_button_release_event (GtkWidget *menuitem, + GdkEventButton *event) +{ + g_debug("TransportBar::button_release_event"); + return TRUE; +} + /** * transport_new: * @returns: a new #TransportBar. -- 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 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 50497b6b375cb96b77ed1700f58b8b8991f4c1ae Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 10 Jun 2010 16:04:06 +0100 Subject: working on some signals --- src/player-controller.vala | 31 +++++++++++--------- src/transport-bar.c | 73 +++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 83 insertions(+), 21 deletions(-) diff --git a/src/player-controller.vala b/src/player-controller.vala index 9cdf527..86f0e0f 100644 --- a/src/player-controller.vala +++ b/src/player-controller.vala @@ -11,14 +11,20 @@ public class PlayerController : GLib.Object public PlayerController(Dbusmenu.Menuitem root, string client_name, bool active) { this.root_menu = root; - this.name = format_client_name(client_name); + this.name = format_client_name(client_name.strip()); this.is_active = active; this.custom_items = new ArrayList(); - //Dbusmenu.Menuitem[]; self_construct(); } - public void self_construct() + public void vanish() + { + foreach(Dbusmenu.Menuitem item in this.custom_items){ + root_menu.child_delete(item); + } + } + + private void self_construct() { Dbusmenu.Menuitem client_item = new Dbusmenu.Menuitem(); this.custom_items.add(client_item); @@ -29,19 +35,16 @@ public class PlayerController : GLib.Object root_menu.child_append(transport_item); } - public void vanish() + private static string format_client_name(string client_name) { - foreach(Dbusmenu.Menuitem item in this.custom_items){ - root_menu.child_delete(item); + string formatted = client_name; + //debug("PlayerController->format_client_name"); + 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; } - 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 diff --git a/src/transport-bar.c b/src/transport-bar.c index bafd917..aa618d2 100644 --- a/src/transport-bar.c +++ b/src/transport-bar.c @@ -36,6 +36,16 @@ struct _TransportBarPrivate GtkWidget* next_button; }; +enum { + PLAY, + PAUSE, + NEXT, + PREVIOUS, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + #define TRANSPORT_BAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRANSPORT_BAR_TYPE, TransportBarPrivate)) /* Prototypes */ @@ -49,6 +59,9 @@ static gboolean transport_bar_button_press_event (GtkWidget *menuite GdkEventButton *event); static gboolean transport_bar_button_release_event (GtkWidget *menuitem, GdkEventButton *event); +static gboolean transport_bar_play_button_trigger (GtkWidget* widget, + GdkEventButton *event, + gpointer user_data); G_DEFINE_TYPE (TransportBar, transport_bar, GTK_TYPE_MENU_ITEM); @@ -57,7 +70,6 @@ static void transport_bar_class_init (TransportBarClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - //GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); widget_class->button_press_event = transport_bar_button_press_event; @@ -67,6 +79,39 @@ transport_bar_class_init (TransportBarClass *klass) gobject_class->dispose = transport_bar_dispose; gobject_class->finalize = transport_bar_finalize; + + signals[PLAY] = g_signal_new ("play", + G_OBJECT_CLASS_TYPE (gobject_class), + G_SIGNAL_RUN_FIRST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[PAUSE] = g_signal_new ("pause", + G_OBJECT_CLASS_TYPE (gobject_class), + G_SIGNAL_RUN_FIRST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + + signals[NEXT] = g_signal_new ("next", + G_OBJECT_CLASS_TYPE (gobject_class), + G_SIGNAL_RUN_FIRST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[PREVIOUS] = g_signal_new ("previous", + G_OBJECT_CLASS_TYPE (gobject_class), + G_SIGNAL_RUN_FIRST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); } static void @@ -85,12 +130,16 @@ transport_bar_init (TransportBar *self) gtk_box_pack_start (GTK_BOX (hbox), priv->previous_button, FALSE, FALSE, 0); 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); + priv->hbox = hbox; gtk_widget_show_all (priv->hbox); - gtk_widget_set_sensitive(GTK_WIDGET(self), FALSE); gtk_container_add (GTK_CONTAINER (self), hbox); + + } static void @@ -110,19 +159,29 @@ static gboolean transport_bar_button_press_event (GtkWidget *menuitem, GdkEventButton *event) { - g_debug("TransportBar::button_press_event"); - return TRUE; + g_debug("TransportBar::menu_press_event"); + return FALSE; } static gboolean transport_bar_button_release_event (GtkWidget *menuitem, GdkEventButton *event) { - g_debug("TransportBar::button_release_event"); - return TRUE; + g_debug("TransportBar::menu_release_event"); + return FALSE; +} + +/* Individual keyevents on the buttons */ +static gboolean +transport_bar_play_button_trigger(GtkWidget* widget, + GdkEventButton *event, + gpointer user_data) +{ + g_debug("TransportBar::PLAY button_press_event"); + return FALSE; } -/** + /** * transport_new: * @returns: a new #TransportBar. **/ -- cgit v1.2.3 From da91c666d6b66163077ddb9e59bf556fb4d44953 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Fri, 11 Jun 2010 08:59:06 +0100 Subject: --- src/common-defs.h | 6 +++--- src/indicator-sound.c | 2 +- src/player-controller.vala | 40 ++++++++++++++++++++++++++++++---------- src/transport-bar.c | 34 +++++++++++++++++++++++++--------- src/transport-bar.h | 2 ++ src/transport-menu-item.vala | 4 +++- 6 files changed, 64 insertions(+), 24 deletions(-) diff --git a/src/common-defs.h b/src/common-defs.h index 94c178e..5393400 100644 --- a/src/common-defs.h +++ b/src/common-defs.h @@ -24,7 +24,7 @@ with this program. If not, see . #define SIGNAL_SINK_MUTE_UPDATE "SinkMuteUpdate" #define SIGNAL_SINK_AVAILABLE_UPDATE "SinkAvailableUpdate" -// DBUS items +/* DBUS Custom Items */ #define DBUSMENU_SLIDER_MENUITEM_TYPE "x-canonical-ido-slider-item" -#define DBUSMENU_SLIDER_MENUITEM_PROP_VOLUME "volume" -#define DBUSMENU_TRANSPORT_MENUITEM_TYPE "x-canonical-transport-bar" +#define DBUSMENU_TRANSPORT_MENUITEM_TYPE "x-canonical-transport-bar" +#define DBUSMENU_TRANSPORT_MENUITEM_STATE "x-canonical-transport-state" \ No newline at end of file diff --git a/src/indicator-sound.c b/src/indicator-sound.c index 48fde56..a3856c4 100755 --- a/src/indicator-sound.c +++ b/src/indicator-sound.c @@ -319,7 +319,7 @@ static gboolean new_transport_bar(DbusmenuMenuitem * newitem, DbusmenuMenuitem * g_return_val_if_fail(DBUSMENU_IS_MENUITEM(newitem), FALSE); g_return_val_if_fail(DBUSMENU_IS_GTKCLIENT(client), FALSE); - bar = transport_bar_new(); + bar = transport_bar_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/player-controller.vala b/src/player-controller.vala index 86f0e0f..a92d8bf 100644 --- a/src/player-controller.vala +++ b/src/player-controller.vala @@ -7,7 +7,8 @@ public class PlayerController : GLib.Object private string name; private bool is_active; private ArrayList custom_items; - + + // TODO: pass in the appropriate position for the menu public PlayerController(Dbusmenu.Menuitem root, string client_name, bool active) { this.root_menu = root; @@ -24,21 +25,40 @@ public class PlayerController : GLib.Object } } - private void self_construct() + private bool 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(); + // Separator item + Dbusmenu.Menuitem separator_item = new Dbusmenu.Menuitem(); + separator_item.property_set(MENUITEM_PROP_TYPE, CLIENT_TYPES_SEPARATOR); + this.custom_items.add(separator_item); + + // Title item + Dbusmenu.Menuitem title_item = new Dbusmenu.Menuitem(); + title_item.property_set(MENUITEM_PROP_LABEL, this.name.concat("")); + title_item.property_set(MENUITEM_PROP_ICON_NAME, "applications-multimedia"); + this.custom_items.add(title_item); + + // Transport item + TransportMenuItem transport_item = new TransportMenuItem(); this.custom_items.add(transport_item); - root_menu.child_append(client_item); - root_menu.child_append(transport_item); - } + + int offset = 2; + foreach(Dbusmenu.Menuitem item in this.custom_items){ + root_menu.child_add_position(item, offset + this.custom_items.index_of(item)); + } + 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) { string formatted = client_name; - //debug("PlayerController->format_client_name"); if(formatted.len() > 1){ formatted = client_name.up(1).concat(client_name.slice(1, client_name.len())); debug("PlayerController->format_client_name - : %s", formatted); diff --git a/src/transport-bar.c b/src/transport-bar.c index aa618d2..46611dc 100644 --- a/src/transport-bar.c +++ b/src/transport-bar.c @@ -26,6 +26,9 @@ with this program. If not, see . #include "common-defs.h" #include +// TODO: think about leakage: ted ! + + typedef struct _TransportBarPrivate TransportBarPrivate; struct _TransportBarPrivate @@ -59,10 +62,11 @@ static gboolean transport_bar_button_press_event (GtkWidget *menuite GdkEventButton *event); static gboolean transport_bar_button_release_event (GtkWidget *menuitem, GdkEventButton *event); -static gboolean transport_bar_play_button_trigger (GtkWidget* widget, - GdkEventButton *event, - gpointer user_data); - +static gboolean transport_bar_play_button_trigger (GtkWidget *widget, + GdkEventButton *event, + gpointer user_data); +static void transport_bar_update_state(gchar * property, + GValue * value); G_DEFINE_TYPE (TransportBar, transport_bar, GTK_TYPE_MENU_ITEM); @@ -132,19 +136,22 @@ transport_bar_init (TransportBar *self) 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); - - priv->hbox = hbox; + + g_signal_connect(DBUSMENU_MENUITEM(self), "property-changed", G_CALLBACK(transport_bar_update_state), NULL); gtk_widget_show_all (priv->hbox); gtk_container_add (GTK_CONTAINER (self), hbox); - } static void transport_bar_dispose (GObject *object) { + //if(IS_TRANSPORT_BAR(object) == TRUE){ + // TransportBarPrivate * priv = TRANSPORT_BAR_GET_PRIVATE(TRANSPORT_BAR(object)); + // g_object_unref(priv->previous_button); + //} G_OBJECT_CLASS (transport_bar_parent_class)->dispose (object); } @@ -174,13 +181,22 @@ transport_bar_button_release_event (GtkWidget *menuitem, /* Individual keyevents on the buttons */ static gboolean transport_bar_play_button_trigger(GtkWidget* widget, - GdkEventButton *event, - gpointer user_data) + GdkEventButton *event, + gpointer user_data) { g_debug("TransportBar::PLAY button_press_event"); 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) +{ + +} /** * transport_new: * @returns: a new #TransportBar. diff --git a/src/transport-bar.h b/src/transport-bar.h index e90e39c..93136e1 100644 --- a/src/transport-bar.h +++ b/src/transport-bar.h @@ -20,6 +20,7 @@ with this program. If not, see . #define __TRANSPORT_BAR_H__ #include +#include G_BEGIN_DECLS @@ -43,6 +44,7 @@ struct _TransportBar { GType transport_bar_get_type (void); GtkWidget* transport_bar_new(); +void connect_with_other_half(DbusmenuMenuitem *twin_item); G_END_DECLS diff --git a/src/transport-menu-item.vala b/src/transport-menu-item.vala index 11120b0..9af52d1 100644 --- a/src/transport-menu-item.vala +++ b/src/transport-menu-item.vala @@ -5,10 +5,12 @@ 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() { - this.property_set(MENUITEM_PROP_TYPE, DBUSMENU_TRANSPORT_MENUITEM_TYPE); + this.property_set(MENUITEM_PROP_TYPE, DBUSMENU_TRANSPORT_MENUITEM_TYPE); + this.property_set(MENUITEM_PROP_TYPE, DBUSMENU_TRANSPORT_MENUITEM_STATE); } public override void handle_event(string name, GLib.Value input_value, uint timestamp) -- 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~ 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 1a3e82434ad971872d5be3181b91071fccdc0fea Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Fri, 11 Jun 2010 18:17:22 +0100 Subject: properties working --- src/transport-bar.c | 64 +++++++++++++++++++++++++---------------------------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/src/transport-bar.c b/src/transport-bar.c index 02d9a45..96ae287 100644 --- a/src/transport-bar.c +++ b/src/transport-bar.c @@ -28,8 +28,6 @@ with this program. If not, see . // TODO: think about leakage: ted ! - - static DbusmenuMenuitem* twin_item; typedef struct _TransportBarPrivate TransportBarPrivate; @@ -54,13 +52,13 @@ static guint signals[LAST_SIGNAL] = { 0 }; #define TRANSPORT_BAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRANSPORT_BAR_TYPE, TransportBarPrivate)) -/* Prototypes */ +/* 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); - +/* UI and dbus callbacks */ static gboolean transport_bar_button_press_event (GtkWidget *menuitem, GdkEventButton *event); static gboolean transport_bar_button_release_event (GtkWidget *menuitem, @@ -68,9 +66,12 @@ static gboolean transport_bar_button_release_event (GtkWidget *menui static gboolean transport_bar_play_button_trigger (GtkWidget *widget, GdkEventButton *event, gpointer user_data); -static void transport_bar_update_state(gchar * property, +static void transport_bar_update_state(DbusmenuMenuitem* item, + gchar * property, GValue * value, gpointer userdata); +// utility methods +static gchar* transport_bar_determine_play_label(gchar* state); G_DEFINE_TYPE (TransportBar, transport_bar, GTK_TYPE_MENU_ITEM); @@ -194,39 +195,34 @@ transport_bar_play_button_trigger(GtkWidget* widget, return FALSE; } -//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) +/** +* transport_bar_update_state() +* Callback for updates from the other side of dbus +**/ +static void transport_bar_update_state(DbusmenuMenuitem* item, 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); + gchar* input = g_strdup(g_value_get_string(value)); + g_debug("transport_bar_update_state - with value %s", input); - 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); + TransportBar* bar = (TransportBar*)userdata; + TransportBarPrivate *priv = TRANSPORT_BAR_GET_PRIVATE(bar); + + gtk_button_set_label(GTK_BUTTON(priv->play_button), g_strdup(transport_bar_determine_play_label(property))); +} +// will be needed for image swapping +static gchar* transport_bar_determine_play_label(gchar* state) +{ + gchar* label = ">"; + if(g_strcmp0(state, "pause") == 0){ + label = "||"; + } + else if(g_strcmp0(state, "play") == 0){ + label = ">"; + } + return label; } /** -- cgit v1.2.3 From 3337497532d6d726d9eaa42b5b1b3ed8e4dbedc7 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Sun, 13 Jun 2010 22:27:50 +0100 Subject: album art underway --- src/common-defs.h | 18 ++++++++--------- src/metadata-menu-item.vala | 4 ++-- src/metadata-widget.c | 45 ++++++++++++------------------------------- src/metadata-widget.c~ | 47 +++++++++++++-------------------------------- src/player-controller.vala | 2 +- 5 files changed, 37 insertions(+), 79 deletions(-) diff --git a/src/common-defs.h b/src/common-defs.h index e38b15f..014d864 100644 --- a/src/common-defs.h +++ b/src/common-defs.h @@ -25,12 +25,12 @@ with this program. If not, see . #define SIGNAL_SINK_AVAILABLE_UPDATE "SinkAvailableUpdate" /* 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" - -#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"; +#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" + +#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_PATH "x-canonical-metadata-image" diff --git a/src/metadata-menu-item.vala b/src/metadata-menu-item.vala index 0f6d7d5..c9daee6 100644 --- a/src/metadata-menu-item.vala +++ b/src/metadata-menu-item.vala @@ -8,7 +8,7 @@ public class MetadataMenuitem : Dbusmenu.Menuitem 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"; + const string DBUSMENU_METADATA_MENUITEM_IMAGE_PATH = "x-canonical-metadata-image"; public MetadataMenuitem() { @@ -16,7 +16,7 @@ public class MetadataMenuitem : Dbusmenu.Menuitem 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, ""); + this.property_set(DBUSMENU_METADATA_MENUITEM_IMAGE_PATH, "/home/ronoc/Desktop/Sonnamble/Sonnamble_CD.jpg"); } public override void handle_event(string name, GLib.Value input_value, uint timestamp) diff --git a/src/metadata-widget.c b/src/metadata-widget.c index 5e20f15..b414969 100644 --- a/src/metadata-widget.c +++ b/src/metadata-widget.c @@ -26,10 +26,6 @@ with this program. If not, see . #include "common-defs.h" #include -// TODO: think about leakage: ted ! - - - static DbusmenuMenuitem* twin_item; typedef struct _MetadataWidgetPrivate MetadataWidgetPrivate; @@ -37,6 +33,8 @@ typedef struct _MetadataWidgetPrivate MetadataWidgetPrivate; struct _MetadataWidgetPrivate { GtkWidget* hbox; + GtkWidget* album_art; + gchar* our_path; }; #define METADATA_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), METADATA_WIDGET_TYPE, MetadataWidgetPrivate)) @@ -90,7 +88,16 @@ metadata_widget_init (MetadataWidget *self) hbox = gtk_hbox_new(TRUE, 2); - g_signal_connect(G_OBJECT(twin_item), "property-changed", G_CALLBACK(metadata_widget_update_state), self); + 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); + + priv->album_art = gtk_image_new_from_file(priv->our_path); + + 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); @@ -100,10 +107,6 @@ metadata_widget_init (MetadataWidget *self) 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); } @@ -134,36 +137,12 @@ metadata_widget_button_release_event (GtkWidget *menuitem, //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); - } /** diff --git a/src/metadata-widget.c~ b/src/metadata-widget.c~ index 39a42db..81c6f75 100644 --- a/src/metadata-widget.c~ +++ b/src/metadata-widget.c~ @@ -26,10 +26,6 @@ with this program. If not, see . #include "common-defs.h" #include -// TODO: think about leakage: ted ! - - - static DbusmenuMenuitem* twin_item; typedef struct _MetadataWidgetPrivate MetadataWidgetPrivate; @@ -37,6 +33,8 @@ typedef struct _MetadataWidgetPrivate MetadataWidgetPrivate; struct _MetadataWidgetPrivate { GtkWidget* hbox; + GtkWidget* album_art; + gchar* our_path; }; #define METADATA_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), METADATA_WIDGET_TYPE, MetadataWidgetPrivate)) @@ -70,7 +68,7 @@ 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_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)); @@ -90,7 +88,16 @@ metadata_widget_init (MetadataWidget *self) hbox = gtk_hbox_new(TRUE, 2); - g_signal_connect(G_OBJECT(twin_item), "property-changed", G_CALLBACK(metadata_widget_update_state), self); + const gchar* path = dbusmenu_menuitem_property_get(twin_item, DBUSMENU_METADATA_MENUITEM_IMAGE); + + g_debug("MetadataWidget:init - path = %s", path); + + priv->our_path = g_strdup(path); + + priv->album_art = gtk_image_new_from_file(priv->our_path); + + 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); @@ -100,10 +107,6 @@ metadata_widget_init (MetadataWidget *self) 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); } @@ -134,36 +137,12 @@ metadata_widget_button_release_event (GtkWidget *menuitem, //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); - } /** diff --git a/src/player-controller.vala b/src/player-controller.vala index 26ad1ff..dcb428b 100644 --- a/src/player-controller.vala +++ b/src/player-controller.vala @@ -34,7 +34,7 @@ public class PlayerController : GLib.Object // Title item Dbusmenu.Menuitem title_item = new Dbusmenu.Menuitem(); - title_item.property_set(MENUITEM_PROP_LABEL, this.name.concat("")); + title_item.property_set(MENUITEM_PROP_LABEL, this.name); title_item.property_set(MENUITEM_PROP_ICON_NAME, "applications-multimedia"); this.custom_items.add(title_item); -- cgit v1.2.3 From 11741257873bf35670e2503184821e2bd075c9f6 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Mon, 14 Jun 2010 11:07:28 +0100 Subject: properties working now both ways --- src/indicator-sound.c | 32 ++++++++++++++++++++++++++++++-- src/metadata-menu-item.vala | 3 +++ src/metadata-widget.c | 5 ----- src/metadata-widget.c~ | 9 ++------- 4 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/indicator-sound.c b/src/indicator-sound.c index a3856c4..af2a6f9 100755 --- a/src/indicator-sound.c +++ b/src/indicator-sound.c @@ -39,6 +39,7 @@ with this program. If not, see . #include "indicator-sound.h" #include "transport-bar.h" +#include "metadata-widget.h" #include "dbus-shared-names.h" #include "sound-service-client.h" #include "common-defs.h" @@ -92,8 +93,9 @@ 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); -//transport bar related +//player widgets related static gboolean new_transport_bar(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); +static gboolean new_metadata_widget(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); // DBUS communication static DBusGProxy *sound_dbus_proxy = NULL; @@ -240,6 +242,7 @@ get_menu (IndicatorObject * io) g_object_set_data (G_OBJECT (client), "indicator", io); dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(client), DBUSMENU_SLIDER_MENUITEM_TYPE, new_slider_item); dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(client), DBUSMENU_TRANSPORT_MENUITEM_TYPE, new_transport_bar); + dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(client), DBUSMENU_METADATA_MENUITEM_TYPE, new_metadata_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); @@ -310,7 +313,8 @@ new_slider_item(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuC return TRUE; } -static gboolean new_transport_bar(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client) +static gboolean +new_transport_bar(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client) { g_debug("indicator-sound: new_transport_bar() called "); @@ -329,6 +333,30 @@ static gboolean new_transport_bar(DbusmenuMenuitem * newitem, DbusmenuMenuitem * return TRUE; } +static gboolean +new_metadata_widget(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client) +{ + g_debug("indicator-sound: new_metadata_widget"); + + GtkWidget* metadata = NULL; + + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(newitem), FALSE); + g_return_val_if_fail(DBUSMENU_IS_GTKCLIENT(client), FALSE); + + metadata = metadata_widget_new (newitem); + GtkMenuItem *menu_metadata_widget = GTK_MENU_ITEM(metadata); + + dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, menu_metadata_widget, parent); + + gtk_widget_show_all(metadata); + + return TRUE; +} + +//const gchar* path = dbusmenu_menuitem_property_get(new_item, DBUSMENU_METADATA_MENUITEM_IMAGE_PATH); + +//g_debug("New transport bar path = %s", path); + static void connection_changed (IndicatorServiceManager * sm, gboolean connected, gpointer userdata) diff --git a/src/metadata-menu-item.vala b/src/metadata-menu-item.vala index c9daee6..ef72143 100644 --- a/src/metadata-menu-item.vala +++ b/src/metadata-menu-item.vala @@ -17,6 +17,9 @@ public class MetadataMenuitem : Dbusmenu.Menuitem 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_PATH, "/home/ronoc/Desktop/Sonnamble/Sonnamble_CD.jpg"); + + debug("image_path property set %s:", this.property_get(DBUSMENU_METADATA_MENUITEM_IMAGE_PATH)); + } public override void handle_event(string name, GLib.Value input_value, uint timestamp) diff --git a/src/metadata-widget.c b/src/metadata-widget.c index b414969..70542e9 100644 --- a/src/metadata-widget.c +++ b/src/metadata-widget.c @@ -138,11 +138,6 @@ metadata_widget_button_release_event (GtkWidget *menuitem, static void metadata_widget_update_state(gchar *property, GValue *value, gpointer userdata) { g_debug("metadata_widget_update_state - with property %s", property); - - if (value == NULL){ - g_debug("value is null"); - return; - } } /** diff --git a/src/metadata-widget.c~ b/src/metadata-widget.c~ index 81c6f75..df58de5 100644 --- a/src/metadata-widget.c~ +++ b/src/metadata-widget.c~ @@ -88,9 +88,9 @@ metadata_widget_init (MetadataWidget *self) hbox = gtk_hbox_new(TRUE, 2); - const gchar* path = dbusmenu_menuitem_property_get(twin_item, DBUSMENU_METADATA_MENUITEM_IMAGE); + //const gchar* path = dbusmenu_menuitem_property_get(twin_item, DBUSMENU_METADATA_MENUITEM_IMAGE_PATH); - g_debug("MetadataWidget:init - path = %s", path); + //g_debug("MetadataWidget:init - path = %s", path); priv->our_path = g_strdup(path); @@ -138,11 +138,6 @@ metadata_widget_button_release_event (GtkWidget *menuitem, static void metadata_widget_update_state(gchar *property, GValue *value, gpointer userdata) { g_debug("metadata_widget_update_state - with property %s", property); - - if (value == NULL){ - g_debug("value is null"); - return; - } } /** -- 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(-) 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 From 5e806e9c5f16751a39a9d943c9483754ba73884a Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Mon, 14 Jun 2010 19:48:52 +0100 Subject: and the actual rename --- src/transport-bar.c | 238 ------------------------------------------------- src/transport-bar.h | 51 ----------- src/transport-widget.c | 238 +++++++++++++++++++++++++++++++++++++++++++++++++ src/transport-widget.h | 51 +++++++++++ 4 files changed, 289 insertions(+), 289 deletions(-) delete mode 100644 src/transport-bar.c delete mode 100644 src/transport-bar.h create mode 100644 src/transport-widget.c create mode 100644 src/transport-widget.h diff --git a/src/transport-bar.c b/src/transport-bar.c deleted file mode 100644 index bc2ee40..0000000 --- a/src/transport-bar.c +++ /dev/null @@ -1,238 +0,0 @@ -/* -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 "transport-bar.h" -#include "common-defs.h" -#include - -// TODO: think about leakage: ted ! - -static DbusmenuMenuitem* twin_item; - -typedef struct _TransportWidgetPrivate TransportWidgetPrivate; - -struct _TransportWidgetPrivate -{ - GtkWidget* hbox; - GtkWidget* previous_button; - GtkWidget* play_button; - GtkWidget* next_button; -}; - -enum { - PLAY, - PAUSE, - NEXT, - PREVIOUS, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -#define TRANSPORT_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRANSPORT_WIDGET_TYPE, TransportWidgetPrivate)) - -/* Gobject boiler plate */ -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_widget_button_press_event (GtkWidget *menuitem, - GdkEventButton *event); -static gboolean transport_widget_button_release_event (GtkWidget *menuitem, - GdkEventButton *event); -static gboolean transport_widget_play_button_trigger (GtkWidget *widget, - GdkEventButton *event, - gpointer user_data); -static void transport_widget_update_state(DbusmenuMenuitem* item, - gchar * property, - GValue * value, - gpointer userdata); -// utility methods -static gchar* transport_widget_determine_play_label(gchar* state); - -G_DEFINE_TYPE (TransportWidget, transport_widget, GTK_TYPE_MENU_ITEM); - - - -static void -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_widget_button_press_event; - widget_class->button_release_event = transport_widget_button_release_event; - - g_type_class_add_private (klass, sizeof (TransportWidgetPrivate)); - - gobject_class->dispose = transport_widget_dispose; - gobject_class->finalize = transport_widget_finalize; - - signals[PLAY] = g_signal_new ("play", - G_OBJECT_CLASS_TYPE (gobject_class), - G_SIGNAL_RUN_FIRST, - 0, - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - signals[PAUSE] = g_signal_new ("pause", - G_OBJECT_CLASS_TYPE (gobject_class), - G_SIGNAL_RUN_FIRST, - 0, - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - - signals[NEXT] = g_signal_new ("next", - G_OBJECT_CLASS_TYPE (gobject_class), - G_SIGNAL_RUN_FIRST, - 0, - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - signals[PREVIOUS] = g_signal_new ("previous", - G_OBJECT_CLASS_TYPE (gobject_class), - G_SIGNAL_RUN_FIRST, - 0, - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); -} - -static void -transport_widget_init (TransportWidget *self) -{ - g_debug("TransportWidget::transport_widget_init"); - - TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE(self); - GtkWidget *hbox; - - hbox = gtk_hbox_new(TRUE, 2); - priv->previous_button = gtk_button_new_with_label("<<"); - priv->next_button = gtk_button_new_with_label(">>"); - priv->play_button = gtk_button_new_with_label(">"); - - gtk_box_pack_start (GTK_BOX (hbox), priv->previous_button, FALSE, FALSE, 0); - 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_widget_play_button_trigger), NULL); - priv->hbox = hbox; - - 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); - -} - -static void -transport_widget_dispose (GObject *object) -{ - //if(IS_TRANSPORT_BAR(object) == TRUE){ - // TransportWidgetPrivate * priv = TRANSPORT_BAR_GET_PRIVATE(TRANSPORT_BAR(object)); - // g_object_unref(priv->previous_button); - //} - G_OBJECT_CLASS (transport_widget_parent_class)->dispose (object); -} - -static void -transport_widget_finalize (GObject *object) -{ - G_OBJECT_CLASS (transport_widget_parent_class)->finalize (object); -} - -/* keyevents */ -static gboolean -transport_widget_button_press_event (GtkWidget *menuitem, - GdkEventButton *event) -{ - g_debug("TransportWidget::menu_press_event"); - return FALSE; -} - -static gboolean -transport_widget_button_release_event (GtkWidget *menuitem, - GdkEventButton *event) -{ - g_debug("TransportWidget::menu_release_event"); - return FALSE; -} - -/* Individual keyevents on the buttons */ -static gboolean -transport_widget_play_button_trigger(GtkWidget* widget, - GdkEventButton *event, - gpointer user_data) -{ - g_debug("TransportWidget::PLAY button_press_event"); - return FALSE; -} - -/** -* transport_widget_update_state() -* Callback for updates from the other side of dbus -**/ -static void transport_widget_update_state(DbusmenuMenuitem* item, gchar* property, - GValue* value, gpointer userdata) -{ - g_debug("transport_widget_update_state - with property %s", property); - gchar* input = g_strdup(g_value_get_string(value)); - g_debug("transport_widget_update_state - with value %s", input); - - TransportWidget* bar = (TransportWidget*)userdata; - TransportWidgetPrivate *priv = TRANSPORT_WIDGET_GET_PRIVATE(bar); - - 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_widget_determine_play_label(gchar* state) -{ - gchar* label = ">"; - if(g_strcmp0(state, "pause") == 0){ - label = "||"; - } - else if(g_strcmp0(state, "play") == 0){ - label = ">"; - } - return label; -} - - /** - * transport_new: - * @returns: a new #TransportWidget. - **/ -GtkWidget* -transport_widget_new(DbusmenuMenuitem *item) -{ - twin_item = item; - return g_object_new(TRANSPORT_WIDGET_TYPE, NULL); -} - diff --git a/src/transport-bar.h b/src/transport-bar.h deleted file mode 100644 index 1d1aa6e..0000000 --- a/src/transport-bar.h +++ /dev/null @@ -1,51 +0,0 @@ -/* -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 __TRANSPORT_WIDGET_H__ -#define __TRANSPORT_WIDGET_H__ - -#include -#include - -G_BEGIN_DECLS - -#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 _TransportWidget TransportWidget; -typedef struct _TransportWidgetClass TransportWidgetClass; - -struct _TransportWidgetClass { - GtkMenuItemClass parent_class; -}; - -struct _TransportWidget { - GtkMenuItem parent; -}; - -GType transport_widget_get_type (void); -GtkWidget* transport_widget_new(DbusmenuMenuitem *twin_item); - -G_END_DECLS - -#endif - diff --git a/src/transport-widget.c b/src/transport-widget.c new file mode 100644 index 0000000..bc2ee40 --- /dev/null +++ b/src/transport-widget.c @@ -0,0 +1,238 @@ +/* +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 "transport-bar.h" +#include "common-defs.h" +#include + +// TODO: think about leakage: ted ! + +static DbusmenuMenuitem* twin_item; + +typedef struct _TransportWidgetPrivate TransportWidgetPrivate; + +struct _TransportWidgetPrivate +{ + GtkWidget* hbox; + GtkWidget* previous_button; + GtkWidget* play_button; + GtkWidget* next_button; +}; + +enum { + PLAY, + PAUSE, + NEXT, + PREVIOUS, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +#define TRANSPORT_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRANSPORT_WIDGET_TYPE, TransportWidgetPrivate)) + +/* Gobject boiler plate */ +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_widget_button_press_event (GtkWidget *menuitem, + GdkEventButton *event); +static gboolean transport_widget_button_release_event (GtkWidget *menuitem, + GdkEventButton *event); +static gboolean transport_widget_play_button_trigger (GtkWidget *widget, + GdkEventButton *event, + gpointer user_data); +static void transport_widget_update_state(DbusmenuMenuitem* item, + gchar * property, + GValue * value, + gpointer userdata); +// utility methods +static gchar* transport_widget_determine_play_label(gchar* state); + +G_DEFINE_TYPE (TransportWidget, transport_widget, GTK_TYPE_MENU_ITEM); + + + +static void +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_widget_button_press_event; + widget_class->button_release_event = transport_widget_button_release_event; + + g_type_class_add_private (klass, sizeof (TransportWidgetPrivate)); + + gobject_class->dispose = transport_widget_dispose; + gobject_class->finalize = transport_widget_finalize; + + signals[PLAY] = g_signal_new ("play", + G_OBJECT_CLASS_TYPE (gobject_class), + G_SIGNAL_RUN_FIRST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[PAUSE] = g_signal_new ("pause", + G_OBJECT_CLASS_TYPE (gobject_class), + G_SIGNAL_RUN_FIRST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + + signals[NEXT] = g_signal_new ("next", + G_OBJECT_CLASS_TYPE (gobject_class), + G_SIGNAL_RUN_FIRST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[PREVIOUS] = g_signal_new ("previous", + G_OBJECT_CLASS_TYPE (gobject_class), + G_SIGNAL_RUN_FIRST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); +} + +static void +transport_widget_init (TransportWidget *self) +{ + g_debug("TransportWidget::transport_widget_init"); + + TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE(self); + GtkWidget *hbox; + + hbox = gtk_hbox_new(TRUE, 2); + priv->previous_button = gtk_button_new_with_label("<<"); + priv->next_button = gtk_button_new_with_label(">>"); + priv->play_button = gtk_button_new_with_label(">"); + + gtk_box_pack_start (GTK_BOX (hbox), priv->previous_button, FALSE, FALSE, 0); + 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_widget_play_button_trigger), NULL); + priv->hbox = hbox; + + 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); + +} + +static void +transport_widget_dispose (GObject *object) +{ + //if(IS_TRANSPORT_BAR(object) == TRUE){ + // TransportWidgetPrivate * priv = TRANSPORT_BAR_GET_PRIVATE(TRANSPORT_BAR(object)); + // g_object_unref(priv->previous_button); + //} + G_OBJECT_CLASS (transport_widget_parent_class)->dispose (object); +} + +static void +transport_widget_finalize (GObject *object) +{ + G_OBJECT_CLASS (transport_widget_parent_class)->finalize (object); +} + +/* keyevents */ +static gboolean +transport_widget_button_press_event (GtkWidget *menuitem, + GdkEventButton *event) +{ + g_debug("TransportWidget::menu_press_event"); + return FALSE; +} + +static gboolean +transport_widget_button_release_event (GtkWidget *menuitem, + GdkEventButton *event) +{ + g_debug("TransportWidget::menu_release_event"); + return FALSE; +} + +/* Individual keyevents on the buttons */ +static gboolean +transport_widget_play_button_trigger(GtkWidget* widget, + GdkEventButton *event, + gpointer user_data) +{ + g_debug("TransportWidget::PLAY button_press_event"); + return FALSE; +} + +/** +* transport_widget_update_state() +* Callback for updates from the other side of dbus +**/ +static void transport_widget_update_state(DbusmenuMenuitem* item, gchar* property, + GValue* value, gpointer userdata) +{ + g_debug("transport_widget_update_state - with property %s", property); + gchar* input = g_strdup(g_value_get_string(value)); + g_debug("transport_widget_update_state - with value %s", input); + + TransportWidget* bar = (TransportWidget*)userdata; + TransportWidgetPrivate *priv = TRANSPORT_WIDGET_GET_PRIVATE(bar); + + 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_widget_determine_play_label(gchar* state) +{ + gchar* label = ">"; + if(g_strcmp0(state, "pause") == 0){ + label = "||"; + } + else if(g_strcmp0(state, "play") == 0){ + label = ">"; + } + return label; +} + + /** + * transport_new: + * @returns: a new #TransportWidget. + **/ +GtkWidget* +transport_widget_new(DbusmenuMenuitem *item) +{ + twin_item = item; + return g_object_new(TRANSPORT_WIDGET_TYPE, NULL); +} + diff --git a/src/transport-widget.h b/src/transport-widget.h new file mode 100644 index 0000000..1d1aa6e --- /dev/null +++ b/src/transport-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 __TRANSPORT_WIDGET_H__ +#define __TRANSPORT_WIDGET_H__ + +#include +#include + +G_BEGIN_DECLS + +#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 _TransportWidget TransportWidget; +typedef struct _TransportWidgetClass TransportWidgetClass; + +struct _TransportWidgetClass { + GtkMenuItemClass parent_class; +}; + +struct _TransportWidget { + GtkMenuItem parent; +}; + +GType transport_widget_get_type (void); +GtkWidget* transport_widget_new(DbusmenuMenuitem *twin_item); + +G_END_DECLS + +#endif + -- cgit v1.2.3 From ede4ad390ac3d4282a4a99a58d6f398e42169ba4 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Mon, 14 Jun 2010 19:49:51 +0100 Subject: and the actual rename --- src/metadata-widget.c~ | 178 ------------------------------------------------- src/metadata-widget.h~ | 51 -------------- 2 files changed, 229 deletions(-) delete mode 100644 src/metadata-widget.c~ delete mode 100644 src/metadata-widget.h~ diff --git a/src/metadata-widget.c~ b/src/metadata-widget.c~ deleted file mode 100644 index add3c36..0000000 --- a/src/metadata-widget.c~ +++ /dev/null @@ -1,178 +0,0 @@ -/* -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 - -static DbusmenuMenuitem* twin_item; - -typedef struct _MetadataWidgetPrivate MetadataWidgetPrivate; - -struct _MetadataWidgetPrivate -{ - GtkWidget* hbox; - GtkWidget* album_art; - 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)) - -/* 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 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); - - - -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, 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); - - // 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_container_add (GTK_CONTAINER (self), hbox); - -} - -static void -metadata_widget_dispose (GObject *object) -{ - 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; -} - -static void metadata_widget_update_state(gchar *property, GValue *value, gpointer userdata) -{ - g_debug("metadata_widget_update_state - with property %s", property); -} - - /** - * 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~ deleted file mode 100644 index edffdf2..0000000 --- a/src/metadata-widget.h~ +++ /dev/null @@ -1,51 +0,0 @@ -/* -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 - -- cgit v1.2.3 From b8519dc8b908adf85f88299c743106c9c3627b64 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Mon, 14 Jun 2010 19:52:25 +0100 Subject: and it compiles --- src/indicator-sound.c | 4 ++-- src/transport-widget.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/indicator-sound.c b/src/indicator-sound.c index ebafd9a..9f7e136 100755 --- a/src/indicator-sound.c +++ b/src/indicator-sound.c @@ -94,7 +94,7 @@ static void slider_released(GtkWidget *widget, gpointer user_data); static void style_changed_cb(GtkWidget *widget, gpointer user_data); //player widgets related -static gboolean new_transport_bar(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); +static gboolean new_transport_widget(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); static gboolean new_metadata_widget(DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); // DBUS communication @@ -241,7 +241,7 @@ get_menu (IndicatorObject * io) DbusmenuGtkClient *client = dbusmenu_gtkmenu_get_client(menu); g_object_set_data (G_OBJECT (client), "indicator", io); dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(client), DBUSMENU_SLIDER_MENUITEM_TYPE, new_slider_item); - dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(client), DBUSMENU_TRANSPORT_MENUITEM_TYPE, new_transport_bar); + 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); // register Key-press listening on the menu widget as the slider does not allow this. diff --git a/src/transport-widget.c b/src/transport-widget.c index bc2ee40..cd73a17 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -22,7 +22,7 @@ with this program. If not, see . #endif #include -#include "transport-bar.h" +#include "transport-widget.h" #include "common-defs.h" #include -- cgit v1.2.3 From ca99bae318b2768e721c2fa0834e8d12c196b245 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 15 Jun 2010 00:32:27 +0100 Subject: key events are not going to be easy --- src/transport-menu-item.vala | 2 - src/transport-widget.c | 91 +++++++++++++++++++++++++++++++------------- 2 files changed, 65 insertions(+), 28 deletions(-) diff --git a/src/transport-menu-item.vala b/src/transport-menu-item.vala index 0ecc9b1..7687a92 100644 --- a/src/transport-menu-item.vala +++ b/src/transport-menu-item.vala @@ -15,7 +15,5 @@ public class TransportMenuitem : Dbusmenu.Menuitem 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 diff --git a/src/transport-widget.c b/src/transport-widget.c index cd73a17..7e26c68 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -58,14 +58,21 @@ 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_widget_button_press_event (GtkWidget *menuitem, - GdkEventButton *event); +/* UI and dbusmenu callbacks */ +static gboolean transport_widget_button_press_event (GtkWidget *menuitem, + GdkEventButton *event); static gboolean transport_widget_button_release_event (GtkWidget *menuitem, - GdkEventButton *event); -static gboolean transport_widget_play_button_trigger (GtkWidget *widget, - GdkEventButton *event, - gpointer user_data); + GdkEventButton *event); +static gboolean transport_widget_play_button_press_event (GtkWidget *widget, + GdkEventButton *event, + gpointer user_data); +static gboolean transport_widget_previous_button_press_event (GtkWidget *widget, + GdkEventButton *event, + gpointer user_data); +static gboolean transport_widget_next_button_press_event (GtkWidget *widget, + GdkEventButton *event, + gpointer user_data); + static void transport_widget_update_state(DbusmenuMenuitem* item, gchar * property, GValue * value, @@ -138,27 +145,26 @@ transport_widget_init (TransportWidget *self) priv->next_button = gtk_button_new_with_label(">>"); priv->play_button = gtk_button_new_with_label(">"); - gtk_box_pack_start (GTK_BOX (hbox), priv->previous_button, FALSE, FALSE, 0); - 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); + gtk_box_pack_start (GTK_BOX (hbox), priv->previous_button, FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (hbox), priv->play_button, FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (hbox), priv->next_button, FALSE, TRUE, 0); + + g_signal_connect(GTK_OBJECT(priv->play_button), "button-press-event", G_CALLBACK(transport_widget_play_button_press_event), priv->play_button); + g_signal_connect(GTK_OBJECT(priv->previous_button), "button-press-event", G_CALLBACK(transport_widget_previous_button_press_event), NULL); + g_signal_connect(GTK_OBJECT(priv->next_button), "button-press-event", G_CALLBACK(transport_widget_next_button_press_event), NULL); - g_signal_connect(priv->play_button, "button-press-event", G_CALLBACK(transport_widget_play_button_trigger), NULL); - priv->hbox = hbox; + priv->hbox = hbox; 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); + gtk_container_add (GTK_CONTAINER (self), priv->hbox); + gtk_widget_show_all (priv->hbox); } static void transport_widget_dispose (GObject *object) { - //if(IS_TRANSPORT_BAR(object) == TRUE){ - // TransportWidgetPrivate * priv = TRANSPORT_BAR_GET_PRIVATE(TRANSPORT_BAR(object)); - // g_object_unref(priv->previous_button); - //} G_OBJECT_CLASS (transport_widget_parent_class)->dispose (object); } @@ -171,10 +177,25 @@ transport_widget_finalize (GObject *object) /* keyevents */ static gboolean transport_widget_button_press_event (GtkWidget *menuitem, - GdkEventButton *event) + GdkEventButton *event) { g_debug("TransportWidget::menu_press_event"); - return FALSE; + //TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE(TRANSPORT_WIDGET(menuitem)); + //gtk_button_pressed(GTK_BUTTON(priv->play_button)); + //gtk_button_pressed(GTK_BUTTON(priv->previous_button)); + //gtk_button_pressed(GTK_BUTTON(priv->next_button)); + + //if (event->type == GDK_BUTTON_PRESS) { + //GdkEventButton *bevent = (GdkEventButton *) event; + //gtk_button_pressed(bevent->button); +//gtk_menu_popup (GTK_MENU (menuitem), NULL, NULL, NULL, NULL, +// bevent->button, bevent->time); + /* Tell calling code that we have handled this event; the buck + * stops here. */ + //return TRUE; + //} + + return TRUE; } static gboolean @@ -182,17 +203,35 @@ transport_widget_button_release_event (GtkWidget *menuitem, GdkEventButton *event) { g_debug("TransportWidget::menu_release_event"); - return FALSE; + return TRUE; } /* Individual keyevents on the buttons */ static gboolean -transport_widget_play_button_trigger(GtkWidget* widget, - GdkEventButton *event, - gpointer user_data) +transport_widget_play_button_press_event( GtkWidget* widget, + GdkEventButton *event, + gpointer user_data) +{ + g_debug("!!!!! TransportWidget::PLAY button_press_event"); + return TRUE; +} + +static gboolean +transport_widget_previous_button_press_event( GtkWidget* widget, + GdkEventButton *event, + gpointer user_data) +{ + g_debug("!!!!! TransportWidget::PREVIOUS button_press_event"); + return TRUE; +} + +static gboolean +transport_widget_next_button_press_event( GtkWidget* widget, + GdkEventButton *event, + gpointer user_data) { - g_debug("TransportWidget::PLAY button_press_event"); - return FALSE; + g_debug("!!!!! TransportWidget::NEXT button_press_event"); + return TRUE; } /** -- cgit v1.2.3 From 50bea3ce0fad1e36d0a657430a96567986a46638 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 15 Jun 2010 11:33:07 +0100 Subject: for now activated one button due to gtk button press oddness --- src/transport-widget.c | 111 ++++++++++++++++++++++++++----------------------- 1 file changed, 59 insertions(+), 52 deletions(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index 7e26c68..b3f2ee1 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -35,9 +35,9 @@ typedef struct _TransportWidgetPrivate TransportWidgetPrivate; struct _TransportWidgetPrivate { GtkWidget* hbox; - GtkWidget* previous_button; + //GtkWidget* previous_button; GtkWidget* play_button; - GtkWidget* next_button; + //GtkWidget* next_button; }; enum { @@ -63,22 +63,22 @@ static gboolean transport_widget_button_press_event (GtkWidget *men GdkEventButton *event); static gboolean transport_widget_button_release_event (GtkWidget *menuitem, GdkEventButton *event); -static gboolean transport_widget_play_button_press_event (GtkWidget *widget, - GdkEventButton *event, - gpointer user_data); -static gboolean transport_widget_previous_button_press_event (GtkWidget *widget, - GdkEventButton *event, - gpointer user_data); -static gboolean transport_widget_next_button_press_event (GtkWidget *widget, - GdkEventButton *event, - gpointer user_data); +//static gboolean transport_widget_play_button_press_event (GtkWidget *widget, +// GdkEventButton *event, +// gpointer user_data); +//static gboolean transport_widget_previous_button_press_event (GtkWidget *widget, +// GdkEventButton *event, +// gpointer user_data); +//static gboolean transport_widget_next_button_press_event (GtkWidget *widget, +// GdkEventButton *event, +// gpointer user_data); static void transport_widget_update_state(DbusmenuMenuitem* item, gchar * property, GValue * value, gpointer userdata); // utility methods -static gchar* transport_widget_determine_play_label(gchar* state); +static gchar* transport_widget_determine_play_label(const gchar* state); G_DEFINE_TYPE (TransportWidget, transport_widget, GTK_TYPE_MENU_ITEM); @@ -141,24 +141,29 @@ transport_widget_init (TransportWidget *self) GtkWidget *hbox; hbox = gtk_hbox_new(TRUE, 2); - priv->previous_button = gtk_button_new_with_label("<<"); - priv->next_button = gtk_button_new_with_label(">>"); + //priv->previous_button = gtk_button_new_with_label("<<"); + //priv->next_button = gtk_button_new_with_label(">>"); priv->play_button = gtk_button_new_with_label(">"); - gtk_box_pack_start (GTK_BOX (hbox), priv->previous_button, FALSE, TRUE, 0); + //gtk_box_pack_start (GTK_BOX (hbox), priv->previous_button, FALSE, TRUE, 0); gtk_box_pack_start (GTK_BOX (hbox), priv->play_button, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (hbox), priv->next_button, FALSE, TRUE, 0); + //gtk_box_pack_start (GTK_BOX (hbox), priv->next_button, FALSE, TRUE, 0); - g_signal_connect(GTK_OBJECT(priv->play_button), "button-press-event", G_CALLBACK(transport_widget_play_button_press_event), priv->play_button); - g_signal_connect(GTK_OBJECT(priv->previous_button), "button-press-event", G_CALLBACK(transport_widget_previous_button_press_event), NULL); - g_signal_connect(GTK_OBJECT(priv->next_button), "button-press-event", G_CALLBACK(transport_widget_next_button_press_event), NULL); + //g_signal_connect(GTK_OBJECT(priv->play_button), "button-press-event", G_CALLBACK(transport_widget_play_button_press_event), priv->play_button); + //g_signal_connect(GTK_OBJECT(priv->previous_button), "button-press-event", G_CALLBACK(transport_widget_previous_button_press_event), NULL); + //g_signal_connect(GTK_OBJECT(priv->next_button), "button-press-event", G_CALLBACK(transport_widget_next_button_press_event), NULL); priv->hbox = hbox; g_signal_connect(G_OBJECT(twin_item), "property-changed", G_CALLBACK(transport_widget_update_state), self); gtk_container_add (GTK_CONTAINER (self), priv->hbox); - + + //GtkWidget* parent = gtk_widget_get_parent(GTK_WIDGET(priv->hbox)); + //if (GTK_IS_MENU_ITEM(parent)){ + // g_debug("as expected the transport item is the parent"); + //} + //gtk_widget_set_parent(GTK_WIDGET(priv->hbox), GTK_WIDGET(self)); gtk_widget_show_all (priv->hbox); } @@ -180,7 +185,9 @@ transport_widget_button_press_event (GtkWidget *menuitem, GdkEventButton *event) { g_debug("TransportWidget::menu_press_event"); - //TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE(TRANSPORT_WIDGET(menuitem)); + TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE(TRANSPORT_WIDGET(menuitem)); + gtk_button_set_label(GTK_BUTTON(priv->play_button), g_strdup(transport_widget_determine_play_label(gtk_button_get_label(GTK_BUTTON(priv->play_button))))); + //gtk_button_pressed(GTK_BUTTON(priv->play_button)); //gtk_button_pressed(GTK_BUTTON(priv->previous_button)); //gtk_button_pressed(GTK_BUTTON(priv->next_button)); @@ -207,32 +214,32 @@ transport_widget_button_release_event (GtkWidget *menuitem, } /* Individual keyevents on the buttons */ -static gboolean -transport_widget_play_button_press_event( GtkWidget* widget, - GdkEventButton *event, - gpointer user_data) -{ - g_debug("!!!!! TransportWidget::PLAY button_press_event"); - return TRUE; -} - -static gboolean -transport_widget_previous_button_press_event( GtkWidget* widget, - GdkEventButton *event, - gpointer user_data) -{ - g_debug("!!!!! TransportWidget::PREVIOUS button_press_event"); - return TRUE; -} - -static gboolean -transport_widget_next_button_press_event( GtkWidget* widget, - GdkEventButton *event, - gpointer user_data) -{ - g_debug("!!!!! TransportWidget::NEXT button_press_event"); - return TRUE; -} +//static gboolean +//transport_widget_play_button_press_event( GtkWidget* widget, +// GdkEventButton *event, +// gpointer user_data) +//{ +// g_debug("!!!!! TransportWidget::PLAY button_press_event"); +// return TRUE; +//} + +//static gboolean +//transport_widget_previous_button_press_event( GtkWidget* widget, +// GdkEventButton *event, +// gpointer user_data) +//{ +// g_debug("!!!!! TransportWidget::PREVIOUS button_press_event"); +// return TRUE; +//} + +//static gboolean +//transport_widget_next_button_press_event( GtkWidget* widget, +// GdkEventButton *event, +// gpointer user_data) +//{ +// g_debug("!!!!! TransportWidget::NEXT button_press_event"); +// return TRUE; +//} /** * transport_widget_update_state() @@ -252,15 +259,15 @@ static void transport_widget_update_state(DbusmenuMenuitem* item, gchar* propert } // will be needed for image swapping -static gchar* transport_widget_determine_play_label(gchar* state) +static gchar* transport_widget_determine_play_label(const gchar* state) { gchar* label = ">"; - if(g_strcmp0(state, "pause") == 0){ + //if(g_strcmp0(state, "||") == 0){ + // label = "||"; + //} + if(g_strcmp0(state, ">") == 0){ label = "||"; } - else if(g_strcmp0(state, "play") == 0){ - label = ">"; - } return label; } -- cgit v1.2.3 From 6cb898210daa87978405e270e159ef2c0d63fb26 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 15 Jun 2010 12:19:01 +0100 Subject: removed commented code --- src/transport-widget.c | 68 -------------------------------------------------- 1 file changed, 68 deletions(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index b3f2ee1..2c32315 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -35,9 +35,7 @@ typedef struct _TransportWidgetPrivate TransportWidgetPrivate; struct _TransportWidgetPrivate { GtkWidget* hbox; - //GtkWidget* previous_button; GtkWidget* play_button; - //GtkWidget* next_button; }; enum { @@ -63,15 +61,6 @@ static gboolean transport_widget_button_press_event (GtkWidget *men GdkEventButton *event); static gboolean transport_widget_button_release_event (GtkWidget *menuitem, GdkEventButton *event); -//static gboolean transport_widget_play_button_press_event (GtkWidget *widget, -// GdkEventButton *event, -// gpointer user_data); -//static gboolean transport_widget_previous_button_press_event (GtkWidget *widget, -// GdkEventButton *event, -// gpointer user_data); -//static gboolean transport_widget_next_button_press_event (GtkWidget *widget, -// GdkEventButton *event, -// gpointer user_data); static void transport_widget_update_state(DbusmenuMenuitem* item, gchar * property, @@ -141,17 +130,10 @@ transport_widget_init (TransportWidget *self) GtkWidget *hbox; hbox = gtk_hbox_new(TRUE, 2); - //priv->previous_button = gtk_button_new_with_label("<<"); - //priv->next_button = gtk_button_new_with_label(">>"); priv->play_button = gtk_button_new_with_label(">"); - //gtk_box_pack_start (GTK_BOX (hbox), priv->previous_button, FALSE, TRUE, 0); gtk_box_pack_start (GTK_BOX (hbox), priv->play_button, FALSE, TRUE, 0); - //gtk_box_pack_start (GTK_BOX (hbox), priv->next_button, FALSE, TRUE, 0); - //g_signal_connect(GTK_OBJECT(priv->play_button), "button-press-event", G_CALLBACK(transport_widget_play_button_press_event), priv->play_button); - //g_signal_connect(GTK_OBJECT(priv->previous_button), "button-press-event", G_CALLBACK(transport_widget_previous_button_press_event), NULL); - //g_signal_connect(GTK_OBJECT(priv->next_button), "button-press-event", G_CALLBACK(transport_widget_next_button_press_event), NULL); priv->hbox = hbox; @@ -159,11 +141,6 @@ transport_widget_init (TransportWidget *self) gtk_container_add (GTK_CONTAINER (self), priv->hbox); - //GtkWidget* parent = gtk_widget_get_parent(GTK_WIDGET(priv->hbox)); - //if (GTK_IS_MENU_ITEM(parent)){ - // g_debug("as expected the transport item is the parent"); - //} - //gtk_widget_set_parent(GTK_WIDGET(priv->hbox), GTK_WIDGET(self)); gtk_widget_show_all (priv->hbox); } @@ -187,20 +164,6 @@ transport_widget_button_press_event (GtkWidget *menuitem, g_debug("TransportWidget::menu_press_event"); TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE(TRANSPORT_WIDGET(menuitem)); gtk_button_set_label(GTK_BUTTON(priv->play_button), g_strdup(transport_widget_determine_play_label(gtk_button_get_label(GTK_BUTTON(priv->play_button))))); - - //gtk_button_pressed(GTK_BUTTON(priv->play_button)); - //gtk_button_pressed(GTK_BUTTON(priv->previous_button)); - //gtk_button_pressed(GTK_BUTTON(priv->next_button)); - - //if (event->type == GDK_BUTTON_PRESS) { - //GdkEventButton *bevent = (GdkEventButton *) event; - //gtk_button_pressed(bevent->button); -//gtk_menu_popup (GTK_MENU (menuitem), NULL, NULL, NULL, NULL, -// bevent->button, bevent->time); - /* Tell calling code that we have handled this event; the buck - * stops here. */ - //return TRUE; - //} return TRUE; } @@ -213,34 +176,6 @@ transport_widget_button_release_event (GtkWidget *menuitem, return TRUE; } -/* Individual keyevents on the buttons */ -//static gboolean -//transport_widget_play_button_press_event( GtkWidget* widget, -// GdkEventButton *event, -// gpointer user_data) -//{ -// g_debug("!!!!! TransportWidget::PLAY button_press_event"); -// return TRUE; -//} - -//static gboolean -//transport_widget_previous_button_press_event( GtkWidget* widget, -// GdkEventButton *event, -// gpointer user_data) -//{ -// g_debug("!!!!! TransportWidget::PREVIOUS button_press_event"); -// return TRUE; -//} - -//static gboolean -//transport_widget_next_button_press_event( GtkWidget* widget, -// GdkEventButton *event, -// gpointer user_data) -//{ -// g_debug("!!!!! TransportWidget::NEXT button_press_event"); -// return TRUE; -//} - /** * transport_widget_update_state() * Callback for updates from the other side of dbus @@ -262,9 +197,6 @@ static void transport_widget_update_state(DbusmenuMenuitem* item, gchar* propert static gchar* transport_widget_determine_play_label(const gchar* state) { gchar* label = ">"; - //if(g_strcmp0(state, "||") == 0){ - // label = "||"; - //} if(g_strcmp0(state, ">") == 0){ label = "||"; } -- cgit v1.2.3 From a1f24dc28b91bd52ef7175813762d23dd0fd3b38 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 15 Jun 2010 13:02:02 +0100 Subject: uncommented auto service shutdown --- src/sound-service.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sound-service.c b/src/sound-service.c index 3ec7a60..38e5fba 100644 --- a/src/sound-service.c +++ b/src/sound-service.c @@ -45,8 +45,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