This is os2mouse.c in view mode; [Download] [Up]
#ifdef HAS_MOUSE
#define INCL_ERRORS
#define INCL_SUB
#define INCL_DOSPROCESS
#define INCL_DOSSEMAPHORES
#include <config.h>
#include <os2.h>
#include <process.h>
static void show_mouse (int show);
#define MOUSE_RELEASE 'U'
#define MOUSE_DRAG 0
#define MOUSE_PRESS 'D'
#if __os2_16__
typedef USHORT APIRET;
#define DosSetPriority DosSetPrty
#endif
#define THREADSTACKSIZE 32768
static TID Os2_Mouse_ThreadID = (TID) 0;
static int Mouse_Hidden = 1;
static int Last_Mouse_Hidden = 1;
static HMOU Mouse_Handle = -1;
#define MOUSE_BN1 (MOUSE_MOTION_WITH_BN1_DOWN | MOUSE_BN1_DOWN)
#define MOUSE_BN2 (MOUSE_MOTION_WITH_BN2_DOWN | MOUSE_BN2_DOWN)
#define MOUSE_BN3 (MOUSE_MOTION_WITH_BN3_DOWN | MOUSE_BN3_DOWN)
#define MOUSE_NOMOVE (MOUSE_BN1_DOWN | MOUSE_BN2_DOWN | MOUSE_BN3_DOWN)
#define MOUSE_DRAGGED (MOUSE_MOTION_WITH_BN1_DOWN | MOUSE_MOTION_WITH_BN2_DOWN | MOUSE_MOTION_WITH_BN3_DOWN)
#define MOUSE_MOVED (MOUSE_MOTION | MOUSE_DRAGGED)
#define MouseNoMove(event) (MOUSE_NOMOVE & event.fs)
#define MouseMoved(event) (MOUSE_MOVED & event.fs)
#define MouseDragged(event) (MOUSE_DRAGGED & event.fs)
#define MouseButtonPressed(event,button) (event.fs & button)
#define MouseButtons(event) (event.fs & (MOUSE_BN1 | MOUSE_BN2 | MOUSE_BN3))
static int buttonDown [3] = {0, 0, 0};
static int buttonMask [3];
USHORT noButtons;
static void os2_add_event (int x, int y, int type, int but)
{
char buf[4];
int b, s;
JMouse.x = x;
JMouse.y = y;
buf[0] = 27; buf[1] = 0; buf[2] = type;
b = but & 0xF;
s = but >> 4;
if (b == 1)
{
JMouse.button = 1;
buf[3] = 'l';
}
else if (b == 2)
{
JMouse.button = 3;
buf[3] = 'r';
}
else
{
JMouse.button = 2;
buf[3] = 'm';
}
if (s & 0x8) /* alt key--- use as middle */
{
buf[3] = 'm';
}
if (s & 0x3) /* shift */
{
buf[3] -= 0x20;
}
else if (s & 0x4) /* ctrl */
{
buf[3] -= 0x60;
}
ungetkey_string (buf, 4);
}
static void os2_mouse_handler (void *Args)
{
MOUEVENTINFO event_info;
APIRET Error;
USHORT wait_flag;
int press, i;
short x, y;
KBDINFO kbd_info;
(void) Args;
wait_flag = MOU_NOWAIT;
DosSetPriority( PRTYS_THREAD, PRTYC_NOCHANGE, PRTYD_MINIMUM, 0 ) ;
while (Mouse_Handle) {
Error = MouReadEventQue (&event_info, &wait_flag, Mouse_Handle);
if ((Error != NO_ERROR) || !event_info.time) {
DosSleep (5);
continue;
}
x = event_info.col + 1;
y = event_info.row + 1;
if (MouseMoved (event_info) && ((x != JMouse.x) || (y != JMouse.y)))
{
/* mouse moved so show it. */
show_mouse (1);
}
for(i = 0; i < noButtons; i++) {
if(MouseButtonPressed (event_info, buttonMask[i])) {
if (!buttonDown [i]) {
/* I don't think that we can find shift key status in OS/2, since we
* are reading the keyboard in another thread */
kbd_info.cb = sizeof (kbd_info);
KbdGetStatus (&kbd_info, 0);
press = (i + 1) | ((kbd_info.fsState & 0xF) << 4);
os2_add_event (x, y, MOUSE_PRESS, press);
buttonDown [i] = 1;
continue;
} else { /* button already down */
if (MouseDragged (event_info))
{
if ((x == JMouse.x) && (y == JMouse.y)) continue;
os2_add_event (x, y, MOUSE_DRAG, i + 1);
continue;
}
}
} else {
if (buttonDown [i]) {
os2_add_event (x, y, MOUSE_RELEASE, i + 1);
buttonDown [i] = 0;
continue;
}
}
}
}
Mouse_Handle = -1;
_endthread ();
}
static int os2_get_mouse_event (void)
{
return 0;
}
/* Mouse routines for OS/2 */
static void show_mouse (int show)
{
NOPTRRECT PtrRect;
if (show)
{
if (Mouse_Hidden == 0) return;
MouDrawPtr (Mouse_Handle);
}
else
{
if (Mouse_Hidden) return;
PtrRect.row = 0;
PtrRect.col = 0;
PtrRect.cRow = *tt_Screen_Rows - 1;
PtrRect.cCol = *tt_Screen_Cols - 1;
MouRemovePtr (&PtrRect, Mouse_Handle);
}
Mouse_Hidden = !show;
}
static void os2_close_mouse ()
{
MouClose (Mouse_Handle);
Mouse_Handle = 0;
#if defined(__os2_16__)
while (!Mouse_Handle) DosSleep(0);
#else
DosWaitThread (&Os2_Mouse_ThreadID, DCWW_WAIT);
#endif
Os2_Mouse_ThreadID = 0;
}
static void move_mouse (int x, int y)
{
PTRLOC ptr_loc;
ptr_loc.row = y - 1;
ptr_loc.col = x - 1;
MouSetPtrPos (&ptr_loc, Mouse_Handle);
}
static void os2_update_open_hook (void)
{
Last_Mouse_Hidden = Mouse_Hidden;
if (Mouse_Hidden == 0) show_mouse (0);
}
static int Warp_Pending;
static void os2_update_close_hook (void)
{
if (Last_Mouse_Hidden == 0) show_mouse (1);
if (Warp_Pending) move_mouse (Screen_Col - 1, Screen_Row - 1);
Warp_Pending = 0;
}
static void warp_pointer (void)
{
Warp_Pending = 1;
}
static char *CutBuffer;
static int CutBuffer_Len;
static int insert_cutbuffer (void)
{
CHECK_READ_ONLY
if (CutBuffer == NULL) return 0;
if (CutBuffer_Len) ins_chars ((unsigned char *) CutBuffer, CutBuffer_Len);
return CutBuffer_Len;
}
static void region_to_cutbuffer (void)
{
int nbytes;
if (CutBuffer != NULL)
{
SLFREE (CutBuffer);
}
CutBuffer = make_buffer_substring(&nbytes);
CutBuffer_Len = nbytes;
}
static SLang_Name_Type os2_mouse_table[] =
{
MAKE_INTRINSIC(".x_warp_pointer", warp_pointer, VOID_TYPE, 0),
MAKE_INTRINSIC(".x_insert_cutbuffer", insert_cutbuffer, INT_TYPE, 0),
/* Prototype: Integer x_insert_cut_buffer ();
* Inserts cutbuffer into the current buffer and returns the number
* of characters inserted.
*/
MAKE_INTRINSIC(".x_copy_region_to_cutbuffer", region_to_cutbuffer, VOID_TYPE, 0),
/* Prototype: Void x_copy_region_to_cutbuffer();
*/
SLANG_END_TABLE
};
void (*X_Close_Mouse_Hook)(void);
static int os2_open_mouse ()
{
static int not_first_time = 0;
USHORT Error;
X_Close_Mouse_Hook = NULL;
JMouse_Event_Hook = NULL;
JMouse_Hide_Mouse_Hook = NULL;
X_Update_Open_Hook = NULL;
X_Update_Close_Hook = NULL;
/* Now open the device */
Error = MouOpen (NULL, &Mouse_Handle);
if (Error)
return -1;
JMouse.x = *tt_Screen_Cols / 2 + 1;
JMouse.y = *tt_Screen_Rows / 2 + 1;
MouDrawPtr (Mouse_Handle);
MouGetNumButtons (&noButtons, Mouse_Handle);
if (noButtons == 3)
buttonMask [2] = MOUSE_BN3;
buttonMask [0] = MOUSE_BN1;
buttonMask [1] = MOUSE_BN2;
MouFlushQue(Mouse_Handle); /* flush mouse queue */
move_mouse (JMouse.x, JMouse.y);
if (not_first_time == 0)
{
if (!SLang_add_table(os2_mouse_table, "Mouse")
|| !SLdefine_for_ifdef("MOUSE")) return -1;
not_first_time = 1;
}
#if defined __BORLANDC__
Os2_Mouse_ThreadID = _beginthread (os2_mouse_handler, THREADSTACKSIZE, NULL);
#else
Os2_Mouse_ThreadID = _beginthread (os2_mouse_handler, NULL, THREADSTACKSIZE, NULL);
#endif
JMouse_Hide_Mouse_Hook = show_mouse;
X_Close_Mouse_Hook = os2_close_mouse;
/* I am not sure if I should set this */
JMouse_Event_Hook = os2_get_mouse_event;
X_Update_Open_Hook = os2_update_open_hook;
X_Update_Close_Hook = os2_update_close_hook;
return 1;
}
int (*X_Open_Mouse_Hook)(void) = os2_open_mouse;
#endif
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.