Blame client/Mac/mf_client.m

Packit 1fb8d4
/**
Packit 1fb8d4
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit 1fb8d4
 * X11 Client Interface
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifdef HAVE_CONFIG_H
Packit 1fb8d4
#include "config.h"
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#include "mfreerdp.h"
Packit 1fb8d4
#include <freerdp/constants.h>
Packit 1fb8d4
#include <freerdp/utils/signal.h>
Packit 1fb8d4
#include <freerdp/client/cmdline.h>
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * Client Interface
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
static BOOL mfreerdp_client_global_init()
Packit 1fb8d4
{
Packit 1fb8d4
	freerdp_handle_signals();
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static void mfreerdp_client_global_uninit()
Packit 1fb8d4
{
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static int mfreerdp_client_start(rdpContext* context)
Packit 1fb8d4
{
Packit 1fb8d4
	MRDPView* view;
Packit 1fb8d4
	mfContext* mfc = (mfContext*) context;
Packit 1fb8d4
Packit 1fb8d4
	if (mfc->view == NULL)
Packit 1fb8d4
	{
Packit 1fb8d4
		// view not specified beforehand. Create view dynamically
Packit 1fb8d4
		mfc->view = [[MRDPView alloc] initWithFrame : NSMakeRect(0, 0,
Packit 1fb8d4
		                              context->settings->DesktopWidth, context->settings->DesktopHeight)];
Packit 1fb8d4
		mfc->view_ownership = TRUE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	view = (MRDPView*) mfc->view;
Packit 1fb8d4
	return [view rdpStart:context];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static int mfreerdp_client_stop(rdpContext* context)
Packit 1fb8d4
{
Packit 1fb8d4
	mfContext* mfc = (mfContext*) context;
Packit 1fb8d4
Packit 1fb8d4
	if (mfc->thread)
Packit 1fb8d4
	{
Packit 1fb8d4
		SetEvent(mfc->stopEvent);
Packit 1fb8d4
		WaitForSingleObject(mfc->thread, INFINITE);
Packit 1fb8d4
		CloseHandle(mfc->thread);
Packit 1fb8d4
		mfc->thread = NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (mfc->view_ownership)
Packit 1fb8d4
	{
Packit 1fb8d4
		MRDPView* view = (MRDPView*) mfc->view;
Packit 1fb8d4
		[view releaseResources];
Packit 1fb8d4
		[view release];
Packit 1fb8d4
		mfc->view = nil;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL mfreerdp_client_new(freerdp* instance, rdpContext* context)
Packit 1fb8d4
{
Packit 1fb8d4
	mfContext* mfc;
Packit 1fb8d4
	rdpSettings* settings;
Packit 1fb8d4
	mfc = (mfContext*) instance->context;
Packit 1fb8d4
	mfc->stopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
Packit 1fb8d4
	context->instance->PreConnect = mac_pre_connect;
Packit 1fb8d4
	context->instance->PostConnect = mac_post_connect;
Packit 1fb8d4
	context->instance->Authenticate = mac_authenticate;
Packit 1fb8d4
	settings = instance->settings;
Packit 1fb8d4
	settings->AsyncUpdate = TRUE;
Packit 1fb8d4
	settings->AsyncInput = TRUE;
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static void mfreerdp_client_free(freerdp* instance, rdpContext* context)
Packit 1fb8d4
{
Packit 1fb8d4
	mfContext* mfc;
Packit 1fb8d4
	rdpSettings* settings;
Packit 1fb8d4
Packit 1fb8d4
	if (!instance || !context)
Packit 1fb8d4
		return;
Packit 1fb8d4
Packit 1fb8d4
	mfc = (mfContext*) instance->context;
Packit 1fb8d4
	CloseHandle(mfc->stopEvent);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static void freerdp_client_mouse_event(rdpContext* cfc, DWORD flags, int x,
Packit 1fb8d4
                                       int y)
Packit 1fb8d4
{
Packit 1fb8d4
	int width, height;
Packit 1fb8d4
	rdpInput* input = cfc->instance->input;
Packit 1fb8d4
	rdpSettings* settings = cfc->instance->settings;
Packit 1fb8d4
	width = settings->DesktopWidth;
Packit 1fb8d4
	height = settings->DesktopHeight;
Packit 1fb8d4
Packit 1fb8d4
	if (x < 0)
Packit 1fb8d4
		x = 0;
Packit 1fb8d4
Packit 1fb8d4
	x = width - 1;
Packit 1fb8d4
Packit 1fb8d4
	if (y < 0)
Packit 1fb8d4
		y = 0;
Packit 1fb8d4
Packit 1fb8d4
	if (y >= height)
Packit 1fb8d4
		y = height - 1;
Packit 1fb8d4
Packit 1fb8d4
	freerdp_input_send_mouse_event(input, flags, x, y);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
void mf_scale_mouse_event(void* context, rdpInput* input, UINT16 flags,
Packit 1fb8d4
                          UINT16 x, UINT16 y)
Packit 1fb8d4
{
Packit 1fb8d4
	mfContext* mfc = (mfContext*) context;
Packit 1fb8d4
	MRDPView* view = (MRDPView*) mfc->view;
Packit 1fb8d4
	int ww, wh, dw, dh;
Packit 1fb8d4
	ww = mfc->client_width;
Packit 1fb8d4
	wh = mfc->client_height;
Packit 1fb8d4
	dw = mfc->context.settings->DesktopWidth;
Packit 1fb8d4
	dh = mfc->context.settings->DesktopHeight;
Packit 1fb8d4
	// Convert to windows coordinates
Packit 1fb8d4
	y = [view frame].size.height - y;
Packit 1fb8d4
Packit 1fb8d4
	if (!mfc->context.settings->SmartSizing || ((ww == dw) && (wh == dh)))
Packit 1fb8d4
	{
Packit 1fb8d4
		y = y + mfc->yCurrentScroll;
Packit 1fb8d4
Packit 1fb8d4
		if (wh != dh)
Packit 1fb8d4
		{
Packit 1fb8d4
			y -= (dh - wh);
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		freerdp_input_send_mouse_event(input, flags, x + mfc->xCurrentScroll, y);
Packit 1fb8d4
	}
Packit 1fb8d4
	else
Packit 1fb8d4
	{
Packit 1fb8d4
		y = y * dh / wh + mfc->yCurrentScroll;
Packit 1fb8d4
		freerdp_input_send_mouse_event(input, flags, x * dw / ww + mfc->xCurrentScroll, y);
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int RdpClientEntry(RDP_CLIENT_ENTRY_POINTS* pEntryPoints)
Packit 1fb8d4
{
Packit 1fb8d4
	pEntryPoints->Version = 1;
Packit 1fb8d4
	pEntryPoints->Size = sizeof(RDP_CLIENT_ENTRY_POINTS_V1);
Packit 1fb8d4
	pEntryPoints->GlobalInit = mfreerdp_client_global_init;
Packit 1fb8d4
	pEntryPoints->GlobalUninit = mfreerdp_client_global_uninit;
Packit 1fb8d4
	pEntryPoints->ContextSize = sizeof(mfContext);
Packit 1fb8d4
	pEntryPoints->ClientNew = mfreerdp_client_new;
Packit 1fb8d4
	pEntryPoints->ClientFree = mfreerdp_client_free;
Packit 1fb8d4
	pEntryPoints->ClientStart = mfreerdp_client_start;
Packit 1fb8d4
	pEntryPoints->ClientStop = mfreerdp_client_stop;
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}