src/video/fbcon/SDL_fbevents.c
author Sam Lantinga <slouken@libsdl.org>
Mon, 08 May 2006 05:36:45 +0000
changeset 1781 d8030f368b84
parent 1780 7a36f01acf71
child 1787 15ae67aa6b4b
permissions -rw-r--r--
Get updates to the shadow surface while switched away
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
     1
/*
1312
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1241
diff changeset
     2
    SDL - Simple DirectMedia Layer
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1241
diff changeset
     3
    Copyright (C) 1997-2006 Sam Lantinga
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
     4
1312
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1241
diff changeset
     5
    This library is free software; you can redistribute it and/or
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1241
diff changeset
     6
    modify it under the terms of the GNU Lesser General Public
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1241
diff changeset
     7
    License as published by the Free Software Foundation; either
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1241
diff changeset
     8
    version 2.1 of the License, or (at your option) any later version.
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
     9
1312
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1241
diff changeset
    10
    This library is distributed in the hope that it will be useful,
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1241
diff changeset
    11
    but WITHOUT ANY WARRANTY; without even the implied warranty of
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1241
diff changeset
    12
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1241
diff changeset
    13
    Lesser General Public License for more details.
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    14
1312
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1241
diff changeset
    15
    You should have received a copy of the GNU Lesser General Public
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1241
diff changeset
    16
    License along with this library; if not, write to the Free Software
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1241
diff changeset
    17
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    18
1312
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1241
diff changeset
    19
    Sam Lantinga
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1241
diff changeset
    20
    slouken@libsdl.org
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1241
diff changeset
    21
*/
1402
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1379
diff changeset
    22
#include "SDL_config.h"
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    23
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    24
/* Handle the event stream, converting console events into SDL events */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    25
1338
604d73db6802 Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents: 1336
diff changeset
    26
#include <stdio.h>
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    27
#include <sys/types.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    28
#include <sys/time.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    29
#include <sys/ioctl.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    30
#include <unistd.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    31
#include <fcntl.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    32
#include <errno.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    33
#include <limits.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    34
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    35
/* For parsing /proc */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    36
#include <dirent.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    37
#include <ctype.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    38
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    39
#include <linux/vt.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    40
#include <linux/kd.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    41
#include <linux/keyboard.h>
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    42
1359
1e4ba2e063b4 *** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents: 1358
diff changeset
    43
#include "SDL_timer.h"
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    44
#include "SDL_mutex.h"
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1359
diff changeset
    45
#include "../SDL_sysvideo.h"
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1359
diff changeset
    46
#include "../../events/SDL_sysevents.h"
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1359
diff changeset
    47
#include "../../events/SDL_events_c.h"
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    48
#include "SDL_fbvideo.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    49
#include "SDL_fbevents_c.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    50
#include "SDL_fbkeys.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    51
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    52
#include "SDL_fbelo.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    53
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    54
#ifndef GPM_NODE_FIFO
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    55
#define GPM_NODE_FIFO	"/dev/gpmdata"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    56
#endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    57
1778
e28233f37f8c Fixed detection of current vt when not running as root.
Sam Lantinga <slouken@libsdl.org>
parents: 1776
diff changeset
    58
/*#define DEBUG_KEYBOARD*/
1772
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
    59
/*#define DEBUG_MOUSE*/
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    60
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    61
/* The translation tables from a console scancode to a SDL keysym */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    62
#define NUM_VGAKEYMAPS	(1<<KG_CAPSSHIFT)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    63
static Uint16 vga_keymap[NUM_VGAKEYMAPS][NR_KEYS];
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    64
static SDLKey keymap[128];
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    65
static Uint16 keymap_temp[128]; /* only used at startup */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    66
static SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    67
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    68
/* Ugh, we have to duplicate the kernel's keysym mapping code...
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    69
   Oh, it's not so bad. :-)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    70
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    71
   FIXME: Add keyboard LED handling code
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    72
 */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    73
