the following improvements to linux-fbdev:
authorSean D'Epagnier <geckosenator@freedesktop.org>
Thu, 30 Nov 2006 03:25:28 +0000 (03:25 +0000)
committerSean D'Epagnier <geckosenator@freedesktop.org>
Thu, 30 Nov 2006 03:25:28 +0000 (03:25 +0000)
1. updated makefiles to build libOSMesa as well as libGL

these are improvements to fbdev-glut
1. mouse cursor will timeout and be invisible if not being used
2. do not restore colormaps to truecolor targets, this causes problems at
   exit on my g450
3. fixed a crash when cleaning up from failure by munmaping what had not
   yet been mmaped
4. Resize event handling is improved, the resize function is not invoked
   from a signal handler now.
5. The main loop can detect if it is running very fast (greater than 2khz)
6. keyboard up and special up events are generated from stdin input mode
   and if it is also not redrawing, it sleeps
7. corrections in escape sequences for function keys for stdin input

configs/linux-fbdev
src/glut/fbdev/callback.c
src/glut/fbdev/colormap.c
src/glut/fbdev/cursor.c
src/glut/fbdev/fbdev.c
src/glut/fbdev/input.c
src/glut/fbdev/internal.h
src/glut/fbdev/menu.c
src/glut/fbdev/overlay.c
src/mesa/Makefile

index 7a5d1b600f9803b03b5fa68c2172db41e54fe90d..e36d20a702cdd40d26938c37e6a8a793648c99a5 100644 (file)
@@ -4,17 +4,13 @@ include $(TOP)/configs/linux
 
 CONFIG_NAME = linux-fbdev
 
-DRIVER_DIRS = fbdev
+CFLAGS = -O3 -ffast-math -ansi -pedantic -fPIC -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -DPTHREADS -DUSE_GLFBDEV_DRIVER
 
 SRC_DIRS = mesa glu glut/fbdev
-
-CFLAGS = -O3 -ffast-math -ansi -pedantic -fPIC -ffast-math -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -DPTHREADS -DUSE_GLFBDEV_DRIVER
-
-
-SRC_DIRS = mesa glu glut/fbdev
-DRIVER_DIRS = fbdev
+DRIVER_DIRS = fbdev osmesa
 PROGRAM_DIRS = fbdev demos redbook samples
 
 GL_LIB_DEPS = $(EXTRA_LIB_PATH) -lm -lpthread
+OSMESA_LIB_DEPS = -lm -lpthread
 GLUT_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(GLU_LIB) -l$(GL_LIB) $(EXTRA_LIB_PATH) -lgpm -lm
 
index 946c8d8c133327514be1eff542541cfa9b8d8b7d..8c039f530bec42a2369ba18003ac3b49100694cd 100644 (file)
@@ -74,19 +74,16 @@ void glutKeyboardUpFunc(void (*func)(unsigned char key, int x, int y))
 
 void glutMouseFunc(void (*func)(int button, int state, int x, int y))
 {
-   MouseEnabled = 1;
    MouseFunc = func;
 }
 
 void glutMotionFunc(void (*func)(int x, int y))
 {
-   MouseEnabled = 1;
    MotionFunc = func;
 }
 
 void glutPassiveMotionFunc(void (*func)(int x, int y))
 {
-   MouseEnabled = 1;
    PassiveMotionFunc = func;
 }
 
