Category : C Source Code
Archive   : WTWG12B.ZIP
Filename : WMOUSE.C

 
Output of file : WMOUSE.C contained in archive : WTWG12B.ZIP
/* wmouse.c
*
* simplified mouse interface.
* wmouse_init - detects mouse.
* wmouse_turn - turn mouse ON or OFF. set cursor & scaling.
* call at start of wgets()
* and again at exit from wgets()
*
* wmouse_location- get mouse position & see if buttons hit
* ( in text mode, sets character locations)
* ( in graphics mode, sets pixel & char loc)
*
* Assumes that any press of RIGHT button will be translated to ESCAPE
* Therefore, mouse activity is only reported when:
* LEFT- button depress, any mvt with button down, button release
* CENTER- ditto.
* RIGHT- only reports when button is first pressed.
*
*
*/
#include "wsys.h"







static void calc_coords (void);




static unsigned int prev_buttons =0;





/* wmouse_init
* sets wmouse.wms_present
*
* in text mode sets a software mouse cursor.
*/
void wmouse_init (void)
{
int hold, nb;





PSEUDOREGS

_AX = 0;
INTERRUPT (0x33);
nb = _BX;
hold = _AX;


if ( hold )
{
/* a mouse is present */
wmouse.wms_present = nb;
}


if ( wmouse.wms_present && (wmode == 'T') )
{
/* setup software cursor = inverting = 0xffff, 0x7f00
* char = 0x0000, 0x07cc
*/
if ( wmonitor == 'H' )
{
/* setup an underlining (=BLUE) cursor for HERCULES
* preserve any bright attributes underlying.
*/
wmouse_textmask ( 0x08ff, 0x0100 );
}
else
{
/* setup a reversing cursor for COLOR monitors
*/
wmouse_textmask ( 0xffff, 0x7f00 );
}

}

/* reset current button state (if changing mode )
*/
prev_buttons = 0;


return; /* wmouse_init */

}



/* mouse text_mode cursor
* sets up a text mode cursor.
* PARAMETERS:
* screen mask is AND'd with char/attr under mouse.
* cursor mask is XOR'd with char/attr.
*
* RETURNS: void.
*/
void wmouse_textmask ( unsigned int screen_mask, unsigned int cursor_mask )
{
PSEUDOREGS


_DX = cursor_mask;
_CX = screen_mask;
_BX = 0; /* 0=software cursor, 1=hardware curosr */
_AX = 0x0A; /* text mode cursor */
INTERRUPT ( 0x33 );
return; /* wmouse_textmask */
}




/* wmouse_turn ()
* turns mouse ON or OFF
* NOTE: must keep calls to this function in order
* (alternate ON with OFF, must start with ON)
* mouse driver actually keeps count of calls,
* if you call repetitively, mouse will turn OFF
* even if you call as ON.
*
* When you turn the mouse ON, this routine sets mouse scaling values.
*/
void wmouse_turn ( int state )
{
int hold;

PSEUDOREGS


if ( wmouse.wms_present )
{

if ( state != OFF )
{
hold = 1; /* 1=turn on 2 = turn off */


}
else
{
hold = 2; /* turn mouse off */
}

_AX = hold;
INTERRUPT (0x33);

}


return; /* wmouse_turn */

}






