[dia] [restructuring] connect to canvas configure-event ...
- From: Hans Breuer <hans src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dia] [restructuring] connect to canvas configure-event ...
- Date: Sun, 19 Aug 2012 17:38:46 +0000 (UTC)
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]