index 3a81f93657dbe3f1a9586c59becf73c88810e762..3e72a7b05133cd4e2beae209ac992a9dc813eda2 100644 (file)
@@ -92,12 +92,18 @@ static void FillReverseColorMap(void)
 
 void RestoreColorMap(void)
 {
+   if(FixedInfo.visual == FB_VISUAL_TRUECOLOR)
+      return;
+
    if (ioctl(FrameBufferFD, FBIOPUTCMAP, (void *) &ColorMap) < 0)
       sprintf(exiterror, "ioctl(FBIOPUTCMAP) failed!\n");
 }
 
 void LoadColorMap(void)
 {
+   if(FixedInfo.visual == FB_VISUAL_TRUECOLOR)
+      return;
+
    ColorMap.start = 0;
    ColorMap.red   = RedColorMap;
    ColorMap.green = GreenColorMap;
index 6cd087e93c899ce03206a78045944e4c2baa53b9..4bb2b7fba0128756a4fc2257fdc641fb8d811d72 100644 (file)
@@ -66,6 +66,9 @@ void EraseCursor(void)
 
    unsigned char *src = MouseBuffer;
 
+   if(!MouseVisible || CurrentCursor < 0 || CurrentCursor >= NUM_CURSORS)
+      return;
+
    for(i = 0; i<CURSOR_HEIGHT; i++) {
       memcpy(BackBuffer + off, src, stride);
       src += stride;
@@ -110,7 +113,7 @@ void DrawCursor(void)
    unsigned char *c;
    const unsigned char *d;
 
-   if(CurrentCursor < 0 || CurrentCursor >= NUM_CURSORS)
+   if(!MouseVisible || CurrentCursor < 0 || CurrentCursor >= NUM_CURSORS)
       return;
 
    px = MouseX - CursorsXOffset[CurrentCursor];
@@ -212,10 +215,12 @@ void SwapCursor(void)
    int miny = MIN(py, LastMouseY);
    int sizey = abs(py - LastMouseY);
 
-   DrawCursor();
-   /* now update the portion of the screen that has changed */
+   if(MouseVisible)
+      DrawCursor();
 
-   if(DisplayMode & GLUT_DOUBLE && (sizex || sizey)) {
+   /* now update the portion of the screen that has changed, this is also
+      used to hide the mouse if MouseVisible is 0 */
+   if(DisplayMode & GLUT_DOUBLE && ((sizex || sizey) || !MouseVisible)) {
       int off, stride, i;
       if(minx < 0)
         minx = 0;
@@ -230,7 +235,7 @@ void SwapCursor(void)
         + minx * VarInfo.bits_per_pixel / 8;
       stride = (sizex + CURSOR_WIDTH) * VarInfo.bits_per_pixel / 8;
 
-      for(i = 0; i< sizey + CURSOR_HEIGHT; i++) {
+      for(i = 0; i < sizey + CURSOR_HEIGHT; i++) {
         memcpy(FrameBuffer+off, BackBuffer+off, stride);
         off += FixedInfo.line_length;
       }
@@ -260,11 +265,8 @@ void glutSetCursor(int cursor)
    if(cursor == GLUT_CURSOR_FULL_CROSSHAIR)
       cursor = GLUT_CURSOR_CROSSHAIR;
 
-   if(CurrentCursor >= 0 && CurrentCursor < NUM_CURSORS)
-      EraseCursor();
-
+   EraseCursor();
+   MouseVisible = 1;
    CurrentCursor = cursor;
-
-   MouseEnabled = 1;
    SwapCursor();
 }
index 7b46d545920658339f9f269282b2814b005acb99..3b63cd70ea18e201d0ef8c541440f20c3cdfaf03 100644 (file)
@@ -74,6 +74,7 @@ int Redisplay;
 int Visible;
 int VisibleSwitch;
 int Active;
+static int Resized;
 /* we have to poll to see if we are visible
    on a framebuffer that is not active */
 int VisiblePoll;
@@ -127,8 +128,10 @@ static void Cleanup(void)
         fprintf(stderr, "ioctl(FBIOPUT_VSCREENINFO failed): %s\n",
                 strerror(errno));
 
-      munmap(FrameBuffer, FixedInfo.smem_len);
+      if(FrameBuffer)
+         munmap(FrameBuffer, FixedInfo.smem_len);
       close(FrameBufferFD);
+
    }
 
    /* free allocated back buffer */
@@ -424,6 +427,8 @@ static void ProcessTimers(void)
 
 void glutMainLoop(void)
 {
+   int idleiters;
+
    if(ReshapeFunc)
       ReshapeFunc(VarInfo.xres, VarInfo.yres);
 
@@ -440,8 +445,6 @@ void glutMainLoop(void)
       else
         if(VisiblePoll)
            TestVisible();
-        else
-           usleep(1);
 
       if(IdleFunc)
         IdleFunc();
@@ -452,17 +455,48 @@ void glutMainLoop(void)
            VisibilityFunc(Visible ? GLUT_VISIBLE : GLUT_NOT_VISIBLE);
       }
 
+      if(Resized) {
+         SetVideoMode();
+         CreateBuffer();
+
+         if(!glFBDevMakeCurrent( Context, Buffer, Buffer )) {
+            sprintf(exiterror, "Failure to Make Current\n");
+            exit(0);
+         }
+
+         InitializeMenus();
+
+         if(ReshapeFunc)
+            ReshapeFunc(VarInfo.xres, VarInfo.yres);
+
+         Redisplay = 1;
+         Resized = 0;
+      }
+
       if(Visible && Redisplay) {
         Redisplay = 0;
-        if(MouseEnabled)
-           EraseCursor();
+         EraseCursor();
         DisplayFunc();
         if(!(DisplayMode & GLUT_DOUBLE)) {
            if(ActiveMenu)
               DrawMenus();
-           if(MouseEnabled)
-              DrawCursor();
+            DrawCursor();
         }
+         idleiters = 0;
+      } else {
+         /* we sleep if not receiving redisplays, and
+            the main loop is running faster than 2khz */
+
+         static int lasttime;
+         int time = glutGet(GLUT_ELAPSED_TIME);
+         if(time > lasttime) {
+            if(idleiters >= 2)
+               usleep(100);
+
+            idleiters = 0;
+            lasttime = time;
+         }
+         idleiters++;         
       }
    }
 }
@@ -536,17 +570,16 @@ int ParseFBModes(int minw, int maxw, int minh, int maxh, int minf, int maxf)
    return 0;
 }
 
