2 * Copyright (C) 2011 Collabora Ltd.
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.
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.
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
19 * Authors: Danielle Madeley <danielle.madeley@collabora.co.uk>
24 #include <telepathy-glib/telepathy-glib.h>
26 #include "empathy-dialpad-widget.h"
28 G_DEFINE_TYPE (EmpathyDialpadWidget, empathy_dialpad_widget, GTK_TYPE_BOX);
38 static guint signals[NUM_SIGNALS] = { 0, };
40 struct _EmpathyDialpadWidgetPrivate
44 /* gchar representing the button (like '7') -> GtkButton */
49 empathy_dialpad_widget_dispose (GObject *object)
51 EmpathyDialpadWidget *self = EMPATHY_DIALPAD_WIDGET (object);
52 void (*chain_up) (GObject *) =
53 ((GObjectClass *) empathy_dialpad_widget_parent_class)->dispose;
55 g_hash_table_unref (self->priv->buttons);
62 empathy_dialpad_widget_class_init (EmpathyDialpadWidgetClass *klass)
64 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
66 gobject_class->dispose = empathy_dialpad_widget_dispose;
68 signals[START_TONE] = g_signal_new ("start-tone",
69 G_TYPE_FROM_CLASS (klass),
72 g_cclosure_marshal_generic,
76 signals[STOP_TONE] = g_signal_new ("stop-tone",
77 G_TYPE_FROM_CLASS (klass),
80 g_cclosure_marshal_generic,
84 g_type_class_add_private (gobject_class,
85 sizeof (EmpathyDialpadWidgetPrivate));
89 dtmf_dialpad_button_pressed_cb (GtkWidget *button,
90 GdkEventButton *event,
91 EmpathyDialpadWidget *self)
93 GtkEntryBuffer *buffer = gtk_entry_get_buffer (GTK_ENTRY (self->priv->entry));
94 TpDTMFEvent tone = GPOINTER_TO_UINT (g_object_get_data (
95 G_OBJECT (button), "dtmf-value"));
96 const gchar *label = g_object_get_data (G_OBJECT (button), "string-value");
98 g_signal_emit (self, signals[START_TONE], 0, tone);
100 gtk_entry_buffer_insert_text (buffer, -1, label, -1);
101 gtk_editable_set_position (GTK_EDITABLE (self->priv->entry), -1);
107 dtmf_dialpad_button_released_cb (GtkWidget *button,
108 GdkEventButton *event,
109 EmpathyDialpadWidget *self)
111 TpDTMFEvent tone = GPOINTER_TO_UINT (g_object_get_data (
112 G_OBJECT (button), "dtmf-value"));
114 g_signal_emit (self, signals[STOP_TONE], 0, tone);
120 empathy_dialpad_widget_init (EmpathyDialpadWidget *self)
127 const gchar *sublabel;
129 } dtmfbuttons[] = { { "1", "", TP_DTMF_EVENT_DIGIT_1 },
130 { "2", "abc", TP_DTMF_EVENT_DIGIT_2 },
131 { "3", "def", TP_DTMF_EVENT_DIGIT_3 },
132 { "4", "ghi", TP_DTMF_EVENT_DIGIT_4 },
133 { "5", "jkl", TP_DTMF_EVENT_DIGIT_5 },
134 { "6", "mno", TP_DTMF_EVENT_DIGIT_6 },
135 { "7", "pqrs", TP_DTMF_EVENT_DIGIT_7 },
136 { "8", "tuv", TP_DTMF_EVENT_DIGIT_8 },
137 { "9", "wxyz", TP_DTMF_EVENT_DIGIT_9 },
138 { "#", "", TP_DTMF_EVENT_HASH },
139 { "0", "", TP_DTMF_EVENT_DIGIT_0 },
140 { "*", "", TP_DTMF_EVENT_ASTERISK },
143 self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, EMPATHY_TYPE_DIALPAD_WIDGET,
144 EmpathyDialpadWidgetPrivate);
146 gtk_orientable_set_orientation (GTK_ORIENTABLE (self),
147 GTK_ORIENTATION_VERTICAL);
148 gtk_box_set_spacing (GTK_BOX (self), 3);
150 self->priv->entry = gtk_entry_new ();
151 gtk_editable_set_editable (GTK_EDITABLE (self->priv->entry), FALSE);
153 gtk_box_pack_start (GTK_BOX (self), self->priv->entry, FALSE, FALSE, 3);
155 grid = gtk_grid_new ();
156 gtk_grid_set_column_homogeneous (GTK_GRID (grid), TRUE);
157 gtk_grid_set_row_homogeneous (GTK_GRID (grid), TRUE);
159 self->priv->buttons = g_hash_table_new (NULL, NULL);
161 for (i = 0; dtmfbuttons[i].label != NULL; i++)
163 GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
164 GtkWidget *button = gtk_button_new ();
168 gtk_container_add (GTK_CONTAINER (button), vbox);
171 label = gtk_label_new ("");
172 str = g_strdup_printf ("<span size='x-large'>%s</span>",
173 dtmfbuttons[i].label);
174 gtk_label_set_markup (GTK_LABEL (label), str);
177 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 3);
180 label = gtk_label_new ("");
181 str = g_strdup_printf (
182 "<span foreground='#555555'>%s</span>",
183 dtmfbuttons[i].sublabel);
184 gtk_label_set_markup (GTK_LABEL (label), str);
187 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
189 gtk_grid_attach (GTK_GRID (grid), button, i % 3, i / 3,
192 g_object_set_data (G_OBJECT (button), "dtmf-value",
193 GUINT_TO_POINTER (dtmfbuttons[i].event));
194 g_object_set_data (G_OBJECT (button), "string-value",
195 (gpointer) dtmfbuttons[i].label);
197 g_signal_connect (G_OBJECT (button), "button-press-event",
198 G_CALLBACK (dtmf_dialpad_button_pressed_cb), self);
199 g_signal_connect (G_OBJECT (button), "button-release-event",
200 G_CALLBACK (dtmf_dialpad_button_released_cb), self);
202 g_hash_table_insert (self->priv->buttons,
203 GUINT_TO_POINTER (dtmfbuttons[i].label[0]), button);
206 gtk_box_pack_start (GTK_BOX (self), grid, FALSE, FALSE, 3);
208 /* show everything but the packing box */
209 gtk_widget_show_all (GTK_WIDGET (self));
210 gtk_widget_hide (GTK_WIDGET (self));
214 empathy_dialpad_widget_new (void)
216 return g_object_new (EMPATHY_TYPE_DIALPAD_WIDGET, NULL);