玉兔远程控制 0.1.0-bate11
载入中...
搜索中...
未找到
CursorFreeRDP.cpp
1// Author: Kang Lin <kl222@126.com>
3#include <QImage>
4#include <freerdp/gdi/gdi.h>
5#include <QLoggingCategory>
6#include "BackendFreeRDP.h"
7
8static Q_LOGGING_CATEGORY(log, "FreeRDP.Cursor")
10 : QObject(parent),
11 m_pConnect(parent)
12{}
13
14int CCursorFreeRDP::RegisterPointer(rdpGraphics *graphics)
15{
16 rdpPointer* pointer = NULL;
17 if (!(pointer = (rdpPointer*)calloc(1, sizeof(rdpPointer))))
18 return -1;
19 pointer->size = sizeof(_Pointer);
20 pointer->New = CbPointerNew;
21 pointer->Free = CbPointerFree;
22 pointer->Set = CbPointerSet;
23 pointer->SetNull = CbPointerSetNull;
24 pointer->SetDefault = CbPointerSetDefault;
25 pointer->SetPosition = CbPointerSetPosition;
26 graphics_register_pointer(graphics, pointer);
27 free(pointer);
28 return 0;
29}
30
31BOOL CCursorFreeRDP::CbPointerNew(rdpContext *context, rdpPointer *pointer)
32{
33 //qDebug(log) << "CbPointerNew";
34 CBackendFreeRDP* pThis = ((CBackendFreeRDP::ClientContext*)context)->pThis;
35 return pThis ? pThis->m_Cursor.OnNew(context, pointer) : false;
36}
37
38void CCursorFreeRDP::CbPointerFree(rdpContext* context, rdpPointer* pointer)
39{
40 //qDebug(log) << "CbPointerFree";
41 CBackendFreeRDP* pThis = ((CBackendFreeRDP::ClientContext*)context)->pThis;
42 if(pThis)
43 pThis->m_Cursor.OnFree(context, pointer);
44}
45
46BOOL CCursorFreeRDP::CbPointerSet(rdpContext *context,
47 #if FREERDP_VERSION_MAJOR >= 3
48 rdpPointer* pointer
49 #else
50 const rdpPointer *pointer
51 #endif
52 )
53{
54 //qDebug(log) << "CbPointerSet";
55 CBackendFreeRDP* pThis = ((CBackendFreeRDP::ClientContext*)context)->pThis;
56 return pThis ? pThis->m_Cursor.OnSet(context, pointer) : false;
57}
58
59BOOL CCursorFreeRDP::CbPointerSetNull(rdpContext *context)
60{
61 //qDebug(log) << "CbPointerSetNull";
62 CBackendFreeRDP* pThis = ((CBackendFreeRDP::ClientContext*)context)->pThis;
63 return pThis ? pThis->m_Cursor.OnSetNull(context) : false;
64}
65
66BOOL CCursorFreeRDP::CbPointerSetDefault(rdpContext *context)
67{
68 //qDebug(log) << "CbPointerSetDefault";
69 CBackendFreeRDP* pThis = ((CBackendFreeRDP::ClientContext*)context)->pThis;
70 return pThis ? pThis->m_Cursor.OnSetDefault(context) : false;
71}
72
73BOOL CCursorFreeRDP::CbPointerSetPosition(rdpContext *context, UINT32 x, UINT32 y)
74{
75 //qDebug(log) << "CbPointerSetPosition:" << x << y;
76 CBackendFreeRDP* pThis = ((CBackendFreeRDP::ClientContext*)context)->pThis;
77 return pThis ? pThis->m_Cursor.OnSetPosition(context, x, y) : false;
78}
79
80BOOL CCursorFreeRDP::OnNew(rdpContext *context, rdpPointer *pointer)
81{
82 qDebug(log) << "onNew:" << pointer->xPos << pointer->yPos << pointer->width << pointer->height;
83 BOOL bRet = TRUE;
84 QImage cursor(pointer->width, pointer->height, QImage::Format_ARGB32);
92 bRet = freerdp_image_copy_from_pointer_data(cursor.bits(),
93 CBackendFreeRDP::GetImageFormat(cursor.format()),
94 0,
95 0, 0, cursor.width(), cursor.height(),
96 pointer->xorMaskData,
97 pointer->lengthXorMask,
98 pointer->andMaskData,
99 pointer->lengthAndMask,
100 pointer->xorBpp,
101 &context->gdi->palette);
102 if(bRet) {
103 m_Cursor = cursor;
104 emit m_pConnect->sigUpdateCursor(
105 QCursor(QPixmap::fromImage(m_Cursor), pointer->xPos, pointer->yPos));
106 }
107 return bRet;
108}
109
110void CCursorFreeRDP::OnFree(rdpContext* context, rdpPointer* pointer)
111{
112 qDebug(log) << "OnFree";
113 Q_UNUSED(context)
114 Q_UNUSED(pointer)
115}
116
117BOOL CCursorFreeRDP::OnSet(rdpContext *context, const rdpPointer *pointer)
118{
119 qDebug(log) << "OnSet:" << pointer->xPos << pointer->yPos << pointer->width << pointer->height;
120 BOOL bRet = TRUE;
121 QImage cursor(pointer->width, pointer->height, QImage::Format_ARGB32);
129 bRet = freerdp_image_copy_from_pointer_data(cursor.bits(),
130 CBackendFreeRDP::GetImageFormat(cursor.format()),
131 0,
132 0, 0, cursor.width(), cursor.height(),
133 pointer->xorMaskData,
134 pointer->lengthXorMask,
135 pointer->andMaskData,
136 pointer->lengthAndMask,
137 pointer->xorBpp,
138 &context->gdi->palette);
139 if(bRet) {
140 m_Cursor = cursor;
141 emit m_pConnect->sigUpdateCursor(
142 QCursor(QPixmap::fromImage(m_Cursor), pointer->xPos, pointer->yPos));
143 }
144 return bRet;
145}
146
147BOOL CCursorFreeRDP::OnSetDefault(rdpContext *context)
148{
149 qDebug(log) << "OnSetDefault";
150 Q_UNUSED(context)
151 m_Cursor = QImage();
152 emit m_pConnect->sigUpdateCursor(QCursor());
153 return TRUE;
154}
155
156BOOL CCursorFreeRDP::OnSetNull(rdpContext *context)
157{
158 qDebug(log) << "OnSetNull";
159 Q_UNUSED(context)
160 m_Cursor = QImage();
161 emit m_pConnect->sigUpdateCursor(QCursor(Qt::BlankCursor));
162 return TRUE;
163}
164
165BOOL CCursorFreeRDP::OnSetPosition(rdpContext *context, UINT32 x, UINT32 y)
166{
167 qDebug(log) << "OnSetPosition" << x << y;
168 Q_UNUSED(context)
169 emit m_pConnect->sigUpdateCursorPosition(QPoint(x, y));
170 return TRUE;
171}
BOOL OnNew(rdpContext *context, rdpPointer *pointer)
BOOL OnSet(rdpContext *context, const rdpPointer *pointer)