Blame server/Mac/mf_input.c

Packit 1fb8d4
/**
Packit 1fb8d4
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit 1fb8d4
 * FreeRDP Mac OS X Server (Input)
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2013 Corey Clayton <can.of.tuna@gmail.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifdef HAVE_CONFIG_H
Packit 1fb8d4
#include "config.h"
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#include <ApplicationServices/ApplicationServices.h>
Packit 1fb8d4
#include <Carbon/Carbon.h>
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/windows.h>
Packit 1fb8d4
Packit 1fb8d4
#include "mf_input.h"
Packit 1fb8d4
#include "mf_info.h"
Packit 1fb8d4
Packit 1fb8d4
#include <freerdp/log.h>
Packit 1fb8d4
#define TAG SERVER_TAG("mac")
Packit 1fb8d4
Packit 1fb8d4
static const CGKeyCode keymap[256] =
Packit 1fb8d4
{
Packit 1fb8d4
	0xFF, //0x0
Packit 1fb8d4
	kVK_Escape, //0x1
Packit 1fb8d4
	kVK_ANSI_1, //0x2
Packit 1fb8d4
	kVK_ANSI_2, //0x3
Packit 1fb8d4
	kVK_ANSI_3, //0x4
Packit 1fb8d4
	kVK_ANSI_4, //0x5
Packit 1fb8d4
	kVK_ANSI_5, //0x6
Packit 1fb8d4
	kVK_ANSI_6, //0x7
Packit 1fb8d4
	kVK_ANSI_7, //0x8
Packit 1fb8d4
	kVK_ANSI_8, //0x9
Packit 1fb8d4
	kVK_ANSI_9, //0xa
Packit 1fb8d4
	kVK_ANSI_0, //0xb
Packit 1fb8d4
	kVK_ANSI_Minus, //0xc
Packit 1fb8d4
	kVK_ANSI_Equal, //0xd
Packit 1fb8d4
	kVK_Delete, //0xe
Packit 1fb8d4
	kVK_Tab, //0xf
Packit 1fb8d4
	kVK_ANSI_Q, //0x10
Packit 1fb8d4
	kVK_ANSI_W, //0x11
Packit 1fb8d4
	kVK_ANSI_E, //0x12
Packit 1fb8d4
	kVK_ANSI_R, //0x13
Packit 1fb8d4
	kVK_ANSI_T, //0x14
Packit 1fb8d4
	kVK_ANSI_Y, //0x15
Packit 1fb8d4
	kVK_ANSI_U, //0x16
Packit 1fb8d4
	kVK_ANSI_I, //0x17
Packit 1fb8d4
	kVK_ANSI_O, //0x18
Packit 1fb8d4
	kVK_ANSI_P, //0x19
Packit 1fb8d4
	kVK_ANSI_LeftBracket, //0x1a
Packit 1fb8d4
	kVK_ANSI_RightBracket, //0x1b
Packit 1fb8d4
	kVK_Return, //0x1c
Packit 1fb8d4
	kVK_Control, //0x1d
Packit 1fb8d4
	kVK_ANSI_A, //0x1e
Packit 1fb8d4
	kVK_ANSI_S, //0x1f
Packit 1fb8d4
	kVK_ANSI_D, //0x20
Packit 1fb8d4
	kVK_ANSI_F, //0x21
Packit 1fb8d4
	kVK_ANSI_G, //0x22
Packit 1fb8d4
	kVK_ANSI_H, //0x23
Packit 1fb8d4
	kVK_ANSI_J, //0x24
Packit 1fb8d4
	kVK_ANSI_K, //0x25
Packit 1fb8d4
	kVK_ANSI_L, //0x26
Packit 1fb8d4
	kVK_ANSI_Semicolon, //0x27
Packit 1fb8d4
	kVK_ANSI_Quote, //0x28
Packit 1fb8d4
	kVK_ANSI_Grave, //0x29
Packit 1fb8d4
	kVK_Shift, //0x2a
Packit 1fb8d4
	kVK_ANSI_Backslash, //0x2b
Packit 1fb8d4
	kVK_ANSI_Z, //0x2c
Packit 1fb8d4
	kVK_ANSI_X, //0x2d
Packit 1fb8d4
	kVK_ANSI_C, //0x2e
Packit 1fb8d4
	kVK_ANSI_V, //0x2f
Packit 1fb8d4
	kVK_ANSI_B, //0x30
Packit 1fb8d4
	kVK_ANSI_N, //0x31
Packit 1fb8d4
	kVK_ANSI_M, //0x32
Packit 1fb8d4
	kVK_ANSI_Comma, //0x33
Packit 1fb8d4
	kVK_ANSI_Period, //0x34
Packit 1fb8d4
	kVK_ANSI_Slash, //0x35
Packit 1fb8d4
	kVK_Shift, //0x36
Packit 1fb8d4
	kVK_ANSI_KeypadMultiply, //0x37
Packit 1fb8d4
	kVK_Option, //0x38
Packit 1fb8d4
	kVK_Space, //0x39
Packit 1fb8d4
	kVK_CapsLock, //0x3a
Packit 1fb8d4
	kVK_F1, //0x3b
Packit 1fb8d4
	kVK_F2, //0x3c
Packit 1fb8d4
	kVK_F3, //0x3d
Packit 1fb8d4
	kVK_F4, //0x3e
Packit 1fb8d4
	kVK_F5, //0x3f
Packit 1fb8d4
	kVK_F6, //0x40
Packit 1fb8d4
	kVK_F7, //0x41
Packit 1fb8d4
	kVK_F8, //0x42
Packit 1fb8d4
	kVK_F9, //0x43
Packit 1fb8d4
	kVK_F10, //0x44
Packit 1fb8d4
	0xFF, //0x45 -- numlock
Packit 1fb8d4
	0xFF, //0x46 -- scroll lock
Packit 1fb8d4
	kVK_ANSI_Keypad7, //0x47
Packit 1fb8d4
	kVK_ANSI_Keypad8, //0x48
Packit 1fb8d4
	kVK_ANSI_Keypad9, //0x49
Packit 1fb8d4
	kVK_ANSI_KeypadMinus, //0x4a
Packit 1fb8d4
	kVK_ANSI_Keypad4, //0x4b
Packit 1fb8d4
	kVK_ANSI_Keypad5, //0x4c
Packit 1fb8d4
	kVK_ANSI_Keypad6, //0x4d
Packit 1fb8d4
	kVK_ANSI_KeypadPlus, //0x4e
Packit 1fb8d4
	kVK_ANSI_Keypad1, //0x4f
Packit 1fb8d4
	kVK_ANSI_Keypad2, //0x50
Packit 1fb8d4
	kVK_ANSI_Keypad3, //0x51
Packit 1fb8d4
	kVK_ANSI_Keypad0, //0x52
Packit 1fb8d4
	kVK_ANSI_KeypadDecimal, //0x53
Packit 1fb8d4
	0xFF, //0x54
Packit 1fb8d4
	0xFF, //0x55
Packit 1fb8d4
	0xFF, //0x56
Packit 1fb8d4
	kVK_F11, //0x57
Packit 1fb8d4
	kVK_F12, //0x58
Packit 1fb8d4
	0xFF, //0x59 -- pause
Packit 1fb8d4
	0xFF, //0x5a
Packit 1fb8d4
	kVK_Control, //0x5b
Packit 1fb8d4
	kVK_Control, //0x5c
Packit 1fb8d4
	0xFF, //0x5d -- application
Packit 1fb8d4
	0xFF, //0x5e -- power
Packit 1fb8d4
	0xFF, //0x5f -- sleep
Packit 1fb8d4
	0xFF, //0x60
Packit 1fb8d4
	0xFF, //0x61
Packit 1fb8d4
	0xFF, //0x62
Packit 1fb8d4
	0xFF, //0x63 -- wake
Packit 1fb8d4
	0xFF, //0x64
Packit 1fb8d4
	0xFF, //0x65
Packit 1fb8d4
	0xFF, //0x66
Packit 1fb8d4
	0xFF, //0x67
Packit 1fb8d4
	0xFF, //0x68
Packit 1fb8d4
	0xFF, //0x69
Packit 1fb8d4
	0xFF, //0x6a
Packit 1fb8d4
	0xFF, //0x6b
Packit 1fb8d4
	0xFF, //0x6c
Packit 1fb8d4
	0xFF, //0x6d
Packit 1fb8d4
	0xFF, //0x6e
Packit 1fb8d4
	0xFF, //0x6f
Packit 1fb8d4
	0xFF, //0x70
Packit 1fb8d4
	0xFF, //0x71
Packit 1fb8d4
	0xFF, //0x72
Packit 1fb8d4
	0xFF, //0x73
Packit 1fb8d4
	0xFF, //0x74
Packit 1fb8d4
	0xFF, //0x75
Packit 1fb8d4
	0xFF, //0x76
Packit 1fb8d4
	0xFF, //0x77
Packit 1fb8d4
	0xFF, //0x78
Packit 1fb8d4
	0xFF, //0x79
Packit 1fb8d4
	0xFF, //0x7a
Packit 1fb8d4
	0xFF, //0x7b
Packit 1fb8d4
	0xFF, //0x7c
Packit 1fb8d4
	0xFF, //0x7d
Packit 1fb8d4
	0xFF, //0x7e
Packit 1fb8d4
	0xFF, //0x7f
Packit 1fb8d4
	0xFF, //0x80
Packit 1fb8d4
	0xFF, //0x81
Packit 1fb8d4
	0xFF, //0x82
Packit 1fb8d4
	0xFF, //0x83
Packit 1fb8d4
	0xFF, //0x84
Packit 1fb8d4
	0xFF, //0x85
Packit 1fb8d4
	0xFF, //0x86
Packit 1fb8d4
	0xFF, //0x87
Packit 1fb8d4
	0xFF, //0x88
Packit 1fb8d4
	0xFF, //0x89
Packit 1fb8d4
	0xFF, //0x8a
Packit 1fb8d4
	0xFF, //0x8b
Packit 1fb8d4
	0xFF, //0x8c
Packit 1fb8d4
	0xFF, //0x8d
Packit 1fb8d4
	0xFF, //0x8e
Packit 1fb8d4
	0xFF, //0x8f
Packit 1fb8d4
	0xFF, //0x90
Packit 1fb8d4
	0xFF, //0x91
Packit 1fb8d4
	0xFF, //0x92
Packit 1fb8d4
	0xFF, //0x93
Packit 1fb8d4
	0xFF, //0x94
Packit 1fb8d4
	0xFF, //0x95
Packit 1fb8d4
	0xFF, //0x96
Packit 1fb8d4
	0xFF, //0x97
Packit 1fb8d4
	0xFF, //0x98
Packit 1fb8d4
	0xFF, //0x99
Packit 1fb8d4
	0xFF, //0x9a
Packit 1fb8d4
	0xFF, //0x9b
Packit 1fb8d4
	0xFF, //0x9c
Packit 1fb8d4
	0xFF, //0x9d
Packit 1fb8d4
	0xFF, //0x9e
Packit 1fb8d4
	0xFF, //0x9f
Packit 1fb8d4
	0xFF, //0xa0
Packit 1fb8d4
	0xFF, //0xa1
Packit 1fb8d4
	0xFF, //0xa2
Packit 1fb8d4
	0xFF, //0xa3
Packit 1fb8d4
	0xFF, //0xa4
Packit 1fb8d4
	0xFF, //0xa5
Packit 1fb8d4
	0xFF, //0xa6
Packit 1fb8d4
	0xFF, //0xa7
Packit 1fb8d4
	0xFF, //0xa8
Packit 1fb8d4
	0xFF, //0xa9
Packit 1fb8d4
	0xFF, //0xaa
Packit 1fb8d4
	0xFF, //0xab
Packit 1fb8d4
	0xFF, //0xac
Packit 1fb8d4
	0xFF, //0xad
Packit 1fb8d4
	0xFF, //0xae
Packit 1fb8d4
	0xFF, //0xaf
Packit 1fb8d4
	0xFF, //0xb0
Packit 1fb8d4
	0xFF, //0xb1
Packit 1fb8d4
	0xFF, //0xb2
Packit 1fb8d4
	0xFF, //0xb3
Packit 1fb8d4
	0xFF, //0xb4
Packit 1fb8d4
	0xFF, //0xb5
Packit 1fb8d4
	0xFF, //0xb6
Packit 1fb8d4
	0xFF, //0xb7
Packit 1fb8d4
	0xFF, //0xb8
Packit 1fb8d4
	0xFF, //0xb9
Packit 1fb8d4
	0xFF, //0xba
Packit 1fb8d4
	0xFF, //0xbb
Packit 1fb8d4
	0xFF, //0xbc
Packit 1fb8d4
	0xFF, //0xbd
Packit 1fb8d4
	0xFF, //0xbe
Packit 1fb8d4
	0xFF, //0xbf
Packit 1fb8d4
	0xFF, //0xc0
Packit 1fb8d4
	0xFF, //0xc1
Packit 1fb8d4
	0xFF, //0xc2
Packit 1fb8d4
	0xFF, //0xc3
Packit 1fb8d4
	0xFF, //0xc4
Packit 1fb8d4
	0xFF, //0xc5
Packit 1fb8d4
	0xFF, //0xc6
Packit 1fb8d4
	0xFF, //0xc7
Packit 1fb8d4
	0xFF, //0xc8
Packit 1fb8d4
	0xFF, //0xc9
Packit 1fb8d4
	0xFF, //0xca
Packit 1fb8d4
	0xFF, //0xcb
Packit 1fb8d4
	0xFF, //0xcc
Packit 1fb8d4
	0xFF, //0xcd
Packit 1fb8d4
	0xFF, //0xce
Packit 1fb8d4
	0xFF, //0xcf
Packit 1fb8d4
	0xFF, //0xd0
Packit 1fb8d4
	0xFF, //0xd1
Packit 1fb8d4
	0xFF, //0xd2
Packit 1fb8d4
	0xFF, //0xd3
Packit 1fb8d4
	0xFF, //0xd4
Packit 1fb8d4
	0xFF, //0xd5
Packit 1fb8d4
	0xFF, //0xd6
Packit 1fb8d4
	0xFF, //0xd7
Packit 1fb8d4
	0xFF, //0xd8
Packit 1fb8d4
	0xFF, //0xd9
Packit 1fb8d4
	0xFF, //0xda
Packit 1fb8d4
	0xFF, //0xdb
Packit 1fb8d4
	0xFF, //0xdc
Packit 1fb8d4
	0xFF, //0xdd
Packit 1fb8d4
	0xFF, //0xde
Packit 1fb8d4
	0xFF, //0xdf
Packit 1fb8d4
	0xFF, //0xe0
Packit 1fb8d4
	0xFF, //0xe1
Packit 1fb8d4
	0xFF, //0xe2
Packit 1fb8d4
	0xFF, //0xe3
Packit 1fb8d4
	0xFF, //0xe4
Packit 1fb8d4
	0xFF, //0xe5
Packit 1fb8d4
	0xFF, //0xe6
Packit 1fb8d4
	0xFF, //0xe7
Packit 1fb8d4
	0xFF, //0xe8
Packit 1fb8d4
	0xFF, //0xe9
Packit 1fb8d4
	0xFF, //0xea
Packit 1fb8d4
	0xFF, //0xeb
Packit 1fb8d4
	0xFF, //0xec
Packit 1fb8d4
	0xFF, //0xed
Packit 1fb8d4
	0xFF, //0xee
Packit 1fb8d4
	0xFF, //0xef
Packit 1fb8d4
	0xFF, //0xf0
Packit 1fb8d4
	0xFF, //0xf1
Packit 1fb8d4
	0xFF, //0xf2
Packit 1fb8d4
	0xFF, //0xf3
Packit 1fb8d4
	0xFF, //0xf4
Packit 1fb8d4
	0xFF, //0xf5
Packit 1fb8d4
	0xFF, //0xf6
Packit 1fb8d4
	0xFF, //0xf7
Packit 1fb8d4
	0xFF, //0xf8
Packit 1fb8d4
	0xFF, //0xf9
Packit 1fb8d4
	0xFF, //0xfa
Packit 1fb8d4
	0xFF, //0xfb
Packit 1fb8d4
	0xFF, //0xfc
Packit 1fb8d4
	0xFF, //0xfd
Packit 1fb8d4
	0xFF, //0xfe
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
BOOL mf_input_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code)
Packit 1fb8d4
{
Packit 1fb8d4
	CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
Packit 1fb8d4
	BOOL keyDown = TRUE;
Packit 1fb8d4
	CGEventRef kbEvent;
Packit 1fb8d4
	CGKeyCode kCode = 0xFF;
Packit 1fb8d4
Packit 1fb8d4
	if (flags & KBD_FLAGS_RELEASE)
Packit 1fb8d4
	{
Packit 1fb8d4
		keyDown = FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (flags & KBD_FLAGS_EXTENDED)
Packit 1fb8d4
	{
Packit 1fb8d4
		switch (code)
Packit 1fb8d4
		{
Packit 1fb8d4
			//case 0x52: //insert
Packit 1fb8d4
			case 0x53:
Packit 1fb8d4
				kCode = kVK_ForwardDelete;
Packit 1fb8d4
				break;
Packit 1fb8d4
Packit 1fb8d4
			case 0x4B:
Packit 1fb8d4
				kCode = kVK_LeftArrow;
Packit 1fb8d4
				break;
Packit 1fb8d4
Packit 1fb8d4
			case 0x47:
Packit 1fb8d4
				kCode = kVK_Home;
Packit 1fb8d4
				break;
Packit 1fb8d4
Packit 1fb8d4
			case 0x4F:
Packit 1fb8d4
				kCode = kVK_End;
Packit 1fb8d4
				break;
Packit 1fb8d4
Packit 1fb8d4
			case 0x48:
Packit 1fb8d4
				kCode = kVK_UpArrow;
Packit 1fb8d4
				break;
Packit 1fb8d4
Packit 1fb8d4
			case 0x50:
Packit 1fb8d4
				kCode = kVK_DownArrow;
Packit 1fb8d4
				break;
Packit 1fb8d4
Packit 1fb8d4
			case 0x49:
Packit 1fb8d4
				kCode = kVK_PageUp;
Packit 1fb8d4
				break;
Packit 1fb8d4
Packit 1fb8d4
			case 0x51:
Packit 1fb8d4
				kCode = kVK_PageDown;
Packit 1fb8d4
				break;
Packit 1fb8d4
Packit 1fb8d4
			case 0x4D:
Packit 1fb8d4
				kCode = kVK_RightArrow;
Packit 1fb8d4
				break;
Packit 1fb8d4
Packit 1fb8d4
			default:
Packit 1fb8d4
				break;
Packit 1fb8d4
		}
Packit 1fb8d4
	}
Packit 1fb8d4
	else
Packit 1fb8d4
	{
Packit 1fb8d4
		kCode = keymap[code];
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	kbEvent = CGEventCreateKeyboardEvent(source, kCode, keyDown);
Packit 1fb8d4
	CGEventPost(kCGHIDEventTap, kbEvent);
Packit 1fb8d4
	CFRelease(kbEvent);
Packit 1fb8d4
	CFRelease(source);
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL mf_input_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code)
Packit 1fb8d4
{
Packit 1fb8d4
	return FALSE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL mf_input_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
Packit 1fb8d4
{
Packit 1fb8d4
	float width, height;
Packit 1fb8d4
	CGWheelCount wheelCount = 2;
Packit 1fb8d4
	INT32 scroll_x = 0;
Packit 1fb8d4
	INT32 scroll_y = 0;
Packit 1fb8d4
Packit 1fb8d4
	if (flags & (PTR_FLAGS_WHEEL | PTR_FLAGS_HWHEEL))
Packit 1fb8d4
	{
Packit 1fb8d4
		INT32 scroll = flags & WheelRotationMask;
Packit 1fb8d4
Packit 1fb8d4
		if (flags & PTR_FLAGS_WHEEL_NEGATIVE)
Packit 1fb8d4
			scroll = -(flags & WheelRotationMask) / 392;
Packit 1fb8d4
		else
Packit 1fb8d4
			scroll = (flags & WheelRotationMask) / 120;
Packit 1fb8d4
Packit 1fb8d4
		if (flags & PTR_FLAGS_WHEEL)
Packit 1fb8d4
			scroll_y = scroll;
Packit 1fb8d4
		else
Packit 1fb8d4
			scroll_x = scroll;
Packit 1fb8d4
Packit 1fb8d4
		CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
Packit 1fb8d4
		CGEventRef scrollEvent = CGEventCreateScrollWheelEvent(source,
Packit 1fb8d4
		                         kCGScrollEventUnitLine,
Packit 1fb8d4
		                         wheelCount,
Packit 1fb8d4
		                         scroll_y,
Packit 1fb8d4
		                         scroll_x);
Packit 1fb8d4
		CGEventPost(kCGHIDEventTap, scrollEvent);
Packit 1fb8d4
		CFRelease(scrollEvent);
Packit 1fb8d4
		CFRelease(source);
Packit 1fb8d4
	}
Packit 1fb8d4
	else
Packit 1fb8d4
	{
Packit 1fb8d4
		mfInfo* mfi;
Packit 1fb8d4
		CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
Packit 1fb8d4
		CGEventType mouseType = kCGEventNull;
Packit 1fb8d4
		CGMouseButton mouseButton = kCGMouseButtonLeft;
Packit 1fb8d4
		mfi = mf_info_get_instance();
Packit 1fb8d4
		//width and height of primary screen (even in multimon setups
Packit 1fb8d4
		width = (float) mfi->servscreen_width;
Packit 1fb8d4
		height = (float) mfi->servscreen_height;
Packit 1fb8d4
		x += mfi->servscreen_xoffset;
Packit 1fb8d4
		y += mfi->servscreen_yoffset;
Packit 1fb8d4
Packit 1fb8d4
		if (flags & PTR_FLAGS_MOVE)
Packit 1fb8d4
		{
Packit 1fb8d4
			if (mfi->mouse_down_left == TRUE)
Packit 1fb8d4
			{
Packit 1fb8d4
				mouseType = kCGEventLeftMouseDragged;
Packit 1fb8d4
			}
Packit 1fb8d4
			else if (mfi->mouse_down_right == TRUE)
Packit 1fb8d4
			{
Packit 1fb8d4
				mouseType = kCGEventRightMouseDragged;
Packit 1fb8d4
			}
Packit 1fb8d4
			else if (mfi->mouse_down_other == TRUE)
Packit 1fb8d4
			{
Packit 1fb8d4
				mouseType = kCGEventOtherMouseDragged;
Packit 1fb8d4
			}
Packit 1fb8d4
			else
Packit 1fb8d4
			{
Packit 1fb8d4
				mouseType = kCGEventMouseMoved;
Packit 1fb8d4
			}
Packit 1fb8d4
Packit 1fb8d4
			CGEventRef move = CGEventCreateMouseEvent(source,
Packit 1fb8d4
			                  mouseType,
Packit 1fb8d4
			                  CGPointMake(x, y),
Packit 1fb8d4
			                  mouseButton // ignored for just movement
Packit 1fb8d4
			                                         );
Packit 1fb8d4
			CGEventPost(kCGHIDEventTap, move);
Packit 1fb8d4
			CFRelease(move);
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		if (flags & PTR_FLAGS_BUTTON1)
Packit 1fb8d4
		{
Packit 1fb8d4
			mouseButton = kCGMouseButtonLeft;
Packit 1fb8d4
Packit 1fb8d4
			if (flags & PTR_FLAGS_DOWN)
Packit 1fb8d4
			{
Packit 1fb8d4
				mouseType = kCGEventLeftMouseDown;
Packit 1fb8d4
				mfi->mouse_down_left = TRUE;
Packit 1fb8d4
			}
Packit 1fb8d4
			else
Packit 1fb8d4
			{
Packit 1fb8d4
				mouseType = kCGEventLeftMouseUp;
Packit 1fb8d4
				mfi->mouse_down_right = FALSE;
Packit 1fb8d4
			}
Packit 1fb8d4
		}
Packit 1fb8d4
		else if (flags & PTR_FLAGS_BUTTON2)
Packit 1fb8d4
		{
Packit 1fb8d4
			mouseButton = kCGMouseButtonRight;
Packit 1fb8d4
Packit 1fb8d4
			if (flags & PTR_FLAGS_DOWN)
Packit 1fb8d4
			{
Packit 1fb8d4
				mouseType = kCGEventRightMouseDown;
Packit 1fb8d4
				mfi->mouse_down_right = TRUE;
Packit 1fb8d4
			}
Packit 1fb8d4
			else
Packit 1fb8d4
			{
Packit 1fb8d4
				mouseType = kCGEventRightMouseUp;
Packit 1fb8d4
				mfi->mouse_down_right = FALSE;
Packit 1fb8d4
			}
Packit 1fb8d4
		}
Packit 1fb8d4
		else if (flags & PTR_FLAGS_BUTTON3)
Packit 1fb8d4
		{
Packit 1fb8d4
			mouseButton = kCGMouseButtonCenter;
Packit 1fb8d4
Packit 1fb8d4
			if (flags & PTR_FLAGS_DOWN)
Packit 1fb8d4
			{
Packit 1fb8d4
				mouseType = kCGEventOtherMouseDown;
Packit 1fb8d4
				mfi->mouse_down_other = TRUE;
Packit 1fb8d4
			}
Packit 1fb8d4
			else
Packit 1fb8d4
			{
Packit 1fb8d4
				mouseType = kCGEventOtherMouseUp;
Packit 1fb8d4
				mfi->mouse_down_other = FALSE;
Packit 1fb8d4
			}
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		CGEventRef mouseEvent = CGEventCreateMouseEvent(source,
Packit 1fb8d4
		                        mouseType,
Packit 1fb8d4
		                        CGPointMake(x, y),
Packit 1fb8d4
		                        mouseButton
Packit 1fb8d4
		                                               );
Packit 1fb8d4
		CGEventPost(kCGHIDEventTap, mouseEvent);
Packit 1fb8d4
		CFRelease(mouseEvent);
Packit 1fb8d4
		CFRelease(source);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL mf_input_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
Packit 1fb8d4
{
Packit 1fb8d4
	return FALSE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
Packit 1fb8d4
BOOL mf_input_keyboard_event_dummy(rdpInput* input, UINT16 flags, UINT16 code)
Packit 1fb8d4
{
Packit 1fb8d4
	return FALSE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL mf_input_unicode_keyboard_event_dummy(rdpInput* input, UINT16 flags, UINT16 code)
Packit 1fb8d4
{
Packit 1fb8d4
	return FALSE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL mf_input_mouse_event_dummy(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
Packit 1fb8d4
{
Packit 1fb8d4
	return FALSE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL mf_input_extended_mouse_event_dummy(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
Packit 1fb8d4
{
Packit 1fb8d4
	return FALSE;
Packit 1fb8d4
}