diff --git a/Common/GamePad.cpp b/Common/GamePad.cpp
index 2dcf995f7c8bc769d4941f664de4651e75815d82..c615dc3a1c929c6db10150d03b6ccc2da035b42f 100644
--- a/Common/GamePad.cpp
+++ b/Common/GamePad.cpp
@@ -4,194 +4,275 @@
 // bugs and problems to the public mailing list <gmsh@geuz.org>.
 //
 // Contributed by Gilles Marckmann <gilles.marckmann@ec-nantes.fr>
+//    default map is "THRUSTMASTER FireStorm Dual Power"-like
+//                                         
+//                    ######                                   ######
+//                   # but5 #                                 # but7 #
+//                 .########..                               ..#######.
+//                ............                               .......... .
+//               ...#######...                              ...########..
+//               ..# but4 #...                              ...# but6  #..
+//              ...########.......                     ........#########..
+//              ....................                 .....................
+//            .......#...................        ..........................
+//           ......axis5..........................................####.......
+//          ........ #...........................................# b3 #.......
+//         ..........#...........................................#    #.......
+//         ...###< axis4 >###...............................####..####..####...
+//        ...........#.....................................# b1 #......# b2 #...
+//       ............#.....................................#    #......#    #....
+//       ............#......................................####........####.....
+//      .............#.............................................####...........
+//      ..........................................................# b0 #..........
+//     ...........................................................#    #...........
+//     .......................#######................#######.......####............
+//    ......................#  axis1 ##............## axis3 ##......................
+//    .....................##    |    ##..........##    |    ##.....................
+//   ......................#<--axis0-->#..........#<--axis2--> #.....................
+//   ......................##    |    ##. .####. .##    |    ##......................
+//   .......................##   |   ##.. # b9 #...##   |   ##.......................
+//  ..........................#######......####......#######.........................
+//  ..................................................................................
+//  .....................    ..........             .........    .....................
+//  ....................                                          ....................
+//  ..................                                              ..................
+// ..................                                                ..................
+// ..................                                                 .................
+// .................                                                   ................
+// ................                                                     ...............
+//  ..............                                                       ..............
+//  .............                                                         ............
+//  ............                                                          ............
+//   ..........                                                             ..........
+//    .......                                                                ........
+//     ....                                                                     ...
+//
+
+#include <cstring>
+#include <string>
+#include <iostream>
+#include <stdio.h>
+#include "GamePad.h"
+#include "Context.h"
+#include <unistd.h>
+
+
+#if defined(WIN32)
+#include <math.h>
+#endif
+      
+GamePad::GamePad() : active(false), frequency(.01), gamepad_fd(0) {
+
+#if defined(WIN32)
+ 
+  for (int i = JOYSTICKID1 ; i < JOYSTICKID2 ; i++)  {
+    if(JOYERR_NOERROR == joyGetDevCaps(i, &caps, sizeof(JOYCAPS)) ) { 
+      /*
+      std::cout << "Joystick/Gamepad detected: "<< name ;
+      std::cout << " ( "  << (int)caps.wNumAxes <<" axes /" ;
+      std::cout << (int)caps.wNumButtons <<" buttons)" << std::endl;    
+      std::cout << "  Driver name ....... " << caps.szPname << std::endl;
+      std::cout << "  Manufacturer ID ... " << caps.wMid << std::endl;
+      std::cout << "  Product ID ........ " << caps.wPid << std::endl;
+      std::cout << "  RegKey ............ " << caps.szRegKey << std::endl;
+      std::cout << "  OEMVxD ............ " << caps.szOEMVxD << std::endl;
+      std::cout << "  wXmin ............. " << caps.wXmin << std::endl;
+      std::cout << "  wXmax ............. " << caps.wXmax << std::endl;
+      std::cout << "  wYmin ............. " << caps.wYmin << std::endl;
+      std::cout << "  wYmax ............. " << caps.wYmax << std::endl;
+      std::cout << "  wZmin ............. " << caps.wZmin << std::endl;
+      std::cout << "  wZmax ............. " << caps.wZmax << std::endl;
+      std::cout << "  wPeriodMin ........ " << caps.wPeriodMin << std::endl;
+      std::cout << "  wPeriodMax ........ " << caps.wPeriodMax << std::endl;
+      std::cout << "  wRmin ............. " << caps.wRmin << std::endl;
+      std::cout << "  wRmax ............. " << caps.wRmax << std::endl;
+      std::cout << "  wUmin ............. " << caps.wUmin << std::endl;
+      std::cout << "  wUmax ............. " << caps.wUmax << std::endl;
+      std::cout << "  wVmin ............. " << caps.wVmin << std::endl;
+      std::cout << "  wVmax ............. " << caps.wVmax << std::endl;
+      */
+      if(( 1./frequency <(double)caps.wPeriodMin ) ||( 1./frequency >(double)caps.wPeriodMax )){
+	   frequency=.1/(double)caps.wPeriodMin;
+	}     
+      gamepad_fd =i;
+      axes=std::min(GP_AXES,(int)caps.wNumAxes +2);
+      buttons=std::min(GP_BUTTONS,(int)caps.wNumButtons);
+      for (int i=0;i<buttons;i++) button[i]=false;
+      for (int i=0;i<axes;i++)    axe[i]=0.;    
+      active = true;    
+      
+      
+    }
+  }     
+  for (int i=0;i<buttons;i++) button[i]=0;
+  for (int i=0;i<axes;i++)	  axe[i]=0;
+  joyGetPosEx( gamepad_fd,&infoex)   ;      
+  infoex.dwFlags = JOY_RETURNALL;
+
+#else
+#if defined(__APPLE__)
+
+  // ??
+
+#else // LINUX
+
+  gamepad_fd = open(GAMEPAD_DEV, O_RDONLY | O_NONBLOCK);
+  if (gamepad_fd > 0) {
+    ioctl(gamepad_fd, JSIOCGNAME(256), name);
+    ioctl(gamepad_fd, JSIOCGVERSION, &version);
+    ioctl(gamepad_fd, JSIOCGAXES, &axes);
+    ioctl(gamepad_fd, JSIOCGBUTTONS, &buttons);
+    std::cout << "Joystick/Gamepad detected: " <<  name ;
+    std::cout << " (version " << version  << " / " ;
+    std::cout << (int)axes <<" axes /" ;
+    std::cout << (int)buttons <<" buttons)" << std::endl;
+    active = true;    
+  }
+#endif //(__APPLE__)
+#endif //(WIN32)
+
+  for (int i=0;i<std::min(9,(int)buttons);i++) button_map[i]=i;
+  for (int i=0;i<std::min(7,(int)axes);i++)    axe_map[i]=i;
+  axe_map[6]=1;
+  // another recognized map "Thrustmaster Run'N' Drive Wireless PS3"
+  // warning :: on Windows we dont have the human-friendly Model Name of the Gamepad
+  if ( strcmp(name,"Thrustmaster Run'N' Drive Wireless PS3" ) == 0){
+    button_map[0]=1;
+    button_map[1]=0;
+    button_map[5]=6;
+    button_map[6]=5;
+  } 
+}
+
+
+GamePad::~GamePad() {
+  active = false; 
+  gamepad_fd = 0;
+
+#if !defined(WIN32) 
+#if !defined(__APPLE__)
+
+  close(gamepad_fd);
+
+#endif //!(__APPLE__)
+#endif //!(WIN32)
+}
+
+
+
+bool GamePad::toggle(const int _nbut) {
+  bool res;
+  if( toggle_status[_nbut] ){ res = true; toggle_status[_nbut]=false;}
+  else { res=false;  }
+  return res;
+} 
+
+
+
+int GamePad::read_event() {
+
+#if defined(WIN32)
+
+  infoex.dwFlags = JOY_RETURNALL;
+  joyGetPosEx( gamepad_fd,&infoex) ;   
+    
+    axe[0]=(double)(( 1.*infoex.dwXpos-32767.)/32767.);
+    axe[1]=(double)(( 1.*infoex.dwYpos-32767.)/32767.);
+    axe[2]=(double)(( 1.*infoex.dwRpos-32767.)/32767.);
+    axe[3]=(double)(( 1.*infoex.dwZpos-32767.)/32767.);
+    if (infoex.dwPOV < 38000. ) {
+      double alpha = 3.14159/18000.* infoex.dwPOV;
+      axe[4]=1.001*sin(alpha);	 axe[5]=-1.001*cos(alpha);
+    }
+    else{ 
+      axe[4]= axe[5]=0.;
+    }
+    for (int i=0;i<6;i++)  if ( fabs( axe[i]) < .01)  axe[i]=0.;
+   
+    bool event=false;
+    int  event_num;
+    bool event_value;
+    for (int i=0;i<buttons;i++){
+      int bin=pow(2,i);	 
+      if( button[i] != (bool)(infoex.dwButtons & bin) ) {
+	event=true;
+	event_num=i;
+	event_value=(bool)(infoex.dwButtons & bin);
+      } 
+    }  
+    if(event){
+      if( button[event_num]==0 && event_value  ) {  toggle_status[event_num]=true; 	}
+      button[event_num]= event_value; 
+    }
+  /*
+    std::cout<< "--------------------" << std::endl;
+    std::cout<< infoex.dwXpos << std::endl;
+    std::cout<< infoex.dwYpos << std::endl;
+    std::cout<< infoex.dwZpos << std::endl;
+    std::cout<< infoex.dwRpos << std::endl;
+    std::cout<< infoex.dwUpos << std::endl;
+    std::cout<< infoex.dwVpos << std::endl;
+    std::cout<< infoex.dwButtons << std::endl;
+    std::cout<< infoex.dwButtonNumber << std::endl;
+    std::cout<< infoex.dwPOV << std::endl;
+  */
+#else
+#if defined(__APPLE__)
+
+  // ??
+
+#else // LINUX
+
+  int result = read(gamepad_fd, &event, sizeof(event)) ;
+  if (result > 0)    {
+    
+    switch (event.type)  {
+    case JS_EVENT_INIT:
+      break;
+
+    case JS_EVENT_INIT | JS_EVENT_AXIS:
+      break;
+
+    case JS_EVENT_INIT | JS_EVENT_BUTTON:
+      break;
+
+    case JS_EVENT_AXIS:
+      axe[(int)event.number]=(double)event.value/32767. ;
+      break;
+
+    case JS_EVENT_BUTTON:
+      if(button[(int)event.number]==0. && (bool)event.value) { toggle_status[(int)event.number]=true; }
+      button[(int)event.number]=(bool)event.value ;
+      break;
+
+    default:	
+      break;
+    }
+  }
+  
+#endif //(__APPLE__)
+#endif //(WIN32)
+
+  return 1;
+}
+
+
 
