[balsa] Re-implement BalsaCiteBar as a GTK_NO_WINDOW widget



commit 29becb3520e971637a16c66075f62336fe493ac8
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Thu Oct 15 21:05:59 2009 -0400

    Re-implement BalsaCiteBar as a GTK_NO_WINDOW widget

 ChangeLog            |    9 +++
 src/balsa-cite-bar.c |  189 +++++++++++++++-----------------------------------
 src/balsa-cite-bar.h |   20 -----
 3 files changed, 66 insertions(+), 152 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index ccf2241..8ad52e0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 2009-10-15  Peter Bloomfield
 
+	Re-implement BalsaCiteBar as a GTK_NO_WINDOW widget
+
+	* src/balsa-cite-bar.h: make BalsaCiteBar opaque.
+	* src/balsa-cite-bar.c (balsa_cite_bar_class_init),
+	(balsa_cite_bar_init), (balsa_cite_bar_resize),
+	(balsa_cite_bar_size_request), (balsa_cite_bar_expose):
+
+2009-10-15  Peter Bloomfield
+
 	Use gtk_window_present instead of gdk_window_raise
 
 	* libbalsa/identity.c (libbalsa_identity_select_dialog):
diff --git a/src/balsa-cite-bar.c b/src/balsa-cite-bar.c
index 173a19e..7401784 100644
--- a/src/balsa-cite-bar.c
+++ b/src/balsa-cite-bar.c
@@ -19,77 +19,57 @@
  * 02111-1307, USA.
  */
 
-#include <string.h>
-#include <gdk/gdk.h>
-#include <gtk/gtk.h>
 #include "balsa-cite-bar.h"
 
+struct _BalsaCiteBar {
+    GtkWidget widget;
 
-static void balsa_cite_bar_class_init(BalsaCiteBarClass *class);
-static void balsa_cite_bar_init(BalsaCiteBar *cite_bar);
-static void balsa_cite_bar_destroy(GtkObject *object);
-static void balsa_cite_bar_realise(GtkWidget *widget);
-static void balsa_cite_bar_size_request(GtkWidget *widget, GtkRequisition *requisition);
-static void balsa_cite_bar_size_allocate(GtkWidget *widget, GtkAllocation *allocation);
-static gboolean balsa_cite_bar_expose(GtkWidget *widget, GdkEventExpose *event);
+    /* Dimensions of each citation bar */
+    gint width;
+    gint height;
 
+    /* bar count and spacing */
+    gint bars;
+    gint space;
+};
 
-static GtkWidgetClass *parent_class = NULL;
+struct _BalsaCiteBarClass {
+    GtkWidgetClass parent_class;
+};
 
+static void balsa_cite_bar_size_request(GtkWidget      * widget,
+                                        GtkRequisition * requisition);
+static gboolean balsa_cite_bar_expose  (GtkWidget      * widget,
+                                        GdkEventExpose * event);
 
-GType
-balsa_cite_bar_get_type(void)
-{
-    static GType cite_bar_type = 0;
-    
-    if (!cite_bar_type) {
-	static const GTypeInfo cite_bar_info = {
-	    sizeof(BalsaCiteBarClass),
-	    NULL,           /* base_init */
-	    NULL,
-	    (GClassInitFunc) balsa_cite_bar_class_init,
-	    NULL,           /* class_finalize */
-	    NULL,           /* class_init */
-	    sizeof (BalsaCiteBar),
-	    0,              /* n_preallocs */
-	    (GInstanceInitFunc) balsa_cite_bar_init,
-	    NULL,           /* value_table */
-	};
-	cite_bar_type =
-	    g_type_register_static(GTK_TYPE_WIDGET, "BalsaCiteBar",
-				   &cite_bar_info, 0);
-    }
+G_DEFINE_TYPE(BalsaCiteBar, balsa_cite_bar, GTK_TYPE_WIDGET)
 
-    return cite_bar_type;
-}
+static GtkWidgetClass *parent_class = NULL;
 
 static void
