#3305 Detect media keys on macOS server
This commit is contained in:
parent
6d5b2707c8
commit
6294679fcd
|
@ -18,6 +18,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#import <CoreFoundation/CoreFoundation.h>
|
#import <CoreFoundation/CoreFoundation.h>
|
||||||
|
#import <Carbon/Carbon.h>
|
||||||
|
|
||||||
#include "synergy/key_types.h"
|
#include "synergy/key_types.h"
|
||||||
|
|
||||||
|
@ -25,6 +26,8 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
bool fakeNativeMediaKey(KeyID id);
|
bool fakeNativeMediaKey(KeyID id);
|
||||||
|
bool isMediaKeyEvent(CGEventRef event);
|
||||||
|
bool getMediaKeyEventInfo(CGEventRef event, KeyID* keyId, bool* down, bool* isRepeat);
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -13,52 +13,40 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#import "platform/OSXMediaKeySimulator.h"
|
#import "platform/OSXMediaKeySimulator.h"
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
|
#import <IOKit/hidsystem/ev_keymap.h>
|
||||||
|
|
||||||
int convertKeyIDToNXKeyType(KeyID id)
|
int convertKeyIDToNXKeyType(KeyID id)
|
||||||
{
|
{
|
||||||
// hidsystem/ev_keymap.h
|
|
||||||
// NX_KEYTYPE_SOUND_UP 0
|
|
||||||
// NX_KEYTYPE_SOUND_DOWN 1
|
|
||||||
// NX_KEYTYPE_BRIGHTNESS_UP 2
|
|
||||||
// NX_KEYTYPE_BRIGHTNESS_DOWN 3
|
|
||||||
// NX_KEYTYPE_MUTE 7
|
|
||||||
// NX_KEYTYPE_EJECT 14
|
|
||||||
// NX_KEYTYPE_PLAY 16
|
|
||||||
// NX_KEYTYPE_NEXT 17
|
|
||||||
// NX_KEYTYPE_PREVIOUS 18
|
|
||||||
// NX_KEYTYPE_FAST 19
|
|
||||||
// NX_KEYTYPE_REWIND 20
|
|
||||||
|
|
||||||
int type = -1;
|
int type = -1;
|
||||||
|
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case kKeyAudioUp:
|
case kKeyAudioUp:
|
||||||
type = 0;
|
type = NX_KEYTYPE_SOUND_UP;
|
||||||
break;
|
break;
|
||||||
case kKeyAudioDown:
|
case kKeyAudioDown:
|
||||||
type = 1;
|
type = NX_KEYTYPE_SOUND_DOWN;
|
||||||
break;
|
break;
|
||||||
case kKeyBrightnessUp:
|
case kKeyBrightnessUp:
|
||||||
type = 2;
|
type = NX_KEYTYPE_BRIGHTNESS_UP;
|
||||||
break;
|
break;
|
||||||
case kKeyBrightnessDown:
|
case kKeyBrightnessDown:
|
||||||
type = 3;
|
type = NX_KEYTYPE_BRIGHTNESS_DOWN;
|
||||||
break;
|
break;
|
||||||
case kKeyAudioMute:
|
case kKeyAudioMute:
|
||||||
type = 7;
|
type = NX_KEYTYPE_MUTE;
|
||||||
break;
|
break;
|
||||||
case kKeyEject:
|
case kKeyEject:
|
||||||
type = 14;
|
type = NX_KEYTYPE_EJECT;
|
||||||
break;
|
break;
|
||||||
case kKeyAudioPlay:
|
case kKeyAudioPlay:
|
||||||
type = 16;
|
type = NX_KEYTYPE_PLAY;
|
||||||
break;
|
break;
|
||||||
case kKeyAudioNext:
|
case kKeyAudioNext:
|
||||||
type = 17;
|
type = NX_KEYTYPE_NEXT;
|
||||||
break;
|
break;
|
||||||
case kKeyAudioPrev:
|
case kKeyAudioPrev:
|
||||||
type = 18;
|
type = NX_KEYTYPE_PREVIOUS;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -67,6 +55,80 @@ int convertKeyIDToNXKeyType(KeyID id)
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static KeyID
|
||||||
|
convertNXKeyTypeToKeyID(uint32_t const type)
|
||||||
|
{
|
||||||
|
KeyID id = 0;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case NX_KEYTYPE_SOUND_UP:
|
||||||
|
id = kKeyAudioUp;
|
||||||
|
break;
|
||||||
|
case NX_KEYTYPE_SOUND_DOWN:
|
||||||
|
id = kKeyAudioDown;
|
||||||
|
break;
|
||||||
|
case NX_KEYTYPE_MUTE:
|
||||||
|
id = kKeyAudioMute;
|
||||||
|
break;
|
||||||
|
case NX_KEYTYPE_EJECT:
|
||||||
|
id = kKeyEject;
|
||||||
|
break;
|
||||||
|
case NX_KEYTYPE_PLAY:
|
||||||
|
id = kKeyAudioPlay;
|
||||||
|
break;
|
||||||
|
case NX_KEYTYPE_FAST:
|
||||||
|
case NX_KEYTYPE_NEXT:
|
||||||
|
id = kKeyAudioNext;
|
||||||
|
break;
|
||||||
|
case NX_KEYTYPE_REWIND:
|
||||||
|
case NX_KEYTYPE_PREVIOUS:
|
||||||
|
id = kKeyAudioPrev;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
isMediaKeyEvent(CGEventRef event) {
|
||||||
|
NSEvent* nsEvent = nil;
|
||||||
|
@try {
|
||||||
|
nsEvent = [NSEvent eventWithCGEvent: event];
|
||||||
|
if ([nsEvent subtype] != 8) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
uint32_t const nxKeyId = ([nsEvent data1] & 0xFFFF0000) >> 16;
|
||||||
|
if (convertNXKeyTypeToKeyID (nxKeyId)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} @catch (NSException* e) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
getMediaKeyEventInfo(CGEventRef event, KeyID* const keyId,
|
||||||
|
bool* const down, bool* const isRepeat) {
|
||||||
|
NSEvent* nsEvent = nil;
|
||||||
|
@try {
|
||||||
|
nsEvent = [NSEvent eventWithCGEvent: event];
|
||||||
|
} @catch (NSException* e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (keyId) {
|
||||||
|
*keyId = convertNXKeyTypeToKeyID (([nsEvent data1] & 0xFFFF0000) >> 16);
|
||||||
|
}
|
||||||
|
if (down) {
|
||||||
|
*down = !([nsEvent data1] & 0x100);
|
||||||
|
}
|
||||||
|
if (isRepeat) {
|
||||||
|
*isRepeat = [nsEvent data1] & 0x1;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
fakeNativeMediaKey(KeyID id)
|
fakeNativeMediaKey(KeyID id)
|
||||||
{
|
{
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "platform/OSXKeyState.h"
|
#include "platform/OSXKeyState.h"
|
||||||
#include "platform/OSXScreenSaver.h"
|
#include "platform/OSXScreenSaver.h"
|
||||||
#include "platform/OSXDragSimulator.h"
|
#include "platform/OSXDragSimulator.h"
|
||||||
|
#include "platform/OSXMediaKeySimulator.h"
|
||||||
#include "platform/OSXPasteboardPeeker.h"
|
#include "platform/OSXPasteboardPeeker.h"
|
||||||
#include "synergy/Clipboard.h"
|
#include "synergy/Clipboard.h"
|
||||||
#include "synergy/KeyMap.h"
|
#include "synergy/KeyMap.h"
|
||||||
|
@ -1333,6 +1334,23 @@ OSXScreen::onKey(CGEventRef event)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
OSXScreen::onMediaKey(CGEventRef event)
|
||||||
|
{
|
||||||
|
KeyID keyID;
|
||||||
|
bool down;
|
||||||
|
bool isRepeat;
|
||||||
|
|
||||||
|
if (!getMediaKeyEventInfo (event, &keyID, &down, &isRepeat)) {
|
||||||
|
LOG ((CLOG_ERR "Failed to decode media key event"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG ((CLOG_DEBUG2 "Media key event: keyID=0x%02x, %s, repeat=%s",
|
||||||
|
keyID, (down ? "down": "up"),
|
||||||
|
(isRepeat ? "yes" : "no")));
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
OSXScreen::onHotKey(EventRef event) const
|
OSXScreen::onHotKey(EventRef event) const
|
||||||
{
|
{
|
||||||
|
@ -1941,8 +1959,13 @@ OSXScreen::handleCGInputEvent(CGEventTapProxy proxy,
|
||||||
case NX_NULLEVENT:
|
case NX_NULLEVENT:
|
||||||
break;
|
break;
|
||||||
case NX_SYSDEFINED:
|
case NX_SYSDEFINED:
|
||||||
LOG((CLOG_DEBUG2 "unknown system defined event"));
|
if (isMediaKeyEvent (event)) {
|
||||||
return event;
|
LOG((CLOG_DEBUG2 "detected media key event"));
|
||||||
|
screen->onMediaKey (event);
|
||||||
|
} else {
|
||||||
|
LOG((CLOG_DEBUG2 "ignoring unknown system defined event"));
|
||||||
|
return event;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case NX_NUMPROCS:
|
case NX_NUMPROCS:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -129,6 +129,8 @@ private:
|
||||||
|
|
||||||
bool onKey(CGEventRef event);
|
bool onKey(CGEventRef event);
|
||||||
|
|
||||||
|
void onMediaKey(CGEventRef event);
|
||||||
|
|
||||||
bool onHotKey(EventRef event) const;
|
bool onHotKey(EventRef event) const;
|
||||||
|
|
||||||
// Added here to allow the carbon cursor hack to be called.
|
// Added here to allow the carbon cursor hack to be called.
|
||||||
|
|
Loading…
Reference in New Issue