|
Packit Service |
fa4841 |
/**
|
|
Packit Service |
fa4841 |
* FreeRDP: A Remote Desktop Protocol Implementation
|
|
Packit Service |
fa4841 |
* MacFreeRDP
|
|
Packit Service |
fa4841 |
*
|
|
Packit Service |
fa4841 |
* Copyright 2012 Thomas Goddard
|
|
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 |
#include <winpr/windows.h>
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
#include "mf_client.h"
|
|
Packit Service |
fa4841 |
#import "mfreerdp.h"
|
|
Packit Service |
fa4841 |
#import "MRDPView.h"
|
|
Packit Service |
fa4841 |
#import "MRDPCursor.h"
|
|
Packit Service |
fa4841 |
#import "Clipboard.h"
|
|
Packit Service |
fa4841 |
#import "PasswordDialog.h"
|
|
Packit Service |
fa4841 |
#import "CertificateDialog.h"
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
#include <winpr/crt.h>
|
|
Packit Service |
fa4841 |
#include <winpr/input.h>
|
|
Packit Service |
fa4841 |
#include <winpr/synch.h>
|
|
Packit Service |
fa4841 |
#include <winpr/sysinfo.h>
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
#include <freerdp/constants.h>
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
#import "freerdp/freerdp.h"
|
|
Packit Service |
fa4841 |
#import "freerdp/types.h"
|
|
Packit Service |
fa4841 |
#import "freerdp/channels/channels.h"
|
|
Packit Service |
fa4841 |
#import "freerdp/gdi/gdi.h"
|
|
Packit Service |
fa4841 |
#import "freerdp/gdi/dc.h"
|
|
Packit Service |
fa4841 |
#import "freerdp/gdi/region.h"
|
|
Packit Service |
fa4841 |
#import "freerdp/graphics.h"
|
|
Packit Service |
fa4841 |
#import "freerdp/client/file.h"
|
|
Packit Service |
fa4841 |
#import "freerdp/client/cmdline.h"
|
|
Packit Service |
fa4841 |
#import "freerdp/log.h"
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
#import <CoreGraphics/CoreGraphics.h>
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
#define TAG CLIENT_TAG("mac")
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
static BOOL mf_Pointer_New(rdpContext *context, rdpPointer *pointer);
|
|
Packit Service |
fa4841 |
static void mf_Pointer_Free(rdpContext *context, rdpPointer *pointer);
|
|
Packit Service |
fa4841 |
static BOOL mf_Pointer_Set(rdpContext *context, const rdpPointer *pointer);
|
|
Packit Service |
fa4841 |
static BOOL mf_Pointer_SetNull(rdpContext *context);
|
|
Packit Service |
fa4841 |
static BOOL mf_Pointer_SetDefault(rdpContext *context);
|
|
Packit Service |
fa4841 |
static BOOL mf_Pointer_SetPosition(rdpContext *context, UINT32 x, UINT32 y);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
static BOOL mac_begin_paint(rdpContext *context);
|
|
Packit Service |
fa4841 |
static BOOL mac_end_paint(rdpContext *context);
|
|
Packit Service |
fa4841 |
static BOOL mac_desktop_resize(rdpContext *context);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
static void input_activity_cb(freerdp *instance);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
static DWORD WINAPI mac_client_thread(void *param);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
@implementation MRDPView
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
@synthesize is_connected;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (int)rdpStart:(rdpContext *)rdp_context
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
rdpSettings *settings;
|
|
Packit Service |
fa4841 |
EmbedWindowEventArgs e;
|
|
Packit Service |
fa4841 |
[self initializeView];
|
|
Packit Service |
fa4841 |
context = rdp_context;
|
|
Packit Service |
fa4841 |
mfc = (mfContext *)rdp_context;
|
|
Packit Service |
fa4841 |
instance = context->instance;
|
|
Packit Service |
fa4841 |
settings = context->settings;
|
|
Packit Service |
fa4841 |
EventArgsInit(&e, "mfreerdp");
|
|
Packit Service |
fa4841 |
e.embed = TRUE;
|
|
Packit Service |
fa4841 |
e.handle = (void *)self;
|
|
Packit Service |
fa4841 |
PubSub_OnEmbedWindow(context->pubSub, context, &e);
|
|
Packit Service |
fa4841 |
NSScreen *screen = [[NSScreen screens] objectAtIndex:0];
|
|
Packit Service |
fa4841 |
NSRect screenFrame = [screen frame];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (instance->settings->Fullscreen)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
instance->settings->DesktopWidth = screenFrame.size.width;
|
|
Packit Service |
fa4841 |
instance->settings->DesktopHeight = screenFrame.size.height;
|
|
Packit Service |
fa4841 |
[self enterFullScreenMode:[NSScreen mainScreen] withOptions:nil];
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
else
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
[self exitFullScreenModeWithOptions:nil];
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
mfc->client_height = instance->settings->DesktopHeight;
|
|
Packit Service |
fa4841 |
mfc->client_width = instance->settings->DesktopWidth;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!(mfc->thread =
|
|
Packit Service |
fa4841 |
CreateThread(NULL, 0, mac_client_thread, (void *)context, 0, &mfc->mainThreadId)))
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
WLog_ERR(TAG, "failed to create client thread");
|
|
Packit Service |
fa4841 |
return -1;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
return 0;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
static DWORD WINAPI mac_client_input_thread(LPVOID param)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
int status;
|
|
Packit Service |
fa4841 |
wMessage message;
|
|
Packit Service |
fa4841 |
wMessageQueue *queue;
|
|
Packit Service |
fa4841 |
rdpContext *context = (rdpContext *)param;
|
|
Packit Service |
fa4841 |
status = 1;
|
|
Packit Service |
fa4841 |
queue = freerdp_get_message_queue(context->instance, FREERDP_INPUT_MESSAGE_QUEUE);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
while (MessageQueue_Wait(queue))
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
while (MessageQueue_Peek(queue, &message, TRUE))
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
status = freerdp_message_queue_process_message(context->instance,
|
|
Packit Service |
fa4841 |
FREERDP_INPUT_MESSAGE_QUEUE, &message);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!status)
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!status)
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
ExitThread(0);
|
|
Packit Service |
fa4841 |
return 0;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
DWORD WINAPI mac_client_thread(void *param)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
@autoreleasepool
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
int status;
|
|
Packit Service |
fa4841 |
DWORD rc;
|
|
Packit Service |
fa4841 |
HANDLE events[16];
|
|
Packit Service |
fa4841 |
HANDLE inputEvent;
|
|
Packit Service |
fa4841 |
HANDLE inputThread = NULL;
|
|
Packit Service |
fa4841 |
DWORD nCount;
|
|
Packit Service |
fa4841 |
DWORD nCountTmp;
|
|
Packit Service |
fa4841 |
DWORD nCountBase;
|
|
Packit Service |
fa4841 |
rdpContext *context = (rdpContext *)param;
|
|
Packit Service |
fa4841 |
mfContext *mfc = (mfContext *)context;
|
|
Packit Service |
fa4841 |
freerdp *instance = context->instance;
|
|
Packit Service |
fa4841 |
MRDPView *view = mfc->view;
|
|
Packit Service |
fa4841 |
rdpSettings *settings = context->settings;
|
|
Packit Service |
fa4841 |
status = freerdp_connect(context->instance);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!status)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
[view setIs_connected:0];
|
|
Packit Service |
fa4841 |
return 0;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
[view setIs_connected:1];
|
|
Packit Service |
fa4841 |
nCount = 0;
|
|
Packit Service |
fa4841 |
events[nCount++] = mfc->stopEvent;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (settings->AsyncInput)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
if (!(inputThread = CreateThread(NULL, 0, mac_client_input_thread, context, 0, NULL)))
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
WLog_ERR(TAG, "failed to create async input thread");
|
|
Packit Service |
fa4841 |
goto disconnect;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
else
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
if (!(inputEvent = freerdp_get_message_queue_event_handle(instance,
|
|
Packit Service |
fa4841 |
FREERDP_INPUT_MESSAGE_QUEUE)))
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
WLog_ERR(TAG, "failed to get input event handle");
|
|
Packit Service |
fa4841 |
goto disconnect;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
events[nCount++] = inputEvent;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
nCountBase = nCount;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
while (!freerdp_shall_disconnect(instance))
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
nCount = nCountBase;
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
if (!(nCountTmp = freerdp_get_event_handles(context, &events[nCount], 16 - nCount)))
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
WLog_ERR(TAG, "freerdp_get_event_handles failed");
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
nCount += nCountTmp;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
rc = WaitForMultipleObjects(nCount, events, FALSE, INFINITE);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (rc >= (WAIT_OBJECT_0 + nCount))
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
WLog_ERR(TAG, "WaitForMultipleObjects failed (0x%08X)", rc);
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (rc == WAIT_OBJECT_0)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
/* stop event triggered */
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!settings->AsyncInput)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
if (WaitForSingleObject(inputEvent, 0) == WAIT_OBJECT_0)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
input_activity_cb(instance);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
if (!freerdp_check_event_handles(context))
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
WLog_ERR(TAG, "freerdp_check_event_handles failed");
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
disconnect:
|
|
Packit Service |
fa4841 |
[view setIs_connected:0];
|
|
Packit Service |
fa4841 |
freerdp_disconnect(instance);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (settings->AsyncInput && inputThread)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
wMessageQueue *inputQueue =
|
|
Packit Service |
fa4841 |
freerdp_get_message_queue(instance, FREERDP_INPUT_MESSAGE_QUEUE);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (inputQueue)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
MessageQueue_PostQuit(inputQueue, 0);
|
|
Packit Service |
fa4841 |
WaitForSingleObject(inputThread, INFINITE);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
CloseHandle(inputThread);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
ExitThread(0);
|
|
Packit Service |
fa4841 |
return 0;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (id)initWithFrame:(NSRect)frame
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
self = [super initWithFrame:frame];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (self)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
// Initialization code here.
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
return self;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)viewDidLoad
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
[self initializeView];
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)initializeView
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
if (!initialized)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
cursors = [[NSMutableArray alloc] initWithCapacity:10];
|
|
Packit Service |
fa4841 |
// setup a mouse tracking area
|
|
Packit Service |
fa4841 |
NSTrackingArea *trackingArea = [[NSTrackingArea alloc]
|
|
Packit Service |
fa4841 |
initWithRect:[self visibleRect]
|
|
Packit Service |
fa4841 |
options:NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved |
|
|
Packit Service |
fa4841 |
NSTrackingCursorUpdate | NSTrackingEnabledDuringMouseDrag |
|
|
Packit Service |
fa4841 |
NSTrackingActiveWhenFirstResponder
|
|
Packit Service |
fa4841 |
owner:self
|
|
Packit Service |
fa4841 |
userInfo:nil];
|
|
Packit Service |
fa4841 |
[self addTrackingArea:trackingArea];
|
|
Packit Service |
fa4841 |
// Set the default cursor
|
|
Packit Service |
fa4841 |
currentCursor = [NSCursor arrowCursor];
|
|
Packit Service |
fa4841 |
initialized = YES;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)setCursor:(NSCursor *)cursor
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
self->currentCursor = cursor;
|
|
Packit Service |
fa4841 |
dispatch_async(dispatch_get_main_queue(), ^{
|
|
Packit Service |
fa4841 |
[[self window] invalidateCursorRectsForView:self];
|
|
Packit Service |
fa4841 |
});
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)resetCursorRects
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
[self addCursorRect:[self visibleRect] cursor:currentCursor];
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (BOOL)acceptsFirstResponder
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
return YES;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)mouseMoved:(NSEvent *)event
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
[super mouseMoved:event];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!self.is_connected)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
NSPoint loc = [event locationInWindow];
|
|
Packit Service |
fa4841 |
int x = (int)loc.x;
|
|
Packit Service |
fa4841 |
int y = (int)loc.y;
|
|
Packit Service |
fa4841 |
mf_scale_mouse_event(context, instance->input, PTR_FLAGS_MOVE, x, y);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)mouseDown:(NSEvent *)event
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
[super mouseDown:event];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!self.is_connected)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
NSPoint loc = [event locationInWindow];
|
|
Packit Service |
fa4841 |
int x = (int)loc.x;
|
|
Packit Service |
fa4841 |
int y = (int)loc.y;
|
|
Packit Service |
fa4841 |
mf_press_mouse_button(context, instance->input, 0, x, y, TRUE);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)mouseUp:(NSEvent *)event
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
[super mouseUp:event];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!self.is_connected)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
NSPoint loc = [event locationInWindow];
|
|
Packit Service |
fa4841 |
int x = (int)loc.x;
|
|
Packit Service |
fa4841 |
int y = (int)loc.y;
|
|
Packit Service |
fa4841 |
mf_press_mouse_button(context, instance->input, 0, x, y, FALSE);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)rightMouseDown:(NSEvent *)event
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
[super rightMouseDown:event];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!self.is_connected)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
NSPoint loc = [event locationInWindow];
|
|
Packit Service |
fa4841 |
int x = (int)loc.x;
|
|
Packit Service |
fa4841 |
int y = (int)loc.y;
|
|
Packit Service |
fa4841 |
mf_press_mouse_button(context, instance->input, 1, x, y, TRUE);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)rightMouseUp:(NSEvent *)event
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
[super rightMouseUp:event];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!self.is_connected)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
NSPoint loc = [event locationInWindow];
|
|
Packit Service |
fa4841 |
int x = (int)loc.x;
|
|
Packit Service |
fa4841 |
int y = (int)loc.y;
|
|
Packit Service |
fa4841 |
mf_press_mouse_button(context, instance->input, 1, x, y, FALSE);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)otherMouseDown:(NSEvent *)event
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
[super otherMouseDown:event];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!self.is_connected)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
NSPoint loc = [event locationInWindow];
|
|
Packit Service |
fa4841 |
int x = (int)loc.x;
|
|
Packit Service |
fa4841 |
int y = (int)loc.y;
|
|
Packit Service |
fa4841 |
int pressed = [event buttonNumber];
|
|
Packit Service |
fa4841 |
mf_press_mouse_button(context, instance->input, pressed, x, y, TRUE);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)otherMouseUp:(NSEvent *)event
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
[super otherMouseUp:event];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!self.is_connected)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
NSPoint loc = [event locationInWindow];
|
|
Packit Service |
fa4841 |
int x = (int)loc.x;
|
|
Packit Service |
fa4841 |
int y = (int)loc.y;
|
|
Packit Service |
fa4841 |
int pressed = [event buttonNumber];
|
|
Packit Service |
fa4841 |
mf_press_mouse_button(context, instance->input, pressed, x, y, FALSE);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)scrollWheel:(NSEvent *)event
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
UINT16 flags;
|
|
Packit Service |
fa4841 |
[super scrollWheel:event];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!self.is_connected)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
float dx = [event deltaX];
|
|
Packit Service |
fa4841 |
float dy = [event deltaY];
|
|
Packit Service |
fa4841 |
/* 1 event = 120 units */
|
|
Packit Service |
fa4841 |
UINT16 units = 0;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (fabsf(dy) > FLT_EPSILON)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
flags = PTR_FLAGS_HWHEEL;
|
|
Packit Service |
fa4841 |
units = fabsf(dy) * 120;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (dy < 0)
|
|
Packit Service |
fa4841 |
flags |= PTR_FLAGS_WHEEL_NEGATIVE;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
else if (fabsf(dx) > FLT_EPSILON)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
flags = PTR_FLAGS_WHEEL;
|
|
Packit Service |
fa4841 |
units = fabsf(dx) * 120;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (dx > 0)
|
|
Packit Service |
fa4841 |
flags |= PTR_FLAGS_WHEEL_NEGATIVE;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
else
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
/* send out all accumulated rotations */
|
|
Packit Service |
fa4841 |
if (units > WheelRotationMask)
|
|
Packit Service |
fa4841 |
units = WheelRotationMask;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
while (units != 0)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
/* limit to maximum value in WheelRotationMask (9bit signed value) */
|
|
Packit Service |
fa4841 |
const UINT16 step = units & WheelRotationMask;
|
|
Packit Service |
fa4841 |
mf_scale_mouse_event(context, instance->input, flags | step, 0, 0);
|
|
Packit Service |
fa4841 |
units -= step;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)mouseDragged:(NSEvent *)event
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
[super mouseDragged:event];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!self.is_connected)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
NSPoint loc = [event locationInWindow];
|
|
Packit Service |
fa4841 |
int x = (int)loc.x;
|
|
Packit Service |
fa4841 |
int y = (int)loc.y;
|
|
Packit Service |
fa4841 |
// send mouse motion event to RDP server
|
|
Packit Service |
fa4841 |
mf_scale_mouse_event(context, instance->input, PTR_FLAGS_MOVE, x, y);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
DWORD fixKeyCode(DWORD keyCode, unichar keyChar, enum APPLE_KEYBOARD_TYPE type)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
/**
|
|
Packit Service |
fa4841 |
* In 99% of cases, the given key code is truly keyboard independent.
|
|
Packit Service |
fa4841 |
* This function handles the remaining 1% of edge cases.
|
|
Packit Service |
fa4841 |
*
|
|
Packit Service |
fa4841 |
* Hungarian Keyboard: This is 'QWERTZ' and not 'QWERTY'.
|
|
Packit Service |
fa4841 |
* The '0' key is on the left of the '1' key, where '~' is on a US keyboard.
|
|
Packit Service |
fa4841 |
* A special 'i' letter key with acute is found on the right of the left shift key.
|
|
Packit Service |
fa4841 |
* On the hungarian keyboard, the 'i' key is at the left of the 'Y' key
|
|
Packit Service |
fa4841 |
* Some international keyboards have a corresponding key which would be at
|
|
Packit Service |
fa4841 |
* the left of the 'Z' key when using a QWERTY layout.
|
|
Packit Service |
fa4841 |
*
|
|
Packit Service |
fa4841 |
* The Apple Hungarian keyboard sends inverted key codes for the '0' and 'i' keys.
|
|
Packit Service |
fa4841 |
* When using the US keyboard layout, key codes are left as-is (inverted).
|
|
Packit Service |
fa4841 |
* When using the Hungarian keyboard layout, key codes are swapped (non-inverted).
|
|
Packit Service |
fa4841 |
* This means that when using the Hungarian keyboard layout with a US keyboard,
|
|
Packit Service |
fa4841 |
* the keys corresponding to '0' and 'i' will effectively be inverted.
|
|
Packit Service |
fa4841 |
*
|
|
Packit Service |
fa4841 |
* To fix the '0' and 'i' key inversion, we use the corresponding output character
|
|
Packit Service |
fa4841 |
* provided by OS X and check for a character to key code mismatch: for instance,
|
|
Packit Service |
fa4841 |
* when the output character is '0' for the key code corresponding to the 'i' key.
|
|
Packit Service |
fa4841 |
*/
|
|
Packit Service |
fa4841 |
#if 0
|
|
Packit Service |
fa4841 |
switch (keyChar)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
case '0':
|
|
Packit Service |
fa4841 |
case 0x00A7: /* section sign */
|
|
Packit Service |
fa4841 |
if (keyCode == APPLE_VK_ISO_Section)
|
|
Packit Service |
fa4841 |
keyCode = APPLE_VK_ANSI_Grave;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
case 0x00ED: /* latin small letter i with acute */
|
|
Packit Service |
fa4841 |
case 0x00CD: /* latin capital letter i with acute */
|
|
Packit Service |
fa4841 |
if (keyCode == APPLE_VK_ANSI_Grave)
|
|
Packit Service |
fa4841 |
keyCode = APPLE_VK_ISO_Section;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
#endif
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
/* Perform keycode correction for all ISO keyboards */
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (type == APPLE_KEYBOARD_TYPE_ISO)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
if (keyCode == APPLE_VK_ANSI_Grave)
|
|
Packit Service |
fa4841 |
keyCode = APPLE_VK_ISO_Section;
|
|
Packit Service |
fa4841 |
else if (keyCode == APPLE_VK_ISO_Section)
|
|
Packit Service |
fa4841 |
keyCode = APPLE_VK_ANSI_Grave;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
return keyCode;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)keyDown:(NSEvent *)event
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
DWORD keyCode;
|
|
Packit Service |
fa4841 |
DWORD keyFlags;
|
|
Packit Service |
fa4841 |
DWORD vkcode;
|
|
Packit Service |
fa4841 |
DWORD scancode;
|
|
Packit Service |
fa4841 |
unichar keyChar;
|
|
Packit Service |
fa4841 |
NSString *characters;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!is_connected)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
keyFlags = KBD_FLAGS_DOWN;
|
|
Packit Service |
fa4841 |
keyCode = [event keyCode];
|
|
Packit Service |
fa4841 |
characters = [event charactersIgnoringModifiers];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if ([characters length] > 0)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
keyChar = [characters characterAtIndex:0];
|
|
Packit Service |
fa4841 |
keyCode = fixKeyCode(keyCode, keyChar, mfc->appleKeyboardType);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
vkcode = GetVirtualKeyCodeFromKeycode(keyCode + 8, KEYCODE_TYPE_APPLE);
|
|
Packit Service |
fa4841 |
scancode = GetVirtualScanCodeFromVirtualKeyCode(vkcode, 4);
|
|
Packit Service |
fa4841 |
keyFlags |= (scancode & KBDEXT) ? KBDEXT : 0;
|
|
Packit Service |
fa4841 |
scancode &= 0xFF;
|
|
Packit Service |
fa4841 |
vkcode &= 0xFF;
|
|
Packit Service |
fa4841 |
#if 0
|
|
Packit Service |
fa4841 |
WLog_ERR(TAG,
|
|
Packit Service |
fa4841 |
"keyDown: keyCode: 0x%04X scancode: 0x%04X vkcode: 0x%04X keyFlags: %d name: %s",
|
|
Packit Service |
fa4841 |
keyCode, scancode, vkcode, keyFlags, GetVirtualKeyName(vkcode));
|
|
Packit Service |
fa4841 |
#endif
|
|
Packit Service |
fa4841 |
sync_keyboard_state(instance);
|
|
Packit Service |
fa4841 |
freerdp_input_send_keyboard_event(instance->input, keyFlags, scancode);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)keyUp:(NSEvent *)event
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
DWORD keyCode;
|
|
Packit Service |
fa4841 |
DWORD keyFlags;
|
|
Packit Service |
fa4841 |
DWORD vkcode;
|
|
Packit Service |
fa4841 |
DWORD scancode;
|
|
Packit Service |
fa4841 |
unichar keyChar;
|
|
Packit Service |
fa4841 |
NSString *characters;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!is_connected)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
keyFlags = KBD_FLAGS_RELEASE;
|
|
Packit Service |
fa4841 |
keyCode = [event keyCode];
|
|
Packit Service |
fa4841 |
characters = [event charactersIgnoringModifiers];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if ([characters length] > 0)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
keyChar = [characters characterAtIndex:0];
|
|
Packit Service |
fa4841 |
keyCode = fixKeyCode(keyCode, keyChar, mfc->appleKeyboardType);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
vkcode = GetVirtualKeyCodeFromKeycode(keyCode + 8, KEYCODE_TYPE_APPLE);
|
|
Packit Service |
fa4841 |
scancode = GetVirtualScanCodeFromVirtualKeyCode(vkcode, 4);
|
|
Packit Service |
fa4841 |
keyFlags |= (scancode & KBDEXT) ? KBDEXT : 0;
|
|
Packit Service |
fa4841 |
scancode &= 0xFF;
|
|
Packit Service |
fa4841 |
vkcode &= 0xFF;
|
|
Packit Service |
fa4841 |
#if 0
|
|
Packit Service |
fa4841 |
WLog_DBG(TAG,
|
|
Packit Service |
fa4841 |
"keyUp: key: 0x%04X scancode: 0x%04X vkcode: 0x%04X keyFlags: %d name: %s",
|
|
Packit Service |
fa4841 |
keyCode, scancode, vkcode, keyFlags, GetVirtualKeyName(vkcode));
|
|
Packit Service |
fa4841 |
#endif
|
|
Packit Service |
fa4841 |
freerdp_input_send_keyboard_event(instance->input, keyFlags, scancode);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)flagsChanged:(NSEvent *)event
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
int key;
|
|
Packit Service |
fa4841 |
DWORD keyFlags;
|
|
Packit Service |
fa4841 |
DWORD vkcode;
|
|
Packit Service |
fa4841 |
DWORD scancode;
|
|
Packit Service |
fa4841 |
DWORD modFlags;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!is_connected)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
keyFlags = 0;
|
|
Packit Service |
fa4841 |
key = [event keyCode] + 8;
|
|
Packit Service |
fa4841 |
modFlags = [event modifierFlags] & NSDeviceIndependentModifierFlagsMask;
|
|
Packit Service |
fa4841 |
vkcode = GetVirtualKeyCodeFromKeycode(key, KEYCODE_TYPE_APPLE);
|
|
Packit Service |
fa4841 |
scancode = GetVirtualScanCodeFromVirtualKeyCode(vkcode, 4);
|
|
Packit Service |
fa4841 |
keyFlags |= (scancode & KBDEXT) ? KBDEXT : 0;
|
|
Packit Service |
fa4841 |
scancode &= 0xFF;
|
|
Packit Service |
fa4841 |
vkcode &= 0xFF;
|
|
Packit Service |
fa4841 |
#if 0
|
|
Packit Service |
fa4841 |
WLog_DBG(TAG,
|
|
Packit Service |
fa4841 |
"flagsChanged: key: 0x%04X scancode: 0x%04X vkcode: 0x%04X extended: %d name: %s modFlags: 0x%04X",
|
|
Packit Service |
fa4841 |
key - 8, scancode, vkcode, keyFlags, GetVirtualKeyName(vkcode), modFlags);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (modFlags & NSAlphaShiftKeyMask)
|
|
Packit Service |
fa4841 |
WLog_DBG(TAG, "NSAlphaShiftKeyMask");
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (modFlags & NSShiftKeyMask)
|
|
Packit Service |
fa4841 |
WLog_DBG(TAG, "NSShiftKeyMask");
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (modFlags & NSControlKeyMask)
|
|
Packit Service |
fa4841 |
WLog_DBG(TAG, "NSControlKeyMask");
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (modFlags & NSAlternateKeyMask)
|
|
Packit Service |
fa4841 |
WLog_DBG(TAG, "NSAlternateKeyMask");
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (modFlags & NSCommandKeyMask)
|
|
Packit Service |
fa4841 |
WLog_DBG(TAG, "NSCommandKeyMask");
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (modFlags & NSNumericPadKeyMask)
|
|
Packit Service |
fa4841 |
WLog_DBG(TAG, "NSNumericPadKeyMask");
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (modFlags & NSHelpKeyMask)
|
|
Packit Service |
fa4841 |
WLog_DBG(TAG, "NSHelpKeyMask");
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
#endif
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if ((modFlags & NSAlphaShiftKeyMask) && !(kbdModFlags & NSAlphaShiftKeyMask))
|
|
Packit Service |
fa4841 |
freerdp_input_send_keyboard_event(instance->input, keyFlags | KBD_FLAGS_DOWN, scancode);
|
|
Packit Service |
fa4841 |
else if (!(modFlags & NSAlphaShiftKeyMask) && (kbdModFlags & NSAlphaShiftKeyMask))
|
|
Packit Service |
fa4841 |
freerdp_input_send_keyboard_event(instance->input, keyFlags | KBD_FLAGS_RELEASE, scancode);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if ((modFlags & NSShiftKeyMask) && !(kbdModFlags & NSShiftKeyMask))
|
|
Packit Service |
fa4841 |
freerdp_input_send_keyboard_event(instance->input, keyFlags | KBD_FLAGS_DOWN, scancode);
|
|
Packit Service |
fa4841 |
else if (!(modFlags & NSShiftKeyMask) && (kbdModFlags & NSShiftKeyMask))
|
|
Packit Service |
fa4841 |
freerdp_input_send_keyboard_event(instance->input, keyFlags | KBD_FLAGS_RELEASE, scancode);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if ((modFlags & NSControlKeyMask) && !(kbdModFlags & NSControlKeyMask))
|
|
Packit Service |
fa4841 |
freerdp_input_send_keyboard_event(instance->input, keyFlags | KBD_FLAGS_DOWN, scancode);
|
|
Packit Service |
fa4841 |
else if (!(modFlags & NSControlKeyMask) && (kbdModFlags & NSControlKeyMask))
|
|
Packit Service |
fa4841 |
freerdp_input_send_keyboard_event(instance->input, keyFlags | KBD_FLAGS_RELEASE, scancode);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if ((modFlags & NSAlternateKeyMask) && !(kbdModFlags & NSAlternateKeyMask))
|
|
Packit Service |
fa4841 |
freerdp_input_send_keyboard_event(instance->input, keyFlags | KBD_FLAGS_DOWN, scancode);
|
|
Packit Service |
fa4841 |
else if (!(modFlags & NSAlternateKeyMask) && (kbdModFlags & NSAlternateKeyMask))
|
|
Packit Service |
fa4841 |
freerdp_input_send_keyboard_event(instance->input, keyFlags | KBD_FLAGS_RELEASE, scancode);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if ((modFlags & NSCommandKeyMask) && !(kbdModFlags & NSCommandKeyMask))
|
|
Packit Service |
fa4841 |
freerdp_input_send_keyboard_event(instance->input, keyFlags | KBD_FLAGS_DOWN, scancode);
|
|
Packit Service |
fa4841 |
else if (!(modFlags & NSCommandKeyMask) && (kbdModFlags & NSCommandKeyMask))
|
|
Packit Service |
fa4841 |
freerdp_input_send_keyboard_event(instance->input, keyFlags | KBD_FLAGS_RELEASE, scancode);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if ((modFlags & NSNumericPadKeyMask) && !(kbdModFlags & NSNumericPadKeyMask))
|
|
Packit Service |
fa4841 |
freerdp_input_send_keyboard_event(instance->input, keyFlags | KBD_FLAGS_DOWN, scancode);
|
|
Packit Service |
fa4841 |
else if (!(modFlags & NSNumericPadKeyMask) && (kbdModFlags & NSNumericPadKeyMask))
|
|
Packit Service |
fa4841 |
freerdp_input_send_keyboard_event(instance->input, keyFlags | KBD_FLAGS_RELEASE, scancode);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if ((modFlags & NSHelpKeyMask) && !(kbdModFlags & NSHelpKeyMask))
|
|
Packit Service |
fa4841 |
freerdp_input_send_keyboard_event(instance->input, keyFlags | KBD_FLAGS_DOWN, scancode);
|
|
Packit Service |
fa4841 |
else if (!(modFlags & NSHelpKeyMask) && (kbdModFlags & NSHelpKeyMask))
|
|
Packit Service |
fa4841 |
freerdp_input_send_keyboard_event(instance->input, keyFlags | KBD_FLAGS_RELEASE, scancode);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
kbdModFlags = modFlags;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)releaseResources
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
int i;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
for (i = 0; i < argc; i++)
|
|
Packit Service |
fa4841 |
free(argv[i]);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!is_connected)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
free(pixel_data);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)drawRect:(NSRect)rect
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
if (!context)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (self->bitmap_context)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
CGContextRef cgContext = [[NSGraphicsContext currentContext] graphicsPort];
|
|
Packit Service |
fa4841 |
CGImageRef cgImage = CGBitmapContextCreateImage(self->bitmap_context);
|
|
Packit Service |
fa4841 |
CGContextSaveGState(cgContext);
|
|
Packit Service |
fa4841 |
CGContextClipToRect(
|
|
Packit Service |
fa4841 |
cgContext, CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height));
|
|
Packit Service |
fa4841 |
CGContextDrawImage(cgContext,
|
|
Packit Service |
fa4841 |
CGRectMake(0, 0, [self bounds].size.width, [self bounds].size.height),
|
|
Packit Service |
fa4841 |
cgImage);
|
|
Packit Service |
fa4841 |
CGContextRestoreGState(cgContext);
|
|
Packit Service |
fa4841 |
CGImageRelease(cgImage);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
else
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
/* Fill the screen with black */
|
|
Packit Service |
fa4841 |
[[NSColor blackColor] set];
|
|
Packit Service |
fa4841 |
NSRectFill([self bounds]);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)onPasteboardTimerFired:(NSTimer *)timer
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
const BYTE *data;
|
|
Packit Service |
fa4841 |
UINT32 size;
|
|
Packit Service |
fa4841 |
UINT32 formatId;
|
|
Packit Service |
fa4841 |
BOOL formatMatch;
|
|
Packit Service |
fa4841 |
int changeCount;
|
|
Packit Service |
fa4841 |
NSData *formatData;
|
|
Packit Service |
fa4841 |
const char *formatType;
|
|
Packit Service |
fa4841 |
NSPasteboardItem *item;
|
|
Packit Service |
fa4841 |
changeCount = (int)[pasteboard_rd changeCount];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (changeCount == pasteboard_changecount)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
pasteboard_changecount = changeCount;
|
|
Packit Service |
fa4841 |
NSArray *items = [pasteboard_rd pasteboardItems];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if ([items count] < 1)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
item = [items objectAtIndex:0];
|
|
Packit Service |
fa4841 |
/**
|
|
Packit Service |
fa4841 |
* System-Declared Uniform Type Identifiers:
|
|
Packit Service |
fa4841 |
* https://developer.apple.com/library/ios/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html
|
|
Packit Service |
fa4841 |
*/
|
|
Packit Service |
fa4841 |
formatMatch = FALSE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
for (NSString *type in [item types])
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
formatType = [type UTF8String];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (strcmp(formatType, "public.utf8-plain-text") == 0)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
formatData = [item dataForType:type];
|
|
Packit Service |
fa4841 |
formatId = ClipboardRegisterFormat(mfc->clipboard, "UTF8_STRING");
|
|
Packit Service |
fa4841 |
size = (UINT32)[formatData length];
|
|
Packit Service |
fa4841 |
data = [formatData bytes];
|
|
Packit Service |
fa4841 |
/* size is the string length without the terminating NULL terminator */
|
|
Packit Service |
fa4841 |
ClipboardSetData(mfc->clipboard, formatId, data, size + 1);
|
|
Packit Service |
fa4841 |
formatMatch = TRUE;
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!formatMatch)
|
|
Packit Service |
fa4841 |
ClipboardEmpty(mfc->clipboard);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (mfc->clipboardSync)
|
|
Packit Service |
fa4841 |
mac_cliprdr_send_client_format_list(mfc->cliprdr);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)pause
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
dispatch_async(dispatch_get_main_queue(), ^{
|
|
Packit Service |
fa4841 |
[self->pasteboard_timer invalidate];
|
|
Packit Service |
fa4841 |
});
|
|
Packit Service |
fa4841 |
NSArray *trackingAreas = self.trackingAreas;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
for (NSTrackingArea *ta in trackingAreas)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
[self removeTrackingArea:ta];
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)resume
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
if (!self.is_connected)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
dispatch_async(dispatch_get_main_queue(), ^{
|
|
Packit Service |
fa4841 |
self->pasteboard_timer =
|
|
Packit Service |
fa4841 |
[NSTimer scheduledTimerWithTimeInterval:0.5
|
|
Packit Service |
fa4841 |
target:self
|
|
Packit Service |
fa4841 |
selector:@selector(onPasteboardTimerFired:)
|
|
Packit Service |
fa4841 |
userInfo:nil
|
|
Packit Service |
fa4841 |
repeats:YES];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
NSTrackingArea *trackingArea = [[NSTrackingArea alloc]
|
|
Packit Service |
fa4841 |
initWithRect:[self visibleRect]
|
|
Packit Service |
fa4841 |
options:NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved |
|
|
Packit Service |
fa4841 |
NSTrackingCursorUpdate | NSTrackingEnabledDuringMouseDrag |
|
|
Packit Service |
fa4841 |
NSTrackingActiveWhenFirstResponder
|
|
Packit Service |
fa4841 |
owner:self
|
|
Packit Service |
fa4841 |
userInfo:nil];
|
|
Packit Service |
fa4841 |
[self addTrackingArea:trackingArea];
|
|
Packit Service |
fa4841 |
[trackingArea release];
|
|
Packit Service |
fa4841 |
});
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
- (void)setScrollOffset:(int)xOffset y:(int)yOffset w:(int)width h:(int)height
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
mfc->yCurrentScroll = yOffset;
|
|
Packit Service |
fa4841 |
mfc->xCurrentScroll = xOffset;
|
|
Packit Service |
fa4841 |
mfc->client_height = height;
|
|
Packit Service |
fa4841 |
mfc->client_width = width;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
void mac_OnChannelConnectedEventHandler(void *context, ChannelConnectedEventArgs *e)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
mfContext *mfc = (mfContext *)context;
|
|
Packit Service |
fa4841 |
rdpSettings *settings = mfc->context.settings;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (strcmp(e->name, RDPEI_DVC_CHANNEL_NAME) == 0)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
else if (strcmp(e->name, RDPGFX_DVC_CHANNEL_NAME) == 0)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
if (settings->SoftwareGdi)
|
|
Packit Service |
fa4841 |
gdi_graphics_pipeline_init(mfc->context.gdi, (RdpgfxClientContext *)e->pInterface);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
else if (strcmp(e->name, CLIPRDR_SVC_CHANNEL_NAME) == 0)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
mac_cliprdr_init(mfc, (CliprdrClientContext *)e->pInterface);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
else if (strcmp(e->name, ENCOMSP_SVC_CHANNEL_NAME) == 0)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
void mac_OnChannelDisconnectedEventHandler(void *context, ChannelDisconnectedEventArgs *e)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
mfContext *mfc = (mfContext *)context;
|
|
Packit Service |
fa4841 |
rdpSettings *settings = mfc->context.settings;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (strcmp(e->name, RDPEI_DVC_CHANNEL_NAME) == 0)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
else if (strcmp(e->name, RDPGFX_DVC_CHANNEL_NAME) == 0)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
if (settings->SoftwareGdi)
|
|
Packit Service |
fa4841 |
gdi_graphics_pipeline_uninit(mfc->context.gdi, (RdpgfxClientContext *)e->pInterface);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
else if (strcmp(e->name, CLIPRDR_SVC_CHANNEL_NAME) == 0)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
mac_cliprdr_uninit(mfc, (CliprdrClientContext *)e->pInterface);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
else if (strcmp(e->name, ENCOMSP_SVC_CHANNEL_NAME) == 0)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
BOOL mac_pre_connect(freerdp *instance)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
rdpSettings *settings;
|
|
Packit Service |
fa4841 |
instance->update->BeginPaint = mac_begin_paint;
|
|
Packit Service |
fa4841 |
instance->update->EndPaint = mac_end_paint;
|
|
Packit Service |
fa4841 |
instance->update->DesktopResize = mac_desktop_resize;
|
|
Packit Service |
fa4841 |
settings = instance->settings;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!settings->ServerHostname)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
WLog_ERR(TAG, "error: server hostname was not specified with /v:<server>[:port]");
|
|
Packit Service |
fa4841 |
[NSApp terminate:nil];
|
|
Packit Service |
fa4841 |
return -1;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
settings->OsMajorType = OSMAJORTYPE_MACINTOSH;
|
|
Packit Service |
fa4841 |
settings->OsMinorType = OSMINORTYPE_MACINTOSH;
|
|
Packit Service |
fa4841 |
PubSub_SubscribeChannelConnected(instance->context->pubSub, mac_OnChannelConnectedEventHandler);
|
|
Packit Service |
fa4841 |
PubSub_SubscribeChannelDisconnected(instance->context->pubSub,
|
|
Packit Service |
fa4841 |
mac_OnChannelDisconnectedEventHandler);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!freerdp_client_load_addins(instance->context->channels, instance->settings))
|
|
Packit Service |
fa4841 |
return FALSE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
return TRUE;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
BOOL mac_post_connect(freerdp *instance)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
rdpGdi *gdi;
|
|
Packit Service |
fa4841 |
rdpSettings *settings;
|
|
Packit Service |
fa4841 |
rdpPointer rdp_pointer;
|
|
Packit Service |
fa4841 |
mfContext *mfc = (mfContext *)instance->context;
|
|
Packit Service |
fa4841 |
MRDPView *view = (MRDPView *)mfc->view;
|
|
Packit Service |
fa4841 |
ZeroMemory(&rdp_pointer, sizeof(rdpPointer));
|
|
Packit Service |
fa4841 |
rdp_pointer.size = sizeof(rdpPointer);
|
|
Packit Service |
fa4841 |
rdp_pointer.New = mf_Pointer_New;
|
|
Packit Service |
fa4841 |
rdp_pointer.Free = mf_Pointer_Free;
|
|
Packit Service |
fa4841 |
rdp_pointer.Set = mf_Pointer_Set;
|
|
Packit Service |
fa4841 |
rdp_pointer.SetNull = mf_Pointer_SetNull;
|
|
Packit Service |
fa4841 |
rdp_pointer.SetDefault = mf_Pointer_SetDefault;
|
|
Packit Service |
fa4841 |
rdp_pointer.SetPosition = mf_Pointer_SetPosition;
|
|
Packit Service |
fa4841 |
settings = instance->settings;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!gdi_init(instance, PIXEL_FORMAT_BGRX32))
|
|
Packit Service |
fa4841 |
return FALSE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
gdi = instance->context->gdi;
|
|
Packit Service |
fa4841 |
view->bitmap_context = mac_create_bitmap_context(instance->context);
|
|
Packit Service |
fa4841 |
graphics_register_pointer(instance->context->graphics, &rdp_pointer);
|
|
Packit Service |
fa4841 |
/* setup pasteboard (aka clipboard) for copy operations (write only) */
|
|
Packit Service |
fa4841 |
view->pasteboard_wr = [NSPasteboard generalPasteboard];
|
|
Packit Service |
fa4841 |
/* setup pasteboard for read operations */
|
|
Packit Service |
fa4841 |
dispatch_async(dispatch_get_main_queue(), ^{
|
|
Packit Service |
fa4841 |
view->pasteboard_rd = [NSPasteboard generalPasteboard];
|
|
Packit Service |
fa4841 |
view->pasteboard_changecount = -1;
|
|
Packit Service |
fa4841 |
});
|
|
Packit Service |
fa4841 |
[view resume];
|
|
Packit Service |
fa4841 |
mfc->appleKeyboardType = mac_detect_keyboard_type();
|
|
Packit Service |
fa4841 |
return TRUE;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
void mac_post_disconnect(freerdp *instance)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
mfContext *mfc;
|
|
Packit Service |
fa4841 |
MRDPView *view;
|
|
Packit Service |
fa4841 |
if (!instance || !instance->context)
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
mfc = (mfContext *)instance->context;
|
|
Packit Service |
fa4841 |
view = (MRDPView *)mfc->view;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
[view pause];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
PubSub_UnsubscribeChannelConnected(instance->context->pubSub,
|
|
Packit Service |
fa4841 |
mac_OnChannelConnectedEventHandler);
|
|
Packit Service |
fa4841 |
PubSub_UnsubscribeChannelDisconnected(instance->context->pubSub,
|
|
Packit Service |
fa4841 |
mac_OnChannelDisconnectedEventHandler);
|
|
Packit Service |
fa4841 |
gdi_free(instance);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
static BOOL mac_authenticate_int(NSString *title, freerdp *instance, char **username,
|
|
Packit Service |
fa4841 |
char **password, char **domain)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
mfContext *mfc = (mfContext *)instance->context;
|
|
Packit Service |
fa4841 |
MRDPView *view = (MRDPView *)mfc->view;
|
|
Packit Service |
fa4841 |
PasswordDialog *dialog = [PasswordDialog new];
|
|
Packit Service |
fa4841 |
dialog.serverHostname = title;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (*username)
|
|
Packit Service |
fa4841 |
dialog.username = [NSString stringWithCString:*username encoding:NSUTF8StringEncoding];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (*password)
|
|
Packit Service |
fa4841 |
dialog.password = [NSString stringWithCString:*password encoding:NSUTF8StringEncoding];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (*domain)
|
|
Packit Service |
fa4841 |
dialog.domain = [NSString stringWithCString:*domain encoding:NSUTF8StringEncoding];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
dispatch_sync(dispatch_get_main_queue(), ^{
|
|
Packit Service |
fa4841 |
[dialog performSelectorOnMainThread:@selector(runModal:)
|
|
Packit Service |
fa4841 |
withObject:[view window]
|
|
Packit Service |
fa4841 |
waitUntilDone:TRUE];
|
|
Packit Service |
fa4841 |
});
|
|
Packit Service |
fa4841 |
BOOL ok = dialog.modalCode;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (ok)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
size_t ulen, plen, dlen;
|
|
Packit Service |
fa4841 |
const char *submittedUsername = [dialog.username cStringUsingEncoding:NSUTF8StringEncoding];
|
|
Packit Service |
fa4841 |
ulen = (strlen(submittedUsername) + 1) * sizeof(char);
|
|
Packit Service |
fa4841 |
*username = malloc(ulen);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!(*username))
|
|
Packit Service |
fa4841 |
return FALSE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
sprintf_s(*username, ulen, "%s", submittedUsername);
|
|
Packit Service |
fa4841 |
const char *submittedPassword = [dialog.password cStringUsingEncoding:NSUTF8StringEncoding];
|
|
Packit Service |
fa4841 |
plen = (strlen(submittedPassword) + 1) * sizeof(char);
|
|
Packit Service |
fa4841 |
*password = malloc(plen);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!(*password))
|
|
Packit Service |
fa4841 |
return FALSE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
sprintf_s(*password, plen, "%s", submittedPassword);
|
|
Packit Service |
fa4841 |
const char *submittedDomain = [dialog.domain cStringUsingEncoding:NSUTF8StringEncoding];
|
|
Packit Service |
fa4841 |
dlen = (strlen(submittedDomain) + 1) * sizeof(char);
|
|
Packit Service |
fa4841 |
*domain = malloc(dlen);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!(*domain))
|
|
Packit Service |
fa4841 |
return FALSE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
sprintf_s(*domain, dlen, "%s", submittedDomain);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
return ok;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
BOOL mac_authenticate(freerdp *instance, char **username, char **password, char **domain)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
NSString *title =
|
|
Packit Service |
fa4841 |
[NSString stringWithFormat:@"%@:%u",
|
|
Packit Service |
fa4841 |
[NSString stringWithCString:instance->settings->ServerHostname
|
|
Packit Service |
fa4841 |
encoding:NSUTF8StringEncoding],
|
|
Packit Service |
fa4841 |
instance -> settings -> ServerPort];
|
|
Packit Service |
fa4841 |
return mac_authenticate_int(title, instance, username, password, domain);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
BOOL mac_gw_authenticate(freerdp *instance, char **username, char **password, char **domain)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
NSString *title =
|
|
Packit Service |
fa4841 |
[NSString stringWithFormat:@"%@:%u",
|
|
Packit Service |
fa4841 |
[NSString stringWithCString:instance->settings->GatewayHostname
|
|
Packit Service |
fa4841 |
encoding:NSUTF8StringEncoding],
|
|
Packit Service |
fa4841 |
instance -> settings -> GatewayPort];
|
|
Packit Service |
fa4841 |
return mac_authenticate_int(title, instance, username, password, domain);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
DWORD mac_verify_certificate_ex(freerdp *instance, const char *host, UINT16 port,
|
|
Packit Service |
fa4841 |
const char *common_name, const char *subject, const char *issuer,
|
|
Packit Service |
fa4841 |
const char *fingerprint, DWORD flags)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
mfContext *mfc = (mfContext *)instance->context;
|
|
Packit Service |
fa4841 |
MRDPView *view = (MRDPView *)mfc->view;
|
|
Packit Service |
fa4841 |
CertificateDialog *dialog = [CertificateDialog new];
|
|
Packit Service |
fa4841 |
const char *type = "RDP-Server";
|
|
Packit Service |
fa4841 |
char hostname[8192];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (flags & VERIFY_CERT_FLAG_GATEWAY)
|
|
Packit Service |
fa4841 |
type = "RDP-Gateway";
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (flags & VERIFY_CERT_FLAG_REDIRECT)
|
|
Packit Service |
fa4841 |
type = "RDP-Redirect";
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
sprintf_s(hostname, sizeof(hostname), "%s %s:%" PRIu16, type, host, port);
|
|
Packit Service |
fa4841 |
dialog.serverHostname = [NSString stringWithCString:hostname];
|
|
Packit Service |
fa4841 |
dialog.commonName = [NSString stringWithCString:common_name encoding:NSUTF8StringEncoding];
|
|
Packit Service |
fa4841 |
dialog.subject = [NSString stringWithCString:subject encoding:NSUTF8StringEncoding];
|
|
Packit Service |
fa4841 |
dialog.issuer = [NSString stringWithCString:issuer encoding:NSUTF8StringEncoding];
|
|
Packit Service |
fa4841 |
dialog.fingerprint = [NSString stringWithCString:fingerprint encoding:NSUTF8StringEncoding];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (flags & VERIFY_CERT_FLAG_MISMATCH)
|
|
Packit Service |
fa4841 |
dialog.hostMismatch = TRUE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (flags & VERIFY_CERT_FLAG_CHANGED)
|
|
Packit Service |
fa4841 |
dialog.changed = TRUE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
[dialog performSelectorOnMainThread:@selector(runModal:)
|
|
Packit Service |
fa4841 |
withObject:[view window]
|
|
Packit Service |
fa4841 |
waitUntilDone:TRUE];
|
|
Packit Service |
fa4841 |
return dialog.result;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
DWORD mac_verify_changed_certificate_ex(freerdp *instance, const char *host, UINT16 port,
|
|
Packit Service |
fa4841 |
const char *common_name, const char *subject,
|
|
Packit Service |
fa4841 |
const char *issuer, const char *fingerprint,
|
|
Packit Service |
fa4841 |
const char *old_subject, const char *old_issuer,
|
|
Packit Service |
fa4841 |
const char *old_fingerprint, DWORD flags)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
mfContext *mfc = (mfContext *)instance->context;
|
|
Packit Service |
fa4841 |
MRDPView *view = (MRDPView *)mfc->view;
|
|
Packit Service |
fa4841 |
CertificateDialog *dialog = [CertificateDialog new];
|
|
Packit Service |
fa4841 |
const char *type = "RDP-Server";
|
|
Packit Service |
fa4841 |
char hostname[8192];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (flags & VERIFY_CERT_FLAG_GATEWAY)
|
|
Packit Service |
fa4841 |
type = "RDP-Gateway";
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (flags & VERIFY_CERT_FLAG_REDIRECT)
|
|
Packit Service |
fa4841 |
type = "RDP-Redirect";
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
sprintf_s(hostname, sizeof(hostname), "%s %s:%" PRIu16, type, host, port);
|
|
Packit Service |
fa4841 |
dialog.serverHostname = [NSString stringWithCString:hostname];
|
|
Packit Service |
fa4841 |
dialog.commonName = [NSString stringWithCString:common_name encoding:NSUTF8StringEncoding];
|
|
Packit Service |
fa4841 |
dialog.subject = [NSString stringWithCString:subject encoding:NSUTF8StringEncoding];
|
|
Packit Service |
fa4841 |
dialog.issuer = [NSString stringWithCString:issuer encoding:NSUTF8StringEncoding];
|
|
Packit Service |
fa4841 |
dialog.fingerprint = [NSString stringWithCString:fingerprint encoding:NSUTF8StringEncoding];
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (flags & VERIFY_CERT_FLAG_MISMATCH)
|
|
Packit Service |
fa4841 |
dialog.hostMismatch = TRUE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (flags & VERIFY_CERT_FLAG_CHANGED)
|
|
Packit Service |
fa4841 |
dialog.changed = TRUE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
[dialog performSelectorOnMainThread:@selector(runModal:)
|
|
Packit Service |
fa4841 |
withObject:[view window]
|
|
Packit Service |
fa4841 |
waitUntilDone:TRUE];
|
|
Packit Service |
fa4841 |
return dialog.result;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
int mac_logon_error_info(freerdp *instance, UINT32 data, UINT32 type)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
const char *str_data = freerdp_get_logon_error_info_data(data);
|
|
Packit Service |
fa4841 |
const char *str_type = freerdp_get_logon_error_info_type(type);
|
|
Packit Service |
fa4841 |
// TODO: Error message dialog
|
|
Packit Service |
fa4841 |
WLog_INFO(TAG, "Logon Error Info %s [%s]", str_data, str_type);
|
|
Packit Service |
fa4841 |
return 1;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
BOOL mf_Pointer_New(rdpContext *context, rdpPointer *pointer)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
rdpGdi *gdi;
|
|
Packit Service |
fa4841 |
NSRect rect;
|
|
Packit Service |
fa4841 |
NSImage *image;
|
|
Packit Service |
fa4841 |
NSPoint hotSpot;
|
|
Packit Service |
fa4841 |
NSCursor *cursor;
|
|
Packit Service |
fa4841 |
BYTE *cursor_data;
|
|
Packit Service |
fa4841 |
NSMutableArray *ma;
|
|
Packit Service |
fa4841 |
NSBitmapImageRep *bmiRep;
|
|
Packit Service |
fa4841 |
MRDPCursor *mrdpCursor = [[MRDPCursor alloc] init];
|
|
Packit Service |
fa4841 |
mfContext *mfc = (mfContext *)context;
|
|
Packit Service |
fa4841 |
MRDPView *view;
|
|
Packit Service |
fa4841 |
UINT32 format;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!mfc || !context || !pointer)
|
|
Packit Service |
fa4841 |
return FALSE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
view = (MRDPView *)mfc->view;
|
|
Packit Service |
fa4841 |
gdi = context->gdi;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!gdi || !view)
|
|
Packit Service |
fa4841 |
return FALSE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
rect.size.width = pointer->width;
|
|
Packit Service |
fa4841 |
rect.size.height = pointer->height;
|
|
Packit Service |
fa4841 |
rect.origin.x = pointer->xPos;
|
|
Packit Service |
fa4841 |
rect.origin.y = pointer->yPos;
|
|
Packit Service |
fa4841 |
cursor_data = (BYTE *)malloc(rect.size.width * rect.size.height * 4);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!cursor_data)
|
|
Packit Service |
fa4841 |
return FALSE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
mrdpCursor->cursor_data = cursor_data;
|
|
Packit Service |
fa4841 |
format = PIXEL_FORMAT_RGBA32;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!freerdp_image_copy_from_pointer_data(cursor_data, format, 0, 0, 0, pointer->width,
|
|
Packit Service |
fa4841 |
pointer->height, pointer->xorMaskData,
|
|
Packit Service |
fa4841 |
pointer->lengthXorMask, pointer->andMaskData,
|
|
Packit Service |
fa4841 |
pointer->lengthAndMask, pointer->xorBpp, NULL))
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
free(cursor_data);
|
|
Packit Service |
fa4841 |
mrdpCursor->cursor_data = NULL;
|
|
Packit Service |
fa4841 |
return FALSE;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
/* store cursor bitmap image in representation - required by NSImage */
|
|
Packit Service |
fa4841 |
bmiRep = [[NSBitmapImageRep alloc]
|
|
Packit Service |
fa4841 |
initWithBitmapDataPlanes:(unsigned char **)&cursor_data
|
|
Packit Service |
fa4841 |
pixelsWide:rect.size.width
|
|
Packit Service |
fa4841 |
pixelsHigh:rect.size.height
|
|
Packit Service |
fa4841 |
bitsPerSample:8
|
|
Packit Service |
fa4841 |
samplesPerPixel:4
|
|
Packit Service |
fa4841 |
hasAlpha:YES
|
|
Packit Service |
fa4841 |
isPlanar:NO
|
|
Packit Service |
fa4841 |
colorSpaceName:NSDeviceRGBColorSpace
|
|
Packit Service |
fa4841 |
bitmapFormat:0
|
|
Packit Service |
fa4841 |
bytesPerRow:rect.size.width * GetBytesPerPixel(format)
|
|
Packit Service |
fa4841 |
bitsPerPixel:0];
|
|
Packit Service |
fa4841 |
mrdpCursor->bmiRep = bmiRep;
|
|
Packit Service |
fa4841 |
/* create an image using above representation */
|
|
Packit Service |
fa4841 |
image = [[NSImage alloc] initWithSize:[bmiRep size]];
|
|
Packit Service |
fa4841 |
[image addRepresentation:bmiRep];
|
|
Packit Service |
fa4841 |
[image setFlipped:NO];
|
|
Packit Service |
fa4841 |
mrdpCursor->nsImage = image;
|
|
Packit Service |
fa4841 |
/* need hotspot to create cursor */
|
|
Packit Service |
fa4841 |
hotSpot.x = pointer->xPos;
|
|
Packit Service |
fa4841 |
hotSpot.y = pointer->yPos;
|
|
Packit Service |
fa4841 |
cursor = [[NSCursor alloc] initWithImage:image hotSpot:hotSpot];
|
|
Packit Service |
fa4841 |
mrdpCursor->nsCursor = cursor;
|
|
Packit Service |
fa4841 |
mrdpCursor->pointer = pointer;
|
|
Packit Service |
fa4841 |
/* save cursor for later use in mf_Pointer_Set() */
|
|
Packit Service |
fa4841 |
ma = view->cursors;
|
|
Packit Service |
fa4841 |
[ma addObject:mrdpCursor];
|
|
Packit Service |
fa4841 |
return TRUE;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
void mf_Pointer_Free(rdpContext *context, rdpPointer *pointer)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
mfContext *mfc = (mfContext *)context;
|
|
Packit Service |
fa4841 |
MRDPView *view = (MRDPView *)mfc->view;
|
|
Packit Service |
fa4841 |
NSMutableArray *ma = view->cursors;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
for (MRDPCursor *cursor in ma)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
if (cursor->pointer == pointer)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
cursor->nsImage = nil;
|
|
Packit Service |
fa4841 |
cursor->nsCursor = nil;
|
|
Packit Service |
fa4841 |
cursor->bmiRep = nil;
|
|
Packit Service |
fa4841 |
free(cursor->cursor_data);
|
|
Packit Service |
fa4841 |
[ma removeObject:cursor];
|
|
Packit Service |
fa4841 |
return;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
BOOL mf_Pointer_Set(rdpContext *context, const rdpPointer *pointer)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
mfContext *mfc = (mfContext *)context;
|
|
Packit Service |
fa4841 |
MRDPView *view = (MRDPView *)mfc->view;
|
|
Packit Service |
fa4841 |
NSMutableArray *ma = view->cursors;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
for (MRDPCursor *cursor in ma)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
if (cursor->pointer == pointer)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
[view setCursor:cursor->nsCursor];
|
|
Packit Service |
fa4841 |
return TRUE;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
NSLog(@"Cursor not found");
|
|
Packit Service |
fa4841 |
return TRUE;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
BOOL mf_Pointer_SetNull(rdpContext *context)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
return TRUE;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
BOOL mf_Pointer_SetDefault(rdpContext *context)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
mfContext *mfc = (mfContext *)context;
|
|
Packit Service |
fa4841 |
MRDPView *view = (MRDPView *)mfc->view;
|
|
Packit Service |
fa4841 |
[view setCursor:[NSCursor arrowCursor]];
|
|
Packit Service |
fa4841 |
return TRUE;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
static BOOL mf_Pointer_SetPosition(rdpContext *context, UINT32 x, UINT32 y)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
mfContext *mfc = (mfContext *)context;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!mfc)
|
|
Packit Service |
fa4841 |
return FALSE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
/* TODO: Set pointer position */
|
|
Packit Service |
fa4841 |
return TRUE;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
CGContextRef mac_create_bitmap_context(rdpContext *context)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
CGContextRef bitmap_context;
|
|
Packit Service |
fa4841 |
rdpGdi *gdi = context->gdi;
|
|
Packit Service |
fa4841 |
UINT32 bpp = GetBytesPerPixel(gdi->dstFormat);
|
|
Packit Service |
fa4841 |
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (bpp == 2)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
bitmap_context = CGBitmapContextCreate(
|
|
Packit Service |
fa4841 |
gdi->primary_buffer, gdi->width, gdi->height, 5, gdi->stride, colorSpace,
|
|
Packit Service |
fa4841 |
kCGBitmapByteOrder16Little | kCGImageAlphaNoneSkipFirst);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
else
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
bitmap_context = CGBitmapContextCreate(
|
|
Packit Service |
fa4841 |
gdi->primary_buffer, gdi->width, gdi->height, 8, gdi->stride, colorSpace,
|
|
Packit Service |
fa4841 |
kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst);
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
CGColorSpaceRelease(colorSpace);
|
|
Packit Service |
fa4841 |
return bitmap_context;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
BOOL mac_begin_paint(rdpContext *context)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
rdpGdi *gdi = context->gdi;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!gdi)
|
|
Packit Service |
fa4841 |
return FALSE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
gdi->primary->hdc->hwnd->invalid->null = TRUE;
|
|
Packit Service |
fa4841 |
return TRUE;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
BOOL mac_end_paint(rdpContext *context)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
rdpGdi *gdi;
|
|
Packit Service |
fa4841 |
HGDI_RGN invalid;
|
|
Packit Service |
fa4841 |
NSRect newDrawRect;
|
|
Packit Service |
fa4841 |
int ww, wh, dw, dh;
|
|
Packit Service |
fa4841 |
mfContext *mfc = (mfContext *)context;
|
|
Packit Service |
fa4841 |
MRDPView *view = (MRDPView *)mfc->view;
|
|
Packit Service |
fa4841 |
gdi = context->gdi;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!gdi)
|
|
Packit Service |
fa4841 |
return FALSE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
ww = mfc->client_width;
|
|
Packit Service |
fa4841 |
wh = mfc->client_height;
|
|
Packit Service |
fa4841 |
dw = mfc->context.settings->DesktopWidth;
|
|
Packit Service |
fa4841 |
dh = mfc->context.settings->DesktopHeight;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if ((!context) || (!context->gdi))
|
|
Packit Service |
fa4841 |
return FALSE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (context->gdi->primary->hdc->hwnd->invalid->null)
|
|
Packit Service |
fa4841 |
return TRUE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
invalid = gdi->primary->hdc->hwnd->invalid;
|
|
Packit Service |
fa4841 |
newDrawRect.origin.x = invalid->x;
|
|
Packit Service |
fa4841 |
newDrawRect.origin.y = invalid->y;
|
|
Packit Service |
fa4841 |
newDrawRect.size.width = invalid->w;
|
|
Packit Service |
fa4841 |
newDrawRect.size.height = invalid->h;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (mfc->context.settings->SmartSizing && (ww != dw || wh != dh))
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
newDrawRect.origin.y = newDrawRect.origin.y * wh / dh - 1;
|
|
Packit Service |
fa4841 |
newDrawRect.size.height = newDrawRect.size.height * wh / dh + 1;
|
|
Packit Service |
fa4841 |
newDrawRect.origin.x = newDrawRect.origin.x * ww / dw - 1;
|
|
Packit Service |
fa4841 |
newDrawRect.size.width = newDrawRect.size.width * ww / dw + 1;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
else
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
newDrawRect.origin.y = newDrawRect.origin.y - 1;
|
|
Packit Service |
fa4841 |
newDrawRect.size.height = newDrawRect.size.height + 1;
|
|
Packit Service |
fa4841 |
newDrawRect.origin.x = newDrawRect.origin.x - 1;
|
|
Packit Service |
fa4841 |
newDrawRect.size.width = newDrawRect.size.width + 1;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
windows_to_apple_cords(mfc->view, &newDrawRect);
|
|
Packit Service |
fa4841 |
dispatch_sync(dispatch_get_main_queue(), ^{
|
|
Packit Service |
fa4841 |
[view setNeedsDisplayInRect:newDrawRect];
|
|
Packit Service |
fa4841 |
});
|
|
Packit Service |
fa4841 |
gdi->primary->hdc->hwnd->ninvalid = 0;
|
|
Packit Service |
fa4841 |
return TRUE;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
BOOL mac_desktop_resize(rdpContext *context)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
ResizeWindowEventArgs e;
|
|
Packit Service |
fa4841 |
mfContext *mfc = (mfContext *)context;
|
|
Packit Service |
fa4841 |
MRDPView *view = (MRDPView *)mfc->view;
|
|
Packit Service |
fa4841 |
rdpSettings *settings = context->settings;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!context->gdi)
|
|
Packit Service |
fa4841 |
return TRUE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
/**
|
|
Packit Service |
fa4841 |
* TODO: Fix resizing race condition. We should probably implement a message to be
|
|
Packit Service |
fa4841 |
* put on the update message queue to be able to properly flush pending updates,
|
|
Packit Service |
fa4841 |
* resize, and then continue with post-resizing graphical updates.
|
|
Packit Service |
fa4841 |
*/
|
|
Packit Service |
fa4841 |
CGContextRef old_context = view->bitmap_context;
|
|
Packit Service |
fa4841 |
view->bitmap_context = NULL;
|
|
Packit Service |
fa4841 |
CGContextRelease(old_context);
|
|
Packit Service |
fa4841 |
mfc->width = settings->DesktopWidth;
|
|
Packit Service |
fa4841 |
mfc->height = settings->DesktopHeight;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!gdi_resize(context->gdi, mfc->width, mfc->height))
|
|
Packit Service |
fa4841 |
return FALSE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
view->bitmap_context = mac_create_bitmap_context(context);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!view->bitmap_context)
|
|
Packit Service |
fa4841 |
return FALSE;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
mfc->client_width = mfc->width;
|
|
Packit Service |
fa4841 |
mfc->client_height = mfc->height;
|
|
Packit Service |
fa4841 |
[view setFrameSize:NSMakeSize(mfc->width, mfc->height)];
|
|
Packit Service |
fa4841 |
EventArgsInit(&e, "mfreerdp");
|
|
Packit Service |
fa4841 |
e.width = settings->DesktopWidth;
|
|
Packit Service |
fa4841 |
e.height = settings->DesktopHeight;
|
|
Packit Service |
fa4841 |
PubSub_OnResizeWindow(context->pubSub, context, &e);
|
|
Packit Service |
fa4841 |
return TRUE;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
void input_activity_cb(freerdp *instance)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
int status;
|
|
Packit Service |
fa4841 |
wMessage message;
|
|
Packit Service |
fa4841 |
wMessageQueue *queue;
|
|
Packit Service |
fa4841 |
status = 1;
|
|
Packit Service |
fa4841 |
queue = freerdp_get_message_queue(instance, FREERDP_INPUT_MESSAGE_QUEUE);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (queue)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
while (MessageQueue_Peek(queue, &message, TRUE))
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
status = freerdp_message_queue_process_message(instance, FREERDP_INPUT_MESSAGE_QUEUE,
|
|
Packit Service |
fa4841 |
&message);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (!status)
|
|
Packit Service |
fa4841 |
break;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
else
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
WLog_ERR(TAG, "input_activity_cb: No queue!");
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
/**
|
|
Packit Service |
fa4841 |
* given a rect with 0,0 at the top left (windows cords)
|
|
Packit Service |
fa4841 |
* convert it to a rect with 0,0 at the bottom left (apple cords)
|
|
Packit Service |
fa4841 |
*
|
|
Packit Service |
fa4841 |
* Note: the formula works for conversions in both directions.
|
|
Packit Service |
fa4841 |
*
|
|
Packit Service |
fa4841 |
*/
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
void windows_to_apple_cords(MRDPView *view, NSRect *r)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
dispatch_sync(dispatch_get_main_queue(), ^{
|
|
Packit Service |
fa4841 |
r->origin.y = [view frame].size.height - (r->origin.y + r->size.height);
|
|
Packit Service |
fa4841 |
});
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
void sync_keyboard_state(freerdp *instance)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
mfContext *context = (mfContext *)instance->context;
|
|
Packit Service |
fa4841 |
UINT32 flags = 0;
|
|
Packit Service |
fa4841 |
CGEventFlags currentFlags = CGEventSourceFlagsState(kCGEventSourceStateHIDSystemState);
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (context->kbdFlags != currentFlags)
|
|
Packit Service |
fa4841 |
{
|
|
Packit Service |
fa4841 |
if (currentFlags & kCGEventFlagMaskAlphaShift)
|
|
Packit Service |
fa4841 |
flags |= KBD_SYNC_CAPS_LOCK;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
if (currentFlags & kCGEventFlagMaskNumericPad)
|
|
Packit Service |
fa4841 |
flags |= KBD_SYNC_NUM_LOCK;
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
freerdp_input_send_synchronize_event(instance->input, flags);
|
|
Packit Service |
fa4841 |
context->kbdFlags = currentFlags;
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
}
|
|
Packit Service |
fa4841 |
|
|
Packit Service |
fa4841 |
@end
|