static void FB_vgainitkeymaps(int fd)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    74
{
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    75
	struct kbentry entry;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    76
	int map, i;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    77
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    78
	/* Don't do anything if we are passed a closed keyboard */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    79
	if ( fd < 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    80
		return;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    81
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    82
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    83
	/* Load all the keysym mappings */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    84
	for ( map=0; map<NUM_VGAKEYMAPS; ++map ) {
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1323
diff changeset
    85
		SDL_memset(vga_keymap[map], 0, NR_KEYS*sizeof(Uint16));
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    86
		for ( i=0; i<NR_KEYS; ++i ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    87
			entry.kb_table = map;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    88
			entry.kb_index = i;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    89
			if ( ioctl(fd, KDGKBENT, &entry) == 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    90
				/* fill keytemp. This replaces SDL_fbkeys.h */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    91
				if ( (map == 0) && (i<128) ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    92
					keymap_temp[i] = entry.kb_value;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    93
				}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    94
				/* The "Enter" key is a special case */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    95
				if ( entry.kb_value == K_ENTER ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    96
					entry.kb_value = K(KT_ASCII,13);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    97
				}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    98
				/* Handle numpad specially as well */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
    99
				if ( KTYP(entry.kb_value) == KT_PAD ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   100
					switch ( entry.kb_value ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   101
					case K_P0:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   102
					case K_P1:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   103
					case K_P2:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   104
					case K_P3:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   105
					case K_P4:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   106
					case K_P5:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   107
					case K_P6:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   108
					case K_P7:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   109
					case K_P8:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   110
					case K_P9:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   111
						vga_keymap[map][i]=entry.kb_value;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   112
						vga_keymap[map][i]+= '0';
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   113
						break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   114
										case K_PPLUS:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   115
						vga_keymap[map][i]=K(KT_ASCII,'+');
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   116
						break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   117
										case K_PMINUS:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   118
						vga_keymap[map][i]=K(KT_ASCII,'-');
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   119
						break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   120
										case K_PSTAR:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   121
						vga_keymap[map][i]=K(KT_ASCII,'*');
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   122
						break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   123
										case K_PSLASH:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   124
						vga_keymap[map][i]=K(KT_ASCII,'/');
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   125
						break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   126
										case K_PENTER:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   127
						vga_keymap[map][i]=K(KT_ASCII,'\r');
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   128
						break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   129
										case K_PCOMMA:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   130
						vga_keymap[map][i]=K(KT_ASCII,',');
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   131
						break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   132
										case K_PDOT:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   133
						vga_keymap[map][i]=K(KT_ASCII,'.');
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   134
						break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   135
					default:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   136
						break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   137
					}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   138
				}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   139
				/* Do the normal key translation */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   140
				if ( (KTYP(entry.kb_value) == KT_LATIN) ||
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   141
					 (KTYP(entry.kb_value) == KT_ASCII) ||
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   142
					 (KTYP(entry.kb_value) == KT_LETTER) ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   143
					vga_keymap[map][i] = entry.kb_value;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   144
				}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   145
			}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   146
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   147
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   148
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   149
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   150
int FB_InGraphicsMode(_THIS)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   151
{
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   152
	return((keyboard_fd >= 0) && (saved_kbd_mode >= 0));
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   153
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   154
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   155
int FB_EnterGraphicsMode(_THIS)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   156
{
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   157
	struct termios keyboard_termios;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   158
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   159
	/* Set medium-raw keyboard mode */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   160
	if ( (keyboard_fd >= 0) && !FB_InGraphicsMode(this) ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   161
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   162
		/* Switch to the correct virtual terminal */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   163
		if ( current_vt > 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   164
			struct vt_stat vtstate;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   165
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   166
			if ( ioctl(keyboard_fd, VT_GETSTATE, &vtstate) == 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   167
				saved_vt = vtstate.v_active;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   168
			}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   169
			if ( ioctl(keyboard_fd, VT_ACTIVATE, current_vt) == 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   170
				ioctl(keyboard_fd, VT_WAITACTIVE, current_vt);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   171
			}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   172
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   173
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   174
		/* Set the terminal input mode */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   175
		if ( tcgetattr(keyboard_fd, &saved_kbd_termios) < 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   176
			SDL_SetError("Unable to get terminal attributes");
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   177
			if ( keyboard_fd > 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   178
				close(keyboard_fd);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   179
			}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   180
			keyboard_fd = -1;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   181
			return(-1);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   182
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   183
		if ( ioctl(keyboard_fd, KDGKBMODE, &saved_kbd_mode) < 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   184
			SDL_SetError("Unable to get current keyboard mode");
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   185
			if ( keyboard_fd > 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   186
				close(keyboard_fd);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   187
			}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   188
			keyboard_fd = -1;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   189
			return(-1);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   190
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   191
		keyboard_termios = saved_kbd_termios;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   192
		keyboard_termios.c_lflag &= ~(ICANON | ECHO | ISIG);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   193
		keyboard_termios.c_iflag &= ~(ISTRIP | IGNCR | ICRNL | INLCR | IXOFF | IXON);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   194
		keyboard_termios.c_cc[VMIN] = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   195
		keyboard_termios.c_cc[VTIME] = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   196
		if (tcsetattr(keyboard_fd, TCSAFLUSH, &keyboard_termios) < 0) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   197
			FB_CloseKeyboard(this);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   198
			SDL_SetError("Unable to set terminal attributes");
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   199
			return(-1);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   200
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   201
		/* This will fail if we aren't root or this isn't our tty */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   202
		if ( ioctl(keyboard_fd, KDSKBMODE, K_MEDIUMRAW) < 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   203
			FB_CloseKeyboard(this);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   204
			SDL_SetError("Unable to set keyboard in raw mode");
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   205
			return(-1);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   206
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   207
		if ( ioctl(keyboard_fd, KDSETMODE, KD_GRAPHICS) < 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   208
			FB_CloseKeyboard(this);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   209
			SDL_SetError("Unable to set keyboard in graphics mode");
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   210
			return(-1);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   211
		}
1780
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   212
		/* Prevent switching the virtual terminal */
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   213
		ioctl(keyboard_fd, VT_LOCKSWITCH, 1);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   214
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   215
	return(keyboard_fd);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   216
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   217
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   218
void FB_LeaveGraphicsMode(_THIS)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   219
{
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   220
	if ( FB_InGraphicsMode(this) ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   221
		ioctl(keyboard_fd, KDSETMODE, KD_TEXT);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   222
		ioctl(keyboard_fd, KDSKBMODE, saved_kbd_mode);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   223
		tcsetattr(keyboard_fd, TCSAFLUSH, &saved_kbd_termios);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   224
		saved_kbd_mode = -1;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   225
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   226
		/* Head back over to the original virtual terminal */
1780
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   227
		ioctl(keyboard_fd, VT_UNLOCKSWITCH, 1);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   228
		if ( saved_vt > 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   229
			ioctl(keyboard_fd, VT_ACTIVATE, saved_vt);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   230
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   231
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   232
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   233
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   234
void FB_CloseKeyboard(_THIS)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   235
{
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   236
	if ( keyboard_fd >= 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   237
		FB_LeaveGraphicsMode(this);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   238
		if ( keyboard_fd > 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   239
			close(keyboard_fd);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   240
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   241
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   242
	keyboard_fd = -1;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   243
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   244
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   245
int FB_OpenKeyboard(_THIS)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   246
{
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   247
	/* Open only if not already opened */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   248
 	if ( keyboard_fd < 0 ) {
91
e85e03f195b4 From: "Markus F.X.J. Oberhumer"
Sam Lantinga <slouken@lokigames.com>
parents: 69
diff changeset
   249
		static const char * const tty0[] = { "/dev/tty0", "/dev/vc/0", NULL };
e85e03f195b4 From: "Markus F.X.J. Oberhumer"
Sam Lantinga <slouken@lokigames.com>
parents: 69
diff changeset
   250
		static const char * const vcs[] = { "/dev/vc/%d", "/dev/tty%d", NULL };
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   251
		int i, tty0_fd;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   252
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   253
		/* Try to query for a free virtual terminal */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   254
		tty0_fd = -1;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   255
		for ( i=0; tty0[i] && (tty0_fd < 0); ++i ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   256
			tty0_fd = open(tty0[i], O_WRONLY, 0);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   257
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   258
		if ( tty0_fd < 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   259
			tty0_fd = dup(0); /* Maybe stdin is a VT? */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   260
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   261
		ioctl(tty0_fd, VT_OPENQRY, &current_vt);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   262
		close(tty0_fd);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   263
		if ( (geteuid() == 0) && (current_vt > 0) ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   264
			for ( i=0; vcs[i] && (keyboard_fd < 0); ++i ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   265
				char vtpath[12];
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   266
1338
604d73db6802 Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents: 1336
diff changeset
   267
				SDL_snprintf(vtpath, SDL_arraysize(vtpath), vcs[i], current_vt);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   268
				keyboard_fd = open(vtpath, O_RDWR, 0);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   269
#ifdef DEBUG_KEYBOARD
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   270
				fprintf(stderr, "vtpath = %s, fd = %d\n",
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   271
					vtpath, keyboard_fd);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   272
#endif /* DEBUG_KEYBOARD */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   273
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   274
				/* This needs to be our controlling tty
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   275
				   so that the kernel ioctl() calls work
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   276
				*/
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   277
				if ( keyboard_fd >= 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   278
					tty0_fd = open("/dev/tty", O_RDWR, 0);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   279
					if ( tty0_fd >= 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   280
						ioctl(tty0_fd, TIOCNOTTY, 0);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   281
						close(tty0_fd);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   282
					}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   283
				}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   284
			}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   285
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   286
 		if ( keyboard_fd < 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   287
			/* Last resort, maybe our tty is a usable VT */
1778
e28233f37f8c Fixed detection of current vt when not running as root.
Sam Lantinga <slouken@libsdl.org>
parents: 1776
diff changeset
   288
			struct vt_stat vtstate;
e28233f37f8c Fixed detection of current vt when not running as root.
Sam Lantinga <slouken@libsdl.org>
parents: 1776
diff changeset
   289
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   290
			keyboard_fd = open("/dev/tty", O_RDWR);
1778
e28233f37f8c Fixed detection of current vt when not running as root.
Sam Lantinga <slouken@libsdl.org>
parents: 1776
diff changeset
   291
e28233f37f8c Fixed detection of current vt when not running as root.
Sam Lantinga <slouken@libsdl.org>
parents: 1776
diff changeset
   292
			if ( ioctl(keyboard_fd, VT_GETSTATE, &vtstate) == 0 ) {
e28233f37f8c Fixed detection of current vt when not running as root.
Sam Lantinga <slouken@libsdl.org>
parents: 1776
diff changeset
   293
				current_vt = vtstate.v_active;
e28233f37f8c Fixed detection of current vt when not running as root.
Sam Lantinga <slouken@libsdl.org>
parents: 1776
diff changeset
   294
			} else {
e28233f37f8c Fixed detection of current vt when not running as root.
Sam Lantinga <slouken@libsdl.org>
parents: 1776
diff changeset
   295
				current_vt = 0;
e28233f37f8c Fixed detection of current vt when not running as root.
Sam Lantinga <slouken@libsdl.org>
parents: 1776
diff changeset
   296
			}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   297
 		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   298
#ifdef DEBUG_KEYBOARD
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   299
		fprintf(stderr, "Current VT: %d\n", current_vt);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   300
#endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   301
 		saved_kbd_mode = -1;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   302
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   303
		/* Make sure that our input is a console terminal */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   304
		{ int dummy;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   305
		  if ( ioctl(keyboard_fd, KDGKBMODE, &dummy) < 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   306
			close(keyboard_fd);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   307
			keyboard_fd = -1;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   308
			SDL_SetError("Unable to open a console terminal");
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   309
		  }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   310
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   311
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   312
		/* Set up keymap */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   313
		FB_vgainitkeymaps(keyboard_fd);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   314
 	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   315
 	return(keyboard_fd);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   316
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   317
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   318
static enum {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   319
	MOUSE_NONE = -1,
109
5a9c36a45db1 Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents: 104
diff changeset
   320
	MOUSE_MSC,	/* Note: GPM uses the MSC protocol */
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   321
	MOUSE_PS2,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   322
	MOUSE_IMPS2,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   323
	MOUSE_MS,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   324
	MOUSE_BM,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   325
	MOUSE_ELO,
1201
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   326
	MOUSE_TSLIB,
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   327
	NUM_MOUSE_DRVS
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   328
} mouse_drv = MOUSE_NONE;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   329
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   330
void FB_CloseMouse(_THIS)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   331
{
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1359
diff changeset
   332
#if SDL_INPUT_TSLIB
1201
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   333
	if (ts_dev != NULL) {
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   334
		ts_close(ts_dev);
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   335
		ts_dev = NULL;
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   336
		mouse_fd = -1;
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   337
	}
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1359
diff changeset
   338
#endif /* SDL_INPUT_TSLIB */
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   339
	if ( mouse_fd > 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   340
		close(mouse_fd);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   341
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   342
	mouse_fd = -1;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   343
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   344
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   345
/* Returns processes listed in /proc with the desired name */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   346
static int find_pid(DIR *proc, const char *wanted_name)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   347
{
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   348
	struct dirent *entry;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   349
	int pid;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   350
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   351
	/* First scan proc for the gpm process */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   352
	pid = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   353
	while ( (pid == 0) && ((entry=readdir(proc)) != NULL) ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   354
		if ( isdigit(entry->d_name[0]) ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   355
			FILE *status;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   356
			char path[PATH_MAX];
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   357
			char name[PATH_MAX];
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   358
1338
604d73db6802 Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents: 1336
diff changeset
   359
			SDL_snprintf(path, SDL_arraysize(path), "/proc/%s/status", entry->d_name);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   360
			status=fopen(path, "r");
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   361
			if ( status ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   362
				name[0] = '\0';
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   363
				fscanf(status, "Name: %s", name);
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1323
diff changeset
   364
				if ( SDL_strcmp(name, wanted_name) == 0 ) {
1341
d02b552e5304 Configure dynamically generates SDL_config.h
Sam Lantinga <slouken@libsdl.org>
parents: 1338
diff changeset
   365
					pid = SDL_atoi(entry->d_name);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   366
				}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   367
				fclose(status);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   368
			}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   369
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   370
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   371
	return pid;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   372
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   373
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   374
/* Returns true if /dev/gpmdata is being written to by gpm */
1772
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   375
static int gpm_available(char *proto, size_t protolen)
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   376
{
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   377
	int available;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   378
	DIR *proc;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   379
	int pid;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   380
	int cmdline, len, arglen;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   381
	char path[PATH_MAX];
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   382
	char args[PATH_MAX], *arg;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   383
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   384
	/* Don't bother looking if the fifo isn't there */
1772
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   385
#ifdef DEBUG_MOUSE 
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   386
	fprintf(stderr,"testing gpm\n");
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   387
#endif
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   388
	if ( access(GPM_NODE_FIFO, F_OK) < 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   389
		return(0);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   390
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   391
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   392
	available = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   393
	proc = opendir("/proc");
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   394
	if ( proc ) {
1772
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   395
		char raw_proto[10] = { '\0' };
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   396
		char repeat_proto[10] = { '\0' };
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   397
		while ( !available && (pid=find_pid(proc, "gpm")) > 0 ) {
1338
604d73db6802 Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents: 1336
diff changeset
   398
			SDL_snprintf(path, SDL_arraysize(path), "/proc/%d/cmdline", pid);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   399
			cmdline = open(path, O_RDONLY, 0);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   400
			if ( cmdline >= 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   401
				len = read(cmdline, args, sizeof(args));
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   402
				arg = args;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   403
				while ( len > 0 ) {
1772
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   404
					arglen = SDL_strlen(arg)+1;
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   405
#ifdef DEBUG_MOUSE 
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   406
				        fprintf(stderr,"gpm arg %s len %d\n",arg,arglen);
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   407
#endif
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   408
					if ( SDL_strcmp(arg, "-t") == 0) {
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   409
						/* protocol string, keep it for later */
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   410
						char *t, *s;
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   411
						t = arg + arglen;
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   412
						s = SDL_strchr(t, ' ');
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   413
						if (s) *s = 0;
1776
ed39aa7383ea SDL_strncpy doesn't exist
Sam Lantinga <slouken@libsdl.org>
parents: 1772
diff changeset
   414
						SDL_strlcpy(raw_proto, t, SDL_arraysize(raw_proto));
1772
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   415
						if (s) *s = ' ';
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   416
					}
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   417
					if ( SDL_strncmp(arg, "-R", 2) == 0 ) {
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   418
						char *t, *s;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   419
						available = 1;
1772
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   420
						t = arg + 2;
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   421
						s = SDL_strchr(t, ' ');
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   422
						if (s) *s = 0;
1776
ed39aa7383ea SDL_strncpy doesn't exist
Sam Lantinga <slouken@libsdl.org>
parents: 1772
diff changeset
   423
						SDL_strlcpy(repeat_proto, t, SDL_arraysize(repeat_proto));
1772
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   424
						if (s) *s = ' ';
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   425
					}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   426
					len -= arglen;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   427
					arg += arglen;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   428
				}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   429
				close(cmdline);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   430
			}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   431
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   432
		closedir(proc);
1772
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   433
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   434
		if ( available ) {
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   435
			if ( SDL_strcmp(repeat_proto, "raw") == 0 ) {
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   436
				SDL_strlcpy(proto, raw_proto, protolen);
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   437
			} else if ( *repeat_proto ) {
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   438
				SDL_strlcpy(proto, repeat_proto, protolen);
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   439
			} else {
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   440
				SDL_strlcpy(proto, "msc", protolen);
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   441
			}
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   442
		}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   443
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   444
	return available;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   445
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   446
59
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   447
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   448
/* rcg06112001 Set up IMPS/2 mode, if possible. This gives
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   449
 *  us access to the mousewheel, etc. Returns zero if
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   450
 *  writes to device failed, but you still need to query the
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   451
 *  device to see which mode it's actually in.
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   452
 */
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   453
static int set_imps2_mode(int fd)
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   454
{
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   455
	/* If you wanted to control the mouse mode (and we do :)  ) ...
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   456
		Set IMPS/2 protocol:
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   457
			{0xf3,200,0xf3,100,0xf3,80}
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   458
		Reset mouse device:
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   459
			{0xFF}
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   460
	*/
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   461
	Uint8 set_imps2[] = {0xf3, 200, 0xf3, 100, 0xf3, 80};
1780
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   462
	/*Uint8 reset = 0xff;*/
59
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   463
	fd_set fdset;
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   464
	struct timeval tv;
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   465
	int retval = 0;
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   466
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   467
	if ( write(fd, &set_imps2, sizeof(set_imps2)) == sizeof(set_imps2) ) {
1584
b786d9c15e42 Fixed bug #61
Sam Lantinga <slouken@libsdl.org>
parents: 1582
diff changeset
   468
		/* Don't reset it, that'll clear IMPS/2 mode on some mice
59
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   469
		if (write(fd, &reset, sizeof (reset)) == sizeof (reset) ) {
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   470
			retval = 1;
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   471
		}
1584
b786d9c15e42 Fixed bug #61
Sam Lantinga <slouken@libsdl.org>
parents: 1582
diff changeset
   472
		*/
59
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   473
	}
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   474
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   475
	/* Get rid of any chatter from the above */
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   476
	FD_ZERO(&fdset);
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   477
	FD_SET(fd, &fdset);
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   478
	tv.tv_sec = 0;
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   479
	tv.tv_usec = 0;
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   480
	while ( select(fd+1, &fdset, 0, 0, &tv) > 0 ) {
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   481
		char temp[32];
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   482
		read(fd, temp, sizeof(temp));
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   483
	}
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   484
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   485
	return retval;
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   486
}
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   487
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   488
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   489
/* Returns true if the mouse uses the IMPS/2 protocol */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   490
static int detect_imps2(int fd)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   491
{
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   492
	int imps2;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   493
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   494
	imps2 = 0;
59
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   495
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1323
diff changeset
   496
	if ( SDL_getenv("SDL_MOUSEDEV_IMPS2") ) {
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   497
		imps2 = 1;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   498
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   499
	if ( ! imps2 ) {
59
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   500
		Uint8 query_ps2 = 0xF2;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   501
		fd_set fdset;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   502
		struct timeval tv;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   503
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   504
		/* Get rid of any mouse motion noise */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   505
		FD_ZERO(&fdset);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   506
		FD_SET(fd, &fdset);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   507
		tv.tv_sec = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   508
		tv.tv_usec = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   509
		while ( select(fd+1, &fdset, 0, 0, &tv) > 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   510
			char temp[32];
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   511
			read(fd, temp, sizeof(temp));
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   512
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   513
59
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   514
   		/* Query for the type of mouse protocol */
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   515
   		if ( write(fd, &query_ps2, sizeof (query_ps2)) == sizeof (query_ps2)) {
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   516
   			Uint8 ch = 0;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   517
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   518
			/* Get the mouse protocol response */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   519
			do {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   520
				FD_ZERO(&fdset);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   521
				FD_SET(fd, &fdset);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   522
				tv.tv_sec = 1;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   523
				tv.tv_usec = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   524
				if ( select(fd+1, &fdset, 0, 0, &tv) < 1 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   525
					break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   526
				}
59
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   527
			} while ( (read(fd, &ch, sizeof (ch)) == sizeof (ch)) &&
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   528
			          ((ch == 0xFA) || (ch == 0xAA)) );
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   529
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   530
			/* Experimental values (Logitech wheelmouse) */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   531
#ifdef DEBUG_MOUSE
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   532
fprintf(stderr, "Last mouse mode: 0x%x\n", ch);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   533
#endif
104
a746656b7599 Detect more types of IMPS/2 mouse
Sam Lantinga <slouken@lokigames.com>
parents: 91
diff changeset
   534
			if ( (ch == 3) || (ch == 4) ) {
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   535
				imps2 = 1;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   536
			}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   537
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   538
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   539
	return imps2;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   540
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   541
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   542
int FB_OpenMouse(_THIS)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   543
{
69
280ff3af2ecc Added /dev/usbmouse to the list of mice to check
Sam Lantinga <slouken@lokigames.com>
parents: 60
diff changeset
   544
	int i;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   545
	const char *mousedev;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   546
	const char *mousedrv;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   547
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1323
diff changeset
   548
	mousedrv = SDL_getenv("SDL_MOUSEDRV");
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1323
diff changeset
   549
	mousedev = SDL_getenv("SDL_MOUSEDEV");
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   550
	mouse_fd = -1;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   551
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1359
diff changeset
   552
#if SDL_INPUT_TSLIB
1585
980d2a0dc2a3 Date: Tue, 4 Mar 2003 15:05:31 -0800
Sam Lantinga <slouken@libsdl.org>
parents: 1584
diff changeset
   553
	if ( mousedrv && (SDL_strcmp(mousedrv, "TSLIB") == 0) ) {
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1323
diff changeset
   554
		if (mousedev == NULL) mousedev = SDL_getenv("TSLIB_TSDEVICE");
1201
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   555
		if (mousedev != NULL) {
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   556
			ts_dev = ts_open(mousedev, 1);
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   557
			if ((ts_dev != NULL) && (ts_config(ts_dev) >= 0)) {
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   558
#ifdef DEBUG_MOUSE
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   559
				fprintf(stderr, "Using tslib touchscreen\n");
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   560
#endif
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   561
				mouse_drv = MOUSE_TSLIB;
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   562
				mouse_fd = ts_fd(ts_dev);
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   563
				return mouse_fd;
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   564
			}
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   565
		}
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   566
		mouse_drv = MOUSE_NONE;
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   567
		return mouse_fd;
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   568
	}
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1359
diff changeset
   569
#endif /* SDL_INPUT_TSLIB */
1201
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   570
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   571
	/* ELO TOUCHSCREEN SUPPORT */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   572
1585
980d2a0dc2a3 Date: Tue, 4 Mar 2003 15:05:31 -0800
Sam Lantinga <slouken@libsdl.org>
parents: 1584
diff changeset
   573
	if ( mousedrv && (SDL_strcmp(mousedrv, "ELO") == 0) ) {
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   574
		mouse_fd = open(mousedev, O_RDWR);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   575
		if ( mouse_fd >= 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   576
			if(eloInitController(mouse_fd)) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   577
#ifdef DEBUG_MOUSE
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   578
fprintf(stderr, "Using ELO touchscreen\n");
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   579
#endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   580
   				mouse_drv = MOUSE_ELO;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   581
			}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   582
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   583
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   584
		else if ( mouse_fd < 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   585
			mouse_drv = MOUSE_NONE;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   586
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   587
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   588
		return(mouse_fd);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   589
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   590
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   591
	/* STD MICE */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   592
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   593
	if ( mousedev == NULL ) {
69
280ff3af2ecc Added /dev/usbmouse to the list of mice to check
Sam Lantinga <slouken@lokigames.com>
parents: 60
diff changeset
   594
		/* FIXME someday... allow multiple mice in this driver */
1584
b786d9c15e42 Fixed bug #61
Sam Lantinga <slouken@libsdl.org>
parents: 1582
diff changeset
   595
		static const char *ps2mice[] = {
69
280ff3af2ecc Added /dev/usbmouse to the list of mice to check
Sam Lantinga <slouken@lokigames.com>
parents: 60
diff changeset
   596
		    "/dev/input/mice", "/dev/usbmouse", "/dev/psaux", NULL
280ff3af2ecc Added /dev/usbmouse to the list of mice to check
Sam Lantinga <slouken@lokigames.com>
parents: 60
diff changeset
   597
		};
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   598
		/* First try to use GPM in repeater mode */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   599
		if ( mouse_fd < 0 ) {
1772
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   600
			char proto[10];
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   601
			if ( gpm_available(proto, SDL_arraysize(proto)) ) {
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   602
				mouse_fd = open(GPM_NODE_FIFO, O_RDONLY, 0);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   603
				if ( mouse_fd >= 0 ) {
1772
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   604
					if ( SDL_strcmp(proto, "msc") == 0 ) {
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   605
						mouse_drv = MOUSE_MSC;
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   606
					} else if ( SDL_strcmp(proto, "ps2") == 0 ) {
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   607
						mouse_drv = MOUSE_PS2;
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   608
					} else if ( SDL_strcmp(proto, "imps2") == 0 ) {
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   609
						mouse_drv = MOUSE_IMPS2;
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   610
					} else if ( SDL_strcmp(proto, "ms") == 0 ||
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   611
					            SDL_strcmp(proto, "bare") == 0 ) {
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   612
						mouse_drv = MOUSE_MS;
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   613
					} else if ( SDL_strcmp(proto, "bm") == 0 ) {
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   614
						mouse_drv = MOUSE_BM;
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   615
					} else {
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   616
						/* Unknown protocol... */
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   617
#ifdef DEBUG_MOUSE
1772
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   618
						fprintf(stderr, "GPM mouse using unknown protocol = %s\n", proto);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   619
#endif
1772
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   620
						close(mouse_fd);
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   621
						mouse_fd = -1;
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   622
					}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   623
				}
1772
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   624
#ifdef DEBUG_MOUSE
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   625
				if ( mouse_fd >= 0 ) {
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   626
					fprintf(stderr, "Using GPM mouse, protocol = %s\n", proto);
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   627
				}
5115185b6e3c Fixed bug #102
Sam Lantinga <slouken@libsdl.org>
parents: 1585
diff changeset
   628
#endif /* DEBUG_MOUSE */
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   629
			}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   630
		}
69
280ff3af2ecc Added /dev/usbmouse to the list of mice to check
Sam Lantinga <slouken@lokigames.com>
parents: 60
diff changeset
   631
		/* Now try to use a modern PS/2 mouse */
280ff3af2ecc Added /dev/usbmouse to the list of mice to check
Sam Lantinga <slouken@lokigames.com>
parents: 60
diff changeset
   632
		for ( i=0; (mouse_fd < 0) && ps2mice[i]; ++i ) {
280ff3af2ecc Added /dev/usbmouse to the list of mice to check
Sam Lantinga <slouken@lokigames.com>
parents: 60
diff changeset
   633
			mouse_fd = open(ps2mice[i], O_RDWR, 0);
59
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   634
			if (mouse_fd < 0) {
69
280ff3af2ecc Added /dev/usbmouse to the list of mice to check
Sam Lantinga <slouken@lokigames.com>
parents: 60
diff changeset
   635
				mouse_fd = open(ps2mice[i], O_RDONLY, 0);
59
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   636
			}
b685c94f8db7 Ryan's IMPS/2 mouse fix
Sam Lantinga <slouken@lokigames.com>
parents: 4
diff changeset
   637
			if (mouse_fd >= 0) {
69
280ff3af2ecc Added /dev/usbmouse to the list of mice to check
Sam Lantinga <slouken@lokigames.com>
parents: 60
diff changeset
   638
				/* rcg06112001 Attempt to set IMPS/2 mode */
1584
b786d9c15e42 Fixed bug #61
Sam Lantinga <slouken@libsdl.org>
parents: 1582
diff changeset
   639
				set_imps2_mode(mouse_fd);
69
280ff3af2ecc Added /dev/usbmouse to the list of mice to check
Sam Lantinga <slouken@lokigames.com>
parents: 60
diff changeset
   640
				if (detect_imps2(mouse_fd)) {
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   641
#ifdef DEBUG_MOUSE
69
280ff3af2ecc Added /dev/usbmouse to the list of mice to check
Sam Lantinga <slouken@lokigames.com>
parents: 60
diff changeset
   642
fprintf(stderr, "Using IMPS2 mouse\n");
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   643
#endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   644
					mouse_drv = MOUSE_IMPS2;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   645
				} else {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   646
#ifdef DEBUG_MOUSE
69
280ff3af2ecc Added /dev/usbmouse to the list of mice to check
Sam Lantinga <slouken@lokigames.com>
parents: 60
diff changeset
   647
fprintf(stderr, "Using PS2 mouse\n");
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   648
#endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   649
					mouse_drv = MOUSE_PS2;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   650
				}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   651
			}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   652
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   653
		/* Next try to use a PPC ADB port mouse */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   654
		if ( mouse_fd < 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   655
			mouse_fd = open("/dev/adbmouse", O_RDONLY, 0);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   656
			if ( mouse_fd >= 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   657
#ifdef DEBUG_MOUSE
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   658
fprintf(stderr, "Using ADB mouse\n");
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   659
#endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   660
				mouse_drv = MOUSE_BM;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   661
			}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   662
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   663
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   664
	/* Default to a serial Microsoft mouse */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   665
	if ( mouse_fd < 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   666
		if ( mousedev == NULL ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   667
			mousedev = "/dev/mouse";
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   668
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   669
		mouse_fd = open(mousedev, O_RDONLY, 0);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   670
		if ( mouse_fd >= 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   671
			struct termios mouse_termios;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   672
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   673
			/* Set the sampling speed to 1200 baud */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   674
			tcgetattr(mouse_fd, &mouse_termios);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   675
			mouse_termios.c_iflag = IGNBRK | IGNPAR;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   676
			mouse_termios.c_oflag = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   677
			mouse_termios.c_lflag = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   678
			mouse_termios.c_line = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   679
			mouse_termios.c_cc[VTIME] = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   680
			mouse_termios.c_cc[VMIN] = 1;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   681
			mouse_termios.c_cflag = CREAD | CLOCAL | HUPCL;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   682
			mouse_termios.c_cflag |= CS8;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   683
			mouse_termios.c_cflag |= B1200;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   684
			tcsetattr(mouse_fd, TCSAFLUSH, &mouse_termios);
1585
980d2a0dc2a3 Date: Tue, 4 Mar 2003 15:05:31 -0800
Sam Lantinga <slouken@libsdl.org>
parents: 1584
diff changeset
   685
			if ( mousedrv && (SDL_strcmp(mousedrv, "PS2") == 0) ) {
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   686
#ifdef DEBUG_MOUSE
1585
980d2a0dc2a3 Date: Tue, 4 Mar 2003 15:05:31 -0800
Sam Lantinga <slouken@libsdl.org>
parents: 1584
diff changeset
   687
fprintf(stderr, "Using (user specified) PS2 mouse on %s\n", mousedev);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   688
#endif
1585
980d2a0dc2a3 Date: Tue, 4 Mar 2003 15:05:31 -0800
Sam Lantinga <slouken@libsdl.org>
parents: 1584
diff changeset
   689
				mouse_drv = MOUSE_PS2;
980d2a0dc2a3 Date: Tue, 4 Mar 2003 15:05:31 -0800
Sam Lantinga <slouken@libsdl.org>
parents: 1584
diff changeset
   690
			} else {
980d2a0dc2a3 Date: Tue, 4 Mar 2003 15:05:31 -0800
Sam Lantinga <slouken@libsdl.org>
parents: 1584
diff changeset
   691
#ifdef DEBUG_MOUSE
980d2a0dc2a3 Date: Tue, 4 Mar 2003 15:05:31 -0800
Sam Lantinga <slouken@libsdl.org>
parents: 1584
diff changeset
   692
fprintf(stderr, "Using (default) MS mouse on %s\n", mousedev);
980d2a0dc2a3 Date: Tue, 4 Mar 2003 15:05:31 -0800
Sam Lantinga <slouken@libsdl.org>
parents: 1584
diff changeset
   693
#endif
980d2a0dc2a3 Date: Tue, 4 Mar 2003 15:05:31 -0800
Sam Lantinga <slouken@libsdl.org>
parents: 1584
diff changeset
   694
				mouse_drv = MOUSE_MS;
980d2a0dc2a3 Date: Tue, 4 Mar 2003 15:05:31 -0800
Sam Lantinga <slouken@libsdl.org>
parents: 1584
diff changeset
   695
			}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   696
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   697
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   698
	if ( mouse_fd < 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   699
		mouse_drv = MOUSE_NONE;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   700
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   701
	return(mouse_fd);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   702
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   703
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   704
static int posted = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   705
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   706
void FB_vgamousecallback(int button, int relative, int dx, int dy)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   707
{
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   708
	int button_1, button_3;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   709
	int button_state;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   710
	int state_changed;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   711
	int i;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   712
	Uint8 state;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   713
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   714
	if ( dx || dy ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   715
		posted += SDL_PrivateMouseMotion(0, relative, dx, dy);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   716
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   717
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   718
	/* Swap button 1 and 3 */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   719
	button_1 = (button & 0x04) >> 2;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   720
	button_3 = (button & 0x01) << 2;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   721
	button &= ~0x05;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   722
	button |= (button_1|button_3);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   723
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   724
	/* See what changed */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   725
	button_state = SDL_GetMouseState(NULL, NULL);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   726
	state_changed = button_state ^ button;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   727
	for ( i=0; i<8; ++i ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   728
		if ( state_changed & (1<<i) ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   729
			if ( button & (1<<i) ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   730
				state = SDL_PRESSED;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   731
			} else {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   732
				state = SDL_RELEASED;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   733
			}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   734
			posted += SDL_PrivateMouseButton(state, i+1, 0, 0);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   735
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   736
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   737
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   738
1201
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   739
/* Handle input from tslib */
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1359
diff changeset
   740
#if SDL_INPUT_TSLIB
1201
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   741
static void handle_tslib(_THIS)
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   742
{
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   743
	struct ts_sample sample;
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   744
	int button;
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   745
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   746
	while (ts_read(ts_dev, &sample, 1) > 0) {
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   747
		button = (sample.pressure > 0) ? 1 : 0;
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   748
		button <<= 2;	/* must report it as button 3 */
1323
be736c197ceb Fixed compile warning
Sam Lantinga <slouken@libsdl.org>
parents: 1312
diff changeset
   749
		FB_vgamousecallback(button, 0, sample.x, sample.y);
1201
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   750
	}
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   751
	return;
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   752
}
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1359
diff changeset
   753
#endif /* SDL_INPUT_TSLIB */
1201
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   754
109
5a9c36a45db1 Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents: 104
diff changeset
   755
/* For now, use MSC, PS/2, and MS protocols
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   756
   Driver adapted from the SVGAlib mouse driver code (taken from gpm, etc.)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   757
 */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   758
static void handle_mouse(_THIS)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   759
{
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   760
	static int start = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   761
	static unsigned char mousebuf[BUFSIZ];
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   762
	static int relative = 1;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   763
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   764
	int i, nread;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   765
	int button = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   766
	int dx = 0, dy = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   767
	int packetsize = 0;
4
4f6c5f021323 Date: Thu, 26 Apr 2001 10:46:23 +0200
Sam Lantinga <slouken@lokigames.com>
parents: 0
diff changeset
   768
	int realx, realy;
4f6c5f021323 Date: Thu, 26 Apr 2001 10:46:23 +0200
Sam Lantinga <slouken@lokigames.com>
parents: 0
diff changeset
   769
	
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   770
	/* Figure out the mouse packet size */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   771
	switch (mouse_drv) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   772
		case MOUSE_NONE:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   773
			/* Ack! */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   774
			read(mouse_fd, mousebuf, BUFSIZ);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   775
			return;
109
5a9c36a45db1 Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents: 104
diff changeset
   776
		case MOUSE_MSC:
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   777
			packetsize = 5;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   778
			break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   779
		case MOUSE_IMPS2:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   780
			packetsize = 4;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   781
			break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   782
		case MOUSE_PS2:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   783
		case MOUSE_MS:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   784
		case MOUSE_BM:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   785
			packetsize = 3;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   786
			break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   787
		case MOUSE_ELO:
1323
be736c197ceb Fixed compile warning
Sam Lantinga <slouken@libsdl.org>
parents: 1312
diff changeset
   788
			/* try to read the next packet */
be736c197ceb Fixed compile warning
Sam Lantinga <slouken@libsdl.org>
parents: 1312
diff changeset
   789
			if(eloReadPosition(this, mouse_fd, &dx, &dy, &button, &realx, &realy)) {
be736c197ceb Fixed compile warning
Sam Lantinga <slouken@libsdl.org>
parents: 1312
diff changeset
   790
				button = (button & 0x01) << 2;
be736c197ceb Fixed compile warning
Sam Lantinga <slouken@libsdl.org>
parents: 1312
diff changeset
   791
				FB_vgamousecallback(button, 0, dx, dy);
be736c197ceb Fixed compile warning
Sam Lantinga <slouken@libsdl.org>
parents: 1312
diff changeset
   792
			}
be736c197ceb Fixed compile warning
Sam Lantinga <slouken@libsdl.org>
parents: 1312
diff changeset
   793
			return; /* nothing left to do */
1201
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   794
		case MOUSE_TSLIB:
1361
19418e4422cb New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents: 1359
diff changeset
   795
#if SDL_INPUT_TSLIB
1201
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   796
			handle_tslib(this);
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   797
#endif
718d00094f82 Date: Sat, 10 Dec 2005 18:29:41 +0100
Ryan C. Gordon <icculus@icculus.org>
parents: 1022
diff changeset
   798
			return; /* nothing left to do */
1323
be736c197ceb Fixed compile warning
Sam Lantinga <slouken@libsdl.org>
parents: 1312
diff changeset
   799
		default:
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   800
			/* Uh oh.. */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   801
			packetsize = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   802
			break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   803
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   804
4
4f6c5f021323 Date: Thu, 26 Apr 2001 10:46:23 +0200
Sam Lantinga <slouken@lokigames.com>
parents: 0
diff changeset
   805
	/* Special handling for the quite sensitive ELO controller */
4f6c5f021323 Date: Thu, 26 Apr 2001 10:46:23 +0200
Sam Lantinga <slouken@lokigames.com>
parents: 0
diff changeset
   806
	if (mouse_drv == MOUSE_ELO) {
4f6c5f021323 Date: Thu, 26 Apr 2001 10:46:23 +0200
Sam Lantinga <slouken@lokigames.com>
parents: 0
diff changeset
   807
	
4f6c5f021323 Date: Thu, 26 Apr 2001 10:46:23 +0200
Sam Lantinga <slouken@lokigames.com>
parents: 0
diff changeset
   808
	}
4f6c5f021323 Date: Thu, 26 Apr 2001 10:46:23 +0200
Sam Lantinga <slouken@lokigames.com>
parents: 0
diff changeset
   809
	
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   810
	/* Read as many packets as possible */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   811
	nread = read(mouse_fd, &mousebuf[start], BUFSIZ-start);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   812
	if ( nread < 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   813
		return;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   814
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   815
	nread += start;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   816
#ifdef DEBUG_MOUSE
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   817
	fprintf(stderr, "Read %d bytes from mouse, start = %d\n", nread, start);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   818
#endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   819
	for ( i=0; i<(nread-(packetsize-1)); i += packetsize ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   820
		switch (mouse_drv) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   821
			case MOUSE_NONE:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   822
				break;
109
5a9c36a45db1 Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents: 104
diff changeset
   823
			case MOUSE_MSC:
5a9c36a45db1 Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents: 104
diff changeset
   824
				/* MSC protocol has 0x80 in high byte */
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   825
				if ( (mousebuf[i] & 0xF8) != 0x80 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   826
					/* Go to next byte */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   827
					i -= (packetsize-1);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   828
					continue;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   829
				}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   830
				/* Get current mouse state */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   831
				button = (~mousebuf[i]) & 0x07;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   832
				dx =   (signed char)(mousebuf[i+1]) +
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   833
				       (signed char)(mousebuf[i+3]);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   834
				dy = -((signed char)(mousebuf[i+2]) +
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   835
				       (signed char)(mousebuf[i+4]));
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   836
				break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   837
			case MOUSE_PS2:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   838
				/* PS/2 protocol has nothing in high byte */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   839
				if ( (mousebuf[i] & 0xC0) != 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   840
					/* Go to next byte */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   841
					i -= (packetsize-1);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   842
					continue;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   843
				}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   844
				/* Get current mouse state */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   845
				button = (mousebuf[i] & 0x04) >> 1 | /*Middle*/
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   846
		  			 (mousebuf[i] & 0x02) >> 1 | /*Right*/
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   847
		  			 (mousebuf[i] & 0x01) << 2;  /*Left*/
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   848
		  		dx = (mousebuf[i] & 0x10) ?
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   849
		  		      mousebuf[i+1] - 256 : mousebuf[i+1];
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   850
		  		dy = (mousebuf[i] & 0x20) ?
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   851
		  		      -(mousebuf[i+2] - 256) : -mousebuf[i+2];
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   852
				break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   853
			case MOUSE_IMPS2:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   854
				/* Get current mouse state */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   855
				button = (mousebuf[i] & 0x04) >> 1 | /*Middle*/
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   856
		  			 (mousebuf[i] & 0x02) >> 1 | /*Right*/
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   857
		  			 (mousebuf[i] & 0x01) << 2 | /*Left*/
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   858
		  			 (mousebuf[i] & 0x40) >> 3 | /* 4 */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   859
		  			 (mousebuf[i] & 0x80) >> 3;  /* 5 */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   860
		  		dx = (mousebuf[i] & 0x10) ?
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   861
		  		      mousebuf[i+1] - 256 : mousebuf[i+1];
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   862
		  		dy = (mousebuf[i] & 0x20) ?
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   863
		  		      -(mousebuf[i+2] - 256) : -mousebuf[i+2];
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   864
				switch (mousebuf[i+3]&0x0F) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   865
				    case 0x0E: /* DX = +1 */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   866
				    case 0x02: /* DX = -1 */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   867
					break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   868
				    case 0x0F: /* DY = +1 (map button 4) */
132
2604a7be65af Added button-up with mouse-wheel on framebuffer console
Sam Lantinga <slouken@libsdl.org>
parents: 109
diff changeset
   869
                                       FB_vgamousecallback(button | (1<<3),
2604a7be65af Added button-up with mouse-wheel on framebuffer console
Sam Lantinga <slouken@libsdl.org>
parents: 109
diff changeset
   870
                                                           1, 0, 0);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   871
					break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   872
				    case 0x01: /* DY = -1 (map button 5) */
132
2604a7be65af Added button-up with mouse-wheel on framebuffer console
Sam Lantinga <slouken@libsdl.org>
parents: 109
diff changeset
   873
                                       FB_vgamousecallback(button | (1<<4),
2604a7be65af Added button-up with mouse-wheel on framebuffer console
Sam Lantinga <slouken@libsdl.org>
parents: 109
diff changeset
   874
                                                           1, 0, 0);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   875
					break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   876
				}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   877
				break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   878
			case MOUSE_MS:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   879
				/* Microsoft protocol has 0x40 in high byte */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   880
				if ( (mousebuf[i] & 0x40) != 0x40 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   881
					/* Go to next byte */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   882
					i -= (packetsize-1);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   883
					continue;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   884
				}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   885
				/* Get current mouse state */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   886
				button = ((mousebuf[i] & 0x20) >> 3) |
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   887
				         ((mousebuf[i] & 0x10) >> 4);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   888
				dx = (signed char)(((mousebuf[i] & 0x03) << 6) |
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   889
				                   (mousebuf[i + 1] & 0x3F));
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   890
				dy = (signed char)(((mousebuf[i] & 0x0C) << 4) |
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   891
				                    (mousebuf[i + 2] & 0x3F));
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   892
				break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   893
			case MOUSE_BM:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   894
				/* BusMouse protocol has 0xF8 in high byte */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   895
				if ( (mousebuf[i] & 0xF8) != 0x80 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   896
					/* Go to next byte */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   897
					i -= (packetsize-1);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   898
					continue;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   899
				}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   900
				/* Get current mouse state */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   901
				button = (~mousebuf[i]) & 0x07;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   902
				dx =  (signed char)mousebuf[i+1];
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   903
				dy = -(signed char)mousebuf[i+2];
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   904
				break;
1323
be736c197ceb Fixed compile warning
Sam Lantinga <slouken@libsdl.org>
parents: 1312
diff changeset
   905
			default:
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   906
				/* Uh oh.. */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   907
				dx = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   908
				dy = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   909
				break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   910
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   911
		FB_vgamousecallback(button, relative, dx, dy);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   912
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   913
	if ( i < nread ) {
1336
3692456e7b0f Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents: 1323
diff changeset
   914
		SDL_memcpy(mousebuf, &mousebuf[i], (nread-i));
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   915
		start = (nread-i);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   916
	} else {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   917
		start = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   918
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   919
	return;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   920
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   921
1780
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   922
/* Handle switching to another VC, returns when our VC is back */
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   923
static void switch_vt_prep(_THIS)
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   924
{
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   925
	SDL_Surface *screen = SDL_VideoSurface;
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   926
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   927
	SDL_PrivateAppActive(0, (SDL_APPACTIVE|SDL_APPINPUTFOCUS|SDL_APPMOUSEFOCUS));
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   928
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   929
	/* Save the contents of the screen, and go to text mode */
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   930
	wait_idle(this);
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   931
	screen_arealen = ((screen->h + (2*this->offset_y)) * screen->pitch);
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   932
	screen_contents = (Uint8 *)SDL_malloc(screen_arealen);
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   933
	if ( screen_contents ) {
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   934
		SDL_memcpy(screen_contents, screen->pixels, screen_arealen);
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   935
	}
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   936
	FB_SavePaletteTo(this, 256, screen_palette);
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   937
	ioctl(console_fd, FBIOGET_VSCREENINFO, &screen_vinfo);
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   938
	ioctl(keyboard_fd, KDSETMODE, KD_TEXT);
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   939
	ioctl(keyboard_fd, VT_UNLOCKSWITCH, 1);
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   940
}
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   941
static void switch_vt_done(_THIS)
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   942
{
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   943
	SDL_Surface *screen = SDL_VideoSurface;
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   944
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   945
	/* Restore graphics mode and the contents of the screen */
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   946
	ioctl(keyboard_fd, VT_LOCKSWITCH, 1);
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   947
	ioctl(keyboard_fd, KDSETMODE, KD_GRAPHICS);
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   948
	ioctl(console_fd, FBIOPUT_VSCREENINFO, &screen_vinfo);
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   949
	FB_RestorePaletteFrom(this, 256, screen_palette);
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   950
	if ( screen_contents ) {
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   951
		SDL_memcpy(screen->pixels, screen_contents, screen_arealen);
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   952
		SDL_free(screen_contents);
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   953
		screen_contents = NULL;
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   954
	}
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   955
1781
d8030f368b84 Get updates to the shadow surface while switched away
Sam Lantinga <slouken@libsdl.org>
parents: 1780
diff changeset
   956
	/* Get updates to the shadow surface while switched away */
d8030f368b84 Get updates to the shadow surface while switched away
Sam Lantinga <slouken@libsdl.org>
parents: 1780
diff changeset
   957
	if ( SDL_ShadowSurface ) {
d8030f368b84 Get updates to the shadow surface while switched away
Sam Lantinga <slouken@libsdl.org>
parents: 1780
diff changeset
   958
		SDL_UpdateRect(SDL_ShadowSurface, 0, 0, 0, 0);
d8030f368b84 Get updates to the shadow surface while switched away
Sam Lantinga <slouken@libsdl.org>
parents: 1780
diff changeset
   959
	}
d8030f368b84 Get updates to the shadow surface while switched away
Sam Lantinga <slouken@libsdl.org>
parents: 1780
diff changeset
   960
1780
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   961
	SDL_PrivateAppActive(1, (SDL_APPACTIVE|SDL_APPINPUTFOCUS|SDL_APPMOUSEFOCUS));
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   962
}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   963
static void switch_vt(_THIS, unsigned short which)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   964
{
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   965
	struct vt_stat vtstate;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   966
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   967
	/* Figure out whether or not we're switching to a new console */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   968
	if ( (ioctl(keyboard_fd, VT_GETSTATE, &vtstate) < 0) ||
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   969
	     (which == vtstate.v_active) ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   970
		return;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   971
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   972
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   973
	/* New console, switch to it */
1780
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   974
	SDL_mutexP(hw_lock);
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   975
	switch_vt_prep(this);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   976
	if ( ioctl(keyboard_fd, VT_ACTIVATE, which) == 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   977
		ioctl(keyboard_fd, VT_WAITACTIVE, which);
1780
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   978
		switched_away = 1;
1585
980d2a0dc2a3 Date: Tue, 4 Mar 2003 15:05:31 -0800
Sam Lantinga <slouken@libsdl.org>
parents: 1584
diff changeset
   979
	} else {
1780
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
   980
		switch_vt_done(this);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   981
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   982
	SDL_mutexV(hw_lock);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   983
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   984
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   985
static void handle_keyboard(_THIS)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   986
{
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   987
	unsigned char keybuf[BUFSIZ];
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   988
	int i, nread;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   989
	int pressed;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   990
	int scancode;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   991
	SDL_keysym keysym;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   992
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   993
	nread = read(keyboard_fd, keybuf, BUFSIZ);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   994
	for ( i=0; i<nread; ++i ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   995
		scancode = keybuf[i] & 0x7F;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   996
		if ( keybuf[i] & 0x80 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   997
			pressed = SDL_RELEASED;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   998
		} else {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
   999
			pressed = SDL_PRESSED;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1000
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1001
		TranslateKey(scancode, &keysym);
1582
43a565749fbf Fixed bug #50
Sam Lantinga <slouken@libsdl.org>
parents: 1402
diff changeset
  1002
		/* Handle Ctrl-Alt-FN for vt switch */
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1003
		switch (keysym.sym) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1004
		    case SDLK_F1:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1005
		    case SDLK_F2:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1006
		    case SDLK_F3:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1007
		    case SDLK_F4:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1008
		    case SDLK_F5:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1009
		    case SDLK_F6:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1010
		    case SDLK_F7:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1011
		    case SDLK_F8:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1012
		    case SDLK_F9:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1013
		    case SDLK_F10:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1014
		    case SDLK_F11:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1015
		    case SDLK_F12:
1582
43a565749fbf Fixed bug #50
Sam Lantinga <slouken@libsdl.org>
parents: 1402
diff changeset
  1016
			if ( (SDL_GetModState() & KMOD_CTRL) &&
43a565749fbf Fixed bug #50
Sam Lantinga <slouken@libsdl.org>
parents: 1402
diff changeset
  1017
			     (SDL_GetModState() & KMOD_ALT) ) {
109
5a9c36a45db1 Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents: 104
diff changeset
  1018
				if ( pressed ) {
5a9c36a45db1 Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents: 104
diff changeset
  1019
					switch_vt(this, (keysym.sym-SDLK_F1)+1);
5a9c36a45db1 Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents: 104
diff changeset
  1020
				}
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1021
				break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1022
			}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1023
			/* Fall through to normal processing */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1024
		    default:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1025
			posted += SDL_PrivateKeyboard(pressed, &keysym);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1026
			break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1027
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1028
	}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1029
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1030
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1031
void FB_PumpEvents(_THIS)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1032
{
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1033
	fd_set fdset;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1034
	int max_fd;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1035
	static struct timeval zero;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1036
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1037
	do {
1780
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
  1038
		if ( switched_away ) {
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
  1039
			struct vt_stat vtstate;
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
  1040
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
  1041
			SDL_mutexP(hw_lock);
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
  1042
			if ( (ioctl(keyboard_fd, VT_GETSTATE, &vtstate) == 0) &&
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
  1043
			     vtstate.v_active == current_vt ) {
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
  1044
				switched_away = 0;
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
  1045
				switch_vt_done(this);
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
  1046
			}
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
  1047
			SDL_mutexV(hw_lock);
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
  1048
		}
7a36f01acf71 Fixed bug #49
Sam Lantinga <slouken@libsdl.org>
parents: 1778
diff changeset
  1049
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1050
		posted = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1051
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1052
		FD_ZERO(&fdset);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1053
		max_fd = 0;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1054
		if ( keyboard_fd >= 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1055
			FD_SET(keyboard_fd, &fdset);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1056
			if ( max_fd < keyboard_fd ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1057
				max_fd = keyboard_fd;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1058
			}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1059
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1060
		if ( mouse_fd >= 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1061
			FD_SET(mouse_fd, &fdset);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1062
			if ( max_fd < mouse_fd ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1063
				max_fd = mouse_fd;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1064
			}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1065
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1066
		if ( select(max_fd+1, &fdset, NULL, NULL, &zero) > 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1067
			if ( keyboard_fd >= 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1068
				if ( FD_ISSET(keyboard_fd, &fdset) ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1069
					handle_keyboard(this);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1070
				}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1071
			}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1072
			if ( mouse_fd >= 0 ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1073
				if ( FD_ISSET(mouse_fd, &fdset) ) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1074
					handle_mouse(this);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1075
				}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1076
			}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1077
		}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1078
	} while ( posted );
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1079
}
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1080
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1081
void FB_InitOSKeymap(_THIS)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1082
{
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1083
	int i;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1084
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1085
	/* Initialize the Linux key translation table */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1086
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1087
	/* First get the ascii keys and others not well handled */
1379
c0a74f199ecf Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents: 1361
diff changeset
  1088
	for (i=0; i<SDL_arraysize(keymap); ++i) {
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1089
	  switch(i) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1090
	  /* These aren't handled by the x86 kernel keymapping (?) */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1091
	  case SCANCODE_PRINTSCREEN:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1092
	    keymap[i] = SDLK_PRINT;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1093
	    break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1094
	  case SCANCODE_BREAK:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1095
	    keymap[i] = SDLK_BREAK;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1096
	    break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1097
	  case SCANCODE_BREAK_ALTERNATIVE:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1098
	    keymap[i] = SDLK_PAUSE;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1099
	    break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1100
	  case SCANCODE_LEFTSHIFT:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1101
	    keymap[i] = SDLK_LSHIFT;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1102
	    break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1103
	  case SCANCODE_RIGHTSHIFT:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1104
	    keymap[i] = SDLK_RSHIFT;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1105
	    break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1106
	  case SCANCODE_LEFTCONTROL:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1107
	    keymap[i] = SDLK_LCTRL;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1108
	    break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1109
	  case SCANCODE_RIGHTCONTROL:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1110
	    keymap[i] = SDLK_RCTRL;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1111
	    break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1112
	  case SCANCODE_RIGHTWIN:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1113
	    keymap[i] = SDLK_RSUPER;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1114
	    break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1115
	  case SCANCODE_LEFTWIN:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1116
	    keymap[i] = SDLK_LSUPER;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1117
	    break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1118
	  case 127:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1119
	    keymap[i] = SDLK_MENU;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1120
	    break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1121
	  /* this should take care of all standard ascii keys */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1122
	  default:
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1123
	    keymap[i] = KVAL(vga_keymap[0][i]);
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1124
	    break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1125
          }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1126
	}
1379
c0a74f199ecf Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents: 1361
diff changeset
  1127
	for (i=0; i<SDL_arraysize(keymap); ++i) {
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1128
	  switch(keymap_temp[i]) {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1129
	    case K_F1:  keymap[i] = SDLK_F1;  break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1130
	    case K_F2:  keymap[i] = SDLK_F2;  break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1131
	    case K_F3:  keymap[i] = SDLK_F3;  break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1132
	    case K_F4:  keymap[i] = SDLK_F4;  break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1133
	    case K_F5:  keymap[i] = SDLK_F5;  break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1134
	    case K_F6:  keymap[i] = SDLK_F6;  break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1135
	    case K_F7:  keymap[i] = SDLK_F7;  break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1136
	    case K_F8:  keymap[i] = SDLK_F8;  break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1137
	    case K_F9:  keymap[i] = SDLK_F9;  break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1138
	    case K_F10: keymap[i] = SDLK_F10; break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1139
	    case K_F11: keymap[i] = SDLK_F11; break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1140
	    case K_F12: keymap[i] = SDLK_F12; break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1141
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1142
	    case K_DOWN:  keymap[i] = SDLK_DOWN;  break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1143
	    case K_LEFT:  keymap[i] = SDLK_LEFT;  break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1144
	    case K_RIGHT: keymap[i] = SDLK_RIGHT; break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1145
	    case K_UP:    keymap[i] = SDLK_UP;    break;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1146
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
  1147
	    case K_P0:     keymap[i] = SDLK_KP0; break;