|
|
@ -19,6 +19,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
#include "xrdp-freerdp.h"
|
|
|
|
#include "xrdp-freerdp.h"
|
|
|
|
#include "xrdp-color.h"
|
|
|
|
#include "xrdp-color.h"
|
|
|
|
|
|
|
|
#include "xrdp_rail.h"
|
|
|
|
|
|
|
|
|
|
|
|
#define LOG_LEVEL 1
|
|
|
|
#define LOG_LEVEL 1
|
|
|
|
#define LLOG(_level, _args) \
|
|
|
|
#define LLOG(_level, _args) \
|
|
|
@ -228,8 +229,8 @@ lxrdp_event(struct mod* mod, int msg, long param1, long param2,
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
rectangle->left = (param1 >> 16) & 0xffff;
|
|
|
|
rectangle->left = (param1 >> 16) & 0xffff;
|
|
|
|
rectangle->top = param1 & 0xffff;
|
|
|
|
rectangle->top = param1 & 0xffff;
|
|
|
|
rectangle->right = (param2 >> 16) & 0xffff + rectangle->left - 1;
|
|
|
|
rectangle->right = (((param2 >> 16) & 0xffff) + rectangle->left) - 1;
|
|
|
|
rectangle->bottom = param2 & 0xffff + rectangle->top - 1;
|
|
|
|
rectangle->bottom = ((param2 & 0xffff) + rectangle->top) - 1;
|
|
|
|
if (mod->inst->settings->refresh_rect)
|
|
|
|
if (mod->inst->settings->refresh_rect)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (mod->inst->update != NULL)
|
|
|
|
if (mod->inst->update != NULL)
|
|
|
@ -279,13 +280,14 @@ lxrdp_event(struct mod* mod, int msg, long param1, long param2,
|
|
|
|
switch (flags & 3)
|
|
|
|
switch (flags & 3)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
case 3:
|
|
|
|
case 3:
|
|
|
|
mod->inst->SendChannelData(mod->inst, lchid, data, total_size);
|
|
|
|
mod->inst->SendChannelData(mod->inst, lchid, (tui8*)data, total_size);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
case 2:
|
|
|
|
/* end */
|
|
|
|
/* end */
|
|
|
|
g_memcpy(mod->chan_buf + mod->chan_buf_valid, data, size);
|
|
|
|
g_memcpy(mod->chan_buf + mod->chan_buf_valid, data, size);
|
|
|
|
mod->chan_buf_valid += size;
|
|
|
|
mod->chan_buf_valid += size;
|
|
|
|
mod->inst->SendChannelData(mod->inst, lchid, mod->chan_buf, total_size);
|
|
|
|
mod->inst->SendChannelData(mod->inst, lchid, (tui8*)(mod->chan_buf),
|
|
|
|
|
|
|
|
total_size);
|
|
|
|
g_free(mod->chan_buf);
|
|
|
|
g_free(mod->chan_buf);
|
|
|
|
mod->chan_buf = 0;
|
|
|
|
mod->chan_buf = 0;
|
|
|
|
mod->chan_buf_bytes = 0;
|
|
|
|
mod->chan_buf_bytes = 0;
|
|
|
@ -391,6 +393,7 @@ lxrdp_set_param(struct mod* mod, char* name, char* value)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (g_strcmp(name, "client_info") == 0)
|
|
|
|
else if (g_strcmp(name, "client_info") == 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
g_memcpy(&(mod->client_info), value, sizeof(mod->client_info));
|
|
|
|
/* This is a Struct and cannot be printed in next else*/
|
|
|
|
/* This is a Struct and cannot be printed in next else*/
|
|
|
|
LLOGLN(10, ("Client_info struct ignored"));
|
|
|
|
LLOGLN(10, ("Client_info struct ignored"));
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -509,10 +512,10 @@ lfreerdp_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmap)
|
|
|
|
int j;
|
|
|
|
int j;
|
|
|
|
int line_bytes;
|
|
|
|
int line_bytes;
|
|
|
|
BITMAP_DATA* bd;
|
|
|
|
BITMAP_DATA* bd;
|
|
|
|
tui8* dst_data;
|
|
|
|
char* dst_data;
|
|
|
|
tui8* dst_data1;
|
|
|
|
char* dst_data1;
|
|
|
|
tui8* src;
|
|
|
|
char* src;
|
|
|
|
tui8* dst;
|
|
|
|
char* dst;
|
|
|
|
|
|
|
|
|
|
|
|
mod = ((struct mod_context*)context)->modi;
|
|
|
|
mod = ((struct mod_context*)context)->modi;
|
|
|
|
LLOGLN(10, ("lfreerdp_bitmap_update: %d %d", bitmap->number, bitmap->count));
|
|
|
|
LLOGLN(10, ("lfreerdp_bitmap_update: %d %d", bitmap->number, bitmap->count));
|
|
|
@ -527,15 +530,15 @@ lfreerdp_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmap)
|
|
|
|
cx = (bd->destRight - bd->destLeft) + 1;
|
|
|
|
cx = (bd->destRight - bd->destLeft) + 1;
|
|
|
|
cy = (bd->destBottom - bd->destTop) + 1;
|
|
|
|
cy = (bd->destBottom - bd->destTop) + 1;
|
|
|
|
line_bytes = server_Bpp * bd->width;
|
|
|
|
line_bytes = server_Bpp * bd->width;
|
|
|
|
dst_data = (tui8*)g_malloc(bd->height * line_bytes + 16, 0);
|
|
|
|
dst_data = (char*)g_malloc(bd->height * line_bytes + 16, 0);
|
|
|
|
if (bd->compressed)
|
|
|
|
if (bd->compressed)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
bitmap_decompress(bd->bitmapDataStream, dst_data, bd->width,
|
|
|
|
bitmap_decompress(bd->bitmapDataStream, (tui8*)dst_data, bd->width,
|
|
|
|
bd->height, bd->bitmapLength, server_bpp, server_bpp);
|
|
|
|
bd->height, bd->bitmapLength, server_bpp, server_bpp);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{ /* bitmap is upside down */
|
|
|
|
{ /* bitmap is upside down */
|
|
|
|
src = bd->bitmapDataStream;
|
|
|
|
src = (char*)(bd->bitmapDataStream);
|
|
|
|
dst = dst_data + bd->height * line_bytes;
|
|
|
|
dst = dst_data + bd->height * line_bytes;
|
|
|
|
for (j = 0; j < bd->height; j++)
|
|
|
|
for (j = 0; j < bd->height; j++)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -614,7 +617,8 @@ lfreerdp_pat_blt(rdpContext* context, PATBLT_ORDER* patblt)
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
mod->server_set_brush(mod, patblt->brush.x, patblt->brush.y,
|
|
|
|
mod->server_set_brush(mod, patblt->brush.x, patblt->brush.y,
|
|
|
|
patblt->brush.style, patblt->brush.p8x8);
|
|
|
|
patblt->brush.style,
|
|
|
|
|
|
|
|
(char*)(patblt->brush.p8x8));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
mod->server_fill_rect(mod, patblt->nLeftRect, patblt->nTopRect,
|
|
|
|
mod->server_fill_rect(mod, patblt->nLeftRect, patblt->nTopRect,
|
|
|
|
patblt->nWidth, patblt->nHeight);
|
|
|
|
patblt->nWidth, patblt->nHeight);
|
|
|
@ -728,7 +732,7 @@ lfreerdp_glyph_index(rdpContext* context, GLYPH_INDEX_ORDER* glyph_index)
|
|
|
|
glyph_index->opLeft, glyph_index->opTop,
|
|
|
|
glyph_index->opLeft, glyph_index->opTop,
|
|
|
|
glyph_index->opRight, glyph_index->opBottom,
|
|
|
|
glyph_index->opRight, glyph_index->opBottom,
|
|
|
|
glyph_index->x, glyph_index->y,
|
|
|
|
glyph_index->x, glyph_index->y,
|
|
|
|
glyph_index->data, glyph_index->cbData);
|
|
|
|
(char*)(glyph_index->data), glyph_index->cbData);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
/******************************************************************************/
|
|
|
@ -845,14 +849,14 @@ lfreerdp_cache_bitmapV2(rdpContext* context,
|
|
|
|
if (cache_bitmap_v2_order->compressed)
|
|
|
|
if (cache_bitmap_v2_order->compressed)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
bitmap_decompress(cache_bitmap_v2_order->bitmapDataStream,
|
|
|
|
bitmap_decompress(cache_bitmap_v2_order->bitmapDataStream,
|
|
|
|
dst_data, width, height,
|
|
|
|
(tui8*)dst_data, width, height,
|
|
|
|
cache_bitmap_v2_order->bitmapLength,
|
|
|
|
cache_bitmap_v2_order->bitmapLength,
|
|
|
|
server_bpp, server_bpp);
|
|
|
|
server_bpp, server_bpp);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
/* Uncompressed bitmaps are upside down */
|
|
|
|
/* Uncompressed bitmaps are upside down */
|
|
|
|
lfreerdp_upsidedown(dst_data, cache_bitmap_v2_order, server_Bpp);
|
|
|
|
lfreerdp_upsidedown((tui8*)dst_data, cache_bitmap_v2_order, server_Bpp);
|
|
|
|
LLOGLN(10, ("lfreerdp_cache_bitmapV2: upside down progressed"));
|
|
|
|
LLOGLN(10, ("lfreerdp_cache_bitmapV2: upside down progressed"));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
dst_data1 = convert_bitmap(server_bpp, client_bpp, dst_data,
|
|
|
|
dst_data1 = convert_bitmap(server_bpp, client_bpp, dst_data,
|
|
|
@ -883,7 +887,7 @@ lfreerdp_cache_glyph(rdpContext* context, CACHE_GLYPH_ORDER* cache_glyph_order)
|
|
|
|
LLOGLN(10, (" %d %d %d %d %d", gd->cacheIndex, gd->x, gd->y,
|
|
|
|
LLOGLN(10, (" %d %d %d %d %d", gd->cacheIndex, gd->x, gd->y,
|
|
|
|
gd->cx, gd->cy));
|
|
|
|
gd->cx, gd->cy));
|
|
|
|
mod->server_add_char(mod, cache_glyph_order->cacheId, gd->cacheIndex,
|
|
|
|
mod->server_add_char(mod, cache_glyph_order->cacheId, gd->cacheIndex,
|
|
|
|
gd->x, gd->y, gd->cx, gd->cy, gd->aj);
|
|
|
|
gd->x, gd->y, gd->cx, gd->cy, (char*)(gd->aj));
|
|
|
|
xfree(gd->aj);
|
|
|
|
xfree(gd->aj);
|
|
|
|
gd->aj = 0;
|
|
|
|
gd->aj = 0;
|
|
|
|
xfree(gd);
|
|
|
|
xfree(gd);
|
|
|
@ -1089,14 +1093,14 @@ lfreerdp_pointer_new(rdpContext* context,
|
|
|
|
mod->pointer_cache[index].hotx = pointer_new->colorPtrAttr.xPos;
|
|
|
|
mod->pointer_cache[index].hotx = pointer_new->colorPtrAttr.xPos;
|
|
|
|
mod->pointer_cache[index].hoty = pointer_new->colorPtrAttr.yPos;
|
|
|
|
mod->pointer_cache[index].hoty = pointer_new->colorPtrAttr.yPos;
|
|
|
|
|
|
|
|
|
|
|
|
dst = mod->pointer_cache[index].data;
|
|
|
|
dst = (tui8*)(mod->pointer_cache[index].data);
|
|
|
|
dst += 32 * 32 * 3 - 32 * 3;
|
|
|
|
dst += 32 * 32 * 3 - 32 * 3;
|
|
|
|
src = pointer_new->colorPtrAttr.xorMaskData;
|
|
|
|
src = pointer_new->colorPtrAttr.xorMaskData;
|
|
|
|
lfreerdp_convert_color_image(dst, 32, 32, 24, 32 * -3,
|
|
|
|
lfreerdp_convert_color_image(dst, 32, 32, 24, 32 * -3,
|
|
|
|
src, 32, 32, 1, 32 / 8);
|
|
|
|
src, 32, 32, 1, 32 / 8);
|
|
|
|
|
|
|
|
|
|
|
|
dst = mod->pointer_cache[index].mask;
|
|
|
|
dst = (tui8*)(mod->pointer_cache[index].mask);
|
|
|
|
dst += 32 * 32 / 8 - 32 / 8;
|
|
|
|
dst +=( 32 * 32 / 8) - (32 / 8);
|
|
|
|
src = pointer_new->colorPtrAttr.andMaskData;
|
|
|
|
src = pointer_new->colorPtrAttr.andMaskData;
|
|
|
|
lfreerdp_convert_color_image(dst, 32, 32, 1, 32 / -8,
|
|
|
|
lfreerdp_convert_color_image(dst, 32, 32, 1, 32 / -8,
|
|
|
|
src, 32, 32, 1, 32 / 8);
|
|
|
|
src, 32, 32, 1, 32 / 8);
|
|
|
@ -1205,6 +1209,14 @@ lfreerdp_pre_connect(freerdp* instance)
|
|
|
|
instance->settings->username = g_strdup(mod->username);
|
|
|
|
instance->settings->username = g_strdup(mod->username);
|
|
|
|
instance->settings->password = g_strdup(mod->password);
|
|
|
|
instance->settings->password = g_strdup(mod->password);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (mod->client_info.rail_support_level > 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
instance->settings->remote_app = true;
|
|
|
|
|
|
|
|
instance->settings->rail_langbar_supported = true;
|
|
|
|
|
|
|
|
instance->settings->workarea = true;
|
|
|
|
|
|
|
|
instance->settings->performance_flags = PERF_DISABLE_WALLPAPER | PERF_DISABLE_FULLWINDOWDRAG;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// here
|
|
|
|
// here
|
|
|
|
//instance->settings->rdp_version = 4;
|
|
|
|
//instance->settings->rdp_version = 4;
|
|
|
|
|
|
|
|
|
|
|
@ -1245,6 +1257,263 @@ lfreerdp_pre_connect(freerdp* instance)
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
void DEFAULT_CC
|
|
|
|
|
|
|
|
lrail_WindowCreate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo,
|
|
|
|
|
|
|
|
WINDOW_STATE_ORDER* window_state)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
int index;
|
|
|
|
|
|
|
|
struct mod* mod;
|
|
|
|
|
|
|
|
struct rail_window_state_order wso;
|
|
|
|
|
|
|
|
UNICONV* uniconv;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LLOGLN(0, ("llrail_WindowCreate:"));
|
|
|
|
|
|
|
|
uniconv = freerdp_uniconv_new();
|
|
|
|
|
|
|
|
mod = ((struct mod_context*)context)->modi;
|
|
|
|
|
|
|
|
memset(&wso, 0, sizeof(wso));
|
|
|
|
|
|
|
|
/* copy the window state order */
|
|
|
|
|
|
|
|
wso.owner_window_id = window_state->ownerWindowId;
|
|
|
|
|
|
|
|
wso.style = window_state->style;
|
|
|
|
|
|
|
|
wso.extended_style = window_state->extendedStyle;
|
|
|
|
|
|
|
|
wso.show_state = window_state->showState;
|
|
|
|
|
|
|
|
if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_TITLE)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
wso.title_info = freerdp_uniconv_in(uniconv,
|
|
|
|
|
|
|
|
window_state->titleInfo.string, window_state->titleInfo.length);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
LLOGLN(0, ("lrail_WindowCreate: %s", wso.title_info));
|
|
|
|
|
|
|
|
wso.client_offset_x = window_state->clientOffsetX;
|
|
|
|
|
|
|
|
wso.client_offset_y = window_state->clientOffsetY;
|
|
|
|
|
|
|
|
wso.client_area_width = window_state->clientAreaWidth;
|
|
|
|
|
|
|
|
wso.client_area_height = window_state->clientAreaHeight;
|
|
|
|
|
|
|
|
wso.rp_content = window_state->RPContent;
|
|
|
|
|
|
|
|
wso.root_parent_handle = window_state->rootParentHandle;
|
|
|
|
|
|
|
|
wso.window_offset_x = window_state->windowOffsetX;
|
|
|
|
|
|
|
|
wso.window_offset_y = window_state->windowOffsetY;
|
|
|
|
|
|
|
|
wso.window_client_delta_x = window_state->windowClientDeltaX;
|
|
|
|
|
|
|
|
wso.window_client_delta_y = window_state->windowClientDeltaY;
|
|
|
|
|
|
|
|
wso.window_width = window_state->windowWidth;
|
|
|
|
|
|
|
|
wso.window_height = window_state->windowHeight;
|
|
|
|
|
|
|
|
wso.num_window_rects = window_state->numWindowRects;
|
|
|
|
|
|
|
|
if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_WND_RECTS)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
wso.window_rects = (struct rail_window_rect*)
|
|
|
|
|
|
|
|
g_malloc(sizeof(struct rail_window_rect) * wso.num_window_rects, 0);
|
|
|
|
|
|
|
|
for (index = 0; index < wso.num_window_rects; index++)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
wso.window_rects[index].left = window_state->windowRects[index].left;
|
|
|
|
|
|
|
|
wso.window_rects[index].top = window_state->windowRects[index].top;
|
|
|
|
|
|
|
|
wso.window_rects[index].right = window_state->windowRects[index].right;
|
|
|
|
|
|
|
|
wso.window_rects[index].bottom = window_state->windowRects[index].bottom;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
wso.visible_offset_x = window_state->visibleOffsetX;
|
|
|
|
|
|
|
|
wso.visible_offset_y = window_state->visibleOffsetY;
|
|
|
|
|
|
|
|
wso.num_visibility_rects = window_state->numVisibilityRects;
|
|
|
|
|
|
|
|
if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_VISIBILITY)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
wso.visibility_rects = (struct rail_window_rect*)
|
|
|
|
|
|
|
|
g_malloc(sizeof(struct rail_window_rect) * wso.num_visibility_rects, 0);
|
|
|
|
|
|
|
|
for (index = 0; index < wso.num_visibility_rects; index++)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
wso.visibility_rects[index].left = window_state->visibilityRects[index].left;
|
|
|
|
|
|
|
|
wso.visibility_rects[index].top = window_state->visibilityRects[index].top;
|
|
|
|
|
|
|
|
wso.visibility_rects[index].right = window_state->visibilityRects[index].right;
|
|
|
|
|
|
|
|
wso.visibility_rects[index].bottom = window_state->visibilityRects[index].bottom;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mod->server_window_new_update(mod, orderInfo->windowId, &wso,
|
|
|
|
|
|
|
|
orderInfo->fieldFlags);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xfree(wso.title_info);
|
|
|
|
|
|
|
|
g_free(wso.window_rects);
|
|
|
|
|
|
|
|
g_free(wso.visibility_rects);
|
|
|
|
|
|
|
|
freerdp_uniconv_free(uniconv);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
void DEFAULT_CC
|
|
|
|
|
|
|
|
lrail_WindowUpdate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo,
|
|
|
|
|
|
|
|
WINDOW_STATE_ORDER* window_state)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
LLOGLN(0, ("lrail_WindowUpdate:"));
|
|
|
|
|
|
|
|
lrail_WindowCreate(context, orderInfo, window_state);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
void DEFAULT_CC
|
|
|
|
|
|
|
|
lrail_WindowDelete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
struct mod* mod;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LLOGLN(0, ("lrail_WindowDelete:"));
|
|
|
|
|
|
|
|
mod = ((struct mod_context*)context)->modi;
|
|
|
|
|
|
|
|
mod->server_window_delete(mod, orderInfo->windowId);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
void DEFAULT_CC
|
|
|
|
|
|
|
|
lrail_WindowIcon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo,
|
|
|
|
|
|
|
|
WINDOW_ICON_ORDER* window_icon)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
struct mod* mod;
|
|
|
|
|
|
|
|
struct rail_icon_info rii;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LLOGLN(0, ("lrail_WindowIcon:"));
|
|
|
|
|
|
|
|
mod = ((struct mod_context*)context)->modi;
|
|
|
|
|
|
|
|
memset(&rii, 0, sizeof(rii));
|
|
|
|
|
|
|
|
rii.bpp = window_icon->iconInfo->bpp;
|
|
|
|
|
|
|
|
rii.width = window_icon->iconInfo->width;
|
|
|
|
|
|
|
|
rii.height = window_icon->iconInfo->height;
|
|
|
|
|
|
|
|
rii.cmap_bytes = window_icon->iconInfo->cbColorTable;
|
|
|
|
|
|
|
|
rii.mask_bytes = window_icon->iconInfo->cbBitsMask;
|
|
|
|
|
|
|
|
rii.data_bytes = window_icon->iconInfo->cbBitsColor;
|
|
|
|
|
|
|
|
rii.mask = (char*)(window_icon->iconInfo->bitsMask);
|
|
|
|
|
|
|
|
rii.cmap = (char*)(window_icon->iconInfo->colorTable);
|
|
|
|
|
|
|
|
rii.data = (char*)(window_icon->iconInfo->bitsColor);
|
|
|
|
|
|
|
|
mod->server_window_icon(mod, orderInfo->windowId,
|
|
|
|
|
|
|
|
window_icon->iconInfo->cacheEntry,
|
|
|
|
|
|
|
|
window_icon->iconInfo->cacheId, &rii,
|
|
|
|
|
|
|
|
orderInfo->fieldFlags);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
void DEFAULT_CC
|
|
|
|
|
|
|
|
lrail_WindowCachedIcon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo,
|
|
|
|
|
|
|
|
WINDOW_CACHED_ICON_ORDER* window_cached_icon)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
struct mod* mod;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LLOGLN(0, ("lrail_WindowCachedIcon:"));
|
|
|
|
|
|
|
|
mod = ((struct mod_context*)context)->modi;
|
|
|
|
|
|
|
|
mod->server_window_cached_icon(mod, orderInfo->windowId,
|
|
|
|
|
|
|
|
window_cached_icon->cachedIcon.cacheEntry,
|
|
|
|
|
|
|
|
window_cached_icon->cachedIcon.cacheId,
|
|
|
|
|
|
|
|
orderInfo->fieldFlags);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
void DEFAULT_CC
|
|
|
|
|
|
|
|
lrail_NotifyIconCreate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo,
|
|
|
|
|
|
|
|
NOTIFY_ICON_STATE_ORDER* notify_icon_state)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
struct mod* mod;
|
|
|
|
|
|
|
|
struct rail_notify_state_order rnso;
|
|
|
|
|
|
|
|
UNICONV* uniconv;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LLOGLN(0, ("lrail_NotifyIconCreate:"));
|
|
|
|
|
|
|
|
uniconv = freerdp_uniconv_new();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mod = ((struct mod_context*)context)->modi;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
memset(&rnso, 0, sizeof(rnso));
|
|
|
|
|
|
|
|
rnso.version = notify_icon_state->version;
|
|
|
|
|
|
|
|
if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_NOTIFY_TIP)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
rnso.tool_tip = freerdp_uniconv_in(uniconv,
|
|
|
|
|
|
|
|
notify_icon_state->toolTip.string, notify_icon_state->toolTip.length);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_NOTIFY_INFO_TIP)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
rnso.infotip.timeout = notify_icon_state->infoTip.timeout;
|
|
|
|
|
|
|
|
rnso.infotip.flags = notify_icon_state->infoTip.flags;
|
|
|
|
|
|
|
|
rnso.infotip.text = freerdp_uniconv_in(uniconv,
|
|
|
|
|
|
|
|
notify_icon_state->infoTip.text.string,
|
|
|
|
|
|
|
|
notify_icon_state->infoTip.text.length);
|
|
|
|
|
|
|
|
rnso.infotip.title = freerdp_uniconv_in(uniconv,
|
|
|
|
|
|
|
|
notify_icon_state->infoTip.title.string,
|
|
|
|
|
|
|
|
notify_icon_state->infoTip.title.length);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
rnso.state = notify_icon_state->state;
|
|
|
|
|
|
|
|
rnso.icon_cache_entry = notify_icon_state->icon.cacheEntry;
|
|
|
|
|
|
|
|
rnso.icon_cache_id = notify_icon_state->icon.cacheId;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rnso.icon_info.bpp = notify_icon_state->icon.bpp;
|
|
|
|
|
|
|
|
rnso.icon_info.width = notify_icon_state->icon.width;
|
|
|
|
|
|
|
|
rnso.icon_info.height = notify_icon_state->icon.height;
|
|
|
|
|
|
|
|
rnso.icon_info.cmap_bytes = notify_icon_state->icon.cbColorTable;
|
|
|
|
|
|
|
|
rnso.icon_info.mask_bytes = notify_icon_state->icon.cbBitsMask;
|
|
|
|
|
|
|
|
rnso.icon_info.data_bytes = notify_icon_state->icon.cbBitsColor;
|
|
|
|
|
|
|
|
rnso.icon_info.mask = (char*)(notify_icon_state->icon.bitsMask);
|
|
|
|
|
|
|
|
rnso.icon_info.cmap = (char*)(notify_icon_state->icon.colorTable);
|
|
|
|
|
|
|
|
rnso.icon_info.data = (char*)(notify_icon_state->icon.bitsColor);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mod->server_notify_new_update(mod, orderInfo->windowId,
|
|
|
|
|
|
|
|
orderInfo->notifyIconId,
|
|
|
|
|
|
|
|
&rnso, orderInfo->fieldFlags);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xfree(rnso.tool_tip);
|
|
|
|
|
|
|
|
xfree(rnso.infotip.text);
|
|
|
|
|
|
|
|
xfree(rnso.infotip.title);
|
|
|
|
|
|
|
|
freerdp_uniconv_free(uniconv);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
void DEFAULT_CC
|
|
|
|
|
|
|
|
lrail_NotifyIconUpdate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo,
|
|
|
|
|
|
|
|
NOTIFY_ICON_STATE_ORDER* notify_icon_state)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
LLOGLN(0, ("lrail_NotifyIconUpdate:"));
|
|
|
|
|
|
|
|
lrail_NotifyIconCreate(context, orderInfo, notify_icon_state);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
void DEFAULT_CC
|
|
|
|
|
|
|
|
lrail_NotifyIconDelete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
struct mod* mod;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LLOGLN(0, ("lrail_NotifyIconDelete:"));
|
|
|
|
|
|
|
|
mod = ((struct mod_context*)context)->modi;
|
|
|
|
|
|
|
|
mod->server_notify_delete(mod, orderInfo->windowId,
|
|
|
|
|
|
|
|
orderInfo->notifyIconId);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
void DEFAULT_CC
|
|
|
|
|
|
|
|
lrail_MonitoredDesktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo,
|
|
|
|
|
|
|
|
MONITORED_DESKTOP_ORDER* monitored_desktop)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
int index;
|
|
|
|
|
|
|
|
struct mod* mod;
|
|
|
|
|
|
|
|
struct rail_monitored_desktop_order rmdo;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LLOGLN(0, ("lrail_MonitoredDesktop:"));
|
|
|
|
|
|
|
|
mod = ((struct mod_context*)context)->modi;
|
|
|
|
|
|
|
|
memset(&rmdo, 0, sizeof(rmdo));
|
|
|
|
|
|
|
|
rmdo.active_window_id = monitored_desktop->activeWindowId;
|
|
|
|
|
|
|
|
rmdo.num_window_ids = monitored_desktop->numWindowIds;
|
|
|
|
|
|
|
|
if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_DESKTOP_ZORDER)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (rmdo.num_window_ids > 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
rmdo.window_ids = (int*)g_malloc(sizeof(int) * rmdo.num_window_ids, 0);
|
|
|
|
|
|
|
|
for (index = 0; index < rmdo.num_window_ids; index++)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
rmdo.window_ids[index] = monitored_desktop->windowIds[index];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
mod->server_monitored_desktop(mod, &rmdo, orderInfo->fieldFlags);
|
|
|
|
|
|
|
|
g_free(rmdo.window_ids);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
void DEFAULT_CC
|
|
|
|
|
|
|
|
lrail_NonMonitoredDesktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
struct mod* mod;
|
|
|
|
|
|
|
|
struct rail_monitored_desktop_order rmdo;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LLOGLN(0, ("lrail_NonMonitoredDesktop:"));
|
|
|
|
|
|
|
|
mod = ((struct mod_context*)context)->modi;
|
|
|
|
|
|
|
|
memset(&rmdo, 0, sizeof(rmdo));
|
|
|
|
|
|
|
|
mod->server_monitored_desktop(mod, &rmdo, orderInfo->fieldFlags);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
/******************************************************************************/
|
|
|
|
static boolean DEFAULT_CC
|
|
|
|
static boolean DEFAULT_CC
|
|
|
|
lfreerdp_post_connect(freerdp* instance)
|
|
|
|
lfreerdp_post_connect(freerdp* instance)
|
|
|
@ -1254,6 +1523,18 @@ lfreerdp_post_connect(freerdp* instance)
|
|
|
|
LLOGLN(0, ("lfreerdp_post_connect:"));
|
|
|
|
LLOGLN(0, ("lfreerdp_post_connect:"));
|
|
|
|
mod = ((struct mod_context*)(instance->context))->modi;
|
|
|
|
mod = ((struct mod_context*)(instance->context))->modi;
|
|
|
|
g_memset(mod->password, 0, sizeof(mod->password));
|
|
|
|
g_memset(mod->password, 0, sizeof(mod->password));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mod->inst->update->window->WindowCreate = lrail_WindowCreate;
|
|
|
|
|
|
|
|
mod->inst->update->window->WindowUpdate = lrail_WindowUpdate;
|
|
|
|
|
|
|
|
mod->inst->update->window->WindowDelete = lrail_WindowDelete;
|
|
|
|
|
|
|
|
mod->inst->update->window->WindowIcon = lrail_WindowIcon;
|
|
|
|
|
|
|
|
mod->inst->update->window->WindowCachedIcon = lrail_WindowCachedIcon;
|
|
|
|
|
|
|
|
mod->inst->update->window->NotifyIconCreate = lrail_NotifyIconCreate;
|
|
|
|
|
|
|
|
mod->inst->update->window->NotifyIconUpdate = lrail_NotifyIconUpdate;
|
|
|
|
|
|
|
|
mod->inst->update->window->NotifyIconDelete = lrail_NotifyIconDelete;
|
|
|
|
|
|
|
|
mod->inst->update->window->MonitoredDesktop = lrail_MonitoredDesktop;
|
|
|
|
|
|
|
|
mod->inst->update->window->NonMonitoredDesktop = lrail_NonMonitoredDesktop;
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -1294,7 +1575,7 @@ lfreerdp_receive_channel_data(freerdp* instance, int channelId, uint8* data,
|
|
|
|
if (lchid >= 0)
|
|
|
|
if (lchid >= 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
LLOGLN(10, ("lfreerdp_receive_channel_data: server to client"));
|
|
|
|
LLOGLN(10, ("lfreerdp_receive_channel_data: server to client"));
|
|
|
|
error = mod->server_send_to_channel(mod, lchid, data, size,
|
|
|
|
error = mod->server_send_to_channel(mod, lchid, (char*)data, size,
|
|
|
|
total_size, flags);
|
|
|
|
total_size, flags);
|
|
|
|
if (error != 0)
|
|
|
|
if (error != 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|