+void GamePad::affiche() {
+  for (int i=0;i<6;i++)  std::cout<<("_________");
+  std::cout<<std::endl;  std::cout<<"  axis ";
+  for (int i=0;i<6;i++)  std::cout<<" | "<<i;
+  std::cout<<std::endl;  std::cout<<"       ";
+  for (int i=0;i<6;i++)  std::cout<<" | "<< axe[i] ;
+  std::cout<<std::endl;   
+  for (int i=0;i<10;i++) std::cout<< ("_____");
+  std::cout<<std::endl;  std::cout<<" b.";
+  for (int i=0;i<10;i++) std::cout<<" | "<<i;
+  std::cout<<std::endl;  std::cout<<"   ";
+  for (int i=0;i<10;i++) std::cout<<" | "<<button[i];
+  std::cout<<std::endl;
+  for (int i=0;i<10;i++) std::cout<< ("_____");
+  std::cout<<std::endl;
+  
+}
 
-#if defined(WIN32) || defined(__APPLE__)
-
-
-   #include <cstring>
-   #include <string>
-   #include <iostream>
-   #include <stdio.h>
-   #include "GamePad.h"
-
-   GamePad::GamePad() : active(false), frequency(.01), gamepad_fd(0) {
-     for (int i=0;i<9;i++) button_map[i]=i;
-     for (int i=0;i<7;i++)    axe_map[i]=i;
-     axe_map[6]=1;
-     //  other recognized map "Thrustmaster Run'N' Drive Wireless PS3"
-     if ( strcmp(name,"Thrustmaster Run'N' Drive Wireless PS3" ) == 0){
-       button_map[0]=1;
-       button_map[1]=0;
-       button_map[5]=6;
-       button_map[6]=5;
-     }
-   }
-
-   GamePad::~GamePad() {  gamepad_fd = 0;}
-
-   bool GamePad::toggle(const int _nbut) {
-     bool res;
-     if( toggle_status[_nbut] ){ res = true; toggle_status[_nbut]=false;}
-     else { res=false;  }
-     return res;
-   }
-
-   int GamePad::read_event() {  return 1;}
-
-   void GamePad::affiche() {}
-
-
-
-
-#else // if !win32 => if linux/apple
-
-   #include <cstring>
-   #include <string>
-   #include <iostream>
-   #include <stdio.h>
-   #include "GamePad.h"
-   #include "Context.h"
-   #include <unistd.h>
-
-   GamePad::GamePad() : active(false), frequency(.01), gamepad_fd(0) {
-     gamepad_fd = open(GAMEPAD_DEV, O_RDONLY | O_NONBLOCK);
-     if (gamepad_fd > 0) {
-       ioctl(gamepad_fd, JSIOCGNAME(256), name);
-       ioctl(gamepad_fd, JSIOCGVERSION, &version);
-       ioctl(gamepad_fd, JSIOCGAXES, &axes);
-       ioctl(gamepad_fd, JSIOCGBUTTONS, &buttons);
-       std::cout << "Joystick/Gamepad detected: " <<  name ;
-       std::cout << " (version " << version  << " / " ;
-       std::cout << (int)axes <<" axes /" ;
-       std::cout << (int)buttons <<" buttons)" << std::endl;
-       active = true;
-     }
-
-     //    default map is "THRUSTMASTER FireStorm Dual Power"-like
-     //
-     //                    ######                                   ######
-     //                   # but5 #                                 # but7 #
-     //                 .########..                               ..#######.
-     //                ............                               .......... .
-     //               ...#######...                              ...########..
-     //               ..# but4 #...                              ...# but6  #..
-     //              ...########....... but9           but10........#########..
-     //              ....................                 .....................
-     //            .......#...................        ..........................
-     //           ......axis5..........................................####.......
-     //          ........ #...........................................# b3 #.......
-     //         ..........#...........................................#    #.......
-     //         ...###< axis4 >###...............................####..####..####...
-     //        ...........#.....................................# b1 #......# b2 #...
-     //       ............#.....................................#    #......#    #....
-     //       ............#......................................####........####.....
-     //      .............#.............................................####...........
-     //      ..........................................................# b0 #..........
-     //     ...........................................................#    #...........
-     //     .......................#######................#######.......####............
-     //    ......................#  axis1 ##............## axis3 ##......................
-     //    .....................##    |    ##..........##    |    ##.....................
-     //   ......................#<--axis0-->#..........#<--axis2--> #.....................
-     //   ......................##    |    ##. .####. .##    |    ##......................
-     //   .......................##   |   ##.. # b8 #...##   |   ##.......................
-     //  ..........................#######......####......#######.........................
-     //  ..................................................................................
-     //  .....................    ..........             .........    .....................
-     //  ....................                                          ....................
-     //  ..................                                              ..................
-     // ..................                                                ..................
-     // ..................                                                 .................
-     // .................                                                   ................
-     // ................                                                     ...............
-     //  ..............                                                       ..............
-     //  .............                                                         ............
-     //  ............                                                          ............
-     //   ..........                                                             ..........
-     //    .......                                                                ........
-     //     ....                                                                     ...
-     //
-
-     for (int i=0;i<9;i++) button_map[i]=i;
-     for (int i=0;i<7;i++)    axe_map[i]=i;
-     axe_map[6]=1;
-
-
-     //  other recognized map "Thrustmaster Run'N' Drive Wireless PS3"
-     if ( strcmp(name,"Thrustmaster Run'N' Drive Wireless PS3" ) == 0){
-       button_map[0]=1;
-       button_map[1]=0;
-       button_map[5]=6;
-       button_map[6]=5;
-     }
-
-   }
-
-   GamePad::~GamePad() {
-     if (gamepad_fd > 0) {    active = false;    close(gamepad_fd);  }
-     gamepad_fd = 0;
-   }
-
-   bool GamePad::toggle(const int _nbut) {
-     bool res;
-     if( toggle_status[_nbut] ){ res = true; toggle_status[_nbut]=false;}
-     else { res=false;  }
-     return res;
-   }
-
-   int GamePad::read_event() {
-     int result = read(gamepad_fd, &event, sizeof(event)) ;
-     if (result > 0)
-       {
-	 //   time( &rawtime );
-	 switch (event.type)
-	   {
-	   case JS_EVENT_INIT:
-	     break;
-	   case JS_EVENT_INIT | JS_EVENT_AXIS:
-	     break;
-	   case JS_EVENT_INIT | JS_EVENT_BUTTON:
-	     break;
-	   case JS_EVENT_AXIS:
-	     //	std::cout<< "------"<<rawtime<<"---- " <<std::endl;
-	     axe[(int)event.number]=(double)event.value/32767. ;
-	     break;
-	   case JS_EVENT_BUTTON:
-	     //	std::cout<< "------"<<rawtime<<"---- " <<std::endl;
-	     if(button[(int)event.number]==0. && (bool)event.value)
-	       { toggle_status[(int)event.number]=true; }
-	     button[(int)event.number]=(bool)event.value ;
-
-	     break;
-	   default:
-	     break;
-	   }
-       }
-     //  std::cout<< "------"<<rawtime<<"---- " <<std::endl;
-     //  else if (event_read){changed=false;}
-     return 1;
-
-   }
-
-
-   void GamePad::affiche() {
-     //	printf ("----------------------------------------------\n");
-     for (int i=0;i<axes;i++) printf ("___________");
-     printf ("\n");
-     for (int i=0;i<axes;i++) printf ("  axis %2d |",i);
-     printf ("\n");
-     for (int i=0;i<axes;i++) printf (" %7f |", axe[i] );
-     printf ("\n");
-     for (int i=0;i<buttons;i++) printf ("_______");
-     printf ("\n");
-     for (int i=0;i<buttons;i++) printf (" b.%2d |",i);
-     printf ("\n");
-     for (int i=0;i<buttons;i++) printf (" %4d |",button[i]);
-     printf ("\n");
-     for (int i=0;i<buttons;i++) printf ("_______");
-     printf ("\n");
-   }
-
-
-
-#endif // win32
diff --git a/Common/GamePad.h b/Common/GamePad.h
index 1b1bfd189b9dd2e204bb10478a44f756a4d967f0..74ed1ae0ddd13f8ec1ee5aaf269f7f70dd40f3a6 100644
--- a/Common/GamePad.h
+++ b/Common/GamePad.h
@@ -14,70 +14,62 @@
 #define GP_AXES 6
 
 
