]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-dialpad-widget.c
GNOME Goal: Update icon names
[empathy.git] / libempathy-gtk / empathy-dialpad-widget.c
index da1eb91927bc3e91ece0c3a4c01043caa7ce9ebb..6c85c7971e6eb58016185afec364a6a844921864 100644 (file)
  * 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 */
@@ -40,13 +39,31 @@ static guint signals[NUM_SIGNALS] = { 0, };
 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,
@@ -68,14 +85,16 @@ empathy_dialpad_widget_class_init (EmpathyDialpadWidgetClass *klass)
 }
 
 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);
 
@@ -86,12 +105,13 @@ dtmf_dialpad_button_pressed_cb (GtkWidget *button,
 }
 
 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);
 
@@ -101,7 +121,7 @@ dtmf_dialpad_button_released_cb (GtkWidget *button,
 static void
 empathy_dialpad_widget_init (EmpathyDialpadWidget *self)
 {
-  GtkWidget *table;
+  GtkWidget *grid;
   int i;
 
   struct {
@@ -134,51 +154,36 @@ empathy_dialpad_widget_init (EmpathyDialpadWidget *self)
 
   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 *
@@ -186,3 +191,21 @@ empathy_dialpad_widget_new (void)
 {
   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);
+}