00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "OSDLMouse.h"
00028
00029 #include "OSDLController.h"
00030 #include "OSDLMouseCommon.h"
00031
00032 #include "OSDLPoint2D.h"
00033
00034
00035
00036 using std::string ;
00037
00038
00039 using namespace Ceylan::Log ;
00040
00041 using namespace OSDL ;
00042 using namespace OSDL::Events ;
00043 using namespace OSDL::MVC ;
00044 using namespace OSDL::Video ;
00045 using namespace OSDL::Video::TwoDimensional ;
00046
00047
00048
00049 #ifdef OSDL_USES_CONFIG_H
00050 #include <OSDLConfig.h>
00051 #endif // OSDL_USES_CONFIG_H
00052
00053 #if OSDL_ARCH_NINTENDO_DS
00054 #include "OSDLConfigForNintendoDS.h"
00055 #endif // OSDL_ARCH_NINTENDO_DS
00056
00057
00058
00059 #if OSDL_USES_SDL
00060
00061 #include "SDL.h"
00062
00063 #endif // OSDL_USES_SDL
00064
00065
00066
00067 #if OSDL_VERBOSE_MOUSE
00068
00069 #include <iostream>
00070 #define OSDL_MOUSE_LOG( message ) std::cout << "[OSDL Mouse] " << message << std::endl ;
00071
00072 #else // OSDL_VERBOSE_MOUSE
00073
00074 #define OSDL_MOUSE_LOG( message )
00075
00076 #endif // OSDL_VERBOSE_MOUSE
00077
00078
00079
00080
00081 const MouseButtonNumber Mouse::DefaultButtonTotalNumber = 5 ;
00082
00083
00084 const MouseButtonNumber Mouse::DefaultButtonActualNumber = 3 ;
00085
00086
00087 const MouseWheelNumber Mouse::DefaultWheelNumber = 1 ;
00088
00089
00090
00091
00092 Mouse::Mouse( MouseNumber index, bool classicalMouseMode ) :
00093 OSDL::Events::InputDevice(),
00094 _index( index ),
00095 _inClassicalMode( classicalMouseMode ),
00096 _buttonTotalCount( DefaultButtonTotalNumber ),
00097 _lastRelativeAbscissa( 0 ),
00098 _lastRelativeOrdinate( 0 )
00099 {
00100
00101 #if ! OSDL_USES_SDL
00102
00103 throw MouseException( "Mouse constructor failed:"
00104 "no SDL support available" ) ;
00105
00106 #endif // OSDL_USES_SDL
00107
00108 }
00109
00110
00111
00112 Mouse::~Mouse() throw()
00113 {
00114
00115 }
00116
00117
00118
00119
00120
00121
00122
00123
00124 Video::Coordinate Mouse::getCursorAbscissa() const
00125 {
00126
00127 #if OSDL_USES_SDL
00128
00129 int x ;
00130
00131 SDL_GetMouseState( &x, 0 ) ;
00132
00133 return static_cast<Video::Coordinate>( x ) ;
00134
00135 #else // OSDL_USES_SDL
00136
00137 return 0 ;
00138
00139 #endif // OSDL_USES_SDL
00140
00141 }
00142
00143
00144
00145 Video::Coordinate Mouse::getCursorOrdinate() const
00146 {
00147
00148 #if OSDL_USES_SDL
00149
00150 int y ;
00151
00152 SDL_GetMouseState( 0, &y ) ;
00153
00154 return static_cast<Video::Coordinate>( y ) ;
00155
00156 #else // OSDL_USES_SDL
00157
00158 return 0 ;
00159
00160 #endif // OSDL_USES_SDL
00161
00162 }
00163
00164
00165
00166
00167 void Mouse::setCursorPosition( const Point2D & newPosition ) const
00168 {
00169
00170 setCursorPosition( newPosition.getX(), newPosition.getY() ) ;
00171
00172 }
00173
00174
00175
00176 void Mouse::setCursorPosition( Coordinate x, Coordinate y ) const
00177 {
00178
00179 #if OSDL_USES_SDL
00180
00181 SDL_WarpMouse( static_cast<Ceylan::Uint16>( x ),
00182 static_cast<Ceylan::Uint16>( y ) ) ;
00183
00184 #endif // OSDL_USES_SDL
00185
00186 }
00187
00188
00189
00190 bool Mouse::getCursorVisibility() const
00191 {
00192
00193 #if OSDL_USES_SDL
00194
00195 return ( SDL_ShowCursor( SDL_QUERY ) == SDL_ENABLE ) ;
00196
00197 #endif // OSDL_USES_SDL
00198
00199 }
00200
00201
00202
00203 void Mouse::setCursorVisibility( bool on )
00204 {
00205
00206 #if OSDL_USES_SDL
00207
00208 if ( on )
00209 SDL_ShowCursor( SDL_ENABLE ) ;
00210 else
00211 SDL_ShowCursor( SDL_DISABLE ) ;
00212
00213 #endif // OSDL_USES_SDL
00214
00215 }
00216
00217
00218
00219 MouseButtonNumber Mouse::getNumberOfButtons() const
00220 {
00221
00222 return DefaultButtonActualNumber ;
00223
00224 }
00225
00226
00227
00228 MouseWheelNumber Mouse::getNumberOfWheels() const
00229 {
00230
00231 return DefaultWheelNumber ;
00232
00233 }
00234
00235
00236
00237
00238 bool Mouse::isLeftButtonPressed() const
00239 {
00240
00241 #if OSDL_USES_SDL
00242
00243 MouseButtonMask buttons = SDL_GetMouseState( 0, 0 ) ;
00244
00245 return static_cast<bool>( buttons & SDL_BUTTON( 1 ) ) ;
00246
00247 #else // OSDL_USES_SDL
00248
00249 return false ;
00250
00251 #endif // OSDL_USES_SDL
00252
00253 }
00254
00255
00256
00257 bool Mouse::isMiddleButtonPressed() const
00258 {
00259
00260 #if OSDL_USES_SDL
00261
00262 MouseButtonMask buttons = SDL_GetMouseState( 0, 0 ) ;
00263
00264 return ( ( buttons & SDL_BUTTON( 2 ) ) != 0 ) ;
00265
00266 #else // OSDL_USES_SDL
00267
00268 return false ;
00269
00270 #endif // OSDL_USES_SDL
00271
00272 }
00273
00274
00275
00276 bool Mouse::isRightButtonPressed() const
00277 {
00278
00279 #if OSDL_USES_SDL
00280
00281 MouseButtonMask buttons = SDL_GetMouseState( 0, 0 ) ;
00282
00283 return ( ( buttons & SDL_BUTTON( 3 ) ) != 0 ) ;
00284
00285 #else // OSDL_USES_SDL
00286
00287 return false ;
00288
00289 #endif // OSDL_USES_SDL
00290
00291 }
00292
00293
00294
00295 bool Mouse::isButtonPressed( MouseButtonNumber buttonNumber ) const
00296 {
00297
00298 #if OSDL_USES_SDL
00299
00300 MouseButtonMask buttons = SDL_GetMouseState( 0, 0 ) ;
00301
00302 return ( ( buttons & SDL_BUTTON( buttonNumber ) ) != 0 ) ;
00303
00304 #else // OSDL_USES_SDL
00305
00306 return false ;
00307
00308 #endif // OSDL_USES_SDL
00309
00310 }
00311
00312
00313
00314 MouseButtonMask Mouse::getButtonStates() const
00315 {
00316
00317 #if OSDL_USES_SDL
00318
00319 return static_cast<MouseButtonMask>(
00320 SDL_GetMouseState( 0, 0 ) ) ;
00321
00322 #else // OSDL_USES_SDL
00323
00324 return 0 ;
00325
00326 #endif // OSDL_USES_SDL
00327
00328 }
00329
00330
00331
00332 void Mouse::update()
00333 {
00334
00335 #if OSDL_USES_SDL
00336
00337 int abscissa, ordinate ;
00338
00339
00340 SDL_GetRelativeMouseState( &abscissa, &ordinate ) ;
00341
00342 _lastRelativeAbscissa = static_cast<Video::Coordinate>( abscissa ) ;
00343 _lastRelativeOrdinate = static_cast<Video::Coordinate>( ordinate ) ;
00344
00345 #endif // OSDL_USES_SDL
00346
00347 }
00348
00349
00350
00351 const string Mouse::toString( Ceylan::VerbosityLevels level ) const
00352 {
00353
00354 string res = "Mouse " ;
00355
00356 if ( ! _inClassicalMode )
00357 res += "not in classical mode" ;
00358 else
00359 res += "in classical mode" ;
00360
00361 res += ", with a total of "
00362 + Ceylan::toNumericalString( _buttonTotalCount )
00363 + " buttons (to each wheel correspond two buttons)" ;
00364
00365
00366 return res ;
00367
00368 }
00369
00370
00371
00372 bool Mouse::IsPressed( MouseButtonMask mask, MouseButtonNumber buttonToInspect )
00373 {
00374
00375 #if OSDL_USES_SDL
00376
00377 return static_cast<bool>( mask && SDL_BUTTON( buttonToInspect ) ) ;
00378
00379 #else // OSDL_USES_SDL
00380
00381 return false ;
00382
00383 #endif // OSDL_USES_SDL
00384
00385 }
00386
00387
00388
00389
00390
00391
00392
00393
00394 void Mouse::focusGained( const FocusEvent & mouseFocusEvent )
00395 {
00396
00397 if ( isLinkedToController() )
00398 getActualController().mouseFocusGained( mouseFocusEvent ) ;
00399 else
00400 {
00401 OSDL_MOUSE_LOG( "Focus gained for mouse #"
00402 + Ceylan::toNumericalString( DefaultMouse ) + ": "
00403 + EventsModule::DescribeEvent( mouseFocusEvent ) ) ;
00404 }
00405
00406 }
00407
00408
00409
00410 void Mouse::focusLost( const FocusEvent & mouseFocusEvent )
00411 {
00412
00413 if ( isLinkedToController() )
00414 getActualController().mouseFocusLost( mouseFocusEvent ) ;
00415 else
00416 {
00417 OSDL_MOUSE_LOG( "Focus lost for mouse #"
00418 + Ceylan::toNumericalString( DefaultMouse ) + ": "
00419 + EventsModule::DescribeEvent( mouseFocusEvent ) ) ;
00420 }
00421
00422 }
00423
00424
00425
00426 void Mouse::mouseMoved( const MouseMotionEvent & mouseEvent )
00427 {
00428
00429 if ( isLinkedToController() )
00430 getActualController().mouseMoved( mouseEvent ) ;
00431 else
00432 {
00433 OSDL_MOUSE_LOG( "Motion for mouse #"
00434 + Ceylan::toNumericalString( DefaultMouse ) + ": "
00435 + EventsModule::DescribeEvent( mouseEvent ) ) ;
00436 }
00437
00438 }
00439
00440
00441
00442 void Mouse::buttonPressed( const MouseButtonEvent & mouseEvent )
00443 {
00444
00445 if ( isLinkedToController() )
00446 getActualController().mouseButtonPressed( mouseEvent ) ;
00447 else
00448 {
00449 OSDL_MOUSE_LOG( "Mouse button #"
00450 + Ceylan::toNumericalString( mouseEvent.button ) + " pressed: "
00451 + EventsModule::DescribeEvent( mouseEvent ) ) ;
00452 }
00453
00454 }
00455
00456
00457
00458 void Mouse::buttonReleased( const MouseButtonEvent & mouseEvent )
00459 {
00460
00461 if ( isLinkedToController() )
00462 getActualController().mouseButtonReleased( mouseEvent ) ;
00463 else
00464 {
00465 OSDL_MOUSE_LOG( "Mouse button #"
00466 + Ceylan::toNumericalString( mouseEvent.button ) + " released: "
00467 + EventsModule::DescribeEvent( mouseEvent ) ) ;
00468 }
00469
00470 }
00471
00472
00473
00474 MouseNumber Mouse::getIndex() const
00475 {
00476
00477 return _index ;
00478
00479 }
00480