/* * $Id$ */ /* Harbour Project source code Harbour mouse subsystem for OS/2 compilers. Copyright 1999 by Chen Kedem www - http://www.harbour-project.org This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version, with one exception: The exception is that if you link the Harbour Runtime Library (HRL) and/or the Harbour Virtual Machine (HVM) with other files to produce an executable, this does not by itself cause the resulting executable to be covered by the GNU General Public License. Your use of that executable is in no way restricted on account of linking the HRL and/or HVM code into it. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA (or visit their web site at http://www.gnu.org/). V 1.3 Chen Kedem hb_mouse_Hide() now work in any text screen mode by calling VioGetMode. hb_mouse_IsButtonPressed() now return TRUE if any button was pressed. V 1.0 Chen Kedem Initial version. */ #define INCL_MOU #define INCL_VIO /* needed only for VioGetMode/VIOMODEINFO */ #define INCL_NOPMAPI /* exclude Presentation Manager Include File */ #include #include "mouseapi.h" static unsigned s_uMouHandle; /* mouse logical handle */ void hb_mouse_Init() { USHORT fsEvents = MOUSE_MOTION_WITH_BN1_DOWN | MOUSE_BN1_DOWN | MOUSE_MOTION_WITH_BN2_DOWN | MOUSE_BN2_DOWN | MOUSE_MOTION_WITH_BN3_DOWN | MOUSE_BN3_DOWN ; if ( MouOpen ( 0L, &s_uMouHandle ) ) /* try to open mouse */ s_uMouHandle = 0; /* no mouse found */ else MouSetEventMask ( &fsEvents, s_uMouHandle ); /* mask some events */ } void hb_mouse_Exit(void) { if ( s_uMouHandle ) { MouClose ( s_uMouHandle ); /* relese mouse handle */ s_uMouHandle = 0; } } BOOL hb_mouse_IsPresent(void) { return ( s_uMouHandle != 0 ); } void hb_mouse_Show(void) { if ( s_uMouHandle ) MouDrawPtr ( s_uMouHandle ); } void hb_mouse_Hide(void) { /* NOTE: mouse cursor always visible if not in full screen */ NOPTRRECT rect; VIOMODEINFO vi; /* needed to get max Row/Col */ if ( s_uMouHandle ) { /* QUESTION: should I call the GT MaxRow/Col function ? pro: encapsulating of the GetScreen function con: calling function from another module, GT must be linked in con: VioGetMode is been called twice */ vi.cb = sizeof(VIOMODEINFO); VioGetMode(&vi, 0); rect.row = 0; /* x-coordinate upper left */ rect.col = 0; /* y-coordinate upper left */ rect.cRow = vi.row - 1; /* x-coordinate lower right */ rect.cCol = vi.col - 1; /* y-coordinate lower right */ MouRemovePtr ( &rect, s_uMouHandle ); } } /* QUESTION: when getting mouse coordinate you normally need both row and column, we should think about using just one function hb_mouse_GetPos( &row, &col ) or something like that */ int hb_mouse_Col(void) { PTRLOC pos; if ( s_uMouHandle ) { MouGetPtrPos ( &pos, s_uMouHandle ); } return ( (int)pos.col ); } int hb_mouse_Row(void) { PTRLOC pos; if ( s_uMouHandle ) { MouGetPtrPos ( &pos, s_uMouHandle ); } return ( (int)pos.row ); } void hb_mouse_SetPos( int row, int col ) { PTRLOC pos; if ( s_uMouHandle ) { pos.row = (USHORT)row; pos.col = (USHORT)col; MouSetPtrPos ( &pos, s_uMouHandle ); } } BOOL hb_mouse_IsButtonPressed( int iButton ) { /* TOFIX: every time I read event from the queue I lose the result so I can not check if iButton was pressed, so for now I ignore iButton and return TRUE if the last event saved had DOWN in it. also to keep the noise level down I mask out MOUSE_MOTION events. */ USHORT uMask = 0x0000; USHORT WaitOption = 0; /* 1 = wait until mouse event exist, 0 = don't */ MOUEVENTINFO MouEvent; if ( s_uMouHandle ) { MouReadEventQue ( &MouEvent, &WaitOption, s_uMouHandle ); uMask = MouEvent.fs; #ifdef PLEASE_PLEASE_MAKE_IT_WORK switch(iButton) { case 1: uMask &= ( MOUSE_MOTION_WITH_BN1_DOWN | MOUSE_BN1_DOWN ); break; case 2: uMask &= ( MOUSE_MOTION_WITH_BN2_DOWN | MOUSE_BN2_DOWN ); break; case 3: uMask &= ( MOUSE_MOTION_WITH_BN3_DOWN | MOUSE_BN3_DOWN ); break; } #else uMask &= ( MOUSE_MOTION_WITH_BN1_DOWN | MOUSE_BN1_DOWN | MOUSE_MOTION_WITH_BN2_DOWN | MOUSE_BN2_DOWN | MOUSE_MOTION_WITH_BN3_DOWN | MOUSE_BN3_DOWN ) ; #endif } return ( uMask != 0 ); } int hb_mouse_CountButton(void) { USHORT usButtons = 0; if ( s_uMouHandle ) { MouGetNumButtons ( &usButtons, s_uMouHandle ); } return ( (int)usButtons ); } void hb_mouse_SetBounds( int iTop, int iLeft, int iBottom, int iRight ) { /* TODO: (I don't think that the OS/2 got a function to do it) */ } void hb_mouse_GetBounds( int * piTop, int * piLeft, int * piBottom, int * piRight ) { /* TODO: (I don't think that the OS/2 got a function to do it) */ }