From e4a4b3e752a1ca4570139a48aa2f672523d9f514 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Mon, 9 Aug 2004 10:29:07 +0000
Subject: [PATCH] - fixed a couple of gcc warnings + added missing o->end() in 
  jf's StructuralSolver plugin

- fixed the view option code: FLTK > 1.1.5rc1 breaks our use of
  widget->changed()...

- added background mesh support in the aniso algorithm
---
 Fltk/Callbacks.cpp           | 592 +++++++++++++++++++----------------
 Fltk/Callbacks.h             |   1 -
 Fltk/GUI.cpp                 |  73 +----
 Fltk/GUI.h                   |  13 +-
 Mesh/2D_Mesh_Aniso.cpp       |  13 +-
 Plugin/Plugin.h              |   2 +-
 Plugin/StructuralSolver.cpp  |   7 +-
 Plugin/StructuralSolver.h    |   4 +-
 doc/texinfo/gmsh.texi        |   6 +-
 doc/texinfo/opt_general.texi |   2 +-
 10 files changed, 356 insertions(+), 357 deletions(-)

diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 808850d320..77568f36ad 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.262 2004-08-06 14:48:32 remacle Exp $
+// $Id: Callbacks.cpp,v 1.263 2004-08-09 10:29:07 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -239,11 +239,6 @@ void color_cb(CALLBACK_ARGS)
   Draw();
 }
 
-void set_changed_cb(CALLBACK_ARGS)
-{
-  w->set_changed();
-}
-
 void redraw_cb(CALLBACK_ARGS)
 {
   Draw();
@@ -3310,8 +3305,6 @@ void view_options_custom_cb(CALLBACK_ARGS)
     WID->view_value[31]->deactivate();
     WID->view_value[32]->deactivate();
   }
-
-  if(w) w->set_changed();
 }
 
 void view_options_timestep_cb(CALLBACK_ARGS)
@@ -3364,324 +3357,393 @@ void view_options_ok_cb(CALLBACK_ARGS)
 
   links = (int)opt_post_link(0, GMSH_GET, 0);
 
