home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
panix
/
k95source.tar.gz
/
k95source.tar
/
ckomou.c
< prev
next >
Wrap
C/C++ Source or Header
|
2011-07-19
|
57KB
|
1,616 lines
char *ckomouv = "Mouse Support 8.0.093, 20 Oct 2002";
/* C K O M O U -- Kermit mouse support for OS/2 systems */
/*
Author: Jeffrey Altman (jaltman@secure-endpoints.com)
Secure Endpoints Inc., New York City
Copyright (C) 1985, 2004, Trustees of Columbia University in the City of New
York.
*/
#include "ckcdeb.h"
#ifdef OS2MOUSE
#ifdef NT
#include <windows.h>
#else /* NT */
#define INCL_WINSHELLDATA
#define INCL_VIO
#define INCL_MOU
#define INCL_ERRORS
#define INCL_DOSPROCESS
#define INCL_DOSSESMGR
#define INCL_DOSSEMAPHORES
#define INCL_DOSDEVIOCTL
#define INCL_WINCLIPBOARD
#define INCL_DOSDATETIME
#define INCL_DOSASYNCTIMER
#include <os2.h>
#undef COMMENT /* COMMENT is defined in os2.h */
#endif /* NT */
#include "ckuusr.h"
#include "ckcker.h"
#include "ckocon.h"
#include "ckokey.h"
static BOOL SelectionValid = 0 ;
con_event mousemap[MMBUTTONMAX][MMSIZE] ;
#ifdef NT
static USHORT Vrow, Vcol, n, ShiftState, Event ;
static USHORT lastrow=0, lastcol=0 ;
static struct {
int state ;
USHORT row ;
USHORT col ;
} b1 = {0,0,0}, b2 = {0,0,0}, b3 = {0,0,0};
int mouseon = 0 ;
#else /* NT */
static HMOU hMouse = 0 ;
static int dblclickspeed = 500 ;
static TID tidMouse = 0 ;
#endif /* NT */
extern int tnlm;
extern int tt_status[VNUM];
extern vik_rec vik; /* Very Important Keys */
#define THRDSTKSIZ 131072 /* Needed for Mouse Thread */
int MouseCurX, MouseCurY;
int MouseDebug = 0;
/*
Potential mouse events:
MOUSE_MOTION
MOUSE_MOTION_WITH_BN1_DOWN
MOUSE_BN1_DOWN
MOUSE_MOTION_WITH_BN2_DOWN
MOUSE_BN2_DOWN
MOUSE_MOTION_WITH_BN3_DOWN
MOUSE_BN3_DOWN
*/
static BOOL ThreeButton = 0 ; /* 0 -two buttons, 1 - three buttons */
int
mousebuttoncount()
{
return(ThreeButton?3:2);
}
#ifndef NT
int
querydblclickspeed( void )
{
CHAR data[8] ;
ULONG size = 8 ;
if ( PrfQueryProfileData( HINI_USERPROFILE, "PM_ControlPanel",
"DoubleClickSpeed", data, &size ) )
return atoi( data ) ;
else
return 500 ; /* the OS/2 default is 500 milliseconds */
}
#endif /* NT */
char *
mousename( int button, int event )
{
static char mousename[64] ;
char temp[17] ;
mousename[0] = '\0' ;
strcpy(mousename, "Button ") ;
#ifdef NT
ckstrncat(mousename, _itoa(button+1,temp,10), sizeof(mousename) ) ;
#else /* NT */
ckstrncat(mousename, itoa(button+1,temp,10), sizeof(mousename) ) ;
#endif /* NT */
ckstrncat(mousename, " ", sizeof(mousename) ) ;
if ( event & MMCTRL )
ckstrncat( mousename, "Ctrl-", sizeof(mousename) ) ;
if ( event & MMALT )
ckstrncat( mousename, "Alt-", sizeof(mousename) ) ;
if ( event & MMSHIFT )
ckstrncat( mousename, "Shift-", sizeof(mousename) ) ;
if ( event & MMDRAG )
ckstrncat( mousename, "Drag", sizeof(mousename) ) ;
else if ( event & MMDBL )
ckstrncat( mousename, "Double-Click", sizeof(mousename) ) ;
else ckstrncat (mousename, "Click", sizeof(mousename) ) ;
return mousename ;
}
void
mousemapinit( int button, int event )
{
int x,y, resetall ;
resetall = button < 0 || event < 0 ||
button >= MMBUTTONMAX || event >= MMEVENTSIZE ;
if ( resetall )
for ( x = 0 ; x < MMBUTTONMAX ; x++ ) {
for ( y = 0 ; y < MMSIZE ; y++ )
if ( y == MMCLICK )
{
mousemap[x][y].type = kverb ;
mousemap[x][y].kverb.id = F_KVERB | K_IGNORE ;
}
else mousemap[x][y].type = error ;
}
if ( resetall || button == MMB1 && event == MMDBL ) {
/* Assign Cursor Positioning */
mousemap[MMB1][MMDBL].type = kverb ;
mousemap[MMB1][MMDBL].kverb.id = F_KVERB | K_MOUSE_CURPOS ;
if ( !resetall )
return ;
}
if ( resetall || button == MMB1 && event == MMCTRL | MMCLICK ) {
/* Assign URL Execution */
mousemap[MMB1][MMCTRL|MMCLICK].type = kverb ;
mousemap[MMB1][MMCTRL|MMCLICK].kverb.id = F_KVERB | K_MOUSE_URL ;
if ( !resetall )
return ;
}
if ( resetall || button == MMB1 && event == MMDRAG ) {
mousemap[MMB1][MMDRAG].type = kverb ;
mousemap[MMB1][MMDRAG].kverb.id = F_KVERB | K_MARK_COPYCLIP ;
if ( !resetall )
return ;
}
if ( resetall || button == MMB2 && event == MMDRAG ) {
mousemap[MMB2][MMDRAG].type = kverb ;
mousemap[MMB2][MMDRAG].kverb.id = F_KVERB | K_MARK_COPYHOST ;
if ( !resetall )
return ;
}
if ( resetall || button == MMB1 && event == MMCTRL | MMDRAG ) {
mousemap[MMB1][MMCTRL | MMDRAG].type = kverb ;
mousemap[MMB1][MMCTRL | MMDRAG].kverb.id =
F_KVERB | K_MARK_COPYHOST ;
if ( !resetall )
return ;
}
if ( resetall || button == MMB1 && event == MMALT | MMDRAG) {
mousemap[MMB1][MMALT | MMDRAG].type = kverb ;
mousemap[MMB1][MMALT | MMDRAG].kverb.id = F_KVERB | K_MARK_COPYCLIP_NOEOL ;
if ( !resetall )
return ;
}
if ( resetall || button == MMB2 && event == MMALT | MMDRAG ) {
mousemap[MMB2][MMALT | MMDRAG].type = kverb ;
mousemap[MMB2][MMALT | MMDRAG].kverb.id = F_KVERB | K_MARK_COPYHOST_NOEOL ;
if ( !resetall )
return ;
}
if ( resetall || button == MMB1 && event == MMCTRL | MMALT | MMDRAG ) {
mousemap[MMB1][MMCTRL | MMALT | MMDRAG].type = kverb ;
mousemap[MMB1][MMCTRL | MMALT | MMDRAG].kverb.id = F_KVERB | K_MARK_COPYHOST_NOEOL ;
if ( !resetall )
return ;
}
if ( resetall || button == MMB1 && event == MMSHIFT | MMCTRL | MMDRAG ) {
mousemap[MMB1][MMSHIFT | MMCTRL | MMDRAG].type = kverb ;
mousemap[MMB1][MMSHIFT | MMCTRL | MMDRAG].kverb.id =
F_KVERB | K_DUMP ;
if ( !resetall )
return ;
}
if ( resetall || button == MMB2 && event == MMDBL ) {
mousemap[MMB2][MMDBL].type = kverb ;
mousemap[MMB2][MMDBL].kverb.id = F_KVERB | K_PASTE ;
if ( !resetall )
return ;
}
if ( resetall || button == MMB3 && event == MMDBL ) {
mousemap[MMB3][MMDBL].type = kverb ;
mousemap[MMB3][MMDBL].kverb.id = F_KVERB | K_PASTE ;
if ( !resetall )
return ;
}
if ( !resetall ) {
if ( event == MMCLICK )
{
mousemap[button][event].type = kverb ;
mousemap[button][event].kverb.id = F_KVERB | K_IGNORE ;
}
else mousemap[button][event].type = error ;
return ;
}
}
#ifndef NT
APIRET
os2_mouseshow( void )
{
APIRET rc = 0 ;
NOPTRRECT PtrArea ;
CK_VIDEOMODEINFO ModeData ;
if ( hMouse )
{
GetMode( &ModeData ) ;
PtrArea.row = ModeData.row - 1 ;
PtrArea.col = 0 ;
PtrArea.cRow = ModeData.row - 1;
PtrArea.cCol = ModeData.col - 1 ;
MouRemovePtr( &PtrArea, hMouse ) ;
}
return rc ;
}
APIRET
os2_mousehide( void )
{
APIRET rc = 0 ;
NOPTRRECT PtrArea ;
CK_VIDEOMODEINFO ModeData ;
if (hMouse)
{
GetMode( &ModeData ) ;
PtrArea.row = 0 ;
PtrArea.col = 0 ;
PtrArea.cRow = ModeData.row - 1;
PtrArea.cCol = ModeData.col - 1 ;
MouRemovePtr( &PtrArea, hMouse ) ;
}
return rc ;
}
#endif /* NT */
APIRET
os2_mouseon( void )
{
APIRET rc = 0 ;
#ifdef NT
extern HANDLE KbdHandle ;
DWORD mode=0, count=0 ;
GetNumberOfConsoleMouseButtons(&count) ;
ThreeButton = ( count == 3 ) ;
debug(F101,"os2_mouseon Button Count","",count ) ;
debug(F111,"os2_mouseon","KbdHandle",KbdHandle);
GetConsoleMode( KbdHandle, &mode ) ;
debug(F111,"os2_mouseon GetConsoleMode","mode",mode);
mode |= ENABLE_MOUSE_INPUT ;
debug(F111,"os2_mouseon","mode",mode);
rc = SetConsoleMode( KbdHandle, mode ) ;
mouseon = TRUE ;
debug(F111,"os2_mouseon SetConsoleMode","rc",rc) ;
#else /* NT */
PTRLOC PtrPos ;
NOPTRRECT PtrArea ;
CK_VIDEOMODEINFO ModeData ;
USHORT ButtonCount ;
USHORT EventMask ;
extern BYTE vmode ;
if (!tidMouse) {
rc = MouOpen( 0, &hMouse ) ;
debug(F101,"Mouse On","",rc) ;
}
if ( !rc ) {
rc = MouDrawPtr( hMouse ) ;
GetMode( &ModeData ) ;
if ( IsOS2FullScreen() ) {
PtrPos.row = ModeData.row - 1 ;
PtrPos.col = VscrnGetWidth(vmode)-1 ;
MouSetPtrPos( &PtrPos, hMouse ) ;
}
PtrArea.row = ModeData.row - 1 ;
PtrArea.col = 0 ;
PtrArea.cRow = ModeData.row - 1;
PtrArea.cCol = ModeData.col - 1 ;
MouRemovePtr( &PtrArea, hMouse ) ;
MouGetNumButtons( &ButtonCount, hMouse ) ;
debug(F101,"os2_mouseon Button Count","",ButtonCount ) ;
if ( ButtonCount == 3 )
{
ThreeButton = 1 ;
EventMask = MOUSE_BN1_DOWN |
MOUSE_MOTION_WITH_BN1_DOWN |
MOUSE_BN2_DOWN |
MOUSE_MOTION_WITH_BN2_DOWN |
MOUSE_BN3_DOWN |
MOUSE_MOTION_WITH_BN3_DOWN ;
}
else /* 2 buttons */
{
ThreeButton = 0 ;
EventMask = MOUSE_BN1_DOWN |
MOUSE_MOTION_WITH_BN1_DOWN |
MOUSE_BN2_DOWN |
MOUSE_MOTION_WITH_BN2_DOWN ;
}
MouSetEventMask( &EventMask, hMouse ) ;
dblclickspeed = querydblclickspeed() ;
if (!tidMouse) {
tidMouse = _beginthread( &os2_mouseevt, 0, THRDSTKSIZ, 0 ) ;
}
}
#endif /* NT */
return rc ;
}
void
mouseurl( int mode, USHORT row, USHORT col )
{
#ifdef BROWSER
extern char browsopts[];
extern char browser[];
char cmd[1024]="", tmpbuf[1024]="";
char *s, *d;
int rc, x=0;
#ifdef NT
STARTUPINFO si;
SECURITY_ATTRIBUTES sa;
PROCESS_INFORMATION pi;
#else /* NT */
STARTDATA sd;
PID pid;
ULONG idSession;
#endif /* NT */
const char * url;
if ( VscrnURL( mode, row, col ) ) {
bleep(BP_FAIL);
return ;
}
url = GetURL();
if (browsopts[0]) {
x = ckindex("%1",(char *)browsopts,0,0,1);
if (x > 0)
browsopts[x] = 's'; /* x is 1-based */
else
x = ckindex("%s",(char *)browsopts,0,0,1);
}
if (x)
sprintf(tmpbuf,browsopts,url);
else
sprintf(tmpbuf,"%s %s",browsopts,url);
debug(F110,"mouseurl options and url",tmpbuf,0);
#ifdef NT
if ( (GetURLType() == HYPERLINK_UNC) || !browser[0] ) {
if ( !Win32ShellExecute(url) )
bleep(BP_FAIL);
debug(F111,"mouseurl ShellExecute",url,GetLastError());
}
else {
memset( &sa, 0, sizeof(SECURITY_ATTRIBUTES) ); // Initialize struct
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor=NULL;
sa.bInheritHandle=1;
memset( &si, 0, sizeof(STARTUPINFO) ); // Initialize struct
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = 1; // Don't show the console window (DOS box)
sprintf(cmd,"%s %s",browser,tmpbuf);
rc = CreateProcess ( NULL, cmd, NULL, NULL, FALSE, // bInheritHandler
CREATE_NEW_PROCESS_GROUP,
NULL, NULL, &si, &pi);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
debug(F111,"mouseurl",cmd,rc?0:GetLastError());
}
#else /* NT */
memset(&sd,0,sizeof(STARTDATA));
sd.Length = sizeof(STARTDATA);
sd.Related = SSF_RELATED_INDEPENDENT;
sd.FgBg = SSF_FGBG_FORE;
sd.TraceOpt = SSF_TRACEOPT_NONE;
sd.PgmTitle = "K-95 Browser";
sd.PgmName = browser;
sd.PgmInputs = tmpbuf;
sd.TermQ = 0;
sd.Environment = 0;
sd.InheritOpt = SSF_INHERTOPT_SHELL;
sd.SessionType = SSF_TYPE_DEFAULT;
sd.IconFile = 0;
sd.ObjectBuffer = cmd;
sd.ObjectBuffLen = 1024;
rc = DosStartSession( &sd, &idSession, &pid );
debug(F111,"mouseurl",cmd,rc);
#endif /* NT */
#endif /* BROWSER */
}
void
mousecurpos( int mode, USHORT orow, USHORT ocol, USHORT nrow, USHORT ncol, BOOL kverb )
{
#ifdef NT
extern int win32ScrollUp, win32ScrollDown;
#endif /* NT */
RequestKeyStrokeMutex( mode, SEM_INDEFINITE_WAIT);
#ifdef NT
/* only set the scroll flag if we are using kverbs and not keystrokes */
if ( kverb ) {
win32ScrollUp = (nrow < 1);
win32ScrollDown = (nrow >= (VscrnGetHeight(mode)
-1 -(tt_status[mode]?1:0)));
}
#endif /* NT */
for (; ocol > ncol; ocol-- )
{
!kverb ?
putkey( mode, 4389 ) :
putkverb( mode, F_KVERB | K_LFARR ) ; /* LEFT */
}
for (; orow > nrow; orow-- )
{
!kverb ?
putkey( mode, 4390 ) :
putkverb( mode, F_KVERB | K_UPARR ) ; /* UP */
}
for (; orow < nrow; orow++ )
{
!kverb ?
putkey( mode, 4392 ) :
putkverb( mode, F_KVERB | K_DNARR ) ; /* DOWN */
}
for (; ocol < ncol; ocol++ )
{
!kverb ?
putkey( mode, 4391 ) :
putkverb( mode, F_KVERB | K_RTARR ) ; /* RIGHT */
}
ReleaseKeyStrokeMutex(mode) ;
}
#ifdef NT
void
win32MouseEvent( int mode, MOUSE_EVENT_RECORD r )
{
#ifdef NT
extern int win32ScrollUp, win32ScrollDown;
#endif /* NT */
position * ppos ;
char buffer[1024] ;
if ( MouseDebug ) {
int needcomma = 0;
printf("Mouse Event: (%d,%d)",r.dwMousePosition.X,r.dwMousePosition.Y);
if ( r.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED ) {
printf(" B1");
needcomma = 1;
}
if ( r.dwButtonState & (ThreeButton ? FROM_LEFT_2ND_BUTTON_PRESSED :
RIGHTMOST_BUTTON_PRESSED) ) {
if ( needcomma )
printf(",B2");
else {
printf(" B2");
needcomma = 1;
}
}
if ( r.dwButtonState & (ThreeButton ? RIGHTMOST_BUTTON_PRESSED : 0) ) {
if ( needcomma )
printf(",B3");
else {
printf(" B3");
}
}
needcomma = 0;
if ( r.dwControlKeyState & CONTROL ) {
printf(" Ctrl");
needcomma = 1;
}
if ( r.dwControlKeyState & ALT ) {
if ( needcomma )
printf("-Alt");
else {
printf(" Alt");
needcomma = 1;
}
}
if ( r.dwControlKeyState & SHIFT ) {
if ( needcomma )
printf("-Shift");
else
printf(" Shift");
}
needcomma = 0;
if ( r.dwEventFlags == 0 ) {
printf(" Click");
} else {
if ( r.dwEventFlags & DOUBLE_CLICK ) {
printf(" Double");
needcomma = 1;
}
if ( r.dwEventFlags & MOUSE_MOVED ) {
if ( needcomma )
printf("-Move");
else {
printf(" Move");
needcomma = 1;
}
}
#ifdef MOUSE_WHEELED
if ( r.dwEventFlags & MOUSE_WHEELED ) {
if ( needcomma )
printf("-Wheel");
else {
printf(" Wheel");
needcomma = 1;
}
}
#endif /* MOUSE_WHEELED */
}
printf("\n");
return;
}
/* \V() variables */
MouseCurX = r.dwMousePosition.X;
MouseCurY = r.dwMousePosition.Y;
if ( TRUE )
{
Event = 0 ;
if ( r.dwControlKeyState & SHIFT )
Event |= MMSHIFT ;
if ( r.dwControlKeyState & ALT )
Event |= MMALT ;
if ( r.dwControlKeyState & CONTROL )
Event |= MMCTRL ;
sprintf(buffer, " Event: fs:%3x row:%3d col:%3d",
r.dwButtonState,
r.dwMousePosition.Y, r.dwMousePosition.X) ;
debug(F110,"win32MouseEvent",buffer,0) ;
ppos = VscrnGetCurPos(mode) ;
Vrow = ppos->y ;
Vcol = ppos->x ;
if ( r.dwMousePosition.Y >= VscrnGetHeight(mode)
-(tt_status[mode]?1:0) )
r.dwMousePosition.Y = VscrnGetHeight(mode) -(1+(tt_status[mode]?1:0)) ;
if ( r.dwMousePosition.Y < 0 )
r.dwMousePosition.Y = 0 ;
if ( r.dwMousePosition.X >= VscrnGetWidth(mode) )
r.dwMousePosition.X = VscrnGetWidth(mode) -1 ;
if ( r.dwMousePosition.X < 0 )
r.dwMousePosition.X = 0 ;
if ( (r.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED) && b1.state == 0 ) {
if ( !SelectionValid &&
(r.dwEventFlags & DOUBLE_CLICK) ) {
/* Double Click */
debug( F100, "mouse B1 double click", "", 0 ) ;
b1.state = 2 ;
b1.row = r.dwMousePosition.Y ;
b1.col = r.dwMousePosition.X ;
}
else {
/* Single Click */
b1.state = 1 ;
b1.row = r.dwMousePosition.Y ;
b1.col = r.dwMousePosition.X ;
debug( F100, "mouse B1 single click", "", 0 ) ;
}
}
else if ( (r.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED) && (r.dwEventFlags & MOUSE_MOVED) ) {
debug( F100, "mouse B1 drag", "", 0 ) ;
if ( b1.state == 1 && !SelectionValid && (MouseCurY != b1.row || MouseCurX != b1.col)) {
SelectionValid = 1 ;
RequestKeyStrokeMutex( mode, SEM_INDEFINITE_WAIT);
putkverb( mode, F_KVERB | K_MARK_START ) ;
mousecurpos( mode, Vrow, Vcol, b1.row, b1.col, TRUE ) ;
putkverb( mode, F_KVERB | K_MARK_START ) ;
mousecurpos( mode, b1.row, b1.col, MouseCurY, MouseCurX, TRUE );
ReleaseKeyStrokeMutex(mode) ;
}
else if ( b1.state == 1 && SelectionValid &&
( lastrow != r.dwMousePosition.Y ||
lastcol != r.dwMousePosition.X )
) {
mousecurpos( mode, lastrow, lastcol, r.dwMousePosition.Y,
r.dwMousePosition.X, TRUE ) ;
}
}
if ( (r.dwButtonState & (ThreeButton ? FROM_LEFT_2ND_BUTTON_PRESSED : RIGHTMOST_BUTTON_PRESSED)) && b2.state == 0 ) {
if ( !SelectionValid &&
(r.dwEventFlags & DOUBLE_CLICK) ) {
/* Double Click */
debug( F100, "mouse B2 double click", "", 0 ) ;
b2.state = 2 ;
b2.row = r.dwMousePosition.Y ;
b2.col = r.dwMousePosition.X ;
}
else {
/* Single Click */
b2.state = 1 ;
b2.row = r.dwMousePosition.Y ;
b2.col = r.dwMousePosition.X ;
debug( F100, "mouse B2 single click", "", 0 ) ;
}
}
else if ( (r.dwButtonState & (ThreeButton ? FROM_LEFT_2ND_BUTTON_PRESSED : RIGHTMOST_BUTTON_PRESSED)) &&
(r.dwEventFlags & MOUSE_MOVED)) {
debug( F100, "mouse B2 drag", "", 0 ) ;
if ( b2.state == 1 && !SelectionValid && (MouseCurY != b2.row || MouseCurX != b2.col) ) {
SelectionValid = 1 ;
RequestKeyStrokeMutex( mode, SEM_INDEFINITE_WAIT);
putkverb( mode, F_KVERB | K_MARK_START ) ;
mousecurpos( mode, Vrow, Vcol, b2.row, b2.col, TRUE ) ;
putkverb( mode, F_KVERB | K_MARK_START ) ;
mousecurpos( mode, b2.row, b2.col, MouseCurY, MouseCurX, TRUE );
ReleaseKeyStrokeMutex(mode) ;
}
else if ( b2.state == 1 && SelectionValid &&
( lastrow != r.dwMousePosition.Y ||
lastcol != r.dwMousePosition.X )
) {
mousecurpos( mode, lastrow, lastcol, r.dwMousePosition.Y,
r.dwMousePosition.X, TRUE ) ;
}
}
if ( (r.dwButtonState & (ThreeButton ? RIGHTMOST_BUTTON_PRESSED : 0)) && b3.state == 0 ) {
if ( !SelectionValid &&
(r.dwEventFlags & DOUBLE_CLICK) ) {
/* Double Click */
b3.state = 2 ;
debug( F100, "mouse B3 double click","",0) ;
}
else {
/* Single Click */
b3.state = 1 ;
b3.row = r.dwMousePosition.Y ;
b3.col = r.dwMousePosition.X ;
debug( F100, "mouse B3 single click","",0) ;
}
}
else if ( (r.dwButtonState & (ThreeButton ? RIGHTMOST_BUTTON_PRESSED : 0)) && (r.dwEventFlags & MOUSE_MOVED) ) {
debug( F100, "mouse B3 drag","",0) ;
if ( b3.state == 1 && !SelectionValid && (MouseCurY != b3.row || MouseCurX != b3.col) ) {
SelectionValid = 1 ;
RequestKeyStrokeMutex( mode, SEM_INDEFINITE_WAIT);
putkverb( mode, F_KVERB | K_MARK_START ) ;
mousecurpos( mode, Vrow, Vcol, b3.row, b3.col, TRUE ) ;
putkverb( mode, F_KVERB | K_MARK_START ) ;
mousecurpos( mode, b3.row, b3.col, MouseCurY, MouseCurX, TRUE );
ReleaseKeyStrokeMutex(mode) ;
}
else if ( b3.state == 1 && SelectionValid &&
( lastrow != r.dwMousePosition.Y ||
lastcol != r.dwMousePosition.X )
) {
mousecurpos( mode, lastrow, lastcol, r.dwMousePosition.Y,
r.dwMousePosition.X, TRUE ) ;
}
}
if ( !(r.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED) ) {
/* button 1 may have been released */
if ( b1.state == 1 ) {
debug( F100, "mouse B1 single click released", "" , 0 );
Event |= MMCLICK ;
if ( SelectionValid ) {
Event |= MMDRAG ;
}
/* Handle special Mouse Kverbs */
if ( mousemap[MMB1][Event].type == kverb ) {
switch (mousemap[MMB1][Event].kverb.id & ~(F_KVERB)) {
case K_MOUSE_CURPOS:
putkverb( mode, F_KVERB | K_MARK_CANCEL ) ;
mousecurpos( mode, Vrow, Vcol, r.dwMousePosition.Y,
r.dwMousePosition.X, FALSE ) ;
break;
case K_MOUSE_URL:
putkverb( mode, F_KVERB | K_MARK_CANCEL ) ;
mouseurl( mode, r.dwMousePosition.Y,
r.dwMousePosition.X );
break;
case K_MARK_COPYCLIP:
case K_MARK_COPYHOST:
case K_MARK_COPYCLIP_NOEOL:
case K_MARK_COPYHOST_NOEOL:
case K_DUMP:
putevent( mode, mousemap[MMB1][Event] ) ;
putkverb( mode, F_KVERB | K_MARK_CANCEL ) ;
break;
case K_MOUSE_MARK:
case K_IGNORE:
break;
default:
putevent( mode, mousemap[MMB1][Event] ) ;
putkverb( mode, F_KVERB | K_MARK_CANCEL ) ;
}
}
else if (mousemap[MMB1][Event].type != error) {
putevent( mode, mousemap[MMB1][Event] ) ;
putkverb( mode, F_KVERB | K_MARK_CANCEL ) ;
}
else {
putkverb( mode, F_KVERB | K_MARK_CANCEL ) ;
}
SelectionValid = 0 ;
b1.state = 0 ;
b1.row = 0 ;
b1.col = 0 ;
#ifdef NT
win32ScrollUp = win32ScrollDown = 0;
#endif /* NT */
}
else if ( b1.state == 2 ) {
debug( F100, "mouse B1 double click released", "" , 0 );
Event |= MMDBL ;
/* Handle special Mouse Kverbs */
if ( mousemap[MMB1][Event].type == kverb)
{
switch (mousemap[MMB1][Event].kverb.id & ~(F_KVERB)) {
case K_MOUSE_MARK:
case K_IGNORE:
break;
case K_MOUSE_CURPOS:
mousecurpos( mode, Vrow, Vcol, r.dwMousePosition.Y,
r.dwMousePosition.X, FALSE ) ;
break;
case K_MOUSE_URL:
mouseurl( mode, r.dwMousePosition.Y,
r.dwMousePosition.X );
break;
default:
putevent( mode, mousemap[MMB1][Event] ) ;
}
}
else if ( mousemap[MMB1][Event].type != error ) {
putevent( mode, mousemap[MMB1][Event] ) ;
}
SelectionValid = 0 ;
b1.state = 0 ;
b1.row = 0 ;
b1.col = 0 ;
#ifdef NT
win32ScrollUp = win32ScrollDown = 0;
#endif /* NT */
}
}
if ( !(r.dwButtonState & ( ThreeButton ? FROM_LEFT_2ND_BUTTON_PRESSED : RIGHTMOST_BUTTON_PRESSED ) ) ) {
/* button 2 may have been released */
if ( b2.state == 1 ) {
debug( F100, "mouse B2 single click released", "" , 0 );
Event |= MMCLICK ;
if ( SelectionValid ) {
Event |= MMDRAG ;
}
/* Handle special Mouse Kverbs */
if ( mousemap[MMB2][Event].type == kverb)
{
switch (mousemap[MMB2][Event].kverb.id & ~(F_KVERB)) {
case K_MOUSE_MARK:
case K_IGNORE:
break;
case K_MOUSE_CURPOS:
putkverb( mode, F_KVERB | K_MARK_CANCEL ) ;
mousecurpos( mode, Vrow, Vcol, r.dwMousePosition.Y,
r.dwMousePosition.X, FALSE ) ;
break;
case K_MOUSE_URL:
putkverb( mode, F_KVERB | K_MARK_CANCEL ) ;
mouseurl( mode, r.dwMousePosition.Y,
r.dwMousePosition.X );
break;
case K_MARK_COPYCLIP:
case K_MARK_COPYHOST:
case K_MARK_COPYCLIP_NOEOL:
case K_MARK_COPYHOST_NOEOL:
case K_DUMP:
putevent( mode, mousemap[MMB2][Event] ) ;
putkverb( mode, F_KVERB | K_MARK_CANCEL ) ;
break;
default:
putevent( mode, mousemap[MMB2][Event] ) ;
putkverb( mode, F_KVERB | K_MARK_CANCEL ) ;
}
}
else if (mousemap[MMB2][Event].type != error ) {
putevent( mode, mousemap[MMB2][Event] ) ;
putkverb( mode, F_KVERB | K_MARK_CANCEL ) ;
}
else {
putkverb( mode, F_KVERB | K_MARK_CANCEL ) ;
}
SelectionValid = 0 ;
b2.state = 0 ;
b2.row = 0 ;
b2.col = 0 ;
#ifdef NT
win32ScrollUp = win32ScrollDown = 0;
#endif /* NT */
}
else if ( b2.state == 2 ) {
debug( F100, "mouse B2 double click released", "" , 0 );
Event |= MMDBL ;
/* Handle special Mouse Kverbs */
if ( mousemap[MMB2][Event].type == kverb ) {
switch (mousemap[MMB2][Event].kverb.id & ~(F_KVERB)) {
case K_MOUSE_MARK:
case K_IGNORE:
break;
case K_MOUSE_CURPOS:
mousecurpos( mode, Vrow, Vcol, r.dwMousePosition.Y,
r.dwMousePosition.X, FALSE ) ;
break;
case K_MOUSE_URL:
mouseurl( mode, r.dwMousePosition.Y,
r.dwMousePosition.X );
break;
default:
putevent( mode, mousemap[MMB2][Event] ) ;
}
}
else if ( mousemap[MMB2][Event].type != error ) {
putevent( mode, mousemap[MMB2][Event] ) ;
}
SelectionValid = 0 ;
b2.state = 0 ;
b2.row = 0 ;
b2.col = 0 ;
#ifdef NT
win32ScrollUp = win32ScrollDown = 0;
#endif /* NT */
}
}
if ( !(r.dwButtonState & (ThreeButton ? RIGHTMOST_BUTTON_PRESSED : 0) ) ) {
/* button 3 may have been released */
if ( b3.state == 1 ) {
debug( F100, "mouse B3 single click released", "" , 0 );
Event |= MMCLICK ;
if ( SelectionValid ) {
Event |= MMDRAG ;
}
/* Handle special Mouse Kverbs */
if ( mousemap[MMB3][Event].type == kverb ) {
switch (mousemap[MMB3][Event].kverb.id & ~(F_KVERB)) {
case K_MOUSE_MARK:
case K_IGNORE:
break;
case K_MOUSE_CURPOS:
putkverb( mode, F_KVERB | K_MARK_CANCEL ) ;
mousecurpos( mode, Vrow, Vcol, r.dwMousePosition.Y,
r.dwMousePosition.X, FALSE ) ;
break;
case K_MOUSE_URL:
putkverb( mode, F_KVERB | K_MARK_CANCEL ) ;
mouseurl( mode, r.dwMousePosition.Y,
r.dwMousePosition.X );
break;
case K_MARK_COPYCLIP:
case K_MARK_COPYHOST:
case K_MARK_COPYCLIP_NOEOL:
case K_MARK_COPYHOST_NOEOL:
case K_DUMP:
putevent( mode, mousemap[MMB3][Event] ) ;
putkverb( mode, F_KVERB | K_MARK_CANCEL ) ;
break;
default:
putevent( mode, mousemap[MMB3][Event] ) ;
putkverb( mode, F_KVERB | K_MARK_CANCEL ) ;
}
}
else if ( mousemap[MMB3][Event].type != error ) {
putevent( mode,mousemap[MMB3][Event] ) ;
putkverb( mode, F_KVERB | K_MARK_CANCEL ) ;
}
else {
putkverb( mode, F_KVERB | K_MARK_CANCEL ) ;
}
SelectionValid = 0 ;
b3.state = 0 ;
b3.row = 0 ;
b3.col = 0 ;
#ifdef NT
win32ScrollUp = win32ScrollDown = 0;
#endif /* NT */
}
else if ( b3.state == 2 ) {
debug( F100, "mouse B3 double click released", "" , 0 );
Event |= MMDBL ;
/* Handle special Mouse Kverbs */
if ( mousemap[MMB3][Event].type == kverb ) {
switch (mousemap[MMB3][Event].kverb.id & ~(F_KVERB)) {
case K_MOUSE_MARK:
case K_IGNORE:
break;
case K_MOUSE_CURPOS:
mousecurpos( mode, Vrow, Vcol, r.dwMousePosition.Y,
r.dwMousePosition.X, FALSE ) ;
break;
case K_MOUSE_URL:
mouseurl( mode, r.dwMousePosition.Y,
r.dwMousePosition.X );
break;
default:
putevent( mode, mousemap[MMB3][Event] ) ;
}
}
else if ( mousemap[MMB3][Event].type != error ) {
putevent( mode, mousemap[MMB3][Event] ) ;
}
SelectionValid = 0 ;
b3.state = 0 ;
b3.row = 0 ;
b3.col = 0 ;
#ifdef NT
win32ScrollUp = win32ScrollDown = 0;
#endif /* NT */
}
}
lastrow = r.dwMousePosition.Y ;
lastcol = r.dwMousePosition.X ;
}
else /* No Mouse Event */ {
char buffer[1024] ;
if ( SelectionValid ) {
ppos = VscrnGetCurPos(mode) ;
Vrow = ppos->y ;
Vcol = ppos->x ;
if ( lastrow == 0 &&
VscrnGetBegin(mode) != VscrnGetScrollTop(mode)+Vrow ) {
putkverb( mode, F_KVERB | K_UPONE ) ;
}
else if ( lastrow == VscrnGetHeight(mode) -2 &&
VscrnGetEnd(mode) != VscrnGetScrollTop(mode)+Vrow ) {
putkverb( mode, F_KVERB | K_DNONE ) ;
}
sprintf(buffer, "AutoScroll: fs:%3x row:%3d col:%3d",
r.dwButtonState,
r.dwMousePosition.Y, r.dwMousePosition.X) ;
debug(F110,"win32MouseEvent",buffer,0) ;
}
#ifdef COMMENT
else {
sprintf(buffer, "NoEvent: fs:%3x row:%3d col:%3d",
r.dwButtonState,
r.dwMousePosition.Y, r.dwMousePosition.X) ;
debug(F110,"win32MouseEvent",buffer,0) ;
}
#endif /* COMMENT */
}
}
#else /* NT */
void
os2_mouseevt(void *pArgList) {
APIRET rc ;
MOUEVENTINFO MouseEventInfo ;
USHORT ReadType = MOU_NOWAIT ;
position * ppos ;
USHORT Vrow, Vcol, n, ShiftState, Event ;
USHORT lastrow=0, lastcol=0 ;
ULONG postcount ;
extern BYTE vmode;
struct {
int state ;
USHORT row ;
USHORT col ;
HTIMER timer ;
HEV sem ;
} b1 = {0,0,0,0,(HEV) 0}, b2 = {0,0,0,0,(HEV) 0}, b3 = {0,0,0,0,(HEV) 0};
ResetThreadPrty() ;
DosCreateEventSem( NULL, &b1.sem, DC_SEM_SHARED, FALSE ) ;
DosCreateEventSem( NULL, &b2.sem, DC_SEM_SHARED, FALSE ) ;
DosCreateEventSem( NULL, &b3.sem, DC_SEM_SHARED, FALSE ) ;
while (hMouse)
{
memset( &MouseEventInfo, 0, sizeof( MOUEVENTINFO ) ) ;
rc = MouReadEventQue( &MouseEventInfo, &ReadType, hMouse ) ;
if ( rc == NO_ERROR && MouseEventInfo.time ) {
char buffer[1024] ;
ShiftState = getshiftstate() ;
Event = 0 ;
if ( ShiftState & SHIFT )
Event |= MMSHIFT ;
if ( ShiftState & ALT )
Event |= MMALT ;
if ( ShiftState & CONTROL )
Event |= MMCTRL ;
sprintf(buffer, " Event: fs:%3x time:%10d row:%3d col:%3d",
MouseEventInfo.fs, MouseEventInfo.time,
MouseEventInfo.row, MouseEventInfo.col) ;
debug(F110,"os2_mouseevt",buffer,0) ;
if ( MouseDebug )
printf(buffer);
/* \V() variables */
MouseCurX = MouseEventInfo.col;
MouseCurY = MouseEventInfo.row;
ppos = VscrnGetCurPos(vmode) ;
Vrow = ppos->y ;
Vcol = ppos->x ;
if ( MouseEventInfo.row == VscrnGetHeight(vmode)
-(tt_status[vmode]?1:0) )
MouseEventInfo.row-- ;
if ( MouseEventInfo.fs & MOUSE_BN1_DOWN ) {
DosQueryEventSem( b1.sem, &postcount ) ;
if ( b1.state == 1 &&
!SelectionValid &&
!postcount &&
MouseEventInfo.row == b1.row &&
MouseEventInfo.col == b1.col ) {
/* Double Click */
debug( F100, "mouse B1 double click", "", 0 ) ;
b1.state = 2 ;
}
else {
/* Single Click */
b1.state = 1 ;
b1.row = MouseEventInfo.row ;
b1.col = MouseEventInfo.col ;
DosResetEventSem( b1.sem, &postcount ) ;
debug( F100, "mouse B1 single click", "", 0 ) ;
}
}
else if ( MouseEventInfo.fs & MOUSE_MOTION_WITH_BN1_DOWN ) {
debug( F100, "mouse B1 drag", "", 0 ) ;
if ( b1.state == 1 && !SelectionValid ) {
SelectionValid = 1 ;
RequestKeyStrokeMutex( vmode, SEM_INDEFINITE_WAIT);
putkverb( vmode, F_KVERB | K_MARK_START ) ;
mousecurpos( vmode, Vrow, Vcol, b1.row, b1.col, TRUE ) ;
putkverb( vmode, F_KVERB | K_MARK_START ) ;
ReleaseKeyStrokeMutex(vmode) ;
}
else if ( b1.state == 1 && SelectionValid &&
( lastrow != MouseEventInfo.row ||
lastcol != MouseEventInfo.col )
) {
mousecurpos( vmode, lastrow, lastcol, MouseEventInfo.row,
MouseEventInfo.col, TRUE ) ;
}
}
if ( MouseEventInfo.fs & MOUSE_BN2_DOWN ) {
DosQueryEventSem( b2.sem, &postcount ) ;
if ( b2.state == 1 &&
!SelectionValid &&
!postcount &&
MouseEventInfo.row == b2.row &&
MouseEventInfo.col == b2.col ) {
/* Double Click */
debug( F100, "mouse B2 double click", "", 0 ) ;
b2.state = 2 ;
}
else {
/* Single Click */
b2.state = 1 ;
b2.row = MouseEventInfo.row ;
b2.col = MouseEventInfo.col ;
DosResetEventSem( b2.sem, &postcount ) ;
debug( F100, "mouse B2 single click", "", 0 ) ;
}
}
else if ( MouseEventInfo.fs & MOUSE_MOTION_WITH_BN2_DOWN ) {
debug( F100, "mouse B2 drag", "", 0 ) ;
if ( b2.state == 1 && !SelectionValid ) {
SelectionValid = 1 ;
RequestKeyStrokeMutex( vmode, SEM_INDEFINITE_WAIT);
putkverb( vmode, F_KVERB | K_MARK_START ) ;
mousecurpos( vmode, Vrow, Vcol, b2.row, b2.col, TRUE ) ;
putkverb( vmode, F_KVERB | K_MARK_START ) ;
ReleaseKeyStrokeMutex(vmode) ;
}
else if ( b2.state == 1 && SelectionValid &&
( lastrow != MouseEventInfo.row ||
lastcol != MouseEventInfo.col )
) {
mousecurpos( vmode, lastrow, lastcol, MouseEventInfo.row,
MouseEventInfo.col, TRUE ) ;
}
}
if ( MouseEventInfo.fs & MOUSE_BN3_DOWN ) {
DosQueryEventSem( b3.sem, &postcount );
if ( b3.state == 1 &&
!SelectionValid &&
!postcount &&
MouseEventInfo.row == b3.row &&
MouseEventInfo.col == b3.col ) {
/* Double Click */
b3.state = 2 ;
debug( F100, "mouse B3 double click","",0) ;
}
else {
/* Single Click */
b3.state = 1 ;
b3.row = MouseEventInfo.row ;
b3.col = MouseEventInfo.col ;
DosResetEventSem( b3.sem, &postcount ) ;
debug( F100, "mouse B3 single click","",0) ;
}
}
else if ( MouseEventInfo.fs & MOUSE_MOTION_WITH_BN3_DOWN ) {
debug( F100, "mouse B3 drag","",0) ;
if ( b3.state == 1 && !SelectionValid ) {
SelectionValid = 1 ;
RequestKeyStrokeMutex( vmode, SEM_INDEFINITE_WAIT);
putkverb( vmode, F_KVERB | K_MARK_START ) ;
mousecurpos( vmode, Vrow, Vcol, b3.row, b3.col, TRUE ) ;
putkverb( vmode, F_KVERB | K_MARK_START ) ;
ReleaseKeyStrokeMutex(vmode) ;
}
else if ( b3.state == 1 && SelectionValid &&
( lastrow != MouseEventInfo.row ||
lastcol != MouseEventInfo.col )
) {
mousecurpos( vmode, lastrow, lastcol, MouseEventInfo.row,
MouseEventInfo.col, TRUE ) ;
}
}
if ( !(MouseEventInfo.fs &
( MOUSE_BN1_DOWN | MOUSE_MOTION_WITH_BN1_DOWN) ) ) {
/* button 1 may have been released */
if ( b1.state == 1 ) {
debug( F100, "mouse B1 single click released", "" , 0 );
if ( SelectionValid ) {
Event |= MMDRAG ;
/* Handle special Mouse Kverbs */
if ( mousemap[MMB1][Event].type == kverb ) {
switch (mousemap[MMB1][Event].kverb.id & ~(F_KVERB)) {
case K_MOUSE_CURPOS:
putkverb( vmode, F_KVERB | K_MARK_CANCEL ) ;
mousecurpos( vmode, Vrow, Vcol, MouseEventInfo.row,
MouseEventInfo.col, FALSE ) ;
break;
case K_MOUSE_URL:
putkverb( vmode, F_KVERB | K_MARK_CANCEL ) ;
mouseurl( vmode, MouseEventInfo.row,
MouseEventInfo.col );
break;
case K_MARK_COPYCLIP:
case K_MARK_COPYHOST:
case K_MARK_COPYCLIP_NOEOL:
case K_MARK_COPYHOST_NOEOL:
case K_DUMP:
putevent( vmode, mousemap[MMB1][Event] ) ;
break;
case K_MOUSE_MARK:
break;
default:
putkverb( vmode, F_KVERB | K_MARK_CANCEL ) ;
putevent( vmode, mousemap[MMB1][Event] ) ;
}
}
else /* if ( mousemap[MMB1][Event].type != error ) */ {
putkverb( vmode, F_KVERB | K_MARK_CANCEL ) ;
putevent( vmode, mousemap[MMB1][Event] ) ;
}
SelectionValid = 0 ;
b1.state = 0 ;
b1.row = 0 ;
b1.col = 0 ;
}
else {
DosResetEventSem( b1.sem, &postcount ) ;
DosAsyncTimer( dblclickspeed, (HSEM) b1.sem, &b1.timer ) ;
}
}
else if ( b1.state == 2 ) {
debug( F100, "mouse B1 double click released", "" , 0 );
Event |= MMDBL ;
/* Handle special Mouse Kverbs */
if ( mousemap[MMB1][Event].type == kverb ) {
switch (mousemap[MMB1][Event].kverb.id & ~(F_KVERB)) {
case K_MOUSE_MARK:
break;
case K_MOUSE_CURPOS:
mousecurpos( vmode, Vrow, Vcol, MouseEventInfo.row,
MouseEventInfo.col, FALSE ) ;
break;
case K_MOUSE_URL:
mouseurl( vmode, MouseEventInfo.row,
MouseEventInfo.col );
break;
default:
putevent( vmode, mousemap[MMB1][Event] ) ;
}
}
else /* if ( mousemap[MMB1][Event].type != error ) */ {
putevent( vmode, mousemap[MMB1][Event] ) ;
}
b1.state = 0 ;
b1.row = 0 ;
b1.col = 0 ;
}
}
if ( !(MouseEventInfo.fs &
( MOUSE_BN2_DOWN | MOUSE_MOTION_WITH_BN2_DOWN) ) ) {
/* button 2 may have been released */
if ( b2.state == 1 ) {
debug( F100, "mouse B2 single click released", "" , 0 );
if ( SelectionValid ) {
Event |= MMDRAG ;
/* Handle special Mouse Kverbs */
if ( mousemap[MMB2][Event].type == kverb ) {
switch (mousemap[MMB2][Event].kverb.id & ~(F_KVERB)) {
case K_MOUSE_MARK:
break;
case K_MOUSE_CURPOS:
putkverb( vmode,F_KVERB | K_MARK_CANCEL ) ;
mousecurpos( vmode, Vrow, Vcol, MouseEventInfo.row,
MouseEventInfo.col, FALSE ) ;
break;
case K_MOUSE_URL:
putkverb( vmode, F_KVERB | K_MARK_CANCEL ) ;
mouseurl( vmode, MouseEventInfo.row,
MouseEventInfo.col );
break;
case K_MARK_COPYCLIP:
case K_MARK_COPYHOST:
case K_MARK_COPYCLIP_NOEOL:
case K_MARK_COPYHOST_NOEOL:
case K_DUMP:
putevent( vmode, mousemap[MMB2][Event] ) ;
break;
default:
putkverb( vmode, F_KVERB | K_MARK_CANCEL ) ;
putevent( vmode, mousemap[MMB2][Event] ) ;
}
}
else /* if ( mousemap[MMB2][Event].type != error ) */ {
putkverb( vmode, F_KVERB | K_MARK_CANCEL ) ;
putevent( vmode, mousemap[MMB2][Event] ) ;
}
SelectionValid = 0 ;
b2.state = 0 ;
b2.row = 0 ;
b2.col = 0 ;
}
else {
DosResetEventSem( b2.sem, &postcount ) ;
DosAsyncTimer( dblclickspeed, (HSEM) b2.sem, &b2.timer ) ;
}
}
else if ( b2.state == 2 ) {
debug( F100, "mouse B2 double click released", "" , 0 );
Event |= MMDBL ;
/* Handle special Mouse Kverbs */
if ( mousemap[MMB2][Event].type == kverb) {
switch (mousemap[MMB2][Event].kverb.id & ~(F_KVERB)) {
case K_MOUSE_MARK:
break;
case K_MOUSE_CURPOS:
mousecurpos( vmode, Vrow, Vcol, MouseEventInfo.row,
MouseEventInfo.col, FALSE ) ;
break;
case K_MOUSE_URL:
mouseurl( vmode, MouseEventInfo.row,
MouseEventInfo.col );
break;
default:
putevent( vmode, mousemap[MMB2][Event] ) ;
}
}
else /* if ( mousemap[MMB2][Event].type != error ) */ {
putevent( vmode, mousemap[MMB2][Event] ) ;
}
b2.state = 0 ;
b2.row = 0 ;
b2.col = 0 ;
}
}
if ( !(MouseEventInfo.fs &
( MOUSE_BN3_DOWN | MOUSE_MOTION_WITH_BN3_DOWN) ) ) {
/* button 3 may have been released */
if ( b3.state == 1 ) {
debug( F100, "mouse B3 single click released", "" , 0 );
if ( SelectionValid ) {
Event |= MMDRAG ;
/* Handle special Mouse Kverbs */
if ( mousemap[MMB3][Event].type == kverb ) {
switch (mousemap[MMB3][Event].kverb.id & ~(F_KVERB)) {
case K_MOUSE_MARK:
break;
case K_MOUSE_CURPOS:
putkverb( vmode, F_KVERB | K_MARK_CANCEL ) ;
mousecurpos( vmode, Vrow, Vcol, MouseEventInfo.row,
MouseEventInfo.col, FALSE ) ;
break;
case K_MOUSE_URL:
putkverb( vmode, F_KVERB | K_MARK_CANCEL ) ;
mouseurl( vmode, MouseEventInfo.row,
MouseEventInfo.col );
break;
case K_MARK_COPYCLIP:
case K_MARK_COPYHOST:
case K_MARK_COPYCLIP_NOEOL:
case K_MARK_COPYHOST_NOEOL:
case K_DUMP:
putevent( vmode, mousemap[MMB3][Event] ) ;
break;
default:
putkverb( vmode, F_KVERB | K_MARK_CANCEL ) ;
putevent( vmode, mousemap[MMB3][Event] ) ;
}
}
else /* if ( mousemap[MMB3][Event].type != error ) */ {
putkverb( vmode, F_KVERB | K_MARK_CANCEL ) ;
putevent( vmode, mousemap[MMB3][Event] ) ;
}
SelectionValid = 0 ;
b3.state = 0 ;
b3.row = 0 ;
b3.col = 0 ;
}
else {
DosResetEventSem( b3.sem, &postcount ) ;
DosAsyncTimer( dblclickspeed, (HSEM) b3.sem, &b3.timer ) ;
}
}
else if ( b3.state == 2 ) {
debug( F100, "mouse B3 double click released", "" , 0 );
Event |= MMDBL ;
/* Handle special Mouse Kverbs */
if ( mousemap[MMB3][Event].type == kverb ) {
switch (mousemap[MMB3][Event].kverb.id & ~(F_KVERB)) {
case K_MOUSE_MARK:
break;
case K_MOUSE_CURPOS:
mousecurpos( vmode, Vrow, Vcol, MouseEventInfo.row,
MouseEventInfo.col, FALSE ) ;
break;
case K_MOUSE_URL:
mouseurl( vmode, MouseEventInfo.row,
MouseEventInfo.col );
break;
default:
putevent( vmode, mousemap[MMB3][Event] ) ;
}
}
else /* if ( mousemap[MMB3][Event].type != error ) */ {
putevent( vmode, mousemap[MMB3][Event] ) ;
}
b3.state = 0 ;
b3.row = 0 ;
b3.col = 0 ;
}
}
lastrow = MouseEventInfo.row ;
lastcol = MouseEventInfo.col ;
}
else /* No Mouse Event */ {
char buffer[1024] ;
if ( SelectionValid ) {
ppos = VscrnGetCurPos(vmode) ;
Vrow = ppos->y ;
Vcol = ppos->x ;
if ( lastrow == 0 &&
VscrnGetBegin(vmode) != VscrnGetScrollTop(vmode)+Vrow ) {
putkverb( vmode, F_KVERB | K_UPONE ) ;
}
else if ( lastrow == VscrnGetHeight(vmode) -(tt_status[vmode]?2:1) &&
VscrnGetEnd(vmode) != VscrnGetScrollTop(vmode)+Vrow
) {
putkverb( vmode, F_KVERB | K_DNONE ) ;
}
sprintf(buffer, "AutoScroll: fs:%3x time:%10d row:%3d col:%3d",
MouseEventInfo.fs, MouseEventInfo.time,
MouseEventInfo.row, MouseEventInfo.col) ;
debug(F110,"os2_mouseevt",buffer,0) ;
}
else if ( b1.state == 1 &&
b1.timer &&
!DosQueryEventSem( b1.sem, &postcount ) &&
postcount ) {
debug( F100, "mouse B1 timeout, must be a click", "", 0 ) ;
Event |= MMCLICK ;
/* Handle special Mouse Kverbs */
if ( mousemap[MMB1][Event].type == kverb ) {
switch (mousemap[MMB1][Event].kverb.id & ~(F_KVERB)) {
case K_MOUSE_MARK:
break;
case K_MOUSE_CURPOS:
mousecurpos( vmode, Vrow, Vcol, lastrow, lastcol, FALSE ) ;
break;
case K_MOUSE_URL:
mouseurl( vmode, lastrow,
lastcol );
break;
default:
putevent( vmode, mousemap[MMB1][Event] ) ;
}
}
else /* if ( mousemap[MMB1][Event].type != error ) */ {
putevent( vmode, mousemap[MMB1][Event] ) ;
}
b1.state = 0 ;
b1.row = 0 ;
b1.col = 0 ;
DosStopTimer( b1.timer ) ;
b1.timer = 0 ;
}
else if ( b2.state == 1 &&
b2.timer &&
!DosQueryEventSem( b2.sem, &postcount ) &&
postcount ) {
debug( F100, "mouse B2 timeout, must be a click", "", 0 ) ;
Event |= MMCLICK ;
/* Handle special Mouse Kverbs */
if ( mousemap[MMB2][Event].type == kverb ) {
switch (mousemap[MMB2][Event].kverb.id & ~(F_KVERB)) {
case K_MOUSE_MARK:
break;
case K_MOUSE_CURPOS:
mousecurpos( vmode, Vrow, Vcol, lastrow, lastcol, FALSE ) ;
break;
case K_MOUSE_URL:
mouseurl( vmode, lastrow,
lastcol );
break;
default:
putevent( vmode, mousemap[MMB2][Event] ) ;
}
}
else /* if ( mousemap[MMB2][Event].type != error ) */ {
putevent( vmode, mousemap[MMB2][Event] ) ;
}
b2.state = 0 ;
b2.row = 0 ;
b2.col = 0 ;
DosStopTimer( b2.timer ) ;
b2.timer = 0 ;
}
else if ( b3.state == 1 &&
b3.timer &&
!DosQueryEventSem( b3.sem, &postcount ) &&
postcount ) {
debug( F100, "mouse B3 timeout, must be a click", "", 0 ) ;
Event |= MMCLICK ;
/* Handle special Mouse Kverbs */
if ( mousemap[MMB3][Event].type == kverb ) {
switch (mousemap[MMB3][Event].kverb.id & ~(F_KVERB)) {
case K_MOUSE_MARK:
break;
case K_MOUSE_CURPOS:
mousecurpos( vmode, Vrow, Vcol, lastrow, lastcol, FALSE ) ;
break;
case K_MOUSE_URL:
mouseurl( vmode, lastrow,
lastcol );
break;
default:
putevent( vmode, mousemap[MMB3][Event] ) ;
}
}
else /* if ( mousemap[MMB3][Event].type != error ) */ {
putevent( vmode, mousemap[MMB3][Event] ) ;
}
b3.state = 0 ;
b3.row = 0 ;
b3.col = 0 ;
DosStopTimer( b3.timer ) ;
b3.timer = 0 ;
}
#ifdef COMMENT
else {
sprintf(buffer, "NoEvent: fs:%3x time:%10d row:%3d col:%3d",
MouseEventInfo.fs, MouseEventInfo.time,
MouseEventInfo.row, MouseEventInfo.col) ;
debug(F110,"os2_mouseevt",buffer,0) ;
}
#endif /* COMMENT */
}
msleep(1) ;
}
DosCloseEventSem( b1.sem ) ;
DosCloseEventSem( b2.sem ) ;
DosCloseEventSem( b3.sem ) ;
ckThreadEnd(pArgList);
}
#endif /* NT */
APIRET
os2_mouseoff( void ) {
APIRET rc = 0 ;
#ifdef NT
extern HANDLE KbdHandle ;
DWORD mode ;
mouseon = FALSE ;
GetConsoleMode( KbdHandle, &mode ) ;
mode &= ~ENABLE_MOUSE_INPUT ;
rc = SetConsoleMode( KbdHandle, mode ) ;
debug(F101,"Mouse Off","",rc) ;
#else /* NT */
if ( hMouse ) {
rc = MouClose( hMouse ) ;
debug(F101,"Mouse Off","",rc) ;
hMouse = 0 ;
DosWaitThread( &tidMouse, DCWW_WAIT ) ;
debug(F100,"os2_mouevt() thread dead","",0) ;
tidMouse = 0 ;
}
#endif /* NT */
return rc ;
}
#endif /* OS2MOUSE */