Pastey mouse.c
- Posted by jimcbrown
(admin)
Dec 01, 2014
/*****************************************************************************/
/* (c) Copyright - See License.txt */
/*****************************************************************************/
/* compile as
* gcc -o mouse.so -lgpm -shared mouse.c
*/
/* config starts */
#define EUNIX 1
//#undef EUNIX
//#define EBSD 1
#undef EBSD
//#define EWINDOWS 1
#undef EWINDOWS
//#define EMINGW 1
#undef EMINGW
//#define EWATCOM 1
#undef EWATCOM
/* config ends */
#define EGPM 1
#include
#include
#ifdef EUNIX
#include
#define stricmp strcasecmp
#ifdef EBSD
#define NAME_MAX 255
#else
#include
#endif
#ifdef EGPM
#include
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#ifndef LOCK_SH
#define LOCK_SH 1 /* shared lock */
#define LOCK_EX 2 /* exclusive lock */
#define LOCK_NB 4 /* don't block when locking */
#define LOCK_UN 8 /* unlock */
#endif
#ifdef ESUNOS
#include
int emul_flock(fd, cmd)
int fd, cmd;
{
struct flock f;
memset(&f, 0, sizeof(f));
if (cmd & LOCK_UN)
f.l_type = F_UNLCK;
if (cmd & LOCK_SH)
f.l_type = F_RDLCK;
if (cmd & LOCK_EX)
f.l_type = F_WRLCK;
return fcntl(fd, (cmd & LOCK_NB) ? F_SETLK : F_SETLKW, &f);
}
#define flock(f,c) emul_flock(f,c)
#endif // ESUNOS
#else // EUNIX
#include
#ifdef EWATCOM
# include
# include
#endif
#include
#endif // not EUNIX
#include
#include
#ifdef EXTRA_CHECK
#include
#endif
#ifdef EWINDOWS
#include
#endif
#ifdef EMINGW
#include
#include
#endif
#include
int first_mouse = 1; /* indicates if mouse function has been set up yet */
#ifdef EXTRA_STATS
int mouse_ints = 0; /* number of unused mouse interrupts */
#endif
/* In DOS, this mouse data is locked in memory */
static struct locked_data {
int lock; /* = 0 semaphore */
int code;
int x;
int y;
} mouse = {0,0,0,0};
#define ATOM_1 1
extern int MousePointer(int x);
extern int MouseEvents(int interrupts);
extern int GetMouse(int * result);
int MousePointer(int x)
{
return ATOM_1;
}
int MouseEvents(int interrupts)
{
return ATOM_1;
}
int mouse_installed()
{
return 0;
}
static void show_mouse_cursor(int x)
{
}
static void lock_mouse_pages()
{
}
#ifdef EUNIX
#ifdef EGPM // if GPM package is desired, - not available on FreeBSD
/* Text Mode Mouse in Linux
Codes:
buttons:
left = 4
middle = 2
right = 1
clicks:
0: single click
1: double click
2: triple click
vc always 1?
type:
move = 1
drag = 2 146?
down = 4 20?
up = 8 152?
xterm:
left-down: 409 32 x y
middle-down: 409 33 x y
right-down: 409 34 x y
*any* button-up: 409 35 x y
(can I report all 3 buttons went up?)
no move events are reported
x and y are origin (33,33) at top left of window
*/
int Mouse_Handler(Gpm_Event *event, void *clientdata) {
// handles mouse events
mouse.lock = 1;
mouse.code = event->buttons; //FOR NOW
if (mouse.code == 32)
mouse.code = 4;
else if (mouse.code == 33)
mouse.code = 2;
else if (mouse.code == 34)
mouse.code = 1;
mouse.x = event->x;
mouse.y = event->y;
return -1;
}
static Gpm_Connect conn;
#define ATOM_M1 -1
#define FALSE 0
int GetMouse(int * result)
// Return the next mouse event, or -1
// Linux version using GPM
{
int final_result;
int key, action;
if (first_mouse) {
/* initialize GPM */
first_mouse = FALSE;
conn.eventMask = 0xFFFF; // unsigned short
conn.defaultMask = 0;
conn.minMod = 0;
conn.maxMod = ~0;
gpm_visiblepointer = 1;
//gpm_zerobased = 1;
gpm_handler = Mouse_Handler;
gpm_data = NULL;
Gpm_Open(&conn, 0);
final_result = ATOM_M1;
}
else if (mouse.lock) {
/* we picked up a mouse event via Mouse_Handler() */
mouse.lock = 0;
result[0] = mouse.code;
result[1] = ((mouse.y > 32) ? mouse.x-32 : mouse.x);
result[2] = ((mouse.y > 32) ? mouse.y-32 : mouse.y);
#ifdef EXTRA_STATS
mouse_ints--;
#endif
mouse.code = 0;
final_result = 3;
}
#if 0
else {
/* check for a mouse event (or a key) */
key = Gpm_Getchar();
if (key == -1) {
final_result = ATOM_M1;
}
else if (key == 409) {
action = Gpm_Getchar();
if (action == 32)
action = 4;
else if (action == 33)
action = 2;
else if (action == 34)
action = 1;
result[0] = action;
result[1] = (Gpm_Getchar()-32);
result[2] = (Gpm_Getchar()-32);
#ifdef EXTRA_STATS
mouse_ints--;
#endif
mouse.code = 0;
final_result = 3;
}
else if (key == 27) {
final_result = ATOM_M1;
}
else {
/* we picked up a character */
final_result = ATOM_M1;
}
}
#endif
return final_result;
}
#endif // EGPM
#else
// not LINUX
int GetMouse(int * result)
/* GET_MOUSE event built-in WIN32 */
{
if (first_mouse) {
lock_mouse_pages();
first_mouse = 0;
if (mouse_installed()) {
show_mouse_cursor(0x1);
MouseEvents(0x0000FFFF);
}
}
if (mouse.lock) {
/* there's something in the queue */
mouse.lock = 2; /* critical section */
result[0] = mouse.code;
result[1] = mouse.x;
result[2] = mouse.y;
mouse.lock = 0;
#ifdef EXTRA_STATS
mouse_ints--;
#endif
return 3;
}
else
return ATOM_M1;
}
#endif