2018-03-27 08:50:40 +02:00
|
|
|
|
//
|
|
|
|
|
|
// StreamView.m
|
|
|
|
|
|
// Moonlight macOS
|
|
|
|
|
|
//
|
|
|
|
|
|
// Created by Felix Kratz on 10.3.18.
|
|
|
|
|
|
// Copyright (c) 2018 Felix Kratz. All rights reserved.
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
#import "StreamView.h"
|
|
|
|
|
|
#include <Limelight.h>
|
|
|
|
|
|
#import "DataManager.h"
|
|
|
|
|
|
#include <ApplicationServices/ApplicationServices.h>
|
|
|
|
|
|
#include "keyboardTranslation.h"
|
2018-04-22 06:44:22 +02:00
|
|
|
|
#import "OverlayView.h"
|
2018-03-27 08:50:40 +02:00
|
|
|
|
|
|
|
|
|
|
@implementation StreamView {
|
2018-04-22 06:44:22 +02:00
|
|
|
|
bool isDragging;
|
|
|
|
|
|
NSTrackingArea* _trackingArea;
|
|
|
|
|
|
OverlayView* _overlay;
|
|
|
|
|
|
NSTextField* _stageLabel;
|
2018-03-27 08:50:40 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
- (void) updateTrackingAreas {
|
2018-04-22 06:44:22 +02:00
|
|
|
|
if (_trackingArea != nil) {
|
|
|
|
|
|
[self removeTrackingArea:_trackingArea];
|
2018-03-27 08:50:40 +02:00
|
|
|
|
}
|
|
|
|
|
|
NSTrackingAreaOptions options = (NSTrackingActiveAlways | NSTrackingInVisibleRect |
|
|
|
|
|
|
NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved);
|
|
|
|
|
|
|
2018-04-22 06:44:22 +02:00
|
|
|
|
_trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds]
|
2018-03-27 08:50:40 +02:00
|
|
|
|
options:options
|
|
|
|
|
|
owner:self
|
|
|
|
|
|
userInfo:nil];
|
2018-04-22 06:44:22 +02:00
|
|
|
|
[self addTrackingArea:_trackingArea];
|
2018-03-27 08:50:40 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
-(void)mouseDragged:(NSEvent *)event {
|
|
|
|
|
|
if (isDragging) {
|
|
|
|
|
|
[self mouseMoved:event];
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
[self mouseDown:event];
|
|
|
|
|
|
isDragging = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
-(void)rightMouseDragged:(NSEvent *)event {
|
|
|
|
|
|
if (isDragging) {
|
|
|
|
|
|
[self mouseMoved:event];
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
[self rightMouseDown:event];
|
|
|
|
|
|
isDragging = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
-(void)scrollWheel:(NSEvent *)event {
|
|
|
|
|
|
LiSendScrollEvent(event.scrollingDeltaY);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
- (void)mouseDown:(NSEvent *)mouseEvent {
|
|
|
|
|
|
LiSendMouseButtonEvent(BUTTON_ACTION_PRESS, BUTTON_LEFT);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
- (void)mouseUp:(NSEvent *)mouseEvent {
|
|
|
|
|
|
isDragging = false;
|
|
|
|
|
|
LiSendMouseButtonEvent(BUTTON_ACTION_RELEASE, BUTTON_LEFT);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
- (void)rightMouseUp:(NSEvent *)mouseEvent {
|
|
|
|
|
|
isDragging = false;
|
|
|
|
|
|
LiSendMouseButtonEvent(BUTTON_ACTION_RELEASE, BUTTON_RIGHT);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
- (void)rightMouseDown:(NSEvent *)mouseEvent {
|
|
|
|
|
|
LiSendMouseButtonEvent(BUTTON_ACTION_PRESS, BUTTON_RIGHT);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
- (void)mouseMoved:(NSEvent *)mouseEvent {
|
|
|
|
|
|
LiSendMouseMoveEvent(mouseEvent.deltaX, mouseEvent.deltaY);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
-(void)keyDown:(NSEvent *)event {
|
|
|
|
|
|
unsigned char keyChar = keyCharFromKeyCode(event.keyCode);
|
2018-04-22 06:44:22 +02:00
|
|
|
|
NSLog(@"DOWN: KeyCode: %hu, keyChar: %d, keyModifier: %lu \n", event.keyCode, keyChar, event.modifierFlags);
|
2018-03-27 08:50:40 +02:00
|
|
|
|
|
|
|
|
|
|
LiSendKeyboardEvent(keyChar, KEY_ACTION_DOWN, modifierFlagForKeyModifier(event.modifierFlags));
|
2018-04-22 06:44:22 +02:00
|
|
|
|
if (event.modifierFlags & kCGEventFlagMaskCommand && event.keyCode == kVK_ANSI_I) {
|
|
|
|
|
|
[self toggleStats];
|
|
|
|
|
|
}
|
2018-03-27 08:50:40 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
-(void)keyUp:(NSEvent *)event {
|
|
|
|
|
|
unsigned char keyChar = keyCharFromKeyCode(event.keyCode);
|
2018-04-22 06:44:22 +02:00
|
|
|
|
NSLog(@"UP: KeyChar: %d \n‚", keyChar);
|
2018-03-27 08:50:40 +02:00
|
|
|
|
LiSendKeyboardEvent(keyChar, KEY_ACTION_UP, modifierFlagForKeyModifier(event.modifierFlags));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-22 06:44:22 +02:00
|
|
|
|
- (void)flagsChanged:(NSEvent *)event {
|
2018-03-27 08:50:40 +02:00
|
|
|
|
unsigned char keyChar = keyCodeFromModifierKey(event.modifierFlags);
|
|
|
|
|
|
if(keyChar) {
|
2018-04-22 06:44:22 +02:00
|
|
|
|
NSLog(@"DOWN: FlagChanged: %hhu \n", keyChar);
|
2018-03-27 08:50:40 +02:00
|
|
|
|
LiSendKeyboardEvent(keyChar, KEY_ACTION_DOWN, 0x00);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
LiSendKeyboardEvent(58, KEY_ACTION_UP, 0x00);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-22 06:44:22 +02:00
|
|
|
|
- (void)initStageLabel {
|
|
|
|
|
|
_stageLabel = [[NSTextField alloc] initWithFrame:NSMakeRect(NSScreen.mainScreen.frame.size.width/2 - 100, NSScreen.mainScreen.frame.size.height/2 - 8, 200, 17)];
|
|
|
|
|
|
_stageLabel.drawsBackground = false;
|
|
|
|
|
|
_stageLabel.bordered = false;
|
|
|
|
|
|
_stageLabel.alignment = NSTextAlignmentCenter;
|
|
|
|
|
|
_stageLabel.textColor = [NSColor blackColor];
|
|
|
|
|
|
|
|
|
|
|
|
[self addSubview:_stageLabel];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
- (void)toggleStats {
|
|
|
|
|
|
if (_overlay == nil) {
|
|
|
|
|
|
_overlay = [[OverlayView alloc] initWithFrame:self.frame sender:self];
|
|
|
|
|
|
[self addSubview:_overlay];
|
|
|
|
|
|
}
|
|
|
|
|
|
[_overlay toggleOverlay:_codec];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
- (void)drawMessage:(NSString*)message {
|
|
|
|
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
|
|
|
if (self->_stageLabel == nil) {
|
|
|
|
|
|
[self initStageLabel];
|
|
|
|
|
|
}
|
|
|
|
|
|
self->_stageLabel.stringValue = message;
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-03-27 08:50:40 +02:00
|
|
|
|
- (BOOL)acceptsFirstResponder {
|
|
|
|
|
|
return YES;
|
|
|
|
|
|
}
|
|
|
|
|
|
@end
|