- 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>
+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
#include "vikfilelist.h"
#include <string.h>
-static VikLayer *trigger = NULL;
-
/* functions common to all layers. */
/* TODO longone: rename interface free -> finalize */
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 );
}
}
*/
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 )
{
gboolean only_updating_coord_mode_ui; /* hack for a bug in GTK */
GtkUIManager *uim;
+
+ /* half-drawn update */
+ VikLayer *trigger;
+ VikCoord trigger_center;
};
enum {
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 );
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