/* 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 .
*
*/
// 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
@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 scaledDeltaX = deltaX * [[self view] contentScaleFactor] + _dxReminder;
CGFloat scaledDeltaY = deltaY * [[self view] contentScaleFactor] + _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