-/* ---------- Window Management ----------*/
 void SetVideoMode(void)
 {
    /* set new variable screen info */
    if (ioctl(FrameBufferFD, FBIOPUT_VSCREENINFO, &VarInfo)) {
-      sprintf(exiterror, "ioctl(FBIOPUT_VSCREENINFO failed): %s\n",
-             strerror(errno));
+      sprintf(exiterror, "FBIOPUT_VSCREENINFO failed: %s\n", strerror(errno));
+      strcat(exiterror, "Perhaps the device does not support the selected mode\n");
       exit(0);
    }
 
-   /* reload the screen info to update offsets */
+   /* reload the screen info to update rgb bits */
    if (ioctl(FrameBufferFD, FBIOGET_VSCREENINFO, &VarInfo)) {
       sprintf(exiterror, "error: ioctl(FBIOGET_VSCREENINFO) failed: %s\n",
              strerror(errno));
@@ -571,11 +604,10 @@ void SetVideoMode(void)
    }
 
    /* initialize colormap */
-   if(FixedInfo.visual != FB_VISUAL_TRUECOLOR)
-      LoadColorMap();
+   LoadColorMap();
 }
 
-void CreateBuffer()
+void CreateBuffer(void)
 {
    int size = VarInfo.xres_virtual * VarInfo.yres_virtual
                               * VarInfo.bits_per_pixel / 8;
@@ -674,20 +706,6 @@ void CreateVisual(void)
    }
 }
 
