* Authors: Danielle Madeley <danielle.madeley@collabora.co.uk>
*/
-#include <config.h>
-
-#include <telepathy-glib/telepathy-glib.h>
-
+#include "config.h"
#include "empathy-dialpad-widget.h"
+#include "empathy-dialpad-button.h"
+
G_DEFINE_TYPE (EmpathyDialpadWidget, empathy_dialpad_widget, GTK_TYPE_BOX);
enum /* signals */
struct _EmpathyDialpadWidgetPrivate
{
GtkWidget *entry;
+
+ /* gchar representing the button (like '7') -> GtkButton */
+ GHashTable *buttons;
};
+static void
+empathy_dialpad_widget_dispose (GObject *object)
+{
+ EmpathyDialpadWidget *self = EMPATHY_DIALPAD_WIDGET (object);
+ void (*chain_up) (GObject *) =
+ ((GObjectClass *) empathy_dialpad_widget_parent_class)->dispose;
+
+ g_hash_table_unref (self->priv->buttons);
+
+ if (chain_up != NULL)
+ chain_up (object);
+}
+
static void
empathy_dialpad_widget_class_init (EmpathyDialpadWidgetClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ gobject_class->dispose = empathy_dialpad_widget_dispose;
+
signals[START_TONE] = g_signal_new ("start-tone",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
}
static gboolean
-dtmf_dialpad_button_pressed_cb (GtkWidget *button,
+dtmf_dialpad_button_pressed_cb (EmpathyDialpadButton *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");
+ TpDTMFEvent tone;
+ const gchar *label;
+
+ tone = empathy_dialpad_button_get_event (button);
+ label = empathy_dialpad_button_get_label (button);
g_signal_emit (self, signals[START_TONE], 0, tone);
}
static gboolean
-dtmf_dialpad_button_released_cb (GtkWidget *button,
+dtmf_dialpad_button_released_cb (EmpathyDialpadButton *button,
GdkEventButton *event,
EmpathyDialpadWidget *self)
{
- TpDTMFEvent tone = GPOINTER_TO_UINT (g_object_get_data (
- G_OBJECT (button), "dtmf-value"));
+ TpDTMFEvent tone;
+
+ tone = empathy_dialpad_button_get_event (button);
g_signal_emit (self, signals[STOP_TONE], 0, tone);
static void
empathy_dialpad_widget_init (EmpathyDialpadWidget *self)
{
- GtkWidget *table;
+ GtkWidget *grid;
int i;
struct {
gtk_box_pack_start (GTK_BOX (self), self->priv->entry, FALSE, FALSE, 3);
- table = gtk_table_new (4, 3, TRUE);
+ grid = gtk_grid_new ();
+ gtk_grid_set_column_homogeneous (GTK_GRID (grid), TRUE);
+ gtk_grid_set_row_homogeneous (GTK_GRID (grid), TRUE);
+
+ self->priv->buttons = g_hash_table_new (NULL, NULL);
for (i = 0; dtmfbuttons[i].label != NULL; i++)
{
- GtkWidget *vbox = gtk_vbox_new (FALSE, 0);
- GtkWidget *button = gtk_button_new ();
- GtkWidget *label;
- gchar *str;
+ GtkWidget *button;
- gtk_container_add (GTK_CONTAINER (button), vbox);
+ button = empathy_dialpad_button_new (dtmfbuttons[i].label,
+ dtmfbuttons[i].sublabel, dtmfbuttons[i].event);
- /* 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);
+ gtk_grid_attach (GTK_GRID (grid), button, i % 3, i / 3,
+ 1, 1);
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);
+
+ g_hash_table_insert (self->priv->buttons,
+ GUINT_TO_POINTER (dtmfbuttons[i].label[0]), button);
}
- gtk_box_pack_start (GTK_BOX (self), table, FALSE, FALSE, 3);
+ gtk_box_pack_start (GTK_BOX (self), grid, FALSE, FALSE, 3);
+
+ /* show everything but the packing box */
+ gtk_widget_show_all (GTK_WIDGET (self));
+ gtk_widget_hide (GTK_WIDGET (self));
}
GtkWidget *
{
return g_object_new (EMPATHY_TYPE_DIALPAD_WIDGET, NULL);
}
+
+void
+empathy_dialpad_widget_press_key (EmpathyDialpadWidget *self,
+ gchar key)
+{
+ EmpathyDialpadButton *button;
+
+ button = g_hash_table_lookup (self->priv->buttons, GUINT_TO_POINTER (key));
+
+ if (button == NULL)
+ return;
+
+ /* gtk_widget_activate() just does the button-pressed animation, it doesn't
+ * fire the callbacks so we do it manually. */
+ dtmf_dialpad_button_pressed_cb (button, NULL, self);
+ gtk_widget_activate (GTK_WIDGET (button));
+ dtmf_dialpad_button_released_cb (button, NULL, self);
+}