aboutsummaryrefslogtreecommitdiffstats
path: root/src/glut
diff options
context:
space:
mode:
Diffstat (limited to 'src/glut')
-rw-r--r--src/glut/directfb/ext.c7
-rw-r--r--src/glut/directfb/internal.h3
-rw-r--r--src/glut/fbdev/callback.c5
-rw-r--r--src/glut/fbdev/colormap.c9
-rw-r--r--src/glut/fbdev/cursor.c24
-rw-r--r--src/glut/fbdev/ext.c2
-rw-r--r--src/glut/fbdev/fbdev.c89
-rw-r--r--src/glut/fbdev/gamemode.c1
-rw-r--r--src/glut/fbdev/input.c348
-rw-r--r--src/glut/fbdev/internal.h12
-rw-r--r--src/glut/fbdev/menu.c4
-rw-r--r--src/glut/fbdev/overlay.c1
-rw-r--r--src/glut/fbdev/state.c1
13 files changed, 306 insertions, 200 deletions
diff --git a/src/glut/directfb/ext.c b/src/glut/directfb/ext.c
index d7338ce5f7b..e37ecf5afad 100644
--- a/src/glut/directfb/ext.c
+++ b/src/glut/directfb/ext.c
@@ -156,6 +156,13 @@ glutGetProcAddress( const char *name )
return glut_functions[i].address;
}
+#if DIRECTFBGL_INTERFACE_VERSION >= 1
+ if (g_current) {
+ void *address = NULL;
+ g_current->gl->GetProcAddress( g_current->gl, name, &address );
+ return address;
+ }
+#endif
return NULL;
}
diff --git a/src/glut/directfb/internal.h b/src/glut/directfb/internal.h
index 2e986c9f286..bc3e20e93e7 100644
--- a/src/glut/directfb/internal.h
+++ b/src/glut/directfb/internal.h
@@ -26,8 +26,9 @@
#include <directfb.h>
#include <directfb_version.h>
+#include <directfbgl.h>
+
#include "GL/glut.h"
-#include "GL/directfbgl.h"
#define VERSION_CODE( M, m, r ) (((M) << 16) | ((m) << 8) | ((r)))
diff --git a/src/glut/fbdev/callback.c b/src/glut/fbdev/callback.c
index 37373672d36..8c039f530be 100644
--- a/src/glut/fbdev/callback.c
+++ b/src/glut/fbdev/callback.c
@@ -24,6 +24,8 @@
* Written by Sean D'Epagnier (c) 2006
*/
+#include <stdlib.h>
+
#include <GL/glut.h>
#include "internal.h"
@@ -72,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 89556ef4a5c..3e72a7b0513 100644
--- a/src/glut/fbdev/colormap.c
+++ b/src/glut/fbdev/colormap.c
@@ -24,6 +24,7 @@
* Written by Sean D'Epagnier (c) 2006
*/
+#include <stdio.h>
#include <stdlib.h>
#include <linux/fb.h>
@@ -37,7 +38,7 @@
#define TORMAP(x)(unsigned short)((x<0?0:x>1?1:x)*(GLfloat)(REVERSECMAPSIZE-1))
#define FROMCMAP(x) (GLfloat)x / (GLfloat)((1<<16) - 1)
-static struct fb_cmap ColorMap;
+static struct fb_cmap ColorMap, OriginalColorMap;
unsigned short RedColorMap[256], GreenColorMap[256], BlueColorMap[256];
@@ -91,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 88386956a44..4bb2b7fba01 100644
--- a/src/glut/fbdev/cursor.c
+++ b/src/glut/fbdev/cursor.c
@@ -28,8 +28,10 @@
to render the cursor, this is faster, it would be good to use a hardware
cursor if it exists instead */
+#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
+#include <string.h>
#include <linux/fb.h>
@@ -64,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;
@@ -108,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];
@@ -210,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;
@@ -228,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;
}
@@ -258,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/ext.c b/src/glut/fbdev/ext.c
index 4a3c185a16d..65953e705b9 100644
--- a/src/glut/fbdev/ext.c
+++ b/src/glut/fbdev/ext.c
@@ -24,6 +24,8 @@
* Written by Sean D'Epagnier (c) 2006
*/
+#include <stdio.h>
+
#include <GL/gl.h>
#include <GL/glut.h>
diff --git a/src/glut/fbdev/fbdev.c b/src/glut/fbdev/fbdev.c
index ce6419816dd..3b63cd70ea1 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));
@@ -574,7 +607,7 @@ void SetVideoMode(void)
LoadColorMap();
}
-void CreateBuffer()
+void CreateBuffer(void)
{
int size = VarInfo.xres_virtual * VarInfo.yres_virtual
* VarInfo.bits_per_pixel / 8;
@@ -673,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 */
@@ -708,10 +727,7 @@ static void SignalWinch(int arg)
VarInfo.blue = blue;
VarInfo.transp = transp;
- SetVideoMode();
- CreateBuffer();
-
- ResizeVisual();
+ Resized = 1;
}
int glutCreateWindow (const char *title)
@@ -786,6 +802,7 @@ void glutDestroyWindow(int win)
glFBDevDestroyContext(Context);
glFBDevDestroyBuffer(Buffer);
glFBDevDestroyVisual(Visual);
+
Visual = NULL;
}
@@ -803,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;
@@ -837,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/gamemode.c b/src/glut/fbdev/gamemode.c
index 9f32d9d7e82..30be36af7af 100644
--- a/src/glut/fbdev/gamemode.c
+++ b/src/glut/fbdev/gamemode.c
@@ -24,6 +24,7 @@
* Written by Sean D'Epagnier (c) 2006
*/
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
diff --git a/src/glut/fbdev/input.c b/src/glut/fbdev/input.c
index 2528a74a105..1445682c760 100644
--- a/src/glut/fbdev/input.c
+++ b/src/glut/fbdev/input.c
@@ -53,7 +53,7 @@
int GpmMouse;
#endif
-int CurrentVT;
+int CurrentVT = 0;
int ConsoleFD = -1;
int KeyboardModifiers;
@@ -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,46 @@ 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);
+ else
+ if(key == 27)
+ exit(0); /* no handler, to provide a way to exit */
+}
+
+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 +212,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 +228,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 +315,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;
}
@@ -342,19 +409,17 @@ static int ReadKey(void)
labelval = '\b';
break;
case K_ENTER:
- case K_ENTER - 1: /* keypad enter */
labelval = '\r'; break;
}
+ /* likely a keypad input, but depends on keyboard mapping, ignore */
+ if(labelval == 512)
+ return 1;
+
/* dispatch callback */
- if(specialkey) {
- if(release) {
- if(SpecialUpFunc)
- SpecialUpFunc(specialkey, MouseX, MouseY);
- } else
- if(SpecialFunc)
- SpecialFunc(specialkey, MouseX, MouseY);
- } else {
+ if(specialkey)
+ HandleSpecialPress(specialkey, release);
+ else {
char c = labelval;
if(KeyboardLedState & LED_CAP) {
@@ -364,12 +429,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 +492,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 +532,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 +542,16 @@ static int ReadMouse(void)
EraseCursor();
+ MouseVisible = 1;
+
if(ActiveMenu)
Redisplay = 1;
else
SwapCursor();
}
+ LastMouseTime = glutGet(GLUT_ELAPSED_TIME);
+
return 1;
}
@@ -502,8 +560,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,9 +590,6 @@ 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);
-
RestoreColorMap();
Active = 1;
@@ -536,7 +597,6 @@ static void VTSwitchHandler(int sig)
VisibleSwitch = 1;
Redisplay = 1;
-
break;
}
}
@@ -549,37 +609,11 @@ void InitializeVT(int usestdin)
signal(SIGIO, SIG_IGN);
- /* save old terminos settings */
- if (tcgetattr(0, &OldTermios) < 0) {
- sprintf(exiterror, "tcgetattr failed\n");
- exit(0);
- }
-
- tio = OldTermios;
-
- /* terminos settings for straight-through mode */
- tio.c_lflag &= ~(ICANON | ECHO | ISIG);
- tio.c_iflag &= ~(ISTRIP | IGNCR | ICRNL | INLCR | IXOFF | IXON);
- tio.c_iflag |= IGNBRK;
-
- tio.c_cc[VMIN] = 0;
- tio.c_cc[VTIME] = 0;
-
- if (tcsetattr(0, TCSANOW, &tio) < 0) {
- sprintf(exiterror, "tcsetattr failed\n");
- 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) {
ConsoleFD = 0;
- return;
+ goto setattribs;
}
/* detect the current vt if it was not specified */
@@ -590,15 +624,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;
+ goto setattribs;
+ }
+ CurrentVT = st.v_active;
close(fd);
}
@@ -613,7 +648,7 @@ void InitializeVT(int usestdin)
sprintf(exiterror, "error couldn't open %s,"
" defaulting to stdin \n", console);
ConsoleFD = 0;
- return;
+ goto setattribs;
}
signal(SIGUSR1, VTSwitchHandler);
@@ -623,7 +658,7 @@ void InitializeVT(int usestdin)
sprintf(exiterror,"Failed to grab %s, defaulting to stdin\n", console);
close(ConsoleFD);
ConsoleFD = 0;
- return;
+ goto setattribs;
}
vt = OldVTMode;
@@ -655,7 +690,7 @@ void InitializeVT(int usestdin)
exit(0);
}
- fcntl(0, F_SETOWN, getpid());
+ fcntl(ConsoleFD, F_SETOWN, getpid());
if(ioctl(ConsoleFD, KDGETMODE, &OldMode) < 0)
sprintf(exiterror, "Warning: Failed to get terminal mode\n");
@@ -668,7 +703,6 @@ void InitializeVT(int usestdin)
if(ioctl(ConsoleFD, KDSKBMODE, K_MEDIUMRAW) < 0) {
sprintf(exiterror, "ioctl KDSKBMODE failed!\n");
- tcsetattr(0, TCSANOW, &OldTermios);
exit(0);
}
@@ -676,6 +710,34 @@ void InitializeVT(int usestdin)
sprintf(exiterror, "ioctl KDGKBLED failed!\n");
exit(0);
}
+
+ setattribs:
+ /* enable async input input */
+ if(fcntl(ConsoleFD, F_SETFL, O_ASYNC) < 0) {
+ sprintf(exiterror, "Failed to set O_ASYNC mode on fd %d\n", ConsoleFD);
+ exit(0);
+ }
+
+ /* save old terminos settings */
+ if (tcgetattr(ConsoleFD, &OldTermios) < 0) {
+ sprintf(exiterror, "tcgetattr failed\n");
+ exit(0);
+ }
+
+ tio = OldTermios;
+
+ /* terminos settings for straight-through mode */
+ tio.c_lflag &= ~(ICANON | ECHO | ISIG);
+ tio.c_iflag &= ~(ISTRIP | IGNCR | ICRNL | INLCR | IXOFF | IXON);
+ tio.c_iflag |= IGNBRK;
+
+ tio.c_cc[VMIN] = 0;
+ tio.c_cc[VTIME] = 0;
+
+ if (tcsetattr(ConsoleFD, TCSANOW, &tio) < 0) {
+ sprintf(exiterror, "tcsetattr failed\n");
+ exit(0);
+ }
}
void RestoreVT(void)
@@ -683,13 +745,13 @@ void RestoreVT(void)
if(ConsoleFD < 0)
return;
- if (tcsetattr(0, TCSANOW, &OldTermios) < 0)
- fprintf(stderr, "tcsetattr failed\n");
+ if (tcsetattr(ConsoleFD, TCSANOW, &OldTermios) < 0)
+ sprintf(exiterror, "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 +787,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 082cd4f6f3a..0a159d96b0a 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;
@@ -72,20 +74,20 @@ extern GLFBDevVisualPtr Visual;
#define REVERSECMAPSIZE (1<<REVERSECMAPSIZELOG)
extern unsigned short RedColorMap[256],
- GreenColorMap[256],
- BlueColorMap[256];
+ GreenColorMap[256],
+ BlueColorMap[256];
extern unsigned char ReverseColorMap[REVERSECMAPSIZE]
[REVERSECMAPSIZE]
[REVERSECMAPSIZE];
-void LoadOldColorMap(void);
+
void LoadColorMap(void);
-void UnloadColorMap(void);
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 f5a5ef75434..4ab4eb30d46 100644
--- a/src/glut/fbdev/menu.c
+++ b/src/glut/fbdev/menu.c
@@ -25,6 +25,8 @@
*/
#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
#include <linux/fb.h>
@@ -69,6 +71,7 @@ void FreeMenus(void)
free(Menus[i].Items[j].name);
free(Menus[i].Items);
}
+
free(Menus);
}
@@ -204,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 8bd207155c0..374cf30e7df 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/glut/fbdev/state.c b/src/glut/fbdev/state.c
index bca675c52c4..212a04aa028 100644
--- a/src/glut/fbdev/state.c
+++ b/src/glut/fbdev/state.c
@@ -24,6 +24,7 @@
* Written by Sean D'Epagnier (c) 2006
*/
+#include <string.h>
#include <sys/time.h>
#include <linux/fb.h>