/* wmouse_location ()
*
* get the curretn location of the mouse,
* and number of times the left and right buttons were pressed.
* NOTE: this routine counts key presses on the left
* and key releases on the right.
* this allows the user to be tentative with the left key
* but forces the user to be definitive with the right one.
* RETURNS:
* MOUSE if mouse moved, ENTER for left button, ESCAPE for right
*
*/
void wmouse_location (void)
{

int xtemp,
ytemp;

unsigned int new_buttons,
released,
pressed;

PSEUDOREGS



if ( ! wmouse.wms_present )
{
return;
}




/* Check mouse status -
* this function returns mouse location and current button state.
* _BX returns buttons down = bit =1, L=0x01, R=0x02 C=0x04
*/

_AX =3;
INTERRUPT ( 0x33 );
new_buttons = _BX;
xtemp = _CX;
ytemp = _DX;

/*
* NOTE mouse driver only guarantees meaning to the low-order bits.
* so black out bits we're not inerested in.
*
* 0x01 =left, 0x02 =right, 0x04 =center.
*/
new_buttons &= 0x07;



/* check for button releases (comparing against prev. button state)
*
* a bit will be TRUE if button was down (bit ON) and now is up.
* also check for new presses of the left button.
*/
released = ( (~new_buttons) & ( prev_buttons) );
pressed = ( ( new_buttons) & (~prev_buttons) );



/* setup new button state in prev_buttons,
* for next call
*/
prev_buttons = new_buttons;



/* check button release flags
* button bits: 0x01 = L, 0x02= R, 0x04= C
*/
if ( released & 0x01 )
{
/* left button was just released
*/
wmouse.wms_internal |= (WMS_LEFT_RLS + WMS_MOVED);
}
if ( released & 0x04 )
{
wmouse.wms_internal |= WMS_CENTER_RLS;
}
if ( pressed & 0x01 )
{
wmouse.wms_internal |= (WMS_LEFT_PRS + WMS_MOVED);
}
if ( pressed & 0x02 )
{
wmouse.wms_internal |= WMS_RIGHT_PRS;
}
if ( pressed & 0x04 )
{
wmouse.wms_internal |= WMS_CENTER_PRS;
}
if ( released & 0x02 )
{
wmouse.wms_internal |= WMS_RIGHT_RLS;
}

/* see if mouse moved with left or center buttons held down.
*/
if ( ( new_buttons & 0x01 ) /* LEFT=0x01 or CENTER=0x04 */
&&( ( wmouse.wms_xmickey != xtemp ) || ( wmouse.wms_ymickey != ytemp ) )
)
{
wmouse.wms_internal |= WMS_MOVED;
}

/* check location if L button newly pressed
* or mouse mvt with L button held down.
*/
if ( wmouse.wms_internal )
{
wmouse.wms_xmickey = xtemp;
wmouse.wms_ymickey = ytemp;
calc_coords ();
}

wmouse.wms_used = wmouse.wms_internal;

return; /* wmouse_location */

}






/* calc_coords () - convert location from 'mickeys' to screen co-ords
* mickeys go from 0-639 and 1-199
* screen coords are measured both in text units (chars)
* and graphics units (pixels)
*/


static void calc_coords (void)
{
/* get absolute position on screen, ignoring windows
*/
if ( wmode == 'T' )
{
wmouse.wms_xabs = wmouse.wms_xmickey/8;
wmouse.wms_yabs = wmouse.wms_ymickey/8;
}
#ifndef TEXTONLY
else
{
/* GRAPHICS MODE get pixel co-ords of mouse */
wmouse.wms_pxabs = wmouse.wms_xmickey;
wmouse.wms_pyabs = wmouse.wms_ymickey;

wmouse.wms_xabs = wmouse.wms_pxabs / wpxchar;
wmouse.wms_yabs = wmouse.wms_pyabs / wpychar;



}
#endif /* !TEXTONLY */




/* calculate mouse position relative to window
*/
#ifndef TEXTONLY
if ( wmode == 'G' )
{
/* calculate pixel co-ords within window */
wmouse.wms_px = wmouse.wms_pxabs -
( w0->winleft* wpxchar );
wmouse.wms_py = wmouse.wms_pyabs -
( w0->wintop * wpychar );
}
#endif /* ! TEXTONLY */

/* text mode -co-ords */
wmouse.wms_x = wmouse.wms_xabs - ( w0->winleft );
wmouse.wms_y = wmouse.wms_yabs - ( w0->wintop );

if (
( /* x-cord inside window */
wmouse.wms_xabs >= w0-> winleft
&& wmouse.wms_xabs <= (w0->winleft + w0->winxmax)
)
&&
( /* y co-ord inside window */
wmouse.wms_yabs >= w0-> wintop
&& wmouse.wms_yabs <= (w0->wintop + w0->winymax)
)
)
{
/* mouse is inside window */
wmouse.wms_inwindow = 1;

}
else {
wmouse.wms_inwindow = 0;
}


return; /* calc_coords() */
}







/*------------------------ end of WMOUSE.C -------------------------*/


  3 Responses to “Category : C Source Code
Archive   : WTWG12B.ZIP
Filename : WMOUSE.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/