-static void ResizeVisual(void)
-{ 
-   if(!glFBDevMakeCurrent( Context, Buffer, Buffer )) {
-      sprintf(exiterror, "Failure to Make Current\n");
-      exit(0);
-   }
-
-   InitializeMenus();
-
-   if(ReshapeFunc)
-      ReshapeFunc(VarInfo.xres, VarInfo.yres);
-   Redisplay = 1;
-}
-
 static void SignalWinch(int arg)
 {
    /* we can't change bitdepth without destroying the visual */
@@ -709,10 +727,7 @@ static void SignalWinch(int arg)
    VarInfo.blue = blue;
    VarInfo.transp = transp;
 
-   SetVideoMode();
-   CreateBuffer();
-
-   ResizeVisual();
+   Resized = 1;
 }
 
 int glutCreateWindow (const char *title)
@@ -805,12 +820,14 @@ void glutSwapBuffers(void)
 {
    glFlush();
 
+   if(!(DisplayMode & GLUT_DOUBLE))
+      return;
+
    if(ActiveMenu)
       DrawMenus();
-   if(MouseEnabled)
-      DrawCursor();
+   DrawCursor();
 
-   if(DisplayMode & GLUT_DOUBLE && Visible) {
+   if(Visible) {
       Swapping = 1;
       glFBDevSwapBuffers(Buffer);
       Swapping = 0;
@@ -839,10 +856,8 @@ void glutReshapeWindow(int width, int height)
    signal(SIGWINCH, SIG_IGN);
 
    SetVideoMode();
-   CreateBuffer();
-
-   ResizeVisual();
    signal(SIGWINCH, SignalWinch);
+   Resized = 1;
 }
 
 void glutFullScreen(void)
index d09de22ed7eae8b0309cb6dbc7cc60ca50988c0b..044aa50fd86a6dccaae46a323063b159921fc529 100644 (file)
@@ -65,8 +65,8 @@ double MouseSpeed = 0;
 
 int KeyRepeatMode = GLUT_KEY_REPEAT_DEFAULT;
 
-/* only display the mouse if there is a registered callback for it */
-int MouseEnabled = 0;
+int MouseVisible = 0;
+int LastMouseTime = 0;
 
 static int OldKDMode = -1;
 static int OldMode = KD_TEXT;
@@ -79,6 +79,8 @@ static int MouseFD;
 
 static int kbdpipe[2];
 
+static int LastStdinKeyTime, LastStdinSpecialKey = -1, LastStdinCode = -1;
+
 #define MODIFIER(mod) \
     KeyboardModifiers = release ? KeyboardModifiers & ~mod   \
                                 : KeyboardModifiers | mod;
@@ -93,7 +95,6 @@ static void KeyboardHandler(int sig)
    unsigned char code;
 
    while(read(ConsoleFD, &code, 1) == 1) {
-
       int release, labelval;
       struct kbentry entry;
       static int lalt; /* only left alt does vt switch */
@@ -163,10 +164,47 @@ static void LedModifier(int led, int release)
         KeyboardLedState ^= led;
         releaseflag &= ~led;
       }
+
    ioctl(ConsoleFD, KDSKBLED, KeyboardLedState);
    ioctl(ConsoleFD, KDSETLED, 0x80);
 }
 
+static void HandleKeyPress(unsigned char key, int up)
+{
+   if(up) {
+      if(KeyboardUpFunc)
+         KeyboardUpFunc(key, MouseX, MouseY);
+   } else
+      if(KeyboardFunc)
+         KeyboardFunc(key, MouseX, MouseY);
+
+   /* there was no keyboard handler to provide a way to exit the program */
+   if(key == 27)
+      exit(0); 
+}
+
+static void HandleSpecialPress(int key, int up)
+{
+   if(up) {
+      if(SpecialUpFunc)
+         SpecialUpFunc(key, MouseX, MouseY);
+   } else
+      if(SpecialFunc)
+         SpecialFunc(key, MouseX, MouseY);
+}
+
+static void ReleaseStdinKey(void)
+{
+   if(LastStdinSpecialKey != -1) {
+      HandleSpecialPress(LastStdinSpecialKey, 1);
+      LastStdinSpecialKey = -1;
+   }
+   if(LastStdinCode != -1) {
+      HandleKeyPress(LastStdinCode, 1);
+      LastStdinCode = -1;
+   }
+}
+
 #define READKEY read(kbdpipe[0], &code, 1)
 static int ReadKey(void)
 {
@@ -175,8 +213,14 @@ static int ReadKey(void)
    int specialkey = 0;
    struct kbentry entry; 
 
-   if(READKEY != 1)
+   if(READKEY != 1) {
+      /* if we are reading from stdin, we detect key releases when the key
+         does not repeat after a given timeout */
+      if(ConsoleFD == 0 && LastStdinKeyTime + 100 < glutGet(GLUT_ELAPSED_TIME))
+         ReleaseStdinKey();
       return 0;
+   }
+
    if(code == 0)
       return 0;
 
@@ -185,65 +229,82 @@ static int ReadKey(void)
       KeyboardModifiers = 0;
    altset:
       if(code == 27 && READKEY == 1) {
-        switch(code) {
-        case 79: /* function key */
-           READKEY;
-           if(code == 50) {
-              READKEY;
-           shiftfunc:
-              KeyboardModifiers |= GLUT_ACTIVE_SHIFT;
-              specialkey = GLUT_KEY_F1 + code - 53;
-              READKEY;
-           } else {
-              READKEY;
-              specialkey = GLUT_KEY_F1 + code - 80;                
-           }
-           break;
-        case 91:
-           READKEY;
-           switch(code) {
-           case 68:
-              specialkey = GLUT_KEY_LEFT; break;
-           case 65:
-              specialkey = GLUT_KEY_UP; break;
-           case 67:
-              specialkey = GLUT_KEY_RIGHT; break;
-           case 66:
-              specialkey = GLUT_KEY_DOWN; break;
-           case 53:
-              specialkey = GLUT_KEY_PAGE_UP; READKEY; break;
-           case 54:
-              specialkey = GLUT_KEY_PAGE_DOWN; READKEY; break;
-           case 49:
-              specialkey = GLUT_KEY_HOME; READKEY; break;
-           case 52:
-              specialkey = GLUT_KEY_END; READKEY; break;
-           case 50:
-              READKEY;
-              if(code != 126)
-                 goto shiftfunc;
-              specialkey = GLUT_KEY_INSERT;
-              break; 
-           case 51:
-              code = '\b';
-              goto stdkey;
-           case 91:
-              READKEY;
-              specialkey = GLUT_KEY_F1 + code - 65;
-              break;
-           default:
-              return 0;
-           }
-           break;
-        default:
+         if(code != 91) {
            KeyboardModifiers |= GLUT_ACTIVE_ALT;
            goto altset;
         }
+         READKEY;
+         switch(code) {
+         case 68:
+            specialkey = GLUT_KEY_LEFT; break;
+         case 65:
+            specialkey = GLUT_KEY_UP; break;
+         case 67:
+            specialkey = GLUT_KEY_RIGHT; break;
+         case 66:
+            specialkey = GLUT_KEY_DOWN; break;
+         case 52:
+            specialkey = GLUT_KEY_END; READKEY; break;
+         case 53:
+            specialkey = GLUT_KEY_PAGE_UP; READKEY; break;
+         case 54:
+            specialkey = GLUT_KEY_PAGE_DOWN; READKEY; break;
+         case 49:
+            READKEY;
+            if(code == 126)
+               specialkey = GLUT_KEY_HOME;
+            else {
+               specialkey = GLUT_KEY_F1 + code - 50;
+               READKEY;
+            }
+            break;
+         case 50:
+            READKEY;
+            if(code == 126)
+               specialkey = GLUT_KEY_INSERT;
+            else {
+               if(code > '1')
+                  code--;
+               if(code > '6')
+                  code--;
+               if(code > '3') {
+                  KeyboardModifiers |= GLUT_ACTIVE_SHIFT;
+                  code -= 12;
+               }
+               specialkey = GLUT_KEY_F1 + code - 40;
+               READKEY;
+            }
+            break; 
+         case 51:
+            READKEY;
+            if(code == 126) {
+               code = '\b';
+               goto stdkey;
+            }
+            KeyboardModifiers |= GLUT_ACTIVE_SHIFT;
+            specialkey = GLUT_KEY_F1 + code - 45;
+            READKEY;
+            break;
+         case 91:
+            READKEY;
+            specialkey = GLUT_KEY_F1 + code - 65;
+            break;
+         default:
+            return 0;
+        }
       }
 
       if(specialkey) {
-        if(SpecialFunc)
-           SpecialFunc(specialkey, MouseX, MouseY);
+         LastStdinKeyTime = glutGet(GLUT_ELAPSED_TIME);
+
+         if(LastStdinSpecialKey != specialkey) {
+            ReleaseStdinKey();
+            HandleSpecialPress(specialkey, 0);
+            LastStdinSpecialKey = specialkey;
+            LastStdinKeyTime += 200; /* initial repeat */
+         } else
+         if(KeyRepeatMode != GLUT_KEY_REPEAT_OFF)
+            HandleSpecialPress(specialkey, 0);
       } else {
         if(code >= 1 && code <= 26 && code != '\r') {
            KeyboardModifiers |= GLUT_ACTIVE_CTRL;
@@ -255,8 +316,15 @@ static int ReadKey(void)
            KeyboardModifiers |= GLUT_ACTIVE_SHIFT;
 
       stdkey:
-        if(KeyboardFunc)
-           KeyboardFunc(code, MouseX, MouseY);
+         LastStdinKeyTime = glutGet(GLUT_ELAPSED_TIME);
+         if(LastStdinCode != code) {
+            ReleaseStdinKey();
+            HandleKeyPress(code, 0);
+            LastStdinCode = code;
+            LastStdinKeyTime += 200; /* initial repeat */
+         } else
+         if(KeyRepeatMode != GLUT_KEY_REPEAT_OFF)
+            HandleSpecialPress(code, 0);
       }
       return 1;
    }
@@ -348,12 +416,7 @@ static int ReadKey(void)
 
    /* dispatch callback */
    if(specialkey) {
-      if(release) {
-        if(SpecialUpFunc)
-           SpecialUpFunc(specialkey, MouseX, MouseY);
-      } else
-        if(SpecialFunc)
-           SpecialFunc(specialkey, MouseX, MouseY);
+      HandleSpecialPress(specialkey, release);
    } else {
       char c = labelval;
 
@@ -364,12 +427,7 @@ static int ReadKey(void)
            if(c >= 'a' && c <= 'z')
               c += 'A' - 'a';
       }
-      if(release) {
-        if(KeyboardUpFunc)
-           KeyboardUpFunc(c, MouseX, MouseY);
-      } else
-        if(KeyboardFunc)
-           KeyboardFunc(c, MouseX, MouseY);
+      HandleKeyPress(c, release);
    }
    return 1;
 }
@@ -432,28 +490,22 @@ static int ReadMouse(void)
       dy = event.dy;
    } else
 #endif
