diff --git a/client/X11/xf_client.c b/client/X11/xf_client.c index b9ab52096..8226966d4 100644 --- a/client/X11/xf_client.c +++ b/client/X11/xf_client.c @@ -1704,22 +1704,22 @@ void freerdp_client_reset_scale(xfContext* xfc) { ResizeWindowEventArgs e; - xfc->scale = 1.0; - xfc->offset_x = 0; - xfc->offset_y = 0; + xfc->scale = 1.0; + xfc->offset_x = 0; + xfc->offset_y = 0; - xfc->currentWidth = xfc->originalWidth; - xfc->currentHeight = xfc->originalHeight; + xfc->currentWidth = xfc->originalWidth; + xfc->currentHeight = xfc->originalHeight; - XResizeWindow(xfc->display, xfc->window->handle, xfc->originalWidth * xfc->scale, xfc->originalHeight * xfc->scale); - //IFCALL(xfc->client->OnResizeWindow, xfc->instance, xfc->originalWidth * xfc->scale, xfc->originalHeight * xfc->scale); + XResizeWindow(xfc->display, xfc->window->handle, xfc->originalWidth * xfc->scale, xfc->originalHeight * xfc->scale); + //IFCALL(xfc->client->OnResizeWindow, xfc->instance, xfc->originalWidth * xfc->scale, xfc->originalHeight * xfc->scale); - EventArgsInit(&e, "xfreerdp"); - e.width = (int) xfc->originalWidth * xfc->scale; - e.height = (int) xfc->originalHeight * xfc->scale; - PubSub_OnResizeWindow(((rdpContext*) xfc)->pubSub, xfc, &e); + EventArgsInit(&e, "xfreerdp"); + e.width = (int) xfc->originalWidth * xfc->scale; + e.height = (int) xfc->originalHeight * xfc->scale; + PubSub_OnResizeWindow(((rdpContext*) xfc)->pubSub, xfc, &e); - xf_draw_screen_scaled(xfc, 0, 0, 0, 0, FALSE); + xf_draw_screen_scaled(xfc, 0, 0, 0, 0, FALSE); } int xfreerdp_client_new(freerdp* instance, rdpContext* context) diff --git a/client/X11/xf_event.c b/client/X11/xf_event.c index bbe96ac36..a32f2ba54 100644 --- a/client/X11/xf_event.c +++ b/client/X11/xf_event.c @@ -97,7 +97,7 @@ static BOOL xf_event_Expose(xfContext* xfc, XEvent* event, BOOL app) if (!app) { - if ((xfi->scale != 1.0) || (xfi->offset_x) || (xfi->offset_y)) + if ((xfc->scale != 1.0) || (xfc->offset_x) || (xfc->offset_y)) { xf_draw_screen_scaled(xfc, x - xfc->offset_x, y - xfc->offset_y, w, h, FALSE); diff --git a/client/X11/xf_input.c b/client/X11/xf_input.c index 1d84595ef..e98e3768f 100644 --- a/client/X11/xf_input.c +++ b/client/X11/xf_input.c @@ -28,10 +28,6 @@ #include #include "xf_event.h" -<<<<<<< HEAD -======= - ->>>>>>> awake/master #include "xf_input.h" #ifdef WITH_XI @@ -241,7 +237,7 @@ void xf_input_save_last_event(XGenericEventCookie* cookie) } -void xf_input_detect_pan(xfInfo* xfi) +void xf_input_detect_pan(xfContext* xfc) { double dx[2]; double dy[2]; @@ -291,7 +287,15 @@ void xf_input_detect_pan(xfInfo* xfi) */ - IFCALL(xfi->client->OnPan, xfi->instance, 5, 0); + //IFCALL(xfi->client->OnPan, xfi->instance, 5, 0); + { + PanEventArgs e; + + EventArgsInit(&e, "xfreerdp"); + e.xdiff = 5; + e.ydiff = 0; + PubSub_OnPan(((rdpContext*) xfc)->pubSub, xfc, &e); + } px_vector = 0; @@ -309,7 +313,15 @@ void xf_input_detect_pan(xfInfo* xfi) xf_draw_screen_scaled(xfi, 0, 0, 0, 0, FALSE); */ - IFCALL(xfi->client->OnPan, xfi->instance, -5, 0); + //IFCALL(xfi->client->OnPan, xfi->instance, -5, 0); + { + PanEventArgs e; + + EventArgsInit(&e, "xfreerdp"); + e.xdiff = -5; + e.ydiff = 0; + PubSub_OnPan(((rdpContext*) xfc)->pubSub, xfc, &e); + } px_vector = 0; @@ -335,7 +347,15 @@ void xf_input_detect_pan(xfInfo* xfi) xf_draw_screen_scaled(xfi, 0, 0, 0, 0, FALSE); */ - IFCALL(xfi->client->OnPan, xfi->instance, 0, 5); + //IFCALL(xfi->client->OnPan, xfi->instance, 0, 5); + { + PanEventArgs e; + + EventArgsInit(&e, "xfreerdp"); + e.xdiff = 0; + e.ydiff = 5; + PubSub_OnPan(((rdpContext*) xfc)->pubSub, xfc, &e); + } py_vector = 0; @@ -352,7 +372,15 @@ void xf_input_detect_pan(xfInfo* xfi) xf_draw_screen_scaled(xfi, 0, 0, 0, 0, FALSE); */ - IFCALL(xfi->client->OnPan, xfi->instance, 0, -5); + //IFCALL(xfi->client->OnPan, xfi->instance, 0, -5); + { + PanEventArgs e; + + EventArgsInit(&e, "xfreerdp"); + e.xdiff = 0; + e.ydiff = -5; + PubSub_OnPan(((rdpContext*) xfc)->pubSub, xfc, &e); + } py_vector = 0; @@ -417,8 +445,8 @@ void xf_input_detect_pinch(xfContext* xfc) { xfc->scale -= 0.05; - if (xfi->scale < 0.8) - xfi->scale = 0.8; + if (xfc->scale < 0.8) + xfc->scale = 0.8; /* xfi->currentWidth = xfi->originalWidth * xfi->scale; xfi->currentHeight = xfi->originalHeight * xfi->scale; @@ -435,7 +463,7 @@ void xf_input_detect_pinch(xfContext* xfc) e.width = (int) xfc->originalWidth * xfc->scale; e.height = (int) xfc->originalHeight * xfc->scale; - xf_transform_window(xfi); + xf_transform_window(xfc); PubSub_OnResizeWindow(((rdpContext*) xfc)->pubSub, xfc, &e); z_vector = 0; @@ -449,8 +477,8 @@ void xf_input_detect_pinch(xfContext* xfc) { xfc->scale += 0.05; - if (xfi->scale > 1.2) - xfi->scale = 1.2; + if (xfc->scale > 1.2) + xfc->scale = 1.2; /* xfi->currentWidth = xfi->originalWidth * xfi->scale; xfi->currentHeight = xfi->originalHeight * xfi->scale; @@ -467,7 +495,7 @@ void xf_input_detect_pinch(xfContext* xfc) e.width = (int) xfc->originalWidth * xfc->scale; e.height = (int) xfc->originalHeight * xfc->scale; - xf_transform_window(xfi); + xf_transform_window(xfc); PubSub_OnResizeWindow(((rdpContext*) xfc)->pubSub, xfc, &e); diff --git a/client/X11/xf_keyboard.c b/client/X11/xf_keyboard.c index b89e1cae8..6a8d6012f 100644 --- a/client/X11/xf_keyboard.c +++ b/client/X11/xf_keyboard.c @@ -219,78 +219,101 @@ BOOL xf_kbd_handle_special_keys(xfContext* xfc, KeySym keysym) if (keysym == XK_period) { - if ((xf_kbd_key_pressed(xfi, XK_Alt_L) - || xf_kbd_key_pressed(xfi, XK_Alt_R)) - && (xf_kbd_key_pressed(xfi, XK_Control_L) - || xf_kbd_key_pressed(xfi, + if ((xf_kbd_key_pressed(xfc, XK_Alt_L) + || xf_kbd_key_pressed(xfc, XK_Alt_R)) + && (xf_kbd_key_pressed(xfc, XK_Control_L) + || xf_kbd_key_pressed(xfc, XK_Control_R))) { //Zoom in (scale larger) - double s = xfi->scale; + double s = xfc->scale; s += 0.1; if (s > 2.0) s = 2.0; - xfi->scale = s; + xfc->scale = s; - xfi->currentWidth = xfi->originalWidth * s; - xfi->currentHeight = xfi->originalHeight * s; + xfc->currentWidth = xfc->originalWidth * s; + xfc->currentHeight = xfc->originalHeight * s; - xf_transform_window(xfi); + xf_transform_window(xfc); - IFCALL(xfi->client->OnResizeWindow, - xfi->instance, xfi->currentWidth, xfi->currentHeight); - xf_draw_screen_scaled(xfi, 0, 0, 0, 0, FALSE); + //IFCALL(xfi->client->OnResizeWindow, xfi->instance, xfi->currentWidth, xfi->currentHeight); + { + ResizeWindowEventArgs e; + + EventArgsInit(&e, "xfreerdp"); + e.width = (int) xfc->originalWidth * xfc->scale; + e.height = (int) xfc->originalHeight * xfc->scale; + PubSub_OnResizeWindow(((rdpContext*) xfc)->pubSub, xfc, &e); + } + xf_draw_screen_scaled(xfc, 0, 0, 0, 0, FALSE); return TRUE; } } if (keysym == XK_comma) { - if ((xf_kbd_key_pressed(xfi, XK_Alt_L) - || xf_kbd_key_pressed(xfi, XK_Alt_R)) - && (xf_kbd_key_pressed(xfi, XK_Control_L) - || xf_kbd_key_pressed(xfi, + if ((xf_kbd_key_pressed(xfc, XK_Alt_L) + || xf_kbd_key_pressed(xfc, XK_Alt_R)) + && (xf_kbd_key_pressed(xfc, XK_Control_L) + || xf_kbd_key_pressed(xfc, XK_Control_R))) { //Zoom out (scale smaller) - double s = xfi->scale; + double s = xfc->scale; s -= 0.1; if (s < 0.5) s = 0.5; - xfi->scale = s; + xfc->scale = s; - xfi->currentWidth = xfi->originalWidth * s; - xfi->currentHeight = xfi->originalHeight * s; + xfc->currentWidth = xfc->originalWidth * s; + xfc->currentHeight = xfc->originalHeight * s; - xf_transform_window(xfi); + xf_transform_window(xfc); - IFCALL(xfi->client->OnResizeWindow, - xfi->instance, xfi->currentWidth, xfi->currentHeight); - xf_draw_screen_scaled(xfi, 0, 0, 0, 0, FALSE); + //IFCALL(xfi->client->OnResizeWindow, xfi->instance, xfi->currentWidth, xfi->currentHeight); + { + ResizeWindowEventArgs e; + + EventArgsInit(&e, "xfreerdp"); + e.width = (int) xfc->originalWidth * xfc->scale; + e.height = (int) xfc->originalHeight * xfc->scale; + PubSub_OnResizeWindow(((rdpContext*) xfc)->pubSub, xfc, &e); + } + + xf_draw_screen_scaled(xfc, 0, 0, 0, 0, FALSE); return TRUE; } } if (keysym == XK_KP_4) { - if ((xf_kbd_key_pressed(xfi, XK_Alt_L) - || xf_kbd_key_pressed(xfi, XK_Alt_R)) - && (xf_kbd_key_pressed(xfi, XK_Control_L) - || xf_kbd_key_pressed(xfi, + if ((xf_kbd_key_pressed(xfc, XK_Alt_L) + || xf_kbd_key_pressed(xfc, XK_Alt_R)) + && (xf_kbd_key_pressed(xfc, XK_Control_L) + || xf_kbd_key_pressed(xfc, XK_Control_R))) { /* - xfi->offset_x -= 5; + xfc->offset_x -= 5; - xf_transform_window(xfi); + xf_transform_window(xfc); - xf_draw_screen_scaled(xfi, 0, 0, 0, 0, FALSE); - printf("pan left : %d\n", xfi->offset_x); + xf_draw_screen_scaled(xfc, 0, 0, 0, 0, FALSE); + printf("pan left : %d\n", xfc->offset_x); */ - IFCALL(xfi->client->OnPan, xfi->instance, -5, 0); + //IFCALL(xfc->client->OnPan, xfi->instance, -5, 0); + { + PanEventArgs e; + + EventArgsInit(&e, "xfreerdp"); + e.xdiff = -5; + e.ydiff = 0; + PubSub_OnPan(((rdpContext*) xfc)->pubSub, xfc, &e); + } return TRUE; } @@ -298,10 +321,10 @@ BOOL xf_kbd_handle_special_keys(xfContext* xfc, KeySym keysym) if (keysym == XK_KP_6) { - if ((xf_kbd_key_pressed(xfi, XK_Alt_L) - || xf_kbd_key_pressed(xfi, XK_Alt_R)) - && (xf_kbd_key_pressed(xfi, XK_Control_L) - || xf_kbd_key_pressed(xfi, + if ((xf_kbd_key_pressed(xfc, XK_Alt_L) + || xf_kbd_key_pressed(xfc, XK_Alt_R)) + && (xf_kbd_key_pressed(xfc, XK_Control_L) + || xf_kbd_key_pressed(xfc, XK_Control_R))) { /* @@ -316,17 +339,25 @@ BOOL xf_kbd_handle_special_keys(xfContext* xfc, KeySym keysym) printf("pan right : %d\n", xfi->offset_x); */ - IFCALL(xfi->client->OnPan, xfi->instance, 5, 0); + //IFCALL(xfi->client->OnPan, xfi->instance, 5, 0); + { + PanEventArgs e; + + EventArgsInit(&e, "xfreerdp"); + e.xdiff = 5; + e.ydiff = 0; + PubSub_OnPan(((rdpContext*) xfc)->pubSub, xfc, &e); + } return TRUE; } } if (keysym == XK_KP_8) { - if ((xf_kbd_key_pressed(xfi, XK_Alt_L) - || xf_kbd_key_pressed(xfi, XK_Alt_R)) - && (xf_kbd_key_pressed(xfi, XK_Control_L) - || xf_kbd_key_pressed(xfi, + if ((xf_kbd_key_pressed(xfc, XK_Alt_L) + || xf_kbd_key_pressed(xfc, XK_Alt_R)) + && (xf_kbd_key_pressed(xfc, XK_Control_L) + || xf_kbd_key_pressed(xfc, XK_Control_R))) { /* @@ -337,17 +368,25 @@ BOOL xf_kbd_handle_special_keys(xfContext* xfc, KeySym keysym) xf_draw_screen_scaled(xfi, 0, 0, 0, 0, FALSE); printf("pan up : %d\n", xfi->offset_y); */ - IFCALL(xfi->client->OnPan, xfi->instance, 0, -5); + //IFCALL(xfi->client->OnPan, xfi->instance, 0, -5); + { + PanEventArgs e; + + EventArgsInit(&e, "xfreerdp"); + e.xdiff = 0; + e.ydiff = -5; + PubSub_OnPan(((rdpContext*) xfc)->pubSub, xfc, &e); + } return TRUE; } } if (keysym == XK_KP_2) { - if ((xf_kbd_key_pressed(xfi, XK_Alt_L) - || xf_kbd_key_pressed(xfi, XK_Alt_R)) - && (xf_kbd_key_pressed(xfi, XK_Control_L) - || xf_kbd_key_pressed(xfi, + if ((xf_kbd_key_pressed(xfc, XK_Alt_L) + || xf_kbd_key_pressed(xfc, XK_Alt_R)) + && (xf_kbd_key_pressed(xfc, XK_Control_L) + || xf_kbd_key_pressed(xfc, XK_Control_R))) { /* @@ -361,7 +400,15 @@ BOOL xf_kbd_handle_special_keys(xfContext* xfc, KeySym keysym) xf_draw_screen_scaled(xfi, 0, 0, 0, 0, FALSE); printf("pan down : %d\n", xfi->offset_y); */ - IFCALL(xfi->client->OnPan, xfi->instance, 0, 5); + //IFCALL(xfi->client->OnPan, xfi->instance, 0, 5); + { + PanEventArgs e; + + EventArgsInit(&e, "xfreerdp"); + e.xdiff = 0; + e.ydiff = 5; + PubSub_OnPan(((rdpContext*) xfc)->pubSub, xfc, &e); + } return TRUE; } } diff --git a/client/X11/xfreerdp.h b/client/X11/xfreerdp.h index e9bf0ec36..78399b235 100644 --- a/client/X11/xfreerdp.h +++ b/client/X11/xfreerdp.h @@ -161,8 +161,6 @@ struct xf_context /* Channels */ RdpeiClientContext* rdpei; - - BOOL use_xinput; }; void xf_create_window(xfContext* xfc); @@ -214,7 +212,7 @@ void xf_lock_x11(xfContext* xfc, BOOL display); void xf_unlock_x11(xfContext* xfc, BOOL display); void xf_draw_screen_scaled(xfContext* xfc, int x, int y, int w, int h, BOOL scale); -void xf_transform_window(xfInfo* xfi); +void xf_transform_window(xfContext* xfc); DWORD xf_exit_code_from_disconnect_reason(DWORD reason); diff --git a/client/common/client.c b/client/common/client.c index acc47d064..ce12b9ea0 100644 --- a/client/common/client.c +++ b/client/common/client.c @@ -92,6 +92,30 @@ HANDLE freerdp_client_get_thread(rdpContext* context) return ((rdpClientContext*) context)->thread; } +double freerdp_client_get_scale(rdpContext* context) +{ + return context->scale; +} + +void freerdp_client_set_scale(rdpContext* context, double newScale) +{ + context->scale = newScale; + + context->currentWidth = context->originalWidth * context->scale; + context->currentHeight = context->originalHeight * context->scale; + + //need to call transform window + + { + ResizeWindowEventArgs e; + + EventArgsInit(&e, "xfreerdp"); + e.width = (int) xfc->originalWidth * xfc->scale; + e.height = (int) xfc->originalHeight * xfc->scale; + PubSub_OnResizeWindow(((rdpContext*) xfc)->pubSub, xfc, &e); + } +} + int freerdp_client_parse_command_line(rdpContext* context, int argc, char** argv) { int status; diff --git a/include/freerdp/event.h b/include/freerdp/event.h index 7753e133d..6c7eb8c4c 100644 --- a/include/freerdp/event.h +++ b/include/freerdp/event.h @@ -41,6 +41,11 @@ DEFINE_EVENT_BEGIN(ResizeWindow) int width; int height; DEFINE_EVENT_END(ResizeWindow) + +DEFINE_EVENT_BEGIN(Pan) + int xdiff; + int ydiff; +DEFINE_EVENT_END(Pan) DEFINE_EVENT_BEGIN(EmbedWindow) BOOL embed;