]> git.0d.be Git - empathy.git/blob - libempathy-gtk/empathy-dialpad-widget.c
Merge remote-tracking branch 'jonny/ft'
[empathy.git] / libempathy-gtk / empathy-dialpad-widget.c
1 /*
2  * Copyright (C) 2011 Collabora Ltd.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public
15  * License along with this program; if not, write to the
16  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
17  * Boston, MA  02110-1301  USA
18  *
19  * Authors: Danielle Madeley <danielle.madeley@collabora.co.uk>
20  */
21
22 #include <config.h>
23
24 #include <telepathy-glib/telepathy-glib.h>
25
26 #include "empathy-dialpad-widget.h"
27
28 G_DEFINE_TYPE (EmpathyDialpadWidget, empathy_dialpad_widget, GTK_TYPE_BOX);
29
30 enum /* signals */
31 {
32   START_TONE,
33   STOP_TONE,
34
35   NUM_SIGNALS
36 };
37
38 static guint signals[NUM_SIGNALS] = { 0, };
39
40 struct _EmpathyDialpadWidgetPrivate
41 {
42   GtkWidget *entry;
43 };
44
45 static void
46 empathy_dialpad_widget_class_init (EmpathyDialpadWidgetClass *klass)
47 {
48   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
49
50   signals[START_TONE] = g_signal_new ("start-tone",
51       G_TYPE_FROM_CLASS (klass),
52       G_SIGNAL_RUN_LAST,
53       0, NULL, NULL,
54       g_cclosure_marshal_generic,
55       G_TYPE_NONE,
56       1, G_TYPE_UINT);
57
58   signals[STOP_TONE] = g_signal_new ("stop-tone",
59       G_TYPE_FROM_CLASS (klass),
60       G_SIGNAL_RUN_LAST,
61       0, NULL, NULL,
62       g_cclosure_marshal_generic,
63       G_TYPE_NONE,
64       1, G_TYPE_UINT);
65
66   g_type_class_add_private (gobject_class,
67       sizeof (EmpathyDialpadWidgetPrivate));
68 }
69
70 static gboolean
71 dtmf_dialpad_button_pressed_cb (GtkWidget *button,
72     GdkEventButton *event,
73     EmpathyDialpadWidget *self)
74 {
75   GtkEntryBuffer *buffer = gtk_entry_get_buffer (GTK_ENTRY (self->priv->entry));
76   TpDTMFEvent tone = GPOINTER_TO_UINT (g_object_get_data (
77         G_OBJECT (button), "dtmf-value"));
78   const gchar *label = g_object_get_data (G_OBJECT (button), "string-value");
79
80   g_signal_emit (self, signals[START_TONE], 0, tone);
81
82   gtk_entry_buffer_insert_text (buffer, -1, label, -1);
83   gtk_editable_set_position (GTK_EDITABLE (self->priv->entry), -1);
84
85   return FALSE;
86 }
87
88 static gboolean
89 dtmf_dialpad_button_released_cb (GtkWidget *button,
90     GdkEventButton *event,
91     EmpathyDialpadWidget *self)
92 {
93   TpDTMFEvent tone = GPOINTER_TO_UINT (g_object_get_data (
94         G_OBJECT (button), "dtmf-value"));
95
96   g_signal_emit (self, signals[STOP_TONE], 0, tone);
97
98   return FALSE;
99 }
100
101 static void
102 empathy_dialpad_widget_init (EmpathyDialpadWidget *self)
103 {
104   GtkWidget *grid;
105   int i;
106
107   struct {
108     const gchar *label;
109     const gchar *sublabel;
110     TpDTMFEvent event;
111   } dtmfbuttons[] = { { "1", "",     TP_DTMF_EVENT_DIGIT_1 },
112                       { "2", "abc",  TP_DTMF_EVENT_DIGIT_2 },
113                       { "3", "def",  TP_DTMF_EVENT_DIGIT_3 },
114                       { "4", "ghi",  TP_DTMF_EVENT_DIGIT_4 },
115                       { "5", "jkl",  TP_DTMF_EVENT_DIGIT_5 },
116                       { "6", "mno",  TP_DTMF_EVENT_DIGIT_6 },
117                       { "7", "pqrs", TP_DTMF_EVENT_DIGIT_7 },
118                       { "8", "tuv",  TP_DTMF_EVENT_DIGIT_8 },
119                       { "9", "wxyz", TP_DTMF_EVENT_DIGIT_9 },
120                       { "#", "",     TP_DTMF_EVENT_HASH },
121                       { "0", "",     TP_DTMF_EVENT_DIGIT_0 },
122                       { "*", "",     TP_DTMF_EVENT_ASTERISK },
123                       { NULL, } };
124
125   self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, EMPATHY_TYPE_DIALPAD_WIDGET,
126       EmpathyDialpadWidgetPrivate);
127
128   gtk_orientable_set_orientation (GTK_ORIENTABLE (self),
129       GTK_ORIENTATION_VERTICAL);
130   gtk_box_set_spacing (GTK_BOX (self), 3);
131
132   self->priv->entry = gtk_entry_new ();
133   gtk_editable_set_editable (GTK_EDITABLE (self->priv->entry), FALSE);
134
135   gtk_box_pack_start (GTK_BOX (self), self->priv->entry, FALSE, FALSE, 3);
136
137   grid = gtk_grid_new ();
138   gtk_grid_set_column_homogeneous (GTK_GRID (grid), TRUE);
139   gtk_grid_set_row_homogeneous (GTK_GRID (grid), TRUE);
140
141   for (i = 0; dtmfbuttons[i].label != NULL; i++)
142     {
143       GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
144       GtkWidget *button = gtk_button_new ();
145       GtkWidget *label;
146       gchar *str;
147
148       gtk_container_add (GTK_CONTAINER (button), vbox);
149
150       /* main label */
151       label = gtk_label_new ("");
152       str = g_strdup_printf ("<span size='x-large'>%s</span>",
153           dtmfbuttons[i].label);
154       gtk_label_set_markup (GTK_LABEL (label), str);
155       g_free (str);
156
157       gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 3);
158
159       /* sub label */
160       label = gtk_label_new ("");
161       str = g_strdup_printf (
162           "<span foreground='#555555'>%s</span>",
163           dtmfbuttons[i].sublabel);
164       gtk_label_set_markup (GTK_LABEL (label), str);
165       g_free (str);
166
167       gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
168
169       gtk_grid_attach (GTK_GRID (grid), button, i % 3, i / 3,
170           1, 1);
171
172       g_object_set_data (G_OBJECT (button), "dtmf-value",
173         GUINT_TO_POINTER (dtmfbuttons[i].event));
174       g_object_set_data (G_OBJECT (button), "string-value",
175           (gpointer) dtmfbuttons[i].label);
176
177       g_signal_connect (G_OBJECT (button), "button-press-event",
178         G_CALLBACK (dtmf_dialpad_button_pressed_cb), self);
179       g_signal_connect (G_OBJECT (button), "button-release-event",
180         G_CALLBACK (dtmf_dialpad_button_released_cb), self);
181     }
182
183   gtk_box_pack_start (GTK_BOX (self), grid, FALSE, FALSE, 3);
184
185   /* show everything but the packing box */
186   gtk_widget_show_all (GTK_WIDGET (self));
187   gtk_widget_hide (GTK_WIDGET (self));
188 }
189
190 GtkWidget *
191 empathy_dialpad_widget_new (void)
192 {
193   return g_object_new (EMPATHY_TYPE_DIALPAD_WIDGET, NULL);
194 }