diff --git a/client/X11/xf_client.c b/client/X11/xf_client.c index 7f313fadd..5ad3f4f04 100644 --- a/client/X11/xf_client.c +++ b/client/X11/xf_client.c @@ -97,8 +97,6 @@ #include "xf_channels.h" #include "xfreerdp.h" -static int initialized_xi = 0; - static long xv_port = 0; static const size_t password_size = 512; @@ -476,12 +474,6 @@ BOOL xf_process_x_events(freerdp* instance) int pending_status; xfContext* xfc = (xfContext*) instance->context; - if (initialized_xi == 0) - { - initialized_xi++; - //xf_input_init(xfi); - } - status = TRUE; pending_status = TRUE; @@ -1626,7 +1618,6 @@ void xf_ParamChangeEventHandler(rdpContext* context, ParamChangeEventArgs* e) xf_transform_window(xfc); - //IFCALL(xfi->client->OnResizeWindow, xfi->instance, xfi->currentWidth, xfi->currentHeight); { ResizeWindowEventArgs e; @@ -1661,7 +1652,6 @@ void xf_ScalingFactorChangeEventHandler(rdpContext* context, ScalingFactorChange xf_transform_window(xfc); - //IFCALL(xfi->client->OnResizeWindow, xfi->instance, xfi->currentWidth, xfi->currentHeight); { ResizeWindowEventArgs e; diff --git a/client/X11/xf_client.h b/client/X11/xf_client.h index 6d274c605..dec4876f2 100644 --- a/client/X11/xf_client.h +++ b/client/X11/xf_client.h @@ -40,204 +40,6 @@ extern "C" { #endif -/* -struct xf_WorkArea -{ - UINT32 x; - UINT32 y; - UINT32 width; - UINT32 height; -}; -typedef struct xf_WorkArea xfWorkArea; - -struct xf_pointer -{ - rdpPointer pointer; - Cursor cursor; -}; -typedef struct xf_pointer xfPointer; - -struct xf_bitmap -{ - rdpBitmap bitmap; - Pixmap pixmap; -}; -typedef struct xf_bitmap xfBitmap; - -struct xf_glyph -{ - rdpGlyph glyph; - Pixmap pixmap; -}; -typedef struct xf_glyph xfGlyph; - -struct xf_context -{ - rdpContext _p; - - xfInfo* xfi; - rdpSettings* settings; -}; -typedef struct xf_context xfContext; - -struct xf_info -{ - freerdp* instance; - xfContext* context; - rdpContext* _context; - - rdpClient* client; - rdpSettings* settings; - - GC gc; - int bpp; - int xfds; - int depth; - int width; - int height; - int srcBpp; - GC gc_mono; - Screen* screen; - XImage* image; - Pixmap primary; - Pixmap drawing; - Visual* visual; - Display* display; - Drawable drawable; - Pixmap bitmap_mono; - Colormap colormap; - int screen_number; - int scanline_pad; - BOOL big_endian; - BOOL fullscreen; - BOOL grab_keyboard; - BOOL unobscured; - BOOL debug; - xfWindow* window; - xfWorkArea workArea; - int current_desktop; - BOOL remote_app; - BOOL disconnect; - HCLRCONV clrconv; - HANDLE mutex; - HANDLE thread; - BOOL UseXThreads; - - int XInputOpcode; - int orig_width; - int orig_height; - int cur_width; - int cur_height; - - double scale; - - HGDI_DC hdc; - BYTE* primary_buffer; - - BOOL frame_begin; - UINT16 frame_x1; - UINT16 frame_y1; - UINT16 frame_x2; - UINT16 frame_y2; - - BOOL focused; - BOOL mouse_active; - BOOL suppress_output; - BOOL fullscreen_toggle; - UINT32 keyboard_layout_id; - BOOL pressed_keys[256]; - XModifierKeymap* modifier_map; - XSetWindowAttributes attribs; - BOOL complex_regions; - VIRTUAL_SCREEN vscreen; - BYTE* bmp_codec_none; - BYTE* bmp_codec_nsc; - void* rfx_context; - void* nsc_context; - void* xv_context; - void* clipboard_context; - - Atom _NET_WM_ICON; - Atom _MOTIF_WM_HINTS; - Atom _NET_CURRENT_DESKTOP; - Atom _NET_WORKAREA; - - Atom _NET_WM_STATE; - Atom _NET_WM_STATE_FULLSCREEN; - Atom _NET_WM_STATE_SKIP_TASKBAR; - Atom _NET_WM_STATE_SKIP_PAGER; - - Atom _NET_WM_WINDOW_TYPE; - Atom _NET_WM_WINDOW_TYPE_NORMAL; - Atom _NET_WM_WINDOW_TYPE_DIALOG; - Atom _NET_WM_WINDOW_TYPE_UTILITY; - Atom _NET_WM_WINDOW_TYPE_POPUP; - Atom _NET_WM_WINDOW_TYPE_DROPDOWN_MENU; - - Atom _NET_WM_MOVERESIZE; - Atom _NET_MOVERESIZE_WINDOW; - - Atom WM_STATE; - Atom WM_PROTOCOLS; - Atom WM_DELETE_WINDOW; -}; - -void xf_draw_screen_scaled(xfInfo* xfi); - -void xf_create_window(xfInfo* xfi); -void xf_toggle_fullscreen(xfInfo* xfi); -BOOL xf_post_connect(freerdp* instance); - -enum XF_EXIT_CODE -{ - // section 0-15: protocol-independent codes - XF_EXIT_SUCCESS = 0, - XF_EXIT_DISCONNECT = 1, - XF_EXIT_LOGOFF = 2, - XF_EXIT_IDLE_TIMEOUT = 3, - XF_EXIT_LOGON_TIMEOUT = 4, - XF_EXIT_CONN_REPLACED = 5, - XF_EXIT_OUT_OF_MEMORY = 6, - XF_EXIT_CONN_DENIED = 7, - XF_EXIT_CONN_DENIED_FIPS = 8, - XF_EXIT_USER_PRIVILEGES = 9, - XF_EXIT_FRESH_CREDENTIALS_REQUIRED = 10, - XF_EXIT_DISCONNECT_BY_USER = 11, - - // section 16-31: license error set - XF_EXIT_LICENSE_INTERNAL = 16, - XF_EXIT_LICENSE_NO_LICENSE_SERVER = 17, - XF_EXIT_LICENSE_NO_LICENSE = 18, - XF_EXIT_LICENSE_BAD_CLIENT_MSG = 19, - XF_EXIT_LICENSE_HWID_DOESNT_MATCH = 20, - XF_EXIT_LICENSE_BAD_CLIENT = 21, - XF_EXIT_LICENSE_CANT_FINISH_PROTOCOL = 22, - XF_EXIT_LICENSE_CLIENT_ENDED_PROTOCOL = 23, - XF_EXIT_LICENSE_BAD_CLIENT_ENCRYPTION = 24, - XF_EXIT_LICENSE_CANT_UPGRADE = 25, - XF_EXIT_LICENSE_NO_REMOTE_CONNECTIONS = 26, - - // section 32-127: RDP protocol error set // - XF_EXIT_RDP = 32, - - // section 128-254: xfreerdp specific exit codes // - XF_EXIT_PARSE_ARGUMENTS = 128, - XF_EXIT_MEMORY = 129, - XF_EXIT_PROTOCOL = 130, - XF_EXIT_CONN_FAILED = 131, - - XF_EXIT_UNKNOWN = 255, -}; - -void xf_lock_x11(xfInfo* xfi, BOOL display); -void xf_unlock_x11(xfInfo* xfi, BOOL display); - -DWORD xf_exit_code_from_disconnect_reason(DWORD reason); - - */ - - - /** * Client Interface */ diff --git a/client/X11/xf_event.c b/client/X11/xf_event.c index 0c4c14759..44842b83c 100644 --- a/client/X11/xf_event.c +++ b/client/X11/xf_event.c @@ -89,40 +89,40 @@ static BOOL xf_event_Expose(xfContext* xfc, XEvent* event, BOOL app) { int x, y; int w, h; - + x = event->xexpose.x; y = event->xexpose.y; w = event->xexpose.width; h = event->xexpose.height; - + if (!app) { if ((xfc->settings->ScalingFactor != 1.0) || (xfc->offset_x) || (xfc->offset_y)) { xf_draw_screen_scaled(xfc, x - xfc->offset_x, - y - xfc->offset_y, w, h, FALSE); + y - xfc->offset_y, w, h, FALSE); } else { XCopyArea(xfc->display, xfc->primary, - xfc->window->handle, xfc->gc, x, y, w, - h, x, y); + xfc->window->handle, xfc->gc, x, y, w, + h, x, y); } } else { xfWindow* xfw; rdpWindow* window; rdpRail* rail = ((rdpContext*) xfc)->rail; - + window = window_list_get_by_extra_id(rail->list, - (void*) event->xexpose.window); - + (void*) event->xexpose.window); + if (window != NULL ) { xfw = (xfWindow*) window->extra; xf_UpdateWindowArea(xfc, xfw, x, y, w, h); } } - + return TRUE; } @@ -266,12 +266,12 @@ BOOL xf_generic_ButtonPress(xfContext* xfc, int x, int y, int button, Window win } if ((xfc->settings->ScalingFactor != 1.0) || (xfc->offset_x) - || (xfc->offset_y)) + || (xfc->offset_y)) { x = (int) ((x - xfc->offset_x) - * (1.0 / xfc->settings->ScalingFactor)); + * (1.0 / xfc->settings->ScalingFactor)); y = (int) ((y - xfc->offset_y) - * (1.0 / xfc->settings->ScalingFactor)); + * (1.0 / xfc->settings->ScalingFactor)); } if (extended) diff --git a/client/X11/xf_input.c b/client/X11/xf_input.c index d57c342e9..9e4f90cc1 100644 --- a/client/X11/xf_input.c +++ b/client/X11/xf_input.c @@ -47,7 +47,7 @@ typedef struct touch_contact double pos_y; double last_x; double last_y; - + } touchContact; touchContact contacts[MAX_CONTACTS]; @@ -65,8 +65,6 @@ double py_vector; int xinput_opcode; int scale_cnt; -int initialized = 0; - const char* xf_input_get_class_string(int class) { if (class == XIKeyClass) @@ -79,7 +77,7 @@ const char* xf_input_get_class_string(int class) return "XIScrollClass"; else if (class == XITouchClass) return "XITouchClass"; - + return "XIUnknownClass"; } @@ -96,98 +94,94 @@ int xf_input_init(xfContext* xfc, Window window) XIEventMask evmasks[64]; int opcode, event, error; BYTE masks[8][XIMaskLen(XI_LASTEVENT)]; - - //dont initialize multiple times - // if(initialized) - // return 0; - + z_vector = 0; px_vector = 0; py_vector = 0; - + nmasks = 0; ndevices = 0; active_contacts = 0; ZeroMemory(contacts, sizeof(touchContact) * MAX_CONTACTS); - + if (!XQueryExtension(xfc->display, "XInputExtension", &opcode, &event, &error)) { printf("XInput extension not available.\n"); return -1; } - + xfc->XInputOpcode = opcode; - + XIQueryVersion(xfc->display, &major, &minor); - + if (major * 1000 + minor < 2002) { printf("Server does not support XI 2.2\n"); return -1; } - + if (xfc->settings->MultiTouchInput) xfc->use_xinput = TRUE; - + info = XIQueryDevice(xfc->display, XIAllDevices, &ndevices); - + for (i = 0; i < ndevices; i++) { BOOL touch = FALSE; XIDeviceInfo* dev = &info[i]; - + for (j = 0; j < dev->num_classes; j++) { XIAnyClassInfo* class = dev->classes[j]; XITouchClassInfo* t = (XITouchClassInfo*) class; - + if ((class->type == XITouchClass) && (t->mode == XIDirectTouch) && - (strcmp(dev->name, "Virtual core pointer") != 0)) + (strcmp(dev->name, "Virtual core pointer") != 0)) { touch = TRUE; } } - + for (j = 0; j < dev->num_classes; j++) { XIAnyClassInfo* class = dev->classes[j]; XITouchClassInfo* t = (XITouchClassInfo*) class; - + if (xfc->settings->MultiTouchInput) { printf("%s (%d) \"%s\" id: %d\n", - xf_input_get_class_string(class->type), - class->type, dev->name, dev->deviceid); + xf_input_get_class_string(class->type), + class->type, dev->name, dev->deviceid); } - + evmasks[nmasks].mask = masks[nmasks]; evmasks[nmasks].mask_len = sizeof(masks[0]); ZeroMemory(masks[nmasks], sizeof(masks[0])); evmasks[nmasks].deviceid = dev->deviceid; - + if ((class->type == XITouchClass) && (t->mode == XIDirectTouch) && - (strcmp(dev->name, "Virtual core pointer") != 0)) + (strcmp(dev->name, "Virtual core pointer") != 0)) { if (xfc->settings->MultiTouchInput) { printf("%s %s touch device (id: %d, mode: %d), supporting %d touches.\n", - dev->name, (t->mode == XIDirectTouch) ? "direct" : "dependent", - dev->deviceid, t->mode, t->num_touches); + dev->name, (t->mode == XIDirectTouch) ? "direct" : "dependent", + dev->deviceid, t->mode, t->num_touches); } - + XISetMask(masks[nmasks], XI_TouchBegin); XISetMask(masks[nmasks], XI_TouchUpdate); XISetMask(masks[nmasks], XI_TouchEnd); nmasks++; } - + if (xfc->use_xinput) { if (!touch && (class->type == XIButtonClass) && strcmp(dev->name, "Virtual core pointer")) { printf("%s button device (id: %d, mode: %d)\n", - dev->name, - dev->deviceid, t->mode); + dev->name, + dev->deviceid, t->mode); XISetMask(masks[nmasks], XI_ButtonPress); XISetMask(masks[nmasks], XI_ButtonRelease); XISetMask(masks[nmasks], XI_Motion); @@ -196,188 +190,181 @@ int xf_input_init(xfContext* xfc, Window window) } } } - + if (nmasks > 0) xstatus = XISelectEvents(xfc->display, window, evmasks, nmasks); - - // initialized = 1; + return 0; } -//BOOL xf_input_is_duplicate(XIDeviceEvent* event) BOOL xf_input_is_duplicate(XGenericEventCookie* cookie) { - XIDeviceEvent* event; - - event = cookie->data; - - + XIDeviceEvent* event; + + event = cookie->data; + + if ( (lastEvent.time == event->time) && - (lastEvType == cookie->evtype) && - (lastEvent.detail == event->detail) && - (lastEvent.event_x == event->event_x) && - (lastEvent.event_y == event->event_y) ) + (lastEvType == cookie->evtype) && + (lastEvent.detail == event->detail) && + (lastEvent.event_x == event->event_x) && + (lastEvent.event_y == event->event_y) ) { return TRUE; } - + return FALSE; } -//void xf_input_save_last_event(XIDeviceEvent* event) void xf_input_save_last_event(XGenericEventCookie* cookie) { - XIDeviceEvent* event; - - event = cookie->data; - - lastEvType = cookie->evtype; - + XIDeviceEvent* event; + + event = cookie->data; + + lastEvType = cookie->evtype; + lastEvent.time = event->time; lastEvent.detail = event->detail; lastEvent.event_x = event->event_x; lastEvent.event_y = event->event_y; - + } void xf_input_detect_pan(xfContext* xfc) { - double dx[2]; - double dy[2]; - - double px; - double py; - - double dist_x; - double dist_y; - - if (active_contacts != 2) - { - return; - } - - dx[0] = contacts[0].pos_x - contacts[0].last_x; - dx[1] = contacts[1].pos_x - contacts[1].last_x; - - dy[0] = contacts[0].pos_y - contacts[0].last_y; - dy[1] = contacts[1].pos_y - contacts[1].last_y; - - px = fabs(dx[0]) < fabs(dx[1]) ? dx[0] : dx[1]; - py = fabs(dy[0]) < fabs(dy[1]) ? dy[0] : dy[1]; - - px_vector += px; - py_vector += py; - - dist_x = fabs(contacts[0].pos_x - contacts[1].pos_x); - dist_y = fabs(contacts[0].pos_y - contacts[1].pos_y); - - - //only pan in x if dist_y is greater than something - if(dist_y > MIN_FINGER_DIST) - { - - if(px_vector > PAN_THRESHOLD) + double dx[2]; + double dy[2]; + + double px; + double py; + + double dist_x; + double dist_y; + + if (active_contacts != 2) { - - //IFCALL(xfi->client->OnPan, xfi->instance, 5, 0); - { - PanningChangeEventArgs e; - - EventArgsInit(&e, "xfreerdp"); - e.XPan = 5; - e.YPan = 0; - PubSub_OnPanningChange(((rdpContext*) xfc)->pubSub, xfc, &e); - } - - px_vector = 0; - - px_vector = 0; - py_vector = 0; - z_vector = 0; + return; } - else if(px_vector < -PAN_THRESHOLD) + + dx[0] = contacts[0].pos_x - contacts[0].last_x; + dx[1] = contacts[1].pos_x - contacts[1].last_x; + + dy[0] = contacts[0].pos_y - contacts[0].last_y; + dy[1] = contacts[1].pos_y - contacts[1].last_y; + + px = fabs(dx[0]) < fabs(dx[1]) ? dx[0] : dx[1]; + py = fabs(dy[0]) < fabs(dy[1]) ? dy[0] : dy[1]; + + px_vector += px; + py_vector += py; + + dist_x = fabs(contacts[0].pos_x - contacts[1].pos_x); + dist_y = fabs(contacts[0].pos_y - contacts[1].pos_y); + + + //only pan in x if dist_y is greater than something + if(dist_y > MIN_FINGER_DIST) { - //IFCALL(xfi->client->OnPan, xfi->instance, -5, 0); - { - PanningChangeEventArgs e; - - EventArgsInit(&e, "xfreerdp"); - e.XPan = -5; - e.YPan = 0; - PubSub_OnPanningChange(((rdpContext*) xfc)->pubSub, xfc, &e); - } - - px_vector = 0; - - px_vector = 0; - py_vector = 0; - z_vector = 0; + + if(px_vector > PAN_THRESHOLD) + { + + { + PanningChangeEventArgs e; + + EventArgsInit(&e, "xfreerdp"); + e.XPan = 5; + e.YPan = 0; + PubSub_OnPanningChange(((rdpContext*) xfc)->pubSub, xfc, &e); + } + + px_vector = 0; + + px_vector = 0; + py_vector = 0; + z_vector = 0; + } + else if(px_vector < -PAN_THRESHOLD) + { + { + PanningChangeEventArgs e; + + EventArgsInit(&e, "xfreerdp"); + e.XPan = -5; + e.YPan = 0; + PubSub_OnPanningChange(((rdpContext*) xfc)->pubSub, xfc, &e); + } + + px_vector = 0; + + px_vector = 0; + py_vector = 0; + z_vector = 0; + } + } - - } - - if(dist_x > MIN_FINGER_DIST) - { - - if(py_vector > PAN_THRESHOLD) + + if(dist_x > MIN_FINGER_DIST) { - //IFCALL(xfi->client->OnPan, xfi->instance, 0, 5); - { - PanningChangeEventArgs e; - - EventArgsInit(&e, "xfreerdp"); - e.XPan = 0; - e.YPan = 5; - PubSub_OnPanningChange(((rdpContext*) xfc)->pubSub, xfc, &e); - } - - py_vector = 0; - - px_vector = 0; - py_vector = 0; - z_vector = 0; + + if(py_vector > PAN_THRESHOLD) + { + { + PanningChangeEventArgs e; + + EventArgsInit(&e, "xfreerdp"); + e.XPan = 0; + e.YPan = 5; + PubSub_OnPanningChange(((rdpContext*) xfc)->pubSub, xfc, &e); + } + + py_vector = 0; + + px_vector = 0; + py_vector = 0; + z_vector = 0; + } + else if(py_vector < -PAN_THRESHOLD) + { + { + PanningChangeEventArgs e; + + EventArgsInit(&e, "xfreerdp"); + e.XPan = 0; + e.YPan = -5; + PubSub_OnPanningChange(((rdpContext*) xfc)->pubSub, xfc, &e); + } + + py_vector = 0; + + px_vector = 0; + py_vector = 0; + z_vector = 0; + } } - else if(py_vector < -PAN_THRESHOLD) - { - //IFCALL(xfi->client->OnPan, xfi->instance, 0, -5); - { - PanningChangeEventArgs e; - - EventArgsInit(&e, "xfreerdp"); - e.XPan = 0; - e.YPan = -5; - PubSub_OnPanningChange(((rdpContext*) xfc)->pubSub, xfc, &e); - } - - py_vector = 0; - - px_vector = 0; - py_vector = 0; - z_vector = 0; - } - } - + } void xf_input_detect_pinch(xfContext* xfc) { double dist; double zoom; - + double delta; ResizeWindowEventArgs e; - + if (active_contacts != 2) { firstDist = -1.0; return; } - - + + /* first calculate the distance */ dist = sqrt(pow(contacts[1].pos_x - contacts[0].last_x, 2.0) + - pow(contacts[1].pos_y - contacts[0].last_y, 2.0)); - + pow(contacts[1].pos_y - contacts[0].last_y, 2.0)); + /* if this is the first 2pt touch */ if (firstDist <= 0) { @@ -385,7 +372,7 @@ void xf_input_detect_pinch(xfContext* xfc) lastDist = firstDist; scale_cnt = 0; z_vector = 0; - + px_vector = 0; py_vector = 0; z_vector = 0; @@ -393,60 +380,59 @@ void xf_input_detect_pinch(xfContext* xfc) else { delta = lastDist - dist; - + if(delta > 1.0) - delta = 1.0; + delta = 1.0; if(delta < -1.0) - delta = -1.0; - + delta = -1.0; + /* compare the current distance to the first one */ zoom = (dist / firstDist); - + z_vector += delta; - - // printf("%.2f = %.2f - %.2f\t(%.2f)\n", delta, lastDist, dist, z_vector); - + + lastDist = dist; - + if (z_vector > ZOOM_THRESHOLD) { xfc->settings->ScalingFactor -= 0.05; - + if (xfc->settings->ScalingFactor < 0.8) xfc->settings->ScalingFactor = 0.8; - + EventArgsInit(&e, "xfreerdp"); e.width = (int) xfc->originalWidth * xfc->settings->ScalingFactor; e.height = (int) xfc->originalHeight * xfc->settings->ScalingFactor; - + xf_transform_window(xfc); PubSub_OnResizeWindow(((rdpContext*) xfc)->pubSub, xfc, &e); xf_draw_screen_scaled(xfc, 0, 0, 0, 0, FALSE); - + z_vector = 0; - + px_vector = 0; py_vector = 0; z_vector = 0; } - + if (z_vector < -ZOOM_THRESHOLD) { xfc->settings->ScalingFactor += 0.05; - + if (xfc->settings->ScalingFactor > 1.2) xfc->settings->ScalingFactor = 1.2; - + EventArgsInit(&e, "xfreerdp"); e.width = (int) xfc->originalWidth * xfc->settings->ScalingFactor; e.height = (int) xfc->originalHeight * xfc->settings->ScalingFactor; - + xf_transform_window(xfc); PubSub_OnResizeWindow(((rdpContext*) xfc)->pubSub, xfc, &e); xf_draw_screen_scaled(xfc, 0, 0, 0, 0, FALSE); - + z_vector = 0; - + px_vector = 0; py_vector = 0; z_vector = 0; @@ -458,8 +444,8 @@ void xf_input_touch_begin(xfContext* xfc, XIDeviceEvent* event) { int i; if(active_contacts == MAX_CONTACTS) - printf("Houston, we have a problem!\n\n"); - + printf("Houston, we have a problem!\n\n"); + for (i = 0; i < MAX_CONTACTS; i++) { if (contacts[i].id == 0) @@ -468,7 +454,7 @@ void xf_input_touch_begin(xfContext* xfc, XIDeviceEvent* event) contacts[i].count = 1; contacts[i].pos_x = event->event_x; contacts[i].pos_y = event->event_y; - + active_contacts++; break; } @@ -487,10 +473,10 @@ void xf_input_touch_update(xfContext* xfc, XIDeviceEvent* event) contacts[i].last_y = contacts[i].pos_y; contacts[i].pos_x = event->event_x; contacts[i].pos_y = event->event_y; - + xf_input_detect_pinch(xfc); xf_input_detect_pan(xfc); - + break; } } @@ -507,7 +493,7 @@ void xf_input_touch_end(xfContext* xfc, XIDeviceEvent* event) contacts[i].count = 0; //contacts[i].pos_x = (int)event->event_x; //contacts[i].pos_y = (int)event->event_y; - + active_contacts--; break;printf("TouchBegin\n"); } @@ -517,9 +503,9 @@ void xf_input_touch_end(xfContext* xfc, XIDeviceEvent* event) int xf_input_handle_event_local(xfContext* xfc, XEvent* event) { XGenericEventCookie* cookie = &event->xcookie; - + XGetEventData(xfc->display, cookie); - + if ((cookie->type == GenericEvent) && (cookie->extension == xfc->XInputOpcode)) { switch (cookie->evtype) @@ -529,27 +515,27 @@ int xf_input_handle_event_local(xfContext* xfc, XEvent* event) xf_input_touch_begin(xfc, cookie->data); xf_input_save_last_event(cookie); break; - + case XI_TouchUpdate: if (xf_input_is_duplicate(cookie) == FALSE) xf_input_touch_update(xfc, cookie->data); xf_input_save_last_event(cookie); break; - + case XI_TouchEnd: if (xf_input_is_duplicate(cookie) == FALSE) xf_input_touch_end(xfc, cookie->data); xf_input_save_last_event(cookie); break; - + default: printf("unhandled xi type= %d\n", cookie->evtype); break; } } - + XFreeEventData(xfc->display,cookie); - + return 0; } @@ -571,14 +557,14 @@ int xf_input_touch_remote(xfContext* xfc, XIDeviceEvent* event, int evtype) int touchId; int contactId; RdpeiClientContext* rdpei = xfc->rdpei; - + if (!rdpei) return 0; - + touchId = event->detail; x = (int) event->event_x; y = (int) event->event_y; - + if (evtype == XI_TouchBegin) { printf("TouchBegin: %d\n", touchId); @@ -594,43 +580,43 @@ int xf_input_touch_remote(xfContext* xfc, XIDeviceEvent* event, int evtype) printf("TouchEnd: %d\n", touchId); contactId = rdpei->TouchEnd(rdpei, touchId, x, y); } - + return 0; } int xf_input_event(xfContext* xfc, XIDeviceEvent* event, int evtype) { - + switch (evtype) { case XI_ButtonPress: xf_generic_ButtonPress(xfc, (int) event->event_x, (int) event->event_y, - event->detail, event->event, xfc->remote_app); + event->detail, event->event, xfc->remote_app); break; - + case XI_ButtonRelease: - + xf_generic_ButtonRelease(xfc, (int) event->event_x, (int) event->event_y, - event->detail, event->event, xfc->remote_app); + event->detail, event->event, xfc->remote_app); break; - + case XI_Motion: - + xf_generic_MotionNotify(xfc, (int) event->event_x, (int) event->event_y, - event->detail, event->event, xfc->remote_app); + event->detail, event->event, xfc->remote_app); break; } - + return 0; } int xf_input_handle_event_remote(xfContext* xfc, XEvent* event) { XGenericEventCookie* cookie = &event->xcookie; - + XGetEventData(xfc->display, cookie); - + if ((cookie->type == GenericEvent) && (cookie->extension == xfc->XInputOpcode)) { switch (cookie->evtype) @@ -638,23 +624,23 @@ int xf_input_handle_event_remote(xfContext* xfc, XEvent* event) case XI_TouchBegin: xf_input_touch_remote(xfc, cookie->data, XI_TouchBegin); break; - + case XI_TouchUpdate: xf_input_touch_remote(xfc, cookie->data, XI_TouchUpdate); break; - + case XI_TouchEnd: xf_input_touch_remote(xfc, cookie->data, XI_TouchEnd); break; - + default: xf_input_event(xfc, cookie->data, cookie->evtype); break; } } - + XFreeEventData(xfc->display,cookie); - + return 0; } @@ -673,10 +659,10 @@ void xf_process_rdpei_event(xfContext* xfc, wMessage* event) { case RdpeiChannel_ServerReady: break; - + case RdpeiChannel_SuspendTouch: break; - + case RdpeiChannel_ResumeTouch: break; } @@ -685,16 +671,16 @@ void xf_process_rdpei_event(xfContext* xfc, wMessage* event) int xf_input_handle_event(xfContext* xfc, XEvent* event) { #ifdef WITH_XI - //printf("m:%d g:%d\n", (xfc->settings->MultiTouchInput), (xfc->settings->MultiTouchGestures) ); + //printf("m:%d g:%d\n", (xfc->settings->MultiTouchInput), (xfc->settings->MultiTouchGestures) ); if (xfc->settings->MultiTouchInput) { return xf_input_handle_event_remote(xfc, event); } - + if (xfc->settings->MultiTouchGestures) return xf_input_handle_event_local(xfc, event); - + #endif - + return 0; } diff --git a/client/X11/xf_keyboard.c b/client/X11/xf_keyboard.c index 9f5febae3..8b5cf0b33 100644 --- a/client/X11/xf_keyboard.c +++ b/client/X11/xf_keyboard.c @@ -216,32 +216,31 @@ BOOL xf_kbd_handle_special_keys(xfContext* xfc, KeySym keysym) return TRUE; } } - + if (keysym == XK_period) { 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))) + || 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 = xfc->settings->ScalingFactor; s += 0.1; if (s > 2.0) s = 2.0; - + xfc->settings->ScalingFactor = s; - + xfc->currentWidth = xfc->originalWidth * s; xfc->currentHeight = xfc->originalHeight * s; - + xf_transform_window(xfc); - - //IFCALL(xfi->client->OnResizeWindow, xfi->instance, xfi->currentWidth, xfi->currentHeight); + { ResizeWindowEventArgs e; - + EventArgsInit(&e, "xfreerdp"); e.width = (int) xfc->originalWidth * xfc->settings->ScalingFactor; e.height = (int) xfc->originalHeight * xfc->settings->ScalingFactor; @@ -251,79 +250,76 @@ BOOL xf_kbd_handle_special_keys(xfContext* xfc, KeySym keysym) return TRUE; } } - + if (keysym == XK_comma) { 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))) + || 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 = xfc->settings->ScalingFactor; s -= 0.1; if (s < 0.5) s = 0.5; - + xfc->settings->ScalingFactor = s; - + xfc->currentWidth = xfc->originalWidth * s; xfc->currentHeight = xfc->originalHeight * s; - + xf_transform_window(xfc); - - //IFCALL(xfi->client->OnResizeWindow, xfi->instance, xfi->currentWidth, xfi->currentHeight); + { ResizeWindowEventArgs e; - + EventArgsInit(&e, "xfreerdp"); e.width = (int) xfc->originalWidth * xfc->settings->ScalingFactor; e.height = (int) xfc->originalHeight * xfc->settings->ScalingFactor; 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(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))) + || xf_kbd_key_pressed(xfc, XK_Alt_R)) + && (xf_kbd_key_pressed(xfc, XK_Control_L) + || xf_kbd_key_pressed(xfc, + XK_Control_R))) { - - //IFCALL(xfc->client->OnPan, xfi->instance, -5, 0); + { PanningChangeEventArgs e; - + EventArgsInit(&e, "xfreerdp"); e.XPan = -5; e.YPan = 0; PubSub_OnPanningChange(((rdpContext*) xfc)->pubSub, xfc, &e); } - + return TRUE; } } - + if (keysym == XK_KP_6) { 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))) + || xf_kbd_key_pressed(xfc, XK_Alt_R)) + && (xf_kbd_key_pressed(xfc, XK_Control_L) + || xf_kbd_key_pressed(xfc, + XK_Control_R))) { - - //IFCALL(xfi->client->OnPan, xfi->instance, 5, 0); + { PanningChangeEventArgs e; - + EventArgsInit(&e, "xfreerdp"); e.XPan = 5; e.YPan = 0; @@ -332,19 +328,18 @@ BOOL xf_kbd_handle_special_keys(xfContext* xfc, KeySym keysym) return TRUE; } } - + if (keysym == XK_KP_8) { 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))) + || xf_kbd_key_pressed(xfc, XK_Alt_R)) + && (xf_kbd_key_pressed(xfc, XK_Control_L) + || xf_kbd_key_pressed(xfc, + XK_Control_R))) { - //IFCALL(xfi->client->OnPan, xfi->instance, 0, -5); { PanningChangeEventArgs e; - + EventArgsInit(&e, "xfreerdp"); e.XPan = 0; e.YPan = -5; @@ -353,19 +348,18 @@ BOOL xf_kbd_handle_special_keys(xfContext* xfc, KeySym keysym) return TRUE; } } - + if (keysym == XK_KP_2) { 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))) + || xf_kbd_key_pressed(xfc, XK_Alt_R)) + && (xf_kbd_key_pressed(xfc, XK_Control_L) + || xf_kbd_key_pressed(xfc, + XK_Control_R))) { - //IFCALL(xfi->client->OnPan, xfi->instance, 0, 5); { PanningChangeEventArgs e; - + EventArgsInit(&e, "xfreerdp"); e.XPan = 0; e.YPan = 5; @@ -375,7 +369,7 @@ BOOL xf_kbd_handle_special_keys(xfContext* xfc, KeySym keysym) } } - + return FALSE; } diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 891716b1a..ce14ab125 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -601,14 +601,8 @@ int freerdp_client_command_line_post_filter(void* context, COMMAND_LINE_ARGUMENT } CommandLineSwitchCase(arg, "gestures") { - //char* p[1]; - //int count = 1; - - printf("gestures\n"); + printf("gestures\n"); settings->MultiTouchGestures = TRUE; - - //p[0] = "rdpei"; - //freerdp_client_add_dynamic_channel(settings, count, p); } CommandLineSwitchCase(arg, "echo") { diff --git a/include/freerdp/client.h b/include/freerdp/client.h index af08998b5..ddca7169c 100644 --- a/include/freerdp/client.h +++ b/include/freerdp/client.h @@ -37,19 +37,6 @@ typedef void (*pRdpGlobalUninit)(void); typedef int (*pRdpClientNew)(freerdp* instance, rdpContext* context); typedef void (*pRdpClientFree)(freerdp* instance, rdpContext* context); -/* -typedef void (*pOnPan)(freerdp* instance, int xdiff, int ydiff); - -struct rdp_client -{ - pOnResizeWindow OnResizeWindow; - pOnWindowStateChange OnWindowStateChange; - pOnErrorInfo OnErrorInfo; - pOnParamChange OnParamChange; - pOnPan OnPan; -*/ - - typedef int (*pRdpClientStart)(rdpContext* context); typedef int (*pRdpClientStop)(rdpContext* context);