]> git.street.me.uk Git - andy/viking.git/commitdiff
Disable half-drawn update mode when the center is moved.
authorQuy Tonthat <qtonthat@gmail.com>
Mon, 1 Oct 2007 14:10:26 +0000 (14:10 +0000)
committerQuy Tonthat <qtonthat@gmail.com>
Mon, 1 Oct 2007 14:10:26 +0000 (14:10 +0000)
- When the center of the viewport is moved, all layers need to be redrawn.
- Data for half-drawn are now in VikWindow where they belong. Having had
  "trigger" as a static variable in viklayer would cause problems when
  viking has more than one windows.

Signed-off-by: Quy Tonthat <qtonthat@gmail.com>
ChangeLog
src/viklayer.c
src/vikwindow.c
src/vikwindow.h

index b96166047a7e7ccdf861bafc3d07d26e6e08bdcf..6d35a94dba1198beee85ac96b054b939f12c068b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2007-10-01
+Quy Tonthat <qtonthat@gmail.com>:
+       * Disable half-drawn update when the center is moved. Avoid using
+       static "trigger" in viklayer.c which causes problems when viking
+       has more than one windows.
+
 2007-09-28
 Quy Tonthat <qtonthat@gmail.com>:
        * Fix bug that caused Elevation graph not working properly with some
index 0962577f3e6cb62e3ec69a7bcdab2e22f655addc..cc4f87a328b3f8d5338e6091b2798f9b263be140 100644 (file)
@@ -24,8 +24,6 @@
 #include "vikfilelist.h"
 #include <string.h>
 
-static VikLayer *trigger = NULL;
-
 /* functions common to all layers. */
 /* TODO longone: rename interface free -> finalize */
 
@@ -95,7 +93,7 @@ static void layer_class_init (VikLayerClass *klass)
 void vik_layer_emit_update ( VikLayer *vl )
 {
   if ( vl->visible ) {
-    trigger = vl;
+    vik_window_set_redraw_trigger(vl);
     g_signal_emit ( G_OBJECT(vl), layer_signals[VL_UPDATE_SIGNAL], 0 );
   }
 }
@@ -105,17 +103,10 @@ void vik_layer_emit_update ( VikLayer *vl )
  */
 void vik_layer_emit_update_although_invisible ( VikLayer *vl )
 {
-  trigger = vl;
+  vik_window_set_redraw_trigger(vl);
   g_signal_emit ( G_OBJECT(vl), layer_signals[VL_UPDATE_SIGNAL], 0 );
 }
 
-VikLayer *vik_layer_get_and_reset_trigger()
-{
-  VikLayer *rv = trigger;
-  trigger = NULL;
-  return rv;
-}
-
 /* doesn't set the trigger. should be done by aggregate layer when child emits update. */
 void vik_layer_emit_update_secondary ( VikLayer *vl )
 {
index 776f4101972a9e0ea2c1b9cad5b8fdcf2b3f6715..cc170a661418d7b5f286b4e9649236c80f3f0900 100644 (file)
@@ -146,6 +146,10 @@ struct _VikWindow {
 
   gboolean only_updating_coord_mode_ui; /* hack for a bug in GTK */
   GtkUIManager *uim;
+
+  /* half-drawn update */
+  VikLayer *trigger;
+  VikCoord trigger_center;
 };
 
 enum {
@@ -367,14 +371,23 @@ static void draw_status ( VikWindow *vw )
   vik_statusbar_set_message ( vw->viking_vs, 2, zoom_level );
 }
 
+void vik_window_set_redraw_trigger(VikLayer *vl)
+{
+  VikWindow *vw = VIK_WINDOW(VIK_GTK_WINDOW_FROM_LAYER(vl));
+  vw->trigger = vl;
+}
+
 static void draw_redraw ( VikWindow *vw )
 {
-  VikLayer *new_trigger = vik_layer_get_and_reset_trigger();
+  VikCoord old_center = vw->trigger_center;
+  vw->trigger_center = *(vik_viewport_get_center(vw->viking_vvp));
+  VikLayer *new_trigger = vw->trigger;
+  vw->trigger = NULL;
   VikLayer *old_trigger = VIK_LAYER(vik_viewport_get_trigger(vw->viking_vvp));
 
   if ( ! new_trigger )
     ; /* do nothing -- have to redraw everything. */
-  else if ( old_trigger != new_trigger )
+  else if ( (old_trigger != new_trigger) || !vik_coord_equals(&old_center, &vw->trigger_center) )
     vik_viewport_set_trigger ( vw->viking_vvp, new_trigger ); /* todo: set to half_drawn mode if new trigger is above old */
   else
     vik_viewport_set_half_drawn ( vw->viking_vvp, TRUE );
index 2a61bb04b124c9eacf281f7a63bd36632471e374..24d20f57e71fa78d646ccc16da911856e4dd4176 100644 (file)
@@ -55,6 +55,7 @@ void vik_window_open_file ( VikWindow *vw, const gchar *filename, gboolean chang
 struct _VikLayer;
 void vik_window_selected_layer(VikWindow *vw, struct _VikLayer *vl);
 struct _VikViewport * vik_window_viewport(VikWindow *vw);
+void vik_window_set_redraw_trigger(struct _VikLayer *vl);
 
 G_END_DECLS