[ekiga] Modified the connect button code very heavily



commit 16a1cd8e033f43258a7ece4dc5126008b3045c78
Author: Snark <jpuydt gnome org>
Date:   Sun Nov 7 14:23:14 2010 +0100

    Modified the connect button code very heavily
    
    It wasn't modern GObject code, and it was doing strange things with a
    button in a horizontal box instead of directly a button -- which means it
    had to transmit the "clicked" signal...

 lib/gui/gmconnectbutton.c |  254 +++++++++++++++++++++++----------------------
 lib/gui/gmconnectbutton.h |   61 ++++-------
 2 files changed, 151 insertions(+), 164 deletions(-)
---
diff --git a/lib/gui/gmconnectbutton.c b/lib/gui/gmconnectbutton.c
index bb2eafb..7d6fe70 100644
--- a/lib/gui/gmconnectbutton.c
+++ b/lib/gui/gmconnectbutton.c
@@ -30,191 +30,193 @@
  *                         connectbutton.c  -  description
  *                         -------------------------------
  *   begin                : Tue Nov 01 2005
- *   copyright            : (C) 2000-2006 by Damien Sandras 
- *   description          : Contains a connectbutton widget 
+ *   copyright            : (C) 2000-2006 by Damien Sandras
+ *   description          : Contains a connectbutton widget
  *
  */
 
 
 #include "gmconnectbutton.h"
 
-#include <string.h>
-
-/* Static functions and declarations */
-static void gm_connect_button_clicked_cb (GtkWidget *button,
-                                          gpointer data);
-
-static void gm_connect_button_class_init (GmConnectButtonClass *);
-
-static void gm_connect_button_init (GmConnectButton *);
-
-static void gm_connect_button_destroy (GtkObject *);
+struct _GmConnectButtonPrivate
+{
+  gchar* pickup;
+  gchar* hangup;
+  GtkIconSize stock_size;
+  gboolean connected;
+};
 
-static GtkHBoxClass *parent_class = NULL;
+enum
+{
+  PROP_0,
+  PROP_HANGUP,
+  PROP_PICKUP,
+  PROP_STOCKSIZE
+};
 
+G_DEFINE_TYPE (GmConnectButton, gm_connect_button, GTK_TYPE_BUTTON);
 
 static void
-gm_connect_button_clicked_cb (G_GNUC_UNUSED GtkWidget *button,
-                              gpointer data)
+gm_connect_button_get_property (GObject* object,
+				guint prop_id,
+				GValue* value,
+				GParamSpec* pspec)
 {
-  GmConnectButton *cb = NULL;
+  GmConnectButton* self = GM_CONNECT_BUTTON (object);
 
-  g_return_if_fail (data != NULL);
+  switch (prop_id) {
 
-  cb = GM_CONNECT_BUTTON (data);
+  case PROP_PICKUP:
+    g_value_set_string (value, self->priv->pickup);
+    break;
 
-  g_signal_emit_by_name (GM_CONNECT_BUTTON (data), "clicked", NULL);
-}
+  case PROP_HANGUP:
+    g_value_set_string (value, self->priv->hangup);
+    break;
 
+  case PROP_STOCKSIZE:
+    g_value_set_enum (value, self->priv->stock_size);
+    break;
+
+  default:
+    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    break;
+  }
+}
 
 static void
