[dia] Move interactive renderer to it's own header



commit f2abb7ef97666a44840e251cf42d76055053e710
Author: Zander Brown <zbrown gnome org>
Date:   Wed Sep 11 21:28:52 2019 +0100

    Move interactive renderer to it's own header

 app/connectionpoint_ops.c           |  59 +++++++-------
 app/display.c                       | 124 ++++++++++++++++------------
 app/grid.c                          | 143 +++++++++++++++++---------------
 app/handle_ops.c                    |  69 ++++++++--------
 app/interface.c                     |  35 ++++----
 app/modify_tool.c                   |   7 +-
 lib/arrows.c                        |   3 +-
 lib/diagramdata.c                   |  31 ++++---
 lib/diainteractiverenderer.c        | 158 +++++++++++++++++++++++++++++-------
 lib/diainteractiverenderer.h        | 119 +++++++++++++++++++++++++++
 lib/diarenderer.c                   | 121 +++++++++++----------------
 lib/diarenderer.h                   | 105 ++----------------------
 lib/layer.c                         |  66 ++++++++-------
 lib/meson.build                     |   1 +
 lib/renderer/diacairo-interactive.c |  93 ++++++++++-----------
 lib/renderer/diacairo-renderer.c    |   2 +-
 lib/renderer/diacairo.h             |   3 +-
 lib/text.c                          |  38 +++++----
 objects/GRAFCET/action_text_draw.c  |   9 +-
 objects/standard/arc.c              |  50 +++++++-----
 objects/standard/bezier.c           |   3 +-
 objects/standard/beziergon.c        |   5 +-
 objects/standard/textobj.c          |   5 +-
 23 files changed, 704 insertions(+), 545 deletions(-)
---
diff --git a/app/connectionpoint_ops.c b/app/connectionpoint_ops.c
index 26d078c3..a50edd35 100644
--- a/app/connectionpoint_ops.c
+++ b/app/connectionpoint_ops.c
@@ -24,6 +24,7 @@
 #include "color.h"
 #include "object.h"
 #include "connectionpoint.h"
+#include "diainteractiverenderer.h"
 
 #define CONNECTIONPOINT_SIZE 7
 #define CHANGED_TRESHOLD 0.001
@@ -33,29 +34,29 @@ static Color connectionpoint_color = { 0.4, 0.4, 1.0, 1.0 };
 #define CP_SZ (CONNECTIONPOINT_SIZE/2)
 
 static void
-connectionpoint_draw(ConnectionPoint *conpoint,
-                    DDisplay        *ddisp,
-                    DiaRenderer     *renderer,
-                    DiaInteractiveRendererInterface *irenderer,
-                    Color           *color)
+connectionpoint_draw (ConnectionPoint                 *conpoint,
+                      DDisplay                        *ddisp,
+                      DiaRenderer                     *renderer,
+                      DiaInteractiveRendererInterface *irenderer,
+                      Color                           *color)
 {
   int x,y;
   Point *point = &conpoint->pos;
-  
-  ddisplay_transform_coords(ddisp, point->x, point->y, &x, &y);
-
-  irenderer->draw_pixel_line (renderer,
-                       x-CP_SZ,y-CP_SZ,
-                       x+CP_SZ,y+CP_SZ,
-                       color);
-
-  irenderer->draw_pixel_line (renderer,
-                       x+CP_SZ,y-CP_SZ,
-                       x-CP_SZ,y+CP_SZ,
-                       color);
+
+  ddisplay_transform_coords (ddisp, point->x, point->y, &x, &y);
+
+  irenderer->draw_pixel_line (DIA_INTERACTIVE_RENDERER (renderer),
+                              x-CP_SZ,y-CP_SZ,
+                              x+CP_SZ,y+CP_SZ,
+                              color);
+
+  irenderer->draw_pixel_line (DIA_INTERACTIVE_RENDERER (renderer),
+                              x+CP_SZ,y-CP_SZ,
+                              x-CP_SZ,y+CP_SZ,
+                              color);
 }
 
-void 
+void
 object_draw_connectionpoints(DiaObject *obj, DDisplay *ddisp)
 {
   int i;
@@ -63,14 +64,14 @@ object_draw_connectionpoints(DiaObject *obj, DDisplay *ddisp)
   DiaRenderer *renderer = ddisp->renderer;
   DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (ddisp->renderer);
   DiaInteractiveRendererInterface *irenderer =
-    DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer);
+    DIA_INTERACTIVE_RENDERER_GET_IFACE (ddisp->renderer);
 
   /* this does not change for any of the points */
   renderer_ops->set_linewidth (renderer, 0.0);
   renderer_ops->set_linestyle (renderer, LINESTYLE_SOLID, 0.0);
 
   /* optimization to only draw the connection points at all if the size
-   * of the object (bounding box) is bigger than the summed size of the 
+   * of the object (bounding box) is bigger than the summed size of the
    * connection points - or some variation thereof ;)
    */
   if (dia_object_get_num_connections(obj) > 1)
@@ -119,16 +120,16 @@ diagram_update_connections_selection(Diagram *dia)
 
   while (list!=NULL) {
     DiaObject * selected_obj = (DiaObject *) list->data;
-    
+
     diagram_update_connections_object(dia, selected_obj, TRUE);
-    
+
     list = g_list_next(list);
   }
 }
 
 /* Updates all objects connected to the 'obj' object.
    Calls this function recursively for objects modified.
-   
+
    If update_nonmoved is TRUE, also objects that have not
    moved since last time is updated. This is not propagated
    in the recursion.
@@ -163,7 +164,7 @@ diagram_update_connections_object(Diagram *dia, DiaObject *obj,
          object_add_updates(connected_obj, dia);
 
          diagram_update_connections_object(dia, connected_obj, FALSE);
-       }       
+       }
        list = g_list_next(list);
       }
     }
@@ -173,7 +174,7 @@ diagram_update_connections_object(Diagram *dia, DiaObject *obj,
     for (child = obj->children; child != NULL; child = child->next) {
       DiaObject *child_obj = (DiaObject *)child->data;
       diagram_update_connections_object(dia, child_obj, update_nonmoved);
-    }    
+    }
   }
 }
 
@@ -183,7 +184,7 @@ ddisplay_connect_selected(DDisplay *ddisp)
   GList *list;
 
   list = ddisp->diagram->data->selected;
-    
+
   while (list!=NULL) {
     DiaObject *selected_obj = (DiaObject *) list->data;
     int i;
@@ -193,7 +194,7 @@ ddisplay_connect_selected(DDisplay *ddisp)
        object_connect_display(ddisp, selected_obj, selected_obj->handles[i], FALSE);
       }
     }
-    
+
     list = g_list_next(list);
   }
 }
@@ -204,14 +205,14 @@ diagram_unconnect_selected(Diagram *dia)
   GList *list;
 
   list = dia->data->selected;
-    
+
   while (list!=NULL) {
     DiaObject *selected_obj = (DiaObject *) list->data;
     int i;
 
     for (i=0; i<selected_obj->num_handles; i++) {
       Handle *handle = selected_obj->handles[i];
-      
+
       if ((handle->connected_to != NULL) &&
          (handle->connect_type == HANDLE_CONNECTABLE)){
          /* don't do this if type is HANDLE_CONNECTABLE_BREAK */
diff --git a/app/display.c b/app/display.c
index 2a80e6f9..a997b4a9 100644
--- a/app/display.c
+++ b/app/display.c
@@ -281,57 +281,63 @@ new_display(Diagram *dia)
 }
 
 void
-ddisplay_transform_coords_double(DDisplay *ddisp,
-                                coord x, coord y,
-                                double *xi, double *yi)
+ddisplay_transform_coords_double (DDisplay *ddisp,
+                                  coord     x,
+                                  coord     y,
+                                  double   *xi,
+                                  double   *yi)
 {
   Rectangle *visible = &ddisp->visible;
-  double width = dia_renderer_get_width_pixels (ddisp->renderer);
-  double height = dia_renderer_get_height_pixels (ddisp->renderer);
+  double width = dia_interactive_renderer_get_width_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
+  double height = dia_interactive_renderer_get_height_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
 
-  *xi = (x - visible->left)  * (real)width / (visible->right - visible->left);
-  *yi = (y - visible->top)  * (real)height / (visible->bottom - visible->top);
+  *xi = (x - visible->left)  * (real) width / (visible->right - visible->left);
+  *yi = (y - visible->top)  * (real) height / (visible->bottom - visible->top);
 }
 
 
 void
-ddisplay_transform_coords(DDisplay *ddisp,
-                         coord x, coord y,
-                         int *xi, int *yi)
+ddisplay_transform_coords (DDisplay *ddisp,
+                           coord     x,
+                           coord     y,
+                           int      *xi,
+                           int      *yi)
 {
   Rectangle *visible = &ddisp->visible;
-  int width = dia_renderer_get_width_pixels (ddisp->renderer);
-  int height = dia_renderer_get_height_pixels (ddisp->renderer);
+  int width = dia_interactive_renderer_get_width_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
+  int height = dia_interactive_renderer_get_height_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
 
-  *xi = ROUND ( (x - visible->left)  * (real)width /
-               (visible->right - visible->left) );
-  *yi = ROUND ( (y - visible->top)  * (real)height /
-               (visible->bottom - visible->top) );
+  *xi = ROUND ( (x - visible->left) * (real) width /
+                (visible->right - visible->left) );
+  *yi = ROUND ( (y - visible->top) * (real) height /
+                (visible->bottom - visible->top) );
 }
 
 /* Takes real length and returns pixel length */
 real
-ddisplay_transform_length(DDisplay *ddisp, real len)
+ddisplay_transform_length (DDisplay *ddisp, real len)
 {
   return len * ddisp->zoom_factor;
 }
 
 /* Takes pixel length and returns real length */
 real
-ddisplay_untransform_length(DDisplay *ddisp, real len)
+ddisplay_untransform_length (DDisplay *ddisp, real len)
 {
   return len / ddisp->zoom_factor;
 }
 
 
 void
-ddisplay_untransform_coords(DDisplay *ddisp,
-                           int xi, int yi,
-                           coord *x, coord *y)
+ddisplay_untransform_coords (DDisplay *ddisp,
+                             int       xi,
+                             int       yi,
+                             coord    *x,
+                             coord    *y)
 {
   Rectangle *visible = &ddisp->visible;
-  int width = dia_renderer_get_width_pixels (ddisp->renderer);
-  int height = dia_renderer_get_height_pixels (ddisp->renderer);
+  int width = dia_interactive_renderer_get_width_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
+  int height = dia_interactive_renderer_get_height_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
 
   *x = visible->left + xi*(visible->right - visible->left) / (real)width;
   *y = visible->top +  yi*(visible->bottom - visible->top) / (real)height;
@@ -443,23 +449,26 @@ ddisplay_flush(DDisplay *ddisp)
 }
 
 static void
-ddisplay_obj_render(DiaObject *obj, DiaRenderer *renderer,
-                   int active_layer,
-                   gpointer data)
+ddisplay_obj_render (DiaObject   *obj,
+                     DiaRenderer *renderer,
+                     int          active_layer,
+                     gpointer     data)
 {
-  DDisplay *ddisp = (DDisplay *)data;
+  DDisplay *ddisp = (DDisplay *) data;
   DiaInteractiveRendererInterface *irenderer =
-    DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer);
-  DiaHighlightType hltype = data_object_get_highlight(DIA_DIAGRAM_DATA(ddisp->diagram), obj);
-
-  if (hltype != DIA_HIGHLIGHT_NONE && irenderer->draw_object_highlighted != NULL)
-    irenderer->draw_object_highlighted(renderer, obj, hltype);
-  else /* maybe the renderer does not support highlighting */
-    DIA_RENDERER_GET_CLASS(renderer)->draw_object(renderer, obj, NULL);
+    DIA_INTERACTIVE_RENDERER_GET_IFACE (renderer);
+  DiaHighlightType hltype = data_object_get_highlight (DIA_DIAGRAM_DATA (ddisp->diagram), obj);
+
+  if (hltype != DIA_HIGHLIGHT_NONE && irenderer->draw_object_highlighted != NULL) {
+    irenderer->draw_object_highlighted (DIA_INTERACTIVE_RENDERER (renderer), obj, hltype);
+  } else  {
+    /* maybe the renderer does not support highlighting */
+    DIA_RENDERER_GET_CLASS (renderer)->draw_object (renderer, obj, NULL);
+  }
 
   if (ddisp->show_cx_pts &&
       obj->parent_layer != NULL && obj->parent_layer->connectable) {
-    object_draw_connectionpoints(obj, ddisp);
+    object_draw_connectionpoints (obj, ddisp);
   }
 }
 
