scummvm/backends/platform/ios7/ios7_mouse_controller.mm
Lars Sundström 72518221d8 IOS7: Scale mouse movements
The delta values are in number of pixels on the native screen
resolution. Need to scale down the delta values based on the
game resolution. Store reminders that are added to next deltas
to mitigate "dead zones" if doing small movements.
2023-05-15 12:43:39 +02:00

85 lines
2.8 KiB
Text

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* 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 3 of the License, or
* (at your option) any later version.
*
* 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, see <http://www.gnu.org/licenses/>.
*
*/
// Disable symbol overrides so that we can use system headers.
#define FORBIDDEN_SYMBOL_ALLOW_ALL
#include "backends/platform/ios7/ios7_mouse_controller.h"
#include "backends/platform/ios7/ios7_video.h"
#include <GameController/GameController.h>
@implementation MouseController {
#ifdef __IPHONE_14_0
GCMouse *_mouse;
CGFloat _dxReminder, _dyReminder;
#endif
}
@dynamic view;
@dynamic isConnected;
- (id)initWithView:(iPhoneView *)view {
self = [super initWithView:view];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(mouseDidConnect:)
name:@"GCMouseDidConnectNotification"
object:nil];
}
_dxReminder = 0.0;
_dyReminder = 0.0;
return self;
}
- (void)mouseDidConnect:(NSNotification *)notification {
#ifdef __IPHONE_14_0
[self setIsConnected:YES];
_mouse = (GCMouse*)notification.object;
_mouse.mouseInput.mouseMovedHandler = ^(GCMouseInput * _Nonnull mouse, float deltaX, float deltaY) {
CGFloat scaleX, scaleY;
[[self view] getMouseScaleFactorX:&scaleX andY:&scaleY];
CGFloat scaledDeltaX = deltaX * scaleX + _dxReminder;
CGFloat scaledDeltaY = deltaY * scaleY + _dyReminder;
// Add any reminding delta values to be summed up and get the integer part of the delta
int dx = (int)(scaledDeltaX);
int dy = (int)(scaledDeltaY);
// Save the new reminders
_dxReminder = scaledDeltaX - (CGFloat)dx;
_dyReminder = scaledDeltaY - (CGFloat)dy;
[[self view] addEvent:InternalEvent(kInputMouseDelta, -dx, dy)];
};
_mouse.mouseInput.leftButton.valueChangedHandler = ^(GCControllerButtonInput * _Nonnull button, float value, BOOL pressed) {
[[self view] addEvent:InternalEvent(pressed ? kInputMouseLeftButtonDown : kInputMouseLeftButtonUp, 0, 0)];
};
_mouse.mouseInput.rightButton.valueChangedHandler = ^(GCControllerButtonInput * _Nonnull button, float value, BOOL pressed) {
[[self view] addEvent:InternalEvent(pressed ? kInputMouseRightButtonDown : kInputMouseRightButtonUp, 0, 0)];
};
#endif
}
@end