aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy-gtk/empathy-dialpad-widget.c
diff options
context:
space:
mode:
Diffstat (limited to 'libempathy-gtk/empathy-dialpad-widget.c')
-rw-r--r--libempathy-gtk/empathy-dialpad-widget.c187
1 files changed, 187 insertions, 0 deletions
diff --git a/libempathy-gtk/empathy-dialpad-widget.c b/libempathy-gtk/empathy-dialpad-widget.c
new file mode 100644
index 000000000..fd93b834e
--- /dev/null
+++ b/libempathy-gtk/empathy-dialpad-widget.c
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2011 Collabora Ltd.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY 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, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
+ * Authors: Danielle Madeley <danielle.madeley@collabora.co.uk>
+ */
+
+#include <config.h>
+
+#include <telepathy-glib/telepathy-glib.h>
+
+#include "empathy-dialpad-widget.h"
+
+G_DEFINE_TYPE (EmpathyDialpadWidget, empathy_dialpad_widget, GTK_TYPE_BOX);
+
+enum /* signals */
+{
+ START_TONE,
+ STOP_TONE,
+
+ NUM_SIGNALS
+};
+
+static guint signals[NUM_SIGNALS] = { 0, };
+
+struct _EmpathyDialpadWidgetPrivate
+{
+ GtkWidget *entry;
+};
+
+static void
+empathy_dialpad_widget_class_init (EmpathyDialpadWidgetClass *klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ signals[START_TONE] = g_signal_new ("start-tone",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ 0, NULL, NULL,
+ g_cclosure_marshal_generic,
+ G_TYPE_NONE,
+ 1, G_TYPE_UINT);
+
+ signals[STOP_TONE] = g_signal_new ("stop-tone",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ 0, NULL, NULL,
+ g_cclosure_marshal_generic,
+ G_TYPE_NONE,
+ 1, G_TYPE_UINT);
+
+ g_type_class_add_private (gobject_class,
+ sizeof (EmpathyDialpadWidgetPrivate));
+}
+
+static gboolean
+dtmf_dialpad_button_pressed_cb (GtkWidget *button,
+ GdkEventButton *event,
+ EmpathyDialpadWidget *self)
+{
+ GtkEntryBuffer *buffer = gtk_entry_get_buffer (GTK_ENTRY (self->priv->entry));
+ TpDTMFEvent tone = GPOINTER_TO_UINT (g_object_get_data (
+ G_OBJECT (button), "dtmf-value"));
+ const gchar *label = g_object_get_data (G_OBJECT (button), "string-value");
+
+ g_signal_emit (self, signals[START_TONE], 0, tone);
+
+ gtk_entry_buffer_insert_text (buffer, -1, label, -1);
+
+ return FALSE;
+}
+
+static gboolean
+dtmf_dialpad_button_released_cb (GtkWidget *button,
+ GdkEventButton *event,
+ EmpathyDialpadWidget *self)
+{
+ TpDTMFEvent tone = GPOINTER_TO_UINT (g_object_get_data (
+ G_OBJECT (button), "dtmf-value"));
+
+ g_signal_emit (self, signals[STOP_TONE], 0, tone);
+
+ return FALSE;
+}
+
+static void
+empathy_dialpad_widget_init (EmpathyDialpadWidget *self)
+{
+ GtkWidget *table;
+ int i;
+
+ struct {
+ const gchar *label;
+ const gchar *sublabel;
+ TpDTMFEvent event;
+ } dtmfbuttons[] = { { "1", "", TP_DTMF_EVENT_DIGIT_1 },
+ { "2", "abc", TP_DTMF_EVENT_DIGIT_2 },
+ { "3", "def", TP_DTMF_EVENT_DIGIT_3 },
+ { "4", "ghi", TP_DTMF_EVENT_DIGIT_4 },
+ { "5", "jkl", TP_DTMF_EVENT_DIGIT_5 },
+ { "6", "mno", TP_DTMF_EVENT_DIGIT_6 },
+ { "7", "pqrs", TP_DTMF_EVENT_DIGIT_7 },
+ { "8", "tuv", TP_DTMF_EVENT_DIGIT_8 },
+ { "9", "wxyz", TP_DTMF_EVENT_DIGIT_9 },
+ { "#", "", TP_DTMF_EVENT_HASH },
+ { "0", "", TP_DTMF_EVENT_DIGIT_0 },
+ { "*", "", TP_DTMF_EVENT_ASTERISK },
+ { NULL, } };
+
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, EMPATHY_TYPE_DIALPAD_WIDGET,
+ EmpathyDialpadWidgetPrivate);
+
+ gtk_orientable_set_orientation (GTK_ORIENTABLE (self),
+ GTK_ORIENTATION_VERTICAL);
+ gtk_box_set_spacing (GTK_BOX (self), 3);
+
+ self->priv->entry = gtk_entry_new ();
+ gtk_editable_set_editable (GTK_EDITABLE (self->priv->entry), FALSE);
+
+ gtk_box_pack_start (GTK_BOX (self), self->priv->entry, FALSE, FALSE, 3);
+
+ table = gtk_table_new (4, 3, TRUE);
+
+ for (i = 0; dtmfbuttons[i].label != NULL; i++)
+ {
+ GtkWidget *vbox = gtk_vbox_new (FALSE, 0);
+ GtkWidget *button = gtk_button_new ();
+ GtkWidget *label;
+ gchar *str;
+
+ gtk_container_add (GTK_CONTAINER (button), vbox);
+
+ /* main label */
+ label = gtk_label_new ("");
+ str = g_strdup_printf ("<span size='x-large'>%s</span>",
+ dtmfbuttons[i].label);
+ gtk_label_set_markup (GTK_LABEL (label), str);
+ g_free (str);
+
+ gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 3);
+
+ /* sub label */
+ label = gtk_label_new ("");
+ str = g_strdup_printf (
+ "<span foreground='#555555'>%s</span>",
+ dtmfbuttons[i].sublabel);
+ gtk_label_set_markup (GTK_LABEL (label), str);
+ g_free (str);
+
+ gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
+
+ gtk_table_attach (GTK_TABLE (table), button, i % 3, i % 3 + 1,
+ i / 3, i / 3 + 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 1, 1);
+
+ g_object_set_data (G_OBJECT (button), "dtmf-value",
+ GUINT_TO_POINTER (dtmfbuttons[i].event));
+ g_object_set_data (G_OBJECT (button), "string-value",
+ (gpointer) dtmfbuttons[i].label);
+
+ g_signal_connect (G_OBJECT (button), "button-press-event",
+ G_CALLBACK (dtmf_dialpad_button_pressed_cb), self);
+ g_signal_connect (G_OBJECT (button), "button-release-event",
+ G_CALLBACK (dtmf_dialpad_button_released_cb), self);
+ }
+
+ gtk_box_pack_start (GTK_BOX (self), table, FALSE, FALSE, 3);
+}
+
+GtkWidget *
+empathy_dialpad_widget_new (void)
+{
+ return g_object_new (EMPATHY_TYPE_DIALPAD_WIDGET, NULL);
+}