@@ -480,7 +489,7 @@ ddisplay_render_pixmap (DDisplay  *ddisp,
     return;
   }
 
-  renderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer);
+  renderer = DIA_INTERACTIVE_RENDERER_GET_IFACE (ddisp->renderer);
 
   /* Erase background */
   g_return_if_fail (renderer->fill_pixel_rect != NULL);
@@ -490,14 +499,14 @@ ddisplay_render_pixmap (DDisplay  *ddisp,
 
     ddisplay_transform_coords (ddisp, update->left, update->top, &x0, &y0);
     ddisplay_transform_coords (ddisp, update->right, update->bottom, &x1, &y1);
-    renderer->fill_pixel_rect (ddisp->renderer,
+    renderer->fill_pixel_rect (DIA_INTERACTIVE_RENDERER (ddisp->renderer),
                                x0, y0, x1-x0, y1-y0,
                                &ddisp->diagram->data->bg_color);
   } else {
-    renderer->fill_pixel_rect (ddisp->renderer,
+    renderer->fill_pixel_rect (DIA_INTERACTIVE_RENDERER (ddisp->renderer),
                                0, 0,
-                               dia_renderer_get_width_pixels (ddisp->renderer),
-                               dia_renderer_get_height_pixels (ddisp->renderer),
+                               dia_interactive_renderer_get_width_pixels (DIA_INTERACTIVE_RENDERER 
(ddisp->renderer)),
+                               dia_interactive_renderer_get_height_pixels (DIA_INTERACTIVE_RENDERER 
(ddisp->renderer)),
                                &ddisp->diagram->data->bg_color);
   }
 
@@ -562,7 +571,7 @@ ddisplay_update_scrollbars(DDisplay *ddisp)
 }
 
 void
-ddisplay_set_origo(DDisplay *ddisp, coord x, coord y)
+ddisplay_set_origo (DDisplay *ddisp, coord x, coord y)
 {
   Rectangle *extents = &ddisp->diagram->data->extents;
   Rectangle *visible = &ddisp->visible;
@@ -574,19 +583,19 @@ ddisplay_set_origo(DDisplay *ddisp, coord x, coord y)
   ddisp->origo.x = x;
   ddisp->origo.y = y;
 
-  if (ddisp->zoom_factor<DDISPLAY_MIN_ZOOM)
+  if (ddisp->zoom_factor < DDISPLAY_MIN_ZOOM)
     ddisp->zoom_factor = DDISPLAY_MIN_ZOOM;
 
   if (ddisp->zoom_factor > DDISPLAY_MAX_ZOOM)
     ddisp->zoom_factor = DDISPLAY_MAX_ZOOM;
 
-  width = dia_renderer_get_width_pixels (ddisp->renderer);
-  height = dia_renderer_get_height_pixels (ddisp->renderer);
+  width = dia_interactive_renderer_get_width_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
+  height = dia_interactive_renderer_get_height_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
 
   visible->left = ddisp->origo.x;
   visible->top = ddisp->origo.y;
-  visible->right = ddisp->origo.x + ddisplay_untransform_length(ddisp, width);
-  visible->bottom = ddisp->origo.y + ddisplay_untransform_length(ddisp, height);
+  visible->right = ddisp->origo.x + ddisplay_untransform_length (ddisp, width);
+  visible->bottom = ddisp->origo.y + ddisplay_untransform_length (ddisp, height);
 
   ddisplay_update_rulers (ddisp, extents, visible);
 }
@@ -973,8 +982,12 @@ ddisplay_set_renderer(DDisplay *ddisp, int aa_renderer)
                 "rect", &ddisp->visible,
                 NULL);
 
-  if (window)
-    dia_renderer_set_size(ddisp->renderer, window, width, height);
+  if (window) {
+    dia_interactive_renderer_set_size (DIA_INTERACTIVE_RENDERER (ddisp->renderer),
+                                       window,
+                                       width,
+                                       height);
+  }
 }
 
 void
@@ -992,12 +1005,15 @@ ddisplay_resize_canvas(DDisplay *ddisp,
                   NULL);
   }
 
-  dia_renderer_set_size(ddisp->renderer, gtk_widget_get_window(ddisp->canvas), width, height);
+  dia_interactive_renderer_set_size (DIA_INTERACTIVE_RENDERER (ddisp->renderer),
+                                     gtk_widget_get_window (ddisp->canvas),
+                                     width,
+                                     height);
 
-  ddisplay_set_origo(ddisp, ddisp->origo.x, ddisp->origo.y);
+  ddisplay_set_origo (ddisp, ddisp->origo.x, ddisp->origo.y);
 
-  ddisplay_add_update_all(ddisp);
-  ddisplay_flush(ddisp);
+  ddisplay_add_update_all (ddisp);
+  ddisplay_flush (ddisp);
 }
 
 DDisplay *
@@ -1489,8 +1505,8 @@ ddisplay_show_all (DDisplay *ddisp)
 
   dia = ddisp->diagram;
 
-  width = dia_renderer_get_width_pixels (ddisp->renderer);
-  height = dia_renderer_get_height_pixels (ddisp->renderer);
+  width = dia_interactive_renderer_get_width_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
+  height = dia_interactive_renderer_get_height_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
 
   /* if there is something selected show that instead of all exisiting objects */
   if (dia->data->selected) {
diff --git a/app/grid.c b/app/grid.c
index 16c9264d..6dcaf00f 100644
--- a/app/grid.c
+++ b/app/grid.c
@@ -26,6 +26,7 @@
 #include "intl.h"
 #include "grid.h"
 #include "preferences.h"
+#include "diainteractiverenderer.h"
 
 /** Calculate the width (in cm) of the gap between grid lines in dynamic
  * grid mode.
@@ -90,7 +91,7 @@ grid_draw_horizontal_lines(DDisplay *ddisp, Rectangle *update, real length)
   DiaInteractiveRendererInterface *irenderer;
   int major_count = 0;
 
-  irenderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer);
+  irenderer = DIA_INTERACTIVE_RENDERER_GET_IFACE (renderer);
 
   pos = ceil( update->top / length ) * length;
   ddisplay_transform_coords(ddisp, update->left, pos, &x, &y);
@@ -108,23 +109,28 @@ grid_draw_horizontal_lines(DDisplay *ddisp, Rectangle *update, real length)
 
   if (major_lines) {
     major_count = ROUND (pos/length);
-    if(major_count < 0) major_count -= major_lines * major_count;
+    if (major_count < 0) major_count -= major_lines * major_count;
     major_count %= major_lines;
   }
 
   while (y < height) {
     if (major_lines) {
-      if (major_count == 0)
-       DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
-      else
-       DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED,
-                                                       ddisplay_untransform_length(ddisp, 31));
-      major_count = (major_count+1)%major_lines;
+      if (major_count == 0) {
+        DIA_RENDERER_GET_CLASS (renderer)->set_linestyle (renderer, LINESTYLE_SOLID, 0.0);
+      } else {
+        DIA_RENDERER_GET_CLASS (renderer)->set_linestyle (renderer, LINESTYLE_DOTTED,
+                                                          ddisplay_untransform_length (ddisp, 31));
+      }
+      major_count = (major_count + 1) % major_lines;
     }
-    irenderer->draw_pixel_line(renderer, x, y, width, y,
-                              &ddisp->diagram->grid.colour);
+    irenderer->draw_pixel_line (DIA_INTERACTIVE_RENDERER (renderer),
+                                x,
+                                y,
+                                width,
+                                y,
+                                &ddisp->diagram->grid.colour);
     pos += length;
-    ddisplay_transform_coords(ddisp, update->left, pos, &x, &y);
+    ddisplay_transform_coords (ddisp, update->left, pos, &x, &y);
   }
 }
 
@@ -139,7 +145,7 @@ grid_draw_vertical_lines(DDisplay *ddisp, Rectangle *update, real length)
   DiaInteractiveRendererInterface *irenderer;
   int major_count = 0;
 
-  irenderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer);
+  irenderer = DIA_INTERACTIVE_RENDERER_GET_IFACE (renderer);
 
   pos = ceil( update->left / length ) * length;
   ddisplay_transform_coords(ddisp, update->right, update->bottom, &width, &height);
@@ -151,17 +157,25 @@ grid_draw_vertical_lines(DDisplay *ddisp, Rectangle *update, real length)
   }
 
   while (x < width) {
-    ddisplay_transform_coords(ddisp, pos, update->top, &x, &y);
+    ddisplay_transform_coords (ddisp, pos, update->top, &x, &y);
     if (major_lines) {
-      if (major_count == 0)
-       DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
-      else
-       DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED,
-                                                       ddisplay_untransform_length(ddisp, 31));
-      major_count = (major_count+1)%major_lines;
+      if (major_count == 0) {
+        DIA_RENDERER_GET_CLASS (renderer)->set_linestyle (DIA_INTERACTIVE_RENDERER (renderer),
+                                                          LINESTYLE_SOLID,
+                                                          0.0);
+      } else {
+        DIA_RENDERER_GET_CLASS (renderer)->set_linestyle (DIA_INTERACTIVE_RENDERER (renderer),
+                                                          LINESTYLE_DOTTED,
+                                                          ddisplay_untransform_length (ddisp, 31));
+      }
+      major_count = (major_count + 1) % major_lines;
     }
-    irenderer->draw_pixel_line(renderer, x, y, x, height,
-                              &ddisp->diagram->grid.colour);
+    irenderer->draw_pixel_line (DIA_INTERACTIVE_RENDERER (renderer),
+                                x,
+                                y,
+                                x,
+                                height,
+                                &ddisp->diagram->grid.colour);
     pos += length;
   }
 }
@@ -174,7 +188,7 @@ grid_draw_hex(DDisplay *ddisp, Rectangle *update, real length)
   DiaRenderer *renderer = ddisp->renderer;
   DiaInteractiveRendererInterface *irenderer;
 
-  irenderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer);
+  irenderer = DIA_INTERACTIVE_RENDERER_GET_IFACE (renderer);
 
   /* First horizontal lines: */
   vert_pos = ceil( update->top / (length * sqrt(3)) ) * length * sqrt(3);
@@ -297,28 +311,29 @@ grid_draw(DDisplay *ddisp, Rectangle *update)
 }
 
 void
-pagebreak_draw(DDisplay *ddisp, Rectangle *update)
+pagebreak_draw (DDisplay *ddisp, Rectangle *update)
 {
   DiaRenderer *renderer = ddisp->renderer;
   DiaInteractiveRendererInterface *irenderer;
 
-  int width = dia_renderer_get_width_pixels(ddisp->renderer);
-  int height = dia_renderer_get_height_pixels(ddisp->renderer);
+  int width = dia_interactive_renderer_get_width_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
+  int height = dia_interactive_renderer_get_height_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
 
-  irenderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer);
+  irenderer = DIA_INTERACTIVE_RENDERER_GET_IFACE (renderer);
   if (prefs.pagebreak.visible) {
     Diagram *dia = ddisp->diagram;
     real origx = 0, origy = 0, pos;
     real pwidth = dia->data->paper.width;
     real pheight = dia->data->paper.height;
-    int x,y;
+    int x, y;
 
-    DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, 0.0);
-    if (prefs.pagebreak.solid)
-      DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
-    else
-      DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_DOTTED,
-                                                     ddisplay_untransform_length(ddisp, 31));
+    DIA_RENDERER_GET_CLASS (renderer)->set_linewidth (renderer, 0.0);
+    if (prefs.pagebreak.solid) {
+      DIA_RENDERER_GET_CLASS (renderer)->set_linestyle (renderer, LINESTYLE_SOLID, 0.0);
+    } else {
+      DIA_RENDERER_GET_CLASS (renderer)->set_linestyle (renderer, LINESTYLE_DOTTED,
+                                                        ddisplay_untransform_length (ddisp, 31));
+    }
 
     if (dia->data->paper.fitto) {
       origx = dia->data->extents.left;
@@ -326,61 +341,61 @@ pagebreak_draw(DDisplay *ddisp, Rectangle *update)
     }
 
     /* vertical lines ... */
