Blame client/DirectFB/df_event.c

Packit 1fb8d4
/**
Packit 1fb8d4
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit 1fb8d4
 * DirectFB Event Handling
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2011 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
#include <winpr/crt.h>
Packit 1fb8d4
#include <winpr/input.h>
Packit 1fb8d4
Packit 1fb8d4
#include <freerdp/locale/keyboard.h>
Packit 1fb8d4
Packit 1fb8d4
#include "df_event.h"
Packit 1fb8d4
Packit 1fb8d4
static BYTE keymap[256];
Packit 1fb8d4
static BYTE functionmap[128];
Packit 1fb8d4
Packit 1fb8d4
void df_keyboard_init()
Packit 1fb8d4
{
Packit 1fb8d4
	ZeroMemory(keymap, sizeof(keymap));
Packit 1fb8d4
Packit 1fb8d4
	/* Map DirectFB keycodes to Virtual Key Codes */
Packit 1fb8d4
Packit 1fb8d4
	keymap[DIKI_A - DIKI_UNKNOWN] = VK_KEY_A;
Packit 1fb8d4
	keymap[DIKI_B - DIKI_UNKNOWN] = VK_KEY_B;
Packit 1fb8d4
	keymap[DIKI_C - DIKI_UNKNOWN] = VK_KEY_C;
Packit 1fb8d4
	keymap[DIKI_D - DIKI_UNKNOWN] = VK_KEY_D;
Packit 1fb8d4
	keymap[DIKI_E - DIKI_UNKNOWN] = VK_KEY_E;
Packit 1fb8d4
	keymap[DIKI_F - DIKI_UNKNOWN] = VK_KEY_F;
Packit 1fb8d4
	keymap[DIKI_G - DIKI_UNKNOWN] = VK_KEY_G;
Packit 1fb8d4
	keymap[DIKI_H - DIKI_UNKNOWN] = VK_KEY_H;
Packit 1fb8d4
	keymap[DIKI_I - DIKI_UNKNOWN] = VK_KEY_I;
Packit 1fb8d4
	keymap[DIKI_J - DIKI_UNKNOWN] = VK_KEY_J;
Packit 1fb8d4
	keymap[DIKI_K - DIKI_UNKNOWN] = VK_KEY_K;
Packit 1fb8d4
	keymap[DIKI_L - DIKI_UNKNOWN] = VK_KEY_L;
Packit 1fb8d4
	keymap[DIKI_M - DIKI_UNKNOWN] = VK_KEY_M;
Packit 1fb8d4
	keymap[DIKI_N - DIKI_UNKNOWN] = VK_KEY_N;
Packit 1fb8d4
	keymap[DIKI_O - DIKI_UNKNOWN] = VK_KEY_O;
Packit 1fb8d4
	keymap[DIKI_P - DIKI_UNKNOWN] = VK_KEY_P;
Packit 1fb8d4
	keymap[DIKI_Q - DIKI_UNKNOWN] = VK_KEY_Q;
Packit 1fb8d4
	keymap[DIKI_R - DIKI_UNKNOWN] = VK_KEY_R;
Packit 1fb8d4
	keymap[DIKI_S - DIKI_UNKNOWN] = VK_KEY_S;
Packit 1fb8d4
	keymap[DIKI_T - DIKI_UNKNOWN] = VK_KEY_T;
Packit 1fb8d4
	keymap[DIKI_U - DIKI_UNKNOWN] = VK_KEY_U;
Packit 1fb8d4
	keymap[DIKI_V - DIKI_UNKNOWN] = VK_KEY_V;
Packit 1fb8d4
	keymap[DIKI_W - DIKI_UNKNOWN] = VK_KEY_W;
Packit 1fb8d4
	keymap[DIKI_X - DIKI_UNKNOWN] = VK_KEY_X;
Packit 1fb8d4
	keymap[DIKI_Y - DIKI_UNKNOWN] = VK_KEY_Y;
Packit 1fb8d4
	keymap[DIKI_Z - DIKI_UNKNOWN] = VK_KEY_Z;
Packit 1fb8d4
Packit 1fb8d4
	keymap[DIKI_0 - DIKI_UNKNOWN] = VK_KEY_0;
Packit 1fb8d4
	keymap[DIKI_1 - DIKI_UNKNOWN] = VK_KEY_1;
