diff options
author | Marc-André Moreau <marcandre.moreau@gmail.com> | 2013-05-13 19:17:25 -0400 |
---|---|---|
committer | Marc-André Moreau <marcandre.moreau@gmail.com> | 2013-05-13 19:17:25 -0400 |
commit | b385e61bc0a05d1ca0af204edc6430a679ee9418 (patch) | |
tree | 62d6b223ca615d05d18f0ffaf89d3850f19c568a /channels | |
parent | d96249e19fef32455ad0ce8f961a435133ed14f1 (diff) | |
download | freerdp-b385e61bc0a05d1ca0af204edc6430a679ee9418.tar.gz freerdp-b385e61bc0a05d1ca0af204edc6430a679ee9418.tar.bz2 freerdp-b385e61bc0a05d1ca0af204edc6430a679ee9418.zip |
xfreerdp-client: start trying to send multitouch events
Diffstat (limited to 'channels')
-rw-r--r-- | channels/rdpei/client/CMakeLists.txt | 5 | ||||
-rw-r--r-- | channels/rdpei/client/rdpei_main.c | 92 | ||||
-rw-r--r-- | channels/rdpei/client/rdpei_main.h | 35 |
3 files changed, 81 insertions, 51 deletions
diff --git a/channels/rdpei/client/CMakeLists.txt b/channels/rdpei/client/CMakeLists.txt index b3aacdcb2..b96082550 100644 --- a/channels/rdpei/client/CMakeLists.txt +++ b/channels/rdpei/client/CMakeLists.txt @@ -33,6 +33,11 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} MODULE freerdp MODULES freerdp-common freerdp-utils) + +set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS + MONOLITHIC ${MONOLITHIC_BUILD} + MODULE winpr + MODULES winpr-sysinfo) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/channels/rdpei/client/rdpei_main.c b/channels/rdpei/client/rdpei_main.c index a624d83e0..026f73c93 100644 --- a/channels/rdpei/client/rdpei_main.c +++ b/channels/rdpei/client/rdpei_main.c @@ -27,6 +27,7 @@ #include <winpr/crt.h> #include <winpr/stream.h> +#include <winpr/sysinfo.h> #include <winpr/cmdline.h> #include <freerdp/addin.h> @@ -35,24 +36,27 @@ #include "rdpei_main.h" -struct _RDPEI_LISTENER_CALLBACK +#define MAX_CONTACTS 512 + +struct _RDPEI_CHANNEL_CALLBACK { - IWTSListenerCallback iface; + IWTSVirtualChannelCallback iface; IWTSPlugin* plugin; IWTSVirtualChannelManager* channel_mgr; + IWTSVirtualChannel* channel; }; -typedef struct _RDPEI_LISTENER_CALLBACK RDPEI_LISTENER_CALLBACK; +typedef struct _RDPEI_CHANNEL_CALLBACK RDPEI_CHANNEL_CALLBACK; -struct _RDPEI_CHANNEL_CALLBACK +struct _RDPEI_LISTENER_CALLBACK { - IWTSVirtualChannelCallback iface; + IWTSListenerCallback iface; IWTSPlugin* plugin; IWTSVirtualChannelManager* channel_mgr; - IWTSVirtualChannel* channel; + RDPEI_CHANNEL_CALLBACK* channel_callback; }; -typedef struct _RDPEI_CHANNEL_CALLBACK RDPEI_CHANNEL_CALLBACK; +typedef struct _RDPEI_LISTENER_CALLBACK RDPEI_LISTENER_CALLBACK; struct _RDPEI_PLUGIN { @@ -60,6 +64,12 @@ struct _RDPEI_PLUGIN IWTSListener* listener; RDPEI_LISTENER_CALLBACK* listener_callback; + + int version; + UINT64 currentFrameTime; + UINT64 previousFrameTime; + RDPINPUT_TOUCH_FRAME frame; + RDPINPUT_CONTACT_DATA contacts[MAX_CONTACTS]; }; typedef struct _RDPEI_PLUGIN RDPEI_PLUGIN; @@ -164,29 +174,24 @@ int rdpei_write_touch_frame(wStream* s, RDPINPUT_TOUCH_FRAME* frame) return 0; } -int rdpei_send_touch_event_pdu(RDPEI_CHANNEL_CALLBACK* callback) +int rdpei_send_touch_event_pdu(RDPEI_CHANNEL_CALLBACK* callback, RDPINPUT_TOUCH_FRAME* frame) { int status; wStream* s; UINT32 pduLength; UINT32 encodeTime; UINT16 frameCount; - RDPINPUT_TOUCH_FRAME frame; - RDPINPUT_CONTACT_DATA contact; - encodeTime = 123; + encodeTime = 0; frameCount = 1; - frame.contactCount = 1; - frame.contacts = &contact; - s = Stream_New(NULL, 512); Stream_Seek(s, RDPINPUT_HEADER_LENGTH); rdpei_write_4byte_unsigned(s, encodeTime); rdpei_write_2byte_unsigned(s, frameCount); - rdpei_write_touch_frame(s, &frame); + rdpei_write_touch_frame(s, frame); Stream_SealLength(s); pduLength = Stream_Length(s); @@ -298,6 +303,7 @@ static int rdpei_on_new_channel_connection(IWTSListenerCallback* pListenerCallba callback->plugin = listener_callback->plugin; callback->channel_mgr = listener_callback->channel_mgr; callback->channel = pChannel; + listener_callback->channel_callback = callback; *ppCallback = (IWTSVirtualChannelCallback*) callback; @@ -343,7 +349,53 @@ static int rdpei_plugin_terminated(IWTSPlugin* pPlugin) int rdpei_get_version(RdpeiClientContext* context) { - //RDPEI_PLUGIN* rdpei = (RDPEI_PLUGIN*) context->handle; + RDPEI_PLUGIN* rdpei = (RDPEI_PLUGIN*) context->handle; + return rdpei->version; +} + +int rdpei_begin_frame(RdpeiClientContext* context) +{ + RDPEI_PLUGIN* rdpei = (RDPEI_PLUGIN*) context->handle; + + rdpei->frame.contactCount = 0; + rdpei->frame.frameOffset = 0; + + return 1; +} + +int rdpei_end_frame(RdpeiClientContext* context) +{ + RDPEI_PLUGIN* rdpei = (RDPEI_PLUGIN*) context->handle; + RDPEI_CHANNEL_CALLBACK* callback = rdpei->listener_callback->channel_callback; + + if (!rdpei->previousFrameTime && !rdpei->currentFrameTime) + { + rdpei->currentFrameTime = (UINT64) GetTickCount64(); + rdpei->frame.frameOffset = 0; + } + else + { + rdpei->currentFrameTime = (UINT64) GetTickCount64(); + rdpei->frame.frameOffset = rdpei->currentFrameTime - rdpei->previousFrameTime; + } + + rdpei_send_touch_event_pdu(callback, &rdpei->frame); + rdpei->previousFrameTime = rdpei->currentFrameTime; + rdpei->frame.contactCount = 0; + + return 1; +} + +int rdpei_add_contact(RdpeiClientContext* context, RDPINPUT_CONTACT_DATA* contact) +{ + RDPEI_PLUGIN* rdpei = (RDPEI_PLUGIN*) context->handle; + + if (rdpei->frame.contactCount < MAX_CONTACTS) + { + CopyMemory(&(rdpei->contacts[rdpei->frame.contactCount]), contact, sizeof(RDPINPUT_CONTACT_DATA)); + rdpei->frame.contactCount++; + } + return 1; } @@ -369,10 +421,18 @@ int DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) rdpei->iface.Disconnected = NULL; rdpei->iface.Terminated = rdpei_plugin_terminated; + rdpei->version = 1; + rdpei->currentFrameTime = 0; + rdpei->previousFrameTime = 0; + rdpei->frame.contacts = (RDPINPUT_CONTACT_DATA*) rdpei->contacts; + context = (RdpeiClientContext*) malloc(sizeof(RdpeiClientContext)); context->handle = (void*) rdpei; context->GetVersion = rdpei_get_version; + context->BeginFrame = rdpei_begin_frame; + context->EndFrame = rdpei_end_frame; + context->AddContact = rdpei_add_contact; rdpei->iface.pInterface = (void*) context; diff --git a/channels/rdpei/client/rdpei_main.h b/channels/rdpei/client/rdpei_main.h index 6438762f5..5781ee654 100644 --- a/channels/rdpei/client/rdpei_main.h +++ b/channels/rdpei/client/rdpei_main.h @@ -33,41 +33,6 @@ #define RDPINPUT_HEADER_LENGTH 6 -#define CONTACT_DATA_CONTACTRECT_PRESENT 0x0001 -#define CONTACT_DATA_ORIENTATION_PRESENT 0x0002 -#define CONTACT_DATA_PRESSURE_PRESENT 0x0004 - -#define CONTACT_FLAG_DOWN 0x0001 -#define CONTACT_FLAG_UPDATE 0x0002 -#define CONTACT_FLAG_UP 0x0004 -#define CONTACT_FLAG_INRANGE 0x0008 -#define CONTACT_FLAG_INCONTACT 0x0010 -#define CONTACT_FLAG_CANCELED 0x0020 - -struct _RDPINPUT_CONTACT_DATA -{ - UINT32 contactId; - UINT32 fieldsPresent; - INT32 x; - INT32 y; - UINT32 contactFlags; - INT32 contactRectLeft; - INT32 contactRectTop; - INT32 contactRectRight; - INT32 contactRectBottom; - UINT32 orientation; - UINT32 pressure; -}; -typedef struct _RDPINPUT_CONTACT_DATA RDPINPUT_CONTACT_DATA; - -struct _RDPINPUT_TOUCH_FRAME -{ - UINT32 contactCount; - UINT64 frameOffset; - RDPINPUT_CONTACT_DATA* contacts; -}; -typedef struct _RDPINPUT_TOUCH_FRAME RDPINPUT_TOUCH_FRAME; - /* Protocol Version */ #define RDPINPUT_PROTOCOL_V1 0x00010000 |