-      {
-        char data[4];
-
-        if(MouseFD == -1)
-           return 0;
+   {
+      char data[4];
 
-        if(fcntl(MouseFD, F_SETFL, O_NONBLOCK) == -1) {
-           close(MouseFD);
-           MouseFD = -1;
-           return 0;
-        }
+      if(MouseFD == -1)
+         return 0;
 
-        if(read(MouseFD, data, 4) != 4)
-           return 0;
+      if(read(MouseFD, data, 4) != 4)
+         return 0;
        
-        l = ((data[0] & 0x20) >> 3);
-        m = ((data[3] & 0x10) >> 3);
-        r = ((data[0] & 0x10) >> 4);
+      l = ((data[0] & 0x20) >> 3);
+      m = ((data[3] & 0x10) >> 3);
+      r = ((data[0] & 0x10) >> 4);
 
-        dx = (((data[0] & 0x03) << 6) | (data[1] & 0x3F));
-        dy = (((data[0] & 0x0C) << 4) | (data[2] & 0x3F));
-      }
+      dx = (((data[0] & 0x03) << 6) | (data[1] & 0x3F));
+      dy = (((data[0] & 0x0C) << 4) | (data[2] & 0x3F));
+   }
 
    MouseX += dx * MouseSpeed;
    if(MouseX < 0)
