~ted/indicator-sound/greeter-control

« back to all changes in this revision

Viewing changes to src/transport-widget.c

  • Committer: Conor Curran
  • Date: 2010-06-15 13:03:50 UTC
  • mfrom: (80.1.19 trunk.0.1)
  • Revision ID: conor.curran@canonical.com-20100615130350-6r8k5yu9vbarrfxr
merge with the custom controls branch

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
Copyright 2010 Canonical Ltd.
 
3
 
 
4
Authors:
 
5
    Conor Curran <conor.curran@canonical.com>
 
6
 
 
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.
 
10
 
 
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.
 
15
 
 
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/>.
 
18
*/
 
19
 
 
20
#ifdef HAVE_CONFIG_H
 
21
#include "config.h"
 
22
#endif
 
23
 
 
24
#include <glib/gi18n.h>
 
25
#include "transport-widget.h"
 
26
#include "common-defs.h"
 
27
#include <gtk/gtk.h>
 
28
 
 
29
// TODO: think about leakage: ted !
 
30
 
 
31
static DbusmenuMenuitem* twin_item;
 
32
 
 
33
typedef struct _TransportWidgetPrivate TransportWidgetPrivate;
 
34
 
 
35
struct _TransportWidgetPrivate
 
36
{
 
37
        GtkWidget* hbox;
 
38
        GtkWidget* play_button;
 
39
};
 
40
 
 
41
enum {
 
42
  PLAY,
 
43
        PAUSE,
 
44
  NEXT,
 
45
        PREVIOUS,
 
46
  LAST_SIGNAL
 
47
};
 
48
 
 
49
static guint signals[LAST_SIGNAL] = { 0 };
 
50
 
 
51
#define TRANSPORT_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRANSPORT_WIDGET_TYPE, TransportWidgetPrivate))
 
52
 
 
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);
 
58
 
 
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);
 
64
 
 
65
static void transport_widget_update_state(DbusmenuMenuitem* item,
 
66
                                       gchar * property, 
 
67
                                       GValue * value,
 
68
                                       gpointer userdata);
 
69
// utility methods
 
70
static gchar* transport_widget_determine_play_label(const gchar* state);
 
71
 
 
72
G_DEFINE_TYPE (TransportWidget, transport_widget, GTK_TYPE_MENU_ITEM);
 
73
 
 
74
 
 
75
 
 
76
static void
 
77
transport_widget_class_init (TransportWidgetClass *klass)
 
78
{
 
79
        GObjectClass                    *gobject_class = G_OBJECT_CLASS (klass);
 
80
  GtkWidgetClass    *widget_class = GTK_WIDGET_CLASS (klass);
 
81
 
 
82
  widget_class->button_press_event = transport_widget_button_press_event;
 
83
  widget_class->button_release_event = transport_widget_button_release_event;
 
84
        
 
85
        g_type_class_add_private (klass, sizeof (TransportWidgetPrivate));
 
86
 
 
87
        gobject_class->dispose = transport_widget_dispose;
 
88
        gobject_class->finalize = transport_widget_finalize;
 
89
 
 
90
  signals[PLAY] = g_signal_new ("play",
 
91
                               G_OBJECT_CLASS_TYPE (gobject_class),
 
92
                               G_SIGNAL_RUN_FIRST,
 
93
                               0,
 
94
                               NULL, NULL,
 
95
                               g_cclosure_marshal_VOID__VOID,
 
96
                               G_TYPE_NONE, 0);
 
97
 
 
98
  signals[PAUSE] = g_signal_new ("pause",
 
99
                               G_OBJECT_CLASS_TYPE (gobject_class),
 
100
                               G_SIGNAL_RUN_FIRST,
 
101
                               0,
 
102
                               NULL, NULL,
 
103
                               g_cclosure_marshal_VOID__VOID,
 
104
                               G_TYPE_NONE, 0);
 
105
 
 
106
 
 
107
        signals[NEXT] = g_signal_new ("next",
 
108
                               G_OBJECT_CLASS_TYPE (gobject_class),
 
109
                               G_SIGNAL_RUN_FIRST,
 
110
                               0,
 
111
                               NULL, NULL,
 
112
                               g_cclosure_marshal_VOID__VOID,
 
113
                               G_TYPE_NONE, 0);
 
114
 
 
115
  signals[PREVIOUS] = g_signal_new ("previous",
 
116
                               G_OBJECT_CLASS_TYPE (gobject_class),
 
117
                               G_SIGNAL_RUN_FIRST,
 
118
                               0,
 
119
                               NULL, NULL,
 
120
                               g_cclosure_marshal_VOID__VOID,
 
121
                               G_TYPE_NONE, 0); 
 
122
}
 
