mirror of
https://github.com/FreeRDP/FreeRDP.git
synced 2025-06-03 00:00:20 +00:00
xfreerdp: refactor xfreerdp client interface
This commit is contained in:
parent
68e253e209
commit
720a23e07a
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user