-balsa_cite_bar_class_init(BalsaCiteBarClass *class)
+balsa_cite_bar_class_init(BalsaCiteBarClass * class)
 {
-    GtkObjectClass *object_class;
     GtkWidgetClass *widget_class;
 
-    object_class = (GtkObjectClass*) class;
-    widget_class = (GtkWidgetClass*) class;
+    widget_class = (GtkWidgetClass *) class;
 
     parent_class = g_type_class_peek_parent(class);
 
-    object_class->destroy = balsa_cite_bar_destroy;
-
-    widget_class->realize = balsa_cite_bar_realise;
     widget_class->expose_event = balsa_cite_bar_expose;
     widget_class->size_request = balsa_cite_bar_size_request;
-    widget_class->size_allocate = balsa_cite_bar_size_allocate;
 }
 
 static void
-balsa_cite_bar_init(BalsaCiteBar *cite_bar)
+balsa_cite_bar_init(BalsaCiteBar * cite_bar)
 {
-    cite_bar->width = 0;
-    cite_bar->height = 0;
+#if GTK_CHECK_VERSION(2, 18, 0)
+    gtk_widget_set_has_window(GTK_WIDGET(cite_bar), FALSE);
+#else                           /* GTK_CHECK_VERSION(2, 18, 0) */
+    GTK_WIDGET_SET_FLAGS(GTK_WIDGET(cite_bar), GTK_NO_WINDOW);
+#endif                          /* GTK_CHECK_VERSION(2, 18, 0) */ 
 }
 
-GtkWidget*
+GtkWidget *
 balsa_cite_bar_new(gint height, gint bars, gint dimension)
 {
     BalsaCiteBar *cite_bar;
@@ -105,16 +85,15 @@ balsa_cite_bar_new(gint height, gint bars, gint dimension)
      * at least 1 pixel */
     cite_bar->width = dimension / 4;
     if (cite_bar->width == 0)
-	cite_bar->width = 1;
+        cite_bar->width = 1;
     cite_bar->space = dimension - cite_bar->width;
 
     return GTK_WIDGET(cite_bar);
 }
 
 void
-balsa_cite_bar_resize(BalsaCiteBar *cite_bar, gint height)
+balsa_cite_bar_resize(BalsaCiteBar * cite_bar, gint height)
 {
-    g_return_if_fail(cite_bar != NULL);
     g_return_if_fail(BALSA_IS_CITE_BAR(cite_bar));
 
     cite_bar->height = height;
@@ -122,94 +101,40 @@ balsa_cite_bar_resize(BalsaCiteBar *cite_bar, gint height)
 }
 
 static void
-balsa_cite_bar_destroy(GtkObject *object)
-{
-    g_return_if_fail(object != NULL);
-    g_return_if_fail(BALSA_IS_CITE_BAR(object));
-
-    if (GTK_OBJECT_CLASS (parent_class)->destroy)
-	(*GTK_OBJECT_CLASS(parent_class)->destroy)(object);
-}
-
-static void
-balsa_cite_bar_realise(GtkWidget *widget)
+balsa_cite_bar_size_request(GtkWidget * widget,
+                            GtkRequisition * requisition)
 {
-    BalsaCiteBar *cite_bar;
-    GdkWindowAttr attributes;
-    gint attributes_mask;
-
-    g_return_if_fail(widget != NULL);
-    g_return_if_fail(BALSA_IS_CITE_BAR(widget));
-
-    GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED);
-    cite_bar = BALSA_CITE_BAR(widget);
-
-    attributes.x = widget->allocation.x;
-    attributes.y = widget->allocation.y;
-    attributes.width = widget->allocation.width;
-    attributes.height = widget->allocation.height;
-    attributes.wclass = GDK_INPUT_OUTPUT;
-    attributes.window_type = GDK_WINDOW_CHILD;
-    attributes.event_mask = gtk_widget_get_events(widget) | 
-	GDK_EXPOSURE_MASK;
-    attributes.visual = gtk_widget_get_visual(widget);
-    attributes.colormap = gtk_widget_get_colormap(widget);
-
-    attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
-    widget->window = gdk_window_new(widget->parent->window, &attributes, attributes_mask);
+    BalsaCiteBar *cite_bar = BALSA_CITE_BAR(widget);
 