123
 
 
124
static void
 
125
transport_widget_init (TransportWidget *self)
 
126
{
 
127
        g_debug("TransportWidget::transport_widget_init");
 
128
 
 
129
        TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE(self);
 
130
        GtkWidget *hbox;
 
131
 
 
132
        hbox = gtk_hbox_new(TRUE, 2);
 
133
        priv->play_button =     gtk_button_new_with_label(">");
 
134
 
 
135
        gtk_box_pack_start (GTK_BOX (hbox), priv->play_button, FALSE, TRUE, 0);
 
136
 
 
137
 
 
138
        priv->hbox = hbox;
 
139
        
 
140
        g_signal_connect(G_OBJECT(twin_item), "property-changed", G_CALLBACK(transport_widget_update_state), self);
 
141
 
 
142
        gtk_container_add (GTK_CONTAINER (self), priv->hbox);
 
143
 
 
144
  gtk_widget_show_all (priv->hbox);
 
145
}
 
146
 
 
147
static void
 
148
transport_widget_dispose (GObject *object)
 
149
{
 
150
        G_OBJECT_CLASS (transport_widget_parent_class)->dispose (object);
 
151
}
 
152
 
 
153
static void
 
154
transport_widget_finalize (GObject *object)
 
155
{
 
156
        G_OBJECT_CLASS (transport_widget_parent_class)->finalize (object);
 
157
}
 
158
 
 
159
/* keyevents */
 
160
static gboolean
 
161
transport_widget_button_press_event (GtkWidget *menuitem, 
 
162
                                        GdkEventButton *event)
 
163
{
 
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)))));
 
167
        
 
168
        return TRUE;
 
169
}
 
170
 
 
171
static gboolean
 
172
transport_widget_button_release_event (GtkWidget *menuitem, 
 
173
                                  GdkEventButton *event)
 
174
{
 
175
        g_debug("TransportWidget::menu_release_event");
 
176
        return TRUE;
 
177
}
 
178
 
 
179
/**
 
180
* transport_widget_update_state()
 
181
* Callback for updates from the other side of dbus
 
182
**/
 
183
static void transport_widget_update_state(DbusmenuMenuitem* item, gchar* property, 
 
184
                                       GValue* value, gpointer userdata)
 
185
{
 
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);  
 
189
 
 
190
        TransportWidget* bar = (TransportWidget*)userdata;
 
191
        TransportWidgetPrivate *priv = TRANSPORT_WIDGET_GET_PRIVATE(bar);
 
192
        
 
193
        gtk_button_set_label(GTK_BUTTON(priv->play_button), g_strdup(transport_widget_determine_play_label(property)));
 
194
}
 
195
 
 
196
// will be needed for image swapping
 
197
static gchar* transport_widget_determine_play_label(const gchar* state)
 
198
{
 
199
        gchar* label = ">";
 
200
        if(g_strcmp0(state, ">") == 0){
 
201
                label = "||";
 
202
        }
 
203
        return label;
 
204
}
 
205
 
 
206
 /**
 
207
 * transport_new:
 
208
 * @returns: a new #TransportWidget.
 
209
 **/
 
210
GtkWidget* 
 
211
transport_widget_new(DbusmenuMenuitem *item)
 
212
{
 
213
        twin_item = item;
 
214
        return g_object_new(TRANSPORT_WIDGET_TYPE, NULL);
 
215
}
 
216