2
Copyright 2010 Canonical Ltd.
5
Conor Curran <conor.curran@canonical.com>
7
This program is free software: you can redistribute it and/or modify it
8
under the terms of the GNU General Public License version 3, as published
9
by the Free Software Foundation.
11
This program is distributed in the hope that it will be useful, but
12
WITHOUT ANY WARRANTY; without even the implied warranties of
13
MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
14
PURPOSE. See the GNU General Public License for more details.
16
You should have received a copy of the GNU General Public License along
17
with this program. If not, see <http://www.gnu.org/licenses/>.
24
#include <glib/gi18n.h>
25
#include "transport-widget.h"
26
#include "common-defs.h"
29
// TODO: think about leakage: ted !
31
static DbusmenuMenuitem* twin_item;
33
typedef struct _TransportWidgetPrivate TransportWidgetPrivate;
35
struct _TransportWidgetPrivate
38
GtkWidget* play_button;
49
static guint signals[LAST_SIGNAL] = { 0 };
51
#define TRANSPORT_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRANSPORT_WIDGET_TYPE, TransportWidgetPrivate))
53
/* Gobject boiler plate */
54
static void transport_widget_class_init (TransportWidgetClass *klass);
55
static void transport_widget_init (TransportWidget *self);
56
static void transport_widget_dispose (GObject *object);
57
static void transport_widget_finalize (GObject *object);
59
/* UI and dbusmenu callbacks */
60
static gboolean transport_widget_button_press_event (GtkWidget *menuitem,
61
GdkEventButton *event);
62
static gboolean transport_widget_button_release_event (GtkWidget *menuitem,
63
GdkEventButton *event);
65
static void transport_widget_update_state(DbusmenuMenuitem* item,
70
static gchar* transport_widget_determine_play_label(const gchar* state);
72
G_DEFINE_TYPE (TransportWidget, transport_widget, GTK_TYPE_MENU_ITEM);
77
transport_widget_class_init (TransportWidgetClass *klass)
79
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
80
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
82
widget_class->button_press_event = transport_widget_button_press_event;
83
widget_class->button_release_event = transport_widget_button_release_event;
85
g_type_class_add_private (klass, sizeof (TransportWidgetPrivate));
87
gobject_class->dispose = transport_widget_dispose;
88
gobject_class->finalize = transport_widget_finalize;
90
signals[PLAY] = g_signal_new ("play",
91
G_OBJECT_CLASS_TYPE (gobject_class),
95
g_cclosure_marshal_VOID__VOID,
98
signals[PAUSE] = g_signal_new ("pause",
99
G_OBJECT_CLASS_TYPE (gobject_class),
103
g_cclosure_marshal_VOID__VOID,
107
signals[NEXT] = g_signal_new ("next",
108
G_OBJECT_CLASS_TYPE (gobject_class),
112
g_cclosure_marshal_VOID__VOID,
115
signals[PREVIOUS] = g_signal_new ("previous",
116
G_OBJECT_CLASS_TYPE (gobject_class),
120
g_cclosure_marshal_VOID__VOID,
125
transport_widget_init (TransportWidget *self)
127
g_debug("TransportWidget::transport_widget_init");
129
TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE(self);
132
hbox = gtk_hbox_new(TRUE, 2);
133
priv->play_button = gtk_button_new_with_label(">");
135
gtk_box_pack_start (GTK_BOX (hbox), priv->play_button, FALSE, TRUE, 0);
140
g_signal_connect(G_OBJECT(twin_item), "property-changed", G_CALLBACK(transport_widget_update_state), self);
142
gtk_container_add (GTK_CONTAINER (self), priv->hbox);
144
gtk_widget_show_all (priv->hbox);
148
transport_widget_dispose (GObject *object)
150
G_OBJECT_CLASS (transport_widget_parent_class)->dispose (object);
154
transport_widget_finalize (GObject *object)
156
G_OBJECT_CLASS (transport_widget_parent_class)->finalize (object);
161
transport_widget_button_press_event (GtkWidget *menuitem,
162
GdkEventButton *event)
164
g_debug("TransportWidget::menu_press_event");
165
TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE(TRANSPORT_WIDGET(menuitem));
166
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)))));
172
transport_widget_button_release_event (GtkWidget *menuitem,
173
GdkEventButton *event)
175
g_debug("TransportWidget::menu_release_event");
180
* transport_widget_update_state()
181
* Callback for updates from the other side of dbus
183
static void transport_widget_update_state(DbusmenuMenuitem* item, gchar* property,
184
GValue* value, gpointer userdata)
186
g_debug("transport_widget_update_state - with property %s", property);
187
gchar* input = g_strdup(g_value_get_string(value));
188
g_debug("transport_widget_update_state - with value %s", input);
190
TransportWidget* bar = (TransportWidget*)userdata;
191
TransportWidgetPrivate *priv = TRANSPORT_WIDGET_GET_PRIVATE(bar);
193
gtk_button_set_label(GTK_BUTTON(priv->play_button), g_strdup(transport_widget_determine_play_label(property)));
196
// will be needed for image swapping
197
static gchar* transport_widget_determine_play_label(const gchar* state)
200
if(g_strcmp0(state, ">") == 0){
208
* @returns: a new #TransportWidget.
211
transport_widget_new(DbusmenuMenuitem *item)
214
return g_object_new(TRANSPORT_WIDGET_TYPE, NULL);