-gm_connect_button_class_init (GmConnectButtonClass *klass)
+gm_connect_button_set_property (GObject* object,
+				guint prop_id,
+				const GValue* value,
+				GParamSpec* pspec)
 {
-  static gboolean initialized = FALSE;
+  GmConnectButton* self = GM_CONNECT_BUTTON (object);
 
-  GObjectClass *object_class = NULL;
-  GtkObjectClass *gtkobject_class = NULL;
-  GmConnectButtonClass *connect_button_class = NULL;
+  switch (prop_id) {
 
-  gtkobject_class = GTK_OBJECT_CLASS (klass);
-  object_class = G_OBJECT_CLASS (klass);
-  parent_class = g_type_class_peek_parent (klass);
-  connect_button_class = GM_CONNECT_BUTTON_CLASS (klass);
+  case PROP_PICKUP:
+    g_free (self->priv->pickup);
+    self->priv->pickup = g_value_dup_string (value);
+    if ( !self->priv->connected) {
 
-  gtkobject_class->destroy = gm_connect_button_destroy;
+      GtkImage* image = GTK_IMAGE (gtk_button_get_image (GTK_BUTTON (self)));
+      gtk_image_set_from_stock (image, self->priv->pickup, self->priv->stock_size);
+    }
+    break;
 
-  if (!initialized) {
+  case PROP_HANGUP:
+    g_free (self->priv->hangup);
+    self->priv->hangup = g_value_dup_string (value);
+    if (self->priv->connected) {
 
-    klass->clicked_signal =
-      g_signal_new ("clicked",
-                    G_OBJECT_CLASS_TYPE (klass),
-                    G_SIGNAL_RUN_FIRST,
-                    0, NULL, NULL,
-                    g_cclosure_marshal_VOID__VOID,
-                    G_TYPE_NONE,
-                    0, NULL);
+      GtkImage* image = GTK_IMAGE (gtk_button_get_image (GTK_BUTTON (self)));
+      gtk_image_set_from_stock (image, self->priv->hangup, self->priv->stock_size);
+  }
+    break;
 
-    initialized = TRUE;
+  case PROP_STOCKSIZE:
+    self->priv->stock_size = g_value_get_enum (value);
+    break;
+
+  default:
+    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    break;
   }
 }
 
 static void
 gm_connect_button_init (GmConnectButton *cb)
 {
-  g_return_if_fail (cb != NULL);
-  g_return_if_fail (GM_IS_CONNECT_BUTTON (cb));
+  cb->priv = G_TYPE_INSTANCE_GET_PRIVATE (cb, GM_TYPE_CONNECT_BUTTON, GmConnectButtonPrivate);
 
-  cb->image = NULL;
-  cb->pickup = NULL;
-  cb->hangup = NULL;
-  cb->connected = FALSE;
+  cb->priv->pickup = NULL;
+  cb->priv->hangup = NULL;
+  cb->priv->connected = FALSE;
+
+  gtk_button_set_relief (GTK_BUTTON (cb), GTK_RELIEF_NONE);
 }
 
 
 static void
-gm_connect_button_destroy (GtkObject *object)
+gm_connect_button_finalize (GObject* object)
 {
-  GmConnectButton *cb = NULL;
-
-  g_return_if_fail (object != NULL);
-  g_return_if_fail (GM_IS_CONNECT_BUTTON (object));
+  GmConnectButton *cb = GM_CONNECT_BUTTON (object);
 
-  cb = GM_CONNECT_BUTTON (object);
-  
-  if (GTK_OBJECT_CLASS (parent_class)->destroy)
-    (*GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+  g_free (cb->priv->pickup);
+  g_free (cb->priv->hangup);
 
-  g_free (cb->pickup);
-  cb->pickup = NULL;
-  g_free (cb->hangup);
-  cb->hangup = NULL;
+  G_OBJECT_CLASS (gm_connect_button_parent_class)->finalize (object);
 }
 
-
-/* Global functions */
-GType
-gm_connect_button_get_type (void)
+static void
+gm_connect_button_class_init (GmConnectButtonClass *klass)
 {
-  static GType gm_connect_button_type = 0;
-  
-  if (gm_connect_button_type == 0)
-  {
-    static const GTypeInfo connect_button_info =
-    {
-      sizeof (GmConnectButtonClass),
-      NULL,
-      NULL,
-      (GClassInitFunc) gm_connect_button_class_init,
-      NULL,
-      NULL,
-      sizeof (GmConnectButton),
-      0,
-      (GInstanceInitFunc) gm_connect_button_init,
-      NULL
-    };
-    
-    gm_connect_button_type =
-      g_type_register_static (GTK_TYPE_HBOX,
-			      "GmConnectButton",
-			      &connect_button_info,
-			      (GTypeFlags) 0);
-  }
-  
-  return gm_connect_button_type;
+  GObjectClass* gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->finalize = gm_connect_button_finalize;
+  gobject_class->get_property = gm_connect_button_get_property;
+  gobject_class->set_property = gm_connect_button_set_property;
+
+  g_object_class_install_property (gobject_class, PROP_HANGUP,
+				   g_param_spec_string ("hangup", "Hangup", "Hangup",
+							NULL,
+							G_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class, PROP_PICKUP,
+				   g_param_spec_string ("pickup", "Pickup", "Pickup",
+							NULL,
+							G_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class, PROP_STOCKSIZE,
+				   g_param_spec_enum ("stock-size", "Stock size", "Stock size",
+						      GTK_TYPE_ICON_SIZE, GTK_ICON_SIZE_BUTTON,
+						      G_PARAM_READWRITE));
+
+  g_type_class_add_private (klass, sizeof (GmConnectButtonPrivate));
 }
 
 
-GtkWidget *
+/* public api */
+
+GtkWidget*
 gm_connect_button_new (const char *pickup,
 		       const char *hangup,
 		       GtkIconSize size)
 {
-  GmConnectButton *cb = NULL;
-  
-  GtkWidget *button = NULL;
-  
-  g_return_val_if_fail (pickup != NULL, NULL);
-  g_return_val_if_fail (hangup != NULL, NULL);
-  
-  cb = GM_CONNECT_BUTTON (g_object_new (GM_CONNECT_BUTTON_TYPE, NULL));
-  cb->pickup = g_strdup (pickup);
-  cb->hangup = g_strdup (hangup);
-  cb->stock_size = size;
-
-  button = gtk_button_new ();
-  gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
-  cb->image = gtk_image_new_from_stock (pickup, size); 
-  gtk_container_add (GTK_CONTAINER (button), cb->image);
-  g_signal_connect (button, "clicked", 
-                    G_CALLBACK (gm_connect_button_clicked_cb), cb);
-
-  gtk_box_pack_start (GTK_BOX (cb), button, FALSE, FALSE, 0);
-
-  gm_connect_button_set_connected (cb, FALSE);
-
-  return GTK_WIDGET (cb);
-}
+  gpointer result;
+  GtkWidget* image = NULL;
 
+  g_return_val_if_fail (pickup != NULL && hangup != NULL, NULL);
 
-void 
+  image = gtk_image_new_from_stock (GTK_STOCK_OK, GTK_ICON_SIZE_BUTTON);
+
+  result = g_object_new (GM_TYPE_CONNECT_BUTTON,
+			 "image", image,
+			 "stock-size", size,
+			 "hangup", hangup,
+			 "pickup", pickup,
+			 NULL);
+
+  return GTK_WIDGET (result);
+}
+
+void
 gm_connect_button_set_connected (GmConnectButton *cb,
 				 gboolean state)
 {
-  g_return_if_fail (cb != NULL);
+  GtkWidget* image = NULL;
+
   g_return_if_fail (GM_IS_CONNECT_BUTTON (cb));
 
-  cb->connected = state;
-  gtk_image_set_from_stock (GTK_IMAGE (cb->image), state ? cb->hangup : cb->pickup, cb->stock_size); 
+  cb->priv->connected = state;
+  image = gtk_button_get_image (GTK_BUTTON (cb));
+  gtk_image_set_from_stock (GTK_IMAGE (image), state ? cb->priv->hangup : cb->priv->pickup, cb->priv->stock_size);
 }
 
-
-gboolean 
+gboolean
 gm_connect_button_get_connected (GmConnectButton *cb)
 {
-  g_return_val_if_fail (cb != NULL, FALSE);
   g_return_val_if_fail (GM_IS_CONNECT_BUTTON (cb), FALSE);
 
-  return cb->connected;
+  return cb->priv->connected;
 }
-
-
diff --git a/lib/gui/gmconnectbutton.h b/lib/gui/gmconnectbutton.h
index 361425e..198a323 100644
--- a/lib/gui/gmconnectbutton.h
+++ b/lib/gui/gmconnectbutton.h
@@ -30,62 +30,36 @@
  *                         connectbutton.c  -  description
  *                         -------------------------------
  *   begin                : Tue Nov 01 2005
- *   copyright            : (C) 2000-2006 by Damien Sandras 
- *   description          : Contains a connectbutton widget 
+ *   copyright            : (C) 2000-2006 by Damien Sandras
+ *   description          : Contains a connectbutton widget
  *
  */
 
 
 
-#ifndef __GM_connect_button_H
-#define __GM_connect_button_H
+#ifndef __GM_CONNECT_BUTTON_H__
+#define __GM_CONNECT_BUTTON_H__
 
-#include <glib-object.h>
 #include <gtk/gtk.h>
 
-
 G_BEGIN_DECLS
 
-#define GM_CONNECT_BUTTON_TYPE (gm_connect_button_get_type ())
-#define GM_CONNECT_BUTTON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GM_CONNECT_BUTTON_TYPE, GmConnectButton))
-#define GM_CONNECT_BUTTON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GM_CONNECT_BUTTON_TYPE, GmConnectButtonClass))
-#define GM_IS_CONNECT_BUTTON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GM_CONNECT_BUTTON_TYPE))
-#define GM_IS_CONNECT_BUTTON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GM_CONNECT_BUTTON_TYPE))
-#define GM_CONNECT_BUTTON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GM_CONNECT_BUTTON_TYPE, GmConnectButtonClass))
-
-
-typedef struct GmConnectButtonPrivate GmConnectButtonPrivate;
-
+typedef struct _GmConnectButtonPrivate GmConnectButtonPrivate;
 
 typedef struct
 {
-  GtkHBox parent;
-  GtkWidget *image;
-
-  gchar *pickup;
-  gchar *hangup;
-  
-  GtkIconSize stock_size;
-  gboolean connected;
-  
+  GtkButton parent;
+
+  GmConnectButtonPrivate* priv;
+
 } GmConnectButton;
 
 
 typedef struct
 {
-  GtkHBoxClass parent_class;
-  guint clicked_signal;
-  
-} GmConnectButtonClass;
-
+  GtkButtonClass parent_class;
 
-/* The functions */
-
-/* DESCRIPTION  :  /
- * BEHAVIOR     :  Returns the GType for the GmConnectButton.
- * PRE          :  /
- */
-GType gm_connect_button_get_type (void);
+} GmConnectButtonClass;
 
 
 /* DESCRIPTION  :  /
@@ -111,6 +85,17 @@ void gm_connect_button_set_connected (GmConnectButton *,
  */
 gboolean gm_connect_button_get_connected (GmConnectButton *);
 
+/* GObject boilerplate */
+
+GType gm_connect_button_get_type ();
+
+#define GM_TYPE_CONNECT_BUTTON (gm_connect_button_get_type ())
+#define GM_CONNECT_BUTTON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GM_TYPE_CONNECT_BUTTON, GmConnectButton))
+#define GM_CONNECT_BUTTON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GM_TYPE_CONNECT_BUTTON, GmConnectButtonClass))
+#define GM_IS_CONNECT_BUTTON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GM_TYPE_CONNECT_BUTTON))
+#define GM_IS_CONNECT_BUTTON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GM_TYPE_CONNECT_BUTTON))
+#define GM_CONNECT_BUTTON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GM_TYPE_CONNECT_BUTTON, GmConnectButtonClass))
+
 G_END_DECLS
 
-#endif /* __GM_connect_button_H */
+#endif



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]