-    pos = origx + ceil((update->left - origx) / pwidth) * pwidth;
+    pos = origx + ceil ((update->left - origx) / pwidth) * pwidth;
     while (pos <= update->right) {
-      ddisplay_transform_coords(ddisp, pos,0,&x,&y);
-      irenderer->draw_pixel_line(renderer,
-                                 x, 0, x, height,
-                                &dia->pagebreak_color);
+      ddisplay_transform_coords (ddisp, pos, 0, &x, &y);
+      irenderer->draw_pixel_line (DIA_INTERACTIVE_RENDERER (renderer),
+                                  x, 0, x, height,
+                                  &dia->pagebreak_color);
       pos += pwidth;
     }
     /* Horizontal lines: */
-    pos = origy + ceil((update->top - origy) / pheight) * pheight;
+    pos = origy + ceil ((update->top - origy) / pheight) * pheight;
     while (pos <= update->bottom) {
-      ddisplay_transform_coords(ddisp, 0,pos,&x,&y);
-      irenderer->draw_pixel_line(renderer,
-                                0, y, width, y,
-                                &dia->pagebreak_color);
+      ddisplay_transform_coords (ddisp, 0,pos,&x,&y);
+      irenderer->draw_pixel_line (DIA_INTERACTIVE_RENDERER (renderer),
+                                  0, y, width, y,
+                                  &dia->pagebreak_color);
       pos += pheight;
     }
   }
 }
 
 void
-snap_to_grid(DDisplay *ddisp, coord *x, coord *y)
+snap_to_grid (DDisplay *ddisp, coord *x, coord *y)
 {
   if (ddisp->grid.snap) {
     if (ddisp->diagram->grid.hex) {
       real width_x = ddisp->diagram->grid.width_w;
-      real x_mod = (*x - 1*width_x) - floor((*x - 1*width_x) / (3*width_x)) * 3 * width_x;
-      real y_mod = (*y - 0.25*sqrt(3) * width_x) -
-       floor((*y - 0.25 * sqrt(3) * width_x) / (sqrt(3)*width_x)) * sqrt(3) * width_x;
+      real x_mod = (*x - 1 * width_x) - floor ((*x - 1 * width_x) / (3 * width_x)) * 3 * width_x;
+      real y_mod = (*y - 0.25 * sqrt (3) * width_x) -
+        floor ((*y - 0.25 * sqrt (3) * width_x) / (sqrt (3) * width_x)) * sqrt (3) * width_x;
 
       if ( x_mod < (1.5 * width_x) ) {
-       if ( y_mod < 0.5 * sqrt(3) * width_x ) {
-         *x = floor((*x + 0.5*width_x) / (3*width_x)) * 3 * width_x + 2 * width_x;
-         *y = floor((*y - 0.25 * sqrt(3) * width_x) / (sqrt(3)*width_x)) * sqrt(3) * width_x + 0.5 * sqrt(3) 
* width_x;
-       } else {
-         *x = floor((*x + 0.5*width_x) / (3*width_x)) * 3 * width_x + 1.5 * width_x;
-         *y = floor((*y - 0.25 * sqrt(3) * width_x) / (sqrt(3)*width_x)) * sqrt(3) * width_x + sqrt(3) * 
width_x;
-       }
+        if ( y_mod < 0.5 * sqrt (3) * width_x ) {
+          *x = floor ((*x + 0.5 * width_x) / (3 * width_x)) * 3 * width_x + 2 * width_x;
+          *y = floor ((*y - 0.25 * sqrt (3) * width_x) / (sqrt (3)*width_x)) * sqrt (3) * width_x + 0.5 * 
sqrt (3) * width_x;
+        } else {
+          *x = floor ((*x + 0.5 * width_x) / (3 * width_x)) * 3 * width_x + 1.5 * width_x;
+          *y = floor ((*y - 0.25 * sqrt (3) * width_x) / (sqrt (3)*width_x)) * sqrt (3) * width_x + sqrt (3) 
* width_x;
+        }
       } else {
-       if ( y_mod < 0.5 * sqrt(3) * width_x ) {
-         *x = floor((*x + 0.5*width_x) / (3*width_x)) * 3 * width_x ;
-         *y = floor((*y - 0.25 * sqrt(3) * width_x) / (sqrt(3)*width_x)) * sqrt(3) * width_x + 0.5 * sqrt(3) 
* width_x;
-       } else {
-         *x = floor((*x + 0.5*width_x) / (3*width_x)) * 3 * width_x + 0.5 * width_x;
-         *y = floor((*y - 0.25 * sqrt(3) * width_x) / (sqrt(3)*width_x)) * sqrt(3) * width_x + sqrt(3) * 
width_x;
-       }
+        if ( y_mod < 0.5 * sqrt (3) * width_x ) {
+          *x = floor ((*x + 0.5 * width_x) / (3 * width_x)) * 3 * width_x ;
+          *y = floor ((*y - 0.25 * sqrt (3) * width_x) / (sqrt (3) * width_x)) * sqrt (3) * width_x + 0.5 * 
sqrt (3) * width_x;
+        } else {
+          *x = floor ((*x + 0.5 * width_x) / (3 * width_x)) * 3 * width_x + 0.5 * width_x;
+          *y = floor ((*y - 0.25 * sqrt (3) * width_x) / (sqrt (3) * width_x)) * sqrt (3) * width_x + sqrt 
(3) * width_x;
+        }
       }
     } else {
       real width_x = ddisp->diagram->grid.width_x;
       real width_y = ddisp->diagram->grid.width_y;
       if (ddisp->diagram->grid.dynamic) {
-       calculate_dynamic_grid(ddisp, &width_x, &width_y);
+          calculate_dynamic_grid (ddisp, &width_x, &width_y);
       }
-      *x = ROUND((*x) / width_x) * width_x;
-      *y = ROUND((*y) / width_y) * width_y;
+      *x = ROUND ((*x) / width_x) * width_x;
+      *y = ROUND ((*y) / width_y) * width_y;
     }
   }
 }
diff --git a/app/handle_ops.c b/app/handle_ops.c
index 03fe31d9..052cf4f2 100644
--- a/app/handle_ops.c
+++ b/app/handle_ops.c
@@ -20,6 +20,7 @@
 #include "handle_ops.h"
 #include "handle.h"
 #include "color.h"
+#include "diainteractiverenderer.h"
 
 /* This value is best left odd so that the handles are centered. */
 #define HANDLE_SIZE 9
@@ -47,58 +48,54 @@ static const Color handle_color_connected[NUM_HANDLE_TYPES<<1] =
 };
 
 void
-handle_draw(Handle *handle, DDisplay *ddisp)
+handle_draw (Handle *handle, DDisplay *ddisp)
 {
   gboolean some_selected;
   int x,y;
   DiaRenderer *renderer = ddisp->renderer;
   DiaInteractiveRendererInterface *irenderer =
-    DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer);
+    DIA_INTERACTIVE_RENDERER_GET_IFACE (ddisp->renderer);
   const Color *color;
 
-  ddisplay_transform_coords(ddisp, handle->pos.x, handle->pos.y, &x, &y);
+  ddisplay_transform_coords (ddisp, handle->pos.x, handle->pos.y, &x, &y);
   /* change handle color to reflect different behaviour for multiple selected */
   /* this code relies on the fact that only selected objects get their handles drawn */
   some_selected = g_list_length (ddisp->diagram->data->selected) > 1;
 
-  if  (handle->connected_to != NULL) {
+  if (handle->connected_to != NULL) {
     color = &handle_color_connected[handle->type + (some_selected ? NUM_HANDLE_TYPES : 0)];
   } else {
     color = &handle_color[handle->type + (some_selected ? NUM_HANDLE_TYPES : 0)];
   }
 
-  DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer, 0.0);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
-  DIA_RENDERER_GET_CLASS(renderer)->set_linejoin(renderer, LINEJOIN_MITER);
-  DIA_RENDERER_GET_CLASS(renderer)->set_fillstyle(renderer, FILLSTYLE_SOLID);
-  
-
-  irenderer->fill_pixel_rect(renderer,
-                            x - HANDLE_SIZE/2 + 1,
-                            y - HANDLE_SIZE/2 + 1,
-                            HANDLE_SIZE-2, HANDLE_SIZE-2,
-                            /* it does not change the color, but does not reflect taht in the signature */
-                            (Color *)color);
-  
-  irenderer->draw_pixel_rect(renderer,
-                            x - HANDLE_SIZE/2,
-                            y - HANDLE_SIZE/2,
-                            HANDLE_SIZE-1, HANDLE_SIZE-1,
-                            &color_black);
-
-    
-  
+  DIA_RENDERER_GET_CLASS (renderer)->set_linewidth (renderer, 0.0);
+  DIA_RENDERER_GET_CLASS (renderer)->set_linestyle (renderer, LINESTYLE_SOLID, 0.0);
+  DIA_RENDERER_GET_CLASS (renderer)->set_linejoin (renderer, LINEJOIN_MITER);
+  DIA_RENDERER_GET_CLASS (renderer)->set_fillstyle (renderer, FILLSTYLE_SOLID);
+
+
+  irenderer->fill_pixel_rect (DIA_INTERACTIVE_RENDERER (renderer),
+                              x - HANDLE_SIZE/2 + 1,
+                              y - HANDLE_SIZE/2 + 1,
+                              HANDLE_SIZE-2, HANDLE_SIZE-2,
+                              /* it does not change the color, but does not reflect taht in the signature */
+                              (Color *) color);
+
+  irenderer->draw_pixel_rect (DIA_INTERACTIVE_RENDERER (renderer),
+                              x - HANDLE_SIZE/2,
+                              y - HANDLE_SIZE/2,
+                              HANDLE_SIZE-1, HANDLE_SIZE-1,
+                              &color_black);
+
   if (handle->connect_type != HANDLE_NONCONNECTABLE) {
-    irenderer->draw_pixel_line
-                         (renderer,
-                         x - HANDLE_SIZE/2, y - HANDLE_SIZE/2,
-                         x + HANDLE_SIZE/2, y + HANDLE_SIZE/2,
-                         &color_black);
-    irenderer->draw_pixel_line
-                         (renderer,
-                         x - HANDLE_SIZE/2, y + HANDLE_SIZE/2,
-                         x + HANDLE_SIZE/2, y - HANDLE_SIZE/2,
-                         &color_black);
+    irenderer->draw_pixel_line (DIA_INTERACTIVE_RENDERER (renderer),
+                                x - HANDLE_SIZE/2, y - HANDLE_SIZE/2,
+                                x + HANDLE_SIZE/2, y + HANDLE_SIZE/2,
+                                &color_black);
+    irenderer->draw_pixel_line (DIA_INTERACTIVE_RENDERER (renderer),
+                                x - HANDLE_SIZE/2, y + HANDLE_SIZE/2,
+                                x + HANDLE_SIZE/2, y - HANDLE_SIZE/2,
+                                &color_black);
   }
 }
 
@@ -119,7 +116,7 @@ handle_is_clicked(DDisplay *ddisp, Handle *handle, Point *pos)
 
   if (handle==NULL)
     return FALSE;
-  
+
   dx = ABS(handle->pos.x - pos->x);
   dy = ABS(handle->pos.y - pos->y);
 
diff --git a/app/interface.c b/app/interface.c
index 523788d5..751bb029 100644
--- a/app/interface.c
+++ b/app/interface.c
@@ -46,6 +46,7 @@
 #include "widgets.h"
 #include "message.h"
 #include "ruler.h"