@@ -478,7 +530,7 @@ static int ReadMouse(void)
 
    ll = l, lm = m, lr = r;
 
-   if(dx || dy) {
+   if(dx || dy || !MouseVisible) {
       if(l || m || r) {
         if(MotionFunc)
            MotionFunc(MouseX, MouseY);
@@ -488,12 +540,16 @@ static int ReadMouse(void)
 
       EraseCursor();
 
+      MouseVisible = 1;
+
       if(ActiveMenu)
         Redisplay = 1;
       else
         SwapCursor();
    }
 
+   LastMouseTime = glutGet(GLUT_ELAPSED_TIME);
+
    return 1;
 }
 
@@ -502,8 +558,14 @@ void ReceiveInput(void)
    if(ConsoleFD != -1)
       while(ReadKey());
     
-   if(MouseEnabled)
-      while(ReadMouse());
+   while(ReadMouse());
+
+   /* implement a 2 second timeout on the mouse */
+   if(MouseVisible && glutGet(GLUT_ELAPSED_TIME) - LastMouseTime > 2000) {
+      EraseCursor();
+      MouseVisible = 0;
+      SwapCursor();
+   }
 }
 
 static void VTSwitchHandler(int sig)
@@ -526,11 +588,7 @@ static void VTSwitchHandler(int sig)
       if(st.v_active)
         ioctl(ConsoleFD, VT_RELDISP, VT_ACKACQ);
 
