xfreerdp: refactor xfreerdp client interface

This commit is contained in:
Marc-André Moreau 2013-04-08 17:03:21 -04:00
parent 68e253e209
commit 720a23e07a
7 changed files with 68 additions and 52 deletions

View 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);
}

View 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;

View 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)
{

View 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 xf_start(xfInfo* xfi);
FREERDP_API int xf_stop(xfInfo* xfi);
FREERDP_API int freerdp_client_global_init();
FREERDP_API int freerdp_client_global_uninit();
FREERDP_API xfInfo* xf_new(HANDLE hInstance, HANDLE hWndParent, int argc, char** argv);
FREERDP_API void xf_free(xfInfo* xfi);
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);
#ifdef __cplusplus
}

View 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);

View 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

View 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;