summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
authorMarc-André Moreau <marcandre.moreau@gmail.com>2013-05-13 19:17:25 -0400
committerMarc-André Moreau <marcandre.moreau@gmail.com>2013-05-13 19:17:25 -0400
commitb385e61bc0a05d1ca0af204edc6430a679ee9418 (patch)
tree62d6b223ca615d05d18f0ffaf89d3850f19c568a /channels
parentd96249e19fef32455ad0ce8f961a435133ed14f1 (diff)
downloadfreerdp-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.txt5
-rw-r--r--channels/rdpei/client/rdpei_main.c92
-rw-r--r--channels/rdpei/client/rdpei_main.h35
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