Packit 1fb8d4
	keymap[DIKI_2 - DIKI_UNKNOWN] = VK_KEY_2;
Packit 1fb8d4
	keymap[DIKI_3 - DIKI_UNKNOWN] = VK_KEY_3;
Packit 1fb8d4
	keymap[DIKI_4 - DIKI_UNKNOWN] = VK_KEY_4;
Packit 1fb8d4
	keymap[DIKI_5 - DIKI_UNKNOWN] = VK_KEY_5;
Packit 1fb8d4
	keymap[DIKI_6 - DIKI_UNKNOWN] = VK_KEY_6;
Packit 1fb8d4
	keymap[DIKI_7 - DIKI_UNKNOWN] = VK_KEY_7;
Packit 1fb8d4
	keymap[DIKI_8 - DIKI_UNKNOWN] = VK_KEY_8;
Packit 1fb8d4
	keymap[DIKI_9 - DIKI_UNKNOWN] = VK_KEY_9;
Packit 1fb8d4
Packit 1fb8d4
	keymap[DIKI_F1 - DIKI_UNKNOWN] = VK_F1;
Packit 1fb8d4
	keymap[DIKI_F2 - DIKI_UNKNOWN] = VK_F2;
Packit 1fb8d4
	keymap[DIKI_F3 - DIKI_UNKNOWN] = VK_F3;
Packit 1fb8d4
	keymap[DIKI_F4 - DIKI_UNKNOWN] = VK_F4;
Packit 1fb8d4
	keymap[DIKI_F5 - DIKI_UNKNOWN] = VK_F5;
Packit 1fb8d4
	keymap[DIKI_F6 - DIKI_UNKNOWN] = VK_F6;
Packit 1fb8d4
	keymap[DIKI_F7 - DIKI_UNKNOWN] = VK_F7;
Packit 1fb8d4
	keymap[DIKI_F8 - DIKI_UNKNOWN] = VK_F8;
Packit 1fb8d4
	keymap[DIKI_F9 - DIKI_UNKNOWN] = VK_F9;
Packit 1fb8d4
	keymap[DIKI_F10 - DIKI_UNKNOWN] = VK_F10;
Packit 1fb8d4
	keymap[DIKI_F11 - DIKI_UNKNOWN] = VK_F11;
Packit 1fb8d4
	keymap[DIKI_F12 - DIKI_UNKNOWN] = VK_F12;
Packit 1fb8d4
Packit 1fb8d4
	keymap[DIKI_COMMA - DIKI_UNKNOWN] = VK_OEM_COMMA;
Packit 1fb8d4
	keymap[DIKI_PERIOD - DIKI_UNKNOWN] = VK_OEM_PERIOD;
Packit 1fb8d4
	keymap[DIKI_MINUS_SIGN - DIKI_UNKNOWN] = VK_OEM_MINUS;
Packit 1fb8d4
	keymap[DIKI_EQUALS_SIGN - DIKI_UNKNOWN] = VK_OEM_PLUS;
Packit 1fb8d4
Packit 1fb8d4
	keymap[DIKI_ESCAPE - DIKI_UNKNOWN] = VK_ESCAPE;
Packit 1fb8d4
	keymap[DIKI_LEFT - DIKI_UNKNOWN] = VK_LEFT;
Packit 1fb8d4
	keymap[DIKI_RIGHT - DIKI_UNKNOWN] = VK_RIGHT;
Packit 1fb8d4
	keymap[DIKI_UP - DIKI_UNKNOWN] = VK_UP;
Packit 1fb8d4
	keymap[DIKI_DOWN - DIKI_UNKNOWN] = VK_DOWN;
Packit 1fb8d4
	keymap[DIKI_CONTROL_L - DIKI_UNKNOWN] = VK_LCONTROL;
Packit 1fb8d4
	keymap[DIKI_CONTROL_R - DIKI_UNKNOWN] = VK_RCONTROL;
Packit 1fb8d4
	keymap[DIKI_SHIFT_L - DIKI_UNKNOWN] = VK_LSHIFT;
Packit 1fb8d4
	keymap[DIKI_SHIFT_R - DIKI_UNKNOWN] = VK_RSHIFT;
Packit 1fb8d4
	keymap[DIKI_ALT_L - DIKI_UNKNOWN] = VK_LMENU;