-    widget->style = gtk_style_attach(widget->style, widget->window);
-
-    gdk_window_set_user_data(widget->window, widget);
-
-    gtk_style_set_background(widget->style, widget->window, GTK_STATE_NORMAL);
-}
-
-static void 
-balsa_cite_bar_size_request(GtkWidget *widget, GtkRequisition *requisition)
-{
-    BalsaCiteBar *cite_bar;
-
-    g_return_if_fail(widget != NULL);
-    g_return_if_fail(BALSA_IS_CITE_BAR(widget));
-    cite_bar = BALSA_CITE_BAR(widget);
-
-    requisition->width = (cite_bar->bars - 1) * (cite_bar->width + cite_bar->space) +
-	cite_bar->width;
+    requisition->width =
+        cite_bar->bars * (cite_bar->width + cite_bar->space) -
+        cite_bar->space;
     requisition->height = cite_bar->height;
 }
 
-static void
-balsa_cite_bar_size_allocate(GtkWidget *widget, GtkAllocation *allocation)
-{
-    g_return_if_fail(widget != NULL);
-    g_return_if_fail(BALSA_IS_CITE_BAR(widget));
-
-    widget->allocation = *allocation;
-    if (GTK_WIDGET_REALIZED(widget))
-	gdk_window_move_resize(widget->window,
-			       allocation->x, allocation->y,
-			       allocation->width, allocation->height);
-}
-
 static gboolean
-balsa_cite_bar_expose(GtkWidget *widget, GdkEventExpose *event)
+balsa_cite_bar_expose(GtkWidget * widget, GdkEventExpose * event)
 {
-    BalsaCiteBar *cite_bar;
-    int n;
-
-    g_return_val_if_fail(widget != NULL, FALSE);
-    g_return_val_if_fail(BALSA_IS_CITE_BAR(widget), FALSE);
-    g_return_val_if_fail(event != NULL, FALSE);
-
-    if (event->count > 0)
-	return FALSE;
-  
-    cite_bar = BALSA_CITE_BAR(widget);
-    gdk_window_clear(widget->window);
-    for (n = 0; n < cite_bar->bars; n++)
-	gdk_draw_rectangle(widget->window, widget->style->fg_gc[GTK_STATE_NORMAL], TRUE,
-			   n * (cite_bar->width + cite_bar->space), 0,
-			   cite_bar->width, cite_bar->height);
+    if (!event->count) {
+        BalsaCiteBar *cite_bar = BALSA_CITE_BAR(widget);
+        GdkWindow *window = gtk_widget_get_window(widget);
+        GdkGC *gc = gtk_widget_get_style(widget)->fg_gc[GTK_STATE_NORMAL];
+        GtkAllocation allocation;
+        int n;
+
+#if GTK_CHECK_VERSION(2, 18, 0)
+        gtk_widget_get_allocation(widget, &allocation);
+#else                           /* GTK_CHECK_VERSION(2, 18, 0) */
+        allocation.x = widget->allocation.x;
+        allocation.y = widget->allocation.y;
+#endif                          /* GTK_CHECK_VERSION(2, 18, 0) */ 
+        for (n = 0; n < cite_bar->bars; n++) {
+            gdk_draw_rectangle(window, gc, TRUE,
+                               allocation.x, allocation.y,
+                               cite_bar->width, cite_bar->height);
+            allocation.x += cite_bar->width + cite_bar->space;
+        }
+    }
+
     return FALSE;
 }
diff --git a/src/balsa-cite-bar.h b/src/balsa-cite-bar.h
index 2b82bb7..8818635 100644
--- a/src/balsa-cite-bar.h
+++ b/src/balsa-cite-bar.h
@@ -22,7 +22,6 @@
 #ifndef __BALSA_CITE_BAR_H__
 #define __BALSA_CITE_BAR_H__
 
-#include <gdk/gdk.h>
 #include <gtk/gtk.h>
 
 
@@ -40,25 +39,6 @@ G_BEGIN_DECLS
 typedef struct _BalsaCiteBar        BalsaCiteBar;
 typedef struct _BalsaCiteBarClass   BalsaCiteBarClass;
 
-struct _BalsaCiteBar
-{
-    GtkWidget misc;
-
-    /* Dimensions of each citation bar */
-    gint width;
-    gint height;
-
-    /* bar count and spacing */
-    gint bars;
-    gint space;
-};
-
-struct _BalsaCiteBarClass
-{
-    GtkWidgetClass parent_class;
-};
-
-
 GType      balsa_cite_bar_get_type   (void) G_GNUC_CONST;
 GtkWidget* balsa_cite_bar_new        (gint height, gint bars, gint dimension);
 void       balsa_cite_bar_resize     (BalsaCiteBar *cite_bar, gint height);



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