diff options
| -rw-r--r-- | configs/linux-fbdev | 10 | ||||
| -rw-r--r-- | src/glut/fbdev/callback.c | 3 | ||||
| -rw-r--r-- | src/glut/fbdev/colormap.c | 6 | ||||
| -rw-r--r-- | src/glut/fbdev/cursor.c | 22 | ||||
| -rw-r--r-- | src/glut/fbdev/fbdev.c | 91 | ||||
| -rw-r--r-- | src/glut/fbdev/input.c | 282 | ||||
| -rw-r--r-- | src/glut/fbdev/internal.h | 5 | ||||
| -rw-r--r-- | src/glut/fbdev/menu.c | 2 | ||||
| -rw-r--r-- | src/glut/fbdev/overlay.c | 1 | ||||
| -rw-r--r-- | src/mesa/Makefile | 4 | 
10 files changed, 253 insertions, 173 deletions
| diff --git a/configs/linux-fbdev b/configs/linux-fbdev index 7a5d1b600f..e36d20a702 100644 --- a/configs/linux-fbdev +++ b/configs/linux-fbdev @@ -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 diff --git a/src/glut/fbdev/callback.c b/src/glut/fbdev/callback.c index 946c8d8c13..8c039f530b 100644 --- a/src/glut/fbdev/callback.c +++ b/src/glut/fbdev/callback.c @@ -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;  } diff --git a/src/glut/fbdev/colormap.c b/src/glut/fbdev/colormap.c index 3a81f93657..3e72a7b051 100644 --- a/src/glut/fbdev/colormap.c +++ b/src/glut/fbdev/colormap.c @@ -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; diff --git a/src/glut/fbdev/cursor.c b/src/glut/fbdev/cursor.c index 6cd087e93c..4bb2b7fba0 100644 --- a/src/glut/fbdev/cursor.c +++ b/src/glut/fbdev/cursor.c @@ -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();  } diff --git a/src/glut/fbdev/fbdev.c b/src/glut/fbdev/fbdev.c index 7b46d54592..3b63cd70ea 100644 --- a/src/glut/fbdev/fbdev.c +++ b/src/glut/fbdev/fbdev.c @@ -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) diff --git a/src/glut/fbdev/input.c b/src/glut/fbdev/input.c index d09de22ed7..044aa50fd8 100644 --- a/src/glut/fbdev/input.c +++ b/src/glut/fbdev/input.c @@ -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 diff --git a/src/glut/fbdev/internal.h b/src/glut/fbdev/internal.h index 8801cc9f6c..0a159d96b0 100644 --- a/src/glut/fbdev/internal.h +++ b/src/glut/fbdev/internal.h @@ -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); diff --git a/src/glut/fbdev/menu.c b/src/glut/fbdev/menu.c index 18cd58d6a2..4ab4eb30d4 100644 --- a/src/glut/fbdev/menu.c +++ b/src/glut/fbdev/menu.c @@ -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); diff --git a/src/glut/fbdev/overlay.c b/src/glut/fbdev/overlay.c index 8bd207155c..374cf30e7d 100644 --- a/src/glut/fbdev/overlay.c +++ b/src/glut/fbdev/overlay.c @@ -24,6 +24,7 @@   * Written by Sean D'Epagnier (c) 2006   */ +#include <stdlib.h>  #include <GL/gl.h>  void glutEstablishOverlay(void) diff --git a/src/mesa/Makefile b/src/mesa/Makefile index 3f65ecf5cc..1cd9e5b2bb 100644 --- a/src/mesa/Makefile +++ b/src/mesa/Makefile @@ -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 | 
