From: Marc-André Moreau Date: Mon, 8 Apr 2013 21:03:21 +0000 (-0400) Subject: xfreerdp: refactor xfreerdp client interface X-Git-Tag: 1.1.0-beta1+android3~8^2~4 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=720a23e07ac9cde706c2797710a1de3f1a6d3537;p=platform%2Fupstream%2Ffreerdp.git xfreerdp: refactor xfreerdp client interface --- diff --git a/client/X11/cli/xfreerdp.c b/client/X11/cli/xfreerdp.c index 64367a1..b242c11 100644 --- a/client/X11/cli/xfreerdp.c +++ b/client/X11/cli/xfreerdp.c @@ -38,12 +38,12 @@ int main(int argc, char* argv[]) DWORD dwExitCode; freerdp* instance; - xf_global_init(); + freerdp_client_global_init(); - xfi = xf_new(NULL, NULL, argc, argv); + xfi = freerdp_client_new(argc, argv); instance = xfi->instance; - xf_start(xfi); + freerdp_client_start(xfi); WaitForSingleObject(xfi->thread, INFINITE); @@ -52,7 +52,7 @@ int main(int argc, char* argv[]) freerdp_context_free(instance); freerdp_free(instance); - xf_global_uninit(); + freerdp_client_global_uninit(); return xf_exit_code_from_disconnect_reason(dwExitCode); } diff --git a/client/X11/xf_event.c b/client/X11/xf_event.c index 0cba21c..f8ebbf1 100644 --- a/client/X11/xf_event.c +++ b/client/X11/xf_event.c @@ -131,7 +131,7 @@ static BOOL xf_event_MotionNotify(xfInfo* xfi, XEvent* event, BOOL app) x = event->xmotion.x; y = event->xmotion.y; - if (xfi->mouse_motion != TRUE) + if (!xfi->settings->MouseMotion) { if ((event->xmotion.state & (Button1Mask | Button2Mask | Button3Mask)) == 0) return TRUE; diff --git a/client/X11/xf_interface.c b/client/X11/xf_interface.c index 3bf43ef..c2d6d0a 100644 --- a/client/X11/xf_interface.c +++ b/client/X11/xf_interface.c @@ -369,8 +369,8 @@ BOOL xf_process_x_events(freerdp* instance) void xf_create_window(xfInfo* xfi) { XEvent xevent; - char* win_title; int width, height; + char* windowTitle; ZeroMemory(&xevent, sizeof(xevent)); @@ -387,23 +387,23 @@ void xf_create_window(xfInfo* xfi) xfi->attribs.bit_gravity = NorthWestGravity; xfi->attribs.win_gravity = NorthWestGravity; - if (xfi->instance->settings->WindowTitle != NULL) + if (xfi->instance->settings->WindowTitle) { - win_title = _strdup(xfi->instance->settings->WindowTitle); + windowTitle = _strdup(xfi->instance->settings->WindowTitle); } else if (xfi->instance->settings->ServerPort == 3389) { - win_title = malloc(1 + sizeof("FreeRDP: ") + strlen(xfi->instance->settings->ServerHostname)); - sprintf(win_title, "FreeRDP: %s", xfi->instance->settings->ServerHostname); + windowTitle = malloc(1 + sizeof("FreeRDP: ") + strlen(xfi->instance->settings->ServerHostname)); + sprintf(windowTitle, "FreeRDP: %s", xfi->instance->settings->ServerHostname); } else { - win_title = malloc(1 + sizeof("FreeRDP: ") + strlen(xfi->instance->settings->ServerHostname) + sizeof(":00000")); - sprintf(win_title, "FreeRDP: %s:%i", xfi->instance->settings->ServerHostname, xfi->instance->settings->ServerPort); + windowTitle = malloc(1 + sizeof("FreeRDP: ") + strlen(xfi->instance->settings->ServerHostname) + sizeof(":00000")); + sprintf(windowTitle, "FreeRDP: %s:%i", xfi->instance->settings->ServerHostname, xfi->instance->settings->ServerPort); } - xfi->window = xf_CreateDesktopWindow(xfi, win_title, width, height, xfi->decorations); - free(win_title); + xfi->window = xf_CreateDesktopWindow(xfi, windowTitle, width, height, xfi->settings->Decorations); + free(windowTitle); if (xfi->fullscreen) xf_SetWindowFullscreen(xfi, xfi->window, xfi->fullscreen); @@ -690,14 +690,10 @@ BOOL xf_pre_connect(freerdp* instance) xfi->depth = DefaultDepthOfScreen(xfi->screen); xfi->big_endian = (ImageByteOrder(xfi->display) == MSBFirst); - xfi->mouse_motion = settings->MouseMotion; xfi->complex_regions = TRUE; - xfi->decorations = settings->Decorations; xfi->fullscreen = settings->Fullscreen; xfi->grab_keyboard = settings->GrabKeyboard; xfi->fullscreen_toggle = settings->ToggleFullscreen; - xfi->sw_gdi = settings->SoftwareGdi; - xfi->parent_window = (Window) settings->ParentWindowId; xf_detect_monitors(xfi, settings); @@ -724,12 +720,12 @@ BOOL xf_post_connect(freerdp* instance) channels = xfi->_context->channels; settings = instance->settings; - if (xf_get_pixmap_info(xfi) != TRUE) + if (!xf_get_pixmap_info(xfi)) return FALSE; xf_register_graphics(instance->context->graphics); - if (xfi->sw_gdi) + if (xfi->settings->SoftwareGdi) { rdpGdi* gdi; UINT32 flags; @@ -796,7 +792,7 @@ BOOL xf_post_connect(freerdp* instance) xfi->bmp_codec_none = (BYTE*) malloc(64 * 64 * 4); - if (xfi->sw_gdi) + if (xfi->settings->SoftwareGdi) { instance->update->BeginPaint = xf_sw_begin_paint; instance->update->EndPaint = xf_sw_end_paint; @@ -811,7 +807,7 @@ BOOL xf_post_connect(freerdp* instance) pointer_cache_register_callbacks(instance->update); - if (xfi->sw_gdi != TRUE) + if (!xfi->settings->SoftwareGdi) { glyph_cache_register_callbacks(instance->update); brush_cache_register_callbacks(instance->update); @@ -830,8 +826,7 @@ BOOL xf_post_connect(freerdp* instance) xf_cliprdr_init(xfi, channels); - if (xfi->client->OnResizeWindow) - xfi->client->OnResizeWindow(instance, settings->DesktopWidth, settings->DesktopHeight); + IFCALL(xfi->client->OnResizeWindow, instance, settings->DesktopWidth, settings->DesktopHeight); return TRUE; } @@ -1191,7 +1186,7 @@ void* xf_thread(void* param) if (!status) { - xf_free(xfi); + freerdp_client_free(xfi); exit_code = XF_EXIT_CONN_FAILED; ExitThread(exit_code); } @@ -1387,7 +1382,7 @@ void* xf_thread(void* param) freerdp_channels_free(channels); freerdp_disconnect(instance); gdi_free(instance); - xf_free(xfi); + freerdp_client_free(xfi); exit_code = 123; @@ -1418,7 +1413,7 @@ DWORD xf_exit_code_from_disconnect_reason(DWORD reason) * Client Interface */ -int xf_global_init() +int freerdp_client_global_init() { setlocale(LC_ALL, ""); freerdp_handle_signals(); @@ -1427,21 +1422,21 @@ int xf_global_init() return 0; } -int xf_global_uninit() +int freerdp_client_global_uninit() { freerdp_channels_global_uninit(); return 0; } -int xf_start(xfInfo* xfi) +int freerdp_client_start(xfInfo* xfi) { xfi->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) xf_thread, (void*) xfi->instance, 0, NULL); return 0; } -int xf_stop(xfInfo* xfi) +int freerdp_client_stop(xfInfo* xfi) { if (xfi->instance->settings->AsyncInput) { @@ -1457,7 +1452,7 @@ int xf_stop(xfInfo* xfi) return 0; } -xfInfo* xf_new(HANDLE hInstance, HANDLE hWndParent, int argc, char** argv) +xfInfo* freerdp_client_new(int argc, char** argv) { int index; int status; @@ -1495,6 +1490,7 @@ xfInfo* xf_new(HANDLE hInstance, HANDLE hWndParent, int argc, char** argv) xfi->instance = instance; settings = instance->settings; xfi->client = instance->context->client; + xfi->settings = instance->context->settings; status = freerdp_client_parse_command_line_arguments(instance->context->argc, instance->context->argv, settings); @@ -1544,7 +1540,7 @@ xfInfo* xf_new(HANDLE hInstance, HANDLE hWndParent, int argc, char** argv) return xfi; } -void xf_free(xfInfo* xfi) +void freerdp_client_free(xfInfo* xfi) { if (xfi) { diff --git a/client/X11/xf_interface.h b/client/X11/xf_interface.h index a81265d..9f4483f 100644 --- a/client/X11/xf_interface.h +++ b/client/X11/xf_interface.h @@ -89,6 +89,7 @@ struct xf_info rdpContext* _context; rdpClient* client; + rdpSettings* settings; GC gc; int bpp; @@ -113,7 +114,6 @@ struct xf_info BOOL fullscreen; BOOL grab_keyboard; BOOL unobscured; - BOOL decorations; BOOL debug; xfWindow* window; xfWorkArea workArea; @@ -121,13 +121,11 @@ struct xf_info BOOL remote_app; BOOL disconnect; HCLRCONV clrconv; - Window parent_window; HANDLE mutex; HANDLE thread; BOOL UseXThreads; HGDI_DC hdc; - BOOL sw_gdi; BYTE* primary_buffer; BOOL frame_begin; @@ -138,7 +136,6 @@ struct xf_info BOOL focused; BOOL mouse_active; - BOOL mouse_motion; BOOL suppress_output; BOOL fullscreen_toggle; UINT32 keyboard_layout_id; @@ -233,14 +230,16 @@ DWORD xf_exit_code_from_disconnect_reason(DWORD reason); * Client Interface */ -FREERDP_API int xf_global_init(); -FREERDP_API int xf_global_uninit(); +#define cfInfo xfInfo + +FREERDP_API int freerdp_client_global_init(); +FREERDP_API int freerdp_client_global_uninit(); -FREERDP_API int xf_start(xfInfo* xfi); -FREERDP_API int xf_stop(xfInfo* xfi); +FREERDP_API int freerdp_client_start(cfInfo* cfi); +FREERDP_API int freerdp_client_stop(cfInfo* cfi); -FREERDP_API xfInfo* xf_new(HANDLE hInstance, HANDLE hWndParent, int argc, char** argv); -FREERDP_API void xf_free(xfInfo* xfi); +FREERDP_API cfInfo* freerdp_client_new(int argc, char** argv); +FREERDP_API void freerdp_client_free(cfInfo* cfi); #ifdef __cplusplus } diff --git a/client/X11/xf_window.c b/client/X11/xf_window.c index f326e19..fd6631c 100644 --- a/client/X11/xf_window.c +++ b/client/X11/xf_window.c @@ -310,7 +310,7 @@ static void xf_SetWindowPID(xfInfo* xfi, xfWindow* window, pid_t pid) { Atom am_wm_pid; - if (pid == 0) + if (!pid) pid = getpid(); am_wm_pid = XInternAtom(xfi->display, "_NET_WM_PID", False); @@ -327,7 +327,7 @@ xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height, window = (xfWindow*) malloc(sizeof(xfWindow)); ZeroMemory(window, sizeof(xfWindow)); - if (window != NULL) + if (window) { int shmid; int input_mask; @@ -368,13 +368,15 @@ xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height, class_hints = XAllocClassHint(); - if (class_hints != NULL) + if (class_hints) { class_hints->res_name = "xfreerdp"; - if (xfi->instance->settings->WmClass != NULL) + + if (xfi->instance->settings->WmClass) class_hints->res_class = xfi->instance->settings->WmClass; else class_hints->res_class = "xfreerdp"; + XSetClassHint(xfi->display, window->handle, class_hints); XFree(class_hints); } @@ -394,8 +396,8 @@ xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height, XChangeProperty(xfi->display, window->handle, xfi->_NET_WM_ICON, XA_CARDINAL, 32, PropModeReplace, (BYTE*) xf_icon_prop, ARRAYSIZE(xf_icon_prop)); - if (xfi->parent_window) - XReparentWindow(xfi->display, window->handle, xfi->parent_window, 0, 0); + if (xfi->settings->ParentWindowId) + XReparentWindow(xfi->display, window->handle, (Window) xfi->settings->ParentWindowId, 0, 0); XSelectInput(xfi->display, window->handle, input_mask); XClearWindow(xfi->display, window->handle); @@ -403,7 +405,7 @@ xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height, /* * NOTE: This must be done here to handle reparenting the window, - * so that we dont miss the event and hang waiting for the next one + * so that we don't miss the event and hang waiting for the next one */ do { @@ -880,7 +882,7 @@ void xf_UpdateWindowArea(xfInfo* xfi, xfWindow* window, int x, int y, int width, rdpWindow* wnd; wnd = window->window; - /* Remote app mode uses visibleOffset instead of windowOffset */ + /* RemoteApp mode uses visibleOffset instead of windowOffset */ if (!xfi->remote_app) { @@ -907,7 +909,7 @@ void xf_UpdateWindowArea(xfInfo* xfi, xfWindow* window, int x, int y, int width, WaitForSingleObject(xfi->mutex, INFINITE); - if (xfi->sw_gdi) + if (xfi->settings->SoftwareGdi) { XPutImage(xfi->display, xfi->primary, window->gc, xfi->image, ax, ay, ax, ay, width, height); diff --git a/include/freerdp/client.h b/include/freerdp/client.h index 7625f44..5c0cc96 100644 --- a/include/freerdp/client.h +++ b/include/freerdp/client.h @@ -36,6 +36,25 @@ struct rdp_client pOnResizeWindow OnResizeWindow; }; +/** + * Generic Client Interface + */ + +#if 0 + +#define cfInfo void* + +FREERDP_API int freerdp_client_global_init(); +FREERDP_API int freerdp_client_global_uninit(); + +FREERDP_API int freerdp_client_start(cfInfo* cfi); +FREERDP_API int freerdp_client_stop(cfInfo* cfi); + +FREERDP_API cfInfo* freerdp_client_new(int argc, char** argv); +FREERDP_API void freerdp_client_free(cfInfo* cfi); + +#endif + #ifdef __cplusplus } #endif diff --git a/libfreerdp/core/freerdp.c b/libfreerdp/core/freerdp.c index 173c472..b1d05fb 100644 --- a/libfreerdp/core/freerdp.c +++ b/libfreerdp/core/freerdp.c @@ -314,7 +314,7 @@ void freerdp_context_new(freerdp* instance) instance->context->update = instance->update; instance->context->settings = instance->settings; - instance->context->client = (rdpContext*) malloc(sizeof(rdpClient)); + instance->context->client = (rdpClient*) malloc(sizeof(rdpClient)); ZeroMemory(instance->context->client, sizeof(rdpClient)); instance->update->context = instance->context;