Packit 1fb8d4
	keymap[DIKI_ALT_R - DIKI_UNKNOWN] = VK_RMENU;
Packit 1fb8d4
	keymap[DIKI_TAB - DIKI_UNKNOWN] = VK_TAB;
Packit 1fb8d4
	keymap[DIKI_ENTER - DIKI_UNKNOWN] = VK_RETURN;
Packit 1fb8d4
	keymap[DIKI_SPACE - DIKI_UNKNOWN] = VK_SPACE;
Packit 1fb8d4
	keymap[DIKI_BACKSPACE - DIKI_UNKNOWN] = VK_BACK;
Packit 1fb8d4
	keymap[DIKI_INSERT - DIKI_UNKNOWN] = VK_INSERT;
Packit 1fb8d4
	keymap[DIKI_DELETE - DIKI_UNKNOWN] = VK_DELETE;
Packit 1fb8d4
	keymap[DIKI_HOME - DIKI_UNKNOWN] = VK_HOME;
Packit 1fb8d4
	keymap[DIKI_END - DIKI_UNKNOWN] = VK_END;
Packit 1fb8d4
	keymap[DIKI_PAGE_UP - DIKI_UNKNOWN] = VK_PRIOR;
Packit 1fb8d4
	keymap[DIKI_PAGE_DOWN - DIKI_UNKNOWN] = VK_NEXT;
Packit 1fb8d4
	keymap[DIKI_CAPS_LOCK - DIKI_UNKNOWN] = VK_CAPITAL;
Packit 1fb8d4
	keymap[DIKI_NUM_LOCK - DIKI_UNKNOWN] = VK_NUMLOCK;
Packit 1fb8d4
	keymap[DIKI_SCROLL_LOCK - DIKI_UNKNOWN] = VK_SCROLL;
Packit 1fb8d4
	keymap[DIKI_PRINT - DIKI_UNKNOWN] = VK_PRINT;
Packit 1fb8d4
	keymap[DIKI_PAUSE - DIKI_UNKNOWN] = VK_PAUSE;
Packit 1fb8d4
	keymap[DIKI_KP_DIV - DIKI_UNKNOWN] = VK_DIVIDE;
Packit 1fb8d4
	keymap[DIKI_KP_MULT - DIKI_UNKNOWN] = VK_MULTIPLY;
Packit 1fb8d4
	keymap[DIKI_KP_MINUS - DIKI_UNKNOWN] = VK_SUBTRACT;
Packit 1fb8d4
	keymap[DIKI_KP_PLUS - DIKI_UNKNOWN] = VK_ADD;
Packit 1fb8d4
	keymap[DIKI_KP_ENTER - DIKI_UNKNOWN] = VK_RETURN;
Packit 1fb8d4
	keymap[DIKI_KP_DECIMAL - DIKI_UNKNOWN] = VK_DECIMAL;
Packit 1fb8d4
	
Packit 1fb8d4
	keymap[DIKI_QUOTE_LEFT - DIKI_UNKNOWN] = VK_OEM_3;
Packit 1fb8d4
	keymap[DIKI_BRACKET_LEFT - DIKI_UNKNOWN] = VK_OEM_4;
Packit 1fb8d4
	keymap[DIKI_BRACKET_RIGHT - DIKI_UNKNOWN] = VK_OEM_6;
Packit 1fb8d4
	keymap[DIKI_BACKSLASH - DIKI_UNKNOWN] = VK_OEM_5;
Packit 1fb8d4
	keymap[DIKI_SEMICOLON - DIKI_UNKNOWN] = VK_OEM_1;
Packit 1fb8d4
	keymap[DIKI_QUOTE_RIGHT - DIKI_UNKNOWN] = VK_OEM_7;
Packit 1fb8d4
	keymap[DIKI_COMMA - DIKI_UNKNOWN] = VK_OEM_COMMA;
Packit 1fb8d4
	keymap[DIKI_PERIOD - DIKI_UNKNOWN] = VK_OEM_PERIOD;
Packit 1fb8d4
	keymap[DIKI_SLASH - DIKI_UNKNOWN] = VK_OEM_2;
Packit 1fb8d4
Packit 1fb8d4
	keymap[DIKI_LESS_SIGN - DIKI_UNKNOWN] = 0;
