diff --git a/client/Wayland/CMakeLists.txt b/client/Wayland/CMakeLists.txt index e95055f37..1b81d2e97 100644 --- a/client/Wayland/CMakeLists.txt +++ b/client/Wayland/CMakeLists.txt @@ -27,6 +27,8 @@ set(${MODULE_PREFIX}_SRCS wlfreerdp.h wlf_input.c wlf_input.h + wlf_channels.c + wlf_channels.h ) add_executable(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) diff --git a/client/Wayland/wlf_channels.c b/client/Wayland/wlf_channels.c new file mode 100644 index 000000000..32cdb6ba8 --- /dev/null +++ b/client/Wayland/wlf_channels.c @@ -0,0 +1,118 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * X11 Client Channels + * + * Copyright 2013 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "wlf_channels.h" +#include "wlfreerdp.h" + +/** + * Function description + * + * @return 0 on success, otherwise a Win32 error code + */ +static UINT wlf_encomsp_participant_created(EncomspClientContext* context, + ENCOMSP_PARTICIPANT_CREATED_PDU* participantCreated) +{ + return CHANNEL_RC_OK; +} + +static void wlf_encomsp_init(wlfContext* wlf, EncomspClientContext* encomsp) +{ + if (!wlf) + return; + + wlf->encomsp = encomsp; + encomsp->custom = (void*) wlf; + encomsp->ParticipantCreated = wlf_encomsp_participant_created; +} + +static void wlf_encomsp_uninit(wlfContext* wlf, EncomspClientContext* encomsp) +{ + if (!wlf) + return; + + wlf->encomsp = NULL; +} + + +void wlf_OnChannelConnectedEventHandler(rdpContext* context, + ChannelConnectedEventArgs* e) +{ + wlfContext* wlf = (wlfContext*) context; + rdpSettings* settings = context->settings; + + if (strcmp(e->name, RDPEI_DVC_CHANNEL_NAME) == 0) + { + wlf->rdpei = (RdpeiClientContext*) e->pInterface; + } + else if (strcmp(e->name, TSMF_DVC_CHANNEL_NAME) == 0) + { + } + else if (strcmp(e->name, RDPGFX_DVC_CHANNEL_NAME) == 0) + { + if (settings->SoftwareGdi) + gdi_graphics_pipeline_init(context->gdi, (RdpgfxClientContext*) e->pInterface); + } + else if (strcmp(e->name, RAIL_SVC_CHANNEL_NAME) == 0) + { + } + else if (strcmp(e->name, CLIPRDR_SVC_CHANNEL_NAME) == 0) + { + } + else if (strcmp(e->name, ENCOMSP_SVC_CHANNEL_NAME) == 0) + { + wlf_encomsp_init(wlf, (EncomspClientContext*) e->pInterface); + } +} + +void wlf_OnChannelDisconnectedEventHandler(rdpContext* context, + ChannelDisconnectedEventArgs* e) +{ + wlfContext* wlf = (wlfContext*) context; + rdpSettings* settings = context->settings; + + if (strcmp(e->name, RDPEI_DVC_CHANNEL_NAME) == 0) + { + wlf->rdpei = NULL; + } + else if (strcmp(e->name, TSMF_DVC_CHANNEL_NAME) == 0) + { + } + else if (strcmp(e->name, RDPGFX_DVC_CHANNEL_NAME) == 0) + { + if (settings->SoftwareGdi) + gdi_graphics_pipeline_uninit(context->gdi, + (RdpgfxClientContext*) e->pInterface); + } + else if (strcmp(e->name, RAIL_SVC_CHANNEL_NAME) == 0) + { + } + else if (strcmp(e->name, CLIPRDR_SVC_CHANNEL_NAME) == 0) + { + } + else if (strcmp(e->name, ENCOMSP_SVC_CHANNEL_NAME) == 0) + { + wlf_encomsp_uninit(wlf, (EncomspClientContext*) e->pInterface); + } +} diff --git a/client/Wayland/wlf_channels.h b/client/Wayland/wlf_channels.h new file mode 100644 index 000000000..b0e2ff19a --- /dev/null +++ b/client/Wayland/wlf_channels.h @@ -0,0 +1,42 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * X11 Client Channels + * + * Copyright 2013 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef WLF_CHANNELS_H +#define WLF_CHANNELS_H + +#include +#include +#include +#include +#include +#include +#include +#include + +int wlf_on_channel_connected(freerdp* instance, const char* name, + void* pInterface); +int wlf_on_channel_disconnected(freerdp* instance, const char* name, + void* pInterface); + +void wlf_OnChannelConnectedEventHandler(rdpContext* context, + ChannelConnectedEventArgs* e); +void wlf_OnChannelDisconnectedEventHandler(rdpContext* context, + ChannelDisconnectedEventArgs* e); + +#endif diff --git a/client/Wayland/wlf_input.h b/client/Wayland/wlf_input.h index 0529f0179..2e26ab89a 100644 --- a/client/Wayland/wlf_input.h +++ b/client/Wayland/wlf_input.h @@ -22,14 +22,17 @@ #define __WLF_INPUT_H #include +#include +#include #include -BOOL wlf_handle_pointer_enter(freerdp* instance, UwacPointerEnterLeaveEvent *ev); -BOOL wlf_handle_pointer_motion(freerdp* instance, UwacPointerMotionEvent *ev); -BOOL wlf_handle_pointer_buttons(freerdp* instance, UwacPointerButtonEvent *ev); -BOOL wlf_handle_pointer_axis(freerdp* instance, UwacPointerAxisEvent *ev); +BOOL wlf_handle_pointer_enter(freerdp* instance, + UwacPointerEnterLeaveEvent* ev); +BOOL wlf_handle_pointer_motion(freerdp* instance, UwacPointerMotionEvent* ev); +BOOL wlf_handle_pointer_buttons(freerdp* instance, UwacPointerButtonEvent* ev); +BOOL wlf_handle_pointer_axis(freerdp* instance, UwacPointerAxisEvent* ev); -BOOL wlf_handle_key(freerdp* instance, UwacKeyEvent *ev); -BOOL wlf_keyboard_enter(freerdp *instance, UwacKeyboardEnterLeaveEvent *ev); +BOOL wlf_handle_key(freerdp* instance, UwacKeyEvent* ev); +BOOL wlf_keyboard_enter(freerdp* instance, UwacKeyboardEnterLeaveEvent* ev); #endif /* __WLF_INPUT_H */ diff --git a/client/Wayland/wlfreerdp.c b/client/Wayland/wlfreerdp.c index d2f8f9648..1fdc015cf 100644 --- a/client/Wayland/wlfreerdp.c +++ b/client/Wayland/wlfreerdp.c @@ -21,37 +21,23 @@ #include #include +#include #include #include #include +#include +#include + #include +#include + #include "wlfreerdp.h" #include "wlf_input.h" +#include "wlf_channels.h" -UwacDisplay *g_display; -HANDLE g_displayHandle; - -static BOOL wl_context_new(freerdp* instance, rdpContext* context) -{ - if (!(context->channels = freerdp_channels_new())) - return FALSE; - - return TRUE; -} - -static void wl_context_free(freerdp* instance, rdpContext* context) -{ - if (context && context->channels) - { - freerdp_channels_close(context->channels, instance); - freerdp_channels_free(context->channels); - context->channels = NULL; - } -} - -BOOL wl_update_content(wlfContext *context_w) +static BOOL wl_update_content(wlfContext* context_w) { if (!context_w->waitingFrameDone && context_w->haveDamage) { @@ -66,7 +52,6 @@ BOOL wl_update_content(wlfContext *context_w) static BOOL wl_begin_paint(rdpContext* context) { rdpGdi* gdi; - gdi = context->gdi; gdi->primary->hdc->hwnd->invalid->null = 1; return TRUE; @@ -76,13 +61,13 @@ static BOOL wl_begin_paint(rdpContext* context) static BOOL wl_end_paint(rdpContext* context) { rdpGdi* gdi; - char *data; - wlfContext *context_w; + char* data; + wlfContext* context_w; INT32 x, y; UINT32 w, h; int i; - gdi = context->gdi; + if (gdi->primary->hdc->hwnd->invalid->null) return TRUE; @@ -90,18 +75,19 @@ static BOOL wl_end_paint(rdpContext* context) y = gdi->primary->hdc->hwnd->invalid->y; w = gdi->primary->hdc->hwnd->invalid->w; h = gdi->primary->hdc->hwnd->invalid->h; - context_w = (wlfContext*) context; - data = UwacWindowGetDrawingBuffer(context_w->window); + if (!data) return FALSE; for (i = 0; i < h; i++) { - memcpy(data + ((i+y)*(gdi->width*GetBytesPerPixel(gdi->dstFormat))) + x*GetBytesPerPixel(gdi->dstFormat), - gdi->primary_buffer + ((i+y)*(gdi->width*GetBytesPerPixel(gdi->dstFormat))) + x*GetBytesPerPixel(gdi->dstFormat), - w*GetBytesPerPixel(gdi->dstFormat)); + memcpy(data + ((i + y) * (gdi->width * GetBytesPerPixel( + gdi->dstFormat))) + x * GetBytesPerPixel(gdi->dstFormat), + gdi->primary_buffer + ((i + y) * (gdi->width * GetBytesPerPixel( + gdi->dstFormat))) + x * GetBytesPerPixel(gdi->dstFormat), + w * GetBytesPerPixel(gdi->dstFormat)); } if (UwacWindowAddDamage(context_w->window, x, y, w, h) != UWAC_SUCCESS) @@ -114,16 +100,58 @@ static BOOL wl_end_paint(rdpContext* context) static BOOL wl_pre_connect(freerdp* instance) { + rdpSettings* settings; wlfContext* context; - if (freerdp_channels_pre_connect(instance->context->channels, instance) != CHANNEL_RC_OK) + if (!instance) return FALSE; context = (wlfContext*) instance->context; - if (!context) + settings = instance->settings; + + if (!context || !settings) return FALSE; - context->display = g_display; + settings->OsMajorType = OSMAJORTYPE_UNIX; + settings->OsMinorType = OSMINORTYPE_NATIVE_WAYLAND; + settings->SoftwareGdi = TRUE; + ZeroMemory(settings->OrderSupport, 32); + settings->OrderSupport[NEG_DSTBLT_INDEX] = TRUE; + settings->OrderSupport[NEG_PATBLT_INDEX] = TRUE; + settings->OrderSupport[NEG_SCRBLT_INDEX] = TRUE; + settings->OrderSupport[NEG_OPAQUE_RECT_INDEX] = TRUE; + settings->OrderSupport[NEG_DRAWNINEGRID_INDEX] = FALSE; + settings->OrderSupport[NEG_MULTIDSTBLT_INDEX] = FALSE; + settings->OrderSupport[NEG_MULTIPATBLT_INDEX] = FALSE; + settings->OrderSupport[NEG_MULTISCRBLT_INDEX] = FALSE; + settings->OrderSupport[NEG_MULTIOPAQUERECT_INDEX] = TRUE; + settings->OrderSupport[NEG_MULTI_DRAWNINEGRID_INDEX] = FALSE; + settings->OrderSupport[NEG_LINETO_INDEX] = TRUE; + settings->OrderSupport[NEG_POLYLINE_INDEX] = TRUE; + settings->OrderSupport[NEG_MEMBLT_INDEX] = settings->BitmapCacheEnabled; + settings->OrderSupport[NEG_MEM3BLT_INDEX] = TRUE; + settings->OrderSupport[NEG_MEMBLT_V2_INDEX] = settings->BitmapCacheEnabled; + settings->OrderSupport[NEG_MEM3BLT_V2_INDEX] = FALSE; + settings->OrderSupport[NEG_SAVEBITMAP_INDEX] = FALSE; + settings->OrderSupport[NEG_GLYPH_INDEX_INDEX] = TRUE; + settings->OrderSupport[NEG_FAST_INDEX_INDEX] = TRUE; + settings->OrderSupport[NEG_FAST_GLYPH_INDEX] = TRUE; + settings->OrderSupport[NEG_POLYGON_SC_INDEX] = TRUE; + settings->OrderSupport[NEG_POLYGON_CB_INDEX] = TRUE; + settings->OrderSupport[NEG_ELLIPSE_SC_INDEX] = FALSE; + settings->OrderSupport[NEG_ELLIPSE_CB_INDEX] = FALSE; + PubSub_SubscribeChannelConnected(instance->context->pubSub, + (pChannelConnectedEventHandler) wlf_OnChannelConnectedEventHandler); + PubSub_SubscribeChannelDisconnected(instance->context->pubSub, + (pChannelDisconnectedEventHandler) wlf_OnChannelDisconnectedEventHandler); + + if (!freerdp_client_load_addins(instance->context->channels, + instance->settings)) + return FALSE; + + if (freerdp_channels_pre_connect(instance->context->channels, + instance) != CHANNEL_RC_OK) + return FALSE; return TRUE; } @@ -134,28 +162,31 @@ static BOOL wl_post_connect(freerdp* instance) UwacWindow* window; wlfContext* context; - if (!gdi_init(instance, PIXEL_FORMAT_ARGB32)) + if (!gdi_init(instance, PIXEL_FORMAT_BGRA32)) return FALSE; gdi = instance->context->gdi; + if (!gdi) return FALSE; context = (wlfContext*) instance->context; - context->window = window = UwacCreateWindowShm(context->display, gdi->width, gdi->height, WL_SHM_FORMAT_XRGB8888); + context->window = window = UwacCreateWindowShm(context->display, gdi->width, + gdi->height, WL_SHM_FORMAT_XRGB8888); + if (!window) return FALSE; UwacWindowSetTitle(window, "FreeRDP"); - instance->update->BeginPaint = wl_begin_paint; instance->update->EndPaint = wl_end_paint; - if (freerdp_channels_post_connect(instance->context->channels, instance) != CHANNEL_RC_OK) + if (freerdp_channels_post_connect(instance->context->channels, + instance) != CHANNEL_RC_OK) return FALSE; - - memcpy(UwacWindowGetDrawingBuffer(context->window), gdi->primary_buffer, gdi->width * gdi->height * 4); + memcpy(UwacWindowGetDrawingBuffer(context->window), gdi->primary_buffer, + gdi->width * gdi->height * 4); UwacWindowAddDamage(context->window, 0, 0, gdi->width, gdi->height); context->haveDamage = TRUE; return wl_update_content(context); @@ -163,7 +194,8 @@ static BOOL wl_post_connect(freerdp* instance) static void wl_post_disconnect(freerdp* instance) { - wlfContext *context; + wlfContext* context; + if (!instance) return; @@ -171,19 +203,16 @@ static void wl_post_disconnect(freerdp* instance) return; context = (wlfContext*) instance->context; - gdi_free(instance); + if (context->window) UwacDestroyWindow(&context->window); - - if (context->display) - UwacCloseDisplay(&context->display); - } -static BOOL handle_uwac_events(freerdp* instance, UwacDisplay *display) { +static BOOL handle_uwac_events(freerdp* instance, UwacDisplay* display) +{ UwacEvent event; - wlfContext *context; + wlfContext* context; if (UwacDisplayDispatch(display, 1) < 0) return FALSE; @@ -194,80 +223,108 @@ static BOOL handle_uwac_events(freerdp* instance, UwacDisplay *display) { return FALSE; /*printf("UWAC event type %d\n", event.type);*/ - switch (event.type) { - case UWAC_EVENT_FRAME_DONE: - if (!instance) - continue; + switch (event.type) + { + case UWAC_EVENT_FRAME_DONE: + if (!instance) + continue; - context = (wlfContext *)instance->context; - context->waitingFrameDone = FALSE; - if (context->haveDamage && !wl_end_paint(instance->context)) - return FALSE; - break; - case UWAC_EVENT_POINTER_ENTER: - if (!wlf_handle_pointer_enter(instance, &event.mouse_enter_leave)) - return FALSE; - break; - case UWAC_EVENT_POINTER_MOTION: - if (!wlf_handle_pointer_motion(instance, &event.mouse_motion)) - return FALSE; - break; - case UWAC_EVENT_POINTER_BUTTONS: - if (!wlf_handle_pointer_buttons(instance, &event.mouse_button)) - return FALSE; - break; - case UWAC_EVENT_POINTER_AXIS: - if (!wlf_handle_pointer_axis(instance, &event.mouse_axis)) - return FALSE; - break; - case UWAC_EVENT_KEY: - if (!wlf_handle_key(instance, &event.key)) - return FALSE; - break; - case UWAC_EVENT_KEYBOARD_ENTER: - if (!wlf_keyboard_enter(instance, &event.keyboard_enter_leave)) - return FALSE; - break; - default: - break; + context = (wlfContext*)instance->context; + context->waitingFrameDone = FALSE; + + if (context->haveDamage && !wl_end_paint(instance->context)) + return FALSE; + + break; + + case UWAC_EVENT_POINTER_ENTER: + if (!wlf_handle_pointer_enter(instance, &event.mouse_enter_leave)) + return FALSE; + + break; + + case UWAC_EVENT_POINTER_MOTION: + if (!wlf_handle_pointer_motion(instance, &event.mouse_motion)) + return FALSE; + + break; + + case UWAC_EVENT_POINTER_BUTTONS: + if (!wlf_handle_pointer_buttons(instance, &event.mouse_button)) + return FALSE; + + break; + + case UWAC_EVENT_POINTER_AXIS: + if (!wlf_handle_pointer_axis(instance, &event.mouse_axis)) + return FALSE; + + break; + + case UWAC_EVENT_KEY: + if (!wlf_handle_key(instance, &event.key)) + return FALSE; + + break; + + case UWAC_EVENT_KEYBOARD_ENTER: + if (!wlf_keyboard_enter(instance, &event.keyboard_enter_leave)) + return FALSE; + + break; + + default: + break; } } + return TRUE; } static int wlfreerdp_run(freerdp* instance) { + wlfContext* context; DWORD count; HANDLE handles[64]; DWORD status; + if (!instance) + return -1; + + context = (wlfContext*)instance->context; + + if (!context) + return -1; + if (!freerdp_connect(instance)) { printf("Failed to connect\n"); return -1; } - handle_uwac_events(instance, g_display); + handle_uwac_events(instance, context->display); while (!freerdp_shall_disconnect(instance)) { - handles[0] = g_displayHandle; - + handles[0] = context->displayHandle; count = freerdp_get_event_handles(instance->context, &handles[1], 63); + if (!count) { printf("Failed to get FreeRDP file descriptor\n"); break; } - status = WaitForMultipleObjects(count+1, handles, FALSE, INFINITE); + status = WaitForMultipleObjects(count + 1, handles, FALSE, INFINITE); + if (WAIT_FAILED == status) { printf("%s: WaitForMultipleObjects failed\n", __FUNCTION__); break; } - if (!handle_uwac_events(instance, g_display)) { + if (!handle_uwac_events(instance, context->display)) + { printf("error handling UWAC events\n"); break; } @@ -278,33 +335,40 @@ static int wlfreerdp_run(freerdp* instance) printf("Failed to check FreeRDP file descriptor\n"); break; } - //} + //} } freerdp_channels_disconnect(instance->context->channels, instance); freerdp_disconnect(instance); - return 0; } -int main(int argc, char* argv[]) +static BOOL wlf_client_global_init() +{ + setlocale(LC_ALL, ""); + + if (freerdp_handle_signals() != 0) + return FALSE; + + return TRUE; +} + +static void wlf_client_global_uninit() +{ +} + +static BOOL wlf_client_new(freerdp* instance, rdpContext* context) { UwacReturnCode status; - freerdp* instance; + wlfContext* wfl = (wlfContext*) context; - g_display = UwacOpenDisplay(NULL, &status); - if (!g_display) - exit(1); + if (!instance || !context) + return FALSE; - g_displayHandle = CreateFileDescriptorEvent(NULL, FALSE, FALSE, UwacDisplayGetFd(g_display), WINPR_FD_READ); - if (!g_displayHandle) - exit(1); + if (!(context->channels = freerdp_channels_new())) + return FALSE; - //if (!handle_uwac_events(NULL, g_display)) - // exit(1); - - instance = freerdp_new(); instance->PreConnect = wl_pre_connect; instance->PostConnect = wl_post_connect; instance->PostDisconnect = wl_post_disconnect; @@ -312,28 +376,99 @@ int main(int argc, char* argv[]) instance->GatewayAuthenticate = client_cli_gw_authenticate; instance->VerifyCertificate = client_cli_verify_certificate; instance->VerifyChangedCertificate = client_cli_verify_changed_certificate; + instance->LogonErrorInfo = NULL; + wfl->display = UwacOpenDisplay(NULL, &status); - instance->ContextSize = sizeof(wlfContext); - instance->ContextNew = wl_context_new; - instance->ContextFree = wl_context_free; + if (!wfl->display || (status != UWAC_SUCCESS)) + return FALSE; - freerdp_context_new(instance); + wfl->displayHandle = CreateFileDescriptorEvent(NULL, FALSE, FALSE, + UwacDisplayGetFd(wfl->display), WINPR_FD_READ); - status = freerdp_client_settings_parse_command_line(instance->settings, argc, argv, FALSE); + if (!wfl->displayHandle) + return FALSE; - status = freerdp_client_settings_command_line_status_print(instance->settings, status, argc, argv); + return TRUE; +} - if (status) - exit(0); - if (!freerdp_client_load_addins(instance->context->channels, instance->settings)) - exit(-1); +static void wlf_client_free(freerdp* instance, rdpContext* context) +{ + wlfContext* wlf = (wlfContext*) instance->context; - wlfreerdp_run(instance); + if (!context) + return; - freerdp_context_free(instance); + if (context->channels) + { + freerdp_channels_close(context->channels, instance); + freerdp_channels_free(context->channels); + context->channels = NULL; + } - freerdp_free(instance); + if (wlf->display) + UwacCloseDisplay(&wlf->display); + if (wlf->displayHandle) + CloseHandle(wlf->displayHandle); +} + +static int wfl_client_start(rdpContext* context) +{ return 0; } + +static int wfl_client_stop(rdpContext* context) +{ + return 0; +} + +static int RdpClientEntry(RDP_CLIENT_ENTRY_POINTS* pEntryPoints) +{ + ZeroMemory(pEntryPoints, sizeof(RDP_CLIENT_ENTRY_POINTS)); + pEntryPoints->Version = RDP_CLIENT_INTERFACE_VERSION; + pEntryPoints->Size = sizeof(RDP_CLIENT_ENTRY_POINTS_V1); + pEntryPoints->GlobalInit = wlf_client_global_init; + pEntryPoints->GlobalUninit = wlf_client_global_uninit; + pEntryPoints->ContextSize = sizeof(wlfContext); + pEntryPoints->ClientNew = wlf_client_new; + pEntryPoints->ClientFree = wlf_client_free; + pEntryPoints->ClientStart = wfl_client_start; + pEntryPoints->ClientStop = wfl_client_stop; + return 0; +} + +int main(int argc, char* argv[]) +{ + int rc = -1; + DWORD status; + RDP_CLIENT_ENTRY_POINTS clientEntryPoints; + rdpContext* context; + //if (!handle_uwac_events(NULL, g_display)) + // exit(1); + RdpClientEntry(&clientEntryPoints); + context = freerdp_client_context_new(&clientEntryPoints); + + if (!context) + goto fail; + + status = freerdp_client_settings_parse_command_line(context->settings, argc, + argv, FALSE); + status = freerdp_client_settings_command_line_status_print(context->settings, + status, argc, argv); + + if (status) + return 0; + + if (freerdp_client_start(context) != 0) + goto fail; + + rc = wlfreerdp_run(context->instance); + + if (freerdp_client_stop(context) != 0) + rc = -1; + +fail: + freerdp_client_context_free(context); + return rc; +} diff --git a/client/Wayland/wlfreerdp.h b/client/Wayland/wlfreerdp.h index 575d7e46b..f9fe716a8 100644 --- a/client/Wayland/wlfreerdp.h +++ b/client/Wayland/wlfreerdp.h @@ -20,6 +20,9 @@ #ifndef __WLFREERDP_H #define __WLFREERDP_H +#include +#include +#include #include #include #include @@ -34,11 +37,17 @@ struct wlf_context { rdpContext context; - UwacDisplay *display; - UwacWindow *window; + UwacDisplay* display; + HANDLE displayHandle; + UwacWindow* window; BOOL waitingFrameDone; BOOL haveDamage; + + /* Channels */ + RdpeiClientContext* rdpei; + RdpgfxClientContext* gfx; + EncomspClientContext* encomsp; }; #endif /* __WLFREERDP_H */