-      /* this is a hack to turn the cursor off */
-      ioctl(FrameBufferFD, FBIOPUT_VSCREENINFO, &VarInfo);
-
-      if(FixedInfo.visual != FB_VISUAL_TRUECOLOR)
-         RestoreColorMap();
+      RestoreColorMap();
 
       Active = 1;
       Visible = 1;
@@ -570,11 +628,6 @@ void InitializeVT(int usestdin)
       exit(0);
    }
 
-   if(fcntl(0, F_SETFL, O_NONBLOCK | O_ASYNC) < 0) {
-      sprintf(exiterror, "Failed to set keyboard to non-blocking\n");
-      exit(0);
-   }
-
    Active = 1;
 
    if(usestdin) {
@@ -582,6 +635,12 @@ void InitializeVT(int usestdin)
       return;
    }
 
+   /* enable sigio for input */
+   if(fcntl(0, F_SETFL, O_ASYNC) < 0) {
+      sprintf(exiterror, "Failed to set O_ASYNC mode on fd 0\n");
+      exit(0);
+   }
+
    /* detect the current vt if it was not specified */
    if(CurrentVT == 0) {
       int fd = open("/dev/tty", O_RDWR | O_NDELAY, 0);
@@ -590,15 +649,16 @@ void InitializeVT(int usestdin)
         sprintf(exiterror, "Failed to open /dev/tty\n");
         exit(0);
       }
+
       if(ioctl(fd, VT_GETSTATE, &st) == -1) {
         fprintf(stderr, "Could not detect current vt, specify with -vt\n");
         fprintf(stderr, "Defaulting to stdin input\n");
         ConsoleFD = 0;
         close(fd);
         return;
-      } else
-        CurrentVT =  st.v_active;
+      }
 
+      CurrentVT =  st.v_active;
       close(fd);
    }
     