Packit 1fb8d4
Packit 1fb8d4
	keymap[DIKI_KP_0 - DIKI_UNKNOWN] = VK_NUMPAD0;
Packit 1fb8d4
	keymap[DIKI_KP_1 - DIKI_UNKNOWN] = VK_NUMPAD1;
Packit 1fb8d4
	keymap[DIKI_KP_2 - DIKI_UNKNOWN] = VK_NUMPAD2;
Packit 1fb8d4
	keymap[DIKI_KP_3 - DIKI_UNKNOWN] = VK_NUMPAD3;
Packit 1fb8d4
	keymap[DIKI_KP_4 - DIKI_UNKNOWN] = VK_NUMPAD4;
Packit 1fb8d4
	keymap[DIKI_KP_5 - DIKI_UNKNOWN] = VK_NUMPAD5;
Packit 1fb8d4
	keymap[DIKI_KP_6 - DIKI_UNKNOWN] = VK_NUMPAD6;
Packit 1fb8d4
	keymap[DIKI_KP_7 - DIKI_UNKNOWN] = VK_NUMPAD7;
Packit 1fb8d4
	keymap[DIKI_KP_8 - DIKI_UNKNOWN] = VK_NUMPAD8;
Packit 1fb8d4
	keymap[DIKI_KP_9 - DIKI_UNKNOWN] = VK_NUMPAD9;
Packit 1fb8d4
Packit 1fb8d4
	keymap[DIKI_META_L - DIKI_UNKNOWN] = VK_LWIN;
Packit 1fb8d4
	keymap[DIKI_META_R - DIKI_UNKNOWN] = VK_RWIN;
Packit 1fb8d4
	keymap[DIKI_SUPER_L - DIKI_UNKNOWN] = VK_APPS;
Packit 1fb8d4
	
Packit 1fb8d4
	ZeroMemory(functionmap, sizeof(functionmap));
Packit 1fb8d4
	
Packit 1fb8d4
	functionmap[DFB_FUNCTION_KEY(23) - DFB_FUNCTION_KEY(0)] = VK_HANGUL;
Packit 1fb8d4
	functionmap[DFB_FUNCTION_KEY(24) - DFB_FUNCTION_KEY(0)] = VK_HANJA;