-
-#if defined(WIN32) || defined(__APPLE__)
-
-   class GamePad {
-   public:
-     bool active;
-     bool toggle_status[GP_BUTTONS];
-     bool event_read;
-     double frequency;
-     GamePad();
-     ~GamePad();
-     double axe[GP_AXES];
-     bool button[GP_BUTTONS];
-     bool toggle(const int _nbut);
-     int read_event();
-     void affiche();
-     int button_map[10];
-     int axe_map[8];
-   private:
-     int gamepad_fd;
-     //  js_event event;
-     //  __u32 version;
-     //  __u8 axes;
-     //  __u8 buttons;
-     char name[256];
-   };
-
-
-
-#else // !win32 => linux/apple
-
-
-   #include <linux/joystick.h>
-   #include <fcntl.h>
-
-   #define GAMEPAD_DEV "/dev/input/js0"
-
-   class GamePad {
-   public:
-     bool active;
-     bool toggle_status[GP_BUTTONS];
-     bool event_read;
-     double frequency;
-     GamePad();
-     ~GamePad();
-     double axe[GP_AXES];
-     bool button[GP_BUTTONS];
-     bool toggle(const int _nbut);
-     int read_event();
-     void affiche();
-     int button_map[10];
-     int axe_map[8];
-
-
-   private:
-     //  time_t  rawtime;
-     int gamepad_fd;
-     js_event event;
-     __u32 version;
-     __u8 axes;
-     __u8 buttons;
-     char name[256];
-   };
-
-#endif //win32
+#if defined(WIN32)
+#include <windows.h>   
+#include <mmsystem.h>
+#else
+#if defined(__APPLE__)
+// ??
+#else // LINUX
+#include <linux/joystick.h>
+#include <fcntl.h>
+#define GAMEPAD_DEV "/dev/input/js0"
+#endif
+#endif
+
+class GamePad {
+ public:
+  bool active;
+  bool toggle_status[GP_BUTTONS];
+  bool event_read;
+  double frequency;
+  GamePad();
+  ~GamePad();
+  double axe[GP_AXES];
+  bool button[GP_BUTTONS];
+  bool toggle(const int _nbut); 
+  int read_event(); 
+  void affiche(); 
+  int button_map[10];
+  int axe_map[8];
+ private:
+  int axe_min[8];
+  int axe_max[8];
+  int gamepad_fd;
+  char name[256];
+
+#if defined(WIN32)
+
+  JOYCAPS caps;
+  JOYINFOEX infoex;
+  JOYINFO info;
+  int axes;
+  int buttons;
+
+#else
+#if defined(__APPLE__)
+
+  // ??
+
+#else // LINUX
+
+  js_event event;
+  __u32 version;
+  __u8 axes;
+  __u8 buttons;
+
+#endif
+#endif
+};  
 
 #endif // _GAMEPAD_H_
