diff --git a/client/X11/xf_client.c b/client/X11/xf_client.c index 8226966d4..a4b176224 100644 --- a/client/X11/xf_client.c +++ b/client/X11/xf_client.c @@ -1609,6 +1609,18 @@ void xf_TerminateEventHandler(rdpContext* context, TerminateEventArgs* e) } } +void xf_ParamChangeEventHandler(rdpContext* context, ParamChangeEventArgs* e) +{ + switch (e->id) + { + case FreeRDP_ScalingFactor: + break; + + default: + break; + } +} + /** * Client Interface */ @@ -1770,6 +1782,8 @@ int xfreerdp_client_new(freerdp* instance, rdpContext* context) settings->OrderSupport[NEG_ELLIPSE_CB_INDEX] = FALSE; PubSub_SubscribeTerminate(context->pubSub, (pTerminateEventHandler) xf_TerminateEventHandler); + PubSub_SubscribeParamChange(context->pubSub, (pParamChangeEventHandler) xf_ParamChangeEventHandler); + return 0; } diff --git a/include/freerdp/event.h b/include/freerdp/event.h index 6c7eb8c4c..9db3c2297 100644 --- a/include/freerdp/event.h +++ b/include/freerdp/event.h @@ -42,10 +42,14 @@ DEFINE_EVENT_BEGIN(ResizeWindow) int height; DEFINE_EVENT_END(ResizeWindow) -DEFINE_EVENT_BEGIN(Pan) - int xdiff; - int ydiff; -DEFINE_EVENT_END(Pan) +DEFINE_EVENT_BEGIN(PanningChange) + int XPan; + int YPan; +DEFINE_EVENT_END(PanningChange) + +DEFINE_EVENT_BEGIN(ScalingFactorChange) + double ScalingFactor; +DEFINE_EVENT_END(ScalingFactorChange) DEFINE_EVENT_BEGIN(EmbedWindow) BOOL embed; diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index 9ad84d4ad..b6f34e6f7 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -609,6 +609,9 @@ typedef struct _RDPDR_PARALLEL RDPDR_PARALLEL; #define FreeRDP_WmClass 1549 #define FreeRDP_EmbeddedWindow 1550 #define FreeRDP_SmartSizing 1551 +#define FreeRDP_XPan 1552 +#define FreeRDP_YPan 1553 +#define FreeRDP_ScalingFactor 1554 #define FreeRDP_SoftwareGdi 1601 #define FreeRDP_LocalConnection 1602 #define FreeRDP_AuthenticationOnly 1603 @@ -977,7 +980,10 @@ struct rdp_settings ALIGN64 char* WmClass; /* 1549 */ ALIGN64 BOOL EmbeddedWindow; /* 1550 */ ALIGN64 BOOL SmartSizing; /* 1551 */ - UINT64 padding1600[1600 - 1552]; /* 1552 */ + ALIGN64 int XPan; /* 1552 */ + ALIGN64 int YPan; /* 1553 */ + ALIGN64 double ScalingFactor; /* 1554 */ + UINT64 padding1600[1600 - 1555]; /* 1555 */ /* Miscellaneous */ ALIGN64 BOOL SoftwareGdi; /* 1601 */ @@ -1312,6 +1318,9 @@ FREERDP_API void freerdp_dynamic_channel_collection_free(rdpSettings* settings); FREERDP_API BOOL freerdp_get_param_bool(rdpSettings* settings, int id); FREERDP_API int freerdp_set_param_bool(rdpSettings* settings, int id, BOOL param); +FREERDP_API int freerdp_get_param_int(rdpSettings* settings, int id); +FREERDP_API int freerdp_set_param_int(rdpSettings* settings, int id, int param); + FREERDP_API UINT32 freerdp_get_param_uint32(rdpSettings* settings, int id); FREERDP_API int freerdp_set_param_uint32(rdpSettings* settings, int id, UINT32 param); @@ -1321,6 +1330,9 @@ FREERDP_API int freerdp_set_param_uint64(rdpSettings* settings, int id, UINT64 p FREERDP_API char* freerdp_get_param_string(rdpSettings* settings, int id); FREERDP_API int freerdp_set_param_string(rdpSettings* settings, int id, char* param); +FREERDP_API double freerdp_get_param_double(rdpSettings* settings, int id); +FREERDP_API int freerdp_set_param_double(rdpSettings* settings, int id, double param); + #ifdef __cplusplus } #endif diff --git a/libfreerdp/common/settings.c b/libfreerdp/common/settings.c index ff3691cc9..e99066b15 100644 --- a/libfreerdp/common/settings.c +++ b/libfreerdp/common/settings.c @@ -1212,6 +1212,55 @@ int freerdp_set_param_bool(rdpSettings* settings, int id, BOOL param) return -1; } +int freerdp_get_param_int(rdpSettings* settings, int id) +{ + switch (id) + { + case FreeRDP_XPan: + return settings->XPan; + break; + + case FreeRDP_YPan: + return settings->YPan; + break; + + default: + return 0; + break; + } + + return 0; +} + +int freerdp_set_param_int(rdpSettings* settings, int id, int param) +{ + ParamChangeEventArgs e; + rdpContext* context = ((freerdp*) settings->instance)->context; + + switch (id) + { + case FreeRDP_XPan: + settings->XPan = param; + break; + + case FreeRDP_YPan: + settings->YPan = param; + break; + + default: + return -1; + break; + } + + settings->settings_modified[id] = 1; + + EventArgsInit(&e, "freerdp"); + e.id = id; + PubSub_OnParamChange(context->pubSub, context->instance, &e); + + return 0; +} + UINT32 freerdp_get_param_uint32(rdpSettings* settings, int id) { switch (id) @@ -2233,3 +2282,44 @@ int freerdp_set_param_string(rdpSettings* settings, int id, char* param) return 0; } + +double freerdp_get_param_double(rdpSettings* settings, int id) +{ + switch (id) + { + case FreeRDP_ScalingFactor: + return settings->ScalingFactor; + break; + + default: + return 0; + break; + } + + return 0; +} + +int freerdp_set_param_double(rdpSettings* settings, int id, double param) +{ + ParamChangeEventArgs e; + rdpContext* context = ((freerdp*) settings->instance)->context; + + switch (id) + { + case FreeRDP_ScalingFactor: + settings->ScalingFactor = param; + break; + + default: + return -1; + break; + } + + settings->settings_modified[id] = 1; + + EventArgsInit(&e, "freerdp"); + e.id = id; + PubSub_OnParamChange(context->pubSub, context->instance, &e); + + return 0; +} diff --git a/libfreerdp/core/freerdp.c b/libfreerdp/core/freerdp.c index 3c77b8e05..7d0c3c0ba 100644 --- a/libfreerdp/core/freerdp.c +++ b/libfreerdp/core/freerdp.c @@ -323,6 +323,8 @@ static wEventType FreeRDP_Events[] = DEFINE_EVENT_ENTRY(WindowStateChange) DEFINE_EVENT_ENTRY(ResizeWindow) DEFINE_EVENT_ENTRY(EmbedWindow) + DEFINE_EVENT_ENTRY(PanningChange) + DEFINE_EVENT_ENTRY(ScalingFactorChange) DEFINE_EVENT_ENTRY(ErrorInfo) DEFINE_EVENT_ENTRY(ParamChange) DEFINE_EVENT_ENTRY(Terminate)