1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-10 13:23:41 +00:00
Files
MeshAgent/meshcore/KVM/MacOS/mac_events.c
2019-01-11 10:58:46 -08:00

258 lines
7.2 KiB
C

#include "mac_events.h"
#include <assert.h>
#include <SystemConfiguration/SystemConfiguration.h>
#include <string.h>
static const int g_keymapLen = 114; // Modify this when you change anything in g_keymap.
static int g_capsLock = 0;
static int g_lMouseDown = 0;
static int g_rMouseDown = 0;
static struct keymap_t g_keymap[] = {
{ kVK_Space, VK_SPACE },
{ kVK_CapsLock, VK_CAPITAL },
{ kVK_ANSI_Q, VK_Q },
{ kVK_ANSI_W, VK_W },
{ kVK_ANSI_E, VK_E },
{ kVK_ANSI_R, VK_R },
{ kVK_ANSI_T, VK_T },
{ kVK_ANSI_Y, VK_Y },
{ kVK_ANSI_U, VK_U },
{ kVK_ANSI_I, VK_I },
{ kVK_ANSI_O, VK_O },
{ kVK_ANSI_P, VK_P },
{ kVK_ANSI_A, VK_A },
{ kVK_ANSI_S, VK_S },
{ kVK_ANSI_D, VK_D },
{ kVK_ANSI_F, VK_F },
{ kVK_ANSI_G, VK_G },
{ kVK_ANSI_H, VK_H },
{ kVK_ANSI_J, VK_J },
{ kVK_ANSI_K, VK_K },
{ kVK_ANSI_L, VK_L },
{ kVK_ANSI_Z, VK_Z },
{ kVK_ANSI_X, VK_X },
{ kVK_ANSI_C, VK_C },
{ kVK_ANSI_V, VK_V },
{ kVK_ANSI_B, VK_B },
{ kVK_ANSI_N, VK_N },
{ kVK_ANSI_M, VK_M },
{ kVK_ANSI_1, VK_1 },
{ kVK_ANSI_2, VK_2 },
{ kVK_ANSI_3, VK_3 },
{ kVK_ANSI_4, VK_4 },
{ kVK_ANSI_5, VK_5 },
{ kVK_ANSI_6, VK_6 },
{ kVK_ANSI_7, VK_7 },
{ kVK_ANSI_8, VK_8 },
{ kVK_ANSI_9, VK_9 },
{ kVK_ANSI_0, VK_0 },
{ kVK_Delete, VK_BACK },
{ kVK_Tab, VK_TAB },
{ kVK_ANSI_KeypadClear, VK_CLEAR },
{ kVK_Return, VK_RETURN },
{ kVK_Help, VK_PAUSE },
{ kVK_Escape, VK_ESCAPE },
{ kVK_ForwardDelete, VK_DELETE },
{ kVK_Home, VK_HOME },
{ kVK_LeftArrow, VK_LEFT },
{ kVK_UpArrow, VK_UP },
{ kVK_RightArrow, VK_RIGHT },
{ kVK_DownArrow, VK_DOWN },
{ kVK_PageUp, VK_PRIOR },
{ kVK_PageDown, VK_NEXT },
{ kVK_End, VK_END },
{ kVK_Help, VK_SELECT },
{ kVK_Help, VK_SNAPSHOT },
{ kVK_Help, VK_EXECUTE },
{ kVK_Help, VK_INSERT },
{ kVK_Help, VK_HELP },
{ kVK_Escape, VK_CANCEL },
{ kVK_F1, VK_F1 },
{ kVK_F2, VK_F2 },
{ kVK_F3, VK_F3 },
{ kVK_F4, VK_F4 },
{ kVK_F5, VK_F5 },
{ kVK_F6, VK_F6 },
{ kVK_F7, VK_F7 },
{ kVK_F8, VK_F8 },
{ kVK_F9, VK_F9 },
{ kVK_F10, VK_F10 },
{ kVK_F11, VK_F11 },
{ kVK_F12, VK_F12 },
{ kVK_F13, VK_F13 },
{ kVK_F14, VK_F14 },
{ kVK_F15, VK_F15 },
{ kVK_F16, VK_F16 },
{ kVK_F17, VK_F17 },
{ kVK_F18, VK_F18 },
{ kVK_F19, VK_F19 },
{ kVK_F20, VK_F20 },
{ kVK_Home, VK_HOME },
{ kVK_ANSI_KeypadMultiply, VK_MULTIPLY },
{ kVK_ANSI_Equal, VK_ADD },
{ kVK_ANSI_Comma, VK_SEPARATOR },
{ kVK_ANSI_Minus, VK_SUBTRACT },
{ kVK_ANSI_KeypadDecimal, VK_DECIMAL },
{ kVK_ANSI_KeypadDivide, VK_DIVIDE },
{ kVK_ANSI_Keypad0, VK_NUMPAD0 },
{ kVK_ANSI_Keypad1, VK_NUMPAD1 },
{ kVK_ANSI_Keypad2, VK_NUMPAD2 },
{ kVK_ANSI_Keypad3, VK_NUMPAD3 },
{ kVK_ANSI_Keypad4, VK_NUMPAD4 },
{ kVK_ANSI_Keypad5, VK_NUMPAD5 },
{ kVK_ANSI_Keypad6, VK_NUMPAD6 },
{ kVK_ANSI_Keypad7, VK_NUMPAD7 },
{ kVK_ANSI_Keypad8, VK_NUMPAD8 },
{ kVK_ANSI_Keypad9, VK_NUMPAD9 },
{ kVK_Shift, VK_SHIFT },
{ kVK_Control, VK_CONTROL },
{ kVK_Option, VK_MENU },
{ kVK_Command, VK_RWIN },
{ kVK_Command, VK_LWIN },
{ kVK_Option, VK_APPS },
{ kVK_JIS_Kana, VK_KANA },
{ kVK_ANSI_Semicolon, VK_OEM_1 },
{ kVK_ANSI_Equal, VK_OEM_PLUS },
{ kVK_ANSI_Comma, VK_OEM_COMMA },
{ kVK_ANSI_Minus, VK_OEM_MINUS },
{ kVK_ANSI_Period, VK_OEM_PERIOD },
{ kVK_ANSI_Slash, VK_OEM_2 },
{ kVK_ANSI_Grave, VK_OEM_3 },
{ kVK_ANSI_LeftBracket, VK_OEM_4 },
{ kVK_ANSI_Backslash, VK_OEM_5 },
{ kVK_ANSI_RightBracket, VK_OEM_6 },
{ kVK_ANSI_Quote, VK_OEM_7 }
};
char* getCurrentSession() {
SCDynamicStoreRef store;
CFStringRef name;
uid_t uid;
char *buf;
Boolean ok;
buf = (char *)malloc (BUFSIZ);
store = SCDynamicStoreCreate(NULL, CFSTR("GetConsoleUser"), NULL, NULL);
assert(store != NULL);
name = SCDynamicStoreCopyConsoleUser(store, &uid, NULL);
CFRelease(store);
if (name != NULL) {
ok = CFStringGetCString(name, buf, BUFSIZ, kCFStringEncodingUTF8);
assert(ok == true);
CFRelease(name);
} else {
strcpy(buf, "<none>");
}
return buf;
}
void MouseAction(double absX, double absY, int button, short wheel)
{
CGPoint curPos;
CGEventRef e;
CGEventType event;
CGEventSourceRef source;
curPos.x = absX;
curPos.y = absY;
source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
if (g_lMouseDown || g_rMouseDown) {
event = g_lMouseDown ? kCGEventLeftMouseDragged : kCGEventRightMouseDragged;
e = CGEventCreateMouseEvent(source, event, curPos, 1);
CGEventPost(kCGHIDEventTap, e);
CGEventPost(kCGSessionEventTap, e);
CFRelease(e);
}
else {
CGWarpMouseCursorPosition (curPos);
}
if (button != 0) {
switch (button) {
case MOUSEEVENTF_LEFTDOWN:
event = kCGEventLeftMouseDown;
g_lMouseDown = 1;
break;
case MOUSEEVENTF_RIGHTDOWN:
g_rMouseDown = 1;
event = kCGEventRightMouseDown;
break;
case MOUSEEVENTF_LEFTUP:
g_lMouseDown = 0;
event = kCGEventLeftMouseUp;
break;
case MOUSEEVENTF_RIGHTUP:
g_rMouseDown = 0;
event = kCGEventRightMouseUp;
break;
default:
break;
}
/*
if (!strcmp(getCurrentSession(), "<none>"))
{
// This call is deprecated in OSX 10.6
CGPostMouseEvent(curPos, TRUE, 3, (event == kCGEventLeftMouseDown) ? TRUE : FALSE, (event == kCGEventRightMouseDown) ? TRUE : FALSE, FALSE); // mouse down
}
else
{
*/
e = CGEventCreateMouseEvent(source, event, curPos, 1);
CGEventPost(kCGHIDEventTap, e);
CFRelease(e);
/*
}
*/
}
else if (wheel != 0)
{
e = CGEventCreateScrollWheelEvent(source, kCGScrollEventUnitPixel, 1, wheel);
CGEventPost(kCGHIDEventTap, e);
CFRelease(e);
}
if (source != NULL) CFRelease(source);
}
void KeyAction(unsigned char vk, int up) {
int i;
CGKeyCode keycode;
CGEventSourceRef source;
source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
for (i = 0 ; i < g_keymapLen; i++) {
if (g_keymap[i].vk == vk) {
keycode = g_keymap[i].keycode;
break;
}
}
if (i == g_keymapLen) { return; }
if (vk == VK_CAPITAL && up) { g_capsLock = g_capsLock ? 0 : 1; }
/*
if (!strcmp(getCurrentSession(), "<none>")) {
// This call is deprecated in OSX 10.6
CGPostKeyboardEvent(0, keycode, !up);
}
else
{
*/
CGEventRef key = CGEventCreateKeyboardEvent(source, keycode, !up);
if (g_capsLock) { CGEventSetFlags(key, kCGEventFlagMaskAlphaShift); }
CGEventPost(kCGHIDEventTap, key);
CFRelease(key);
/*
}
*/
if (source != NULL) CFRelease(source);
}