diff --git a/Fltk/Navigator.cpp b/Fltk/Navigator.cpp
index 1f08c869d2a3ea45133c3fe8b95ef456b573f809..25772b48e242881a6817c4b7a0bee67c4b418c95 100644
--- a/Fltk/Navigator.cpp
+++ b/Fltk/Navigator.cpp
@@ -59,7 +59,7 @@ void Navigator::drawIcons()
   glPushMatrix();
   glLineWidth( (float)CTX::instance()->lineWidth);
   gl2psLineWidth((float)(CTX::instance()->lineWidth *
-			 CTX::instance()->print.epsLineWidthFactor));
+  			 CTX::instance()->print.epsLineWidthFactor));
 
   glColor4ubv((GLubyte *) & CTX::instance()->color.smallAxes);
     
@@ -601,6 +601,7 @@ void Navigator::drawIcons()
   
 
   glDisable (GL_BLEND);
+  glDisable (GL_LINE_SMOOTH);
   glPopMatrix();
   
 }
diff --git a/Fltk/gamepadWindow.cpp b/Fltk/gamepadWindow.cpp
index cc0f3212beadbc1899bf54f97f6d185ac0ed853c..24d0b45871de338eb09eb603394dc93a3f9144a6 100644
--- a/Fltk/gamepadWindow.cpp
+++ b/Fltk/gamepadWindow.cpp
@@ -43,7 +43,7 @@ static  void gamepadWindow_handler(void *data)
     gamepadWindow* gmpd_win = (gamepadWindow*)data;
     GamePad* pad  = &(CTX::instance()->gamepad);
     for (int i=0; i<std::min(13,GP_BUTTONS);i++) gmpd_win->gamepad.butt[i]->value(pad->button[i]);
-    for (int i=0; i<std::min(9,GP_AXES);i++)     gmpd_win->gamepad.axe[i]->value(pad->axe[i]);
+    for (int i=0; i<std::min(9,GP_AXES);i++)     gmpd_win->gamepad.axe[i]->value( pad->axe[i]   );
     Fl::add_timeout(gmpd_win->frequency,  gamepadWindow_handler,data); 
     gmpd_win->gamepad.mapping[16]->value(pad->axe_map[1]);
   }