Blame server/Mac/mf_input.c

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