Packit 1fb8d4
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
void df_send_mouse_button_event(rdpInput* input, BOOL down, UINT32 button, UINT16 x, UINT16 y)
Packit 1fb8d4
{
Packit 1fb8d4
	UINT16 flags;
Packit 1fb8d4
Packit 1fb8d4
	flags = (down) ? PTR_FLAGS_DOWN : 0;
Packit 1fb8d4
Packit 1fb8d4
	if (button == DIBI_LEFT)
Packit 1fb8d4
		flags |= PTR_FLAGS_BUTTON1;
Packit 1fb8d4
	else if (button == DIBI_RIGHT)
Packit 1fb8d4
		flags |= PTR_FLAGS_BUTTON2;
Packit 1fb8d4
	else if (button == DIBI_MIDDLE)
Packit 1fb8d4
		flags |= PTR_FLAGS_BUTTON3;
Packit 1fb8d4
Packit 1fb8d4
	if (flags != 0)
Packit 1fb8d4
		input->MouseEvent(input, flags, x, y);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
void df_send_mouse_motion_event(rdpInput* input, UINT16 x, UINT16 y)
Packit 1fb8d4
{
Packit 1fb8d4
	input->MouseEvent(input, PTR_FLAGS_MOVE, x, y);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
void df_send_mouse_wheel_event(rdpInput* input, INT16 axisrel, UINT16 x, UINT16 y)
Packit 1fb8d4
{
Packit 1fb8d4
	UINT16 flags = PTR_FLAGS_WHEEL;
Packit 1fb8d4
Packit 1fb8d4
	if (axisrel < 0)
Packit 1fb8d4
		flags |= 0x0078;
Packit 1fb8d4
	else
Packit 1fb8d4
		flags |= PTR_FLAGS_WHEEL_NEGATIVE | 0x0088;
Packit 1fb8d4
Packit 1fb8d4
	input->MouseEvent(input, flags, x, y);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
void df_send_keyboard_event(rdpInput* input, BOOL down, BYTE keycode, BYTE function)
Packit 1fb8d4
{
Packit 1fb8d4
	DWORD scancode = 0;
Packit 1fb8d4
	BYTE vkcode = VK_NONE;
Packit 1fb8d4
Packit 1fb8d4
	if (keycode)
Packit 1fb8d4
		vkcode = keymap[keycode];
Packit 1fb8d4
	else if (function)
Packit 1fb8d4
		vkcode = functionmap[function];
Packit 1fb8d4
Packit 1fb8d4
	if (vkcode != VK_NONE)
Packit 1fb8d4
		scancode = GetVirtualScanCodeFromVirtualKeyCode(vkcode, input->context->settings->KeyboardType);
Packit 1fb8d4
Packit 1fb8d4
	if (scancode)
Packit 1fb8d4
		freerdp_input_send_keyboard_event_ex(input, down, scancode);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL df_event_process(freerdp* instance, DFBEvent* event)
Packit 1fb8d4
{
Packit 1fb8d4
	int flags;
Packit 1fb8d4
	rdpGdi* gdi;
Packit 1fb8d4
	dfInfo* dfi;
Packit 1fb8d4
	int pointer_x;
Packit 1fb8d4
	int pointer_y;
Packit 1fb8d4
	DFBInputEvent* input_event;
Packit 1fb8d4
Packit 1fb8d4
	gdi = instance->context->gdi;
Packit 1fb8d4
	dfi = ((dfContext*) instance->context)->dfi;
Packit 1fb8d4
Packit 1fb8d4
	dfi->layer->GetCursorPosition(dfi->layer, &pointer_x, &pointer_y);
Packit 1fb8d4
Packit 1fb8d4
	if (event->clazz == DFEC_INPUT)
Packit 1fb8d4
	{
Packit 1fb8d4
		flags = 0;
Packit 1fb8d4
		input_event = (DFBInputEvent*) event;
Packit 1fb8d4
Packit 1fb8d4
		switch (input_event->type)
Packit 1fb8d4
		{
Packit 1fb8d4
			case DIET_AXISMOTION:
Packit 1fb8d4
Packit 1fb8d4
				if (pointer_x > (gdi->width - 1))
Packit 1fb8d4
					pointer_x = gdi->width - 1;
Packit 1fb8d4
Packit 1fb8d4
				if (pointer_y > (gdi->height - 1))
Packit 1fb8d4
					pointer_y = gdi->height - 1;
Packit 1fb8d4
Packit 1fb8d4
				if (input_event->axis == DIAI_Z)
Packit 1fb8d4
				{
Packit 1fb8d4
					df_send_mouse_wheel_event(instance->input, input_event->axisrel, pointer_x, pointer_y);
Packit 1fb8d4
				}
Packit 1fb8d4
				else
Packit 1fb8d4
				{
Packit 1fb8d4
					df_send_mouse_motion_event(instance->input, pointer_x, pointer_y);
Packit 1fb8d4
				}
Packit 1fb8d4
				break;
Packit 1fb8d4
Packit 1fb8d4
			case DIET_BUTTONPRESS:
Packit 1fb8d4
				df_send_mouse_button_event(instance->input, TRUE, input_event->button, pointer_x, pointer_y);
Packit 1fb8d4
				break;
Packit 1fb8d4
Packit 1fb8d4
			case DIET_BUTTONRELEASE:
Packit 1fb8d4
				df_send_mouse_button_event(instance->input, FALSE, input_event->button, pointer_x, pointer_y);
Packit 1fb8d4
				break;
Packit 1fb8d4
Packit 1fb8d4
			case DIET_KEYPRESS:
Packit 1fb8d4
				df_send_keyboard_event(instance->input, TRUE, input_event->key_id - DIKI_UNKNOWN, input_event->key_symbol - DFB_FUNCTION_KEY(0));
Packit 1fb8d4
				break;
Packit 1fb8d4
Packit 1fb8d4
			case DIET_KEYRELEASE:
Packit 1fb8d4
				df_send_keyboard_event(instance->input, FALSE, input_event->key_id - DIKI_UNKNOWN, input_event->key_symbol - DFB_FUNCTION_KEY(0));
Packit 1fb8d4
				break;
Packit 1fb8d4
Packit 1fb8d4
			case DIET_UNKNOWN:
Packit 1fb8d4
				break;
Packit 1fb8d4
		}
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}