Fixed SetCursorPosition in fullscreen mode and DRYed some code
SetCursorPosition is now working properly in fullscreen mode. Some redundant code has been removed and refactored.
This commit is contained in:
parent
95a81c6075
commit
f9435eb881
@ -87,6 +87,12 @@ namespace sf {
|
|||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
-(void)setRealSize:(NSSize)newSize;
|
-(void)setRealSize:(NSSize)newSize;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// Move the mouse cursor to (x,y) (SFML Coordinates).
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
-(void)setCursorPositionToX:(unsigned int)x Y:(unsigned int)y;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// Adjust key repeat configuration.
|
/// Adjust key repeat configuration.
|
||||||
///
|
///
|
||||||
|
@ -103,6 +103,18 @@ sf::Key::Code NonLocalizedKeys(unsigned short keycode);
|
|||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
-(void)initModifiersState;
|
-(void)initModifiersState;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// Compute the position of the cursor.
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
-(NSPoint)cursorPositionFromEvent:(NSEvent *)event;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// Converte the NSEvent mouse button type to SFML type.
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
-(sf::Mouse::Button)mouseButtonFromEvent:(NSEvent *)event;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// Convert a key down/up NSEvent into an SFML key event.
|
/// Convert a key down/up NSEvent into an SFML key event.
|
||||||
/// Based on LocalizedKeys and NonLocalizedKeys function.
|
/// Based on LocalizedKeys and NonLocalizedKeys function.
|
||||||
@ -161,6 +173,39 @@ sf::Key::Code NonLocalizedKeys(unsigned short keycode);
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
-(void)setCursorPositionToX:(unsigned int)x Y:(unsigned int)y
|
||||||
|
{
|
||||||
|
// Flip for SFML window coordinate system
|
||||||
|
y = NSHeight([[self window] frame]) - y;
|
||||||
|
|
||||||
|
// Adjust for view reference instead of window
|
||||||
|
y -= NSHeight([[self window] frame]) - NSHeight([self frame]);
|
||||||
|
|
||||||
|
// Convert to screen coordinates
|
||||||
|
NSPoint screenCoord = [[self window] convertBaseToScreen:NSMakePoint(x, y)];
|
||||||
|
|
||||||
|
// Flip screen coodinates
|
||||||
|
float const screenHeight = NSHeight([[[self window] screen] frame]);
|
||||||
|
screenCoord.y = screenHeight - screenCoord.y;
|
||||||
|
|
||||||
|
// Recompute the mouse pos if required.
|
||||||
|
if (!NSEqualSizes(myRealSize, NSZeroSize)) {
|
||||||
|
screenCoord.x = screenCoord.x / myRealSize.width * [self frame].size.width;
|
||||||
|
screenCoord.y = screenCoord.y / myRealSize.height * [self frame].size.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Place the cursor.
|
||||||
|
CGEventRef event = CGEventCreateMouseEvent(NULL,
|
||||||
|
kCGEventMouseMoved,
|
||||||
|
CGPointMake(screenCoord.x, screenCoord.y),
|
||||||
|
/*we don't care about this : */0);
|
||||||
|
CGEventPost(kCGHIDEventTap, event);
|
||||||
|
CFRelease(event);
|
||||||
|
// This is a workaround to deprecated CGSetLocalEventsSuppressionInterval.
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
-(void)enableKeyRepeat
|
-(void)enableKeyRepeat
|
||||||
{
|
{
|
||||||
@ -260,58 +305,24 @@ sf::Key::Code NonLocalizedKeys(unsigned short keycode);
|
|||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
-(void)mouseDown:(NSEvent *)theEvent
|
-(void)mouseDown:(NSEvent *)theEvent
|
||||||
{
|
{
|
||||||
if (myRequester == 0) return;
|
// Forward to...
|
||||||
|
[self otherMouseDown:theEvent];
|
||||||
NSPoint loc = [self convertPoint:[theEvent locationInWindow] fromView:nil];
|
|
||||||
|
|
||||||
// Don't forget to change to SFML coord system.
|
|
||||||
float h = [self frame].size.height;
|
|
||||||
myRequester->MouseDownAt(sf::Mouse::Left, loc.x, h - loc.y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
-(void)mouseUp:(NSEvent *)theEvent
|
-(void)mouseUp:(NSEvent *)theEvent
|
||||||
{
|
{
|
||||||
if (myRequester == 0) return;
|
// Forward to...
|
||||||
|
[self otherMouseUp:theEvent];
|
||||||
NSPoint loc = [self convertPoint:[theEvent locationInWindow] fromView:nil];
|
|
||||||
|
|
||||||
// Don't forget to change to SFML coord system.
|
|
||||||
float h = [self frame].size.height;
|
|
||||||
loc.y = h - loc.y;
|
|
||||||
|
|
||||||
// Recompute the mouse pos if required.
|
|
||||||
if (!NSEqualSizes(myRealSize, NSZeroSize)) {
|
|
||||||
loc.x = loc.x * myRealSize.width / [self frame].size.width;
|
|
||||||
loc.y = loc.y * myRealSize.height / [self frame].size.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
myRequester->MouseUpAt(sf::Mouse::Left, loc.x, loc.y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
-(void)mouseMoved:(NSEvent *)theEvent
|
-(void)mouseMoved:(NSEvent *)theEvent
|
||||||
{
|
{
|
||||||
if (myRequester == 0) return;
|
// Forward to...
|
||||||
|
[self otherMouseDragged:theEvent];
|
||||||
// If the event is not useful.
|
|
||||||
if (!myMouseIsIn) return;
|
|
||||||
|
|
||||||
NSPoint loc = [self convertPoint:[theEvent locationInWindow] fromView:nil];
|
|
||||||
|
|
||||||
// Don't forget to change to SFML coord system.
|
|
||||||
float h = [self frame].size.height;
|
|
||||||
loc.y = h - loc.y;
|
|
||||||
|
|
||||||
// Recompute the mouse pos if required.
|
|
||||||
if (!NSEqualSizes(myRealSize, NSZeroSize)) {
|
|
||||||
loc.x = loc.x * myRealSize.width / [self frame].size.width;
|
|
||||||
loc.y = loc.y * myRealSize.height / [self frame].size.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
myRequester->MouseMovedAt(loc.x, loc.y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -320,17 +331,7 @@ sf::Key::Code NonLocalizedKeys(unsigned short keycode);
|
|||||||
{
|
{
|
||||||
if (myRequester == 0) return;
|
if (myRequester == 0) return;
|
||||||
|
|
||||||
NSPoint loc = [self convertPoint:[theEvent locationInWindow] fromView:nil];
|
NSPoint loc = [self cursorPositionFromEvent:theEvent];
|
||||||
|
|
||||||
// Don't forget to change to SFML coord system.
|
|
||||||
float h = [self frame].size.height;
|
|
||||||
loc.y = h - loc.y;
|
|
||||||
|
|
||||||
// Recompute the mouse pos if required.
|
|
||||||
if (!NSEqualSizes(myRealSize, NSZeroSize)) {
|
|
||||||
loc.x = loc.x * myRealSize.width / [self frame].size.width;
|
|
||||||
loc.y = loc.y * myRealSize.height / [self frame].size.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
myRequester->MouseWheelScrolledAt([theEvent deltaY], loc.x, loc.y);
|
myRequester->MouseWheelScrolledAt([theEvent deltaY], loc.x, loc.y);
|
||||||
}
|
}
|
||||||
@ -361,42 +362,16 @@ sf::Key::Code NonLocalizedKeys(unsigned short keycode);
|
|||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
-(void)rightMouseDown:(NSEvent *)theEvent
|
-(void)rightMouseDown:(NSEvent *)theEvent
|
||||||
{
|
{
|
||||||
if (myRequester == 0) return;
|
// Forward to...
|
||||||
|
[self otherMouseDown:theEvent];
|
||||||
NSPoint loc = [self convertPoint:[theEvent locationInWindow] fromView:nil];
|
|
||||||
|
|
||||||
// Don't forget to change to SFML coord system.
|
|
||||||
float h = [self frame].size.height;
|
|
||||||
loc.y = h - loc.y;
|
|
||||||
|
|
||||||
// Recompute the mouse pos if required.
|
|
||||||
if (!NSEqualSizes(myRealSize, NSZeroSize)) {
|
|
||||||
loc.x = loc.x * myRealSize.width / [self frame].size.width;
|
|
||||||
loc.y = loc.y * myRealSize.height / [self frame].size.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
myRequester->MouseDownAt(sf::Mouse::Right, loc.x, loc.y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
-(void)rightMouseUp:(NSEvent *)theEvent
|
-(void)rightMouseUp:(NSEvent *)theEvent
|
||||||
{
|
{
|
||||||
if (myRequester == 0) return;
|
// Forward to...
|
||||||
|
[self otherMouseUp:theEvent];
|
||||||
NSPoint loc = [self convertPoint:[theEvent locationInWindow] fromView:nil];
|
|
||||||
|
|
||||||
// Don't forget to change to SFML coord system.
|
|
||||||
float h = [self frame].size.height;
|
|
||||||
loc.y = h - loc.y;
|
|
||||||
|
|
||||||
// Recompute the mouse pos if required.
|
|
||||||
if (!NSEqualSizes(myRealSize, NSZeroSize)) {
|
|
||||||
loc.x = loc.x * myRealSize.width / [self frame].size.width;
|
|
||||||
loc.y = loc.y * myRealSize.height / [self frame].size.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
myRequester->MouseUpAt(sf::Mouse::Right, loc.x, loc.y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -405,32 +380,9 @@ sf::Key::Code NonLocalizedKeys(unsigned short keycode);
|
|||||||
{
|
{
|
||||||
if (myRequester == 0) return;
|
if (myRequester == 0) return;
|
||||||
|
|
||||||
NSPoint loc = [self convertPoint:[theEvent locationInWindow] fromView:nil];
|
NSPoint loc = [self cursorPositionFromEvent:theEvent];
|
||||||
|
|
||||||
sf::Mouse::Button button;
|
sf::Mouse::Button button = [self mouseButtonFromEvent:theEvent];
|
||||||
switch ([theEvent buttonNumber]) {
|
|
||||||
case 2:
|
|
||||||
button = sf::Mouse::Middle;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
button = sf::Mouse::XButton1;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
button = sf::Mouse::XButton2;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Don't forget to change to SFML coord system.
|
|
||||||
float h = [self frame].size.height;
|
|
||||||
loc.y = h - loc.y;
|
|
||||||
|
|
||||||
// Recompute the mouse pos if required.
|
|
||||||
if (!NSEqualSizes(myRealSize, NSZeroSize)) {
|
|
||||||
loc.x = loc.x * myRealSize.width / [self frame].size.width;
|
|
||||||
loc.y = loc.y * myRealSize.height / [self frame].size.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
myRequester->MouseDownAt(button, loc.x, loc.y);
|
myRequester->MouseDownAt(button, loc.x, loc.y);
|
||||||
}
|
}
|
||||||
@ -441,32 +393,9 @@ sf::Key::Code NonLocalizedKeys(unsigned short keycode);
|
|||||||
{
|
{
|
||||||
if (myRequester == 0) return;
|
if (myRequester == 0) return;
|
||||||
|
|
||||||
NSPoint loc = [self convertPoint:[theEvent locationInWindow] fromView:nil];
|
NSPoint loc = [self cursorPositionFromEvent:theEvent];
|
||||||
|
|
||||||
sf::Mouse::Button button;
|
sf::Mouse::Button button = [self mouseButtonFromEvent:theEvent];
|
||||||
switch ([theEvent buttonNumber]) {
|
|
||||||
case 2:
|
|
||||||
button = sf::Mouse::Middle;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
button = sf::Mouse::XButton1;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
button = sf::Mouse::XButton2;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Don't forget to change to SFML coord system.
|
|
||||||
float h = [self frame].size.height;
|
|
||||||
loc.y = h - loc.y;
|
|
||||||
|
|
||||||
// Recompute the mouse pos if required.
|
|
||||||
if (!NSEqualSizes(myRealSize, NSZeroSize)) {
|
|
||||||
loc.x = loc.x * myRealSize.width / [self frame].size.width;
|
|
||||||
loc.y = loc.y * myRealSize.height / [self frame].size.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
myRequester->MouseUpAt(button, loc.x, loc.y);
|
myRequester->MouseUpAt(button, loc.x, loc.y);
|
||||||
}
|
}
|
||||||
@ -475,48 +404,16 @@ sf::Key::Code NonLocalizedKeys(unsigned short keycode);
|
|||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
-(void)rightMouseDragged:(NSEvent *)theEvent
|
-(void)rightMouseDragged:(NSEvent *)theEvent
|
||||||
{
|
{
|
||||||
if (myRequester == 0) return;
|
// Forward to...
|
||||||
|
[self otherMouseDragged:theEvent];
|
||||||
// If the event is not useful.
|
|
||||||
if (!myMouseIsIn) return;
|
|
||||||
|
|
||||||
NSPoint loc = [self convertPoint:[theEvent locationInWindow] fromView:nil];
|
|
||||||
|
|
||||||
// Don't forget to change to SFML coord system.
|
|
||||||
float h = [self frame].size.height;
|
|
||||||
loc.y = h - loc.y;
|
|
||||||
|
|
||||||
// Recompute the mouse pos if required.
|
|
||||||
if (!NSEqualSizes(myRealSize, NSZeroSize)) {
|
|
||||||
loc.x = loc.x * myRealSize.width / [self frame].size.width;
|
|
||||||
loc.y = loc.y * myRealSize.height / [self frame].size.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
myRequester->MouseMovedAt(loc.x, loc.y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
-(void)mouseDragged:(NSEvent *)theEvent
|
-(void)mouseDragged:(NSEvent *)theEvent
|
||||||
{
|
{
|
||||||
if (myRequester == 0) return;
|
// Forward to...
|
||||||
|
[self otherMouseDragged:theEvent];
|
||||||
// If the event is not useful.
|
|
||||||
if (!myMouseIsIn) return;
|
|
||||||
|
|
||||||
NSPoint loc = [self convertPoint:[theEvent locationInWindow] fromView:nil];
|
|
||||||
|
|
||||||
// Don't forget to change to SFML coord system.
|
|
||||||
float h = [self frame].size.height;
|
|
||||||
loc.y = h - loc.y;
|
|
||||||
|
|
||||||
// Recompute the mouse pos if required.
|
|
||||||
if (!NSEqualSizes(myRealSize, NSZeroSize)) {
|
|
||||||
loc.x = loc.x * myRealSize.width / [self frame].size.width;
|
|
||||||
loc.y = loc.y * myRealSize.height / [self frame].size.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
myRequester->MouseMovedAt(loc.x, loc.y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -528,17 +425,7 @@ sf::Key::Code NonLocalizedKeys(unsigned short keycode);
|
|||||||
// If the event is not useful.
|
// If the event is not useful.
|
||||||
if (!myMouseIsIn) return;
|
if (!myMouseIsIn) return;
|
||||||
|
|
||||||
NSPoint loc = [self convertPoint:[theEvent locationInWindow] fromView:nil];
|
NSPoint loc = [self cursorPositionFromEvent:theEvent];
|
||||||
|
|
||||||
// Don't forget to change to SFML coord system.
|
|
||||||
float h = [self frame].size.height;
|
|
||||||
loc.y = h - loc.y;
|
|
||||||
|
|
||||||
// Recompute the mouse pos if required.
|
|
||||||
if (!NSEqualSizes(myRealSize, NSZeroSize)) {
|
|
||||||
loc.x = loc.x * myRealSize.width / [self frame].size.width;
|
|
||||||
loc.y = loc.y * myRealSize.height / [self frame].size.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
myRequester->MouseMovedAt(loc.x, loc.y);
|
myRequester->MouseMovedAt(loc.x, loc.y);
|
||||||
}
|
}
|
||||||
@ -1009,6 +896,39 @@ sf::Key::Code NonLocalizedKeys(unsigned short keycode);
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
-(NSPoint)cursorPositionFromEvent:(NSEvent *)event
|
||||||
|
{
|
||||||
|
NSPoint loc = [self convertPoint:[event locationInWindow] fromView:nil];
|
||||||
|
|
||||||
|
// Don't forget to change to SFML coord system.
|
||||||
|
float h = [self frame].size.height;
|
||||||
|
loc.y = h - loc.y;
|
||||||
|
|
||||||
|
// Recompute the mouse pos if required.
|
||||||
|
if (!NSEqualSizes(myRealSize, NSZeroSize)) {
|
||||||
|
loc.x = loc.x * myRealSize.width / [self frame].size.width;
|
||||||
|
loc.y = loc.y * myRealSize.height / [self frame].size.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
return loc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
-(sf::Mouse::Button)mouseButtonFromEvent:(NSEvent *)event
|
||||||
|
{
|
||||||
|
switch ([event buttonNumber]) {
|
||||||
|
case 0: return sf::Mouse::Left;
|
||||||
|
case 1: return sf::Mouse::Right;
|
||||||
|
case 2: return sf::Mouse::Middle;
|
||||||
|
case 3: return sf::Mouse::XButton1;
|
||||||
|
case 4: return sf::Mouse::XButton2;
|
||||||
|
default: return sf::Mouse::ButtonCount; // Never happens! (hopefully)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
+(sf::Event::KeyEvent)convertNSKeyEventToSFMLEvent:(NSEvent *)anEvent
|
+(sf::Event::KeyEvent)convertNSKeyEventToSFMLEvent:(NSEvent *)anEvent
|
||||||
{
|
{
|
||||||
|
@ -279,30 +279,8 @@
|
|||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
-(void)setCursorPositionToX:(unsigned int)x Y:(unsigned int)y
|
-(void)setCursorPositionToX:(unsigned int)x Y:(unsigned int)y
|
||||||
{
|
{
|
||||||
if (myRequester == 0) return;
|
// Forward to...
|
||||||
|
[myOGLView setCursorPositionToX:x Y:y];
|
||||||
// Flip for SFML window coordinate system
|
|
||||||
y = NSHeight([myWindow frame]) - y;
|
|
||||||
|
|
||||||
// Adjust for view reference instead of window
|
|
||||||
y -= NSHeight([myWindow frame]) - NSHeight([myOGLView frame]);
|
|
||||||
|
|
||||||
// Convert to screen coordinates
|
|
||||||
NSPoint screenCoord = [myWindow convertBaseToScreen:NSMakePoint(x, y)];
|
|
||||||
|
|
||||||
// Flip screen coodinates
|
|
||||||
float const screenHeight = NSHeight([[myWindow screen] frame]);
|
|
||||||
screenCoord.y = screenHeight - screenCoord.y;
|
|
||||||
|
|
||||||
// Place the cursor.
|
|
||||||
CGEventRef event = CGEventCreateMouseEvent(NULL,
|
|
||||||
kCGEventMouseMoved,
|
|
||||||
CGPointMake(screenCoord.x, screenCoord.y),
|
|
||||||
/*we don't care about this : */0);
|
|
||||||
CGEventPost(kCGHIDEventTap, event);
|
|
||||||
CFRelease(event);
|
|
||||||
// This is a workaround to deprecated CGSetLocalEventsSuppressionInterval.
|
|
||||||
// The event produced will be catched by SFML in sf::Window::FilterEvent.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user