[dia] [restructuring] connect to canvas configure-event ...



commit 7b6d4035004bfa6e35a03fc6f09f9751c9a14a9f
Author: Hans Breuer <hans breuer org>
Date:   Sun Aug 12 16:11:10 2012 +0200

    [restructuring] connect to canvas configure-event ...
    
    To setup the initial renderer with the correct size. Also this
    allows to remove some more integrated UI specific code (hack),
    which sometimes triggered a runtime warning. Finally the main
    display event handler (ddisplay_canvas_events) got a bit shorter
    and more portable between Gtk versions.

 app/disp_callbacks.c |   22 --------------------
 app/display.c        |   12 +++++++---
 app/interface.c      |   53 +++++++++++++++++++++++++++++++++++++++++++------
 3 files changed, 54 insertions(+), 33 deletions(-)
---
diff --git a/app/disp_callbacks.c b/app/disp_callbacks.c
index 273c131..430bdb6 100644
--- a/app/disp_callbacks.c
+++ b/app/disp_callbacks.c
@@ -635,28 +635,6 @@ ddisplay_canvas_events (GtkWidget *canvas,
         ddisplay_flush (ddisp);
         break;
 
-      case GDK_CONFIGURE:
-        if (ddisp->renderer != NULL) {
-	  width = dia_renderer_get_width_pixels (ddisp->renderer);
-	  height = dia_renderer_get_height_pixels (ddisp->renderer);
-          new_size = ((width != ddisp->canvas->allocation.width) ||
-                      (height != ddisp->canvas->allocation.height));
-        } else {
-          new_size = TRUE;
-        }
-        if (new_size) {
-          ddisplay_resize_canvas(ddisp,
-                                 ddisp->canvas->allocation.width,
-                                 ddisp->canvas->allocation.height);
-          ddisplay_update_scrollbars(ddisp);
-        }
-	/* 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);
-        break;
-
       case GDK_FOCUS_CHANGE: {
 	GdkEventFocus *focus = (GdkEventFocus*)event;
 	hold_remove_handler();
diff --git a/app/display.c b/app/display.c
index 29293b1..d822dce 100644
--- a/app/display.c
+++ b/app/display.c
@@ -192,10 +192,6 @@ initialize_display_widgets(DDisplay *ddisp)
 
   ddisplay_update_statusbar (ddisp);
 
-  ddisplay_set_origo(ddisp, ddisp->visible.left, ddisp->visible.top);
-  ddisplay_update_scrollbars(ddisp);
-  ddisplay_add_update_all(ddisp);
-
   ddisplay_set_cursor(ddisp, current_cursor);
 
   if (!input_methods_done) {
@@ -558,6 +554,8 @@ ddisplay_update_handler(DDisplay *ddisp)
   Rectangle *r, totrect;
   DiaInteractiveRendererInterface *renderer;
 
+  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);
 
@@ -624,6 +622,10 @@ ddisplay_flush(DDisplay *ddisp)
    */
   if (!ddisp->update_id)
     ddisp->update_id = g_idle_add_full (G_PRIORITY_HIGH_IDLE+15, (GSourceFunc)ddisplay_update_handler, ddisp, NULL);
+  if (ddisp->display_areas) {
+    IRectangle *r = (IRectangle *)ddisp->display_areas->data;
+    g_print ("DispUpdt: %4d,%3d - %4d,%3d\n", r->left, r->top, r->right, r->bottom);
+  }
 }
 
 static void
@@ -748,6 +750,8 @@ ddisplay_set_origo(DDisplay *ddisp, coord x, coord y)
   Rectangle *visible = &ddisp->visible;
   int width, height;
 
+  g_return_if_fail (ddisp->renderer != NULL);
+
   /*  updaterar origo+visible+rulers */
   ddisp->origo.x = x;
   ddisp->origo.y = y;
diff --git a/app/interface.c b/app/interface.c
index f65445d..6c5113d 100644
--- a/app/interface.c
+++ b/app/interface.c
@@ -342,6 +342,50 @@ close_notebook_page_callback (GtkButton *button,
   ddisplay_close (ddisp);
 }
 
+/*!
+ * Called when the widget's window "size, position or stacking"
+ * changes. Needs GDK_STRUCTURE_MASK set.
+ */
+static gboolean
+canvas_configure_event (GtkWidget         *widget,
+			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);
+  } else {
+    /* We can continue even without a renderer here because
+     * ddisplay_resize_canvas () does the setup for us.
+     */
+    width = height = 0;
+  }
+
+  /* Only do this when size is really changing */
+  if (width != cevent->width || height != cevent->height) {
+    g_print ("Canvas size change...\n");
+    ddisplay_resize_canvas (ddisp, cevent->width, cevent->height);
+    ddisplay_update_scrollbars(ddisp);
+    /* on resize stop further propagation - does not help */
+    new_size = TRUE;
+  }
+
+  /* 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);
+
+  /* continue propagation with FALSE */
+  return new_size;
+}
+
 static GtkWidget *
 create_canvas (DDisplay *ddisp)
 {
@@ -356,6 +400,8 @@ create_canvas (DDisplay *ddisp)
 			 GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | 
 			 GDK_STRUCTURE_MASK | GDK_ENTER_NOTIFY_MASK |
 			 GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
+  g_signal_connect (G_OBJECT (canvas), "configure-event",
+		    G_CALLBACK (canvas_configure_event), ddisp);
 #if GTK_CHECK_VERSION(2,18,0)
   gtk_widget_set_can_focus (canvas, TRUE);
 #else
@@ -572,13 +618,6 @@ use_integrated_ui_for_display_shell(DDisplay *ddisp, char *title)
   integrated_ui_toolbar_grid_snap_synchronize_to_display (ddisp);
   integrated_ui_toolbar_object_snap_synchronize_to_display (ddisp);
 
-  /* TODO: Figure out how to detect if anti-aliased renderer was set */
-  /** For the distributed display this is called when the ddisp->canvas is shown.
-   * The show causes a GDK_CONFIGURE event but this is not happening here.  If this
-   * is not set a seg-fault occurs when dia_renderer_get_width_pixels() is called
-   */
-  ddisplay_set_renderer(ddisp, ddisp->aa_renderer);
-
   /*  set the focus to the canvas area  */
   gtk_widget_grab_focus (ddisp->canvas);
 }



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