[dia] Bug 694025 - GLib drop support for adding interfaces after class_init



commit 213bdfe956bf8fe57c86316f68a09408fef1647e
Author: Hans Breuer <hans breuer org>
Date:   Sat Mar 16 17:56:58 2013 +0100

    Bug 694025 - GLib drop support for adding interfaces after class_init
    
    Without this Dia crashes at startup with new GLib version and the
    DiaGdkRenderer being default. Make a new DiaGdkInteractiveRenderer which
    follows the pattern also used for DiaCairoInteraciveRenderer. This should
    be functional equivalent to what was there before and should work for all
    current GLib versions.

 app/render_gdk.c |   60 +++++++++++++++++++++++++++++++++--------------------
 1 files changed, 37 insertions(+), 23 deletions(-)
---
diff --git a/app/render_gdk.c b/app/render_gdk.c
index f6692dd..23e4226 100644
--- a/app/render_gdk.c
+++ b/app/render_gdk.c
@@ -63,7 +63,21 @@ static void draw_object_highlighted (DiaRenderer *renderer,
                                      DiaObject *object,
                                      DiaHighlightType type);
 
-static void dia_gdk_renderer_iface_init (DiaInteractiveRendererInterface* iface)
+typedef struct _DiaGdkInteractiveRenderer DiaGdkInteractiveRenderer;
+struct _DiaGdkInteractiveRenderer
+{
+  DiaGdkRenderer parent_instance; /*!< inheritance in object oriented C */
+};
+typedef struct _DiaGdkInteractiveRendererClass DiaGdkInteractiveRendererClass;
+struct _DiaGdkInteractiveRendererClass
+{
+  DiaGdkRendererClass parent_class; /*!< the base class */
+};
+#define DIA_TYPE_GDK_INTERACTIVE_RENDERER           (dia_gdk_interactive_renderer_get_type ())
+#define DIA_GDK_INTERACTIVE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
DIA_TYPE_GDK_INTERACTIVE_RENDERER, DiaGdkInteractiveRenderer))
+
+static void
+dia_gdk_renderer_iface_init (DiaInteractiveRendererInterface* iface)
 {
   iface->clip_region_clear = clip_region_clear;
   iface->clip_region_add_rect = clip_region_add_rect;
@@ -75,35 +89,35 @@ static void dia_gdk_renderer_iface_init (DiaInteractiveRendererInterface* iface)
   iface->draw_object_highlighted = draw_object_highlighted;
 }
 
+G_DEFINE_TYPE_WITH_CODE (DiaGdkInteractiveRenderer, dia_gdk_interactive_renderer, DIA_TYPE_GDK_RENDERER,
+                        G_IMPLEMENT_INTERFACE (DIA_TYPE_INTERACTIVE_RENDERER_INTERFACE, 
dia_gdk_renderer_iface_init));
+
+static void
+dia_gdk_interactive_renderer_class_init(DiaGdkInteractiveRendererClass *klass)
+{
+}
+static void
+dia_gdk_interactive_renderer_init(DiaGdkInteractiveRenderer *object)
+{
+  DiaGdkInteractiveRenderer *ia_renderer = DIA_GDK_INTERACTIVE_RENDERER (object);
+  DiaGdkRenderer *renderer = DIA_GDK_RENDERER(object);
+  DiaRenderer *dia_renderer = DIA_RENDERER(object);
+  
+  dia_renderer->is_interactive = 1;
+
+  renderer->gc = NULL;
+  renderer->pixmap = NULL;
+  renderer->clip_region = NULL;
+}
+
 DiaRenderer *
 new_gdk_renderer(DDisplay *ddisp)
 {
   DiaGdkRenderer *renderer;
   GType renderer_type = 0;
 
-  renderer = g_object_new (DIA_TYPE_GDK_RENDERER, NULL);
+  renderer = g_object_new (DIA_TYPE_GDK_INTERACTIVE_RENDERER, NULL);
   renderer->transform = dia_transform_new (&ddisp->visible, &ddisp->zoom_factor);
-  if (!DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer))
-    {
-      static const GInterfaceInfo irenderer_iface_info = 
-      {
-        (GInterfaceInitFunc) dia_gdk_renderer_iface_init,
-        NULL,           /* iface_finalize */
-        NULL            /* iface_data     */
-      };
-
-      renderer_type = DIA_TYPE_GDK_RENDERER;
-      /* register the interactive renderer interface */
-      g_type_add_interface_static (renderer_type,
-                                   DIA_TYPE_INTERACTIVE_RENDERER_INTERFACE,
-                                   &irenderer_iface_info);
-
-    }
-  renderer->parent_instance.is_interactive = 1;
-  renderer->gc = NULL;
-
-  renderer->pixmap = NULL;
-  renderer->clip_region = NULL;
 
   return DIA_RENDERER(renderer);
 }


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