summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean D'Epagnier <geckosenator@freedesktop.org>2006-08-23 07:55:48 +0000
committerJosé Fonseca <jfonseca@vmware.com>2011-07-11 20:03:34 +0100
commit8a89ae39952f700760adb33a66e0e2b709640718 (patch)
tree65eaf76f5d360c87247509eb6277bb69a610d456
parentcf8cb1c55fc3924f2dacb09988523145c405004a (diff)
downloadglut-8a89ae39952f700760adb33a66e0e2b709640718.tar.gz
VT switching now uses correct keys. exiting when virtual screen size is larger than regular size doesn't corrupt screen. colormap is reset when using stdin input on exit. return is not reported as ctrl-m but '\r' as it should be backspace keycode was incorrect and not working, fixed
-rw-r--r--src/glut/fbdev/cursor.c3
-rw-r--r--src/glut/fbdev/fbdev.c3
-rw-r--r--src/glut/fbdev/input.c70
3 files changed, 58 insertions, 18 deletions
diff --git a/src/glut/fbdev/cursor.c b/src/glut/fbdev/cursor.c
index e7fb00f..9254e12 100644
--- a/src/glut/fbdev/cursor.c
+++ b/src/glut/fbdev/cursor.c
@@ -25,7 +25,8 @@
*/
/* these routines are written to access graphics memory directly, not using mesa
- to render the cursor, this is faster, and */
+ to render the cursor, this is faster, it would be good to use a hardware
+ cursor if it exists instead */
#include <stdlib.h>
#include <inttypes.h>
diff --git a/src/glut/fbdev/fbdev.c b/src/glut/fbdev/fbdev.c
index 10bc6ea..1c6cea0 100644
--- a/src/glut/fbdev/fbdev.c
+++ b/src/glut/fbdev/fbdev.c
@@ -117,6 +117,9 @@ static void Cleanup(void)
/* restore original variable screen info */
if(FrameBufferFD != -1) {
+ OrigVarInfo.xoffset = 0;
+ OrigVarInfo.yoffset = 0;
+
if (ioctl(FrameBufferFD, FBIOPUT_VSCREENINFO, &OrigVarInfo))
fprintf(stderr, "ioctl(FBIOPUT_VSCREENINFO failed): %s\n",
strerror(errno));
diff --git a/src/glut/fbdev/input.c b/src/glut/fbdev/input.c
index 4fbd94d..7914669 100644
--- a/src/glut/fbdev/input.c
+++ b/src/glut/fbdev/input.c
@@ -69,7 +69,7 @@ int KeyRepeatMode = GLUT_KEY_REPEAT_DEFAULT;
int MouseEnabled = 0;
static int OldKDMode = -1;
-static int OldMode;
+static int OldMode = KD_TEXT;
static struct vt_mode OldVTMode;
static struct termios OldTermios;
@@ -92,7 +92,8 @@ static void KeyboardHandler(int sig)
{
int release, labelval;
unsigned char code;
- struct kbentry entry;
+ struct kbentry entry;
+ static int lalt; /* only left alt does vt switch */
if(read(ConsoleFD, &code, 1) != 1)
return;
@@ -118,21 +119,36 @@ static void KeyboardHandler(int sig)
MODIFIER(GLUT_ACTIVE_CTRL);
return;
case K_ALT:
+ lalt = !release;
case K_ALTGR:
MODIFIER(GLUT_ACTIVE_ALT);
return;
}
- if(!release && labelval >= K_F1 && labelval <= K_F12)
- if(KeyboardModifiers & GLUT_ACTIVE_ALT) {
- /* VT switch, we must do it */
+ if(lalt && !release) {
+ /* VT switch, we must do it */
+ int vt = -1;
+ struct vt_stat st;
+ if(labelval >= K_F1 && labelval <= K_F12)
+ vt = labelval - K_F1 + 1;
+
+ if(labelval == K_LEFT)
+ if(ioctl(ConsoleFD, VT_GETSTATE, &st) >= 0)
+ vt = st.v_active - 1;
+
+ if(labelval == K_RIGHT)
+ if(ioctl(ConsoleFD, VT_GETSTATE, &st) >= 0)
+ vt = st.v_active - 1;
+
+ if(vt != -1) {
if(Swapping)
- VTSwitch = labelval - K_F1 + 1;
+ VTSwitch = vt;
else
- if(ioctl(ConsoleFD, VT_ACTIVATE, labelval - K_F1 + 1) < 0)
+ if(ioctl(ConsoleFD, VT_ACTIVATE, vt) < 0)
sprintf(exiterror, "Error switching console\n");
return;
}
+ }
write(kbdpipe[1], &code, 1);
}
@@ -153,7 +169,7 @@ static void LedModifier(int led, int release)
#define READKEY read(kbdpipe[0], &code, 1)
static int ReadKey(void)
{
- int release, labelval;
+ int release, labelval, labelvalnoshift;
unsigned char code;
int specialkey = 0;
struct kbentry entry;
@@ -227,7 +243,7 @@ static int ReadKey(void)
if(SpecialFunc)
SpecialFunc(specialkey, MouseX, MouseY);
} else {
- if(code >= 1 && code <= 26) {
+ if(code >= 1 && code <= 26 && code != '\r') {
KeyboardModifiers |= GLUT_ACTIVE_CTRL;
code += 'a' - 1;
}
@@ -260,6 +276,13 @@ static int ReadKey(void)
entry.kb_index = code;
entry.kb_table = 0;
+ if (ioctl(ConsoleFD, KDGKBENT, &entry) < 0) {
+ sprintf(exiterror, "ioctl(KDGKBENT) failed.\n");
+ exit(0);
+ }
+
+ labelvalnoshift = entry.kb_value;
+
if(KeyboardModifiers & GLUT_ACTIVE_SHIFT)
entry.kb_table |= K_SHIFTTAB;
@@ -270,7 +293,7 @@ static int ReadKey(void)
labelval = entry.kb_value;
- switch(labelval) {
+ switch(labelvalnoshift) {
case K_CAPS:
LedModifier(LED_CAP, release);
return 0;
@@ -293,7 +316,7 @@ static int ReadKey(void)
if(labelval >= K_F1 && labelval <= K_F12)
specialkey = GLUT_KEY_F1 + labelval - K_F1;
else
- switch(labelval) {
+ switch(labelvalnoshift) {
case K_LEFT:
specialkey = GLUT_KEY_LEFT; break;
case K_UP:
@@ -312,9 +335,10 @@ static int ReadKey(void)
specialkey = GLUT_KEY_END; break;
case K_INSERT:
specialkey = GLUT_KEY_INSERT; break;
- case K_REMOVE:
+ case 127:
labelval = '\b'; break;
case K_ENTER:
+ case K_ENTER - 1: /* keypad enter */
labelval = '\n'; break;
}
@@ -634,7 +658,6 @@ void InitializeVT(int usestdin)
if(ioctl(ConsoleFD, KDSETMODE, KD_GRAPHICS) < 0)
sprintf(exiterror,"Warning: Failed to set terminal to graphics\n");
-
if (ioctl(ConsoleFD, KDSKBMODE, K_MEDIUMRAW) < 0) {
sprintf(exiterror, "ioctl KDSKBMODE failed!\n");
tcsetattr(0, TCSANOW, &OldTermios);
@@ -655,6 +678,22 @@ void RestoreVT(void)
if (tcsetattr(0, TCSANOW, &OldTermios) < 0)
fprintf(stderr, "tcsetattr failed\n");
+ /* setting the mode to text from graphics restores the colormap*/
+ if(
+#ifdef HAVE_GPM
+ GpmMouse ||
+#endif
+ ConsoleFD == 0)
+ if(ioctl(ConsoleFD, KDSETMODE, KD_GRAPHICS) < 0) {
+ sprintf(exiterror,"Warning: Failed to set terminal to graphics\n");
+ goto skipioctl; /* no need to fail twice */
+ }
+
+ if(ioctl(ConsoleFD, KDSETMODE, OldMode) < 0)
+ fprintf(stderr, "ioctl KDSETMODE failed!\n");
+
+ skipioctl:
+
if(ConsoleFD == 0)
return;
@@ -664,10 +703,7 @@ void RestoreVT(void)
if (ioctl(ConsoleFD, KDSKBMODE, OldKDMode) < 0)
fprintf(stderr, "ioctl KDSKBMODE failed!\n");
-
- if(ioctl(ConsoleFD, KDSETMODE, OldMode) < 0)
- fprintf(stderr, "ioctl KDSETMODE failed!\n");
-
+
close(ConsoleFD);
}