@@ -686,10 +746,10 @@ void RestoreVT(void)
    if (tcsetattr(0, TCSANOW, &OldTermios) < 0)
       fprintf(stderr, "tcsetattr failed\n");
 
-   /* setting the mode to text from graphics restores the colormap*/
+   /* setting the mode to text from graphics restores the colormap */
    if(
 #ifdef HAVE_GPM
-   GpmMouse ||
+   !GpmMouse ||
 #endif
    ConsoleFD == 0)
       if(ioctl(ConsoleFD, KDSETMODE, KD_GRAPHICS) < 0)
@@ -725,11 +785,11 @@ void InitializeMouse(void)
       const char *mousedev = getenv("MOUSE");
       if(!mousedev)
         mousedev = MOUSEDEV;
-      if((MouseFD = open(mousedev, O_RDONLY)) >= 0) {
-        if(!MouseSpeed)
-           MouseSpeed = 1;
-        NumMouseButtons = 3;
-        return;
+      if((MouseFD = open(mousedev, O_RDONLY | O_NONBLOCK)) >= 0) {
+         if(!MouseSpeed)
+            MouseSpeed = 1;
+         NumMouseButtons = 3;
+         return;
       }
    }
 #ifdef HAVE_GPM
index 8801cc9f6c3a6c9072089d0c2cca331587406240..0a159d96b0a50cd387142c9522148154073dd3a0 100644 (file)
@@ -51,6 +51,8 @@ extern int Swapping, VTSwitch;
 
 void TestVisible(void);
 int ParseFBModes(int, int, int, int, int, int);
+void SetVideoMode(void);
+void CreateBuffer(void);
 void CreateVisual(void);
 
 extern int FrameBufferFD;
@@ -84,7 +86,8 @@ void RestoreColorMap(void);
 /* --- mouse --- */
 extern int MouseX, MouseY;
 extern int CurrentCursor;
-extern int MouseEnabled;
+extern int MouseVisible;
+extern int LastMouseTime;
 extern int NumMouseButtons;
 
 void InitializeCursor(void);
index 18cd58d6a2d9464dd102605f58b355039ff75f88..4ab4eb30d461e457be63ce450b17e217ddbfa376 100644 (file)
@@ -71,6 +71,7 @@ void FreeMenus(void)
         free(Menus[i].Items[j].name);
       free(Menus[i].Items);
    }
+   
    free(Menus);
 }
 
@@ -206,7 +207,6 @@ void CloseMenu(void)
 
 int glutCreateMenu(void (*func)(int value))
 {
-   MouseEnabled = 1;
    CurrentMenu = NumMenus;
    NumMenus++;
    Menus = realloc(Menus, sizeof(*Menus) * NumMenus);
index 8bd207155c0f7524e40ac8c126d70daa67f0b3d1..374cf30e7dfca4c516e311c8605733ef2a19aaf4 100644 (file)
@@ -24,6 +24,7 @@
  * Written by Sean D'Epagnier (c) 2006
  */
 
+#include <stdlib.h>
 #include <GL/gl.h>
 
 void glutEstablishOverlay(void)
index 3f65ecf5cc9df3fe0f3ef27069d9e4158b33c37b..1cd9e5b2bb77fc75d9a6ad03d5c12e42278272d6 100644 (file)
@@ -33,8 +33,8 @@ default:
                $(MAKE) beos ; \
        elif [ "$(DRIVER_DIRS)" = "directfb" ]; then \
                $(MAKE) directfb ; \
-       elif [ "$(DRIVER_DIRS)" = "fbdev" ]; then \
-               $(MAKE) fbdev ; \
+       elif [ "$(DRIVER_DIRS)" = "fbdev osmesa" ]; then \
+               $(MAKE) fbdev ; $(MAKE) osmesa-only ; \
        else \
                $(MAKE) stand-alone ; \
        fi