Mercurial > sdl-ios-xcode
comparison src/video/quartz/SDL_QuartzEvents.m @ 779:68c8da837fc0
Date: Tue, 6 Jan 2004 21:54:02 +0100
From: Max Horn
Subject: Auto hide mouse & other changes
the attached bug adds the auto-hide-mouse feature I talked about
earlier. Turned out it was a lot simpler than I thought, simply by
using our existing code :-). I actually spent much more time on fixing
various bugs in the code and correcting (IMO) some behavior (although,
due to the lack of real specs for SDL, it's probably arguable what
'correct' means...).
* adds auto (un)hiding of mouse depending on whether it is in- or
outside the game window
* computation of course coordinates is correct now (it often and
reproducible got out of sync with the old code, since the NSEvent
window was in some cases *not* our window anymore, so locationInWindow
returned wrong results)
* added a method which at any time returns the mouse coords, relative
to our window
* fixed handling of lost/gain input/mouse/app focus "events"
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Wed, 07 Jan 2004 15:01:51 +0000 |
parents | c5b2b6d2d1fe |
children | dbc5905402b0 |
comparison
equal
deleted
inserted
replaced
778:8ac3f46f9d09 | 779:68c8da837fc0 |
---|---|
314 | 314 |
315 /* Restore cursor location if input was grabbed */ | 315 /* Restore cursor location if input was grabbed */ |
316 QZ_PrivateWarpCursor (this, cursor_loc.x, cursor_loc.y); | 316 QZ_PrivateWarpCursor (this, cursor_loc.x, cursor_loc.y); |
317 QZ_ChangeGrabState (this, QZ_ENABLE_GRAB); | 317 QZ_ChangeGrabState (this, QZ_ENABLE_GRAB); |
318 } | 318 } |
319 | |
320 SDL_PrivateAppActive (1, SDL_APPINPUTFOCUS); | |
321 } | 319 } |
322 | 320 |
323 static void QZ_DoDeactivate (_THIS) { | 321 static void QZ_DoDeactivate (_THIS) { |
324 | 322 |
325 /* Get the current cursor location, for restore on activate */ | 323 /* Get the current cursor location, for restore on activate */ |
332 CGAssociateMouseAndMouseCursorPosition (1); | 330 CGAssociateMouseAndMouseCursorPosition (1); |
333 | 331 |
334 /* Show the cursor if it was hidden by SDL_ShowCursor() */ | 332 /* Show the cursor if it was hidden by SDL_ShowCursor() */ |
335 if (!cursor_should_be_visible) | 333 if (!cursor_should_be_visible) |
336 QZ_ShowMouse (this); | 334 QZ_ShowMouse (this); |
337 | |
338 SDL_PrivateAppActive (0, SDL_APPINPUTFOCUS); | |
339 } | 335 } |
340 | 336 |
341 void QZ_SleepNotificationHandler (void * refcon, | 337 void QZ_SleepNotificationHandler (void * refcon, |
342 io_service_t service, | 338 io_service_t service, |
343 natural_t messageType, | 339 natural_t messageType, |
460 [ NSApp sendEvent:event ]; \ | 456 [ NSApp sendEvent:event ]; \ |
461 } while(0) | 457 } while(0) |
462 | 458 |
463 type = [ event type ]; | 459 type = [ event type ]; |
464 isForGameWin = (qz_window == [ event window ]); | 460 isForGameWin = (qz_window == [ event window ]); |
465 isInGameWin = (mode_flags & SDL_FULLSCREEN) ? true : NSPointInRect([event locationInWindow], [ window_view frame ]); | 461 isInGameWin = QZ_IsMouseInWindow (this); |
466 switch (type) { | 462 switch (type) { |
467 case NSLeftMouseDown: | 463 case NSLeftMouseDown: |
468 if ( getenv("SDL_HAS3BUTTONMOUSE") ) { | 464 if ( getenv("SDL_HAS3BUTTONMOUSE") ) { |
469 DO_MOUSE_DOWN (SDL_BUTTON_LEFT); | 465 DO_MOUSE_DOWN (SDL_BUTTON_LEFT); |
470 } else { | 466 } else { |
536 use absolute coordinates, this serves to | 532 use absolute coordinates, this serves to |
537 compensate any inaccuracy in deltas, and | 533 compensate any inaccuracy in deltas, and |
538 provides the first known mouse position, | 534 provides the first known mouse position, |
539 since everything after this uses deltas | 535 since everything after this uses deltas |
540 */ | 536 */ |
541 NSPoint p = [ event locationInWindow ]; | 537 NSPoint p = [ qz_window mouseLocationOutsideOfEventStream ]; |
542 QZ_PrivateCocoaToSDL (this, &p); | 538 QZ_PrivateCocoaToSDL (this, &p); |
543 SDL_PrivateMouseMotion (0, 0, p.x, p.y); | 539 SDL_PrivateMouseMotion (0, 0, p.x, p.y); |
544 firstMouseEvent = 0; | 540 firstMouseEvent = 0; |
545 } | 541 } |
546 else { | 542 else { |
559 but not as a result of the warp (so it's in the right direction). | 555 but not as a result of the warp (so it's in the right direction). |
560 */ | 556 */ |
561 if ( grab_state == QZ_VISIBLE_GRAB && | 557 if ( grab_state == QZ_VISIBLE_GRAB && |
562 !isInGameWin ) { | 558 !isInGameWin ) { |
563 | 559 |
564 NSPoint p = [ event locationInWindow ]; | 560 NSPoint p = [ qz_window mouseLocationOutsideOfEventStream ]; |
565 QZ_PrivateCocoaToSDL (this, &p); | 561 QZ_PrivateCocoaToSDL (this, &p); |
566 | 562 |
567 if ( p.x < 0.0 ) | 563 if ( p.x < 0.0 ) |
568 p.x = 0.0; | 564 p.x = 0.0; |
569 | 565 |
580 } | 576 } |
581 else | 577 else |
582 if ( !isInGameWin && (SDL_GetAppState() & SDL_APPMOUSEFOCUS) ) { | 578 if ( !isInGameWin && (SDL_GetAppState() & SDL_APPMOUSEFOCUS) ) { |
583 | 579 |
584 SDL_PrivateAppActive (0, SDL_APPMOUSEFOCUS); | 580 SDL_PrivateAppActive (0, SDL_APPMOUSEFOCUS); |
581 if (!cursor_should_be_visible) | |
582 QZ_ShowMouse (this); | |
585 } | 583 } |
586 else | 584 else |
587 if ( isInGameWin && !(SDL_GetAppState() & SDL_APPMOUSEFOCUS) ) { | 585 if ( isInGameWin && !(SDL_GetAppState() & SDL_APPMOUSEFOCUS) ) { |
588 | 586 |
589 SDL_PrivateAppActive (1, SDL_APPMOUSEFOCUS); | 587 SDL_PrivateAppActive (1, SDL_APPMOUSEFOCUS); |
588 if (!cursor_should_be_visible) | |
589 QZ_HideMouse (this); | |
590 } | 590 } |
591 break; | 591 break; |
592 case NSScrollWheel: | 592 case NSScrollWheel: |
593 if ( isInGameWin ) { | 593 if ( isInGameWin ) { |
594 float dy; | 594 float dy; |