xfreerdp: refactor xfreerdp client interface
authorMarc-André Moreau <marcandre.moreau@gmail.com>
Mon, 8 Apr 2013 21:03:21 +0000 (17:03 -0400)
committerMarc-André Moreau <marcandre.moreau@gmail.com>
Mon, 8 Apr 2013 21:03:21 +0000 (17:03 -0400)
client/X11/cli/xfreerdp.c
client/X11/xf_event.c
client/X11/xf_interface.c
client/X11/xf_interface.h
client/X11/xf_window.c
include/freerdp/client.h
libfreerdp/core/freerdp.c

index 64367a1..b242c11 100644 (file)
@@ -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);
 }
index 0cba21c..f8ebbf1 100644 (file)
@@ -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;
index 3bf43ef..c2d6d0a 100644 (file)
@@ -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)
        {
index a81265d..9f4483f 100644 (file)
@@ -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
 }
index f326e19..fd6631c 100644 (file)
@@ -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);
index 7625f44..5c0cc96 100644 (file)
@@ -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
index 173c472..b1d05fb 100644 (file)
@@ -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;