+#include "diainteractiverenderer.h"
 
 #include <gdk-pixbuf/gdk-pixbuf.h>
 
@@ -355,18 +356,17 @@ notebook_switch_page (GtkNotebook *notebook,
  */
 static gboolean
 canvas_configure_event (GtkWidget         *widget,
-                       GdkEventConfigure *cevent,
-                       DDisplay          *ddisp)
+                        GdkEventConfigure *cevent,
+                        DDisplay          *ddisp)
 {
   gboolean new_size = FALSE;
   int width, height;
 
   g_return_val_if_fail (widget == ddisp->canvas, FALSE);
 
-
   if (ddisp->renderer) {
-    width = dia_renderer_get_width_pixels (ddisp->renderer);
-    height = dia_renderer_get_height_pixels (ddisp->renderer);
+    width = dia_interactive_renderer_get_width_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
+    height = dia_interactive_renderer_get_height_pixels (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
   } else {
     /* We can continue even without a renderer here because
      * ddisplay_resize_canvas () does the setup for us.
@@ -378,7 +378,7 @@ canvas_configure_event (GtkWidget         *widget,
   if (width != cevent->width || height != cevent->height) {
     g_debug ("%s: Canvas size change...", G_STRLOC);
     ddisplay_resize_canvas (ddisp, cevent->width, cevent->height);
-    ddisplay_update_scrollbars(ddisp);
+    ddisplay_update_scrollbars (ddisp);
     /* on resize stop further propagation - does not help */
     new_size = TRUE;
   }
@@ -386,8 +386,9 @@ canvas_configure_event (GtkWidget         *widget,
   /* If the UI is not integrated, resizing should set the resized
    * window as active.  With integrated UI, there is only one window.
    */
-  if (is_integrated_ui () == 0)
-    display_set_active(ddisp);
+  if (is_integrated_ui () == 0) {
+    display_set_active (ddisp);
+  }
 
   /* continue propagation with FALSE */
   return new_size;
@@ -409,7 +410,7 @@ canvas_expose_event (GtkWidget      *widget,
   g_return_val_if_fail (ddisp->renderer != NULL, FALSE);
 
   /* Renders updates to pixmap + copies display_areas to canvas(screen) */
-  renderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer);
+  renderer = DIA_INTERACTIVE_RENDERER_GET_IFACE (ddisp->renderer);
 
   /* Only update if update_areas exist */
   l = ddisp->update_areas;
@@ -420,15 +421,15 @@ canvas_expose_event (GtkWidget      *widget,
     g_return_val_if_fail (   renderer->clip_region_clear != NULL
                           && renderer->clip_region_add_rect != NULL, FALSE);
 
-    renderer->clip_region_clear (ddisp->renderer);
+    renderer->clip_region_clear (DIA_INTERACTIVE_RENDERER (ddisp->renderer));
 
-    while(l!=NULL) {
+    while ( l!= NULL) {
       r = (Rectangle *) l->data;
 
-      rectangle_union(&totrect, r);
-      renderer->clip_region_add_rect (ddisp->renderer, r);
+      rectangle_union (&totrect, r);
+      renderer->clip_region_add_rect (DIA_INTERACTIVE_RENDERER (ddisp->renderer), r);
 
-      l = g_slist_next(l);
+      l = g_slist_next (l);
     }
     /* Free update_areas list: */
     l = ddisp->update_areas;
@@ -449,8 +450,10 @@ canvas_expose_event (GtkWidget      *widget,
 
   gtk_widget_get_allocation (widget, &alloc);
 
-  dia_interactive_renderer_paint (ddisp->renderer, ctx,
-                                  alloc.width, alloc.height);
+  dia_interactive_renderer_paint (DIA_INTERACTIVE_RENDERER (ddisp->renderer),
+                                  ctx,
+                                  alloc.width,
+                                  alloc.height);
 
   return FALSE;
 }
diff --git a/app/modify_tool.c b/app/modify_tool.c
index ca558313..2256d37a 100644
--- a/app/modify_tool.c
+++ b/app/modify_tool.c
@@ -35,6 +35,7 @@
 #include "textedit.h"
 #include "textline.h"
 #include "menus.h"
+#include "diainteractiverenderer.h"
 
 #include "parent.h"
 #include "prop_text.h"
@@ -296,7 +297,7 @@ modify_button_press(ModifyTool *tool, GdkEventButton *event,
     tool->x1 = tool->x2 = (int) event->x;
     tool->y1 = tool->y2 = (int) event->y;
 
-    dia_interactive_renderer_set_selection (ddisp->renderer,
+    dia_interactive_renderer_set_selection (DIA_INTERACTIVE_RENDERER (ddisp->renderer),
                                             TRUE,
                                             tool->x1,
                                             tool->y1,
@@ -643,7 +644,7 @@ modify_motion (ModifyTool     *tool,
                                MAX (tool->start_box.y, tool->end_box.y),
                                &tool->x2, &tool->y2);
 
-    dia_interactive_renderer_set_selection (ddisp->renderer,
+    dia_interactive_renderer_set_selection (DIA_INTERACTIVE_RENDERER (ddisp->renderer),
                                             TRUE,
                                             tool->x1,
                                             tool->y1,
@@ -784,7 +785,7 @@ modify_button_release(ModifyTool *tool, GdkEventButton *event,
 
     gdk_pointer_ungrab (event->time);
     /* Remove last box: */
-    dia_interactive_renderer_set_selection (ddisp->renderer,
+    dia_interactive_renderer_set_selection (DIA_INTERACTIVE_RENDERER (ddisp->renderer),
                                             FALSE, 0, 0, 0, 0);
 
     {
diff --git a/lib/arrows.c b/lib/arrows.c
index 1bb32f78..c07f2a5b 100644
--- a/lib/arrows.c
+++ b/lib/arrows.c
@@ -25,6 +25,7 @@
 
 #include <glib.h>
 #include "diacontext.h"
+#include "diainteractiverenderer.h"
 #include "boundingbox.h"
 
 #ifdef G_OS_WIN32
@@ -2375,7 +2376,7 @@ arrow_draw (DiaRenderer *renderer,
         break;
       }
   }
-  if ((type != ARROW_NONE) && (render_bounding_boxes ()) && (renderer->is_interactive)) {
+  if ((type != ARROW_NONE) && (render_bounding_boxes ()) && DIA_IS_INTERACTIVE_RENDERER (renderer)) {
     Arrow arrow = {type, length, width};
     Rectangle bbox = {0, };
     Point p1, p2;
diff --git a/lib/diagramdata.c b/lib/diagramdata.c
index 88d67bf2..05fcef47 100644
--- a/lib/diagramdata.c
+++ b/lib/diagramdata.c
@@ -25,6 +25,7 @@
 #include "intl.h"
 #include "diagramdata.h"
 #include "diarenderer.h"
+#include "diainteractiverenderer.h"
 #include "paper.h"
 #include "persistence.h"
 
@@ -802,28 +803,34 @@ data_emit(DiagramData *data, Layer *layer, DiaObject* obj,
  * \memberof _DiagramData
  */
 void
-data_render(DiagramData *data, DiaRenderer *renderer, Rectangle *update,
-           ObjectRenderer obj_renderer, gpointer gdata)
+data_render (DiagramData    *data,
+             DiaRenderer    *renderer,
+             Rectangle      *update,
+             ObjectRenderer  obj_renderer,
+             gpointer        gdata)
 {
   Layer *layer;
   guint i, active_layer;
 
-  if (!renderer->is_interactive)
-    (DIA_RENDERER_GET_CLASS(renderer)->begin_render)(renderer, update);
+  if (DIA_IS_INTERACTIVE_RENDERER (renderer)) {
+    (DIA_RENDERER_GET_CLASS (renderer)->begin_render) (renderer, update);
+  }
 
-  for (i=0; i<data->layers->len; i++) {
-    layer = (Layer *) g_ptr_array_index(data->layers, i);
+  for (i = 0; i < data->layers->len; i++) {
+    layer = (Layer *) g_ptr_array_index (data->layers, i);
     active_layer = (layer == data->active_layer);
     if (layer->visible) {
-      if (obj_renderer)
-        layer_render(layer, renderer, update, obj_renderer, gdata, active_layer);
-      else
-        (DIA_RENDERER_GET_CLASS(renderer)->draw_layer)(renderer, layer, active_layer, update);
+      if (obj_renderer) {
+        layer_render (layer, renderer, update, obj_renderer, gdata, active_layer);
+      } else {
+        (DIA_RENDERER_GET_CLASS (renderer)->draw_layer) (renderer, layer, active_layer, update);
+      }
     }
   }
 
-  if (!renderer->is_interactive)
-    (DIA_RENDERER_GET_CLASS(renderer)->end_render)(renderer);
+  if (DIA_IS_INTERACTIVE_RENDERER (renderer)) {
+    (DIA_RENDERER_GET_CLASS (renderer)->end_render) (renderer);
+  }
 }
 
 /*!
diff --git a/lib/diainteractiverenderer.c b/lib/diainteractiverenderer.c
index 64e4d784..980af53b 100644
--- a/lib/diainteractiverenderer.c
+++ b/lib/diainteractiverenderer.c
@@ -21,11 +21,47 @@
  */
 
 #include "diarenderer.h"
+#include "diainteractiverenderer.h"
+
+/**
+ * SECTION:dia-interactive-renderer
+ * @title: DiaInteractiveRenderer
+ * @short_description: #DiaRenderer for displays
+ *
+ * Interface to be provide by interactive renderers
+ *
+ * The interactive renderer interface extends a renderer with clipping
+ * and drawing with pixel coordinates.
+ */
+
+static int
+get_width_pixels (DiaInteractiveRenderer *self)
+{
+  g_return_val_if_fail (DIA_IS_INTERACTIVE_RENDERER (self), 0);
+
+  g_critical ("get_width_pixels isn't implemented for %s",
+              g_type_name (G_TYPE_FROM_INSTANCE (self)));
+
+  return 0;
+}
+
+static int
+get_height_pixels (DiaInteractiveRenderer *self)
+{
+  g_return_val_if_fail (DIA_IS_INTERACTIVE_RENDERER (self), 0);
+
+  g_critical ("get_height_pixels isn't implemented for %s",
+              g_type_name (G_TYPE_FROM_INSTANCE (self)));
+
+  return 0;
+}
 
 static void
 dia_interactive_renderer_iface_init (DiaInteractiveRendererInterface *iface)
 {
   /* NULL initialization probably already done by GObject */
+  iface->get_width_pixels = get_width_pixels;
+  iface->get_height_pixels = get_height_pixels;
   iface->clip_region_clear = NULL;
   iface->clip_region_add_rect = NULL;
   iface->draw_pixel_line = NULL;
@@ -37,7 +73,7 @@ dia_interactive_renderer_iface_init (DiaInteractiveRendererInterface *iface)
 }
 
 GType
-dia_interactive_renderer_interface_get_type (void)
+dia_interactive_renderer_get_type (void)
 {
   static GType iface_type = 0;
 
@@ -50,62 +86,126 @@ dia_interactive_renderer_interface_get_type (void)
        (GBaseFinalizeFunc) NULL,
       };
 
-      iface_type = g_type_register_static (G_TYPE_INTERFACE, 
-                                           "DiaInteractiveRendererInterface", 
-                                           &iface_info, 
+      iface_type = g_type_register_static (G_TYPE_INTERFACE,
+                                           "DiaInteractiveRendererInterface",
+                                           &iface_info,
                                            0);
 
-      g_type_interface_add_prerequisite (iface_type, 
+      g_type_interface_add_prerequisite (iface_type,
                                          DIA_TYPE_RENDERER);
     }
-  
+
   return iface_type;
 }
 
-/*
- * Wrapper functions using the above
+/**
+ * dia_interactive_renderer_set_size:
+ * @self: the #DiaInteractiveRenderer
+ * @window: the #GdkWindow
+ * @width: width of the canvas
+ * @height: height of the canvas
+ *
+ * Size adjustment to the given window
+ *
+ * Since: 0.98
  */
-void 
-dia_renderer_set_size (DiaRenderer* renderer, gpointer window, 
-                       int width, int height)
+void
+dia_interactive_renderer_set_size (DiaInteractiveRenderer *self,
+                                   gpointer                window,
+                                   int                     width,
+                                   int                     height)
 {
   DiaInteractiveRendererInterface *irenderer =
-    DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer);
+    DIA_INTERACTIVE_RENDERER_GET_IFACE (self);
 
   g_return_if_fail (irenderer != NULL);
   g_return_if_fail (irenderer->set_size != NULL);
 
-  irenderer->set_size (renderer, window, width, height);
+  irenderer->set_size (self, window, width, height);
 }
 
+/**
+ * dia_interactive_renderer_paint:
+ * @self: the #DiaInteractiveRenderer
+ * @ctx: the #cairo_t
+ * @width: width of the canvas
+ * @height: height of the canvas
+ *
+ * Draw @self to @ctx
+ *
+ * Since: 0.98
+ */
 void
-dia_interactive_renderer_paint (DiaRenderer *renderer,
-                                cairo_t     *ctx, 
-                                int          width,
-                                int          height)
+dia_interactive_renderer_paint (DiaInteractiveRenderer *self,
+                                cairo_t                *ctx,
+                                int                     width,
+                                int                     height)
 {
   DiaInteractiveRendererInterface *irenderer =
-    DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer);
-  
+    DIA_INTERACTIVE_RENDERER_GET_IFACE (self);
+
   g_return_if_fail (irenderer != NULL);
   g_return_if_fail (irenderer->paint != NULL);
 
-  irenderer->paint (renderer, ctx, width, height);
+  irenderer->paint (self, ctx, width, height);
 }
 
+/**
+ * dia_interactive_renderer_set_selection:
+ * @self: the #DiaInteractiveRenderer
+ * @has_selection: if %TRUE the selection box should be drawn
+ * @x: horizontal position of the selection
+ * @y: vertical position of the selection
+ * @width: width of the selection
+ * @height: height of the selection
+ *
+ * Since: 0.98
+ */
 void
-dia_interactive_renderer_set_selection (DiaRenderer *renderer,
-                                        gboolean     has_selection,
-                                        double       x,
-                                        double       y,
-                                        double       width,
-                                        double       height)
+dia_interactive_renderer_set_selection (DiaInteractiveRenderer *self,
+                                        gboolean                has_selection,
+                                        double                  x,
+                                        double                  y,
+                                        double                  width,
+                                        double                  height)
 {
   DiaInteractiveRendererInterface *irenderer =
-    DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer);
-  
+    DIA_INTERACTIVE_RENDERER_GET_IFACE (self);
+
   g_return_if_fail (irenderer != NULL);
   g_return_if_fail (irenderer->set_selection != NULL);
 
-  irenderer->set_selection (renderer, has_selection, x, y, width, height);
+  irenderer->set_selection (self, has_selection, x, y, width, height);
+}
+
+/**
+ * dia_interactive_renderer_get_width_pixels:
+ * @self: the #DiaInteractiveRenderer
+ *
+ * Get the width in pixels of the drawing area (if any)
+ *
+ * Returns: the width
+ *
+ * Since: 0.98
+ */
+int
+dia_interactive_renderer_get_width_pixels (DiaInteractiveRenderer *self)
+{
+  return DIA_INTERACTIVE_RENDERER_GET_IFACE (self)->get_width_pixels (self);
+}
+
+/**
+ * dia_interactive_renderer_get_height_pixels:
+ * @self: the #DiaInteractiveRenderer
+ *
+ * Get the height in pixels of the drawing area (if any)
+ *
+ * Returns: the height
+ *
+ * Since: 0.98
+ */
+int
+dia_interactive_renderer_get_height_pixels (DiaInteractiveRenderer *self)
+{
+  return DIA_INTERACTIVE_RENDERER_GET_IFACE (self)->get_height_pixels (self);
 }
diff --git a/lib/diainteractiverenderer.h b/lib/diainteractiverenderer.h
new file mode 100644
index 00000000..de3af04d
--- /dev/null
+++ b/lib/diainteractiverenderer.h
@@ -0,0 +1,119 @@
+/* Dia -- an diagram creation/manipulation program
+ * Copyright (C) 1998 Alexander Larsson
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#pragma once
+
+#include "diatypes.h"
+#include <glib-object.h>
+#include <glib.h>
+
+#include "dia-enums.h"
+
+#include "diagramdata.h"
+
+G_BEGIN_DECLS
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (DiaRenderer, g_object_unref)
+
+#define DIA_TYPE_INTERACTIVE_RENDERER dia_interactive_renderer_get_type ()
+G_DECLARE_INTERFACE (DiaInteractiveRenderer, dia_interactive_renderer, DIA, INTERACTIVE_RENDERER, 
DiaRenderer)
+
+
+/**
+ * DiaInteractiveRendererInterface:
+ * @get_width_pixels: return width in pixels
+ * @get_height_pixels: return height in pixels
+ * @set_size: set the output size
+ * @clip_region_clear: Clear the current clipping region
+ * @clip_region_add_rect: Add a rectangle to the current clipping region
+ * @draw_pixel_line: Draw a line from start to end, using color and the
+ *                   current line style
+ * @draw_pixel_rect: Draw a rectangle, given its upper-left and lower-right
+ *                   corners in pixels
+ * @fill_pixel_rect: Fill a rectangle, given its upper-left and lower-right
+ *                   corners in pixels
+ * @paint: Copy already rendered content to the given context
+ * @draw_object_highlighted: Support for drawing selected objects highlighted
+ * @set_selection: Set the current selection box
+ */
+struct _DiaInteractiveRendererInterface
+{
+  /* < private > */
+  GTypeInterface base_iface;
+
+  /* < public > */
+  int  (*get_width_pixels)        (DiaInteractiveRenderer *self);
+  int  (*get_height_pixels)       (DiaInteractiveRenderer *self);
+  void (*set_size)                (DiaInteractiveRenderer *self,
+                                   gpointer                window,
+                                   int                     width,
+                                   int                     height);
+  void (*clip_region_clear)       (DiaInteractiveRenderer *self);
+  void (*clip_region_add_rect)    (DiaInteractiveRenderer *self,
+                                   Rectangle              *rect);
+  void (*draw_pixel_line)         (DiaInteractiveRenderer *self,
+                                   int                     x1,
+                                   int                     y1,
+                                   int                     x2,
+                                   int                     y2,
+                                   Color                  *color);
+  void (*draw_pixel_rect)         (DiaInteractiveRenderer *self,
+                                   int                     x,
+                                   int                     y,
+                                   int                     width,
+                                   int                     height,
+                                   Color                  *color);
+  void (*fill_pixel_rect)         (DiaInteractiveRenderer *self,
+                                   int                     x,
+                                   int                     y,
+                                   int                     width,
+                                   int                     height,
+                                   Color                  *color);
+  void (*paint)                   (DiaInteractiveRenderer *self,
+                                   cairo_t                *ctx,
+                                   int                     width,
+                                   int                     height);
+  void (*draw_object_highlighted) (DiaInteractiveRenderer *self,
+                                   DiaObject              *object,
+                                   DiaHighlightType        type);
+  void (*set_selection)           (DiaInteractiveRenderer *self,
+                                   gboolean                has_selection,
+                                   double                  x,
+                                   double                  y,
+                                   double                  width,
+                                   double                  height);
+};
+
+void dia_interactive_renderer_paint              (DiaInteractiveRenderer *self,
+                                                  cairo_t                *ctx,
+                                                  int                     width,
+                                                  int                     height);
+void dia_interactive_renderer_set_selection      (DiaInteractiveRenderer *self,
+                                                  gboolean                has_selection,
+                                                  double                  x,
+                                                  double                  y,
+                                                  double                  width,
+                                                  double                  height);
+void dia_interactive_renderer_set_size           (DiaInteractiveRenderer *self,
+                                                  gpointer                window,
+                                                  int                     width,
+                                                  int                     height);
+int  dia_interactive_renderer_get_width_pixels   (DiaInteractiveRenderer *self);
+int  dia_interactive_renderer_get_height_pixels  (DiaInteractiveRenderer *self);
+
+G_END_DECLS
diff --git a/lib/diarenderer.c b/lib/diarenderer.c
index a97fd976..292a72c8 100644
--- a/lib/diarenderer.c
+++ b/lib/diarenderer.c
@@ -51,9 +51,6 @@ struct _BezierApprox {
 
 static void dia_renderer_class_init (DiaRendererClass *klass);
 
-static int get_width_pixels (DiaRenderer *);
-static int get_height_pixels (DiaRenderer *);
-
 static void begin_render (DiaRenderer *, const Rectangle *update);
 static void end_render (DiaRenderer *);
 
@@ -311,8 +308,6 @@ dia_renderer_class_init (DiaRendererClass *klass)
 
   object_class->finalize = renderer_finalize;
 
-  renderer_class->get_width_pixels  = get_width_pixels;
-  renderer_class->get_height_pixels = get_height_pixels;
   renderer_class->draw_layer = draw_layer;
   renderer_class->draw_object = draw_object;
   renderer_class->get_text_width = get_text_width;
@@ -1424,49 +1419,62 @@ draw_rounded_polyline_with_arrows(DiaRenderer *renderer,
   points[lastline-1] = oldend;
 }
 
-/** Figure the equation for a line given by two points.
- * Returns FALSE if the line is vertical (infinite a).
+/**
+ * points_to_line:
+ *
+ * Figure the equation for a line given by two points.
+ *
+ * Returns: %FALSE if the line is vertical (infinite a).
  */
 static gboolean
-points_to_line(real *a, real *b, Point *p1, Point *p2)
+points_to_line (real *a, real *b, Point *p1, Point *p2)
 {
-    if (fabs(p1->x - p2->x) < 0.000000001)
-      return FALSE;
-    *a = (p2->y-p1->y)/(p2->x-p1->x);
-    *b = p1->y-(*a)*p1->x;
-    return TRUE;
+  if (fabs (p1->x - p2->x) < 0.000000001) {
+    return FALSE;
+  }
+  *a = (p2->y-p1->y)/(p2->x-p1->x);
+  *b = p1->y-(*a)*p1->x;
+  return TRUE;
 }
 
-/** Find the intersection between two lines.
- * Returns TRUE if the lines intersect in a single point.
+/**
+ * intersection_line_line:
+ *
+ * Find the intersection between two lines.
+ *
+ * Returns: %TRUE if the lines intersect in a single point.
  */
 static gboolean
-intersection_line_line(Point *cross,
-                      Point *p1a, Point *p1b,
-                      Point *p2a, Point *p2b)
+intersection_line_line (Point *cross,
+                        Point *p1a,
+                        Point *p1b,
+                        Point *p2a,
+                        Point *p2b)
 {
   real a1, b1, a2, b2;
 
   /* Find coefficients of lines */
-  if (!(points_to_line(&a1, &b1, p1a, p1b))) {
-    if (!(points_to_line(&a2, &b2, p2a, p2b))) {
-      if (fabs(p1a->x-p2a->x) < 0.00000001) {
-       *cross = *p1a;
-       return TRUE;
-      } else return FALSE;
+  if (!(points_to_line (&a1, &b1, p1a, p1b))) {
+    if (!(points_to_line (&a2, &b2, p2a, p2b))) {
+      if (fabs (p1a->x-p2a->x) < 0.00000001) {
+        *cross = *p1a;
+        return TRUE;
+      } else {
+        return FALSE;
+      }
     }
     cross->x = p1a->x;
     cross->y = a2*(p1a->x)+b2;
     return TRUE;
   }
-  if (!(points_to_line(&a2, &b2, p2a, p2b))) {
+  if (!(points_to_line (&a2, &b2, p2a, p2b))) {
     cross->x = p2a->x;
     cross->y = a1*(p2a->x)+b1;
     return TRUE;
   }
   /* Solve */
-  if (fabs(a1-a2) < 0.000000001) {
-    if (fabs(b1-b2) < 0.000000001) {
+  if (fabs (a1-a2) < 0.000000001) {
+    if (fabs (b1-b2) < 0.000000001) {
       *cross = *p1a;
       return TRUE;
     } else {
@@ -1486,13 +1494,21 @@ intersection_line_line(Point *cross,
   }
 }
 
-/** Given three points, find the center of the circle they describe.
- * Returns FALSE if the center could not be determined (i.e. the points
- * all lie really close together).
+/**
+ * find_center_point:
+ *
+ * Given three points, find the center of the circle they describe.
+ *
  * The renderer should disappear once the debugging is done.
+ *
+ * Returns: %FALSE if the center could not be determined (i.e. the points
+ * all lie really close together).
  */
 static gboolean
-find_center_point(Point *center, const Point *p1, const Point *p2, const Point *p3)
+find_center_point (Point       *center,
+                   const Point *p1,
+                   const Point *p2,
+                   const Point *p3)
 {
   Point mid1;
   Point mid2;
@@ -1781,27 +1797,6 @@ get_text_width (DiaRenderer *renderer,
   return ret;
 }
 
-/*!
- * \brief Get drawing width in pixels if any
- * \memberof _DiaRenderer \pure
- */
-static int
-get_width_pixels (DiaRenderer *renderer)
-{
-  g_return_val_if_fail (renderer->is_interactive, 0);
-  return 0;
-}
-
-/*!
- * \brief Get drawing height in pixels if any
- * \memberof _DiaRenderer \pure
- */
-static int
-get_height_pixels (DiaRenderer *renderer)
-{
-  g_return_val_if_fail (renderer->is_interactive, 0);
-  return 0;
-}
 /*! @} */
 
 /*!
@@ -1839,28 +1834,6 @@ set_pattern (DiaRenderer *renderer, DiaPattern *pat)
              G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer)));
 }
 
-/*!
- * \brief Get the width in pixels of the drawing area (if any)
- *
- * \relates _DiaRenderer
- */
-int
-dia_renderer_get_width_pixels (DiaRenderer *renderer)
-{
-  return DIA_RENDERER_GET_CLASS(renderer)->get_width_pixels (renderer);
-}
-
-/*!
- * \brief Get the height in pixels of the drawing area (if any)
- *
- * \relates _DiaRenderer
- */
-int
-dia_renderer_get_height_pixels (DiaRenderer *renderer)
-{
-  return DIA_RENDERER_GET_CLASS(renderer)->get_height_pixels (renderer);
-}
-
 /*!
  * \brief Helper function to fill bezier with multiple BEZ_MOVE_TO
  * A slightly improved version to split a bezier with multiple move-to into
diff --git a/lib/diarenderer.h b/lib/diarenderer.h
index bb1b1002..80085687 100644
--- a/lib/diarenderer.h
+++ b/lib/diarenderer.h
@@ -51,20 +51,23 @@ typedef enum {
 
 GType dia_renderer_get_type (void) G_GNUC_CONST;
 
-/*!
- * \brief The member variables part of _DiaRenderer
+/**
+ * DiaRenderer:
+ * @font: the current #DiaFont
+ * @font_height: the height of @font
+ * @bezier: ???
+ *
+ * The member variables part of _DiaRenderer
  *
  * The Dia renderers are already realized with the GObject type system.
  * Most of the renderers are only used for export, but there are also
  * some renderers capable of interaction (i.e. display). These are
- * extended versions providing also the _DiaInteractiveRendererInterface
- *
- * \ingroup Renderers
+ * extended versions providing also the #DiaInteractiveRenderer
  */
 struct _DiaRenderer
 {
   GObject parent_instance; /*!< inheritance in object oriented C */
-  gboolean is_interactive; /*!< if the user can interact */
+
   /*< private >*/
   DiaFont *font;
   real font_height; /* IMO It should be possible use the font's size to keep
@@ -84,10 +87,6 @@ struct _DiaRendererClass
 {
   GObjectClass parent_class; /*!< the base class */
 
-  /*! return width in pixels, only for interactive renderers */
-  int (*get_width_pixels) (DiaRenderer*);
-  /*! return width in pixels, only for interactive renderers */
-  int (*get_height_pixels) (DiaRenderer*);
   /*! \brief Render all the visible object in the layer */
   void (*draw_layer) (DiaRenderer*, Layer *, gboolean, Rectangle *);
   /*! Calls the objects draw function, which calls the renderer again
@@ -263,92 +262,6 @@ struct _DiaRendererClass
                              DiaImage *image);
 };
 
-/*
- * Declare the Interactive Renderer Interface, which get's added
- * to some renderer classes by app/
- */
-#define DIA_TYPE_INTERACTIVE_RENDERER_INTERFACE     (dia_interactive_renderer_interface_get_type ())
-#define DIA_GET_INTERACTIVE_RENDERER_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), 
DIA_TYPE_INTERACTIVE_RENDERER_INTERFACE, DiaInteractiveRendererInterface))
-
-/*!
- * \brief Interface to be provide by interactive renderers
- *
- * The interactive renderer interface extends a renderer with clipping
- * and drawing with pixel coordinates.
- *
- * \ingroup Renderers
- */
-struct _DiaInteractiveRendererInterface
-{
-  GTypeInterface base_iface;
-
-  /*! Clear the current clipping region. */
-  void (*set_size)            (DiaRenderer *renderer, gpointer, int, int);
-
-  /*! Clear the current clipping region. */
-  void (*clip_region_clear)    (DiaRenderer *renderer);
-
-  /*! Add a rectangle to the current clipping region. */
-  void (*clip_region_add_rect) (DiaRenderer *renderer, Rectangle *rect);
-
-  /*! Draw a line from start to end, using color and the current line style */
-  void (*draw_pixel_line)      (DiaRenderer *renderer,
-                                int x1, int y1, int x2, int y2,
-                                Color *color);
-  /*! Draw a rectangle, given its upper-left and lower-right corners in pixels. */
-  void (*draw_pixel_rect)      (DiaRenderer *renderer,
-                                int x, int y, int width, int height,
-                                Color *color);
-  /*! Fill a rectangle, given its upper-left and lower-right corners in pixels. */
-  void (*fill_pixel_rect)      (DiaRenderer *renderer,
-                                int x, int y, int width, int height,
-                                Color *color);
-  /*! Copy already rendered content to the given context */
-  void (*paint)               (DiaRenderer *renderer,
-                               cairo_t     *ctx,
-                               int          width,
-                               int          height);
-  /*! Support for drawing selected objects highlighted */
-  void (*draw_object_highlighted) (DiaRenderer      *renderer,
-                                   DiaObject        *object,
-                                   DiaHighlightType  type);
-  /* Draw a selection box */
-  void (*set_selection)       (DiaRenderer *renderer,
-                               gboolean     has_selection,
-                               double       x,
-                               double       y,
-                               double       width,
-                               double       height);
-};
-
-GType dia_interactive_renderer_interface_get_type (void) G_GNUC_CONST;
-
-void dia_interactive_renderer_paint              (DiaRenderer *renderer,
-                                                  cairo_t     *ctx,
-                                                  int          width,
-                                                  int          height);
-void dia_interactive_renderer_set_selection      (DiaRenderer *renderer,
-                                                  gboolean     has_selection,
-                                                  double       x,
-                                                  double       y,
-                                                  double       width,
-                                                  double       height);
-/*!
- * \brief Size adjustment to the given window
- * \memberof DiaInteractiveRendererInterface
- */
-void dia_renderer_set_size          (DiaRenderer*, gpointer window, int, int);
-/*!
- * \brief Get the width in pixels
- * \memberof DiaInteractiveRendererInterface
- */
-int  dia_renderer_get_width_pixels  (DiaRenderer*);
-/*!
- * \brief Get the height in pixels
- * \memberof DiaInteractiveRendererInterface
- */
-int  dia_renderer_get_height_pixels (DiaRenderer*);
-
 /* Some standalone render helper functiions */
 void bezier_render_fill   (DiaRenderer *renderer, BezPoint *pts, int total, Color *color);
 void bezier_render_stroke (DiaRenderer *renderer, BezPoint *pts, int total, Color *color);
diff --git a/lib/layer.c b/lib/layer.c
index 6c6208c1..5f679cce 100644
--- a/lib/layer.c
+++ b/lib/layer.c
@@ -21,6 +21,7 @@
 #include "intl.h"
 #include "diagramdata.h"
 #include "diarenderer.h"
+#include "diainteractiverenderer.h"
 #include "dynamic_obj.h"
 
 static const Rectangle invalid_extents = { -1.0,-1.0,-1.0,-1.0 };
@@ -59,23 +60,26 @@ render_bounding_boxes (void)
 }
 
 /*!
- * \brief Render all components of a single layer.
+ * layer_render:
+ * @layer: The layer to render.
+ * @renderer: The renderer to draw things with.
+ * @update: The rectangle that requires update.  Only objects that
+ *  intersect with this rectangle will actually be get rendered.
+ * @obj_renderer: A function that will render an object.
+ * @data: The diagram that the layer belongs to.
+ * @active_layer: Which number layer in the diagram is currently active.
+ *
+ * Render all components of a single layer.
  *
  * This function also handles rendering of bounding boxes for debugging purposes.
- * @param layer The layer to render.
- * @param renderer The renderer to draw things with.
- * @param update The rectangle that requires update.  Only objects that
- *  intersect with this rectangle will actually be get rendered.
- * @param obj_renderer A function that will render an object.
- * @param data The diagram that the layer belongs to.
- * @param active_layer Which number layer in the diagram is currently active.
- * \memberof _Layer
  */
 void
-layer_render(Layer *layer, DiaRenderer *renderer, Rectangle *update,
-            ObjectRenderer obj_renderer,
-            gpointer data,
-            int active_layer)
+layer_render (Layer          *layer,
+              DiaRenderer    *renderer,
+              Rectangle      *update,
+              ObjectRenderer  obj_renderer,
+              gpointer        data,
+              int             active_layer)
 {
   GList *list;
   DiaObject *obj;
@@ -85,29 +89,29 @@ layer_render(Layer *layer, DiaRenderer *renderer, Rectangle *update,
 
   /* Draw all objects: */
   list = layer->objects;
-  while (list!=NULL) {
+  while (list != NULL) {
     obj = (DiaObject *) list->data;
 
-    if (update==NULL || rectangle_intersects(update, &obj->bounding_box)) {
-      if ((render_bounding_boxes()) && (renderer->is_interactive)) {
-       Point p1, p2;
-       Color col;
-       p1.x = obj->bounding_box.left;
-       p1.y = obj->bounding_box.top;
-       p2.x = obj->bounding_box.right;
-       p2.y = obj->bounding_box.bottom;
-       col.red = 1.0;
-       col.green = 0.0;
-       col.blue = 1.0;
-       col.alpha = 1.0;
-
-        DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer,0.01);
-       DIA_RENDERER_GET_CLASS(renderer)->draw_rect(renderer, &p1, &p2, NULL, &col);
+    if (update==NULL || rectangle_intersects (update, &obj->bounding_box)) {
+      if ((render_bounding_boxes ()) && DIA_IS_INTERACTIVE_RENDERER (renderer)) {
+        Point p1, p2;
+        Color col;
+        p1.x = obj->bounding_box.left;
+        p1.y = obj->bounding_box.top;
+        p2.x = obj->bounding_box.right;
+        p2.y = obj->bounding_box.bottom;
+        col.red = 1.0;
+        col.green = 0.0;
+        col.blue = 1.0;
+        col.alpha = 1.0;
+
+        DIA_RENDERER_GET_CLASS (renderer)->set_linewidth (renderer,0.01);
+        DIA_RENDERER_GET_CLASS (renderer)->draw_rect (renderer, &p1, &p2, NULL, &col);
       }
-      (*obj_renderer)(obj, renderer, active_layer, data);
+      (*obj_renderer) (obj, renderer, active_layer, data);
     }
 
-    list = g_list_next(list);
+    list = g_list_next (list);
   }
 }
 
diff --git a/lib/meson.build b/lib/meson.build
index 2e7f0ce9..a1ffa21f 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -69,6 +69,7 @@ libdia_sources = stdprop_sources + [
     'diarenderer.c',
     'diaimportrenderer.c',
     'diainteractiverenderer.c',
+    'diainteractiverenderer.h',
     'renderer/diacairo.c',
     'renderer/diacairo-renderer.c',
     'renderer/diacairo-interactive.c',
diff --git a/lib/renderer/diacairo-interactive.c b/lib/renderer/diacairo-interactive.c
index 628d6958..8950ce8c 100644
--- a/lib/renderer/diacairo-interactive.c
+++ b/lib/renderer/diacairo-interactive.c
@@ -30,6 +30,7 @@
 #include "diatransform.h"
 #include "object.h"
 #include "textline.h"
+#include "diainteractiverenderer.h"
 
 struct _DiaCairoInteractiveRenderer {
   DiaCairoRenderer parent_instance;
@@ -57,7 +58,7 @@ struct _DiaCairoInteractiveRenderer {
 static void dia_cairo_interactive_renderer_iface_init (DiaInteractiveRendererInterface* iface);
 
 G_DEFINE_TYPE_WITH_CODE (DiaCairoInteractiveRenderer, dia_cairo_interactive_renderer, 
DIA_CAIRO_TYPE_RENDERER,
-                         G_IMPLEMENT_INTERFACE (DIA_TYPE_INTERACTIVE_RENDERER_INTERFACE, 
dia_cairo_interactive_renderer_iface_init))
+                         G_IMPLEMENT_INTERFACE (DIA_TYPE_INTERACTIVE_RENDERER, 
dia_cairo_interactive_renderer_iface_init))
 
 enum {
   PROP_0,
@@ -69,9 +70,6 @@ static void
 dia_cairo_interactive_renderer_init (DiaCairoInteractiveRenderer *object)
 {
   DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
-  DiaRenderer *dia_renderer = DIA_RENDERER (object);
-
-  dia_renderer->is_interactive = 1;
 
   renderer->surface = NULL;
 
@@ -139,7 +137,7 @@ dia_cairo_interactive_renderer_get_property (GObject    *object,
 }
 
 static int
-dia_cairo_interactive_renderer_get_width_pixels (DiaRenderer *object)
+dia_cairo_interactive_renderer_get_width_pixels (DiaInteractiveRenderer *object)
 {
   DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
 
@@ -147,7 +145,7 @@ dia_cairo_interactive_renderer_get_width_pixels (DiaRenderer *object)
 }
 
 static int
-dia_cairo_interactive_renderer_get_height_pixels (DiaRenderer *object)
+dia_cairo_interactive_renderer_get_height_pixels (DiaInteractiveRenderer *object)
 {
   DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
 
@@ -350,9 +348,6 @@ dia_cairo_interactive_renderer_class_init (DiaCairoInteractiveRendererClass *kla
                                                          G_PARAM_READWRITE));
 
   /* renderer members */
-  renderer_class->get_width_pixels  = dia_cairo_interactive_renderer_get_width_pixels;
-  renderer_class->get_height_pixels = dia_cairo_interactive_renderer_get_height_pixels;
-
   renderer_class->begin_render = dia_cairo_interactive_renderer_begin_render;
   renderer_class->end_render   = dia_cairo_interactive_renderer_end_render;
 
@@ -363,7 +358,7 @@ dia_cairo_interactive_renderer_class_init (DiaCairoInteractiveRendererClass *kla
 }
 
 static void
-dia_cairo_interactive_renderer_clip_region_clear (DiaRenderer *object)
+dia_cairo_interactive_renderer_clip_region_clear (DiaInteractiveRenderer *object)
 {
   DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
 
@@ -375,8 +370,8 @@ dia_cairo_interactive_renderer_clip_region_clear (DiaRenderer *object)
 }
 
 static void
-dia_cairo_interactive_renderer_clip_region_add_rect (DiaRenderer *object,
-                                                     Rectangle   *rect)
+dia_cairo_interactive_renderer_clip_region_add_rect (DiaInteractiveRenderer *object,
+                                                     Rectangle              *rect)
 {
   DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
   cairo_rectangle_int_t clip_rect;
@@ -399,12 +394,12 @@ dia_cairo_interactive_renderer_clip_region_add_rect (DiaRenderer *object,
 }
 
 static void
-dia_cairo_interactive_renderer_draw_pixel_line (DiaRenderer *object,
-                                                int          x1,
-                                                int          y1,
-                                                int          x2,
-                                                int          y2,
-                                                Color       *color)
+dia_cairo_interactive_renderer_draw_pixel_line (DiaInteractiveRenderer *object,
+                                                int                     x1,
+                                                int                     y1,
+                                                int                     x2,
+                                                int                     y2,
+                                                Color                  *color)
 {
   DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object);
   double x1u = x1 + .5, y1u = y1 + .5, x2u = x2 + .5, y2u = y2 + .5;
@@ -424,12 +419,12 @@ dia_cairo_interactive_renderer_draw_pixel_line (DiaRenderer *object,
 }
 
 static void
-dia_cairo_interactive_renderer_draw_pixel_rect (DiaRenderer *object,
-                                                int          x,
-                                                int          y,
-                                                int          width,
-                                                int          height,
-                                                Color       *color)
+dia_cairo_interactive_renderer_draw_pixel_rect (DiaInteractiveRenderer *object,
+                                                int                     x,
+                                                int                     y,
+                                                int                     width,
+                                                int                     height,
+                                                Color                  *color)
 {
   DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object);
   double x1u = x + .5, y1u = y + .5, x2u = x + width + .5, y2u = y + height + .5;
@@ -448,12 +443,12 @@ dia_cairo_interactive_renderer_draw_pixel_rect (DiaRenderer *object,
 }
 
 static void
-dia_cairo_interactive_renderer_fill_pixel_rect (DiaRenderer *object,
-                                                int          x,
-                                                int          y,
-                                                int          width,
-                                                int          height,
-                                                Color       *color)
+dia_cairo_interactive_renderer_fill_pixel_rect (DiaInteractiveRenderer *object,
+                                                int                     x,
+                                                int                     y,
+                                                int                     width,
+                                                int                     height,
+                                                Color                  *color)
 {
   DiaCairoRenderer *renderer = DIA_CAIRO_RENDERER (object);
   double x1u = x + .5, y1u = y + .5, x2u = x + width + .5, y2u = y + height + .5;
@@ -472,10 +467,10 @@ dia_cairo_interactive_renderer_fill_pixel_rect (DiaRenderer *object,
 }
 
 static void
-dia_cairo_interactive_renderer_paint (DiaRenderer *object,
-                                      cairo_t     *ctx,
-                                      int          width,
-                                      int          height)
+dia_cairo_interactive_renderer_paint (DiaInteractiveRenderer *object,
+                                      cairo_t                *ctx,
+                                      int                     width,
+                                      int                     height)
 {
   DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
   double dashes[1] = {3};
@@ -512,10 +507,10 @@ dia_cairo_interactive_renderer_paint (DiaRenderer *object,
 }
 
 static void
-dia_cairo_interactive_renderer_set_size (DiaRenderer *object,
-                                         gpointer     window,
-                                         int          width,
-                                         int          height)
+dia_cairo_interactive_renderer_set_size (DiaInteractiveRenderer *object,
+                                         gpointer                window,
+                                         int                     width,
+                                         int                      height)
 {
   DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
   DiaCairoRenderer *base_renderer = DIA_CAIRO_RENDERER (object);
@@ -535,9 +530,9 @@ dia_cairo_interactive_renderer_set_size (DiaRenderer *object,
 static Color text_edit_color = {1.0, 1.0, 0.7 };
 
 static void
-dia_cairo_interactive_renderer_draw_object_highlighted (DiaRenderer      *self,
-                                                        DiaObject        *object,
-                                                        DiaHighlightType  type)
+dia_cairo_interactive_renderer_draw_object_highlighted (DiaInteractiveRenderer *self,
+                                                        DiaObject              *object,
+                                                        DiaHighlightType        type)
 {
   DiaCairoInteractiveRenderer *interactive = DIA_CAIRO_INTERACTIVE_RENDERER (self);
 
@@ -555,18 +550,18 @@ dia_cairo_interactive_renderer_draw_object_highlighted (DiaRenderer      *self,
   /* usually this method would need to draw the object twice,
    * once with highlight and once without. But due to our
    * draw_text_line implementation we only need one run */
-  dia_object_draw (object, self);
+  dia_object_draw (object, DIA_RENDERER (self));
   /* always reset when done with this object */
   interactive->highlight_color = NULL;
 }
 
 static void
-dia_cairo_interactive_renderer_set_selection (DiaRenderer *renderer,
-                                              gboolean     has_selection,
-                                              double       x,
-                                              double       y,
-                                              double       width,
-                                              double       height)
+dia_cairo_interactive_renderer_set_selection (DiaInteractiveRenderer *renderer,
+                                              gboolean                has_selection,
+                                              double                  x,
+                                              double                  y,
+                                              double                  width,
+                                              double                  height)
 {
   DiaCairoInteractiveRenderer *self = DIA_CAIRO_INTERACTIVE_RENDERER (renderer);
 
@@ -580,6 +575,8 @@ dia_cairo_interactive_renderer_set_selection (DiaRenderer *renderer,
 static void
 dia_cairo_interactive_renderer_iface_init (DiaInteractiveRendererInterface* iface)
 {
+  iface->get_width_pixels        = dia_cairo_interactive_renderer_get_width_pixels;
+  iface->get_height_pixels       = dia_cairo_interactive_renderer_get_height_pixels;
   iface->clip_region_clear       = dia_cairo_interactive_renderer_clip_region_clear;
   iface->clip_region_add_rect    = dia_cairo_interactive_renderer_clip_region_add_rect;
   iface->draw_pixel_line         = dia_cairo_interactive_renderer_draw_pixel_line;
diff --git a/lib/renderer/diacairo-renderer.c b/lib/renderer/diacairo-renderer.c
index 56467fc9..5c7af2e3 100644
--- a/lib/renderer/diacairo-renderer.c
+++ b/lib/renderer/diacairo-renderer.c
@@ -562,7 +562,7 @@ dia_cairo_renderer_set_font (DiaRenderer *self, DiaFont *font, real height)
   pango_font_description_free (pfd);
 
   /* for the interactive case we must maintain the font field in the base class */
-  if (self->is_interactive) {
+  if (DIA_IS_INTERACTIVE_RENDERER (self)) {
     dia_font_ref (font);
     if (self->font) {
       dia_font_unref (self->font);
diff --git a/lib/renderer/diacairo.h b/lib/renderer/diacairo.h
index 6cc5977c..1cd37e9b 100644
--- a/lib/renderer/diacairo.h
+++ b/lib/renderer/diacairo.h
@@ -21,6 +21,7 @@
 
 #include <cairo.h>
 #include "diarenderer.h"
+#include "diainteractiverenderer.h"
 
 /*
 #define DEBUG_CAIRO
@@ -41,8 +42,6 @@
 /* --- the renderer base class --- */
 G_BEGIN_DECLS
 
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (DiaRenderer, g_object_unref)
-
 #define DIA_CAIRO_TYPE_RENDERER dia_cairo_renderer_get_type ()
 
 G_DECLARE_FINAL_TYPE (DiaCairoRenderer, dia_cairo_renderer, DIA_CAIRO, RENDERER, DiaRenderer)
diff --git a/lib/text.c b/lib/text.c
index 137d0791..75f365ba 100644
--- a/lib/text.c
+++ b/lib/text.c
@@ -28,6 +28,7 @@
 #include "propinternals.h"
 #include "text.h"
 #include "diarenderer.h"
+#include "diainteractiverenderer.h"
 #include "diagramdata.h"
 #include "objchange.h"
 #include "textline.h"
@@ -556,9 +557,9 @@ text_distance_from(Text *text, Point *point)
 void
 text_draw(Text *text, DiaRenderer *renderer)
 {
-  DIA_RENDERER_GET_CLASS(renderer)->draw_text(renderer, text);
+  DIA_RENDERER_GET_CLASS (renderer)->draw_text (renderer, text);
 
-  if ((renderer->is_interactive) && (text->focus.has_focus)) {
+  if (DIA_IS_INTERACTIVE_RENDERER (renderer) && (text->focus.has_focus)) {
     real curs_x, curs_y;
     real str_width_first;
     real str_width_whole;
@@ -566,16 +567,16 @@ text_draw(Text *text, DiaRenderer *renderer)
     real height = text->ascent+text->descent;
     curs_y = text->position.y - text->ascent + text->cursor_row*text->height;
 
-    DIA_RENDERER_GET_CLASS(renderer)->set_font(renderer, text->font, text->height);
+    DIA_RENDERER_GET_CLASS (renderer)->set_font (renderer, text->font, text->height);
 
     str_width_first =
-      DIA_RENDERER_GET_CLASS(renderer)->get_text_width(renderer,
-                                                      text_get_line(text, text->cursor_row),
-                                                      text->cursor_pos);
+      DIA_RENDERER_GET_CLASS (renderer)->get_text_width (renderer,
+                                                         text_get_line (text, text->cursor_row),
+                                                         text->cursor_pos);
     str_width_whole =
-      DIA_RENDERER_GET_CLASS(renderer)->get_text_width(renderer,
-                                                      text_get_line(text, text->cursor_row),
-                                                      text_get_line_strlen(text, text->cursor_row));
+      DIA_RENDERER_GET_CLASS (renderer)->get_text_width (renderer,
+                                                         text_get_line (text, text->cursor_row),
+                                                         text_get_line_strlen (text, text->cursor_row));
     curs_x = text->position.x + str_width_first;
 
     switch (text->alignment) {
@@ -664,8 +665,9 @@ text_move_cursor(Text *text, CursorMovement mv)
 /* The renderer is only used to determine where the click is, so is not
  * required when no point is given. */
 void
-text_set_cursor(Text *text, Point *clicked_point,
-               DiaRenderer *renderer)
+text_set_cursor (Text        *text,
+                 Point       *clicked_point,
+                 DiaRenderer *renderer)
 {
   real str_width_whole;
   real str_width_first;
@@ -688,18 +690,18 @@ text_set_cursor(Text *text, Point *clicked_point,
     text->cursor_row = row;
     text->cursor_pos = 0;
 
-    if (!renderer->is_interactive) {
-      g_warning("Internal error: Select gives non interactive renderer!\n"
-               "val: %d\n", renderer->is_interactive);
+    if (!DIA_IS_INTERACTIVE_RENDERER (renderer)) {
+      g_warning ("Internal error: Select gives non interactive renderer!\n"
+                 "renderer: %s", g_type_name (G_TYPE_FROM_INSTANCE (renderer)));
       return;
     }
 
 
-    DIA_RENDERER_GET_CLASS(renderer)->set_font(renderer, text->font, text->height);
+    DIA_RENDERER_GET_CLASS (renderer)->set_font (renderer, text->font, text->height);
     str_width_whole =
-      DIA_RENDERER_GET_CLASS(renderer)->get_text_width(renderer,
-                                                      text_get_line(text, row),
-                                                      text_get_line_strlen(text, row));
+      DIA_RENDERER_GET_CLASS (renderer)->get_text_width (renderer,
+                                                         text_get_line (text, row),
+                                                         text_get_line_strlen (text, row));
     start_x = text->position.x;
     switch (text->alignment) {
     case ALIGN_LEFT:
diff --git a/objects/GRAFCET/action_text_draw.c b/objects/GRAFCET/action_text_draw.c
index d5565c6c..0aeadc53 100644
--- a/objects/GRAFCET/action_text_draw.c
+++ b/objects/GRAFCET/action_text_draw.c
@@ -29,10 +29,11 @@
 
 #include "geometry.h"
 #include "diarenderer.h"
+#include "diainteractiverenderer.h"
 #include "text.h"
 #include "action_text_draw.h"
 
-/* This used to be really horrible code. Really. 
+/* This used to be really horrible code. Really.
    Now it's just a code fork. */
 
 void
@@ -44,7 +45,7 @@ action_text_draw(Text *text, DiaRenderer *renderer)
   real space_width;
 
   renderer_ops->set_font(renderer, text->font, text->height);
-  
+
   pos = text->position;
 
   space_width = action_text_spacewidth(text);
@@ -59,7 +60,7 @@ action_text_draw(Text *text, DiaRenderer *renderer)
       2 * space_width;
   }
 
-  if ((renderer->is_interactive) && (text->focus.has_focus)) {
+  if (DIA_IS_INTERACTIVE_RENDERER (renderer) && (text->focus.has_focus)) {
     real curs_x, curs_y;
     real str_width_first;
     real str_width_whole;
@@ -97,7 +98,7 @@ action_text_draw(Text *text, DiaRenderer *renderer)
     p1.y = curs_y;
     p2.x = curs_x;
     p2.y = curs_y + text->height;
-    
+
     renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID, 0.0);
     renderer_ops->set_linewidth(renderer, 0.1);
     renderer_ops->draw_line(renderer, &p1, &p2, &color_black);
diff --git a/objects/standard/arc.c b/objects/standard/arc.c
index 2ac4bdcd..e158fb25 100644
--- a/objects/standard/arc.c
+++ b/objects/standard/arc.c
@@ -29,6 +29,7 @@
 #include "connection.h"
 #include "connectionpoint.h"
 #include "diarenderer.h"
+#include "diainteractiverenderer.h"
 #include "attributes.h"
 #include "arrows.h"
 #include "properties.h"
@@ -629,36 +630,41 @@ arc_draw(Arc *arc, DiaRenderer *renderer)
     real angle1 = arc->curve_distance > 0.0 ? arc->angle1 : arc->angle2;
     real angle2 = arc->curve_distance > 0.0 ? arc->angle2 : arc->angle1;
     /* make it direction aware */
-    if (arc->curve_distance > 0.0 && angle2 < angle1)
+    if (arc->curve_distance > 0.0 && angle2 < angle1) {
       angle1 -= 360.0;
-    else if (arc->curve_distance < 0.0 && angle2 > angle1)
+    } else if (arc->curve_distance < 0.0 && angle2 > angle1) {
       angle2 -= 360.0;
-    renderer_ops->draw_arc(renderer, &arc->center_handle.pos,
-                          arc->radius*2.0, arc->radius*2.0,
-                          angle1, angle2,
-                          &arc->arc_color);
+    }
+    renderer_ops->draw_arc (renderer,
+                            &arc->center_handle.pos,
+                            arc->radius*2.0,
+                            arc->radius*2.0,
+                            angle1,
+                            angle2,
+                            &arc->arc_color);
   } else {
-    renderer_ops->draw_arc_with_arrows(renderer,
-                                       &gaptmp[0],
-                                       &gaptmp[1],
-                                       &gaptmp[2],
-                                       arc->line_width,
-                                       &arc->arc_color,
-                                       &arc->start_arrow,
-                                       &arc->end_arrow);
+    renderer_ops->draw_arc_with_arrows (renderer,
+                                        &gaptmp[0],
+                                        &gaptmp[1],
+                                        &gaptmp[2],
+                                        arc->line_width,
+                                        &arc->arc_color,
+                                        &arc->start_arrow,
+                                        &arc->end_arrow);
   }
-  if (renderer->is_interactive &&
-      dia_object_is_selected(&arc->connection.object)) {
+
+  if (DIA_IS_INTERACTIVE_RENDERER (renderer) &&
+      dia_object_is_selected (&arc->connection.object)) {
     /* draw the central angle */
     Color line_color = { 0.0, 0.0, 0.6, 1.0 };
 
-    renderer_ops->set_linewidth(renderer, 0);
-    renderer_ops->set_linestyle(renderer, LINESTYLE_DOTTED, 1);
-    renderer_ops->set_linejoin(renderer, LINEJOIN_MITER);
-    renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
+    renderer_ops->set_linewidth (renderer, 0);
+    renderer_ops->set_linestyle (renderer, LINESTYLE_DOTTED, 1);
+    renderer_ops->set_linejoin (renderer, LINEJOIN_MITER);
+    renderer_ops->set_linecaps (renderer, LINECAPS_BUTT);
 
-    renderer_ops->draw_line(renderer, &endpoints[0], &arc->center, &line_color);
-    renderer_ops->draw_line(renderer, &endpoints[1], &arc->center, &line_color);
+    renderer_ops->draw_line (renderer, &endpoints[0], &arc->center, &line_color);
+    renderer_ops->draw_line (renderer, &endpoints[1], &arc->center, &line_color);
   }
 }
 
diff --git a/objects/standard/bezier.c b/objects/standard/bezier.c
index 7227f9b2..3c9d0006 100644
--- a/objects/standard/bezier.c
+++ b/objects/standard/bezier.c
@@ -29,6 +29,7 @@
 #include "bezier_conn.h"
 #include "connectionpoint.h"
 #include "diarenderer.h"
+#include "diainteractiverenderer.h"
 #include "attributes.h"
 #include "diamenu.h"
 #include "properties.h"
@@ -420,7 +421,7 @@ bezierline_draw(Bezierline *bezierline, DiaRenderer *renderer)
    * whether the object is currently selected in bezierline_select, and
    * only checking while selected.  But we'll do that if needed.
    */
-  if (renderer->is_interactive &&
+  if (DIA_IS_INTERACTIVE_RENDERER (renderer) &&
       dia_object_is_selected(&bezierline->bez.object)) {
     bezier_draw_control_lines(bezierline->bez.bezier.num_points, bezierline->bez.bezier.points, renderer);
   }
diff --git a/objects/standard/beziergon.c b/objects/standard/beziergon.c
index 2f6c6934..e2830289 100644
--- a/objects/standard/beziergon.c
+++ b/objects/standard/beziergon.c
@@ -29,6 +29,7 @@
 #include "beziershape.h"
 #include "connectionpoint.h"
 #include "diarenderer.h"
+#include "diainteractiverenderer.h"
 #include "attributes.h"
 #include "diamenu.h"
 #include "properties.h"
@@ -241,8 +242,8 @@ beziergon_draw(Beziergon *beziergon, DiaRenderer *renderer)
   /* these lines should only be displayed when object is selected.
    * Unfortunately the draw function is not aware of the selected
    * state.  This is a compromise until I fix this properly. */
-  if (renderer->is_interactive &&
-      dia_object_is_selected((DiaObject*)beziergon)) {
+  if (DIA_IS_INTERACTIVE_RENDERER (renderer) &&
+      dia_object_is_selected (DIA_OBJECT (beziergon))) {
     bezier_draw_control_lines (beziergon->bezier.bezier.num_points, beziergon->bezier.bezier.points, 
renderer);
   }
 }
diff --git a/objects/standard/textobj.c b/objects/standard/textobj.c
index c478c866..120965de 100644
--- a/objects/standard/textobj.c
+++ b/objects/standard/textobj.c
@@ -25,6 +25,7 @@
 #include "object.h"
 #include "connectionpoint.h"
 #include "diarenderer.h"
+#include "diainteractiverenderer.h"
 #include "font.h"
 #include "text.h"
 #include "attributes.h"
@@ -309,9 +310,9 @@ textobj_draw(Textobj *textobj, DiaRenderer *renderer)
     DIA_RENDERER_GET_CLASS (renderer)->draw_rotated_text (renderer, textobj->text,
                                                          &textobj->text_handle.pos, textobj->text_angle);
     /* XXX: interactive case not working correctly */
-    if (renderer->is_interactive &&
+    if (DIA_IS_INTERACTIVE_RENDERER (renderer) &&
         dia_object_is_selected(&textobj->object) &&
-       textobj->text->focus.has_focus) {
+        textobj->text->focus.has_focus) {
       /* editing is not rotated */
       text_draw(textobj->text, renderer);
     }



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