Blame server/Windows/wf_input.c

Packit 1fb8d4
/**
Packit 1fb8d4
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit 1fb8d4
 * FreeRDP Windows Server
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2012 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 <winpr/windows.h>
Packit 1fb8d4
Packit 1fb8d4
#include "wf_input.h"
Packit 1fb8d4
#include "wf_info.h"
Packit 1fb8d4
Packit Service 5a9772
BOOL wf_peer_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code)
Packit 1fb8d4
{
Packit 1fb8d4
	INPUT keyboard_event;
Packit Service 5a9772
	WINPR_UNUSED(input);
Packit 1fb8d4
	keyboard_event.type = INPUT_KEYBOARD;
Packit 1fb8d4
	keyboard_event.ki.wVk = 0;
Packit 1fb8d4
	keyboard_event.ki.wScan = code;
Packit 1fb8d4
	keyboard_event.ki.dwFlags = KEYEVENTF_SCANCODE;
Packit 1fb8d4
	keyboard_event.ki.dwExtraInfo = 0;
Packit 1fb8d4
	keyboard_event.ki.time = 0;
Packit 1fb8d4
Packit 1fb8d4
	if (flags & KBD_FLAGS_RELEASE)
Packit 1fb8d4
		keyboard_event.ki.dwFlags |= KEYEVENTF_KEYUP;
Packit 1fb8d4
Packit 1fb8d4
	if (flags & KBD_FLAGS_EXTENDED)
Packit 1fb8d4
		keyboard_event.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;
Packit 1fb8d4
Packit 1fb8d4
	SendInput(1, &keyboard_event, sizeof(INPUT));
Packit Service 5a9772
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
BOOL wf_peer_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code)
Packit 1fb8d4
{
Packit 1fb8d4
	INPUT keyboard_event;
Packit Service 5a9772
	WINPR_UNUSED(input);
Packit 1fb8d4
	keyboard_event.type = INPUT_KEYBOARD;
Packit 1fb8d4
	keyboard_event.ki.wVk = 0;
Packit 1fb8d4
	keyboard_event.ki.wScan = code;
Packit 1fb8d4
	keyboard_event.ki.dwFlags = KEYEVENTF_UNICODE;
Packit 1fb8d4
	keyboard_event.ki.dwExtraInfo = 0;
Packit 1fb8d4
	keyboard_event.ki.time = 0;
Packit 1fb8d4
Packit 1fb8d4
	if (flags & KBD_FLAGS_RELEASE)
Packit 1fb8d4
		keyboard_event.ki.dwFlags |= KEYEVENTF_KEYUP;
Packit 1fb8d4
Packit 1fb8d4
	SendInput(1, &keyboard_event, sizeof(INPUT));
Packit Service 5a9772
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
BOOL wf_peer_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
Packit 1fb8d4
{
Packit 1fb8d4
	INPUT mouse_event;
Packit 1fb8d4
	float width, height;
Packit Service 5a9772
	WINPR_UNUSED(input);
Packit 1fb8d4
	ZeroMemory(&mouse_event, sizeof(INPUT));
Packit 1fb8d4
	mouse_event.type = INPUT_MOUSE;
Packit 1fb8d4
Packit 1fb8d4
	if (flags & PTR_FLAGS_WHEEL)
Packit 1fb8d4
	{
Packit 1fb8d4
		mouse_event.mi.dwFlags = MOUSEEVENTF_WHEEL;
Packit 1fb8d4
		mouse_event.mi.mouseData = flags & WheelRotationMask;
Packit 1fb8d4
Packit 1fb8d4
		if (flags & PTR_FLAGS_WHEEL_NEGATIVE)
Packit 1fb8d4
			mouse_event.mi.mouseData *= -1;
Packit 1fb8d4
Packit 1fb8d4
		SendInput(1, &mouse_event, sizeof(INPUT));
Packit 1fb8d4
	}
Packit 1fb8d4
	else
Packit 1fb8d4
	{
Packit Service 5a9772
		wfInfo* wfi;
Packit 1fb8d4
		wfi = wf_info_get_instance();
Packit 1fb8d4
Packit Service 5a9772
		if (!wfi)
Packit Service 5a9772
			return FALSE;
Packit 1fb8d4
Packit Service 5a9772
		// width and height of primary screen (even in multimon setups
Packit Service 5a9772
		width = (float)GetSystemMetrics(SM_CXSCREEN);
Packit Service 5a9772
		height = (float)GetSystemMetrics(SM_CYSCREEN);
Packit 1fb8d4
		x += wfi->servscreen_xoffset;
Packit 1fb8d4
		y += wfi->servscreen_yoffset;
Packit Service 5a9772
		mouse_event.mi.dx = (LONG)((float)x * (65535.0f / width));
Packit Service 5a9772
		mouse_event.mi.dy = (LONG)((float)y * (65535.0f / height));
Packit 1fb8d4
		mouse_event.mi.dwFlags = MOUSEEVENTF_ABSOLUTE;
Packit 1fb8d4
Packit 1fb8d4
		if (flags & PTR_FLAGS_MOVE)
Packit 1fb8d4
		{
Packit 1fb8d4
			mouse_event.mi.dwFlags |= MOUSEEVENTF_MOVE;
Packit 1fb8d4
			SendInput(1, &mouse_event, sizeof(INPUT));
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		mouse_event.mi.dwFlags = MOUSEEVENTF_ABSOLUTE;
Packit 1fb8d4
Packit 1fb8d4
		if (flags & PTR_FLAGS_BUTTON1)
Packit 1fb8d4
		{
Packit 1fb8d4
			if (flags & PTR_FLAGS_DOWN)
Packit 1fb8d4
				mouse_event.mi.dwFlags |= MOUSEEVENTF_LEFTDOWN;
Packit 1fb8d4
			else
Packit 1fb8d4
				mouse_event.mi.dwFlags |= MOUSEEVENTF_LEFTUP;
Packit 1fb8d4
Packit 1fb8d4
			SendInput(1, &mouse_event, sizeof(INPUT));
Packit 1fb8d4
		}
Packit 1fb8d4
		else if (flags & PTR_FLAGS_BUTTON2)
Packit 1fb8d4
		{
Packit 1fb8d4
			if (flags & PTR_FLAGS_DOWN)
Packit 1fb8d4
				mouse_event.mi.dwFlags |= MOUSEEVENTF_RIGHTDOWN;
Packit 1fb8d4
			else
Packit 1fb8d4
				mouse_event.mi.dwFlags |= MOUSEEVENTF_RIGHTUP;
Packit 1fb8d4
Packit 1fb8d4
			SendInput(1, &mouse_event, sizeof(INPUT));
Packit 1fb8d4
		}
Packit 1fb8d4
		else if (flags & PTR_FLAGS_BUTTON3)
Packit 1fb8d4
		{
Packit 1fb8d4
			if (flags & PTR_FLAGS_DOWN)
Packit 1fb8d4
				mouse_event.mi.dwFlags |= MOUSEEVENTF_MIDDLEDOWN;
Packit 1fb8d4
			else
Packit 1fb8d4
				mouse_event.mi.dwFlags |= MOUSEEVENTF_MIDDLEUP;
Packit 1fb8d4
Packit 1fb8d4
			SendInput(1, &mouse_event, sizeof(INPUT));
Packit 1fb8d4
		}
Packit 1fb8d4
	}
Packit Service 5a9772
Packit Service 5a9772
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
BOOL wf_peer_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
Packit 1fb8d4
{
Packit 1fb8d4
	if ((flags & PTR_XFLAGS_BUTTON1) || (flags & PTR_XFLAGS_BUTTON2))
Packit 1fb8d4
	{
Packit 1fb8d4
		INPUT mouse_event;
Packit 1fb8d4
		ZeroMemory(&mouse_event, sizeof(INPUT));
Packit 1fb8d4
		mouse_event.type = INPUT_MOUSE;
Packit 1fb8d4
Packit 1fb8d4
		if (flags & PTR_FLAGS_MOVE)
Packit 1fb8d4
		{
Packit 1fb8d4
			float width, height;
Packit Service 5a9772
			wfInfo* wfi;
Packit 1fb8d4
			wfi = wf_info_get_instance();
Packit Service 5a9772
Packit 1fb8d4
			if (!wfi)
Packit Service 5a9772
				return FALSE;
Packit 1fb8d4
Packit Service 5a9772
			// width and height of primary screen (even in multimon setups
Packit Service 5a9772
			width = (float)GetSystemMetrics(SM_CXSCREEN);
Packit Service 5a9772
			height = (float)GetSystemMetrics(SM_CYSCREEN);
Packit 1fb8d4
			x += wfi->servscreen_xoffset;
Packit 1fb8d4
			y += wfi->servscreen_yoffset;
Packit Service 5a9772
			mouse_event.mi.dx = (LONG)((float)x * (65535.0f / width));
Packit Service 5a9772
			mouse_event.mi.dy = (LONG)((float)y * (65535.0f / height));
Packit 1fb8d4
			mouse_event.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
Packit 1fb8d4
			SendInput(1, &mouse_event, sizeof(INPUT));
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		mouse_event.mi.dx = mouse_event.mi.dy = mouse_event.mi.dwFlags = 0;
Packit 1fb8d4
Packit 1fb8d4
		if (flags & PTR_XFLAGS_DOWN)
Packit 1fb8d4
			mouse_event.mi.dwFlags |= MOUSEEVENTF_XDOWN;
Packit 1fb8d4
		else
Packit 1fb8d4
			mouse_event.mi.dwFlags |= MOUSEEVENTF_XUP;
Packit 1fb8d4
Packit 1fb8d4
		if (flags & PTR_XFLAGS_BUTTON1)
Packit 1fb8d4
			mouse_event.mi.mouseData = XBUTTON1;
Packit 1fb8d4
		else if (flags & PTR_XFLAGS_BUTTON2)
Packit 1fb8d4
			mouse_event.mi.mouseData = XBUTTON2;
Packit 1fb8d4
Packit 1fb8d4
		SendInput(1, &mouse_event, sizeof(INPUT));
Packit 1fb8d4
	}
Packit 1fb8d4
	else
Packit 1fb8d4
	{
Packit 1fb8d4
		wf_peer_mouse_event(input, flags, x, y);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit Service 5a9772
	return TRUE;
Packit Service 5a9772
}
Packit 1fb8d4
Packit Service 5a9772
BOOL wf_peer_keyboard_event_dummy(rdpInput* input, UINT16 flags, UINT16 code)
Packit 1fb8d4
{
Packit Service 5a9772
	WINPR_UNUSED(input);
Packit Service 5a9772
	WINPR_UNUSED(flags);
Packit Service 5a9772
	WINPR_UNUSED(code);
Packit Service 5a9772
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
BOOL wf_peer_unicode_keyboard_event_dummy(rdpInput* input, UINT16 flags, UINT16 code)
Packit 1fb8d4
{
Packit Service 5a9772
	WINPR_UNUSED(input);
Packit Service 5a9772
	WINPR_UNUSED(flags);
Packit Service 5a9772
	WINPR_UNUSED(code);
Packit Service 5a9772
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
BOOL wf_peer_mouse_event_dummy(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
Packit 1fb8d4
{
Packit Service 5a9772
	WINPR_UNUSED(input);
Packit Service 5a9772
	WINPR_UNUSED(flags);
Packit Service 5a9772
	WINPR_UNUSED(x);
Packit Service 5a9772
	WINPR_UNUSED(y);
Packit Service 5a9772
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
BOOL wf_peer_extended_mouse_event_dummy(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
Packit 1fb8d4
{
Packit Service 5a9772
	WINPR_UNUSED(input);
Packit Service 5a9772
	WINPR_UNUSED(flags);
Packit Service 5a9772
	WINPR_UNUSED(x);
Packit Service 5a9772
	WINPR_UNUSED(y);
Packit Service 5a9772
	return TRUE;
Packit 1fb8d4
}