+  // get the old values for the current view
+  int current = (long int)data;
+
+  double scale_type = opt_view_scale_type(current, GMSH_GET, 0);
+  double intervals_type = opt_view_intervals_type(current, GMSH_GET, 0);
+  double point_type = opt_view_point_type(current, GMSH_GET, 0);
+  double line_type = opt_view_line_type(current, GMSH_GET, 0);
+  double vector_type = opt_view_vector_type(current, GMSH_GET, 0);
+  double arrow_location = opt_view_arrow_location(current, GMSH_GET, 0);
+  double tensor_type = opt_view_tensor_type(current, GMSH_GET, 0);
+  double range_type = opt_view_range_type(current, GMSH_GET, 0);
+  double grid = opt_view_grid(current, GMSH_GET, 0);
+  double boundary = opt_view_boundary(current, GMSH_GET, 0);
+
+  double type = opt_view_type(current, GMSH_GET, 0);
+  double saturate_values = opt_view_saturate_values(current, GMSH_GET, 0);
+  double show_element = opt_view_show_element(current, GMSH_GET, 0);
+  double show_scale = opt_view_show_scale(current, GMSH_GET, 0);
+  double auto_position = opt_view_auto_position(current, GMSH_GET, 0);
+  double show_time = opt_view_show_time(current, GMSH_GET, 0);
+  double draw_strings = opt_view_draw_strings(current, GMSH_GET, 0);
+  double light = opt_view_light(current, GMSH_GET, 0);
+  double light_two_side = opt_view_light_two_side(current, GMSH_GET, 0);
+  double smooth_normals = opt_view_smooth_normals(current, GMSH_GET, 0);
+  double draw_points = opt_view_draw_points(current, GMSH_GET, 0);
+  double draw_lines = opt_view_draw_lines(current, GMSH_GET, 0);
+  double draw_triangles = opt_view_draw_triangles(current, GMSH_GET, 0);
+  double draw_quadrangles = opt_view_draw_quadrangles(current, GMSH_GET, 0);
+  double draw_tetrahedra = opt_view_draw_tetrahedra(current, GMSH_GET, 0);
+  double draw_hexahedra = opt_view_draw_hexahedra(current, GMSH_GET, 0);
+  double draw_prisms = opt_view_draw_prisms(current, GMSH_GET, 0);
+  double draw_pyramids = opt_view_draw_pyramids(current, GMSH_GET, 0);
+  double draw_scalars = opt_view_draw_scalars(current, GMSH_GET, 0);
+  double draw_vectors = opt_view_draw_vectors(current, GMSH_GET, 0);
+  double draw_tensors = opt_view_draw_tensors(current, GMSH_GET, 0);
+
+  double custom_min = opt_view_custom_min(current, GMSH_GET, 0);
+  double custom_max = opt_view_custom_max(current, GMSH_GET, 0);
+  double nb_iso = opt_view_nb_iso(current, GMSH_GET, 0);
+  double offset0 = opt_view_offset0(current, GMSH_GET, 0);
+  double offset1 = opt_view_offset1(current, GMSH_GET, 0);
+  double offset2 = opt_view_offset2(current, GMSH_GET, 0);
+  double raise0 = opt_view_raise0(current, GMSH_GET, 0);
+  double raise1 = opt_view_raise1(current, GMSH_GET, 0);
+  double raise2 = opt_view_raise2(current, GMSH_GET, 0);
+  double timestep = opt_view_timestep(current, GMSH_GET, 0);
+  double arrow_size = opt_view_arrow_size(current, GMSH_GET, 0);
+  double displacement_factor = opt_view_displacement_factor(current, GMSH_GET, 0);
+  double point_size = opt_view_point_size(current, GMSH_GET, 0);
+  double line_width = opt_view_line_width(current, GMSH_GET, 0);
+  double explode = opt_view_explode(current, GMSH_GET, 0);
+  double angle_smooth_normals = opt_view_angle_smooth_normals(i, GMSH_GET, 0);
+  double position0 = opt_view_position0(current, GMSH_GET, 0);
+  double position1 = opt_view_position1(current, GMSH_GET, 0);
+  double size0 = opt_view_size0(current, GMSH_GET, 0);
+  double size1 = opt_view_size1(current, GMSH_GET, 0);
+  double nb_abscissa = opt_view_nb_abscissa(current, GMSH_GET, 0);
+
+  char name[256];
+  strcpy(name, opt_view_name(current, GMSH_GET, NULL));
+  char format[256];
+  strcpy(format, opt_view_format(current, GMSH_GET, NULL));
+  char abscissa_name[256];
+  strcpy(abscissa_name, opt_view_abscissa_name(current, GMSH_GET, NULL));
+  char abscissa_format[256];
+  strcpy(abscissa_format, opt_view_abscissa_format(current, GMSH_GET, NULL));
+
+  // modify only the views that need to be updated
   for(i = 0; i < List_Nbr(CTX.post.list); i++) {
     if((links == 2 || links == 4) ||
        ((links == 1 || links == 3) && opt_view_visible(i, GMSH_GET, 0)) ||
-       (links == 0 && i == (long int)data)) {
+       (links == 0 && i == current)) {
 
       if(links == 3 || links == 4)
         force = 1;
 
-      // view_choice
+      double val;
 
-      if(force || WID->view_choice[1]->changed()) {
-        int val;
-        switch (WID->view_choice[1]->value()) {
-        case 0:
-          val = DRAW_POST_LINEAR;
-          break;
-        case 1:
-          val = DRAW_POST_LOGARITHMIC;
-          break;
-        default:
-          val = DRAW_POST_DOUBLELOGARITHMIC;
-          break;
-        }
-        opt_view_scale_type(i, GMSH_SET, val);
-      }
+      // view_choice
 
-      if(force || WID->view_choice[0]->changed()) {
-        int val;
-        switch (WID->view_choice[0]->value()) {
-        case 0:
-          val = DRAW_POST_ISO;
-          break;
-        case 1:
-          val = DRAW_POST_DISCRETE;
-          break;
-        case 2:
-          val = DRAW_POST_CONTINUOUS;
-          break;
-        default:
-          val = DRAW_POST_NUMERIC;
-          break;
-        }
-        opt_view_intervals_type(i, GMSH_SET, val);
+      switch (WID->view_choice[1]->value()) {
+      case 0:
+	val = DRAW_POST_LINEAR;
+	break;
+      case 1:
+	val = DRAW_POST_LOGARITHMIC;
+	break;
+      default:
+	val = DRAW_POST_DOUBLELOGARITHMIC;
+	break;
       }
+      if(force || (val != scale_type))
+        opt_view_scale_type(i, GMSH_SET, val);
 
-      if(force || WID->view_choice[5]->changed()) {
-        int val;
-        switch (WID->view_choice[5]->value()) {
-        case 0:
-          val = 0;
-          break;
-        default:
-          val = 1;
-          break;
-        }
-        opt_view_point_type(i, GMSH_SET, val);
+      switch (WID->view_choice[0]->value()) {
+      case 0:
+	val = DRAW_POST_ISO;
+	break;
+      case 1:
+	val = DRAW_POST_DISCRETE;
+	break;
+      case 2:
+	val = DRAW_POST_CONTINUOUS;
+	break;
+      default:
+	val = DRAW_POST_NUMERIC;
+	break;
       }
-
-      if(force || WID->view_choice[6]->changed()) {
-        int val;
-        switch (WID->view_choice[6]->value()) {
-        case 0:
-          val = 0;
-          break;
-        default:
-          val = 1;
-          break;
-        }
+      if(force || (val != intervals_type))
+	opt_view_intervals_type(i, GMSH_SET, val);
+      
+      val = WID->view_choice[5]->value();
+      if(force || (val != point_type))
+	opt_view_point_type(i, GMSH_SET, val);
+      
+      val = WID->view_choice[6]->value();
+      if(force || (val != line_type))
         opt_view_line_type(i, GMSH_SET, val);
-      }
 
-      if(force || WID->view_choice[2]->changed()) {
-        int val;
-        switch (WID->view_choice[2]->value()) {
-        case 0:
-          val = DRAW_POST_SEGMENT;
-          break;
-        case 1:
-          val = DRAW_POST_ARROW;
-          break;
-        case 2:
-          val = DRAW_POST_PYRAMID;
-          break;
-        case 4:
-          val = DRAW_POST_DISPLACEMENT;
-	  break;
-	default: // 3
-          val = DRAW_POST_ARROW3D;
-          break;
-        }
-        opt_view_vector_type(i, GMSH_SET, val);
+      switch (WID->view_choice[2]->value()) {
+      case 0:
+	val = DRAW_POST_SEGMENT;
+	break;
+      case 1:
+	val = DRAW_POST_ARROW;
+	break;
+      case 2:
+	val = DRAW_POST_PYRAMID;
+	break;
+      case 4:
+	val = DRAW_POST_DISPLACEMENT;
+	break;
+      default: // 3
+	val = DRAW_POST_ARROW3D;
+	break;
       }
+      if(force || (val != vector_type))
+        opt_view_vector_type(i, GMSH_SET, val);
 
-      if(force || WID->view_choice[3]->changed()) {
-        int val;
-        switch (WID->view_choice[3]->value()) {
-        case 0:
-          val = DRAW_POST_LOCATE_COG;
-          break;
-        default:
-          val = DRAW_POST_LOCATE_VERTEX;
-          break;
-        }
-        opt_view_arrow_location(i, GMSH_SET, val);
+      switch (WID->view_choice[3]->value()) {
+      case 0:
+	val = DRAW_POST_LOCATE_COG;
+	break;
+      default:
+	val = DRAW_POST_LOCATE_VERTEX;
+	break;
       }
+      if(force || (val != arrow_location))
+        opt_view_arrow_location(i, GMSH_SET, val);
 
-      if(force || WID->view_choice[4]->changed()) {
-        int val;
-        switch (WID->view_choice[4]->value()) {
-        case 0:
-          val = DRAW_POST_VONMISES;
-          break;
-        default:
-          val = DRAW_POST_EIGENVECTORS;
-          break;
-        }
-        opt_view_tensor_type(i, GMSH_SET, val);
+      switch (WID->view_choice[4]->value()) {
+      case 0:
+	val = DRAW_POST_VONMISES;
+	break;
+      default:
+	val = DRAW_POST_EIGENVECTORS;
+	break;
       }
+      if(force || (val != tensor_type))
+        opt_view_tensor_type(i, GMSH_SET, val);
 
-      if(force || WID->view_choice[7]->changed()) {
-        int val;
-        switch (WID->view_choice[7]->value()) {
-        case 0:
-          val = DRAW_POST_RANGE_DEFAULT;
-          break;
-        case 1:
-          val = DRAW_POST_RANGE_PER_STEP;
-          break;
-        default:
-          val = DRAW_POST_RANGE_CUSTOM;
-          break;
-        }
-        opt_view_range_type(i, GMSH_SET, val);
+      switch (WID->view_choice[7]->value()) {
+      case 0:
+	val = DRAW_POST_RANGE_DEFAULT;
+	break;
+      case 1:
+	val = DRAW_POST_RANGE_PER_STEP;
+	break;
+      default:
+	val = DRAW_POST_RANGE_CUSTOM;
+	break;
       }
+      if(force || (val != range_type))
+        opt_view_range_type(i, GMSH_SET, val);
 
-      if(force || WID->view_choice[8]->changed()) {
-        opt_view_grid(i, GMSH_SET, WID->view_choice[8]->value());
-      }
+      val = WID->view_choice[8]->value();
+      if(force || (val != grid))
+        opt_view_grid(i, GMSH_SET, val);
 
-      if(force || WID->view_choice[9]->changed()) {
-        opt_view_boundary(i, GMSH_SET, WID->view_choice[9]->value());
-      }
+      val = WID->view_choice[9]->value();
+      if(force || (val != boundary))
+        opt_view_boundary(i, GMSH_SET, val);
 
       // view_butts
 
-      if(force || WID->view_butt[1]->changed() ||
-         WID->view_butt[2]->changed() || WID->view_butt[3]->changed())
-        opt_view_type(i, GMSH_SET,
-                      WID->view_butt[1]->value()? DRAW_POST_3D :
-                      WID->view_butt[2]->value()? DRAW_POST_2D_SPACE :
-                      DRAW_POST_2D_TIME);
+      val = WID->view_butt[1]->value() ? DRAW_POST_3D :
+	WID->view_butt[2]->value() ? DRAW_POST_2D_SPACE : DRAW_POST_2D_TIME;
+      if(force || (val != type))
+        opt_view_type(i, GMSH_SET, val);
 
-      if(force || WID->view_butt[38]->changed())
-        opt_view_saturate_values(i, GMSH_SET, WID->view_butt[38]->value());
+      val = WID->view_butt[38]->value();
+      if(force || (val != saturate_values))
+        opt_view_saturate_values(i, GMSH_SET, val);
 
-      if(force || WID->view_butt[10]->changed())
-        opt_view_show_element(i, GMSH_SET, WID->view_butt[10]->value());
+      val = WID->view_butt[10]->value();
+      if(force || (val != show_element))
+        opt_view_show_element(i, GMSH_SET, val);
 
-      if(force || WID->view_butt[4]->changed())
-        opt_view_show_scale(i, GMSH_SET, WID->view_butt[4]->value());
+      val = WID->view_butt[4]->value();
+      if(force || (val != show_scale))
+        opt_view_show_scale(i, GMSH_SET, val);
 
-      if(force || WID->view_butt[7]->changed())
-        opt_view_auto_position(i, GMSH_SET, WID->view_butt[7]->value());
+      val = WID->view_butt[7]->value();
+      if(force || (val != auto_position))
+        opt_view_auto_position(i, GMSH_SET, val);
 
-      if(force || WID->view_butt[8]->changed())
-        opt_view_show_time(i, GMSH_SET, WID->view_butt[8]->value());
+      val = WID->view_butt[8]->value();
+      if(force || (val != show_time))
+        opt_view_show_time(i, GMSH_SET, val);
 
-      if(force || WID->view_butt[5]->changed())
-        opt_view_draw_strings(i, GMSH_SET, WID->view_butt[5]->value());
+      val = WID->view_butt[5]->value();
+      if(force || (val != draw_strings))
+        opt_view_draw_strings(i, GMSH_SET, val);
 
-      if(force || WID->view_butt[11]->changed())
-        opt_view_light(i, GMSH_SET, WID->view_butt[11]->value());
+      val = WID->view_butt[11]->value();
+      if(force || (val != light))
+        opt_view_light(i, GMSH_SET, val);
 
-      if(force || WID->view_butt[9]->changed())
-        opt_view_light_two_side(i, GMSH_SET, WID->view_butt[9]->value());
+      val = WID->view_butt[9]->value();
+      if(force || (val != light_two_side))
+        opt_view_light_two_side(i, GMSH_SET, val);
 
-      if(force || WID->view_butt[12]->changed())
-        opt_view_smooth_normals(i, GMSH_SET, WID->view_butt[12]->value());
+      val = WID->view_butt[12]->value();
+      if(force || (val != smooth_normals))
+        opt_view_smooth_normals(i, GMSH_SET, val);
 
-      if(force || WID->view_butt[13]->changed())
-        opt_view_draw_points(i, GMSH_SET, WID->view_butt[13]->value());
+      val = WID->view_butt[13]->value();
+      if(force || (val != draw_points))
+        opt_view_draw_points(i, GMSH_SET, val);
 
-      if(force || WID->view_butt[14]->changed())
-        opt_view_draw_lines(i, GMSH_SET, WID->view_butt[14]->value());
+      val = WID->view_butt[14]->value();
+      if(force || (val != draw_lines))
+        opt_view_draw_lines(i, GMSH_SET, val);
 
-      if(force || WID->view_butt[15]->changed())
-        opt_view_draw_triangles(i, GMSH_SET, WID->view_butt[15]->value());
+      val = WID->view_butt[15]->value();
+      if(force || (val != draw_triangles))
+        opt_view_draw_triangles(i, GMSH_SET, val);
 
-      if(force || WID->view_butt[16]->changed())
-        opt_view_draw_quadrangles(i, GMSH_SET, WID->view_butt[16]->value());
+      val = WID->view_butt[16]->value();
+      if(force || (val != draw_quadrangles))
+        opt_view_draw_quadrangles(i, GMSH_SET, val);
 
-      if(force || WID->view_butt[17]->changed())
-        opt_view_draw_tetrahedra(i, GMSH_SET, WID->view_butt[17]->value());
+      val = WID->view_butt[17]->value();
+      if(force || (val != draw_tetrahedra))
+        opt_view_draw_tetrahedra(i, GMSH_SET, val);
 
-      if(force || WID->view_butt[18]->changed())
-        opt_view_draw_hexahedra(i, GMSH_SET, WID->view_butt[18]->value());
+      val = WID->view_butt[18]->value();
+      if(force || (val != draw_hexahedra))
+        opt_view_draw_hexahedra(i, GMSH_SET, val);
 
-      if(force || WID->view_butt[19]->changed())
-        opt_view_draw_prisms(i, GMSH_SET, WID->view_butt[19]->value());
+      val = WID->view_butt[19]->value();
+      if(force || (val != draw_prisms))
+        opt_view_draw_prisms(i, GMSH_SET, val);
 
-      if(force || WID->view_butt[20]->changed())
-        opt_view_draw_pyramids(i, GMSH_SET, WID->view_butt[20]->value());
+      val = WID->view_butt[20]->value();
+      if(force || (val != draw_pyramids))
+        opt_view_draw_pyramids(i, GMSH_SET, val);
 
-      if(force || WID->view_butt[21]->changed())
-        opt_view_draw_scalars(i, GMSH_SET, WID->view_butt[21]->value());
+      val = WID->view_butt[21]->value();
+      if(force || (val != draw_scalars))
+        opt_view_draw_scalars(i, GMSH_SET, val);
 
-      if(force || WID->view_butt[22]->changed())
-        opt_view_draw_vectors(i, GMSH_SET, WID->view_butt[22]->value());
+      val = WID->view_butt[22]->value();
+      if(force || (val != draw_vectors))
+        opt_view_draw_vectors(i, GMSH_SET, val);
 
-      if(force || WID->view_butt[23]->changed())
-        opt_view_draw_tensors(i, GMSH_SET, WID->view_butt[23]->value());
+      val = WID->view_butt[23]->value();
+      if(force || (val != draw_tensors))
+        opt_view_draw_tensors(i, GMSH_SET, val);
 
       // view_values
-
-      if(force || WID->view_value[31]->changed())
-        opt_view_custom_min(i, GMSH_SET, WID->view_value[31]->value());
-
-      if(force || WID->view_value[32]->changed())
-        opt_view_custom_max(i, GMSH_SET, WID->view_value[32]->value());
-
-      if(force || WID->view_value[30]->changed())
-        opt_view_nb_iso(i, GMSH_SET, WID->view_value[30]->value());
-
-      if(force || WID->view_value[40]->changed())
-        opt_view_offset0(i, GMSH_SET, WID->view_value[40]->value());
-
-      if(force || WID->view_value[41]->changed())
-        opt_view_offset1(i, GMSH_SET, WID->view_value[41]->value());
-
-      if(force || WID->view_value[42]->changed())
-        opt_view_offset2(i, GMSH_SET, WID->view_value[42]->value());
-
-      if(force || WID->view_value[43]->changed())
-        opt_view_raise0(i, GMSH_SET, WID->view_value[43]->value());
-
-      if(force || WID->view_value[44]->changed())
-        opt_view_raise1(i, GMSH_SET, WID->view_value[44]->value());
-
-      if(force || WID->view_value[45]->changed())
-        opt_view_raise2(i, GMSH_SET, WID->view_value[45]->value());
-
-      if(force || WID->view_value[50]->changed())
-        opt_view_timestep(i, GMSH_SET, WID->view_value[50]->value());
-
-      if(force || WID->view_value[60]->changed())
-        opt_view_arrow_size(i, GMSH_SET, WID->view_value[60]->value());
-
-      if(force || WID->view_value[63]->changed())
-        opt_view_displacement_factor(i, GMSH_SET, WID->view_value[63]->value());
-
-      if(force || WID->view_value[61]->changed())
-        opt_view_point_size(i, GMSH_SET, WID->view_value[61]->value());
-
-      if(force || WID->view_value[62]->changed())
-        opt_view_line_width(i, GMSH_SET, WID->view_value[62]->value());
-
-      if(force || WID->view_value[12]->changed())
-        opt_view_explode(i, GMSH_SET, WID->view_value[12]->value());
-
-      if(force || WID->view_value[10]->changed())
-        opt_view_angle_smooth_normals(i, GMSH_SET,
-                                      WID->view_value[10]->value());
-
-      if(force || WID->view_value[20]->changed())
-        opt_view_position0(i, GMSH_SET, WID->view_value[20]->value());
-
-      if(force || WID->view_value[21]->changed())
-        opt_view_position1(i, GMSH_SET, WID->view_value[21]->value());
-
-      if(force || WID->view_value[22]->changed())
-        opt_view_size0(i, GMSH_SET, WID->view_value[22]->value());
-
-      if(force || WID->view_value[23]->changed())
-        opt_view_size1(i, GMSH_SET, WID->view_value[23]->value());
-
-      if(force || WID->view_value[25]->changed())
-        opt_view_nb_abscissa(i, GMSH_SET, WID->view_value[25]->value());
+      
+      val = WID->view_value[31]->value();
+      if(force || (val != custom_min))
+        opt_view_custom_min(i, GMSH_SET, val);
+
+      val = WID->view_value[32]->value();
+      if(force || (val != custom_max))
+        opt_view_custom_max(i, GMSH_SET, val);
+
+      val = WID->view_value[30]->value();
+      if(force || (val != nb_iso))
+        opt_view_nb_iso(i, GMSH_SET, val);
+
+      val = WID->view_value[40]->value();
+      if(force || (val != offset0))
+        opt_view_offset0(i, GMSH_SET, val);
+
+      val = WID->view_value[41]->value();
+      if(force || (val != offset1))
+        opt_view_offset1(i, GMSH_SET, val);
+
+      val = WID->view_value[42]->value();
+      if(force || (val != offset2))
+        opt_view_offset2(i, GMSH_SET, val);
+
+      val = WID->view_value[43]->value();
+      if(force || (val != raise0))
+        opt_view_raise0(i, GMSH_SET, val);
+
+      val = WID->view_value[44]->value();
+      if(force || (val != raise1))
+        opt_view_raise1(i, GMSH_SET, val);
+
+      val = WID->view_value[45]->value();
+      if(force || (val != raise2))
+        opt_view_raise2(i, GMSH_SET, val);
+
+      val = WID->view_value[50]->value();
+      if(force || (val != timestep))
+        opt_view_timestep(i, GMSH_SET, val);
+
+      val = WID->view_value[60]->value();
+      if(force || (val != arrow_size))
+        opt_view_arrow_size(i, GMSH_SET, val);
+
+      val = WID->view_value[63]->value();
+      if(force || (val != displacement_factor))
+        opt_view_displacement_factor(i, GMSH_SET, val);
+
+      val = WID->view_value[61]->value();
+      if(force || (val != point_size))
+        opt_view_point_size(i, GMSH_SET, val);
+
+      val = WID->view_value[62]->value();
+      if(force || (val != line_width))
+        opt_view_line_width(i, GMSH_SET, val);
+
+      val = WID->view_value[12]->value();
+      if(force || (val != explode))
+        opt_view_explode(i, GMSH_SET, val);
+
+      val = WID->view_value[10]->value();
+      if(force || (val != angle_smooth_normals))
+        opt_view_angle_smooth_normals(i, GMSH_SET, val);
+
+      val = WID->view_value[20]->value();
+      if(force || (val != position0))
+        opt_view_position0(i, GMSH_SET, val);
+
+      val = WID->view_value[21]->value();
+      if(force || (val != position1))
+        opt_view_position1(i, GMSH_SET, val);
+
+      val = WID->view_value[22]->value();
+      if(force || (val != size0))
+        opt_view_size0(i, GMSH_SET, val);
+      
+      val = WID->view_value[23]->value();
+      if(force || (val != size1))
+        opt_view_size1(i, GMSH_SET, val);
+      
+      val = WID->view_value[25]->value();
+      if(force || (val != nb_abscissa))
+        opt_view_nb_abscissa(i, GMSH_SET, val);
 
       // view_inputs
 
-      if(force || WID->view_input[0]->changed())
-        opt_view_name(i, GMSH_SET, (char *)WID->view_input[0]->value());
+      char *str;
 
-      if(force || WID->view_input[1]->changed())
-        opt_view_format(i, GMSH_SET, (char *)WID->view_input[1]->value());
+      str = (char *)WID->view_input[0]->value();
+      if(force || strcmp(str, name))
+        opt_view_name(i, GMSH_SET, str);
 
-      if(force || WID->view_input[2]->changed())
-        opt_view_abscissa_name(i, GMSH_SET,
-                               (char *)WID->view_input[2]->value());
+      str = (char *)WID->view_input[1]->value();
+      if(force || strcmp(str, format))
+        opt_view_format(i, GMSH_SET, str);
 
-      if(force || WID->view_input[3]->changed())
-        opt_view_abscissa_format(i, GMSH_SET,
-                                 (char *)WID->view_input[3]->value());
+      str = (char *)WID->view_input[2]->value();
+      if(force || strcmp(str, abscissa_name))
+        opt_view_abscissa_name(i, GMSH_SET, str);
+
+      str = (char *)WID->view_input[3]->value();
+      if(force || strcmp(str, abscissa_format))
+        opt_view_abscissa_format(i, GMSH_SET, str);
 
       // colorbar window
 
-      if(force
-         || (WID->view_colorbar_window->changed() && i != (long int)data)) {
-        ColorTable_Copy(&
-                        ((Post_View *)
-                         List_Pointer(CTX.post.list, (long int)data))->CT);
-        ColorTable_Paste(&((Post_View *) List_Pointer(CTX.post.list, i))->CT);
+      if(force || (WID->view_colorbar_window->changed() && i != current)) {
+        ColorTable_Copy(&((Post_View *)List_Pointer(CTX.post.list, current))->CT);
+        ColorTable_Paste(&((Post_View *)List_Pointer(CTX.post.list, i))->CT);
       }
     }
   }
 
-  // we clear all the flags
-  for(i = 0; i < VIEW_OPT_BUTT; i++) {
-    if(WID->view_butt[i])
-      WID->view_butt[i]->clear_changed();
-    if(WID->view_value[i])
-      WID->view_value[i]->clear_changed();
-    if(WID->view_input[i])
-      WID->view_input[i]->clear_changed();
-    if(WID->view_choice[i])
-      WID->view_choice[i]->clear_changed();
-    WID->view_colorbar_window->clear_changed();
-  }
+  // clear the changed flag on the colorbar
+  WID->view_colorbar_window->clear_changed();
 }
 
 void view_arrow_param_cb(CALLBACK_ARGS)
diff --git a/Fltk/Callbacks.h b/Fltk/Callbacks.h
index 0ba13a3a06..90d4c7c83a 100644
--- a/Fltk/Callbacks.h
+++ b/Fltk/Callbacks.h
@@ -31,7 +31,6 @@ void ManualPlay(int time, int step);
 
 void cancel_cb(CALLBACK_ARGS) ;
 void color_cb(CALLBACK_ARGS) ;
-void set_changed_cb(CALLBACK_ARGS);
 void redraw_cb(CALLBACK_ARGS);
 
 // Graphical window
diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index 5d70bba144..84d2c608fc 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI.cpp,v 1.331 2004-08-07 06:59:15 geuzaine Exp $
+// $Id: GUI.cpp,v 1.332 2004-08-09 10:29:07 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -2205,14 +2205,6 @@ void GUI::create_option_window()
 
   // View options
 
-  // WARNING! Don't forget to add the set_changed_cb() callback to any new widget!
-  // initialise all buttons to NULL (see the clear_changed() in view_options_ok_cb)
-  for(int i = 0; i < VIEW_OPT_BUTT; i++) {
-    view_butt[i] = NULL;
-    view_value[i] = NULL;
-    view_input[i] = NULL;
-    view_choice[i] = NULL;
-  }
   view_number = -1;
 
   view_window = new Fl_Window(BROWSERW, 0, width, height, "View options");
@@ -2226,60 +2218,49 @@ void GUI::create_option_window()
       view_butt[1]->type(FL_RADIO_BUTTON);
       view_butt[1]->down_box(RADIO_BOX);
       view_butt[1]->selection_color(RADIO_COLOR);
-      view_butt[1]->callback(set_changed_cb, 0);
 
       view_butt[2] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW / 2 - WB, BH, "2D space table");
       view_butt[2]->type(FL_RADIO_BUTTON);
       view_butt[2]->down_box(RADIO_BOX);
       view_butt[2]->selection_color(RADIO_COLOR);
-      view_butt[2]->callback(set_changed_cb, 0);
 
       view_butt[3] = new Fl_Check_Button(2 * WB, 2 * WB + 3 * BH, BW / 2 - WB, BH, "2D time table");
       view_butt[3]->type(FL_RADIO_BUTTON);
       view_butt[3]->down_box(RADIO_BOX);
       view_butt[3]->selection_color(RADIO_COLOR);
-      view_butt[3]->callback(set_changed_cb, 0);
 
       int sw = (int)(1.5 * fontsize);
       view_butt_rep[0] = new Fl_Repeat_Button(2 * WB, 2 * WB + 4 * BH, sw, BH, "-");
-      //no set_changed since has its own callback
       view_butt_rep[1] = new Fl_Repeat_Button(2 * WB + IW - sw, 2 * WB + 4 * BH, sw, BH, "+");
-      //no set_changed since has its own callback
       view_value[50] = new Fl_Value_Input(2 * WB + sw, 2 * WB + 4 * BH, IW - 2 * sw, BH);
       view_value[50]->align(FL_ALIGN_RIGHT);
       view_value[50]->minimum(0);
       view_value[50]->maximum(0);
       view_value[50]->step(1);
-      //no set_changed since has its own callback
       Fl_Box *a = new Fl_Box(2 * WB + IW, 2 * WB + 4 * BH, IW / 2, BH, "Step");
       a->box(FL_NO_BOX);
       a->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);
 
       view_input[0] = new Fl_Input(2 * WB, 2 * WB + 5 * BH, IW, BH, "Name");
       view_input[0]->align(FL_ALIGN_RIGHT);
-      view_input[0]->callback(set_changed_cb, 0);
 
       view_input[1] = new Fl_Input(2 * WB, 2 * WB + 6 * BH, IW, BH, "Format");
       view_input[1]->align(FL_ALIGN_RIGHT);
-      view_input[1]->callback(set_changed_cb, 0);
 
       {
 	view_2d = new Fl_Group(2 * WB, 2 * WB + 7 * BH, width - 2 * WB, 4 * BH, 0);
 	
 	view_input[2] = new Fl_Input(2 * WB, 2 * WB + 7 * BH, IW, BH, "Abscissa name");
 	view_input[2]->align(FL_ALIGN_RIGHT);
-	view_input[2]->callback(set_changed_cb, 0);
 	
 	view_input[3] = new Fl_Input(2 * WB, 2 * WB + 8 * BH, IW, BH, "Abscissa format");
 	view_input[3]->align(FL_ALIGN_RIGHT);
-	view_input[3]->callback(set_changed_cb, 0);
 	
 	view_value[25] = new Fl_Value_Input(2 * WB, 2 * WB + 9 * BH, IW, BH, "Number of abscissa points");
 	view_value[25]->minimum(0.);
 	view_value[25]->step(1);
 	view_value[25]->maximum(256);
 	view_value[25]->align(FL_ALIGN_RIGHT);
-	view_value[25]->callback(set_changed_cb, 0);
 	
 	static Fl_Menu_Item menu_grid_mode[] = {
 	  {"None", 0, 0, 0},
@@ -2291,7 +2272,6 @@ void GUI::create_option_window()
 	view_choice[8] = new Fl_Choice(2 * WB, 2 * WB + 10 * BH, IW, BH, "Grid mode");
 	view_choice[8]->menu(menu_grid_mode);
 	view_choice[8]->align(FL_ALIGN_RIGHT);
-	view_choice[8]->callback(set_changed_cb, 0);
 	
 	view_2d->end();
       }
@@ -2300,30 +2280,25 @@ void GUI::create_option_window()
       view_butt[7]->type(FL_TOGGLE_BUTTON);
       view_butt[7]->down_box(TOGGLE_BOX);
       view_butt[7]->selection_color(TOGGLE_COLOR);
-      view_butt[7]->callback(set_changed_cb, 0);
       
       view_value[20] = new Fl_Value_Input(width /2, 2 * WB + 2 * BH, IW / 2, BH);
       view_value[20]->align(FL_ALIGN_RIGHT);
-      view_value[20]->callback(set_changed_cb, 0);
       view_value[20]->minimum(0);
       view_value[20]->maximum(1024);
       view_value[20]->step(1);
       view_value[21] = new Fl_Value_Input(width / 2 + IW / 2, 2 * WB + 2 * BH, IW / 2, BH, "Position");
       view_value[21]->align(FL_ALIGN_RIGHT);
-      view_value[21]->callback(set_changed_cb, 0);
       view_value[21]->minimum(0);
       view_value[21]->maximum(1024);
       view_value[21]->step(1);
 
       view_value[22] = new Fl_Value_Input(width /2, 2 * WB + 3 * BH, IW / 2, BH);
       view_value[22]->align(FL_ALIGN_RIGHT);
-      view_value[22]->callback(set_changed_cb, 0);
       view_value[22]->minimum(0);
       view_value[22]->maximum(1024);
       view_value[22]->step(1);
       view_value[23] = new Fl_Value_Input(width / 2 + IW / 2, 2 * WB + 3 * BH, IW / 2, BH, "Size");
       view_value[23]->align(FL_ALIGN_RIGHT);
-      view_value[23]->callback(set_changed_cb, 0);
       view_value[23]->minimum(0);
       view_value[23]->maximum(1024);
       view_value[23]->step(1);
@@ -2338,75 +2313,63 @@ void GUI::create_option_window()
       view_butt[13]->type(FL_TOGGLE_BUTTON);
       view_butt[13]->down_box(TOGGLE_BOX);
       view_butt[13]->selection_color(TOGGLE_COLOR);
-      view_butt[13]->callback(set_changed_cb, 0);
 
       view_butt[14] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Lines");
       view_butt[14]->type(FL_TOGGLE_BUTTON);
       view_butt[14]->down_box(TOGGLE_BOX);
       view_butt[14]->selection_color(TOGGLE_COLOR);
-      view_butt[14]->callback(set_changed_cb, 0);
 
       view_butt[15] = new Fl_Check_Button(2 * WB, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Triangles");
       view_butt[15]->type(FL_TOGGLE_BUTTON);
       view_butt[15]->down_box(TOGGLE_BOX);
       view_butt[15]->selection_color(TOGGLE_COLOR);
-      view_butt[15]->callback(set_changed_cb, 0);
 
       view_butt[16] = new Fl_Check_Button(2 * WB, 2 * WB + 4 * BH, BW / 2 - WB, BH, "Quadrangles");
       view_butt[16]->type(FL_TOGGLE_BUTTON);
       view_butt[16]->down_box(TOGGLE_BOX);
       view_butt[16]->selection_color(TOGGLE_COLOR);
-      view_butt[16]->callback(set_changed_cb, 0);
 
       view_butt[17] = new Fl_Check_Button(2 * WB, 2 * WB + 5 * BH, BW / 2 - WB, BH, "Tetrahedra");
       view_butt[17]->type(FL_TOGGLE_BUTTON);
       view_butt[17]->down_box(TOGGLE_BOX);
       view_butt[17]->selection_color(TOGGLE_COLOR);
-      view_butt[17]->callback(set_changed_cb, 0);
 
       view_butt[18] = new Fl_Check_Button(2 * WB, 2 * WB + 6 * BH, BW / 2 - WB, BH, "Hexahedra");
       view_butt[18]->type(FL_TOGGLE_BUTTON);
       view_butt[18]->down_box(TOGGLE_BOX);
       view_butt[18]->selection_color(TOGGLE_COLOR);
-      view_butt[18]->callback(set_changed_cb, 0);
 
       view_butt[19] = new Fl_Check_Button(2 * WB, 2 * WB + 7 * BH, BW / 2 - WB, BH, "Prisms");
       view_butt[19]->type(FL_TOGGLE_BUTTON);
       view_butt[19]->down_box(TOGGLE_BOX);
       view_butt[19]->selection_color(TOGGLE_COLOR);
-      view_butt[19]->callback(set_changed_cb, 0);
 
       view_butt[20] = new Fl_Check_Button(2 * WB, 2 * WB + 8 * BH, BW / 2 - WB, BH, "Pyramids");
       view_butt[20]->type(FL_TOGGLE_BUTTON);
       view_butt[20]->down_box(TOGGLE_BOX);
       view_butt[20]->selection_color(TOGGLE_COLOR);
-      view_butt[20]->callback(set_changed_cb, 0);
 
       view_butt[4] = new Fl_Check_Button(width / 2, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Scale");
       view_butt[4]->tooltip("(Alt+i)");
       view_butt[4]->type(FL_TOGGLE_BUTTON);
       view_butt[4]->down_box(TOGGLE_BOX);
       view_butt[4]->selection_color(TOGGLE_COLOR);
-      view_butt[4]->callback(set_changed_cb, 0);
 
       view_butt[8] = new Fl_Check_Button(width / 2, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Step value");
       view_butt[8]->type(FL_TOGGLE_BUTTON);
       view_butt[8]->down_box(TOGGLE_BOX);
       view_butt[8]->selection_color(TOGGLE_COLOR);
-      view_butt[8]->callback(set_changed_cb, 0);
 
       view_butt[5] = new Fl_Check_Button(width / 2, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Annotations");
       view_butt[5]->tooltip("(Alt+n)");
       view_butt[5]->type(FL_TOGGLE_BUTTON);
       view_butt[5]->down_box(TOGGLE_BOX);
       view_butt[5]->selection_color(TOGGLE_COLOR);
-      view_butt[5]->callback(set_changed_cb, 0);
 
       view_butt[10] = new Fl_Check_Button(width / 2, 2 * WB + 4 * BH, BW / 2 - WB, BH, "Element edges");
       view_butt[10]->type(FL_TOGGLE_BUTTON);
       view_butt[10]->down_box(TOGGLE_BOX);
       view_butt[10]->selection_color(TOGGLE_COLOR);
-      view_butt[10]->callback(set_changed_cb, 0);
 
       static Fl_Menu_Item menu_boundary[] = {
 	{"None", 0, 0, 0},
@@ -2418,25 +2381,21 @@ void GUI::create_option_window()
       view_choice[9] = new Fl_Choice(width / 2, 2 * WB + 5 * BH, IW, BH, "Boundary");
       view_choice[9]->menu(menu_boundary);
       view_choice[9]->align(FL_ALIGN_RIGHT);
-      view_choice[9]->callback(set_changed_cb, 0);
 
       view_butt[21] = new Fl_Check_Button(width / 2, 2 * WB + 6 * BH, BW / 2 - WB, BH, "Scalar values");
       view_butt[21]->type(FL_TOGGLE_BUTTON);
       view_butt[21]->down_box(TOGGLE_BOX);
       view_butt[21]->selection_color(TOGGLE_COLOR);
-      view_butt[21]->callback(set_changed_cb, 0);
 
       view_butt[22] = new Fl_Check_Button(width / 2, 2 * WB + 7 * BH, BW / 2 - WB, BH, "Vector values");
       view_butt[22]->type(FL_TOGGLE_BUTTON);
       view_butt[22]->down_box(TOGGLE_BOX);
       view_butt[22]->selection_color(TOGGLE_COLOR);
-      view_butt[22]->callback(set_changed_cb, 0);
 
       view_butt[23] = new Fl_Check_Button(width / 2, 2 * WB + 8 * BH, BW / 2 - WB, BH, "Tensor values");
       view_butt[23]->type(FL_TOGGLE_BUTTON);
       view_butt[23]->down_box(TOGGLE_BOX);
       view_butt[23]->selection_color(TOGGLE_COLOR);
-      view_butt[23]->callback(set_changed_cb, 0);
       
       o->end();
     }
@@ -2449,7 +2408,6 @@ void GUI::create_option_window()
       view_value[30]->minimum(1);
       view_value[30]->maximum(256);
       view_value[30]->step(1);
-      view_value[30]->callback(set_changed_cb, 0);
 
       static Fl_Menu_Item menu_iso[] = {
         {"Iso-values", 0, 0, 0},
@@ -2461,7 +2419,6 @@ void GUI::create_option_window()
       view_choice[0] = new Fl_Choice(2 * WB, 2 * WB + 2 * BH, IW, BH, "Intervals type");
       view_choice[0]->menu(menu_iso);
       view_choice[0]->align(FL_ALIGN_RIGHT);
-      view_choice[0]->callback(set_changed_cb, 0);
       view_choice[0]->tooltip("(Alt+t)");
 
       static Fl_Menu_Item menu_range[] = {
@@ -2473,17 +2430,12 @@ void GUI::create_option_window()
       view_choice[7] = new Fl_Choice(2 * WB, 2 * WB + 3 * BH, IW, BH, "Range type");
       view_choice[7]->menu(menu_range);
       view_choice[7]->align(FL_ALIGN_RIGHT);
-      // won't work, since the items have their own callbaks; the
-      // changed flag has to be set in view_options_custom_cb!
-      //view_choice[7]->callback(set_changed_cb, 0);
 
       view_value[31] = new Fl_Value_Input(2 * WB, 2 * WB + 4 * BH, IW, BH, "Custom minimum");
       view_value[31]->align(FL_ALIGN_RIGHT);
-      view_value[31]->callback(set_changed_cb, 0);
 
       view_value[32] = new Fl_Value_Input(2 * WB, 2 * WB + 5 * BH, IW, BH, "Custom maximum");
       view_value[32]->align(FL_ALIGN_RIGHT);
-      view_value[32]->callback(set_changed_cb, 0);
 
       static Fl_Menu_Item menu_scale[] = {
         {"Linear", 0, 0, 0},
@@ -2494,13 +2446,11 @@ void GUI::create_option_window()
       view_choice[1] = new Fl_Choice(2 * WB, 2 * WB + 6 * BH, IW, BH, "Scale");
       view_choice[1]->menu(menu_scale);
       view_choice[1]->align(FL_ALIGN_RIGHT);
-      view_choice[1]->callback(set_changed_cb, 0);
 
       view_butt[38] = new Fl_Check_Button(2 * WB, 2 * WB + 7 * BH, BW, BH, "Saturate values");
       view_butt[38]->type(FL_TOGGLE_BUTTON);
       view_butt[38]->down_box(TOGGLE_BOX);
       view_butt[38]->selection_color(TOGGLE_COLOR);
-      view_butt[38]->callback(set_changed_cb, 0);
 
       view_range->end();
     }
@@ -2510,27 +2460,21 @@ void GUI::create_option_window()
 
       view_value[40] = new Fl_Value_Input(2 * WB, 2 * WB + 1 * BH, IW, BH, "X offset");
       view_value[40]->align(FL_ALIGN_RIGHT);
-      view_value[40]->callback(set_changed_cb, 0);
 
       view_value[41] = new Fl_Value_Input(2 * WB, 2 * WB + 2 * BH, IW, BH, "Y offset");
       view_value[41]->align(FL_ALIGN_RIGHT);
-      view_value[41]->callback(set_changed_cb, 0);
 
       view_value[42] = new Fl_Value_Input(2 * WB, 2 * WB + 3 * BH, IW, BH, "Z offset");
       view_value[42]->align(FL_ALIGN_RIGHT);
-      view_value[42]->callback(set_changed_cb, 0);
 
       view_value[43] = new Fl_Value_Input(width / 2, 2 * WB + 1 * BH, IW, BH, "X raise");
       view_value[43]->align(FL_ALIGN_RIGHT);
-      view_value[43]->callback(set_changed_cb, 0);
 
       view_value[44] = new Fl_Value_Input(width / 2, 2 * WB + 2 * BH, IW, BH, "Y raise");
       view_value[44]->align(FL_ALIGN_RIGHT);
-      view_value[44]->callback(set_changed_cb, 0);
 
       view_value[45] = new Fl_Value_Input(width / 2, 2 * WB + 3 * BH, IW, BH, "Z raise");
       view_value[45]->align(FL_ALIGN_RIGHT);
-      view_value[45]->callback(set_changed_cb, 0);
 
       o->end();
     }
@@ -2543,31 +2487,26 @@ void GUI::create_option_window()
       view_value[12]->step(0.01);
       view_value[12]->maximum(1.);
       view_value[12]->align(FL_ALIGN_RIGHT);
-      view_value[12]->callback(set_changed_cb, 0);
 
       view_choice[5] = new Fl_Choice(2 * WB, 2 * WB + 2 * BH, IW, BH, "Point display");
       view_choice[5]->menu(menu_point_display);
       view_choice[5]->align(FL_ALIGN_RIGHT);
-      view_choice[5]->callback(set_changed_cb, 0);
 
       view_value[61] = new Fl_Value_Input(2 * WB, 2 * WB + 3 * BH, IW, BH, "Point size");
       view_value[61]->minimum(0.1);
       view_value[61]->maximum(50);
       view_value[61]->step(0.1);
       view_value[61]->align(FL_ALIGN_RIGHT);
-      view_value[61]->callback(set_changed_cb, 0);
 
       view_choice[6] = new Fl_Choice(2 * WB, 2 * WB + 4 * BH, IW, BH, "Line display");
       view_choice[6]->menu(menu_line_display);
       view_choice[6]->align(FL_ALIGN_RIGHT);
-      view_choice[6]->callback(set_changed_cb, 0);
 
       view_value[62] = new Fl_Value_Input(2 * WB, 2 * WB + 5 * BH, IW, BH, "Line width");
       view_value[62]->minimum(0.1);
       view_value[62]->maximum(50);
       view_value[62]->step(0.1);
       view_value[62]->align(FL_ALIGN_RIGHT);
-      view_value[62]->callback(set_changed_cb, 0);
 
       {
         view_vector = new Fl_Group(2 * WB, 2 * WB + 6 * BH, width - 2 * WB, 5 * BH, 0);
@@ -2583,7 +2522,6 @@ void GUI::create_option_window()
         view_choice[2] = new Fl_Choice(2 * WB, 2 * WB + 6 * BH, IW, BH, "Vector display");
         view_choice[2]->menu(menu_vectype);
         view_choice[2]->align(FL_ALIGN_RIGHT);
-        view_choice[2]->callback(set_changed_cb, 0);
 
 	view_push_butt[0] = new Fl_Button(2 * IW - 2 * WB, 2 * WB + 6 * BH, (int)(1.5*BB), BH, "Edit arrow shape");
       
@@ -2592,11 +2530,9 @@ void GUI::create_option_window()
         view_value[60]->maximum(500);
         view_value[60]->step(1);
         view_value[60]->align(FL_ALIGN_RIGHT);
-        view_value[60]->callback(set_changed_cb, 0);
 
         view_value[63] = new Fl_Value_Input(2 * WB, 2 * WB + 8 * BH, IW, BH, "Displacement factor");
         view_value[63]->align(FL_ALIGN_RIGHT);
-        view_value[63]->callback(set_changed_cb, 0);
 
         static Fl_Menu_Item menu_vecloc[] = {
           {"Cell centered", 0, 0, 0},
@@ -2606,7 +2542,6 @@ void GUI::create_option_window()
         view_choice[3] = new Fl_Choice(2 * WB, 2 * WB + 9 * BH, IW, BH, "Arrow location");
         view_choice[3]->menu(menu_vecloc);
         view_choice[3]->align(FL_ALIGN_RIGHT);
-        view_choice[3]->callback(set_changed_cb, 0);
 
         static Fl_Menu_Item menu_tensor[] = {
           {"Von-Mises", 0, 0, 0},
@@ -2616,7 +2551,6 @@ void GUI::create_option_window()
         view_choice[4] = new Fl_Choice(2 * WB, 2 * WB + 10 * BH, IW, BH, "Tensor display");
         view_choice[4]->menu(menu_tensor);
         view_choice[4]->align(FL_ALIGN_RIGHT);
-        view_choice[4]->callback(set_changed_cb, 0);
 
         view_vector->end();
       }
@@ -2632,26 +2566,22 @@ void GUI::create_option_window()
       view_butt[11]->type(FL_TOGGLE_BUTTON);
       view_butt[11]->down_box(TOGGLE_BOX);
       view_butt[11]->selection_color(TOGGLE_COLOR);
-      view_butt[11]->callback(set_changed_cb, 0);
 
       view_butt[9]  = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW, BH, "Use two-side lighting");
       view_butt[9]->type(FL_TOGGLE_BUTTON);
       view_butt[9]->down_box(TOGGLE_BOX);
       view_butt[9]->selection_color(TOGGLE_COLOR);
-      view_butt[9]->callback(set_changed_cb, 0);
 
       view_butt[12] = new Fl_Check_Button(2 * WB, 2 * WB + 3 * BH, BW, BH, "Smooth normals");
       view_butt[12]->type(FL_TOGGLE_BUTTON);
       view_butt[12]->down_box(TOGGLE_BOX);
       view_butt[12]->selection_color(TOGGLE_COLOR);
-      view_butt[12]->callback(set_changed_cb, 0);
 
       view_value[10] = new Fl_Value_Input(2 * WB, 2 * WB + 4 * BH, IW, BH, "Smoothing threshold angle");
       view_value[10]->minimum(0.);
       view_value[10]->step(1.);
       view_value[10]->maximum(180.);
       view_value[10]->align(FL_ALIGN_RIGHT);
-      view_value[10]->callback(set_changed_cb, 0);
       
       o->end();
     }
@@ -2661,7 +2591,6 @@ void GUI::create_option_window()
 
       view_colorbar_window = new Colorbar_Window(2 * WB, 2 * WB + BH, width - 4 * WB, height - 4 * WB - BH);
       view_colorbar_window->end();
-      // no 'set_changed' since Colorbar_Window has its own callbacks
 
       // this exposes the MacOSX clipping bug with a regular subwindow:
       //view_colorbar_window->hide();
diff --git a/Fltk/GUI.h b/Fltk/GUI.h
index 692b524e65..81089f5d12 100644
--- a/Fltk/GUI.h
+++ b/Fltk/GUI.h
@@ -192,13 +192,12 @@ public:
   int view_number ;
   Fl_Window        *view_window ;
   Fl_Group         *view_2d, *view_range, *view_vector ;
-#define VIEW_OPT_BUTT 100
-  Fl_Check_Button  *view_butt[VIEW_OPT_BUTT] ;
-  Fl_Value_Input   *view_value[VIEW_OPT_BUTT] ;
-  Fl_Input         *view_input[VIEW_OPT_BUTT] ;
-  Fl_Repeat_Button *view_butt_rep[VIEW_OPT_BUTT] ;
-  Fl_Button        *view_push_butt[VIEW_OPT_BUTT] ;
-  Fl_Choice        *view_choice[VIEW_OPT_BUTT] ;
+  Fl_Check_Button  *view_butt[100] ;
+  Fl_Value_Input   *view_value[100] ;
+  Fl_Input         *view_input[100] ;
+  Fl_Repeat_Button *view_butt_rep[100] ;
+  Fl_Button        *view_push_butt[100] ;
+  Fl_Choice        *view_choice[100] ;
 
   Colorbar_Window  *view_colorbar_window ;
   Fl_Return_Button *view_ok ;
diff --git a/Mesh/2D_Mesh_Aniso.cpp b/Mesh/2D_Mesh_Aniso.cpp
index ed66192b4b..06d61092ee 100644
--- a/Mesh/2D_Mesh_Aniso.cpp
+++ b/Mesh/2D_Mesh_Aniso.cpp
@@ -1,4 +1,4 @@
-// $Id: 2D_Mesh_Aniso.cpp,v 1.42 2004-06-20 23:25:32 geuzaine Exp $
+// $Id: 2D_Mesh_Aniso.cpp,v 1.43 2004-08-09 10:29:07 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -61,8 +61,15 @@ double Interpole_lcTriangle(Simplex * s, Vertex * vv)
 {
   double Xp, Yp, X[3], Y[3], det, u, v, q1, q2, q3;
 
-  if(THEM->BGM.Typ == ONFILE)
-    return Lc_XYZ(vv->Pos.X, vv->Pos.Y, 0., THEM);
+  if(THEM->BGM.Typ == ONFILE){
+    Vertex *v2 = Create_Vertex(-1, vv->Pos.X, vv->Pos.Y, 0.0, 0.0, 0.0);
+    Vertex *dum;
+    Calcule_Z_Plan(&v2, &dum);
+    Projette_Inverse(&v2, &dum);
+    double val = Lc_XYZ(v2->Pos.X, v2->Pos.Y, v2->Pos.Z, THEM);
+    Free_Vertex(&v2, 0);
+    return val;
+  }
 
   Xp = vv->Pos.X;
   Yp = vv->Pos.Y;
diff --git a/Plugin/Plugin.h b/Plugin/Plugin.h
index b6de60036f..90b1649c92 100644
--- a/Plugin/Plugin.h
+++ b/Plugin/Plugin.h
@@ -115,7 +115,7 @@ public:
   virtual void receiveNewPhysicalGroup (int dim, int id) = 0;// add the given group to the solver data's
   virtual void readSolverFile  ( const char * ) = 0;  // load the solver input file related to the gmsh geo file
   virtual void writeSolverFile ( const char *) const = 0;  // save the solver file  
-  virtual bool GL_enhancePoint ( Vertex *v) {}; // enhance graphics for a giver geo point
+  virtual bool GL_enhancePoint ( Vertex *v) { return false; }; // enhance graphics for a giver geo point
 };
 
 #endif
diff --git a/Plugin/StructuralSolver.cpp b/Plugin/StructuralSolver.cpp
index 8e410d047d..0f861fba52 100644
--- a/Plugin/StructuralSolver.cpp
+++ b/Plugin/StructuralSolver.cpp
@@ -33,7 +33,6 @@ Structural_BeamSection:: Structural_BeamSection( const char *direct, std::string
   Mesh *kk = THEM;
   Init_Mesh(&m);
 
-  size_t l = name.size();
   char temp[256];
   sprintf(temp, "%s/%s", direct,name.c_str());
   // read the section (msh format)
@@ -265,7 +264,8 @@ void StructuralSolver ::popupPropertiesForPhysicalEntity (int dim)
       _value[9]->align(FL_ALIGN_RIGHT);
       
       g[1]->end();
-    }    
+    }
+    o->end();
   }
 #endif
 }
@@ -412,5 +412,8 @@ bool StructuralSolver :: GL_enhancePoint ( Vertex *v)
 	}
       }
     }
+  return true;
+#else
+  return false;
 #endif
 }
diff --git a/Plugin/StructuralSolver.h b/Plugin/StructuralSolver.h
index be5dd38a78..ecd4e2f23d 100644
--- a/Plugin/StructuralSolver.h
+++ b/Plugin/StructuralSolver.h
@@ -84,7 +84,7 @@ struct PhysicalPointInfo
 
 struct PhysicalLineInfo 
 {
-  PhysicalLineInfo() : fx1(0),fy1(0),fx2(0),fy2(0){}
+  PhysicalLineInfo() : fx1(0),fx2(0),fy1(0),fy2(0){}
   std::string material, section;
   double fx1,fx2,fy1,fy2;
 };
@@ -110,7 +110,7 @@ class StructuralSolver : public GMSH_Solve_Plugin
 
 public:
   StructuralSolver();
-  ~StructuralSolver();
+  virtual ~StructuralSolver();
   virtual void getName(char *name) const;
   virtual void getInfos(char *author, char *copyright, char *helpText) const;
 
diff --git a/doc/texinfo/gmsh.texi b/doc/texinfo/gmsh.texi
index f7398f8519..61440a1356 100644
--- a/doc/texinfo/gmsh.texi
+++ b/doc/texinfo/gmsh.texi
@@ -1,5 +1,5 @@
 \input texinfo.tex @c -*-texinfo-*-
-@c $Id: gmsh.texi,v 1.128 2004-07-15 02:38:53 geuzaine Exp $
+@c $Id: gmsh.texi,v 1.129 2004-08-09 10:29:07 geuzaine Exp $
 @c
 @c Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 @c
@@ -1891,8 +1891,8 @@ mesh, use the @code{-bgm} command-line option (@pxref{Command-line options})
 or select `Apply as background mesh' in the post-processing view option
 menu.
 
-Background meshes are supported by all algorithms except the 2D anisotropic
-algorithm and the algorithms based on Netgen.
+Background meshes are supported by all algorithms except the algorithms
+based on Netgen.
 @end enumerate
 
 Here are the mesh commands that are related to the specification of
diff --git a/doc/texinfo/opt_general.texi b/doc/texinfo/opt_general.texi
index d5cb01ddf3..92e5d77207 100644
--- a/doc/texinfo/opt_general.texi
+++ b/doc/texinfo/opt_general.texi
@@ -505,7 +505,7 @@ Default value: @code{0}@*
 Saved in: @code{-}
 
 @item General.RotationCenterGravity
-Rotate around the center of gravity instead of (RotationCenterX, RotationCenterY, RotationCenterZ)@*
+Rotate around the (pseudo) center of mass instead of (RotationCenterX, RotationCenterY, RotationCenterZ)@*
 Default value: @code{1}@*
 Saved in: @code{General.OptionsFileName}
 
-- 
GitLab