diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 index fef711ec2..048417b7d --- a/.gitignore +++ b/.gitignore @@ -84,7 +84,7 @@ xcode *.dir Release Win32 -build/ +build*/ *.orig default.log @@ -93,3 +93,5 @@ default.log *.cbp *.txt.user + +*.autosave diff --git a/CMakeLists.txt b/CMakeLists.txt old mode 100644 new mode 100755 index ca6e154b0..edd2e0aa5 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,7 +80,7 @@ if(NOT CMAKE_BUILD_TYPE) endif() if(NOT DEFINED BUILD_SHARED_LIBS) - if(ANDROID OR IOS) + if(ANDROID OR IOS OR APPLE) set(BUILD_SHARED_LIBS OFF) else() set(BUILD_SHARED_LIBS ON) @@ -144,6 +144,8 @@ if(CMAKE_COMPILER_IS_GNUCC) if(CMAKE_BUILD_TYPE STREQUAL "Release") set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2") + else() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g") endif() if(WITH_SSE2) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2") @@ -194,6 +196,7 @@ check_include_files(inttypes.h HAVE_INTTYPES_H) check_include_files(sys/modem.h HAVE_SYS_MODEM_H) check_include_files(sys/filio.h HAVE_SYS_FILIO_H) check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H) +check_include_files(sys/select.h HAVE_SYS_SELECT_H) else() set(HAVE_FCNTL_H 1) set(HAVE_UNISTD_H 1) @@ -226,6 +229,14 @@ if(APPLE) if(WITH_CLANG) set(CMAKE_C_COMPILER "clang") endif() + + if (WITH_VERBOSE) + # Support for automatic reference counting requires non-fragile abi. + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v") + + # Tell the compiler where to look for the FreeRDP framework + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v") + endif() endif() # Android diff --git a/buildx/client/Mac/cli/Info.plist b/buildx/client/Mac/cli/Info.plist new file mode 100644 index 000000000..cb6976502 --- /dev/null +++ b/buildx/client/Mac/cli/Info.plist @@ -0,0 +1,34 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + + CFBundleIconFile + FreeRDP + CFBundleIdentifier + FreeRDP.Mac + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSMinimumSystemVersion + + NSHumanReadableCopyright + Copyright © 2012 __MyCompanyName__. All rights reserved. + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/channels/rdpei/client/rdpei_main.c b/channels/rdpei/client/rdpei_main.c index fb4d1db4a..854fd46ab 100644 --- a/channels/rdpei/client/rdpei_main.c +++ b/channels/rdpei/client/rdpei_main.c @@ -26,9 +26,12 @@ #include #include +#include +#include #include #include #include +#include #include @@ -92,9 +95,15 @@ struct _RDPEI_PLUGIN RDPINPUT_TOUCH_FRAME frame; RDPINPUT_CONTACT_DATA contacts[MAX_CONTACTS]; RDPINPUT_CONTACT_POINT* contactPoints; + + HANDLE mutex; + HANDLE event; + HANDLE thread; }; typedef struct _RDPEI_PLUGIN RDPEI_PLUGIN; +int rdpei_send_frame(RdpeiClientContext* context); + const char* RDPEI_EVENTID_STRINGS[] = { "", @@ -106,6 +115,67 @@ const char* RDPEI_EVENTID_STRINGS[] = "EVENTID_DISMISS_HOVERING_CONTACT" }; +int rdpei_add_frame(RdpeiClientContext* context) +{ + int i; + RDPINPUT_CONTACT_DATA* contact; + RDPEI_PLUGIN* rdpei = (RDPEI_PLUGIN*) context->handle; + + rdpei->frame.contactCount = 0; + + for (i = 0; i < rdpei->maxTouchContacts; i++) + { + contact = (RDPINPUT_CONTACT_DATA*) &(rdpei->contactPoints[i].data); + + if (rdpei->contactPoints[i].dirty) + { + CopyMemory(&(rdpei->contacts[rdpei->frame.contactCount]), contact, sizeof(RDPINPUT_CONTACT_DATA)); + rdpei->contactPoints[i].dirty = FALSE; + rdpei->frame.contactCount++; + } + else if (rdpei->contactPoints[i].active) + { + if (contact->contactFlags & CONTACT_FLAG_DOWN) + { + contact->contactFlags = CONTACT_FLAG_UPDATE; + contact->contactFlags |= CONTACT_FLAG_INRANGE; + contact->contactFlags |= CONTACT_FLAG_INCONTACT; + } + + CopyMemory(&(rdpei->contacts[rdpei->frame.contactCount]), contact, sizeof(RDPINPUT_CONTACT_DATA)); + rdpei->frame.contactCount++; + } + } + + return 1; +} + +static void* rdpei_schedule_thread(void* arg) +{ + DWORD status; + RDPEI_PLUGIN* rdpei = (RDPEI_PLUGIN*) arg; + RdpeiClientContext* context = (RdpeiClientContext*) rdpei->iface.pInterface; + + while (1) + { + status = WaitForSingleObject(rdpei->event, 20); + + WaitForSingleObject(rdpei->mutex, INFINITE); + + rdpei_add_frame(context); + + if (rdpei->frame.contactCount > 0) + rdpei_send_frame(context); + + if (status == WAIT_OBJECT_0) + ResetEvent(rdpei->event); + + ReleaseMutex(rdpei->mutex); + } + + return NULL; +} + int rdpei_send_pdu(RDPEI_CHANNEL_CALLBACK* callback, wStream* s, UINT16 eventId, UINT32 pduLength) { int status; @@ -147,6 +217,13 @@ int rdpei_send_cs_ready_pdu(RDPEI_CHANNEL_CALLBACK* callback) Stream_SealLength(s); + if (!rdpei->thread) + { + rdpei->mutex = CreateMutex(NULL, FALSE, NULL); + rdpei->event = CreateEvent(NULL, TRUE, FALSE, NULL); + rdpei->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) rdpei_schedule_thread, (void*) rdpei, 0, NULL); + } + status = rdpei_send_pdu(callback, s, EVENTID_CS_READY, pduLength); Stream_Free(s, TRUE); @@ -180,7 +257,12 @@ int rdpei_write_touch_frame(wStream* s, RDPINPUT_TOUCH_FRAME* frame) #endif rdpei_write_2byte_unsigned(s, frame->contactCount); /* contactCount (TWO_BYTE_UNSIGNED_INTEGER) */ - rdpei_write_8byte_unsigned(s, frame->frameOffset); /* frameOffset (EIGHT_BYTE_UNSIGNED_INTEGER) */ + + /** + * the time offset from the previous frame (in microseconds). + * If this is the first frame being transmitted then this field MUST be set to zero. + */ + rdpei_write_8byte_unsigned(s, frame->frameOffset * 1000); /* frameOffset (EIGHT_BYTE_UNSIGNED_INTEGER) */ Stream_EnsureRemainingCapacity(s, frame->contactCount * 32); @@ -248,8 +330,13 @@ int rdpei_send_touch_event_pdu(RDPEI_CHANNEL_CALLBACK* callback, RDPINPUT_TOUCH_ s = Stream_New(NULL, pduLength); Stream_Seek(s, RDPINPUT_HEADER_LENGTH); - rdpei_write_4byte_unsigned(s, frame->frameOffset); /* FOUR_BYTE_UNSIGNED_INTEGER */ - rdpei_write_2byte_unsigned(s, 1); /* TWO_BYTE_UNSIGNED_INTEGER */ + /** + * the time that has elapsed (in milliseconds) from when the oldest touch frame + * was generated to when it was encoded for transmission by the client. + */ + rdpei_write_4byte_unsigned(s, frame->frameOffset); /* encodeTime (FOUR_BYTE_UNSIGNED_INTEGER) */ + + rdpei_write_2byte_unsigned(s, 1); /* (frameCount) TWO_BYTE_UNSIGNED_INTEGER */ rdpei_write_touch_frame(s, frame); @@ -443,88 +530,157 @@ int rdpei_send_frame(RdpeiClientContext* context) int rdpei_add_contact(RdpeiClientContext* context, RDPINPUT_CONTACT_DATA* contact) { + RDPINPUT_CONTACT_POINT* contactPoint; RDPEI_PLUGIN* rdpei = (RDPEI_PLUGIN*) context->handle; - if (rdpei->frame.contactCount < MAX_CONTACTS) - { - CopyMemory(&(rdpei->contacts[rdpei->frame.contactCount]), contact, sizeof(RDPINPUT_CONTACT_DATA)); - rdpei->frame.contactCount++; - } + WaitForSingleObject(rdpei->mutex, INFINITE); - rdpei_send_frame(context); + contactPoint = (RDPINPUT_CONTACT_POINT*) &rdpei->contactPoints[contact->contactId]; + CopyMemory(&(contactPoint->data), contact, sizeof(RDPINPUT_CONTACT_DATA)); + contactPoint->dirty = TRUE; + + SetEvent(rdpei->event); + + ReleaseMutex(rdpei->mutex); return 1; } -int rdpei_contact_begin(RdpeiClientContext* context, int externalId) +int rdpei_touch_begin(RdpeiClientContext* context, int externalId, int x, int y) { int i; int contactId = -1; + RDPINPUT_CONTACT_DATA contact; + RDPINPUT_CONTACT_POINT* contactPoint = NULL; RDPEI_PLUGIN* rdpei = (RDPEI_PLUGIN*) context->handle; /* Create a new contact point in an empty slot */ for (i = 0; i < rdpei->maxTouchContacts; i++) { - if (!rdpei->contactPoints[i].flags) - { - rdpei->contactPoints[i].flags = 1; - rdpei->contactPoints[i].contactId = i; + contactPoint = (RDPINPUT_CONTACT_POINT*) &rdpei->contactPoints[i]; - if (!rdpei->contactPoints[i].externalId) - { - rdpei->contactPoints[i].externalId = externalId; - contactId = rdpei->contactPoints[i].contactId; - break; - } + if (!contactPoint->active) + { + contactPoint->contactId = i; + contactId = contactPoint->contactId; + contactPoint->externalId = externalId; + contactPoint->active = TRUE; + contactPoint->state = RDPINPUT_CONTACT_STATE_ENGAGED; + break; } } + if (contactId >= 0) + { + ZeroMemory(&contact, sizeof(RDPINPUT_CONTACT_DATA)); + + contactPoint->lastX = x; + contactPoint->lastY = y; + + contact.x = x; + contact.y = y; + contact.contactId = (UINT32) contactId; + + contact.contactFlags |= CONTACT_FLAG_DOWN; + contact.contactFlags |= CONTACT_FLAG_INRANGE; + contact.contactFlags |= CONTACT_FLAG_INCONTACT; + + context->AddContact(context, &contact); + } + return contactId; } -int rdpei_contact_update(RdpeiClientContext* context, int externalId) +int rdpei_touch_update(RdpeiClientContext* context, int externalId, int x, int y) { int i; int contactId = -1; + RDPINPUT_CONTACT_DATA contact; + RDPINPUT_CONTACT_POINT* contactPoint = NULL; RDPEI_PLUGIN* rdpei = (RDPEI_PLUGIN*) context->handle; for (i = 0; i < rdpei->maxTouchContacts; i++) { - if (!rdpei->contactPoints[i].flags) + contactPoint = (RDPINPUT_CONTACT_POINT*) &rdpei->contactPoints[i]; + + if (!contactPoint->active) continue; - if (rdpei->contactPoints[i].externalId == externalId) + if (contactPoint->externalId == externalId) { - contactId = rdpei->contactPoints[i].contactId; + contactId = contactPoint->contactId; break; } } + if (contactId >= 0) + { + ZeroMemory(&contact, sizeof(RDPINPUT_CONTACT_DATA)); + + contactPoint->lastX = x; + contactPoint->lastY = y; + + contact.x = x; + contact.y = y; + contact.contactId = (UINT32) contactId; + + contact.contactFlags |= CONTACT_FLAG_UPDATE; + contact.contactFlags |= CONTACT_FLAG_INRANGE; + contact.contactFlags |= CONTACT_FLAG_INCONTACT; + + context->AddContact(context, &contact); + } + return contactId; } -int rdpei_contact_end(RdpeiClientContext* context, int externalId) +int rdpei_touch_end(RdpeiClientContext* context, int externalId, int x, int y) { int i; int contactId = -1; + RDPINPUT_CONTACT_DATA contact; + RDPINPUT_CONTACT_POINT* contactPoint; RDPEI_PLUGIN* rdpei = (RDPEI_PLUGIN*) context->handle; for (i = 0; i < rdpei->maxTouchContacts; i++) { - if (!rdpei->contactPoints[i].flags) + contactPoint = (RDPINPUT_CONTACT_POINT*) &rdpei->contactPoints[i]; + + if (!contactPoint->active) continue; - if (rdpei->contactPoints[i].externalId == externalId) + if (contactPoint->externalId == externalId) { - contactId = rdpei->contactPoints[i].contactId; - rdpei->contactPoints[i].externalId = 0; - rdpei->contactPoints[i].flags = 0; - rdpei->contactPoints[i].contactId = 0; + contactId = contactPoint->contactId; break; } } + if (contactId >= 0) + { + ZeroMemory(&contact, sizeof(RDPINPUT_CONTACT_DATA)); + + if ((contactPoint->lastX != x) && (contactPoint->lastY != y)) + { + context->TouchUpdate(context, externalId, x, y); + } + + contact.x = x; + contact.y = y; + contact.contactId = (UINT32) contactId; + + contact.contactFlags |= CONTACT_FLAG_UP; + + context->AddContact(context, &contact); + + contactPoint->externalId = 0; + contactPoint->active = FALSE; + contactPoint->flags = 0; + contactPoint->contactId = 0; + contactPoint->state = RDPINPUT_CONTACT_STATE_OUT_OF_RANGE; + } + return contactId; } @@ -568,9 +724,9 @@ int DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) context->GetVersion = rdpei_get_version; context->AddContact = rdpei_add_contact; - context->ContactBegin = rdpei_contact_begin; - context->ContactUpdate = rdpei_contact_update; - context->ContactEnd = rdpei_contact_end; + context->TouchBegin = rdpei_touch_begin; + context->TouchUpdate = rdpei_touch_update; + context->TouchEnd = rdpei_touch_end; rdpei->iface.pInterface = (void*) context; diff --git a/channels/rdpei/client/rdpei_main.h b/channels/rdpei/client/rdpei_main.h index 8c0137ce4..c0d0d2d67 100644 --- a/channels/rdpei/client/rdpei_main.h +++ b/channels/rdpei/client/rdpei_main.h @@ -31,31 +31,70 @@ #include -#define RDPINPUT_HEADER_LENGTH 6 +#define RDPINPUT_HEADER_LENGTH 6 /* Protocol Version */ -#define RDPINPUT_PROTOCOL_V1 0x00010000 +#define RDPINPUT_PROTOCOL_V1 0x00010000 /* Client Ready Flags */ -#define READY_FLAGS_SHOW_TOUCH_VISUALS 0x00000001 -#define READY_FLAGS_DISABLE_TIMESTAMP_INJECTION 0x00000002 +#define READY_FLAGS_SHOW_TOUCH_VISUALS 0x00000001 +#define READY_FLAGS_DISABLE_TIMESTAMP_INJECTION 0x00000002 /* Input Event Ids */ -#define EVENTID_SC_READY 0x0001 -#define EVENTID_CS_READY 0x0002 -#define EVENTID_TOUCH 0x0003 -#define EVENTID_SUSPEND_TOUCH 0x0004 -#define EVENTID_RESUME_TOUCH 0x0005 -#define EVENTID_DISMISS_HOVERING_CONTACT 0x0006 +#define EVENTID_SC_READY 0x0001 +#define EVENTID_CS_READY 0x0002 +#define EVENTID_TOUCH 0x0003 +#define EVENTID_SUSPEND_TOUCH 0x0004 +#define EVENTID_RESUME_TOUCH 0x0005 +#define EVENTID_DISMISS_HOVERING_CONTACT 0x0006 + +#define RDPINPUT_CONTACT_STATE_INITIAL 0x0000 +#define RDPINPUT_CONTACT_STATE_ENGAGED 0x0001 +#define RDPINPUT_CONTACT_STATE_HOVERING 0x0002 +#define RDPINPUT_CONTACT_STATE_OUT_OF_RANGE 0x0003 + +/** + * Touch Contact State Transitions + * + * ENGAGED -> UPDATE | INRANGE | INCONTACT -> ENGAGED + * ENGAGED -> UP | INRANGE -> HOVERING + * ENGAGED -> UP -> OUT_OF_RANGE + * ENGAGED -> UP | CANCELED -> OUT_OF_RANGE + * + * HOVERING -> UPDATE | INRANGE -> HOVERING + * HOVERING -> DOWN | INRANGE | INCONTACT -> ENGAGED + * HOVERING -> UPDATE -> OUT_OF_RANGE + * HOVERING -> UPDATE | CANCELED -> OUT_OF_RANGE + * + * OUT_OF_RANGE -> DOWN | INRANGE | INCONTACT -> ENGAGED + * OUT_OF_RANGE -> UPDATE | INRANGE -> HOVERING + * + * When a contact is in the "hovering" or "engaged" state, it is referred to as being "active". + * "Hovering" contacts are in range of the digitizer, while "engaged" contacts are in range of + * the digitizer and in contact with the digitizer surface. MS-RDPEI remotes only active contacts + * and contacts that are transitioning to the "out of range" state; see section 2.2.3.3.1.1 for + * an enumeration of valid state flags combinations. + * + * When transitioning from the "engaged" state to the "hovering" state, or from the "engaged" + * state to the "out of range" state, the contact position cannot change; it is only allowed + * to change after the transition has taken place. + * + */ struct _RDPINPUT_CONTACT_POINT { + int lastX; + int lastY; + BOOL dirty; + BOOL active; + UINT32 state; UINT32 flags; UINT32 contactId; int externalId; + RDPINPUT_CONTACT_DATA data; }; typedef struct _RDPINPUT_CONTACT_POINT RDPINPUT_CONTACT_POINT; diff --git a/client/.gitignore b/client/.gitignore index 3b702c283..86106bc3c 100644 --- a/client/.gitignore +++ b/client/.gitignore @@ -1,2 +1,4 @@ WaykClient + +DotNetClient \ No newline at end of file diff --git a/client/Android/FreeRDPCore/jni/android_freerdp.c b/client/Android/FreeRDPCore/jni/android_freerdp.c index 2d8ea7f8b..632ca82c2 100644 --- a/client/Android/FreeRDPCore/jni/android_freerdp.c +++ b/client/Android/FreeRDPCore/jni/android_freerdp.c @@ -40,10 +40,11 @@ struct thread_data }; -void android_context_new(freerdp* instance, rdpContext* context) +int android_context_new(freerdp* instance, rdpContext* context) { context->channels = freerdp_channels_new(); - android_event_queue_init(instance); + android_event_queue_init(instance); + return 0; } void android_context_free(freerdp* instance, rdpContext* context) @@ -388,7 +389,7 @@ JNIEXPORT jint JNICALL jni_freerdp_new(JNIEnv *env, jclass cls) // create context - instance->context_size = sizeof(androidContext); + instance->ContextSize = sizeof(androidContext); instance->ContextNew = android_context_new; instance->ContextFree = android_context_free; freerdp_context_new(instance); diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index ee294378b..2543bb028 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -20,7 +20,7 @@ add_subdirectory(common) if(WIN32) - add_subdirectory(Windows) + add_subdirectory(Windows) else() if(WITH_SAMPLE) add_subdirectory(Sample) @@ -55,3 +55,6 @@ if(WITH_WAYK) add_subdirectory(WaykClient) endif() +if (WITH_DOTNET) + add_subdirectory(DotNetClient) +endif() \ No newline at end of file diff --git a/client/DirectFB/dfreerdp.c b/client/DirectFB/dfreerdp.c index e2b88a786..5ea5e5ee3 100644 --- a/client/DirectFB/dfreerdp.c +++ b/client/DirectFB/dfreerdp.c @@ -45,9 +45,10 @@ struct thread_data freerdp* instance; }; -void df_context_new(freerdp* instance, rdpContext* context) +int df_context_new(freerdp* instance, rdpContext* context) { context->channels = freerdp_channels_new(); + return 0; } void df_context_free(freerdp* instance, rdpContext* context) @@ -450,7 +451,7 @@ int main(int argc, char* argv[]) instance->VerifyCertificate = df_verify_certificate; instance->ReceiveChannelData = df_receive_channel_data; - instance->context_size = sizeof(dfContext); + instance->ContextSize = sizeof(dfContext); instance->ContextNew = df_context_new; instance->ContextFree = df_context_free; freerdp_context_new(instance); diff --git a/client/Mac/CMakeLists.txt b/client/Mac/CMakeLists.txt old mode 100644 new mode 100755 index fb0c85d3a..78dfca32b --- a/client/Mac/CMakeLists.txt +++ b/client/Mac/CMakeLists.txt @@ -1,10 +1,7 @@ - project(MacFreeRDP-library) -# add directory for App -add_subdirectory(cli) - set(MODULE_NAME "MacFreeRDP-library") +set(MODULE_OUTPUT_NAME "MacFreeRDP") set(MODULE_PREFIX "FREERDP_CLIENT_MAC-LIB") # Import frameworks @@ -15,11 +12,11 @@ find_library(APPKIT_LIBRARY AppKit) mark_as_advanced(COCOA_LIBRARY FOUNDATION_LIBRARY APPKIT_LIBRARY) set(EXTRA_LIBS ${COCOA_LIBRARY} ${FOUNDATION_LIBRARY} ${APPKIT_LIBRARY}) -set(MACOSX_BUNDLE_INFO_STRING "MacFreeRDP-library") +set(MACOSX_BUNDLE_INFO_STRING "${MODULE_OUTPUT_NAME}") set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.freerdp.mac") set(MACOSX_BUNDLE_BUNDLE_IDENTIFIER "FreeRDP-library.Mac") set(MACOSX_BUNDLE_LONG_VERSION_STRING "MacFreeRDP library Version 1.1") -set(MACOSX_BUNDLE_BUNDLE_NAME "MacFreeRDP-library") +set(MACOSX_BUNDLE_BUNDLE_NAME "${MODULE_OUTPUT_NAME}") set(MACOSX_BUNDLE_SHORT_VERSION_STRING 1.1.0) set(MACOSX_BUNDLE_BUNDLE_VERSION 1.1.0) set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2013. All Rights Reserved.") @@ -29,20 +26,27 @@ set(${MODULE_NAME}_RESOURCES "en.lproj/InfoPlist.strings") # OS X Interface Builder files file(GLOB ${MODULE_NAME}_XIBS *.xib) +# source files +file(GLOB ${MODULE_NAME}_SRC *.c *.m) + +# header files +file(GLOB ${MODULE_NAME}_HEADERS *.h) + # Include XIB file in Xcode resources. if("${CMAKE_GENERATOR}" MATCHES "Xcode") message(STATUS "Adding Xcode XIB resources for ${MODULE_NAME}") set(${MODULE_NAME}_RESOURCES ${${MODULE_NAME}_RESOURCES} ${${MODULE_NAME}_XIBS}) -endif("${CMAKE_GENERATOR}" MATCHES "Xcode") +endif() add_library(${MODULE_NAME} SHARED - MRDPView.h - MRDPView.m - MRDPCursor.m - PasswordDialog.m + ../common/client.c + ${${MODULE_NAME}_SRC} + ${${MODULE_NAME}_HEADERS} ${${MODULE_NAME}_RESOURCES}) +set_target_properties(${MODULE_NAME} PROPERTIES OUTPUT_NAME "${MODULE_OUTPUT_NAME}") + # configures the framework to always be looked for in the application bundle in the Frameworks sub-folder. SET_TARGET_PROPERTIES(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_INSTALL_PATH @executable_path/../Frameworks/) @@ -63,7 +67,6 @@ set_target_properties(${MODULE_NAME} PROPERTIES FRAMEWORK_VERSION 1.1.0 MACOSX_FRAMEWORK_SHORT_VERSION_STRING 1.1.0 MACOSX_FRAMEWORK_BUNDLE_VERSION 1.1.0 - PUBLIC_HEADER "MRDPView.h" INSTALL_NAME_DIR "@executable_path/../../Frameworks" MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_BINARY_DIR}/Info.plist BUILD_WITH_INSTALL_RPATH 1) @@ -95,37 +98,38 @@ endforeach() set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Client/Mac") -# Add a post-build event to copy the dependent libraries in the framework bundle -# Call install_name_tool to reassign the library install name -foreach(LIB ${DEPENDENCIES}) - # message("adding post-build dependency: ${LIB}") - add_custom_command(TARGET ${MODULE_NAME} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy - "$" - "${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION)/${MODULE_NAME}.framework/Contents/$" - COMMENT "Copying ${LIB} to output directory" - COMMAND install_name_tool -change "$" "@executable_path/../Frameworks/${MODULE_NAME}.framework/Contents/$" "${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION)/${MODULE_NAME}.framework/${MODULE_NAME}" - COMMENT Setting install name for ${LIB} - COMMAND "${CMAKE_COMMAND}" -E echo install_name_tool -change "$" "@executable_path/../Frameworks/${MODULE_NAME}.framework/Contents/$" "${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION)/${MODULE_NAME}.framework/${MODULE_NAME}" - ) -endforeach() +if (${BUILD_SHARED_LIBS}) + # Add a post-build event to copy the dependent libraries in the framework bundle + # Call install_name_tool to reassign the library install name + foreach(LIB ${DEPENDENCIES}) + # message("adding post-build dependency: ${LIB}") + add_custom_command(TARGET ${MODULE_NAME} POST_BUILD + COMMAND "${CMAKE_COMMAND}" -E copy + "$" + "${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION)/${MODULE_NAME}.framework/Contents/$" + COMMENT "Copying ${LIB} to output directory" + COMMAND install_name_tool -change "$" + "@executable_path/../Frameworks/${MODULE_NAME}.framework/Contents/$" + "${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION)/${MODULE_NAME}.framework/${MODULE_NAME}" + COMMENT Setting install name for ${LIB} + COMMAND "${CMAKE_COMMAND}" -E echo install_name_tool -change "$" + "@executable_path/../Frameworks/${MODULE_NAME}.framework/Contents/$" + "${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION)/${MODULE_NAME}.framework/${MODULE_NAME}") + endforeach() + # Call install_name_tool to reassign the library install names in dependent libraries + foreach(DEST ${DEPENDENCIES}) + foreach(LIB ${DEPENDENCIES}) + # message("adding post-build dependency: ${LIB}") + add_custom_command(TARGET ${MODULE_NAME} POST_BUILD + COMMAND install_name_tool -change "$" + "@executable_path/../Frameworks/${MODULE_NAME}.framework/Contents/$" + "${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION)/${MODULE_NAME}.framework/Contents/$" + COMMENT Setting install name for ${LIB} in module ${DEST}) + endforeach() + endforeach() -# Call install_name_tool to reassign the library install names in dependent libraries -foreach(DEST ${DEPENDENCIES}) -foreach(LIB ${DEPENDENCIES}) - # message("adding post-build dependency: ${LIB}") - add_custom_command(TARGET ${MODULE_NAME} POST_BUILD - COMMAND install_name_tool -change "$" "@executable_path/../Frameworks/${MODULE_NAME}.framework/Contents/$" "${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION)/${MODULE_NAME}.framework/Contents/$" - COMMENT Setting install name for ${LIB} in module ${DEST} -) - -# COMMAND "${CMAKE_COMMAND}" -E echo install_name_tool -change "$" #"@executable_path/../Frameworks/${MODULE_NAME}.framework/Contents/$" #"${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION)/${MODULE_NAME}.framework/Contents/$" -# ) - -endforeach() -endforeach() - +endif() # Add post-build NIB file generation in unix makefiles. XCode handles this implicitly. if("${CMAKE_GENERATOR}" MATCHES "Unix Makefiles") @@ -135,12 +139,12 @@ if("${CMAKE_GENERATOR}" MATCHES "Unix Makefiles") # skip generation of this project find_program(IBTOOL ibtool HINTS "/usr/bin" "${OSX_DEVELOPER_ROOT}/usr/bin") if (${IBTOOL} STREQUAL "IBTOOL-NOTFOUND") - message(SEND_ERROR "ibtool can not be found and is needed to compile the .xib files. It should have been installed with - the Apple developer tools. The default system paths were searched in addition to ${OSX_DEVELOPER_ROOT}/usr/bin") + message(SEND_ERROR "ibtool can not be found and is needed to compile the .xib files. It should have been installed with + the Apple developer tools. The default system paths were searched in addition to ${OSX_DEVELOPER_ROOT}/usr/bin") endif() # Make sure the 'Resources' Directory is correctly created before we build - add_custom_command (TARGET ${MODULE_NAME} PRE_BUILD + add_custom_command(TARGET ${MODULE_NAME} PRE_BUILD COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION)/${MODULE_NAME}.app/Contents/Resources) # Compile the .xib files using the 'ibtool' program with the destination being the app package @@ -152,5 +156,19 @@ if("${CMAKE_GENERATOR}" MATCHES "Unix Makefiles") --compile ${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION)/${MODULE_NAME}.app/Contents/Resources/${XIB_WE}.nib ${xib} COMMENT "Compiling ${xib}") endforeach() - endif() + +# Copy the public header files into the framework +foreach(HEADER ${${MODULE_NAME}_HEADERS}) + # message("adding post-build dependency: ${LIB}") + add_custom_command(TARGET ${MODULE_NAME} POST_BUILD + COMMAND ditto ${HEADER} ${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION)/${MODULE_NAME}.framework/Headers/ + COMMENT Copying public header files to ${MODULE_NAME}) +endforeach() + +# Copy the FreeRDP header files into the framework +add_custom_command(TARGET ${MODULE_NAME} POST_BUILD + COMMAND ditto ${CMAKE_SOURCE_DIR}/include/freerdp ${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION)/${MODULE_NAME}.framework/Headers/freerdp + COMMENT Copying FreeRDP header files to ${MODULE_NAME}) + +add_subdirectory(cli) diff --git a/client/Mac/MRDPView.h b/client/Mac/MRDPView.h old mode 100644 new mode 100755 index 96b6f2bd0..2cc67c2d4 --- a/client/Mac/MRDPView.h +++ b/client/Mac/MRDPView.h @@ -19,10 +19,6 @@ #import -#ifdef HAVE_RAIL -#import "MRDPWindow.h" -#endif - /* #import "freerdp/freerdp.h" #import "freerdp/types.h" @@ -36,37 +32,36 @@ #import "freerdp/rail/rail.h" #import "freerdp/rail.h" #import "freerdp/utils/rail.h" + +#import "mf_interface.h" */ - +#import "mfreerdp.h" +#import "mf_client.h" @interface MRDPView : NSView { - CFRunLoopSourceRef run_loop_src; CFRunLoopSourceRef run_loop_src_channels; + CFRunLoopSourceRef run_loop_src_update; + CFRunLoopSourceRef run_loop_src_input; + NSBitmapImageRep* bmiRep; NSMutableArray* cursors; NSMutableArray* windows; NSTimer* pasteboard_timer; NSRect prevWinPosition; int titleBarHeight; - void* rdp_instance; - void* rdp_context; + freerdp* instance; + rdpContext* context; CGContextRef bitmap_context; char* pixel_data; int width; int height; int argc; char** argv; - -#ifdef HAVE_RAIL - // RemoteApp - MRDPWindow* currentWindow; -#endif NSPoint savedDragLocation; BOOL mouseInClientArea; - BOOL isRemoteApp; BOOL firstCreateWindow; BOOL isMoveSizeInProgress; BOOL skipResizeOnce; @@ -85,7 +80,6 @@ int kdcapslock; @public - NSWindow* ourMainWindow; NSPasteboard* pasteboard_rd; /* for reading from clipboard */ NSPasteboard* pasteboard_wr; /* for writing to clipboard */ int pasteboard_changecount; @@ -93,10 +87,9 @@ int is_connected; } -- (int) rdpConnect; +- (int) rdpStart :(rdpContext*) rdp_context; - (void) rdpConnectError; - (void) rdpRemoteAppError; -- (void) saveStateInfo :(void *) instance :(void *) context; - (void) onPasteboardTimerFired :(NSTimer *) timer; - (void) releaseResources; - (void) setViewSize : (int) width : (int) height; diff --git a/client/Mac/MRDPView.m b/client/Mac/MRDPView.m index 8548f01dd..fe516b543 100644 --- a/client/Mac/MRDPView.m +++ b/client/Mac/MRDPView.m @@ -42,6 +42,8 @@ * - */ +#include "mf_client.h" +#import "mfreerdp.h" #import "MRDPView.h" #import "MRDPCursor.h" #import "PasswordDialog.h" @@ -60,17 +62,6 @@ #import "freerdp/client/cliprdr.h" #import "freerdp/client/file.h" #import "freerdp/client/cmdline.h" -#import "freerdp/rail/rail.h" -#import "freerdp/rail.h" -#import "freerdp/utils/rail.h" - -#ifdef HAVE_RAIL -#import "MRDPWindow.h" -#endif - -// RAIL_TODO DELETE WHEN DONE TESTING -#define MRDP_DRAW_INDIVIDUAL_RECTS - /****************************************** @@ -87,19 +78,20 @@ void mf_Pointer_SetDefault(rdpContext* context); BOOL mac_pre_connect(freerdp* instance); BOOL mac_post_connect(freerdp* instance); BOOL mac_authenticate(freerdp* instance, char** username, char** password, char** domain); -void mac_context_new(freerdp* instance, rdpContext* context); -void mac_context_free(freerdp* instance, rdpContext* context); void mac_set_bounds(rdpContext* context, rdpBounds* bounds); void mac_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmap); void mac_begin_paint(rdpContext* context); void mac_end_paint(rdpContext* context); void mac_save_state_info(freerdp* instance, rdpContext* context); -void skt_activity_cb(CFSocketRef s, CFSocketCallBackType callbackType, CFDataRef address, const void* data, void* info); -void channel_activity_cb(CFSocketRef s, CFSocketCallBackType callbackType, CFDataRef address, const void* data, void* info); -int register_fds(int* fds, int count, void* instance); +static void update_activity_cb(CFFileDescriptorRef fdref, CFOptionFlags callBackTypes, void *info); +static void input_activity_cb(CFFileDescriptorRef fdref, CFOptionFlags callBackTypes, void *info); +static void channel_activity_cb(CFFileDescriptorRef fdref, CFOptionFlags callBackTypes, void *info); +int register_update_fds(freerdp* instance); +int register_input_fds(freerdp* instance); int invoke_draw_rect(rdpContext* context); int process_plugin_args(rdpSettings* settings, const char* name, RDP_PLUGIN_DATA* plugin_data, void* user_data); int receive_channel_data(freerdp* instance, int chan_id, BYTE* data, int size, int flags, int total_size); + void process_cliprdr_event(freerdp* instance, wMessage* event); void cliprdr_process_cb_format_list_event(freerdp* instance, RDP_CB_FORMAT_LIST_EVENT* event); void cliprdr_send_data_request(freerdp* instance, UINT32 format); @@ -107,34 +99,7 @@ void cliprdr_process_cb_monitor_ready_event(freerdp* inst); void cliprdr_process_cb_data_response_event(freerdp* instance, RDP_CB_DATA_RESPONSE_EVENT* event); void cliprdr_process_text(freerdp* instance, BYTE* data, int len); void cliprdr_send_supported_format_list(freerdp* instance); -int register_channel_fds(int* fds, int count, void* instance); - -void mac_process_rail_event(freerdp* instance, wMessage* event); -void mac_rail_register_callbacks(freerdp* instance, rdpRail* rail); -void mac_rail_CreateWindow(rdpRail* rail, rdpWindow* window); -void mac_rail_MoveWindow(rdpRail* rail, rdpWindow* window); -void mac_rail_ShowWindow(rdpRail* rail, rdpWindow* window, BYTE state); -void mac_rail_SetWindowText(rdpRail* rail, rdpWindow* window); -void mac_rail_SetWindowIcon(rdpRail* rail, rdpWindow* window, rdpIcon* icon); -void mac_rail_SetWindowRects(rdpRail* rail, rdpWindow* window); -void mac_rail_SetWindowVisibilityRects(rdpRail* rail, rdpWindow* window); -void mac_rail_DestroyWindow(rdpRail* rail, rdpWindow* window); -void mac_process_rail_get_sysparams_event(rdpChannels* channels, wMessage* event); -void mac_send_rail_client_event(rdpChannels* channels, UINT16 event_type, void* param); -void mac_on_free_rail_client_event(wMessage* event); -void mac_process_rail_server_sysparam_event(rdpChannels* channels, wMessage* event); -void mac_process_rail_exec_result_event(rdpChannels* channels, wMessage* event); -void mac_rail_enable_remoteapp_mode(void); -void mac_process_rail_server_minmaxinfo_event(rdpChannels* channels, wMessage* event); -void mac_process_rail_server_localmovesize_event(freerdp* instance, wMessage* event); -void apple_center_window(NSRect* r); -void apple_to_windowMove(NSRect* r, RAIL_WINDOW_MOVE_ORDER * windowMove); - -struct mac_context -{ - // *must* have this - do not delete - rdpContext _p; -}; +int register_channel_fds(int* fds, int count, freerdp* instance); struct cursor { @@ -153,63 +118,63 @@ struct rgba_data char alpha; }; - - - - - @implementation MRDPView -MRDPView *g_mrdpview; - @synthesize is_connected; -const char* error_code_names[] = -{ - "RAIL_EXEC_S_OK", - "RAIL_EXEC_E_HOOK_NOT_LOADED", - "RAIL_EXEC_E_DECODE_FAILED", - "RAIL_EXEC_E_NOT_IN_ALLOWLIST", - "RAIL_EXEC_E_FILE_NOT_FOUND", - "RAIL_EXEC_E_FAIL", - "RAIL_EXEC_E_SESSION_LOCKED" -}; - -//int rdp_connect() -- (int) rdpConnect +- (int) rdpStart:(rdpContext*) rdp_context { int status; - freerdp* instance; + mfContext* mfc; + rdpSettings* settings; + EmbedWindowEventArgs e; + + context = rdp_context; + mfc = (mfContext*) rdp_context; + instance = context->instance; + settings = context->settings; + mfc->view = self; + + EventArgsInit(&e, "mfreerdp"); + e.embed = TRUE; + e.handle = (void*) self; + PubSub_OnEmbedWindow(context->pubSub, context, &e); + + context->instance->PreConnect = mac_pre_connect; + context->instance->PostConnect = mac_post_connect; + context->instance->ReceiveChannelData = mac_receive_channel_data; + context->instance->Authenticate = mac_authenticate; + + // TODO + // instance->Authenticate = mf_authenticate; + // instance->VerifyCertificate = mf_verify_certificate; + // instance->LogonErrorInfo = mf_logon_error_info; + + status = freerdp_connect(context->instance); - freerdp_channels_global_init(); - - instance = freerdp_new(); - instance->PreConnect = mac_pre_connect; - instance->PostConnect = mac_post_connect; - instance->context_size = sizeof(struct mac_context); - instance->ContextNew = mac_context_new; - instance->ContextFree = mac_context_free; - instance->ReceiveChannelData = receive_channel_data; - instance->Authenticate = mac_authenticate; - freerdp_context_new(instance); - - status = freerdp_connect(instance); - - if (status) + if (!status) { - freerdp_check_fds(instance); - [g_mrdpview setIs_connected:1]; - return 0; + [self setIs_connected:0]; + [self rdpConnectError]; + return 1; } - - [g_mrdpview setIs_connected:0]; - [g_mrdpview rdpConnectError]; - - return -1; + + /* register update message queue with the RunLoop */ + register_update_fds(context->instance); + + /* register update message queue with the RunLoop */ + register_input_fds(context->instance); + + /* register channel events with the RunLoop */ + register_channels_fds(context->instance); + + freerdp_check_fds(context->instance); + + [self setIs_connected:1]; + + return 0; } - - /************************************************************************ methods we override ************************************************************************/ @@ -234,10 +199,10 @@ const char* error_code_names[] = * called when MRDPView has been successfully created from the NIB ***********************************************************************/ +//TODO - Expose this code as a public method, because awakeFromNib +// won't be called if the view is created dynamically - (void) awakeFromNib { - g_mrdpview = self; - // store our window dimensions width = [self frame].size.width; height = [self frame].size.height; @@ -248,33 +213,12 @@ const char* error_code_names[] = cursors = [[NSMutableArray alloc] initWithCapacity:10]; -#ifdef HAVE_RAIL - firstCreateWindow = TRUE; - skipResizeOnce = YES; - windows = [[NSMutableArray alloc] initWithCapacity:10]; - -#endif - // setup a mouse tracking area NSTrackingArea * trackingArea = [[NSTrackingArea alloc] initWithRect:[self visibleRect] options:NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingCursorUpdate | NSTrackingEnabledDuringMouseDrag | NSTrackingActiveWhenFirstResponder owner:self userInfo:nil]; - //[self addTrackingArea:trackingArea]; - - // windows in RemoteApp (RAIL) mode cannot have title bars - NSArray * args = [[NSProcessInfo processInfo] arguments]; - for (NSString * str in args) - { - if ([str compare:@"--app"] == NSOrderedSame) { - isRemoteApp = TRUE; - break; - } - } - - if (!isRemoteApp) - [self addTrackingArea:trackingArea]; + [self addTrackingArea:trackingArea]; mouseInClientArea = YES; - } /** ********************************************************************* @@ -313,7 +257,7 @@ const char* error_code_names[] = y = height - y; // send mouse motion event to RDP server - ((freerdp*)rdp_instance)->input->MouseEvent(((freerdp*)rdp_instance)->input, PTR_FLAGS_MOVE, x, y); + instance->input->MouseEvent(instance->input, PTR_FLAGS_MOVE, x, y); } /** ********************************************************************* @@ -333,7 +277,7 @@ const char* error_code_names[] = y = height - y; - ((freerdp*)rdp_instance)->input->MouseEvent(((freerdp*)rdp_instance)->input, PTR_FLAGS_DOWN | PTR_FLAGS_BUTTON1, x, y); + instance->input->MouseEvent(instance->input, PTR_FLAGS_DOWN | PTR_FLAGS_BUTTON1, x, y); } /** ********************************************************************* @@ -353,7 +297,7 @@ const char* error_code_names[] = y = height - y; - ((freerdp*)rdp_instance)->input->MouseEvent(((freerdp*)rdp_instance)->input, PTR_FLAGS_BUTTON1, x, y); + instance->input->MouseEvent(instance->input, PTR_FLAGS_BUTTON1, x, y); } /** ********************************************************************* @@ -373,7 +317,7 @@ const char* error_code_names[] = y = height - y; - ((freerdp*)rdp_instance)->input->MouseEvent(((freerdp*)rdp_instance)->input, PTR_FLAGS_DOWN | PTR_FLAGS_BUTTON2, x, y); + instance->input->MouseEvent(instance->input, PTR_FLAGS_DOWN | PTR_FLAGS_BUTTON2, x, y); } /** ********************************************************************* @@ -393,7 +337,7 @@ const char* error_code_names[] = y = height - y; - ((freerdp*)rdp_instance)->input->MouseEvent(((freerdp*)rdp_instance)->input, PTR_FLAGS_BUTTON2, x, y); + instance->input->MouseEvent(instance->input, PTR_FLAGS_BUTTON2, x, y); } /** ********************************************************************* @@ -413,7 +357,7 @@ const char* error_code_names[] = y = height - y; - ((freerdp*)rdp_instance)->input->MouseEvent(((freerdp*)rdp_instance)->input, PTR_FLAGS_DOWN | PTR_FLAGS_BUTTON3, x, y); + instance->input->MouseEvent(instance->input, PTR_FLAGS_DOWN | PTR_FLAGS_BUTTON3, x, y); } /** ********************************************************************* @@ -433,7 +377,7 @@ const char* error_code_names[] = y = height - y; - ((freerdp*)rdp_instance)->input->MouseEvent(((freerdp*)rdp_instance)->input, PTR_FLAGS_BUTTON3, x, y); + instance->input->MouseEvent(instance->input, PTR_FLAGS_BUTTON3, x, y); } - (void) scrollWheel:(NSEvent *)event @@ -461,7 +405,7 @@ const char* error_code_names[] = x += (int) [event deltaX]; y += (int) [event deltaY]; - ((freerdp*)rdp_instance)->input->MouseEvent(((freerdp*)rdp_instance)->input, flags, x, y); + instance->input->MouseEvent(instance->input, flags, x, y); } /** ********************************************************************* @@ -480,32 +424,10 @@ const char* error_code_names[] = int x = (int) loc.x; int y = (int) loc.y; -#ifdef HAVE_RAIL - // RAIL_TODO delete this if not reqd - if ((isRemoteApp) && (isMoveSizeInProgress)) - { - if (saveInitialDragLoc) - { - saveInitialDragLoc = NO; - savedDragLocation.x = x; - savedDragLocation.y = y; - return; - } - - int newX = x - savedDragLocation.x; - int newY = y - savedDragLocation.y; - - NSRect r = [[self window] frame]; - r.origin.x += newX; - r.origin.y += newY; - [[g_mrdpview window] setFrame:r display:YES]; - } -#endif - y = height - y; // send mouse motion event to RDP server - ((freerdp*)rdp_instance)->input->MouseEvent(((freerdp*)rdp_instance)->input, PTR_FLAGS_MOVE, x, y); + instance->input->MouseEvent(instance->input, PTR_FLAGS_MOVE, x, y); } /** ********************************************************************* @@ -528,7 +450,7 @@ const char* error_code_names[] = scancode = GetVirtualScanCodeFromVirtualKeyCode(vkcode, 4); extended = (scancode & KBDEXT) ? KBDEXT : 0; - ((freerdp*)rdp_instance)->input->KeyboardEvent(((freerdp*)rdp_instance)->input, extended | KBD_FLAGS_DOWN, scancode & 0xFF); + instance->input->KeyboardEvent(instance->input, extended | KBD_FLAGS_DOWN, scancode & 0xFF); } /** ********************************************************************* @@ -551,7 +473,7 @@ const char* error_code_names[] = scancode = GetVirtualScanCodeFromVirtualKeyCode(vkcode, 4); extended = (scancode & KBDEXT) ? KBDEXT : 0; - ((freerdp*)rdp_instance)->input->KeyboardEvent(((freerdp*)rdp_instance)->input, extended | KBD_FLAGS_RELEASE, scancode & 0xFF); + instance->input->KeyboardEvent(instance->input, extended | KBD_FLAGS_RELEASE, scancode & 0xFF); } /** ********************************************************************* @@ -577,96 +499,96 @@ const char* error_code_names[] = // left shift if ((kdlshift == 0) && ((mf & 2) != 0)) { // left shift went down - ((freerdp*)rdp_instance)->input->KeyboardEvent(((freerdp*)rdp_instance)->input, KBD_FLAGS_DOWN, 0x2a); + instance->input->KeyboardEvent(instance->input, KBD_FLAGS_DOWN, 0x2a); kdlshift = 1; } if ((kdlshift != 0) && ((mf & 2) == 0)) { // left shift went up - ((freerdp*)rdp_instance)->input->KeyboardEvent(((freerdp*)rdp_instance)->input, KBD_FLAGS_RELEASE, 0x2a); + instance->input->KeyboardEvent(instance->input, KBD_FLAGS_RELEASE, 0x2a); kdlshift = 0; } // right shift if ((kdrshift == 0) && ((mf & 4) != 0)) { // right shift went down - ((freerdp*)rdp_instance)->input->KeyboardEvent(((freerdp*)rdp_instance)->input, KBD_FLAGS_DOWN, 0x36); + instance->input->KeyboardEvent(instance->input, KBD_FLAGS_DOWN, 0x36); kdrshift = 1; } if ((kdrshift != 0) && ((mf & 4) == 0)) { // right shift went up - ((freerdp*)rdp_instance)->input->KeyboardEvent(((freerdp*)rdp_instance)->input, KBD_FLAGS_RELEASE, 0x36); + instance->input->KeyboardEvent(instance->input, KBD_FLAGS_RELEASE, 0x36); kdrshift = 0; } // left ctrl if ((kdlctrl == 0) && ((mf & 1) != 0)) { // left ctrl went down - ((freerdp*)rdp_instance)->input->KeyboardEvent(((freerdp*)rdp_instance)->input, KBD_FLAGS_DOWN, 0x1d); + instance->input->KeyboardEvent(instance->input, KBD_FLAGS_DOWN, 0x1d); kdlctrl = 1; } if ((kdlctrl != 0) && ((mf & 1) == 0)) { // left ctrl went up - ((freerdp*)rdp_instance)->input->KeyboardEvent(((freerdp*)rdp_instance)->input, KBD_FLAGS_RELEASE, 0x1d); + instance->input->KeyboardEvent(instance->input, KBD_FLAGS_RELEASE, 0x1d); kdlctrl = 0; } // right ctrl if ((kdrctrl == 0) && ((mf & 0x2000) != 0)) { // right ctrl went down - ((freerdp*)rdp_instance)->input->KeyboardEvent(((freerdp*)rdp_instance)->input, 1 | KBD_FLAGS_DOWN, 0x1d); + instance->input->KeyboardEvent(instance->input, 1 | KBD_FLAGS_DOWN, 0x1d); kdrctrl = 1; } if ((kdrctrl != 0) && ((mf & 0x2000) == 0)) { // right ctrl went up - ((freerdp*)rdp_instance)->input->KeyboardEvent(((freerdp*)rdp_instance)->input, 1 | KBD_FLAGS_RELEASE, 0x1d); + instance->input->KeyboardEvent(instance->input, 1 | KBD_FLAGS_RELEASE, 0x1d); kdrctrl = 0; } // left alt if ((kdlalt == 0) && ((mf & 0x20) != 0)) { // left alt went down - ((freerdp*)rdp_instance)->input->KeyboardEvent(((freerdp*)rdp_instance)->input, KBD_FLAGS_DOWN, 0x38); + instance->input->KeyboardEvent(instance->input, KBD_FLAGS_DOWN, 0x38); kdlalt = 1; } if ((kdlalt != 0) && ((mf & 0x20) == 0)) { // left alt went up - ((freerdp*)rdp_instance)->input->KeyboardEvent(((freerdp*)rdp_instance)->input, KBD_FLAGS_RELEASE, 0x38); + instance->input->KeyboardEvent(instance->input, KBD_FLAGS_RELEASE, 0x38); kdlalt = 0; } // right alt if ((kdralt == 0) && ((mf & 0x40) != 0)) { // right alt went down - ((freerdp*)rdp_instance)->input->KeyboardEvent(((freerdp*)rdp_instance)->input, 1 | KBD_FLAGS_DOWN, 0x38); + instance->input->KeyboardEvent(instance->input, 1 | KBD_FLAGS_DOWN, 0x38); kdralt = 1; } if ((kdralt != 0) && ((mf & 0x40) == 0)) { // right alt went up - ((freerdp*)rdp_instance)->input->KeyboardEvent(((freerdp*)rdp_instance)->input, 1 | KBD_FLAGS_RELEASE, 0x38); + instance->input->KeyboardEvent(instance->input, 1 | KBD_FLAGS_RELEASE, 0x38); kdralt = 0; } // left meta if ((kdlmeta == 0) && ((mf & 0x08) != 0)) { // left meta went down - ((freerdp*)rdp_instance)->input->KeyboardEvent(((freerdp*)rdp_instance)->input, 1 | KBD_FLAGS_DOWN, 0x5b); + instance->input->KeyboardEvent(instance->input, 1 | KBD_FLAGS_DOWN, 0x5b); kdlmeta = 1; } if ((kdlmeta != 0) && ((mf & 0x08) == 0)) { // left meta went up - ((freerdp*)rdp_instance)->input->KeyboardEvent(((freerdp*)rdp_instance)->input, 1 | KBD_FLAGS_RELEASE, 0x5b); + instance->input->KeyboardEvent(instance->input, 1 | KBD_FLAGS_RELEASE, 0x5b); kdlmeta = 0; } // right meta if ((kdrmeta == 0) && ((mf & 0x10) != 0)) { // right meta went down - ((freerdp*)rdp_instance)->input->KeyboardEvent(((freerdp*)rdp_instance)->input, 1 | KBD_FLAGS_DOWN, 0x5c); + instance->input->KeyboardEvent(instance->input, 1 | KBD_FLAGS_DOWN, 0x5c); kdrmeta = 1; } if ((kdrmeta != 0) && ((mf & 0x10) == 0)) { // right meta went up - ((freerdp*)rdp_instance)->input->KeyboardEvent(((freerdp*)rdp_instance)->input, 1 | KBD_FLAGS_RELEASE, 0x5c); + instance->input->KeyboardEvent(instance->input, 1 | KBD_FLAGS_RELEASE, 0x5c); kdrmeta = 0; } } @@ -681,14 +603,6 @@ const char* error_code_names[] = free(argv[i]); } -#ifdef HAVE_RAIL - for (MRDPWindow * w in windows) - { - [w setWindow:nil]; - [w setView:nil]; - } -#endif - if (!is_connected) return; @@ -696,12 +610,20 @@ const char* error_code_names[] = if (pixel_data) free(pixel_data); - - if (run_loop_src != 0) + + if (run_loop_src_update != 0) + CFRunLoopRemoveSource(CFRunLoopGetCurrent(), run_loop_src_update, kCFRunLoopDefaultMode); + + if (run_loop_src_input != 0) + CFRunLoopRemoveSource(CFRunLoopGetCurrent(), run_loop_src_input, kCFRunLoopDefaultMode); + + if (run_loop_src_channels != 0) CFRunLoopRemoveSource(CFRunLoopGetCurrent(), run_loop_src_channels, kCFRunLoopDefaultMode); - - if (run_loop_src != 0) - CFRunLoopRemoveSource(CFRunLoopGetCurrent(), run_loop_src, kCFRunLoopDefaultMode); + + freerdp_client_stop(self->context); + + freerdp_client_context_free(self->context); + } /** ********************************************************************* @@ -710,46 +632,31 @@ const char* error_code_names[] = - (void) drawRect:(NSRect)rect { - if (!rdp_context) + if (!context) return; -#ifdef HAVE_RAIL - if (g_mrdpview->isRemoteApp && g_mrdpview->currentWindow) - return; -#endif - - if(g_mrdpview->bitmap_context) - { - CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort]; - CGImageRef cgImage = CGBitmapContextCreateImage(g_mrdpview->bitmap_context); + if (self->bitmap_context) + { + CGContextRef cgContext = [[NSGraphicsContext currentContext] graphicsPort]; + CGImageRef cgImage = CGBitmapContextCreateImage(self->bitmap_context); - CGContextClipToRect(context, CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height)); - CGContextDrawImage(context, CGRectMake(0, 0, [self bounds].size.width, [self bounds].size.height), cgImage); + CGContextClipToRect(cgContext, CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height)); + CGContextDrawImage(cgContext, CGRectMake(0, 0, [self bounds].size.width, [self bounds].size.height), cgImage); - CGImageRelease(cgImage); - } - else - { - // just clear the screen with black - [[NSColor redColor] set]; - NSRectFill([self bounds]); - } + CGImageRelease(cgImage); + } + else + { + // just clear the screen with black + [[NSColor redColor] set]; + NSRectFill([self bounds]); + } } /************************************************************************ instance methods ************************************************************************/ -/** ********************************************************************* - * save state info for use by other methods later on - ***********************************************************************/ - -- (void) saveStateInfo:(void *) instance :(void *) context -{ - rdp_instance = instance; - rdp_context = context; -} - /** ********************************************************************* * double check that a mouse event occurred in our client view ***********************************************************************/ @@ -801,18 +708,18 @@ const char* error_code_names[] = - (void) rdpConnectError { - NSString* message = @"Error connecting to server"; - if (connectErrorCode == AUTHENTICATIONERROR) - { - message = [NSString stringWithFormat:@"%@:\n%@", message, @"Authentication failure, check credentials."]; - } + NSString* message = @"Error connecting to server"; + if (connectErrorCode == AUTHENTICATIONERROR) + { + message = [NSString stringWithFormat:@"%@:\n%@", message, @"Authentication failure, check credentials."]; + } NSAlert *alert = [[NSAlert alloc] init]; [alert setMessageText:message]; - [alert beginSheetModalForWindow:[g_mrdpview window] - modalDelegate:g_mrdpview - didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) - contextInfo:nil]; + [alert beginSheetModalForWindow:[self window] + modalDelegate:self + didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) + contextInfo:nil]; } /** ********************************************************************* @@ -823,10 +730,10 @@ const char* error_code_names[] = { NSAlert *alert = [[NSAlert alloc] init]; [alert setMessageText:@"Error starting remote app on specified server"]; - [alert beginSheetModalForWindow:[g_mrdpview window] - modalDelegate:g_mrdpview - didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) - contextInfo:nil]; + [alert beginSheetModalForWindow:[self window] + modalDelegate:self + didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) + contextInfo:nil]; } /** ********************************************************************* @@ -852,7 +759,7 @@ const char* error_code_names[] = NSString *str = [pasteboard_rd availableTypeFromArray:types]; if (str != nil) { - cliprdr_send_supported_format_list(rdp_instance); + cliprdr_send_supported_format_list(instance); } } } @@ -864,96 +771,31 @@ const char* error_code_names[] = height = h; // compute difference between window and client area - NSRect outerRect = [[g_mrdpview window] frame]; - NSRect innerRect = [g_mrdpview frame]; + NSRect outerRect = [[self window] frame]; + NSRect innerRect = [self frame]; int widthDiff = outerRect.size.width - innerRect.size.width; int heightDiff = outerRect.size.height - innerRect.size.height; - if (!g_mrdpview->isRemoteApp) - { - // we are not in RemoteApp mode, disable resizing - outerRect.size.width = w + widthDiff; - outerRect.size.height = h + heightDiff; - [[g_mrdpview window] setMaxSize:outerRect.size]; - [[g_mrdpview window] setMinSize:outerRect.size]; - [[g_mrdpview window] setFrame:outerRect display:YES]; - - // set client area to specified dimensions - innerRect.size.width = w; - innerRect.size.height = h; - [g_mrdpview setFrame:innerRect]; - - return; - } + // we are not in RemoteApp mode, disable resizing + outerRect.size.width = w + widthDiff; + outerRect.size.height = h + heightDiff; + [[self window] setMaxSize:outerRect.size]; + [[self window] setMinSize:outerRect.size]; + [[self window] setFrame:outerRect display:YES]; - // we are in RemoteApp mode - - outerRect.origin.x = 0; - outerRect.origin.y = 0; - outerRect.size.width = width + widthDiff; - outerRect.size.height = height + heightDiff; - [[g_mrdpview window] setFrame:outerRect display:YES]; - // set client area to specified dimensions - innerRect.size.width = width; - innerRect.size.height = height; - [g_mrdpview setFrame:innerRect]; - - // main window displays desktop background - hide it - [[g_mrdpview window] orderOut:g_mrdpview]; + innerRect.size.width = w; + innerRect.size.height = h; + [self setFrame:innerRect]; } -#ifdef HAVE_RAIL -// RAIL_TODO is this func required -- (void) windowDidResize:(NSNotification*) notification -{ - - RAIL_WINDOW_MOVE_ORDER windowMove; - - printf("RAIL_TODO: MRDPView: windowDidResize() - not yet implemented\n"); - - return; - - // window resize valid only in RemoteApp mode - if (!g_mrdpview->isRemoteApp) - return; - - // window has resized, let server know - - NSRect r = [[g_mrdpview window] frame]; - printf("----- LK_TODO: MRDPView:windowDidResize (%d,%d %dx%d)\n", - (int) r.origin.x, (int) r.origin.y, - (int) r.size.width, (int) r.size.height); - - - windowMove.windowId = [currentWindow windowID]; - - windowMove.left = (UINT16) r.origin.x; // x-cordinate of top left corner - windowMove.right = (UINT16) (windowMove.left + r.size.width); // x-cordinate of bottom right corner - windowMove.top = (UINT16) r.origin.y; // y-cordinate of top left corner - windowMove.bottom = (UINT16) (windowMove.top + r.size.height); // y-cordinate of bottom right corner - - printf("----- LK_TODO: MRDPView:windowDidResize windowID=%d left=%d top=%d right=%d bottom=x%d width=%f height=%f\n", - [currentWindow windowID], windowMove.left, windowMove.top, windowMove.right, windowMove.bottom, r.size.width, r.size.height); - - //mac_send_rail_client_event(g_mrdpview->((freerdp*)rdp_instance)->context->channels, RDP_EVENT_TYPE_RAIL_CLIENT_WINDOW_MOVE, &windowMove); -} -#endif - /************************************************************************ * * * C functions * * * ***********************************************************************/ -/** ********************************************************************* - * connect to RDP server - * - * @return 0 on success, -1 on failure - ***********************************************************************/ - - /** ********************************************************************* * a callback given to freerdp_connect() to process the pre-connect operations. * @@ -965,10 +807,6 @@ const char* error_code_names[] = BOOL mac_pre_connect(freerdp* instance) { - int i; - int len; - int status; - char* cptr; rdpSettings* settings; BOOL bitmap_cache; @@ -978,87 +816,29 @@ BOOL mac_pre_connect(freerdp* instance) instance->update->SetBounds = mac_set_bounds; //instance->update->BitmapUpdate = mac_bitmap_update; - NSArray *args = [[NSProcessInfo processInfo] arguments]; - - g_mrdpview->argc = (int) [args count]; - - g_mrdpview->argv = malloc(sizeof(char *) * g_mrdpview->argc); - - if (g_mrdpview->argv == NULL) - return FALSE; - - i = 0; - - // in RemoteApp (RAIL) mode, we connect to RDP server at max screen resolution; - // in order to achieve this, we need to modify the cmd line args entered by the user; - - if (g_mrdpview->isRemoteApp) - { - BOOL gotGeometry = NO; - - // get dimensions of screen that has keyboard focus; - // we use these dimensions when connecting to RDP server - instance->settings->DesktopWidth = [[NSScreen mainScreen] frame].size.width; - instance->settings->DesktopHeight = [[NSScreen mainScreen] frame].size.height - g_mrdpview->titleBarHeight; - g_mrdpview->width = instance->settings->DesktopWidth; - g_mrdpview->height = instance->settings->DesktopHeight; - - for (NSString * str in args) - { - if (gotGeometry) - { - gotGeometry = NO; - cptr = (char *) malloc(20); - sprintf(cptr, "%dx%d", g_mrdpview->width, g_mrdpview->height); - g_mrdpview->argv[i++] = cptr; - continue; - } - - len = (int) ([str length] + 1); - cptr = (char *) malloc(len); - strcpy(cptr, [str UTF8String]); - g_mrdpview->argv[i++] = cptr; - - // -g is the cmd line arg to specify screen resolution/geometry - if ([str compare:@"-g"] == NSOrderedSame) - { - gotGeometry = YES; - } - } - } - else - { - for (NSString * str in args) - { - len = (int) ([str length] + 1); - cptr = (char *) malloc(len); - strcpy(cptr, [str UTF8String]); - g_mrdpview->argv[i++] = cptr; - } - } - - instance->context->argc = g_mrdpview->argc; - instance->context->argv = g_mrdpview->argv; - - status = freerdp_client_parse_command_line_arguments(instance->context->argc, instance->context->argv, instance->settings); - - if (status < 0) + mfContext *mfc = (mfContext*) instance->context; + MRDPView* view = (MRDPView*) mfc->view; + + settings = instance->settings; + + if (!settings->ServerHostname) { + fprintf(stderr, "error: server hostname was not specified with /v:[:port]\n"); [NSApp terminate:nil]; - return TRUE; + return -1; } freerdp_client_load_addins(instance->context->channels, instance->settings); settings = instance->settings; bitmap_cache = settings->BitmapCacheEnabled; - + instance->settings->ColorDepth = 32; instance->settings->SoftwareGdi = TRUE; - + settings->OsMajorType = OSMAJORTYPE_UNIX; settings->OsMinorType = OSMINORTYPE_NATIVE_XSERVER; - + settings->OrderSupport[NEG_DSTBLT_INDEX] = TRUE; settings->OrderSupport[NEG_PATBLT_INDEX] = TRUE; settings->OrderSupport[NEG_SCRBLT_INDEX] = TRUE; @@ -1072,23 +852,23 @@ BOOL mac_pre_connect(freerdp* instance) settings->OrderSupport[NEG_LINETO_INDEX] = TRUE; settings->OrderSupport[NEG_POLYLINE_INDEX] = TRUE; settings->OrderSupport[NEG_MEMBLT_INDEX] = bitmap_cache; - + settings->OrderSupport[NEG_MEM3BLT_INDEX] = (settings->SoftwareGdi) ? TRUE : FALSE; - + settings->OrderSupport[NEG_MEMBLT_V2_INDEX] = bitmap_cache; 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] = (settings->SoftwareGdi) ? FALSE : TRUE; settings->OrderSupport[NEG_POLYGON_CB_INDEX] = (settings->SoftwareGdi) ? FALSE : TRUE; - + settings->OrderSupport[NEG_ELLIPSE_SC_INDEX] = FALSE; settings->OrderSupport[NEG_ELLIPSE_CB_INDEX] = FALSE; - - [g_mrdpview setViewSize:instance->settings->DesktopWidth :instance->settings->DesktopHeight]; + + [view setViewSize :instance->settings->DesktopWidth :instance->settings->DesktopHeight]; freerdp_channels_pre_connect(instance->context->channels, instance); @@ -1116,7 +896,10 @@ BOOL mac_post_connect(freerdp* instance) void* rd_fds[32]; void* wr_fds[32]; rdpPointer rdp_pointer; - + mfContext *mfc = (mfContext*) instance->context; + + MRDPView* view = (MRDPView*) mfc->view; + ZeroMemory(&rdp_pointer, sizeof(rdpPointer)); rdp_pointer.size = sizeof(rdpPointer); rdp_pointer.New = mf_Pointer_New; @@ -1130,57 +913,28 @@ BOOL mac_post_connect(freerdp* instance) rdpGdi* gdi = instance->context->gdi; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - g_mrdpview->bitmap_context = CGBitmapContextCreate(gdi->primary_buffer, gdi->width, gdi->height, 8, gdi->width * 4, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst); + view->bitmap_context = CGBitmapContextCreate(gdi->primary_buffer, gdi->width, gdi->height, 8, gdi->width * 4, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst); pointer_cache_register_callbacks(instance->update); graphics_register_pointer(instance->context->graphics, &rdp_pointer); - - /* register file descriptors with the RunLoop */ - if (!freerdp_get_fds(instance, rd_fds, &rd_count, 0, 0)) - { - printf("mac_post_connect: freerdp_get_fds() failed!\n"); - } - - for (index = 0; index < rd_count; index++) - { - fds[index] = (int)(long)rd_fds[index]; - } - register_fds(fds, rd_count, instance); - - /* register channel manager file descriptors with the RunLoop */ - if (!freerdp_channels_get_fds(instance->context->channels, instance, rd_fds, &rd_count, wr_fds, &wr_count)) - { - printf("ERROR: freerdp_channels_get_fds() failed\n"); - } - for (index = 0; index < rd_count; index++) - { - fds[index] = (int)(long)rd_fds[index]; - } - - register_channel_fds(fds, rd_count, instance); + freerdp_channels_post_connect(instance->context->channels, instance); -#ifdef HAVE_RAIL - /* setup RemoteApp */ - instance->context->rail = rail_new(instance->settings); - rail_register_update_callbacks(instance->context->rail, instance->update); - mac_rail_register_callbacks(instance, instance->context->rail); -#endif - /* setup pasteboard (aka clipboard) for copy operations (write only) */ - g_mrdpview->pasteboard_wr = [NSPasteboard generalPasteboard]; + view->pasteboard_wr = [NSPasteboard generalPasteboard]; /* setup pasteboard for read operations */ - g_mrdpview->pasteboard_rd = [NSPasteboard generalPasteboard]; - g_mrdpview->pasteboard_changecount = (int) [g_mrdpview->pasteboard_rd changeCount]; - g_mrdpview->pasteboard_timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:g_mrdpview selector:@selector(onPasteboardTimerFired:) userInfo:nil repeats:YES]; + view->pasteboard_rd = [NSPasteboard generalPasteboard]; + view->pasteboard_changecount = (int) [view->pasteboard_rd changeCount]; + view->pasteboard_timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:mfc->view selector:@selector(onPasteboardTimerFired:) userInfo:nil repeats:YES]; /* we want to be notified when window resizes */ - [[NSNotificationCenter defaultCenter] addObserver:g_mrdpview selector:@selector(windowDidResize:) name:NSWindowDidResizeNotification object:nil]; - + [[NSNotificationCenter defaultCenter] addObserver:mfc->view selector:@selector(windowDidResize:) name:NSWindowDidResizeNotification object:nil]; + return TRUE; } + BOOL mac_authenticate(freerdp* instance, char** username, char** password, char** domain) { PasswordDialog* dialog = [PasswordDialog new]; @@ -1194,7 +948,7 @@ BOOL mac_authenticate(freerdp* instance, char** username, char** password, char* dialog.password = [NSString stringWithCString:*password encoding:NSUTF8StringEncoding]; BOOL ok = [dialog runModal]; - + if (ok) { const char* submittedUsername = [dialog.username cStringUsingEncoding:NSUTF8StringEncoding]; @@ -1227,6 +981,8 @@ void mf_Pointer_New(rdpContext* context, rdpPointer* pointer) NSMutableArray* ma; NSBitmapImageRep* bmiRep; MRDPCursor* mrdpCursor = [[MRDPCursor alloc] init]; + mfContext* mfc = (mfContext*) context; + MRDPView* view = (MRDPView*) mfc->view; rect.size.width = pointer->width; rect.size.height = pointer->height; @@ -1244,16 +1000,16 @@ void mf_Pointer_New(rdpContext* context, rdpPointer* pointer) /* store cursor bitmap image in representation - required by NSImage */ bmiRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:(unsigned char **) &cursor_data - pixelsWide:rect.size.width - pixelsHigh:rect.size.height - bitsPerSample:8 - samplesPerPixel:4 - hasAlpha:YES - isPlanar:NO - colorSpaceName:NSDeviceRGBColorSpace - bitmapFormat:0 - bytesPerRow:rect.size.width * 4 - bitsPerPixel:0]; + pixelsWide:rect.size.width + pixelsHigh:rect.size.height + bitsPerSample:8 + samplesPerPixel:4 + hasAlpha:YES + isPlanar:NO + colorSpaceName:NSDeviceRGBColorSpace + bitmapFormat:0 + bytesPerRow:rect.size.width * 4 + bitsPerPixel:0]; mrdpCursor->bmiRep = bmiRep; /* create an image using above representation */ @@ -1271,7 +1027,7 @@ void mf_Pointer_New(rdpContext* context, rdpPointer* pointer) mrdpCursor->pointer = pointer; /* save cursor for later use in mf_Pointer_Set() */ - ma = g_mrdpview->cursors; + ma = view->cursors; [ma addObject:mrdpCursor]; } @@ -1281,7 +1037,9 @@ void mf_Pointer_New(rdpContext* context, rdpPointer* pointer) void mf_Pointer_Free(rdpContext* context, rdpPointer* pointer) { - NSMutableArray* ma = g_mrdpview->cursors; + mfContext* mfc = (mfContext*) context; + MRDPView* view = (MRDPView*) mfc->view; + NSMutableArray* ma = view->cursors; for (MRDPCursor* cursor in ma) { @@ -1303,11 +1061,14 @@ void mf_Pointer_Free(rdpContext* context, rdpPointer* pointer) void mf_Pointer_Set(rdpContext* context, rdpPointer* pointer) { - NSMutableArray* ma = g_mrdpview->cursors; + mfContext* mfc = (mfContext*) context; + MRDPView* view = (MRDPView*) mfc->view; + + NSMutableArray* ma = view->cursors; return; /* disable pointer until it is fixed */ - if (!g_mrdpview->mouseInClientArea) + if (!view->mouseInClientArea) return; for (MRDPCursor* cursor in ma) @@ -1338,25 +1099,6 @@ void mf_Pointer_SetDefault(rdpContext* context) } -/** ********************************************************************* - * create a new context - but all we really need to do is save state info - ***********************************************************************/ - -void mac_context_new(freerdp* instance, rdpContext* context) -{ - [g_mrdpview saveStateInfo:instance :context]; - context->channels = freerdp_channels_new(); -} - -/** ********************************************************************* - * we don't do much over here - ***********************************************************************/ - -void mac_context_free(freerdp* instance, rdpContext* context) -{ - -} - /** ********************************************************************* * clip drawing surface so nothing is drawn outside specified bounds ***********************************************************************/ @@ -1394,6 +1136,8 @@ void mac_end_paint(rdpContext* context) int i; rdpGdi* gdi; NSRect drawRect; + mfContext* mfc = (mfContext*) context; + MRDPView* view = (MRDPView*) mfc->view; if ((context == 0) || (context->gdi == 0)) return; @@ -1404,90 +1148,160 @@ void mac_end_paint(rdpContext* context) if (context->gdi->drawing != context->gdi->primary) return; - gdi = ((rdpContext*)g_mrdpview->rdp_context)->gdi; - -#ifdef HAVE_RAIL - if (g_mrdpview->isRemoteApp && g_mrdpview->currentWindow) - { - [[g_mrdpview->currentWindow view] updateDisplay]; - return; - } -#endif - + gdi = context->gdi; + for (i = 0; i < gdi->primary->hdc->hwnd->ninvalid; i++) { drawRect.origin.x = gdi->primary->hdc->hwnd->cinvalid[i].x; drawRect.origin.y = gdi->primary->hdc->hwnd->cinvalid[i].y; drawRect.size.width = gdi->primary->hdc->hwnd->cinvalid[i].w; drawRect.size.height = gdi->primary->hdc->hwnd->cinvalid[i].h; - windows_to_apple_cords(&drawRect); - [g_mrdpview setNeedsDisplayInRect:drawRect]; + windows_to_apple_cords(mfc->view, &drawRect); + [view setNeedsDisplayInRect:drawRect]; } gdi->primary->hdc->hwnd->ninvalid = 0; } + /** ********************************************************************* - * called when data is available on a socket + * called when update data is available ***********************************************************************/ -void skt_activity_cb(CFSocketRef s, CFSocketCallBackType callbackType, - CFDataRef address, const void* data, void* info) +static void update_activity_cb(CFFileDescriptorRef fdref, CFOptionFlags callBackTypes, void *info) { - if (!freerdp_check_fds(info)) + int status; + wMessage message; + wMessageQueue* queue; + freerdp* instance = (freerdp*) info; + + status = 1; + queue = freerdp_get_message_queue(instance, FREERDP_UPDATE_MESSAGE_QUEUE); + + if (queue) { - /* lost connection or did not connect */ - [NSApp terminate:nil]; + while (MessageQueue_Peek(queue, &message, TRUE)) + { + status = freerdp_message_queue_process_message(instance, FREERDP_UPDATE_MESSAGE_QUEUE, &message); + + if (!status) + break; + } } + + CFRelease(fdref); + register_update_fds(instance); +} + +/** ********************************************************************* + * called when input data is available + ***********************************************************************/ + +static void input_activity_cb(CFFileDescriptorRef fdref, CFOptionFlags callBackTypes, void *info) +{ + int status; + wMessage message; + wMessageQueue* queue; + freerdp* instance = (freerdp*) info; + + status = 1; + queue = freerdp_get_message_queue(instance, FREERDP_INPUT_MESSAGE_QUEUE); + + if (queue) + { + while (MessageQueue_Peek(queue, &message, TRUE)) + { + fprintf(stderr, "input_activity_cb: message %d\n", message.id); + + status = freerdp_message_queue_process_message(instance, FREERDP_INPUT_MESSAGE_QUEUE, &message); + + if (!status) + break; + } + } + + CFRelease(fdref); + register_input_fds(instance); } /** ********************************************************************* * called when data is available on a virtual channel ***********************************************************************/ -void channel_activity_cb(CFSocketRef s, CFSocketCallBackType callbackType, - CFDataRef address, const void* data, void* info) +static void channel_activity_cb(CFFileDescriptorRef fdref, CFOptionFlags callBackTypes, void *info) { wMessage* event; freerdp* instance = (freerdp*) info; - - freerdp_channels_check_fds(instance->context->channels, instance); + + freerdp_channels_process_pending_messages(instance); event = freerdp_channels_pop_event(instance->context->channels); - if (event) { switch (GetMessageClass(event->id)) { -#ifdef HAVE_RAIL - case RailChannel_Class: - mac_process_rail_event(instance, event); - break; -#endif - case CliprdrChannel_Class: - process_cliprdr_event(instance, event); - break; + case CliprdrChannel_Class: + process_cliprdr_event(instance, event); + break; } + + freerdp_event_free(event); } + + CFRelease(fdref); + register_channels_fds(instance); } /** ********************************************************************* - * setup callbacks for data availability on sockets + * setup callbacks for data availability on update message queue ***********************************************************************/ -int register_fds(int* fds, int count, void* instance) +int register_update_fds(freerdp* instance) { - int i; - CFSocketRef skt_ref; - CFSocketContext skt_context = { 0, instance, NULL, NULL, NULL }; - - for (i = 0; i < count; i++) + int fd_update_event; + HANDLE update_event; + CFFileDescriptorRef fdref; + CFFileDescriptorContext fd_context = { 0, instance, NULL, NULL, NULL }; + mfContext* mfc = (mfContext*) instance->context; + MRDPView* view = (MRDPView*) mfc->view; + + if (instance->settings->AsyncUpdate) { - skt_ref = CFSocketCreateWithNative(NULL, fds[i], kCFSocketReadCallBack, skt_activity_cb, &skt_context); - g_mrdpview->run_loop_src = CFSocketCreateRunLoopSource(NULL, skt_ref, 0); - CFRunLoopAddSource(CFRunLoopGetCurrent(), g_mrdpview->run_loop_src, kCFRunLoopDefaultMode); - CFRelease(skt_ref); + update_event = freerdp_get_message_queue_event_handle(instance, FREERDP_UPDATE_MESSAGE_QUEUE); + fd_update_event = GetEventFileDescriptor(update_event); + + fdref = CFFileDescriptorCreate(kCFAllocatorDefault, fd_update_event, true, update_activity_cb, &fd_context); + CFFileDescriptorEnableCallBacks(fdref, kCFFileDescriptorReadCallBack); + view->run_loop_src_update = CFFileDescriptorCreateRunLoopSource(kCFAllocatorDefault, fdref, 0); + CFRunLoopAddSource(CFRunLoopGetCurrent(), view->run_loop_src_update, kCFRunLoopDefaultMode); } - + + return 0; +} + +/** ********************************************************************* + * setup callbacks for data availability on input message queue + ***********************************************************************/ + +int register_input_fds(freerdp* instance) +{ + int fd_input_event; + HANDLE input_event; + CFFileDescriptorRef fdref; + CFFileDescriptorContext fd_context = { 0, instance, NULL, NULL, NULL }; + mfContext* mfc = (mfContext*) instance->context; + MRDPView* view = (MRDPView*) mfc->view; + + if (instance->settings->AsyncInput) + { + input_event = freerdp_get_message_queue_event_handle(instance, FREERDP_INPUT_MESSAGE_QUEUE); + fd_input_event = GetEventFileDescriptor(input_event); + + fdref = CFFileDescriptorCreate(kCFAllocatorDefault, fd_input_event, true, input_activity_cb, &fd_context); + CFFileDescriptorEnableCallBacks(fdref, kCFFileDescriptorReadCallBack); + view->run_loop_src_input = CFFileDescriptorCreateRunLoopSource(kCFAllocatorDefault, fdref, 0); + CFRunLoopAddSource(CFRunLoopGetCurrent(), view->run_loop_src_input, kCFRunLoopDefaultMode); + } + return 0; } @@ -1495,20 +1309,26 @@ int register_fds(int* fds, int count, void* instance) * setup callbacks for data availability on channels ***********************************************************************/ -int register_channel_fds(int* fds, int count, void* instance) +int register_channels_fds(freerdp* instance) { - int i; - CFSocketRef skt_ref; - CFSocketContext skt_context = { 0, instance, NULL, NULL, NULL }; - - for (i = 0; i < count; i++) + int fd_channel_event; + HANDLE channel_event; + CFFileDescriptorRef fdref; + CFFileDescriptorContext fd_context = { 0, instance, NULL, NULL, NULL }; + mfContext* mfc = (mfContext*) instance->context; + MRDPView* view = (MRDPView*) mfc->view; + + if (instance->settings->AsyncChannels) { - skt_ref = CFSocketCreateWithNative(NULL, fds[i], kCFSocketReadCallBack, channel_activity_cb, &skt_context); - g_mrdpview->run_loop_src_channels = CFSocketCreateRunLoopSource(NULL, skt_ref, 0); - CFRunLoopAddSource(CFRunLoopGetCurrent(), g_mrdpview->run_loop_src_channels, kCFRunLoopDefaultMode); - CFRelease(skt_ref); + channel_event = freerdp_channels_get_event_handle(instance); + fd_channel_event = GetEventFileDescriptor(channel_event); + + fdref = CFFileDescriptorCreate(kCFAllocatorDefault, fd_channel_event, true, channel_activity_cb, &fd_context); + CFFileDescriptorEnableCallBacks(fdref, kCFFileDescriptorReadCallBack); + view->run_loop_src_channels = CFFileDescriptorCreateRunLoopSource(kCFAllocatorDefault, fdref, 0); + CFRunLoopAddSource(CFRunLoopGetCurrent(), view->run_loop_src_channels, kCFRunLoopDefaultMode); } - + return 0; } @@ -1516,7 +1336,7 @@ int register_channel_fds(int* fds, int count, void* instance) * called when channel data is available ***********************************************************************/ -int receive_channel_data(freerdp* instance, int chan_id, BYTE* data, int size, int flags, int total_size) +int mac_receive_channel_data(freerdp* instance, int chan_id, BYTE* data, int size, int flags, int total_size) { return freerdp_channels_data(instance, chan_id, data, size, flags, total_size); } @@ -1557,11 +1377,13 @@ void cliprdr_process_cb_data_request_event(freerdp* instance) int len; NSArray* types; RDP_CB_DATA_RESPONSE_EVENT* event; - + mfContext* mfc = (mfContext*) instance->context; + MRDPView* view = (MRDPView*) mfc->view; + event = (RDP_CB_DATA_RESPONSE_EVENT*) freerdp_event_new(CliprdrChannel_Class, CliprdrChannel_DataResponse, NULL, NULL); types = [NSArray arrayWithObject:NSStringPboardType]; - NSString* str = [g_mrdpview->pasteboard_rd availableTypeFromArray:types]; + NSString* str = [view->pasteboard_rd availableTypeFromArray:types]; if (str == nil) { @@ -1570,7 +1392,7 @@ void cliprdr_process_cb_data_request_event(freerdp* instance) } else { - NSString* data = [g_mrdpview->pasteboard_rd stringForType:NSStringPboardType]; + NSString* data = [view->pasteboard_rd stringForType:NSStringPboardType]; len = (int) ([data length] * 2 + 2); event->data = malloc(len); [data getCString:(char *) event->data maxLength:len encoding:NSUnicodeStringEncoding]; @@ -1600,16 +1422,18 @@ void cliprdr_process_cb_data_response_event(freerdp* instance, RDP_CB_DATA_RESPO { NSString* str; NSArray* types; - + mfContext* mfc = (mfContext*) instance->context; + MRDPView* view = (MRDPView*) mfc->view; + if (event->size == 0) return; - if (g_mrdpview->pasteboard_format == CB_FORMAT_TEXT || g_mrdpview->pasteboard_format == CB_FORMAT_UNICODETEXT) + if (view->pasteboard_format == CB_FORMAT_TEXT || view->pasteboard_format == CB_FORMAT_UNICODETEXT) { str = [[NSString alloc] initWithCharacters:(unichar *) event->data length:event->size / 2]; types = [[NSArray alloc] initWithObjects:NSStringPboardType, nil]; - [g_mrdpview->pasteboard_wr declareTypes:types owner:g_mrdpview]; - [g_mrdpview->pasteboard_wr setString:str forType:NSStringPboardType]; + [view->pasteboard_wr declareTypes:types owner:mfc->view]; + [view->pasteboard_wr setString:str forType:NSStringPboardType]; } } @@ -1635,7 +1459,9 @@ void cliprdr_process_cb_monitor_ready_event(freerdp* instance) void cliprdr_process_cb_format_list_event(freerdp* instance, RDP_CB_FORMAT_LIST_EVENT* event) { int i; - + mfContext* mfc = (mfContext*) instance->context; + MRDPView* view = (MRDPView*) mfc->view; + if (event->num_formats == 0) return; @@ -1643,36 +1469,36 @@ void cliprdr_process_cb_format_list_event(freerdp* instance, RDP_CB_FORMAT_LIST_ { switch (event->formats[i]) { - case CB_FORMAT_RAW: - printf("CB_FORMAT_RAW: not yet supported\n"); - break; - - case CB_FORMAT_TEXT: - case CB_FORMAT_UNICODETEXT: - g_mrdpview->pasteboard_format = CB_FORMAT_UNICODETEXT; - cliprdr_send_data_request(instance, CB_FORMAT_UNICODETEXT); - return; - break; - - case CB_FORMAT_DIB: - printf("CB_FORMAT_DIB: not yet supported\n"); - break; - - case CB_FORMAT_HTML: - printf("CB_FORMAT_HTML\n"); - break; - - case CB_FORMAT_PNG: - printf("CB_FORMAT_PNG: not yet supported\n"); - break; - - case CB_FORMAT_JPEG: - printf("CB_FORMAT_JPEG: not yet supported\n"); - break; - - case CB_FORMAT_GIF: - printf("CB_FORMAT_GIF: not yet supported\n"); - break; + case CB_FORMAT_RAW: + printf("CB_FORMAT_RAW: not yet supported\n"); + break; + + case CB_FORMAT_TEXT: + case CB_FORMAT_UNICODETEXT: + view->pasteboard_format = CB_FORMAT_UNICODETEXT; + cliprdr_send_data_request(instance, CB_FORMAT_UNICODETEXT); + return; + break; + + case CB_FORMAT_DIB: + printf("CB_FORMAT_DIB: not yet supported\n"); + break; + + case CB_FORMAT_HTML: + printf("CB_FORMAT_HTML\n"); + break; + + case CB_FORMAT_PNG: + printf("CB_FORMAT_PNG: not yet supported\n"); + break; + + case CB_FORMAT_JPEG: + printf("CB_FORMAT_JPEG: not yet supported\n"); + break; + + case CB_FORMAT_GIF: + printf("CB_FORMAT_GIF: not yet supported\n"); + break; } } } @@ -1683,50 +1509,48 @@ void process_cliprdr_event(freerdp* instance, wMessage* event) { switch (GetMessageType(event->id)) { - /* + /* * Monitor Ready PDU is sent by server to indicate that it has been * initialized and is ready. This PDU is transmitted by the server after it has sent * Clipboard Capabilities PDU */ - case CliprdrChannel_MonitorReady: - cliprdr_process_cb_monitor_ready_event(instance); - break; - - /* + case CliprdrChannel_MonitorReady: + cliprdr_process_cb_monitor_ready_event(instance); + break; + + /* * The Format List PDU is sent either by the client or the server when its * local system clipboard is updated with new clipboard data. This PDU * contains the Clipboard Format ID and name pairs of the new Clipboard * Formats on the clipboard */ - case CliprdrChannel_FormatList: - cliprdr_process_cb_format_list_event(instance, (RDP_CB_FORMAT_LIST_EVENT*) event); - break; - - /* + case CliprdrChannel_FormatList: + cliprdr_process_cb_format_list_event(instance, (RDP_CB_FORMAT_LIST_EVENT*) event); + break; + + /* * The Format Data Request PDU is sent by the receipient of the Format List PDU. * It is used to request the data for one of the formats that was listed in the * Format List PDU */ - case CliprdrChannel_DataRequest: - cliprdr_process_cb_data_request_event(instance); - break; - - /* + case CliprdrChannel_DataRequest: + cliprdr_process_cb_data_request_event(instance); + break; + + /* * The Format Data Response PDU is sent as a reply to the Format Data Request PDU. * It is used to indicate whether processing of the Format Data Request PDU * was successful. If the processing was successful, the Format Data Response PDU * includes the contents of the requested clipboard data */ - case CliprdrChannel_DataResponse: - cliprdr_process_cb_data_response_event(instance, (RDP_CB_DATA_RESPONSE_EVENT*) event); - break; - - default: - printf("process_cliprdr_event: unknown event type %d\n", GetMessageType(event->id)); - break; + case CliprdrChannel_DataResponse: + cliprdr_process_cb_data_response_event(instance, (RDP_CB_DATA_RESPONSE_EVENT*) event); + break; + + default: + printf("process_cliprdr_event: unknown event type %d\n", GetMessageType(event->id)); + break; } - - freerdp_event_free(event); } } @@ -1744,432 +1568,14 @@ void cliprdr_send_supported_format_list(freerdp* instance) } -#ifdef HAVE_RAIL - -/**************************************************************************************** - * * - * * - * RemoteApp (RAIL) related stuff goes here * - * * - * * - ****************************************************************************************/ - -void mac_process_rail_event(freerdp* instance, wMessage* event) -{ - switch (GetMessageType(event->id)) - { - case RailChannel_GetSystemParam: - mac_process_rail_get_sysparams_event(instance->context->channels, event); - break; - - case RailChannel_ServerExecuteResult: - mac_process_rail_exec_result_event(instance->context->channels, event); - break; - - case RailChannel_ServerSystemParam: - mac_process_rail_server_sysparam_event(instance->context->channels, event); - break; - - case RailChannel_ServerMinMaxInfo: - mac_process_rail_server_minmaxinfo_event(instance->context->channels, event); - break; - - case RailChannel_ServerLocalMoveSize: - mac_process_rail_server_localmovesize_event(instance, event); - break; - - case RailChannel_ServerGetAppIdResponse: - //xf_process_rail_appid_resp_event(xfi, channels, event); - break; - - case RailChannel_ServerLanguageBarInfo: - //xf_process_rail_langbarinfo_event(xfi, channels, event); - break; - } -} - -void mac_rail_CreateWindow(rdpRail* rail, rdpWindow* window) -{ - BOOL centerWindow = NO; - BOOL moveWindow = NO; - BOOL displayAsModal = NO; - NSMutableArray * ma = g_mrdpview->windows; - - /* make sure window fits resolution */ - if (window->windowWidth > g_mrdpview->width) - window->windowWidth = g_mrdpview->width; - - if (window->windowHeight > g_mrdpview->height) - window->windowHeight = g_mrdpview->height; - - /* center main window, which is the first to be created */ - if ([ma count] == 0) - { - centerWindow = YES; - moveWindow = YES; - } - - if ((window->extendedStyle & WS_EX_TOPMOST) || (window->extendedStyle & WS_EX_TOOLWINDOW)) - { - [g_mrdpview->currentWindow view]->skipMoveWindowOnce = TRUE; - moveWindow = YES; - } - else if (window->style & WS_POPUP) - { - centerWindow = YES; - moveWindow = YES; - } - else - { - - } - - /* create NSWindow */ - NSRect winFrame = NSMakeRect(window->windowOffsetX, window->windowOffsetY, - window->windowWidth, window->windowHeight); - if (centerWindow) - apple_center_window(&winFrame); - - MRDPRailWindow * newWindow = [[MRDPRailWindow alloc] initWithContentRect:winFrame - styleMask:NSTitledWindowMask | NSResizableWindowMask - backing:NSBackingStoreBuffered - defer:NO]; - - /* this does not work if specified during window creation in above code */ - [newWindow setStyleMask:NSBorderlessWindowMask]; - - if (moveWindow) - { - /* let RDP server know that window has moved */ - RAIL_WINDOW_MOVE_ORDER windowMove; - apple_to_windowMove(&winFrame, &windowMove); - windowMove.windowId = window->windowId; - mac_send_rail_client_event(((freerdp*)g_mrdpview->rdp_instance)->context->channels, RailChannel_ClientWindowMove, &windowMove); - } - - /* create MRDPRailView and add to above window */ - NSRect viewFrame = NSMakeRect(window->clientOffsetX, window->clientOffsetY, - window->clientAreaWidth, window->clientAreaHeight); - - MRDPRailView * newView = [[MRDPRailView alloc] initWithFrame:viewFrame]; - [newView setRdpInstance:g_mrdpview->rdp_instance width:g_mrdpview->width andHeight:g_mrdpview->height windowID: window->windowId]; - [newWindow setContentView:newView]; - - /* save new window */ - MRDPWindow * mrdpWindow = [[MRDPWindow alloc] init]; - [mrdpWindow setWindowID:window->windowId]; - [mrdpWindow setWindow:newWindow]; - [mrdpWindow setView:newView]; - - /* add to list of windows */ - [ma addObject:mrdpWindow]; - - /* make new window current */ - g_mrdpview->currentWindow = mrdpWindow; - - if (displayAsModal) - { - /* display as modal window */ - NSModalSession session = [NSApp beginModalSessionForWindow:newWindow]; - - while (1) - { - if ([NSApp runModalSession:session] != NSRunContinuesResponse) - break; - } - - [NSApp endModalSession:session]; - } - else - { - [newWindow makeKeyAndOrderFront:NSApp]; - [[g_mrdpview window] resignFirstResponder]; - [g_mrdpview resignFirstResponder]; - [[g_mrdpview window] setNextResponder:newWindow]; - } - - return; -} - -void mac_rail_MoveWindow(rdpRail* rail, rdpWindow* window) -{ - if (g_mrdpview->currentWindow) - { - rail_MoveWindow(rail, window); - return; - } -} - -void mac_rail_ShowWindow(rdpRail* rail, rdpWindow* window, BYTE state) -{ - -} - -void mac_rail_SetWindowText(rdpRail* rail, rdpWindow* window) -{ - -} - -void mac_rail_SetWindowIcon(rdpRail* rail, rdpWindow* window, rdpIcon* icon) -{ - -} - -void mac_rail_SetWindowRects(rdpRail* rail, rdpWindow* window) -{ - -} - -void mac_rail_SetWindowVisibilityRects(rdpRail* rail, rdpWindow* window) -{ - -} - -/** ********************************************************************* - * destroy window created in mac_rail_CreateWindow() - ***********************************************************************/ - -void mac_rail_DestroyWindow(rdpRail* rail, rdpWindow* window) -{ - int count = 0; - - for (MRDPWindow * win in g_mrdpview->windows) - { - if ([win windowID] == window->windowId) - { - //[[win window] close]; - [win setView:nil]; - [win setWindow:nil]; - [g_mrdpview->windows removeObject:win]; - count = [g_mrdpview->windows count]; - - if (count) - { - g_mrdpview->currentWindow = [g_mrdpview->windows objectAtIndex:count - 1]; - //[[g_mrdpview window] makeKeyAndOrderFront:[g_mrdpview->currentWindow window]]; - [[g_mrdpview->currentWindow window] makeKeyAndOrderFront:NSApp]; - } - else - { - g_mrdpview->currentWindow = nil; - // RAIL_TODO [[g_mrdpview window] makeKeyAndOrderFront:[g_mrdpview window]]; - [NSApp terminate:nil]; - } - - return; - } - } -} - -void mac_rail_register_callbacks(freerdp* instance, rdpRail* rail) -{ - rail->extra = (void*) instance; - rail->rail_CreateWindow = mac_rail_CreateWindow; - rail->rail_MoveWindow = mac_rail_MoveWindow; - rail->rail_ShowWindow = mac_rail_ShowWindow; - rail->rail_SetWindowText = mac_rail_SetWindowText; - rail->rail_SetWindowIcon = mac_rail_SetWindowIcon; - rail->rail_SetWindowRects = mac_rail_SetWindowRects; - rail->rail_SetWindowVisibilityRects = mac_rail_SetWindowVisibilityRects; - rail->rail_DestroyWindow = mac_rail_DestroyWindow; -} - -/** ********************************************************************* - * set work area size, which is the portion of the screen not obscured - * by the system taskbar or by application desktop toolbars - ************************************************************************/ - -void mac_process_rail_get_sysparams_event(rdpChannels* channels, wMessage* event) -{ - RAIL_SYSPARAM_ORDER* sysparam; - - sysparam = (RAIL_SYSPARAM_ORDER*) event->wParam; - - sysparam->workArea.left = 0; - sysparam->workArea.top = 22; - sysparam->workArea.right = g_mrdpview->width; - sysparam->workArea.bottom = g_mrdpview->height - 22; - - sysparam->taskbarPos.left = 0; - sysparam->taskbarPos.top = 0; - sysparam->taskbarPos.right = 0; - sysparam->taskbarPos.bottom = 0; - - sysparam->dragFullWindows = FALSE; - - mac_send_rail_client_event(channels, RailChannel_ClientSystemParam, sysparam); -} - -void mac_process_rail_server_sysparam_event(rdpChannels* channels, wMessage* event) -{ - RAIL_SYSPARAM_ORDER* sysparam = (RAIL_SYSPARAM_ORDER*) event->wParam; - - switch (sysparam->param) - { - case SPI_SET_SCREEN_SAVE_ACTIVE: - break; - - case SPI_SET_SCREEN_SAVE_SECURE: - break; - } -} - -/** ********************************************************************* - * server returned result of exec'ing remote app on server - ************************************************************************/ - -void mac_process_rail_exec_result_event(rdpChannels* channels, wMessage* event) -{ - RAIL_EXEC_RESULT_ORDER* exec_result; - - exec_result = (RAIL_EXEC_RESULT_ORDER*) event->wParam; - - if (exec_result->execResult != RAIL_EXEC_S_OK) - { - printf("RAIL exec error: execResult=%s NtError=0x%X\n", - error_code_names[exec_result->execResult], exec_result->rawResult); - g_mrdpview->is_connected = FALSE; - [g_mrdpview rdpRemoteAppError]; - } - else - { - mac_rail_enable_remoteapp_mode(); - } -} - -/** ********************************************************************* - * sent by server when a window move or resize on the server is being - * initiated. this PDU contains info about the min and max extents - * to which the window can be moved or sized - ************************************************************************/ - -void mac_process_rail_server_minmaxinfo_event(rdpChannels* channels, wMessage* event) -{ -#if 0 - RAIL_MINMAXINFO_ORDER * minmax = (RAIL_MINMAXINFO_ORDER*) event->wParam; - printf("minmax_info: maxPosX=%d maxPosY=%d maxWidth=%d maxHeight=%d minTrackWidth=%d minTrackHeight=%d maxTrackWidth=%d maxTrackHeight=%d\n", - minmax->maxPosX, minmax->maxPosY, minmax->maxWidth, minmax->maxHeight, - minmax->minTrackWidth, minmax->minTrackHeight, minmax->maxTrackWidth, minmax->maxTrackHeight); -#endif -} - -/** ********************************************************************* - * sent by the server when a window on the server is beginning a move or - * resize; use this info to initiate a local move or resize of the - * corresponding local window - ************************************************************************/ - -void mac_process_rail_server_localmovesize_event(freerdp* instance, wMessage *event) -{ - RAIL_LOCALMOVESIZE_ORDER* moveSize = (RAIL_LOCALMOVESIZE_ORDER*) event->wParam; - RAIL_WINDOW_MOVE_ORDER windowMove; - - switch (moveSize->moveSizeType) - { - case RAIL_WMSZ_LEFT: - printf("RAIL_WMSZ_LEFT\n"); - break; - - case RAIL_WMSZ_RIGHT: - printf("RAIL_WMSZ_RIGHT\n"); - break; - - case RAIL_WMSZ_TOP: - printf("RAIL_WMSZ_TOP\n"); - break; - - case RAIL_WMSZ_TOPLEFT: - printf("RAIL_WMSZ_TOPLEFT\n"); - break; - - case RAIL_WMSZ_TOPRIGHT: - printf("RAIL_WMSZ_TOPRIGHT\n"); - break; - - case RAIL_WMSZ_BOTTOM: - printf("RAIL_WMSZ_BOTTOM\n"); - break; - - case RAIL_WMSZ_BOTTOMLEFT: - printf("RAIL_WMSZ_BOTTOMLEFT\n"); - break; - - case RAIL_WMSZ_BOTTOMRIGHT: - printf("RAIL_WMSZ_BOTTOMRIGHT\n"); - break; - - case RAIL_WMSZ_MOVE: - if (moveSize->isMoveSizeStart) - { - /* local window move in progress */ - [g_mrdpview->currentWindow view]->isMoveSizeInProgress = YES; - [g_mrdpview->currentWindow view]->saveInitialDragLoc = YES; - - return; - } - - /* local move has completed */ - [g_mrdpview->currentWindow view]->isMoveSizeInProgress = NO; - [g_mrdpview->currentWindow view]->saveInitialDragLoc = NO; - - /* let RDP server know where this window is located */ - mac_send_rail_client_event(instance->context->channels, RailChannel_ClientWindowMove, &windowMove); - - /* the event we just sent will cause an extra MoveWindow() to be invoked which we need to ignore */ - [g_mrdpview->currentWindow view]->skipMoveWindowOnce = YES; - - break; - - case RAIL_WMSZ_KEYMOVE: - printf("RAIL_WMSZ_KEYMOVE\n"); - break; - - case RAIL_WMSZ_KEYSIZE: - printf("RAIL_WMSZ_KEYSIZE\n"); - break; - - default: - break; - } - - return; -} - -void mac_send_rail_client_event(rdpChannels* channels, UINT16 event_type, void* param) -{ - void* payload = NULL; - wMessage* out_event = NULL; - - payload = rail_clone_order(event_type, param); - - if (payload) - { - out_event = freerdp_event_new(RailChannel_Class, event_type, mac_on_free_rail_client_event, payload); - freerdp_channels_send_event(channels, out_event); - } -} - -void mac_on_free_rail_client_event(wMessage* event) -{ - rail_free_cloned_order(GetMessageType(event->id), event->wParam); -} - -void mac_rail_enable_remoteapp_mode() -{ - if (!g_mrdpview->isRemoteApp) - g_mrdpview->isRemoteApp = TRUE; -} - -#endif - /** * given a rect with 0,0 at the bottom left (apple cords) * convert it to a rect with 0,0 at the top left (windows cords) */ -void apple_to_windows_cords(NSRect* r) +void apple_to_windows_cords(MRDPView* view, NSRect* r) { - r->origin.y = g_mrdpview->height - (r->origin.y + r->size.height); + r->origin.y = view->height - (r->origin.y + r->size.height); } /** @@ -2177,26 +1583,9 @@ void apple_to_windows_cords(NSRect* r) * convert it to a rect with 0,0 at the bottom left (apple cords) */ -void windows_to_apple_cords(NSRect* r) +void windows_to_apple_cords(MRDPView* view, NSRect* r) { - r->origin.y = g_mrdpview->height - (r->origin.y + r->size.height); + r->origin.y = view->height - (r->origin.y + r->size.height); } -void apple_center_window(NSRect* r) -{ - r->origin.x = (g_mrdpview->width - r->size.width) / 2; - r->origin.y = (g_mrdpview->height - r->size.height) / 2; -} - -#ifdef HAVE_RAIL -void apple_to_windowMove(NSRect* r, RAIL_WINDOW_MOVE_ORDER* windowMove) -{ - windowMove->left = (UINT16) r->origin.x; // x-cord of top left corner - windowMove->top = (UINT16) g_mrdpview->height - (r->origin.y + r->size.height); // y-cord of top left corner - windowMove->right = (UINT16) (windowMove->left + r->size.width); // x-cord of bottom right corner - windowMove->bottom = (UINT16) (windowMove->top + r->size.height); // y-cord of bottom right corner -} -#endif - - @end diff --git a/client/Mac/cli/AppDelegate.h b/client/Mac/cli/AppDelegate.h index b24cbeeab..fe2671351 100644 --- a/client/Mac/cli/AppDelegate.h +++ b/client/Mac/cli/AppDelegate.h @@ -8,15 +8,18 @@ #import #import +#import @interface AppDelegate : NSObject { @public NSWindow* window; + rdpContext* context; MRDPView* mrdpView; } @property (assign) IBOutlet NSWindow *window; +@property (assign) rdpContext *context; @property (assign) IBOutlet MRDPView *mrdpView; @end diff --git a/client/Mac/cli/AppDelegate.m b/client/Mac/cli/AppDelegate.m index 8fca18cb7..1eb3d13c1 100644 --- a/client/Mac/cli/AppDelegate.m +++ b/client/Mac/cli/AppDelegate.m @@ -7,26 +7,100 @@ // #import "AppDelegate.h" +#import "MacFreeRDP-library/mfreerdp.h" +#import "MacFreeRDP-library/mf_client.h" @implementation AppDelegate - (void)dealloc { - [super dealloc]; + [super dealloc]; } @synthesize window = window; @synthesize mrdpView = mrdpView; -- (void)applicationDidFinishLaunching:(NSNotification*)aNotification +@synthesize context = context; + +- (void) applicationDidFinishLaunching:(NSNotification*)aNotification { - [mrdpView rdpConnect]; + int status; + mfContext* mfc; + + [self CreateContext]; + + status = [self ParseCommandLineArguments]; + + mfc = (mfContext*) context; + mfc->view = (void*) mrdpView; + + if (status < 0) + { + + } + else + { + freerdp_client_start(context); + } } - (void) applicationWillTerminate:(NSNotification*)notification { - [mrdpView releaseResources]; + [mrdpView releaseResources]; +} + +- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender +{ + return YES; +} + +- (int) ParseCommandLineArguments +{ + int i; + int len; + int status; + char* cptr; + int argc; + char** argv = nil; + + NSArray* args = [[NSProcessInfo processInfo] arguments]; + + argc = (int) [args count]; + argv = malloc(sizeof(char*) * argc); + + i = 0; + + for (NSString* str in args) + { + len = (int) ([str length] + 1); + cptr = (char*) malloc(len); + strcpy(cptr, [str UTF8String]); + argv[i++] = cptr; + } + + status = freerdp_client_parse_command_line(context, argc, argv); + + return status; +} + +- (void) CreateContext +{ + RDP_CLIENT_ENTRY_POINTS clientEntryPoints; + + ZeroMemory(&clientEntryPoints, sizeof(RDP_CLIENT_ENTRY_POINTS)); + clientEntryPoints.Size = sizeof(RDP_CLIENT_ENTRY_POINTS); + clientEntryPoints.Version = RDP_CLIENT_INTERFACE_VERSION; + + RdpClientEntry(&clientEntryPoints); + + context = freerdp_client_context_new(&clientEntryPoints); +} + +- (void) ReleaseContext +{ + freerdp_client_context_free(context); + context = nil; } @end diff --git a/client/Mac/cli/CMakeLists.txt b/client/Mac/cli/CMakeLists.txt index 789bd5cde..46643227d 100644 --- a/client/Mac/cli/CMakeLists.txt +++ b/client/Mac/cli/CMakeLists.txt @@ -1,16 +1,17 @@ project(MacFreeRDP-client) -set(MODULE_NAME "MacFreeRDP-client") +set(MODULE_NAME "MacFreeRDP") +set(MODULE_OUTPUT_NAME "MacFreeRDP") set(MODULE_PREFIX "FREERDP_CLIENT_MAC_CLIENT") -set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -mmacosx-version-min=10.4") +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -mmacosx-version-min=10.5") # Import libraries find_library(FOUNDATION_LIBRARY Foundation) find_library(COCOA_LIBRARY Cocoa) find_library(APPKIT_LIBRARY AppKit) -find_library(FREERDP_LIBRARY NAMES MacFreeRDP-library PATHS ${CMAKE_CURRENT_BINARY_DIR}/../${CONFIGURATION}) +#find_library(FREERDP_LIBRARY NAMES MacFreeRDP PATHS ${CMAKE_CURRENT_BINARY_DIR}/../${CONFIGURATION}) -set(MACOSX_BUNDLE_INFO_STRING "MacFreeRDP-client") +set(MACOSX_BUNDLE_INFO_STRING "MacFreeRDP") set(MACOSX_BUNDLE_ICON_FILE "FreeRDP.icns") set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.freerdp.mac") set(MACOSX_BUNDLE_BUNDLE_IDENTIFIER "FreeRDP-client.Mac") @@ -18,7 +19,7 @@ set(MACOSX_BUNDLE_LONG_VERSION_STRING "MacFreeRDP Client Version 1.1.0") set(MACOSX_BUNDLE_BUNDLE_NAME "MacFreeRDP") set(MACOSX_BUNDLE_SHORT_VERSION_STRING 1.1.0) set(MACOSX_BUNDLE_BUNDLE_VERSION 1.1.0) -set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2012. All Rights Reserved.") +set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2013. All Rights Reserved.") set(MACOSX_BUNDLE_NSMAIN_NIB_FILE "MainMenu") set(MACOSX_BUNDLE_NSPRINCIPAL_CLASS "NSApplication") @@ -49,6 +50,8 @@ add_executable(${MODULE_NAME} ${${MODULE_NAME}_SOURCES} ${${MODULE_NAME}_RESOURCES}) +set_target_properties(${MODULE_NAME} PROPERTIES OUTPUT_NAME "${MODULE_OUTPUT_NAME}") + # This is necessary for the xib file part below configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Info.plist ${CMAKE_CURRENT_BINARY_DIR}/Info.plist) @@ -60,59 +63,47 @@ set_target_properties(${MODULE_NAME} PROPERTIES RESOURCE "${${MODULE_NAME}_RESOU # set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES) # Support for automatic reference counting requires non-fragile abi. -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v -fobjc-nonfragile-abi") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fobjc-nonfragile-abi") # Tell the compiler where to look for the FreeRDP framework -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v -F../") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -F../") -# Tell XCode where to look for the MacFreeRDP-library framework +# Tell XCode where to look for the MacFreeRDP framework set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_FRAMEWORK_SEARCH_PATHS "${XCODE_ATTRIBUTE_FRAMEWORK_SEARCH_PATHS} ${CMAKE_CURRENT_BINARY_DIR}/../$(CONFIGURATION)") - -# XCode project architecture to native architecture of build machine -# ----------------------------------------------------------------------------------------------------- -# Issue: Had some issues with FreeRDP project building only 64 bit and -# MacFreeRDP attempting to link to both 32 and 64 for dual target. -# In the future the FreeRDP Xcode project should be pulled in for a couple of reasons: -# 1) better step-into debugging 2) automatic dependency compilation and multi-arch compilation + linkage -# If you know the solutions for 1 and 2, please add below. set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_ARCHS "$(NATIVE_ARCH_ACTUAL)") # Set the info plist to the custom instance set_target_properties(${MODULE_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_BINARY_DIR}/Info.plist) # Disable transitive linking -# ${FREERDP_LIBRARY} target_link_libraries(${MODULE_NAME} ${COCOA_LIBRARY} ${FOUNDATION_LIBRARY} ${APPKIT_LIBRARY} MacFreeRDP-library) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Client/Mac") # Embed the FreeRDP framework into the app bundle add_custom_command(TARGET ${MODULE_NAME} POST_BUILD - COMMAND mkdir ARGS -p ${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION)/${MODULE_NAME}.app/Contents/Frameworks - COMMAND ditto ${CMAKE_CURRENT_BINARY_DIR}/../$(CONFIGURATION)/MacFreeRDP-library.framework ${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION)/${MODULE_NAME}.app/Contents/Frameworks/MacFreeRDP-library.framework - COMMAND install_name_tool -change "@executable_path/../../Frameworks/MacFreeRDP-library.framework/Versions/1.1.0/MacFreeRDP-library" "@executable_path/../Frameworks/MacFreeRDP-library.framework/Versions/Current/MacFreeRDP-library" "${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION)/${MODULE_NAME}.app/Contents/MacOS/${MODULE_NAME}" - COMMENT Setting install name for MacFreeRDP-library - - ) - + COMMAND mkdir ARGS -p ${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION)/${MODULE_OUTPUT_NAME}.app/Contents/Frameworks + COMMAND ditto ${CMAKE_CURRENT_BINARY_DIR}/../$(CONFIGURATION)/MacFreeRDP.framework ${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION)/${MODULE_OUTPUT_NAME}.app/Contents/Frameworks/MacFreeRDP.framework + COMMAND install_name_tool -change "@executable_path/../../Frameworks/MacFreeRDP.framework/Versions/1.1.0/MacFreeRDP" + "@executable_path/../Frameworks/MacFreeRDP.framework/Versions/Current/MacFreeRDP" + "${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION)/${MODULE_OUTPUT_NAME}.app/Contents/MacOS/${MODULE_NAME}" + COMMENT Setting install name for MacFreeRDP) # Add post-build NIB file generation in unix makefiles. XCode handles this implicitly. if("${CMAKE_GENERATOR}" MATCHES "Unix Makefiles") message(STATUS "Adding post-build NIB file generation event for ${MODULE_NAME}") - # Make sure we can find the 'ibtool' program. If we can NOT find it we - # skip generation of this project + # Make sure we can find the 'ibtool' program. If we can NOT find it we skip generation of this project find_program(IBTOOL ibtool HINTS "/usr/bin" "${OSX_DEVELOPER_ROOT}/usr/bin") if (${IBTOOL} STREQUAL "IBTOOL-NOTFOUND") - message(SEND_ERROR "ibtool can not be found and is needed to compile the .xib files. It should have been installed with + message(SEND_ERROR "ibtool can not be found and is needed to compile the .xib files. It should have been installed with the Apple developer tools. The default system paths were searched in addition to ${OSX_DEVELOPER_ROOT}/usr/bin") endif() # Make sure the 'Resources' Directory is correctly created before we build - add_custom_command (TARGET ${MODULE_NAME} PRE_BUILD - COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION)/${MODULE_NAME}.app/Contents/Resources) + add_custom_command(TARGET ${MODULE_NAME} PRE_BUILD COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/\${CONFIGURATION}/${MODULE_OUTPUT_NAME}.app/Contents/Resources) # Compile the .xib files using the 'ibtool' program with the destination being the app package foreach(xib ${${MODULE_NAME}_XIBS}) @@ -120,8 +111,8 @@ if("${CMAKE_GENERATOR}" MATCHES "Unix Makefiles") add_custom_command (TARGET ${MODULE_NAME} POST_BUILD COMMAND ${IBTOOL} --errors --warnings --notices --output-format human-readable-text - --compile ${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION)/${MODULE_NAME}.app/Contents/Resources/${XIB_WE}.nib ${xib} + --compile ${CMAKE_CURRENT_BINARY_DIR}/\${CONFIGURATION}/${MODULE_OUTPUT_NAME}.app/Contents/Resources/${XIB_WE}.nib ${xib} COMMENT "Compiling ${xib}") endforeach() -endif("${CMAKE_GENERATOR}" MATCHES "Unix Makefiles") \ No newline at end of file +endif("${CMAKE_GENERATOR}" MATCHES "Unix Makefiles") diff --git a/client/Mac/cli/main.m b/client/Mac/cli/main.m index b1ed1e5f4..4048b01be 100644 --- a/client/Mac/cli/main.m +++ b/client/Mac/cli/main.m @@ -7,10 +7,8 @@ // #import -#import int main(int argc, char *argv[]) { - [MRDPView class]; - return NSApplicationMain(argc, (const char **)argv); + return NSApplicationMain(argc, (const char**) argv); } diff --git a/client/Mac/mf_client.h b/client/Mac/mf_client.h new file mode 100755 index 000000000..711c77b47 --- /dev/null +++ b/client/Mac/mf_client.h @@ -0,0 +1,41 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Windows Client + * + * Copyright 2009-2011 Jay Sorg + * Copyright 2010-2011 Vic Lee + * Copyright 2010-2011 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 __MF_CLIENT_H +#define __MF_CLIENT_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Client Interface + */ + +FREERDP_API int RdpClientEntry(RDP_CLIENT_ENTRY_POINTS* pEntryPoints); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/client/Mac/mf_client.m b/client/Mac/mf_client.m new file mode 100755 index 000000000..20aa3ce01 --- /dev/null +++ b/client/Mac/mf_client.m @@ -0,0 +1,176 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * X11 Client Interface + * + * 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 "mfreerdp.h" +#include +#include +#include + +/** + * Client Interface + */ + +void mfreerdp_client_global_init() +{ + freerdp_handle_signals(); + freerdp_channels_global_init(); +} + +void mfreerdp_client_global_uninit() +{ + freerdp_channels_global_uninit(); +} + +int mfreerdp_client_start(rdpContext* context) +{ + MRDPView* view; + mfContext* mfc = (mfContext*) context; + + view = (MRDPView*) mfc->view; + [view rdpStart:context]; + + return 0; +} + +int mfreerdp_client_stop(rdpContext* context) +{ + mfContext* mfc = (mfContext*) context; + + if (context->settings->AsyncUpdate) + { + wMessageQueue* queue; + queue = freerdp_get_message_queue(context->instance, FREERDP_UPDATE_MESSAGE_QUEUE); + MessageQueue_PostQuit(queue, 0); + } + + if (context->settings->AsyncInput) + { + wMessageQueue* queue; + queue = freerdp_get_message_queue(context->instance, FREERDP_INPUT_MESSAGE_QUEUE); + MessageQueue_PostQuit(queue, 0); + } + else + { + mfc->disconnect = TRUE; + } + + return 0; +} + +int mfreerdp_client_new(freerdp* instance, rdpContext* context) +{ + mfContext* mfc; + rdpSettings* settings; + + mfc = (mfContext*) instance->context; + + context->channels = freerdp_channels_new(); + + settings = instance->settings; + + settings->AsyncUpdate = TRUE; + // TODO settings->AsyncInput = TRUE; + settings->AsyncChannels = TRUE; + settings->AsyncTransport = TRUE; + settings->RedirectClipboard = TRUE; + + settings->OsMajorType = OSMAJORTYPE_MACINTOSH; + settings->OsMinorType = OSMINORTYPE_MACINTOSH; + + 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] = (settings->SoftwareGdi) ? TRUE : FALSE; + + 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] = (settings->SoftwareGdi) ? FALSE : TRUE; + settings->OrderSupport[NEG_POLYGON_CB_INDEX] = (settings->SoftwareGdi) ? FALSE : TRUE; + + settings->OrderSupport[NEG_ELLIPSE_SC_INDEX] = FALSE; + settings->OrderSupport[NEG_ELLIPSE_CB_INDEX] = FALSE; + + return 0; +} + +void mfreerdp_client_free(freerdp* instance, rdpContext* context) +{ + +} + +void freerdp_client_mouse_event(rdpContext* cfc, DWORD flags, int x, int y) +{ + int width, height; + rdpInput* input = cfc->instance->input; + rdpSettings* settings = cfc->instance->settings; + + width = settings->DesktopWidth; + height = settings->DesktopHeight; + + if (x < 0) + x = 0; + + x = width - 1; + + if (y < 0) + y = 0; + + if (y >= height) + y = height - 1; + + input->MouseEvent(input, flags, x, y); +} + +int RdpClientEntry(RDP_CLIENT_ENTRY_POINTS* pEntryPoints) +{ + pEntryPoints->Version = 1; + pEntryPoints->Size = sizeof(RDP_CLIENT_ENTRY_POINTS_V1); + + pEntryPoints->GlobalInit = mfreerdp_client_global_init; + pEntryPoints->GlobalUninit = mfreerdp_client_global_uninit; + + pEntryPoints->ContextSize = sizeof(mfContext); + pEntryPoints->ClientNew = mfreerdp_client_new; + pEntryPoints->ClientFree = mfreerdp_client_free; + + pEntryPoints->ClientStart = mfreerdp_client_start; + pEntryPoints->ClientStop = mfreerdp_client_stop; + + return 0; +} diff --git a/client/Mac/mfreerdp.h b/client/Mac/mfreerdp.h new file mode 100644 index 000000000..02b0272e2 --- /dev/null +++ b/client/Mac/mfreerdp.h @@ -0,0 +1,76 @@ +#ifndef MFREERDP_H +#define MFREERDP_H + +typedef struct mf_context mfContext; + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "MRDPView.h" +#include + +struct mf_context +{ + rdpContext context; + DEFINE_RDP_CLIENT_COMMON(); + + void* view; + + int width; + int height; + int offset_x; + int offset_y; + int fs_toggle; + int fullscreen; + int percentscreen; + char window_title[64]; + int client_x; + int client_y; + int client_width; + int client_height; + + HANDLE keyboardThread; + + HGDI_DC hdc; + UINT16 srcBpp; + UINT16 dstBpp; + freerdp* instance; + + DWORD mainThreadId; + DWORD keyboardThreadId; + BOOL disconnect; + BOOL sw_gdi; + + rdpFile* connectionRdpFile; + + // Keep track of window size and position, disable when in fullscreen mode. + BOOL disablewindowtracking; + + // These variables are required for horizontal scrolling. + BOOL updating_scrollbars; + BOOL xScrollVisible; + int xMinScroll; // minimum horizontal scroll value + int xCurrentScroll; // current horizontal scroll value + int xMaxScroll; // maximum horizontal scroll value + + // These variables are required for vertical scrolling. + BOOL yScrollVisible; + int yMinScroll; // minimum vertical scroll value + int yCurrentScroll; // current vertical scroll value + int yMaxScroll; // maximum vertical scroll value +}; + +#endif // MFREERDP_H diff --git a/client/Sample/freerdp.c b/client/Sample/freerdp.c index 1ad9cc673..989281193 100644 --- a/client/Sample/freerdp.c +++ b/client/Sample/freerdp.c @@ -69,9 +69,10 @@ struct thread_data freerdp* instance; }; -void tf_context_new(freerdp* instance, rdpContext* context) +int tf_context_new(freerdp* instance, rdpContext* context) { context->channels = freerdp_channels_new(); + return 0; } void tf_context_free(freerdp* instance, rdpContext* context) @@ -314,7 +315,7 @@ int main(int argc, char* argv[]) instance->PostConnect = tf_post_connect; instance->ReceiveChannelData = tf_receive_channel_data; - instance->context_size = sizeof(tfContext); + instance->ContextSize = sizeof(tfContext); instance->ContextNew = tf_context_new; instance->ContextFree = tf_context_free; freerdp_context_new(instance); diff --git a/client/Windows/cli/wfreerdp.c b/client/Windows/cli/wfreerdp.c index 87601279f..ac8d6f665 100644 --- a/client/Windows/cli/wfreerdp.c +++ b/client/Windows/cli/wfreerdp.c @@ -44,27 +44,53 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { + int index; int status; - wfInfo* wfi; + HANDLE thread; + wfContext* wfc; + DWORD dwExitCode; + rdpContext* context; + rdpSettings* settings; + RDP_CLIENT_ENTRY_POINTS clientEntryPoints; - freerdp_client_global_init(); + ZeroMemory(&clientEntryPoints, sizeof(RDP_CLIENT_ENTRY_POINTS)); + clientEntryPoints.Size = sizeof(RDP_CLIENT_ENTRY_POINTS); + clientEntryPoints.Version = RDP_CLIENT_INTERFACE_VERSION; - wfi = freerdp_client_new(__argc, __argv); + RdpClientEntry(&clientEntryPoints); - status = freerdp_client_start(wfi); + context = freerdp_client_context_new(&clientEntryPoints); - if (status < 0) + settings = context->settings; + wfc = (wfContext*) context; + + context->argc = __argc; + context->argv = (char**) malloc(sizeof(char*) * __argc); + + for (index = 0; index < context->argc; index++) + context->argv[index] = _strdup(__argv[index]); + + status = freerdp_client_parse_command_line(context, context->argc, context->argv); + + status = freerdp_client_command_line_status_print(context->argc, context->argv, settings, status); + + if (status) { - MessageBox(GetConsoleWindow(), - _T("Failed to start wfreerdp.\n\nPlease check the debug output."), - _T("FreeRDP Error"), MB_ICONSTOP); - } - else - { - WaitForSingleObject(wfi->thread, INFINITE); + freerdp_client_context_free(context); + return 0; } - freerdp_client_free(wfi); + freerdp_client_start(context); + + thread = freerdp_client_get_thread(context); + + WaitForSingleObject(thread, INFINITE); + + GetExitCodeThread(thread, &dwExitCode); + + freerdp_client_stop(context); + + freerdp_client_context_free(context); return 0; } diff --git a/client/Windows/wf_cliprdr.c b/client/Windows/wf_cliprdr.c index cfaa2e21e..78bb02dd4 100644 --- a/client/Windows/wf_cliprdr.c +++ b/client/Windows/wf_cliprdr.c @@ -29,54 +29,54 @@ #include "wf_cliprdr.h" -void wf_cliprdr_init(wfInfo* wfi, rdpChannels* chanman) +void wf_cliprdr_init(wfContext* wfc, rdpChannels* channels) { } -void wf_cliprdr_uninit(wfInfo* wfi) +void wf_cliprdr_uninit(wfContext* wfc) { } -static void wf_cliprdr_process_cb_monitor_ready_event(wfInfo* wfi) +static void wf_cliprdr_process_cb_monitor_ready_event(wfContext* wfc) { } -static void wf_cliprdr_process_cb_data_request_event(wfInfo* wfi, RDP_CB_DATA_REQUEST_EVENT* event) +static void wf_cliprdr_process_cb_data_request_event(wfContext* wfc, RDP_CB_DATA_REQUEST_EVENT* event) { } -static void wf_cliprdr_process_cb_format_list_event(wfInfo* wfi, RDP_CB_FORMAT_LIST_EVENT* event) +static void wf_cliprdr_process_cb_format_list_event(wfContext* wfc, RDP_CB_FORMAT_LIST_EVENT* event) { } -static void wf_cliprdr_process_cb_data_response_event(wfInfo* wfi, RDP_CB_DATA_RESPONSE_EVENT* event) +static void wf_cliprdr_process_cb_data_response_event(wfContext* wfc, RDP_CB_DATA_RESPONSE_EVENT* event) { } -void wf_process_cliprdr_event(wfInfo* wfi, wMessage* event) +void wf_process_cliprdr_event(wfContext* wfc, wMessage* event) { switch (GetMessageType(event->id)) { case CliprdrChannel_MonitorReady: - wf_cliprdr_process_cb_monitor_ready_event(wfi); + wf_cliprdr_process_cb_monitor_ready_event(wfc); break; case CliprdrChannel_FormatList: - wf_cliprdr_process_cb_format_list_event(wfi, (RDP_CB_FORMAT_LIST_EVENT*) event); + wf_cliprdr_process_cb_format_list_event(wfc, (RDP_CB_FORMAT_LIST_EVENT*) event); break; case CliprdrChannel_DataRequest: - wf_cliprdr_process_cb_data_request_event(wfi, (RDP_CB_DATA_REQUEST_EVENT*) event); + wf_cliprdr_process_cb_data_request_event(wfc, (RDP_CB_DATA_REQUEST_EVENT*) event); break; case CliprdrChannel_DataResponse: - wf_cliprdr_process_cb_data_response_event(wfi, (RDP_CB_DATA_RESPONSE_EVENT*) event); + wf_cliprdr_process_cb_data_response_event(wfc, (RDP_CB_DATA_RESPONSE_EVENT*) event); break; default: @@ -84,27 +84,27 @@ void wf_process_cliprdr_event(wfInfo* wfi, wMessage* event) } } -BOOL wf_cliprdr_process_selection_notify(wfInfo* wfi, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) +BOOL wf_cliprdr_process_selection_notify(wfContext* wfc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return TRUE; } -BOOL wf_cliprdr_process_selection_request(wfInfo* wfi, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) +BOOL wf_cliprdr_process_selection_request(wfContext* wfc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return TRUE; } -BOOL wf_cliprdr_process_selection_clear(wfInfo* wfi, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) +BOOL wf_cliprdr_process_selection_clear(wfContext* wfc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return TRUE; } -BOOL wf_cliprdr_process_property_notify(wfInfo* wfi, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) +BOOL wf_cliprdr_process_property_notify(wfContext* wfc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return TRUE; } -void wf_cliprdr_check_owner(wfInfo* wfi) +void wf_cliprdr_check_owner(wfContext* wfc) { } diff --git a/client/Windows/wf_cliprdr.h b/client/Windows/wf_cliprdr.h index 2239a5d79..96a26e1be 100644 --- a/client/Windows/wf_cliprdr.h +++ b/client/Windows/wf_cliprdr.h @@ -21,13 +21,13 @@ #include "wf_interface.h" -void wf_cliprdr_init(wfInfo* wfi, rdpChannels* chanman); -void wf_cliprdr_uninit(wfInfo* wfi); -void wf_process_cliprdr_event(wfInfo* wfi, wMessage* event); -BOOL wf_cliprdr_process_selection_notify(wfInfo* wfi, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); -BOOL wf_cliprdr_process_selection_request(wfInfo* wfi, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); -BOOL wf_cliprdr_process_selection_clear(wfInfo* wfi, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); -BOOL wf_cliprdr_process_property_notify(wfInfo* wfi, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); -void wf_cliprdr_check_owner(wfInfo* wfi); +void wf_cliprdr_init(wfContext* wfc, rdpChannels* channels); +void wf_cliprdr_uninit(wfContext* wfc); +void wf_process_cliprdr_event(wfContext* wfc, wMessage* event); +BOOL wf_cliprdr_process_selection_notify(wfContext* wfc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); +BOOL wf_cliprdr_process_selection_request(wfContext* wfc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); +BOOL wf_cliprdr_process_selection_clear(wfContext* wfc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); +BOOL wf_cliprdr_process_property_notify(wfContext* wfc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); +void wf_cliprdr_check_owner(wfContext* wfc); #endif /* __WF_CLIPRDR_H */ diff --git a/client/Windows/wf_event.c b/client/Windows/wf_event.c index 279414583..c243d35da 100644 --- a/client/Windows/wf_event.c +++ b/client/Windows/wf_event.c @@ -37,12 +37,12 @@ static HWND g_focus_hWnd; #define X_POS(lParam) (lParam & 0xFFFF) #define Y_POS(lParam) ((lParam >> 16) & 0xFFFF) -BOOL wf_scale_blt(wfInfo* wfi, HDC hdc, int x, int y, int w, int h, HDC hdcSrc, int x1, int y1, DWORD rop); -void wf_scale_mouse_event(wfInfo* wfi, rdpInput* input, UINT16 flags, UINT16 x, UINT16 y); +BOOL wf_scale_blt(wfContext* wfc, HDC hdc, int x, int y, int w, int h, HDC hdcSrc, int x1, int y1, DWORD rop); +void wf_scale_mouse_event(wfContext* wfc, rdpInput* input, UINT16 flags, UINT16 x, UINT16 y); LRESULT CALLBACK wf_ll_kbd_proc(int nCode, WPARAM wParam, LPARAM lParam) { - wfInfo* wfi; + wfContext* wfc; DWORD rdp_scancode; rdpInput* input; PKBDLLHOOKSTRUCT p; @@ -57,26 +57,26 @@ LRESULT CALLBACK wf_ll_kbd_proc(int nCode, WPARAM wParam, LPARAM lParam) case WM_SYSKEYDOWN: case WM_KEYUP: case WM_SYSKEYUP: - wfi = (wfInfo*) GetWindowLongPtr(g_focus_hWnd, GWLP_USERDATA); + wfc = (wfContext*) GetWindowLongPtr(g_focus_hWnd, GWLP_USERDATA); p = (PKBDLLHOOKSTRUCT) lParam; - if (!wfi || !p) + if (!wfc || !p) return 1; - input = wfi->instance->input; + input = wfc->instance->input; rdp_scancode = MAKE_RDP_SCANCODE((BYTE) p->scanCode, p->flags & LLKHF_EXTENDED); DEBUG_KBD("keydown %d scanCode %04X flags %02X vkCode %02X", (wParam == WM_KEYDOWN), (BYTE) p->scanCode, p->flags, p->vkCode); - if (wfi->fs_toggle && + if (wfc->fs_toggle && ((p->vkCode == VK_RETURN) || (p->vkCode == VK_CANCEL)) && (GetAsyncKeyState(VK_CONTROL) & 0x8000) && (GetAsyncKeyState(VK_MENU) & 0x8000)) /* could also use flags & LLKHF_ALTDOWN */ { if (wParam == WM_KEYDOWN) { - wf_toggle_fullscreen(wfi); + wf_toggle_fullscreen(wfc); return 1; } } @@ -126,14 +126,14 @@ LRESULT CALLBACK wf_ll_kbd_proc(int nCode, WPARAM wParam, LPARAM lParam) return CallNextHookEx(NULL, nCode, wParam, lParam); } -static int wf_event_process_WM_MOUSEWHEEL(wfInfo* wfi, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) +static int wf_event_process_WM_MOUSEWHEEL(wfContext* wfc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { int delta; int flags; rdpInput* input; DefWindowProc(hWnd, Msg, wParam, lParam); - input = wfi->instance->input; + input = wfc->instance->input; delta = ((signed short) HIWORD(wParam)); /* GET_WHEEL_DELTA_WPARAM(wParam); */ if (delta > 0) @@ -150,11 +150,12 @@ static int wf_event_process_WM_MOUSEWHEEL(wfInfo* wfi, HWND hWnd, UINT Msg, WPAR return 0; } -void wf_sizing(wfInfo* wfi, WPARAM wParam, LPARAM lParam) +void wf_sizing(wfContext* wfc, WPARAM wParam, LPARAM lParam) { // Holding the CTRL key down while resizing the window will force the desktop aspect ratio. LPRECT rect; - if (wfi->instance->settings->SmartSizing && (GetAsyncKeyState(VK_CONTROL) & 0x8000)) + + if (wfc->instance->settings->SmartSizing && (GetAsyncKeyState(VK_CONTROL) & 0x8000)) { rect = (LPRECT) wParam; @@ -164,20 +165,20 @@ void wf_sizing(wfInfo* wfi, WPARAM wParam, LPARAM lParam) case WMSZ_RIGHT: case WMSZ_BOTTOMRIGHT: // Adjust height - rect->bottom = rect->top + wfi->height * (rect->right - rect->left) / wfi->instance->settings->DesktopWidth; + rect->bottom = rect->top + wfc->height * (rect->right - rect->left) / wfc->instance->settings->DesktopWidth; break; case WMSZ_TOP: case WMSZ_BOTTOM: case WMSZ_TOPRIGHT: // Adjust width - rect->right = rect->left + wfi->width * (rect->bottom - rect->top) / wfi->instance->settings->DesktopHeight; + rect->right = rect->left + wfc->width * (rect->bottom - rect->top) / wfc->instance->settings->DesktopHeight; break; case WMSZ_BOTTOMLEFT: case WMSZ_TOPLEFT: // adjust width - rect->left = rect->right - (wfi->width * (rect->bottom - rect->top) / wfi->instance->settings->DesktopHeight); + rect->left = rect->right - (wfc->width * (rect->bottom - rect->top) / wfc->instance->settings->DesktopHeight); break; } @@ -189,38 +190,38 @@ LRESULT CALLBACK wf_event_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam { HDC hdc; LONG ptr; - wfInfo* wfi; + wfContext* wfc; int x, y, w, h; PAINTSTRUCT ps; rdpInput* input; BOOL processed; - - RECT windowRect, clientRect; - MINMAXINFO *minmax; + RECT windowRect; + RECT clientRect; + MINMAXINFO* minmax; SCROLLINFO si; processed = TRUE; ptr = GetWindowLongPtr(hWnd, GWLP_USERDATA); - wfi = (wfInfo*) ptr; + wfc = (wfContext*) ptr; - if (wfi != NULL) + if (wfc != NULL) { - input = wfi->instance->input; + input = wfc->instance->input; switch (Msg) { case WM_MOVE: - if (!wfi->disablewindowtracking) + if (!wfc->disablewindowtracking) { int x = (int)(short) LOWORD(lParam); int y = (int)(short) HIWORD(lParam); - ((wfContext*) wfi->instance->context)->wfi->client_x = x; - ((wfContext*) wfi->instance->context)->wfi->client_y = y; + wfc->client_x = x; + wfc->client_y = y; } break; case WM_GETMINMAXINFO: - if (wfi->instance->settings->SmartSizing) + if (wfc->instance->settings->SmartSizing) { processed = FALSE; } @@ -229,41 +230,42 @@ LRESULT CALLBACK wf_event_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam // Set maximum window size for resizing minmax = (MINMAXINFO*) lParam; - wf_update_canvas_diff(wfi); - if (!wfi->fullscreen) + wf_update_canvas_diff(wfc); + + if (!wfc->fullscreen) { // add window decoration - minmax->ptMaxTrackSize.x = wfi->width + wfi->diff.x; - minmax->ptMaxTrackSize.y = wfi->height + wfi->diff.y; + minmax->ptMaxTrackSize.x = wfc->width + wfc->diff.x; + minmax->ptMaxTrackSize.y = wfc->height + wfc->diff.y; } } break; case WM_SIZING: - wf_sizing(wfi, lParam, wParam); + wf_sizing(wfc, lParam, wParam); break; case WM_SIZE: - GetWindowRect(wfi->hwnd, &windowRect); + GetWindowRect(wfc->hwnd, &windowRect); - if (!wfi->fullscreen) + if (!wfc->fullscreen) { - wfi->client_width = LOWORD(lParam); - wfi->client_height = HIWORD(lParam); - wfi->client_x = windowRect.left; - wfi->client_y = windowRect.top; + wfc->client_width = LOWORD(lParam); + wfc->client_height = HIWORD(lParam); + wfc->client_x = windowRect.left; + wfc->client_y = windowRect.top; } - wf_size_scrollbars(wfi, LOWORD(lParam), HIWORD(lParam)); + wf_size_scrollbars(wfc, LOWORD(lParam), HIWORD(lParam)); // Workaround: when the window is maximized, the call to "ShowScrollBars" returns TRUE but has no effect. - if (wParam == SIZE_MAXIMIZED && !wfi->fullscreen) - SetWindowPos(wfi->hwnd, HWND_TOP, 0, 0, windowRect.right - windowRect.left, windowRect.bottom - windowRect.top, SWP_NOMOVE | SWP_FRAMECHANGED); + if (wParam == SIZE_MAXIMIZED && !wfc->fullscreen) + SetWindowPos(wfc->hwnd, HWND_TOP, 0, 0, windowRect.right - windowRect.left, windowRect.bottom - windowRect.top, SWP_NOMOVE | SWP_FRAMECHANGED); break; case WM_EXITSIZEMOVE: - wf_size_scrollbars(wfi, wfi->client_width, wfi->client_height); + wf_size_scrollbars(wfc, wfc->client_width, wfc->client_height); break; case WM_ERASEBKGND: @@ -278,38 +280,38 @@ LRESULT CALLBACK wf_event_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam w = ps.rcPaint.right - ps.rcPaint.left + 1; h = ps.rcPaint.bottom - ps.rcPaint.top + 1; - wf_scale_blt(wfi, hdc, x, y, w, h, wfi->primary->hdc, x - wfi->offset_x + wfi->xCurrentScroll, y - wfi->offset_y + wfi->yCurrentScroll, SRCCOPY); + wf_scale_blt(wfc, hdc, x, y, w, h, wfc->primary->hdc, x - wfc->offset_x + wfc->xCurrentScroll, y - wfc->offset_y + wfc->yCurrentScroll, SRCCOPY); EndPaint(hWnd, &ps); break; case WM_LBUTTONDOWN: - wf_scale_mouse_event(wfi, input,PTR_FLAGS_DOWN | PTR_FLAGS_BUTTON1, X_POS(lParam) - wfi->offset_x, Y_POS(lParam) - wfi->offset_y); + wf_scale_mouse_event(wfc, input,PTR_FLAGS_DOWN | PTR_FLAGS_BUTTON1, X_POS(lParam) - wfc->offset_x, Y_POS(lParam) - wfc->offset_y); break; case WM_LBUTTONUP: - wf_scale_mouse_event(wfi, input, PTR_FLAGS_BUTTON1, X_POS(lParam) - wfi->offset_x, Y_POS(lParam) - wfi->offset_y); + wf_scale_mouse_event(wfc, input, PTR_FLAGS_BUTTON1, X_POS(lParam) - wfc->offset_x, Y_POS(lParam) - wfc->offset_y); break; case WM_RBUTTONDOWN: - wf_scale_mouse_event(wfi, input, PTR_FLAGS_DOWN | PTR_FLAGS_BUTTON2, X_POS(lParam) - wfi->offset_x, Y_POS(lParam) - wfi->offset_y); + wf_scale_mouse_event(wfc, input, PTR_FLAGS_DOWN | PTR_FLAGS_BUTTON2, X_POS(lParam) - wfc->offset_x, Y_POS(lParam) - wfc->offset_y); break; case WM_RBUTTONUP: - wf_scale_mouse_event(wfi, input, PTR_FLAGS_BUTTON2, X_POS(lParam) - wfi->offset_x, Y_POS(lParam) - wfi->offset_y); + wf_scale_mouse_event(wfc, input, PTR_FLAGS_BUTTON2, X_POS(lParam) - wfc->offset_x, Y_POS(lParam) - wfc->offset_y); break; case WM_MOUSEMOVE: - wf_scale_mouse_event(wfi, input, PTR_FLAGS_MOVE, X_POS(lParam) - wfi->offset_x, Y_POS(lParam) - wfi->offset_y); + wf_scale_mouse_event(wfc, input, PTR_FLAGS_MOVE, X_POS(lParam) - wfc->offset_x, Y_POS(lParam) - wfc->offset_y); break; case WM_MOUSEWHEEL: - wf_event_process_WM_MOUSEWHEEL(wfi, hWnd, Msg, wParam, lParam); + wf_event_process_WM_MOUSEWHEEL(wfc, hWnd, Msg, wParam, lParam); break; case WM_SETCURSOR: if (LOWORD(lParam) == HTCLIENT) - SetCursor(wfi->cursor); + SetCursor(wfc->cursor); else DefWindowProc(hWnd, Msg, wParam, lParam); break; @@ -324,22 +326,22 @@ LRESULT CALLBACK wf_event_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam { // User clicked the scroll bar shaft left of the scroll box. case SB_PAGEUP: - xNewPos = wfi->xCurrentScroll - 50; + xNewPos = wfc->xCurrentScroll - 50; break; // User clicked the scroll bar shaft right of the scroll box. case SB_PAGEDOWN: - xNewPos = wfi->xCurrentScroll + 50; + xNewPos = wfc->xCurrentScroll + 50; break; // User clicked the left arrow. case SB_LINEUP: - xNewPos = wfi->xCurrentScroll - 5; + xNewPos = wfc->xCurrentScroll - 5; break; // User clicked the right arrow. case SB_LINEDOWN: - xNewPos = wfi->xCurrentScroll + 5; + xNewPos = wfc->xCurrentScroll + 5; break; // User dragged the scroll box. @@ -352,37 +354,37 @@ LRESULT CALLBACK wf_event_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam break; default: - xNewPos = wfi->xCurrentScroll; + xNewPos = wfc->xCurrentScroll; } // New position must be between 0 and the screen width. xNewPos = MAX(0, xNewPos); - xNewPos = MIN(wfi->xMaxScroll, xNewPos); + xNewPos = MIN(wfc->xMaxScroll, xNewPos); // If the current position does not change, do not scroll. - if (xNewPos == wfi->xCurrentScroll) + if (xNewPos == wfc->xCurrentScroll) break; // Determine the amount scrolled (in pixels). - xDelta = xNewPos - wfi->xCurrentScroll; + xDelta = xNewPos - wfc->xCurrentScroll; // Reset the current scroll position. - wfi->xCurrentScroll = xNewPos; + wfc->xCurrentScroll = xNewPos; // Scroll the window. (The system repaints most of the // client area when ScrollWindowEx is called; however, it is // necessary to call UpdateWindow in order to repaint the // rectangle of pixels that were invalidated.) - ScrollWindowEx(wfi->hwnd, -xDelta, -yDelta, (CONST RECT *) NULL, + ScrollWindowEx(wfc->hwnd, -xDelta, -yDelta, (CONST RECT *) NULL, (CONST RECT *) NULL, (HRGN) NULL, (PRECT) NULL, SW_INVALIDATE); - UpdateWindow(wfi->hwnd); + UpdateWindow(wfc->hwnd); // Reset the scroll bar. si.cbSize = sizeof(si); si.fMask = SIF_POS; - si.nPos = wfi->xCurrentScroll; - SetScrollInfo(wfi->hwnd, SB_HORZ, &si, TRUE); + si.nPos = wfc->xCurrentScroll; + SetScrollInfo(wfc->hwnd, SB_HORZ, &si, TRUE); } break; @@ -396,22 +398,22 @@ LRESULT CALLBACK wf_event_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam { // User clicked the scroll bar shaft above the scroll box. case SB_PAGEUP: - yNewPos = wfi->yCurrentScroll - 50; + yNewPos = wfc->yCurrentScroll - 50; break; // User clicked the scroll bar shaft below the scroll box. case SB_PAGEDOWN: - yNewPos = wfi->yCurrentScroll + 50; + yNewPos = wfc->yCurrentScroll + 50; break; // User clicked the top arrow. case SB_LINEUP: - yNewPos = wfi->yCurrentScroll - 5; + yNewPos = wfc->yCurrentScroll - 5; break; // User clicked the bottom arrow. case SB_LINEDOWN: - yNewPos = wfi->yCurrentScroll + 5; + yNewPos = wfc->yCurrentScroll + 5; break; // User dragged the scroll box. @@ -425,37 +427,37 @@ LRESULT CALLBACK wf_event_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam break; default: - yNewPos = wfi->yCurrentScroll; + yNewPos = wfc->yCurrentScroll; } // New position must be between 0 and the screen height. yNewPos = MAX(0, yNewPos); - yNewPos = MIN(wfi->yMaxScroll, yNewPos); + yNewPos = MIN(wfc->yMaxScroll, yNewPos); // If the current position does not change, do not scroll. - if (yNewPos == wfi->yCurrentScroll) + if (yNewPos == wfc->yCurrentScroll) break; // Determine the amount scrolled (in pixels). - yDelta = yNewPos - wfi->yCurrentScroll; + yDelta = yNewPos - wfc->yCurrentScroll; // Reset the current scroll position. - wfi->yCurrentScroll = yNewPos; + wfc->yCurrentScroll = yNewPos; // Scroll the window. (The system repaints most of the // client area when ScrollWindowEx is called; however, it is // necessary to call UpdateWindow in order to repaint the // rectangle of pixels that were invalidated.) - ScrollWindowEx(wfi->hwnd, -xDelta, -yDelta, (CONST RECT *) NULL, + ScrollWindowEx(wfc->hwnd, -xDelta, -yDelta, (CONST RECT *) NULL, (CONST RECT *) NULL, (HRGN) NULL, (PRECT) NULL, SW_INVALIDATE); - UpdateWindow(wfi->hwnd); + UpdateWindow(wfc->hwnd); // Reset the scroll bar. si.cbSize = sizeof(si); si.fMask = SIF_POS; - si.nPos = wfi->yCurrentScroll; - SetScrollInfo(wfi->hwnd, SB_VERT, &si, TRUE); + si.nPos = wfc->yCurrentScroll; + SetScrollInfo(wfc->hwnd, SB_VERT, &si, TRUE); } break; @@ -463,9 +465,9 @@ LRESULT CALLBACK wf_event_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam { if (wParam == SYSCOMMAND_ID_SMARTSIZING) { - HMENU hMenu = GetSystemMenu(wfi->hwnd, FALSE); - freerdp_set_param_bool(wfi->instance->settings, FreeRDP_SmartSizing, !wfi->instance->settings->SmartSizing); - CheckMenuItem(hMenu, SYSCOMMAND_ID_SMARTSIZING, wfi->instance->settings->SmartSizing ? MF_CHECKED : MF_UNCHECKED); + HMENU hMenu = GetSystemMenu(wfc->hwnd, FALSE); + freerdp_set_param_bool(wfc->instance->settings, FreeRDP_SmartSizing, !wfc->instance->settings->SmartSizing); + CheckMenuItem(hMenu, SYSCOMMAND_ID_SMARTSIZING, wfc->instance->settings->SmartSizing ? MF_CHECKED : MF_UNCHECKED); } else @@ -496,7 +498,7 @@ LRESULT CALLBACK wf_event_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam case WM_SETCURSOR: if (LOWORD(lParam) == HTCLIENT) - SetCursor(wfi->hDefaultCursor); + SetCursor(wfc->hDefaultCursor); else DefWindowProc(hWnd, Msg, wParam, lParam); break; @@ -507,7 +509,7 @@ LRESULT CALLBACK wf_event_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam break; case WM_KILLFOCUS: - if (g_focus_hWnd == hWnd && wfi && !wfi->fullscreen) + if (g_focus_hWnd == hWnd && wfc && !wfc->fullscreen) { DEBUG_KBD("loosing focus %X", hWnd); g_focus_hWnd = NULL; @@ -535,20 +537,20 @@ LRESULT CALLBACK wf_event_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam return 0; } -BOOL wf_scale_blt(wfInfo* wfi, HDC hdc, int x, int y, int w, int h, HDC hdcSrc, int x1, int y1, DWORD rop) +BOOL wf_scale_blt(wfContext* wfc, HDC hdc, int x, int y, int w, int h, HDC hdcSrc, int x1, int y1, DWORD rop) { int ww, wh, dw, dh; - if (!wfi->client_width) - wfi->client_width = wfi->width; + if (!wfc->client_width) + wfc->client_width = wfc->width; - if (!wfi->client_height) - wfi->client_height = wfi->height; + if (!wfc->client_height) + wfc->client_height = wfc->height; - ww = wfi->client_width; - wh = wfi->client_height; - dw = wfi->instance->settings->DesktopWidth; - dh = wfi->instance->settings->DesktopHeight; + ww = wfc->client_width; + wh = wfc->client_height; + dw = wfc->instance->settings->DesktopWidth; + dh = wfc->instance->settings->DesktopHeight; if (!ww) ww = dw; @@ -556,38 +558,38 @@ BOOL wf_scale_blt(wfInfo* wfi, HDC hdc, int x, int y, int w, int h, HDC hdcSrc, if (!wh) wh = dh; - if (wfi->fullscreen || !wfi->instance->settings->SmartSizing || (ww == dw && wh == dh)) + if (wfc->fullscreen || !wfc->instance->settings->SmartSizing || (ww == dw && wh == dh)) { - return BitBlt(hdc, x, y, w, h, wfi->primary->hdc, x1, y1, SRCCOPY); + return BitBlt(hdc, x, y, w, h, wfc->primary->hdc, x1, y1, SRCCOPY); } else { SetStretchBltMode(hdc, HALFTONE); SetBrushOrgEx(hdc, 0, 0, NULL); - return StretchBlt(hdc, 0, 0, ww, wh, wfi->primary->hdc, 0, 0, dw, dh, SRCCOPY); + return StretchBlt(hdc, 0, 0, ww, wh, wfc->primary->hdc, 0, 0, dw, dh, SRCCOPY); } return TRUE; } -void wf_scale_mouse_event(wfInfo* wfi, rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) +void wf_scale_mouse_event(wfContext* wfc, rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) { int ww, wh, dw, dh; - if (!wfi->client_width) - wfi->client_width = wfi->width; + if (!wfc->client_width) + wfc->client_width = wfc->width; - if (!wfi->client_height) - wfi->client_height = wfi->height; + if (!wfc->client_height) + wfc->client_height = wfc->height; - ww = wfi->client_width; - wh = wfi->client_height; - dw = wfi->instance->settings->DesktopWidth; - dh = wfi->instance->settings->DesktopHeight; + ww = wfc->client_width; + wh = wfc->client_height; + dw = wfc->instance->settings->DesktopWidth; + dh = wfc->instance->settings->DesktopHeight; - if (!wfi->instance->settings->SmartSizing || (ww == dw) && (wh == dh)) - input->MouseEvent(input, flags, x + wfi->xCurrentScroll, y + wfi->yCurrentScroll); + if (!wfc->instance->settings->SmartSizing || (ww == dw) && (wh == dh)) + input->MouseEvent(input, flags, x + wfc->xCurrentScroll, y + wfc->yCurrentScroll); else - input->MouseEvent(input, flags, x * dw / ww + wfi->xCurrentScroll, y * dh / wh + wfi->yCurrentScroll); + input->MouseEvent(input, flags, x * dw / ww + wfc->xCurrentScroll, y * dh / wh + wfc->yCurrentScroll); } diff --git a/client/Windows/wf_gdi.c b/client/Windows/wf_gdi.c index a6736e539..41fae28d0 100644 --- a/client/Windows/wf_gdi.c +++ b/client/Windows/wf_gdi.c @@ -72,10 +72,10 @@ BOOL wf_set_rop2(HDC hdc, int rop2) return TRUE; } -wfBitmap* wf_glyph_new(wfInfo* wfi, GLYPH_DATA* glyph) +wfBitmap* wf_glyph_new(wfContext* wfc, GLYPH_DATA* glyph) { wfBitmap* glyph_bmp; - glyph_bmp = wf_image_new(wfi, glyph->cx, glyph->cy, 1, glyph->aj); + glyph_bmp = wf_image_new(wfc, glyph->cx, glyph->cy, 1, glyph->aj); return glyph_bmp; } @@ -84,7 +84,7 @@ void wf_glyph_free(wfBitmap* glyph) wf_image_free(glyph); } -BYTE* wf_glyph_convert(wfInfo* wfi, int width, int height, BYTE* data) +BYTE* wf_glyph_convert(wfContext* wfc, int width, int height, BYTE* data) { int indexx; int indexy; @@ -115,7 +115,7 @@ BYTE* wf_glyph_convert(wfInfo* wfi, int width, int height, BYTE* data) return cdata; } -HBRUSH wf_create_brush(wfInfo * wfi, rdpBrush* brush, UINT32 color, int bpp) +HBRUSH wf_create_brush(wfContext* wfc, rdpBrush* brush, UINT32 color, int bpp) { int i; HBRUSH br; @@ -135,7 +135,7 @@ HBRUSH wf_create_brush(wfInfo * wfi, rdpBrush* brush, UINT32 color, int bpp) { if (brush->bpp > 1) { - pattern = wf_create_dib(wfi, 8, 8, bpp, brush->data, NULL); + pattern = wf_create_dib(wfc, 8, 8, bpp, brush->data, NULL); lbr.lbHatch = (ULONG_PTR) pattern; } else @@ -143,7 +143,7 @@ HBRUSH wf_create_brush(wfInfo * wfi, rdpBrush* brush, UINT32 color, int bpp) for (i = 0; i != 8; i++) ipattern[7 - i] = brush->data[i]; - cdata = wf_glyph_convert(wfi, 8, 8, ipattern); + cdata = wf_glyph_convert(wfc, 8, 8, ipattern); pattern = CreateBitmap(8, 8, 1, 1, cdata); lbr.lbHatch = (ULONG_PTR) pattern; free(cdata); @@ -159,7 +159,7 @@ HBRUSH wf_create_brush(wfInfo * wfi, rdpBrush* brush, UINT32 color, int bpp) } br = CreateBrushIndirect(&lbr); - SetBrushOrgEx(wfi->drawing->hdc, brush->x, brush->y, NULL); + SetBrushOrgEx(wfc->drawing->hdc, brush->x, brush->y, NULL); if (pattern != NULL) DeleteObject(pattern); @@ -167,20 +167,20 @@ HBRUSH wf_create_brush(wfInfo * wfi, rdpBrush* brush, UINT32 color, int bpp) return br; } -void wf_scale_rect(wfInfo* wfi, RECT* source) +void wf_scale_rect(wfContext* wfc, RECT* source) { int ww, wh, dw, dh; - if (!wfi->client_width) - wfi->client_width = wfi->width; + if (!wfc->client_width) + wfc->client_width = wfc->width; - if (!wfi->client_height) - wfi->client_height = wfi->height; + if (!wfc->client_height) + wfc->client_height = wfc->height; - ww = wfi->client_width; - wh = wfi->client_height; - dw = wfi->instance->settings->DesktopWidth; - dh = wfi->instance->settings->DesktopHeight; + ww = wfc->client_width; + wh = wfc->client_height; + dw = wfc->instance->settings->DesktopWidth; + dh = wfc->instance->settings->DesktopHeight; if (!ww) ww = dw; @@ -188,7 +188,7 @@ void wf_scale_rect(wfInfo* wfi, RECT* source) if (!wh) wh = dh; - if (wfi->instance->settings->SmartSizing && (ww != dw || wh != dh)) + if (wfc->instance->settings->SmartSizing && (ww != dw || wh != dh)) { source->bottom = source->bottom * wh / dh + 20; source->top = source->top * wh / dh - 20; @@ -196,197 +196,194 @@ void wf_scale_rect(wfInfo* wfi, RECT* source) source->right = source->right * ww / dw + 20; } - source->bottom -= wfi->yCurrentScroll; - source->top -= wfi->yCurrentScroll; - source->left -= wfi->xCurrentScroll; - source->right -= wfi->xCurrentScroll; + source->bottom -= wfc->yCurrentScroll; + source->top -= wfc->yCurrentScroll; + source->left -= wfc->xCurrentScroll; + source->right -= wfc->xCurrentScroll; } -void wf_invalidate_region(wfInfo* wfi, int x, int y, int width, int height) +void wf_invalidate_region(wfContext* wfc, int x, int y, int width, int height) { RECT rect; - wfi->update_rect.left = x + wfi->offset_x; - wfi->update_rect.top = y + wfi->offset_y; - wfi->update_rect.right = wfi->update_rect.left + width; - wfi->update_rect.bottom = wfi->update_rect.top + height; + wfc->update_rect.left = x + wfc->offset_x; + wfc->update_rect.top = y + wfc->offset_y; + wfc->update_rect.right = wfc->update_rect.left + width; + wfc->update_rect.bottom = wfc->update_rect.top + height; - wf_scale_rect(wfi, &(wfi->update_rect)); - InvalidateRect(wfi->hwnd, &(wfi->update_rect), FALSE); + wf_scale_rect(wfc, &(wfc->update_rect)); + InvalidateRect(wfc->hwnd, &(wfc->update_rect), FALSE); rect.left = x; rect.right = width; rect.top = y; rect.bottom = height; - wf_scale_rect(wfi, &rect); - gdi_InvalidateRegion(wfi->hdc, rect.left, rect.top, rect.right, rect.bottom); + wf_scale_rect(wfc, &rect); + gdi_InvalidateRegion(wfc->hdc, rect.left, rect.top, rect.right, rect.bottom); } -void wf_update_offset(wfInfo* wfi) +void wf_update_offset(wfContext* wfc) { - if (wfi->fullscreen) + if (wfc->fullscreen) { - if (wfi->instance->settings->UseMultimon) + if (wfc->instance->settings->UseMultimon) { int x = GetSystemMetrics(SM_XVIRTUALSCREEN); int y = GetSystemMetrics(SM_YVIRTUALSCREEN); int w = GetSystemMetrics(SM_CXVIRTUALSCREEN); int h = GetSystemMetrics(SM_CYVIRTUALSCREEN); - wfi->offset_x = (w - wfi->width) / 2; - if (wfi->offset_x < x) - wfi->offset_x = x; - wfi->offset_y = (h - wfi->height) / 2; - if (wfi->offset_y < y) - wfi->offset_y = y; + wfc->offset_x = (w - wfc->width) / 2; + if (wfc->offset_x < x) + wfc->offset_x = x; + wfc->offset_y = (h - wfc->height) / 2; + if (wfc->offset_y < y) + wfc->offset_y = y; } else { - wfi->offset_x = (GetSystemMetrics(SM_CXSCREEN) - wfi->width) / 2; - if (wfi->offset_x < 0) - wfi->offset_x = 0; - wfi->offset_y = (GetSystemMetrics(SM_CYSCREEN) - wfi->height) / 2; - if (wfi->offset_y < 0) - wfi->offset_y = 0; + wfc->offset_x = (GetSystemMetrics(SM_CXSCREEN) - wfc->width) / 2; + if (wfc->offset_x < 0) + wfc->offset_x = 0; + wfc->offset_y = (GetSystemMetrics(SM_CYSCREEN) - wfc->height) / 2; + if (wfc->offset_y < 0) + wfc->offset_y = 0; } } else { - wfi->offset_x = 0; - wfi->offset_y = 0; + wfc->offset_x = 0; + wfc->offset_y = 0; } } -void wf_resize_window(wfInfo* wfi) +void wf_resize_window(wfContext* wfc) { - if (wfi->fullscreen) + if (wfc->fullscreen) { - if(wfi->instance->settings->UseMultimon) + if(wfc->instance->settings->UseMultimon) { int x = GetSystemMetrics(SM_XVIRTUALSCREEN); int y = GetSystemMetrics(SM_YVIRTUALSCREEN); int w = GetSystemMetrics(SM_CXVIRTUALSCREEN); int h = GetSystemMetrics(SM_CYVIRTUALSCREEN); - SetWindowLongPtr(wfi->hwnd, GWL_STYLE, WS_POPUP); - SetWindowPos(wfi->hwnd, HWND_TOP, x, y, w, h, SWP_FRAMECHANGED); + SetWindowLongPtr(wfc->hwnd, GWL_STYLE, WS_POPUP); + SetWindowPos(wfc->hwnd, HWND_TOP, x, y, w, h, SWP_FRAMECHANGED); } else { - SetWindowLongPtr(wfi->hwnd, GWL_STYLE, WS_POPUP); - SetWindowPos(wfi->hwnd, HWND_TOP, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), SWP_FRAMECHANGED); + SetWindowLongPtr(wfc->hwnd, GWL_STYLE, WS_POPUP); + SetWindowPos(wfc->hwnd, HWND_TOP, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), SWP_FRAMECHANGED); } } - else if (!wfi->instance->settings->Decorations) + else if (!wfc->instance->settings->Decorations) { RECT rc_wnd; RECT rc_client; - SetWindowLongPtr(wfi->hwnd, GWL_STYLE, WS_CHILD); + SetWindowLongPtr(wfc->hwnd, GWL_STYLE, WS_CHILD); /* Now resize to get full canvas size and room for caption and borders */ - SetWindowPos(wfi->hwnd, HWND_TOP, 0, 0, wfi->width, wfi->height, SWP_FRAMECHANGED); + SetWindowPos(wfc->hwnd, HWND_TOP, 0, 0, wfc->width, wfc->height, SWP_FRAMECHANGED); - wf_update_canvas_diff(wfi); - SetWindowPos(wfi->hwnd, HWND_TOP, -1, -1, wfi->width + wfi->diff.x, wfi->height + wfi->diff.y, SWP_NOMOVE | SWP_FRAMECHANGED); + wf_update_canvas_diff(wfc); + SetWindowPos(wfc->hwnd, HWND_TOP, -1, -1, wfc->width + wfc->diff.x, wfc->height + wfc->diff.y, SWP_NOMOVE | SWP_FRAMECHANGED); } else { RECT rc_wnd; RECT rc_client; - SetWindowLongPtr(wfi->hwnd, GWL_STYLE, WS_CAPTION | WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX | WS_SIZEBOX | WS_MAXIMIZEBOX); + SetWindowLongPtr(wfc->hwnd, GWL_STYLE, WS_CAPTION | WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX | WS_SIZEBOX | WS_MAXIMIZEBOX); - if (!wfi->client_height) - wfi->client_height = wfi->height; + if (!wfc->client_height) + wfc->client_height = wfc->height; - if (!wfi->client_width) - wfi->client_width = wfi->width; + if (!wfc->client_width) + wfc->client_width = wfc->width; - if (!wfi->client_x) - wfi->client_x = 10; + if (!wfc->client_x) + wfc->client_x = 10; - if (!wfi->client_y) - wfi->client_y = 10; + if (!wfc->client_y) + wfc->client_y = 10; - wf_update_canvas_diff(wfi); + wf_update_canvas_diff(wfc); /* Now resize to get full canvas size and room for caption and borders */ - SetWindowPos(wfi->hwnd, HWND_TOP, wfi->client_x, wfi->client_y, wfi->client_width + wfi->diff.x, wfi->client_height + wfi->diff.y, 0 /*SWP_FRAMECHANGED*/); - //wf_size_scrollbars(wfi, wfi->client_width, wfi->client_height); + SetWindowPos(wfc->hwnd, HWND_TOP, wfc->client_x, wfc->client_y, wfc->client_width + wfc->diff.x, wfc->client_height + wfc->diff.y, 0 /*SWP_FRAMECHANGED*/); + //wf_size_scrollbars(wfc, wfc->client_width, wfc->client_height); } - wf_update_offset(wfi); + wf_update_offset(wfc); } -void wf_toggle_fullscreen(wfInfo* wfi) +void wf_toggle_fullscreen(wfContext* wfc) { - ShowWindow(wfi->hwnd, SW_HIDE); - wfi->fullscreen = !wfi->fullscreen; + ShowWindow(wfc->hwnd, SW_HIDE); + wfc->fullscreen = !wfc->fullscreen; - if (wfi->fullscreen) + if (wfc->fullscreen) { - wfi->disablewindowtracking = TRUE; + wfc->disablewindowtracking = TRUE; } - SetParent(wfi->hwnd, wfi->fullscreen ? NULL : wfi->hWndParent); - wf_resize_window(wfi); - ShowWindow(wfi->hwnd, SW_SHOW); - SetForegroundWindow(wfi->hwnd); + SetParent(wfc->hwnd, wfc->fullscreen ? NULL : wfc->hWndParent); + wf_resize_window(wfc); + ShowWindow(wfc->hwnd, SW_SHOW); + SetForegroundWindow(wfc->hwnd); - if (!wfi->fullscreen) + if (!wfc->fullscreen) { // Reenable window tracking AFTER resizing it back, otherwise it can lean to repositioning errors. - wfi->disablewindowtracking = FALSE; + wfc->disablewindowtracking = FALSE; } } -void wf_gdi_palette_update(rdpContext* context, PALETTE_UPDATE* palette) +void wf_gdi_palette_update(wfContext* wfc, PALETTE_UPDATE* palette) { } -void wf_set_null_clip_rgn(wfInfo* wfi) +void wf_set_null_clip_rgn(wfContext* wfc) { - SelectClipRgn(wfi->drawing->hdc, NULL); + SelectClipRgn(wfc->drawing->hdc, NULL); } -void wf_set_clip_rgn(wfInfo* wfi, int x, int y, int width, int height) +void wf_set_clip_rgn(wfContext* wfc, int x, int y, int width, int height) { HRGN clip; clip = CreateRectRgn(x, y, x + width, y + height); - SelectClipRgn(wfi->drawing->hdc, clip); + SelectClipRgn(wfc->drawing->hdc, clip); DeleteObject(clip); } -void wf_gdi_set_bounds(rdpContext* context, rdpBounds* bounds) +void wf_gdi_set_bounds(wfContext* wfc, rdpBounds* bounds) { HRGN hrgn; - wfInfo* wfi = ((wfContext*) context)->wfi; if (bounds != NULL) { hrgn = CreateRectRgn(bounds->left, bounds->top, bounds->right + 1, bounds->bottom + 1); - SelectClipRgn(wfi->drawing->hdc, hrgn); + SelectClipRgn(wfc->drawing->hdc, hrgn); DeleteObject(hrgn); } else { - SelectClipRgn(wfi->drawing->hdc, NULL); + SelectClipRgn(wfc->drawing->hdc, NULL); } } -void wf_gdi_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt) +void wf_gdi_dstblt(wfContext* wfc, DSTBLT_ORDER* dstblt) { - wfInfo* wfi = ((wfContext*) context)->wfi; - - BitBlt(wfi->drawing->hdc, dstblt->nLeftRect, dstblt->nTopRect, + BitBlt(wfc->drawing->hdc, dstblt->nLeftRect, dstblt->nTopRect, dstblt->nWidth, dstblt->nHeight, NULL, 0, 0, gdi_rop3_code(dstblt->bRop)); - wf_invalidate_region(wfi, dstblt->nLeftRect, dstblt->nTopRect, + wf_invalidate_region(wfc, dstblt->nLeftRect, dstblt->nTopRect, dstblt->nWidth, dstblt->nHeight); } -void wf_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) +void wf_gdi_patblt(wfContext* wfc, PATBLT_ORDER* patblt) { HBRUSH brush; HBRUSH org_brush; @@ -395,78 +392,73 @@ void wf_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) UINT32 bgcolor; COLORREF org_bkcolor; COLORREF org_textcolor; - wfInfo* wfi = ((wfContext*) context)->wfi; - fgcolor = freerdp_color_convert_bgr(patblt->foreColor, wfi->srcBpp, wfi->dstBpp, wfi->clrconv); - bgcolor = freerdp_color_convert_bgr(patblt->backColor, wfi->srcBpp, wfi->dstBpp, wfi->clrconv); + fgcolor = freerdp_color_convert_bgr(patblt->foreColor, wfc->srcBpp, wfc->dstBpp, wfc->clrconv); + bgcolor = freerdp_color_convert_bgr(patblt->backColor, wfc->srcBpp, wfc->dstBpp, wfc->clrconv); - brush = wf_create_brush(wfi, &patblt->brush, fgcolor, wfi->srcBpp); - org_bkmode = SetBkMode(wfi->drawing->hdc, OPAQUE); - org_bkcolor = SetBkColor(wfi->drawing->hdc, bgcolor); - org_textcolor = SetTextColor(wfi->drawing->hdc, fgcolor); - org_brush = (HBRUSH)SelectObject(wfi->drawing->hdc, brush); + brush = wf_create_brush(wfc, &patblt->brush, fgcolor, wfc->srcBpp); + org_bkmode = SetBkMode(wfc->drawing->hdc, OPAQUE); + org_bkcolor = SetBkColor(wfc->drawing->hdc, bgcolor); + org_textcolor = SetTextColor(wfc->drawing->hdc, fgcolor); + org_brush = (HBRUSH)SelectObject(wfc->drawing->hdc, brush); - PatBlt(wfi->drawing->hdc, patblt->nLeftRect, patblt->nTopRect, + PatBlt(wfc->drawing->hdc, patblt->nLeftRect, patblt->nTopRect, patblt->nWidth, patblt->nHeight, gdi_rop3_code(patblt->bRop)); - SelectObject(wfi->drawing->hdc, org_brush); + SelectObject(wfc->drawing->hdc, org_brush); DeleteObject(brush); - SetBkMode(wfi->drawing->hdc, org_bkmode); - SetBkColor(wfi->drawing->hdc, org_bkcolor); - SetTextColor(wfi->drawing->hdc, org_textcolor); + SetBkMode(wfc->drawing->hdc, org_bkmode); + SetBkColor(wfc->drawing->hdc, org_bkcolor); + SetTextColor(wfc->drawing->hdc, org_textcolor); - if (wfi->drawing == wfi->primary) - wf_invalidate_region(wfi, patblt->nLeftRect, patblt->nTopRect, patblt->nWidth, patblt->nHeight); + if (wfc->drawing == wfc->primary) + wf_invalidate_region(wfc, patblt->nLeftRect, patblt->nTopRect, patblt->nWidth, patblt->nHeight); } -void wf_gdi_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt) +void wf_gdi_scrblt(wfContext* wfc, SCRBLT_ORDER* scrblt) { - wfInfo* wfi = ((wfContext*) context)->wfi; - - BitBlt(wfi->drawing->hdc, scrblt->nLeftRect, scrblt->nTopRect, - scrblt->nWidth, scrblt->nHeight, wfi->primary->hdc, + BitBlt(wfc->drawing->hdc, scrblt->nLeftRect, scrblt->nTopRect, + scrblt->nWidth, scrblt->nHeight, wfc->primary->hdc, scrblt->nXSrc, scrblt->nYSrc, gdi_rop3_code(scrblt->bRop)); - wf_invalidate_region(wfi, scrblt->nLeftRect, scrblt->nTopRect, + wf_invalidate_region(wfc, scrblt->nLeftRect, scrblt->nTopRect, scrblt->nWidth, scrblt->nHeight); } -void wf_gdi_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect) +void wf_gdi_opaque_rect(wfContext* wfc, OPAQUE_RECT_ORDER* opaque_rect) { RECT rect; HBRUSH brush; UINT32 brush_color; - wfInfo* wfi = ((wfContext*) context)->wfi; - brush_color = freerdp_color_convert_var_bgr(opaque_rect->color, wfi->srcBpp, wfi->dstBpp, wfi->clrconv); + brush_color = freerdp_color_convert_var_bgr(opaque_rect->color, wfc->srcBpp, wfc->dstBpp, wfc->clrconv); rect.left = opaque_rect->nLeftRect; rect.top = opaque_rect->nTopRect; rect.right = opaque_rect->nLeftRect + opaque_rect->nWidth; rect.bottom = opaque_rect->nTopRect + opaque_rect->nHeight; brush = CreateSolidBrush(brush_color); - FillRect(wfi->drawing->hdc, &rect, brush); + FillRect(wfc->drawing->hdc, &rect, brush); DeleteObject(brush); - if (wfi->drawing == wfi->primary) - wf_invalidate_region(wfi, rect.left, rect.top, rect.right - rect.left + 1, rect.bottom - rect.top + 1); + if (wfc->drawing == wfc->primary) + wf_invalidate_region(wfc, rect.left, rect.top, rect.right - rect.left + 1, rect.bottom - rect.top + 1); } -void wf_gdi_multi_opaque_rect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect) +void wf_gdi_multi_opaque_rect(wfContext* wfc, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect) { int i; RECT rect; HBRUSH brush; UINT32 brush_color; DELTA_RECT* rectangle; - wfInfo* wfi = ((wfContext*) context)->wfi; for (i = 1; i < (int) multi_opaque_rect->numRectangles + 1; i++) { rectangle = &multi_opaque_rect->rectangles[i]; - brush_color = freerdp_color_convert_var_bgr(multi_opaque_rect->color, wfi->srcBpp, wfi->dstBpp, wfi->clrconv); + brush_color = freerdp_color_convert_var_bgr(multi_opaque_rect->color, wfc->srcBpp, wfc->dstBpp, wfc->clrconv); rect.left = rectangle->left; rect.top = rectangle->top; @@ -475,46 +467,45 @@ void wf_gdi_multi_opaque_rect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* mult brush = CreateSolidBrush(brush_color); brush = CreateSolidBrush(brush_color); - FillRect(wfi->drawing->hdc, &rect, brush); + FillRect(wfc->drawing->hdc, &rect, brush); - if (wfi->drawing == wfi->primary) - wf_invalidate_region(wfi, rect.left, rect.top, rect.right - rect.left + 1, rect.bottom - rect.top + 1); + if (wfc->drawing == wfc->primary) + wf_invalidate_region(wfc, rect.left, rect.top, rect.right - rect.left + 1, rect.bottom - rect.top + 1); DeleteObject(brush); } } -void wf_gdi_line_to(rdpContext* context, LINE_TO_ORDER* line_to) +void wf_gdi_line_to(wfContext* wfc, LINE_TO_ORDER* line_to) { HPEN pen; HPEN org_pen; int x, y, w, h; UINT32 pen_color; - wfInfo* wfi = ((wfContext*) context)->wfi; - pen_color = freerdp_color_convert_bgr(line_to->penColor, wfi->srcBpp, wfi->dstBpp, wfi->clrconv); + pen_color = freerdp_color_convert_bgr(line_to->penColor, wfc->srcBpp, wfc->dstBpp, wfc->clrconv); pen = CreatePen(line_to->penStyle, line_to->penWidth, pen_color); - wf_set_rop2(wfi->drawing->hdc, line_to->bRop2); - org_pen = (HPEN) SelectObject(wfi->drawing->hdc, pen); + wf_set_rop2(wfc->drawing->hdc, line_to->bRop2); + org_pen = (HPEN) SelectObject(wfc->drawing->hdc, pen); - MoveToEx(wfi->drawing->hdc, line_to->nXStart, line_to->nYStart, NULL); - LineTo(wfi->drawing->hdc, line_to->nXEnd, line_to->nYEnd); + MoveToEx(wfc->drawing->hdc, line_to->nXStart, line_to->nYStart, NULL); + LineTo(wfc->drawing->hdc, line_to->nXEnd, line_to->nYEnd); x = (line_to->nXStart < line_to->nXEnd) ? line_to->nXStart : line_to->nXEnd; y = (line_to->nYStart < line_to->nYEnd) ? line_to->nYStart : line_to->nYEnd; w = (line_to->nXStart < line_to->nXEnd) ? (line_to->nXEnd - line_to->nXStart) : (line_to->nXStart - line_to->nXEnd); h = (line_to->nYStart < line_to->nYEnd) ? (line_to->nYEnd - line_to->nYStart) : (line_to->nYStart - line_to->nYEnd); - if (wfi->drawing == wfi->primary) - wf_invalidate_region(wfi, x, y, w, h); + if (wfc->drawing == wfc->primary) + wf_invalidate_region(wfc, x, y, w, h); - SelectObject(wfi->drawing->hdc, org_pen); + SelectObject(wfc->drawing->hdc, org_pen); DeleteObject(pen); } -void wf_gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline) +void wf_gdi_polyline(wfContext* wfc, POLYLINE_ORDER* polyline) { int i; POINT* pts; @@ -522,13 +513,12 @@ void wf_gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline) HPEN hpen; HPEN org_hpen; UINT32 pen_color; - wfInfo* wfi = ((wfContext*) context)->wfi; - pen_color = freerdp_color_convert_bgr(polyline->penColor, wfi->srcBpp, wfi->dstBpp, wfi->clrconv); + pen_color = freerdp_color_convert_bgr(polyline->penColor, wfc->srcBpp, wfc->dstBpp, wfc->clrconv); hpen = CreatePen(0, 1, pen_color); - org_rop2 = wf_set_rop2(wfi->drawing->hdc, polyline->bRop2); - org_hpen = (HPEN) SelectObject(wfi->drawing->hdc, hpen); + org_rop2 = wf_set_rop2(wfc->drawing->hdc, polyline->bRop2); + org_hpen = (HPEN) SelectObject(wfc->drawing->hdc, hpen); if (polyline->numPoints > 0) { @@ -539,45 +529,43 @@ void wf_gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline) pts[i].x = polyline->points[i].x; pts[i].y = polyline->points[i].y; - if (wfi->drawing == wfi->primary) - wf_invalidate_region(wfi, pts[i].x, pts[i].y, pts[i].x + 1, pts[i].y + 1); + if (wfc->drawing == wfc->primary) + wf_invalidate_region(wfc, pts[i].x, pts[i].y, pts[i].x + 1, pts[i].y + 1); } - Polyline(wfi->drawing->hdc, pts, polyline->numPoints); + Polyline(wfc->drawing->hdc, pts, polyline->numPoints); free(pts); } - SelectObject(wfi->drawing->hdc, org_hpen); - wf_set_rop2(wfi->drawing->hdc, org_rop2); + SelectObject(wfc->drawing->hdc, org_hpen); + wf_set_rop2(wfc->drawing->hdc, org_rop2); DeleteObject(hpen); } -void wf_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) +void wf_gdi_memblt(wfContext* wfc, MEMBLT_ORDER* memblt) { wfBitmap* bitmap; - wfInfo* wfi = ((wfContext*) context)->wfi; bitmap = (wfBitmap*) memblt->bitmap; - BitBlt(wfi->drawing->hdc, memblt->nLeftRect, memblt->nTopRect, + BitBlt(wfc->drawing->hdc, memblt->nLeftRect, memblt->nTopRect, memblt->nWidth, memblt->nHeight, bitmap->hdc, memblt->nXSrc, memblt->nYSrc, gdi_rop3_code(memblt->bRop)); - if (wfi->drawing == wfi->primary) - wf_invalidate_region(wfi, memblt->nLeftRect, memblt->nTopRect, memblt->nWidth, memblt->nHeight); + if (wfc->drawing == wfc->primary) + wf_invalidate_region(wfc, memblt->nLeftRect, memblt->nTopRect, memblt->nWidth, memblt->nHeight); } -void wf_gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* surface_bits_command) +void wf_gdi_surface_bits(wfContext* wfc, SURFACE_BITS_COMMAND* surface_bits_command) { int i, j; int tx, ty; char* tile_bitmap; RFX_MESSAGE* message; BITMAPINFO bitmap_info; - wfInfo* wfi = ((wfContext*) context)->wfi; - RFX_CONTEXT* rfx_context = (RFX_CONTEXT*) wfi->rfx_context; - NSC_CONTEXT* nsc_context = (NSC_CONTEXT*) wfi->nsc_context; + RFX_CONTEXT* rfx_context = (RFX_CONTEXT*) wfc->rfx_context; + NSC_CONTEXT* nsc_context = (NSC_CONTEXT*) wfc->nsc_context; tile_bitmap = (char*) malloc(32); ZeroMemory(tile_bitmap, 32); @@ -592,27 +580,27 @@ void wf_gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* surface_bits tx = message->tiles[i]->x + surface_bits_command->destLeft; ty = message->tiles[i]->y + surface_bits_command->destTop; - freerdp_image_convert(message->tiles[i]->data, wfi->tile->pdata, 64, 64, 32, 32, wfi->clrconv); + freerdp_image_convert(message->tiles[i]->data, wfc->tile->pdata, 64, 64, 32, 32, wfc->clrconv); for (j = 0; j < message->num_rects; j++) { - wf_set_clip_rgn(wfi, + wf_set_clip_rgn(wfc, surface_bits_command->destLeft + message->rects[j].x, surface_bits_command->destTop + message->rects[j].y, message->rects[j].width, message->rects[j].height); - BitBlt(wfi->primary->hdc, tx, ty, 64, 64, wfi->tile->hdc, 0, 0, SRCCOPY); + BitBlt(wfc->primary->hdc, tx, ty, 64, 64, wfc->tile->hdc, 0, 0, SRCCOPY); } } - wf_set_null_clip_rgn(wfi); + wf_set_null_clip_rgn(wfc); /* invalidate regions */ for (i = 0; i < message->num_rects; i++) { tx = surface_bits_command->destLeft + message->rects[i].x; ty = surface_bits_command->destTop + message->rects[i].y; - wf_invalidate_region(wfi, tx, ty, message->rects[i].width, message->rects[i].height); + wf_invalidate_region(wfc, tx, ty, message->rects[i].width, message->rects[i].height); } rfx_message_free(rfx_context, message); @@ -628,10 +616,10 @@ void wf_gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* surface_bits bitmap_info.bmiHeader.biPlanes = 1; bitmap_info.bmiHeader.biBitCount = surface_bits_command->bpp; bitmap_info.bmiHeader.biCompression = BI_RGB; - SetDIBitsToDevice(wfi->primary->hdc, surface_bits_command->destLeft, surface_bits_command->destTop, + SetDIBitsToDevice(wfc->primary->hdc, surface_bits_command->destLeft, surface_bits_command->destTop, surface_bits_command->width, surface_bits_command->height, 0, 0, 0, surface_bits_command->height, nsc_context->bmpdata, &bitmap_info, DIB_RGB_COLORS); - wf_invalidate_region(wfi, surface_bits_command->destLeft, surface_bits_command->destTop, + wf_invalidate_region(wfc, surface_bits_command->destLeft, surface_bits_command->destTop, surface_bits_command->width, surface_bits_command->height); } else if (surface_bits_command->codecID == RDP_CODEC_ID_NONE) @@ -643,10 +631,10 @@ void wf_gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* surface_bits bitmap_info.bmiHeader.biPlanes = 1; bitmap_info.bmiHeader.biBitCount = surface_bits_command->bpp; bitmap_info.bmiHeader.biCompression = BI_RGB; - SetDIBitsToDevice(wfi->primary->hdc, surface_bits_command->destLeft, surface_bits_command->destTop, + SetDIBitsToDevice(wfc->primary->hdc, surface_bits_command->destLeft, surface_bits_command->destTop, surface_bits_command->width, surface_bits_command->height, 0, 0, 0, surface_bits_command->height, surface_bits_command->bitmapData, &bitmap_info, DIB_RGB_COLORS); - wf_invalidate_region(wfi, surface_bits_command->destLeft, surface_bits_command->destTop, + wf_invalidate_region(wfc, surface_bits_command->destLeft, surface_bits_command->destTop, surface_bits_command->width, surface_bits_command->height); } else @@ -658,16 +646,17 @@ void wf_gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* surface_bits free(tile_bitmap); } -void wf_gdi_surface_frame_marker(rdpContext* context, SURFACE_FRAME_MARKER* surface_frame_marker) +void wf_gdi_surface_frame_marker(wfContext* wfc, SURFACE_FRAME_MARKER* surface_frame_marker) { - wfInfo* wfi; + rdpContext* context; rdpSettings* settings; - wfi = ((wfContext*) context)->wfi; - settings = wfi->instance->settings; + context = (rdpContext*) wfc; + settings = wfc->instance->settings; + if (surface_frame_marker->frameAction == SURFACECMD_FRAMEACTION_END && settings->FrameAcknowledge > 0) { - IFCALL(wfi->instance->update->SurfaceFrameAcknowledge, context, surface_frame_marker->frameId); + IFCALL(context->instance->update->SurfaceFrameAcknowledge, context, surface_frame_marker->frameId); } } @@ -678,19 +667,19 @@ void wf_gdi_register_update_callbacks(rdpUpdate* update) update->Palette = wf_gdi_palette_update; update->SetBounds = wf_gdi_set_bounds; - primary->DstBlt = wf_gdi_dstblt; - primary->PatBlt = wf_gdi_patblt; - primary->ScrBlt = wf_gdi_scrblt; - primary->OpaqueRect = wf_gdi_opaque_rect; + primary->DstBlt = (pDstBlt) wf_gdi_dstblt; + primary->PatBlt = (pPatBlt) wf_gdi_patblt; + primary->ScrBlt = (pScrBlt) wf_gdi_scrblt; + primary->OpaqueRect = (pOpaqueRect) wf_gdi_opaque_rect; primary->DrawNineGrid = NULL; primary->MultiDstBlt = NULL; primary->MultiPatBlt = NULL; primary->MultiScrBlt = NULL; - primary->MultiOpaqueRect = wf_gdi_multi_opaque_rect; + primary->MultiOpaqueRect = (pMultiOpaqueRect) wf_gdi_multi_opaque_rect; primary->MultiDrawNineGrid = NULL; - primary->LineTo = wf_gdi_line_to; - primary->Polyline = wf_gdi_polyline; - primary->MemBlt = wf_gdi_memblt; + primary->LineTo = (pLineTo) wf_gdi_line_to; + primary->Polyline = (pPolyline) wf_gdi_polyline; + primary->MemBlt = (pMemBlt) wf_gdi_memblt; primary->Mem3Blt = NULL; primary->SaveBitmap = NULL; primary->GlyphIndex = NULL; @@ -705,20 +694,20 @@ void wf_gdi_register_update_callbacks(rdpUpdate* update) update->SurfaceFrameMarker = wf_gdi_surface_frame_marker; } -void wf_update_canvas_diff(wfInfo* wfi) +void wf_update_canvas_diff(wfContext* wfc) { RECT rc_client, rc_wnd; int dx, dy; - GetClientRect(wfi->hwnd, &rc_client); - GetWindowRect(wfi->hwnd, &rc_wnd); + GetClientRect(wfc->hwnd, &rc_client); + GetWindowRect(wfc->hwnd, &rc_wnd); dx = (rc_wnd.right - rc_wnd.left) - rc_client.right; dy = (rc_wnd.bottom - rc_wnd.top) - rc_client.bottom; - if (!wfi->disablewindowtracking) + if (!wfc->disablewindowtracking) { - wfi->diff.x = dx; - wfi->diff.y = dy; + wfc->diff.x = dx; + wfc->diff.y = dy; } -} \ No newline at end of file +} diff --git a/client/Windows/wf_gdi.h b/client/Windows/wf_gdi.h index b5cfa0721..b7ab1cfda 100644 --- a/client/Windows/wf_gdi.h +++ b/client/Windows/wf_gdi.h @@ -24,15 +24,15 @@ #include "wf_interface.h" -void wf_invalidate_region(wfInfo* wfi, int x, int y, int width, int height); -wfBitmap* wf_image_new(wfInfo* wfi, int width, int height, int bpp, BYTE* data); +void wf_invalidate_region(wfContext* wfc, int x, int y, int width, int height); +wfBitmap* wf_image_new(wfContext* wfc, int width, int height, int bpp, BYTE* data); void wf_image_free(wfBitmap* image); -void wf_update_offset(wfInfo* wfi); -void wf_resize_window(wfInfo* wfi); -void wf_toggle_fullscreen(wfInfo* wfi); +void wf_update_offset(wfContext* wfc); +void wf_resize_window(wfContext* wfc); +void wf_toggle_fullscreen(wfContext* wfc); void wf_gdi_register_update_callbacks(rdpUpdate* update); -void wf_update_canvas_diff(wfInfo* wfi); +void wf_update_canvas_diff(wfContext* wfc); #endif /* __WF_GDI_H */ diff --git a/client/Windows/wf_graphics.c b/client/Windows/wf_graphics.c index 9a7937215..98c42b468 100644 --- a/client/Windows/wf_graphics.c +++ b/client/Windows/wf_graphics.c @@ -21,12 +21,14 @@ #include "config.h" #endif +#include + #include #include "wf_gdi.h" #include "wf_graphics.h" -HBITMAP wf_create_dib(wfInfo* wfi, int width, int height, int bpp, BYTE* data, BYTE** pdata) +HBITMAP wf_create_dib(wfContext* wfc, int width, int height, int bpp, BYTE* data, BYTE** pdata) { HDC hdc; int negHeight; @@ -48,12 +50,12 @@ HBITMAP wf_create_dib(wfInfo* wfi, int width, int height, int bpp, BYTE* data, B bmi.bmiHeader.biWidth = width; bmi.bmiHeader.biHeight = negHeight; bmi.bmiHeader.biPlanes = 1; - bmi.bmiHeader.biBitCount = wfi->dstBpp; + bmi.bmiHeader.biBitCount = wfc->dstBpp; bmi.bmiHeader.biCompression = BI_RGB; bitmap = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, (void**) &cdata, NULL, 0); if (data != NULL) - freerdp_image_convert(data, cdata, width, height, bpp, wfi->dstBpp, wfi->clrconv); + freerdp_image_convert(data, cdata, width, height, bpp, wfc->dstBpp, wfc->clrconv); if (pdata != NULL) *pdata = cdata; @@ -64,7 +66,7 @@ HBITMAP wf_create_dib(wfInfo* wfi, int width, int height, int bpp, BYTE* data, B return bitmap; } -wfBitmap* wf_image_new(wfInfo* wfi, int width, int height, int bpp, BYTE* data) +wfBitmap* wf_image_new(wfContext* wfc, int width, int height, int bpp, BYTE* data) { HDC hdc; wfBitmap* image; @@ -73,7 +75,7 @@ wfBitmap* wf_image_new(wfInfo* wfi, int width, int height, int bpp, BYTE* data) image = (wfBitmap*) malloc(sizeof(wfBitmap)); image->hdc = CreateCompatibleDC(hdc); - image->bitmap = wf_create_dib(wfi, width, height, bpp, data, &(image->pdata)); + image->bitmap = wf_create_dib(wfc, width, height, bpp, data, &(image->pdata)); image->org_bitmap = (HBITMAP) SelectObject(image->hdc, image->bitmap); ReleaseDC(NULL, hdc); @@ -94,27 +96,26 @@ void wf_image_free(wfBitmap* image) /* Bitmap Class */ -void wf_Bitmap_New(rdpContext* context, rdpBitmap* bitmap) +void wf_Bitmap_New(wfContext* wfc, rdpBitmap* bitmap) { HDC hdc; wfBitmap* wf_bitmap = (wfBitmap*) bitmap; - wfInfo* wfi = ((wfContext*) context)->wfi; wf_bitmap = (wfBitmap*) bitmap; hdc = GetDC(NULL); wf_bitmap->hdc = CreateCompatibleDC(hdc); - if (bitmap->data == NULL) + if (!bitmap->data) wf_bitmap->bitmap = CreateCompatibleBitmap(hdc, bitmap->width, bitmap->height); else - wf_bitmap->bitmap = wf_create_dib(wfi, bitmap->width, bitmap->height, bitmap->bpp, bitmap->data, NULL); + wf_bitmap->bitmap = wf_create_dib(wfc, bitmap->width, bitmap->height, bitmap->bpp, bitmap->data, NULL); wf_bitmap->org_bitmap = (HBITMAP) SelectObject(wf_bitmap->hdc, wf_bitmap->bitmap); ReleaseDC(NULL, hdc); } -void wf_Bitmap_Free(rdpContext* context, rdpBitmap* bitmap) +void wf_Bitmap_Free(wfContext* wfc, rdpBitmap* bitmap) { wfBitmap* wf_bitmap = (wfBitmap*) bitmap; @@ -126,22 +127,21 @@ void wf_Bitmap_Free(rdpContext* context, rdpBitmap* bitmap) } } -void wf_Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap) +void wf_Bitmap_Paint(wfContext* wfc, rdpBitmap* bitmap) { int width, height; wfBitmap* wf_bitmap = (wfBitmap*) bitmap; - wfInfo* wfi = ((wfContext*) context)->wfi; width = bitmap->right - bitmap->left + 1; height = bitmap->bottom - bitmap->top + 1; - BitBlt(wfi->primary->hdc, bitmap->left, bitmap->top, + BitBlt(wfc->primary->hdc, bitmap->left, bitmap->top, width, height, wf_bitmap->hdc, 0, 0, SRCCOPY); - wf_invalidate_region(wfi, bitmap->left, bitmap->top, width, height); + wf_invalidate_region(wfc, bitmap->left, bitmap->top, width, height); } -void wf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, +void wf_Bitmap_Decompress(wfContext* wfc, rdpBitmap* bitmap, BYTE* data, int width, int height, int bpp, int length, BOOL compressed, int codec_id) { UINT16 size; @@ -174,19 +174,17 @@ void wf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, bitmap->bpp = bpp; } -void wf_Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, BOOL primary) +void wf_Bitmap_SetSurface(wfContext* wfc, rdpBitmap* bitmap, BOOL primary) { - wfInfo* wfi = ((wfContext*) context)->wfi; - if (primary) - wfi->drawing = wfi->primary; + wfc->drawing = wfc->primary; else - wfi->drawing = (wfBitmap*) bitmap; + wfc->drawing = (wfBitmap*) bitmap; } /* Pointer Class */ -void wf_Pointer_New(rdpContext* context, rdpPointer* pointer) +void wf_Pointer_New(wfContext* wfc, rdpPointer* pointer) { HCURSOR hCur; ICONINFO info; @@ -223,35 +221,35 @@ void wf_Pointer_New(rdpContext* context, rdpPointer* pointer) DeleteObject(info.hbmColor); } -void wf_Pointer_Free(rdpContext* context, rdpPointer* pointer) +void wf_Pointer_Free(wfContext* wfc, rdpPointer* pointer) { HCURSOR hCur; hCur = ((wfPointer*) pointer)->cursor; + if (hCur != 0) DestroyIcon(hCur); } -void wf_Pointer_Set(rdpContext* context, rdpPointer* pointer) +void wf_Pointer_Set(wfContext* wfc, rdpPointer* pointer) { - wfInfo* wfi; HCURSOR hCur; - wfi = ((wfContext*) context)->wfi; hCur = ((wfPointer*) pointer)->cursor; + if (hCur != NULL) { SetCursor(hCur); - wfi->cursor = hCur; + wfc->cursor = hCur; } } -void wf_Pointer_SetNull(rdpContext* context) +void wf_Pointer_SetNull(wfContext* wfc) { } -void wf_Pointer_SetDefault(rdpContext* context) +void wf_Pointer_SetDefault(wfContext* wfc) { } @@ -263,21 +261,21 @@ void wf_register_graphics(rdpGraphics* graphics) rdpBitmap bitmap; rdpPointer pointer; - memset(&bitmap, 0, sizeof(rdpBitmap)); + ZeroMemory(&bitmap, sizeof(rdpBitmap)); bitmap.size = sizeof(wfBitmap); - bitmap.New = wf_Bitmap_New; - bitmap.Free = wf_Bitmap_Free; - bitmap.Paint = wf_Bitmap_Paint; - bitmap.Decompress = wf_Bitmap_Decompress; - bitmap.SetSurface = wf_Bitmap_SetSurface; + bitmap.New = (pBitmap_New) wf_Bitmap_New; + bitmap.Free = (pBitmap_Free) wf_Bitmap_Free; + bitmap.Paint = (pBitmap_Paint) wf_Bitmap_Paint; + bitmap.Decompress = (pBitmap_Decompress) wf_Bitmap_Decompress; + bitmap.SetSurface = (pBitmap_SetSurface) wf_Bitmap_SetSurface; - memset(&pointer, 0, sizeof(rdpPointer)); + ZeroMemory(&pointer, sizeof(rdpPointer)); pointer.size = sizeof(wfPointer); - pointer.New = wf_Pointer_New; - pointer.Free = wf_Pointer_Free; - pointer.Set = wf_Pointer_Set; - pointer.SetNull = wf_Pointer_SetNull; - pointer.SetDefault = wf_Pointer_SetDefault; + pointer.New = (pPointer_New) wf_Pointer_New; + pointer.Free = (pPointer_Free) wf_Pointer_Free; + pointer.Set = (pPointer_Set) wf_Pointer_Set; + pointer.SetNull = (pPointer_SetNull) wf_Pointer_SetNull; + pointer.SetDefault = (pPointer_SetDefault) wf_Pointer_SetDefault; graphics_register_bitmap(graphics, &bitmap); graphics_register_pointer(graphics, &pointer); diff --git a/client/Windows/wf_graphics.h b/client/Windows/wf_graphics.h index 0a4c6cded..a27c6a679 100644 --- a/client/Windows/wf_graphics.h +++ b/client/Windows/wf_graphics.h @@ -22,8 +22,8 @@ #include "wf_interface.h" -HBITMAP wf_create_dib(wfInfo* wfi, int width, int height, int bpp, BYTE* data, BYTE** pdata); -wfBitmap* wf_image_new(wfInfo* wfi, int width, int height, int bpp, BYTE* data); +HBITMAP wf_create_dib(wfContext* wfc, int width, int height, int bpp, BYTE* data, BYTE** pdata); +wfBitmap* wf_image_new(wfContext* wfc, int width, int height, int bpp, BYTE* data); void wf_image_free(wfBitmap* image); void wf_register_graphics(rdpGraphics* graphics); diff --git a/client/Windows/wf_interface.c b/client/Windows/wf_interface.c index 51b43afae..9ae2de7df 100644 --- a/client/Windows/wf_interface.c +++ b/client/Windows/wf_interface.c @@ -57,46 +57,7 @@ #include "resource.h" -wfInfo* wf_wfi_new() -{ - wfInfo* wfi; - - wfi = (wfInfo*) malloc(sizeof(wfInfo)); - ZeroMemory(wfi, sizeof(wfInfo)); - - return wfi; -} - -void wf_wfi_free(wfInfo* wfi) -{ - free(wfi); -} - -void wf_context_new(freerdp* instance, rdpContext* context) -{ - wfInfo* wfi; - - context->channels = freerdp_channels_new(); - - wfi = wf_wfi_new(); - - ((wfContext*) context)->wfi = wfi; - wfi->instance = instance; - - // Register callbacks - instance->context->client->OnParamChange = wf_on_param_change; -} - -void wf_context_free(freerdp* instance, rdpContext* context) -{ - if (context->cache) - cache_free(context->cache); - - freerdp_channels_free(context->channels); - - wf_wfi_free(((wfContext*) context)->wfi); - ((wfContext*) context)->wfi = NULL; -} +void wf_size_scrollbars(wfContext* wfc, int client_width, int client_height); int wf_create_console(void) { @@ -109,26 +70,24 @@ int wf_create_console(void) return 0; } -void wf_sw_begin_paint(rdpContext* context) +void wf_sw_begin_paint(wfContext* wfc) { - rdpGdi* gdi = context->gdi; + rdpGdi* gdi = ((rdpContext*) wfc)->gdi; gdi->primary->hdc->hwnd->invalid->null = 1; gdi->primary->hdc->hwnd->ninvalid = 0; } -void wf_sw_end_paint(rdpContext* context) +void wf_sw_end_paint(wfContext* wfc) { int i; rdpGdi* gdi; - wfInfo* wfi; INT32 x, y; UINT32 w, h; int ninvalid; RECT update_rect; HGDI_RGN cinvalid; - gdi = context->gdi; - wfi = ((wfContext*) context)->wfi; + gdi = ((rdpContext*) wfc)->gdi; if (gdi->primary->hdc->hwnd->ninvalid < 1) return; @@ -148,108 +107,105 @@ void wf_sw_end_paint(rdpContext* context) update_rect.right = x + w - 1; update_rect.bottom = y + h - 1; - InvalidateRect(wfi->hwnd, &update_rect, FALSE); + InvalidateRect(wfc->hwnd, &update_rect, FALSE); } } -void wf_sw_desktop_resize(rdpContext* context) +void wf_sw_desktop_resize(wfContext* wfc) { - wfInfo* wfi; rdpGdi* gdi; + rdpContext* context; rdpSettings* settings; - wfi = ((wfContext*) context)->wfi; - settings = wfi->instance->settings; + context = (rdpContext*) wfc; + settings = wfc->instance->settings; gdi = context->gdi; - wfi->width = settings->DesktopWidth; - wfi->height = settings->DesktopHeight; - gdi_resize(gdi, wfi->width, wfi->height); + wfc->width = settings->DesktopWidth; + wfc->height = settings->DesktopHeight; + gdi_resize(gdi, wfc->width, wfc->height); - if (wfi->primary) + if (wfc->primary) { - wf_image_free(wfi->primary); - wfi->primary = wf_image_new(wfi, wfi->width, wfi->height, wfi->dstBpp, gdi->primary_buffer); + wf_image_free(wfc->primary); + wfc->primary = wf_image_new(wfc, wfc->width, wfc->height, wfc->dstBpp, gdi->primary_buffer); } } -void wf_hw_begin_paint(rdpContext* context) +void wf_hw_begin_paint(wfContext* wfc) { - wfInfo* wfi = ((wfContext*) context)->wfi; - wfi->hdc->hwnd->invalid->null = 1; - wfi->hdc->hwnd->ninvalid = 0; + wfc->hdc->hwnd->invalid->null = 1; + wfc->hdc->hwnd->ninvalid = 0; } -void wf_hw_end_paint(rdpContext* context) +void wf_hw_end_paint(wfContext* wfc) { } -void wf_hw_desktop_resize(rdpContext* context) +void wf_hw_desktop_resize(wfContext* wfc) { - wfInfo* wfi; BOOL same; RECT rect; rdpSettings* settings; - wfi = ((wfContext*) context)->wfi; - settings = wfi->instance->settings; + settings = wfc->instance->settings; - wfi->width = settings->DesktopWidth; - wfi->height = settings->DesktopHeight; + wfc->width = settings->DesktopWidth; + wfc->height = settings->DesktopHeight; - if (wfi->primary) + if (wfc->primary) { - same = (wfi->primary == wfi->drawing) ? TRUE : FALSE; + same = (wfc->primary == wfc->drawing) ? TRUE : FALSE; - wf_image_free(wfi->primary); + wf_image_free(wfc->primary); - wfi->primary = wf_image_new(wfi, wfi->width, wfi->height, wfi->dstBpp, NULL); + wfc->primary = wf_image_new(wfc, wfc->width, wfc->height, wfc->dstBpp, NULL); if (same) - wfi->drawing = wfi->primary; + wfc->drawing = wfc->primary; } - if (wfi->fullscreen != TRUE) + if (wfc->fullscreen != TRUE) { - if (wfi->hwnd) - SetWindowPos(wfi->hwnd, HWND_TOP, -1, -1, wfi->width + wfi->diff.x, wfi->height + wfi->diff.y, SWP_NOMOVE); + if (wfc->hwnd) + SetWindowPos(wfc->hwnd, HWND_TOP, -1, -1, wfc->width + wfc->diff.x, wfc->height + wfc->diff.y, SWP_NOMOVE); } else { - wf_update_offset(wfi); - GetWindowRect(wfi->hwnd, &rect); - InvalidateRect(wfi->hwnd, &rect, TRUE); + wf_update_offset(wfc); + GetWindowRect(wfc->hwnd, &rect); + InvalidateRect(wfc->hwnd, &rect, TRUE); } } BOOL wf_pre_connect(freerdp* instance) { - int desktopWidth, desktopHeight; - wfInfo* wfi; - wfContext* context; + wfContext* wfc; + int desktopWidth; + int desktopHeight; + rdpContext* context; rdpSettings* settings; - context = (wfContext*) instance->context; - - wfi = context->wfi; - wfi->instance = instance; + context = instance->context; + wfc = (wfContext*) instance->context; + wfc->instance = instance; settings = instance->settings; if (settings->ConnectionFile) { - if (wfi->connectionRdpFile) + if (wfc->connectionRdpFile) { - freerdp_client_rdp_file_free(wfi->connectionRdpFile); + freerdp_client_rdp_file_free(wfc->connectionRdpFile); } - wfi->connectionRdpFile = freerdp_client_rdp_file_new(); + wfc->connectionRdpFile = freerdp_client_rdp_file_new(); fprintf(stderr, "Using connection file: %s\n", settings->ConnectionFile); - freerdp_client_parse_rdp_file(wfi->connectionRdpFile, settings->ConnectionFile); - freerdp_client_populate_settings_from_rdp_file(wfi->connectionRdpFile, settings); + freerdp_client_parse_rdp_file(wfc->connectionRdpFile, settings->ConnectionFile); + freerdp_client_populate_settings_from_rdp_file(wfc->connectionRdpFile, settings); } settings->OsMajorType = OSMAJORTYPE_WINDOWS; @@ -279,31 +235,31 @@ BOOL wf_pre_connect(freerdp* instance) settings->GlyphSupportLevel = GLYPH_SUPPORT_NONE; - wfi->fullscreen = settings->Fullscreen; - wfi->fs_toggle = 1; - wfi->sw_gdi = settings->SoftwareGdi; + wfc->fullscreen = settings->Fullscreen; + wfc->fs_toggle = 1; + wfc->sw_gdi = settings->SoftwareGdi; - wfi->clrconv = (HCLRCONV) malloc(sizeof(CLRCONV)); - ZeroMemory(wfi->clrconv, sizeof(CLRCONV)); + wfc->clrconv = (HCLRCONV) malloc(sizeof(CLRCONV)); + ZeroMemory(wfc->clrconv, sizeof(CLRCONV)); - wfi->clrconv->palette = NULL; - wfi->clrconv->alpha = FALSE; + wfc->clrconv->palette = NULL; + wfc->clrconv->alpha = FALSE; instance->context->cache = cache_new(settings); desktopWidth = settings->DesktopWidth; desktopHeight = settings->DesktopHeight; - if (wfi->percentscreen > 0) + if (wfc->percentscreen > 0) { - desktopWidth = (GetSystemMetrics(SM_CXSCREEN) * wfi->percentscreen) / 100; + desktopWidth = (GetSystemMetrics(SM_CXSCREEN) * wfc->percentscreen) / 100; settings->DesktopWidth = desktopWidth; - desktopHeight = (GetSystemMetrics(SM_CYSCREEN) * wfi->percentscreen) / 100; + desktopHeight = (GetSystemMetrics(SM_CYSCREEN) * wfc->percentscreen) / 100; settings->DesktopHeight = desktopHeight; } - if (wfi->fullscreen) + if (wfc->fullscreen) { if (settings->UseMultimon) { @@ -342,9 +298,9 @@ BOOL wf_pre_connect(freerdp* instance) return TRUE; } -void wf_add_system_menu(wfInfo* wfi) +void wf_add_system_menu(wfContext* wfc) { - HMENU hMenu = GetSystemMenu(wfi->hwnd, FALSE); + HMENU hMenu = GetSystemMenu(wfc->hwnd, FALSE); MENUITEMINFO item_info; ZeroMemory(&item_info, sizeof(MENUITEMINFO)); @@ -355,11 +311,11 @@ void wf_add_system_menu(wfInfo* wfi) item_info.fType = MFT_STRING; item_info.dwTypeData = _wcsdup(_T("Smart sizing")); item_info.cch = _wcslen(_T("Smart sizing")); - item_info.dwItemData = (ULONG_PTR) wfi; + item_info.dwItemData = (ULONG_PTR) wfc; InsertMenuItem(hMenu, 6, TRUE, &item_info); - if (wfi->instance->settings->SmartSizing) + if (wfc->instance->settings->SmartSizing) { CheckMenuItem(hMenu, SYSCOMMAND_ID_SMARTSIZING, MF_CHECKED); } @@ -368,59 +324,59 @@ void wf_add_system_menu(wfInfo* wfi) BOOL wf_post_connect(freerdp* instance) { rdpGdi* gdi; - wfInfo* wfi; DWORD dwStyle; rdpCache* cache; - wfContext* context; + wfContext* wfc; + rdpContext* context; WCHAR lpWindowName[64]; rdpSettings* settings; settings = instance->settings; - context = (wfContext*) instance->context; + context = instance->context; + wfc = (wfContext*) instance->context; cache = instance->context->cache; - wfi = context->wfi; - wfi->dstBpp = 32; - wfi->width = settings->DesktopWidth; - wfi->height = settings->DesktopHeight; + wfc->dstBpp = 32; + wfc->width = settings->DesktopWidth; + wfc->height = settings->DesktopHeight; - if (wfi->sw_gdi) + if (wfc->sw_gdi) { gdi_init(instance, CLRCONV_ALPHA | CLRCONV_INVERT | CLRBUF_32BPP, NULL); gdi = instance->context->gdi; - wfi->hdc = gdi->primary->hdc; - wfi->primary = wf_image_new(wfi, wfi->width, wfi->height, wfi->dstBpp, gdi->primary_buffer); + wfc->hdc = gdi->primary->hdc; + wfc->primary = wf_image_new(wfc, wfc->width, wfc->height, wfc->dstBpp, gdi->primary_buffer); } else { wf_gdi_register_update_callbacks(instance->update); - wfi->srcBpp = instance->settings->ColorDepth; - wfi->primary = wf_image_new(wfi, wfi->width, wfi->height, wfi->dstBpp, NULL); + wfc->srcBpp = instance->settings->ColorDepth; + wfc->primary = wf_image_new(wfc, wfc->width, wfc->height, wfc->dstBpp, NULL); - wfi->hdc = gdi_GetDC(); - wfi->hdc->bitsPerPixel = wfi->dstBpp; - wfi->hdc->bytesPerPixel = wfi->dstBpp / 8; + wfc->hdc = gdi_GetDC(); + wfc->hdc->bitsPerPixel = wfc->dstBpp; + wfc->hdc->bytesPerPixel = wfc->dstBpp / 8; - wfi->hdc->alpha = wfi->clrconv->alpha; - wfi->hdc->invert = wfi->clrconv->invert; + wfc->hdc->alpha = wfc->clrconv->alpha; + wfc->hdc->invert = wfc->clrconv->invert; - wfi->hdc->hwnd = (HGDI_WND) malloc(sizeof(GDI_WND)); - wfi->hdc->hwnd->invalid = gdi_CreateRectRgn(0, 0, 0, 0); - wfi->hdc->hwnd->invalid->null = 1; + wfc->hdc->hwnd = (HGDI_WND) malloc(sizeof(GDI_WND)); + wfc->hdc->hwnd->invalid = gdi_CreateRectRgn(0, 0, 0, 0); + wfc->hdc->hwnd->invalid->null = 1; - wfi->hdc->hwnd->count = 32; - wfi->hdc->hwnd->cinvalid = (HGDI_RGN) malloc(sizeof(GDI_RGN) * wfi->hdc->hwnd->count); - wfi->hdc->hwnd->ninvalid = 0; + wfc->hdc->hwnd->count = 32; + wfc->hdc->hwnd->cinvalid = (HGDI_RGN) malloc(sizeof(GDI_RGN) * wfc->hdc->hwnd->count); + wfc->hdc->hwnd->ninvalid = 0; if (settings->RemoteFxCodec) { - wfi->tile = wf_image_new(wfi, 64, 64, 32, NULL); - wfi->rfx_context = rfx_context_new(); + wfc->tile = wf_image_new(wfc, 64, 64, 32, NULL); + wfc->rfx_context = rfx_context_new(); } if (settings->NSCodec) { - wfi->nsc_context = nsc_context_new(); + wfc->nsc_context = nsc_context_new(); } } @@ -436,40 +392,40 @@ BOOL wf_post_connect(freerdp* instance) else dwStyle = 0; - if (!wfi->hwnd) + if (!wfc->hwnd) { - wfi->hwnd = CreateWindowEx((DWORD) NULL, wfi->wndClassName, lpWindowName, dwStyle, - 0, 0, 0, 0, wfi->hWndParent, NULL, wfi->hInstance, NULL); + wfc->hwnd = CreateWindowEx((DWORD) NULL, wfc->wndClassName, lpWindowName, dwStyle, + 0, 0, 0, 0, wfc->hWndParent, NULL, wfc->hInstance, NULL); - SetWindowLongPtr(wfi->hwnd, GWLP_USERDATA, (LONG_PTR) wfi); + SetWindowLongPtr(wfc->hwnd, GWLP_USERDATA, (LONG_PTR) wfc); } - wf_resize_window(wfi); + wf_resize_window(wfc); - wf_add_system_menu(wfi); + wf_add_system_menu(wfc); - BitBlt(wfi->primary->hdc, 0, 0, wfi->width, wfi->height, NULL, 0, 0, BLACKNESS); - wfi->drawing = wfi->primary; + BitBlt(wfc->primary->hdc, 0, 0, wfc->width, wfc->height, NULL, 0, 0, BLACKNESS); + wfc->drawing = wfc->primary; - ShowWindow(wfi->hwnd, SW_SHOWNORMAL); - UpdateWindow(wfi->hwnd); + ShowWindow(wfc->hwnd, SW_SHOWNORMAL); + UpdateWindow(wfc->hwnd); - if (wfi->sw_gdi) + if (wfc->sw_gdi) { - instance->update->BeginPaint = wf_sw_begin_paint; - instance->update->EndPaint = wf_sw_end_paint; - instance->update->DesktopResize = wf_sw_desktop_resize; + instance->update->BeginPaint = (pBeginPaint) wf_sw_begin_paint; + instance->update->EndPaint = (pEndPaint) wf_sw_end_paint; + instance->update->DesktopResize = (pDesktopResize) wf_sw_desktop_resize; } else { - instance->update->BeginPaint = wf_hw_begin_paint; - instance->update->EndPaint = wf_hw_end_paint; - instance->update->DesktopResize = wf_hw_desktop_resize; + instance->update->BeginPaint = (pBeginPaint) wf_hw_begin_paint; + instance->update->EndPaint = (pEndPaint) wf_hw_end_paint; + instance->update->DesktopResize = (pDesktopResize) wf_hw_desktop_resize; } pointer_cache_register_callbacks(instance->update); - if (wfi->sw_gdi != TRUE) + if (wfc->sw_gdi != TRUE) { brush_cache_register_callbacks(instance->update); bitmap_cache_register_callbacks(instance->update); @@ -480,13 +436,7 @@ BOOL wf_post_connect(freerdp* instance) freerdp_channels_post_connect(instance->context->channels, instance); - wf_cliprdr_init(wfi, instance->context->channels); - - // Callback - if (wfi->client_callback_func != NULL) - { - wfi->client_callback_func(wfi, CALLBACK_TYPE_CONNECTED, 0, 0); - } + wf_cliprdr_init(wfc, instance->context->channels); return TRUE; } @@ -600,7 +550,7 @@ BOOL wf_check_fds(freerdp* instance) return TRUE; } -DWORD WINAPI wf_thread(LPVOID lpParam) +DWORD WINAPI wf_client_thread(LPVOID lpParam) { MSG msg; int index; @@ -614,10 +564,12 @@ DWORD WINAPI wf_thread(LPVOID lpParam) void* wfds[32]; int fds_count; HANDLE fds[64]; + wfContext* wfc; freerdp* instance; rdpChannels* channels; instance = (freerdp*) lpParam; + wfc = (wfContext*) instance->context; ZeroMemory(rfds, sizeof(rfds)); ZeroMemory(wfds, sizeof(wfds)); @@ -704,11 +656,11 @@ DWORD WINAPI wf_thread(LPVOID lpParam) { if ((msg.message == WM_SETFOCUS) && (msg.lParam == 1)) { - PostMessage(((wfContext*) instance->context)->wfi->hwnd, WM_SETFOCUS, 0, 0); + PostMessage(wfc->hwnd, WM_SETFOCUS, 0, 0); } else if ((msg.message == WM_KILLFOCUS) && (msg.lParam == 1)) { - PostMessage(((wfContext*) instance->context)->wfi->hwnd, WM_KILLFOCUS, 0, 0); + PostMessage(wfc->hwnd, WM_KILLFOCUS, 0, 0); } } @@ -717,10 +669,10 @@ DWORD WINAPI wf_thread(LPVOID lpParam) width = LOWORD(msg.lParam); height = HIWORD(msg.lParam); - //((wfContext*) instance->context)->wfi->client_width = width; - //((wfContext*) instance->context)->wfi->client_height = height; + //wfc->client_width = width; + //wfc->client_height = height; - SetWindowPos(((wfContext*) instance->context)->wfi->hwnd, HWND_TOP, 0, 0, width, height, SWP_FRAMECHANGED); + SetWindowPos(wfc->hwnd, HWND_TOP, 0, 0, width, height, SWP_FRAMECHANGED); } if ((msg_ret == 0) || (msg_ret == -1)) @@ -738,16 +690,12 @@ DWORD WINAPI wf_thread(LPVOID lpParam) } /* cleanup */ - ((wfContext*) instance->context)->wfi->mainThreadId = 0; + wfc->mainThreadId = 0; freerdp_channels_close(channels, instance); - freerdp_disconnect(instance); + freerdp_disconnect(instance); - // Callback - if (((wfContext*) instance->context)->wfi->client_callback_func != NULL) - { - ((wfContext*) instance->context)->wfi->client_callback_func(((wfContext*) instance->context)->wfi, CALLBACK_TYPE_DISCONNECTED, 12, 34); - } + printf("Main thread exited.\n"); return 0; } @@ -756,12 +704,12 @@ DWORD WINAPI wf_keyboard_thread(LPVOID lpParam) { MSG msg; BOOL status; - wfInfo* wfi; + wfContext* wfc; HHOOK hook_handle; - wfi = (wfInfo*) lpParam; + wfc = (wfContext*) lpParam; - hook_handle = SetWindowsHookEx(WH_KEYBOARD_LL, wf_ll_kbd_proc, wfi->hInstance, 0); + hook_handle = SetWindowsHookEx(WH_KEYBOARD_LL, wf_ll_kbd_proc, wfc->hInstance, 0); if (hook_handle) { @@ -786,12 +734,247 @@ DWORD WINAPI wf_keyboard_thread(LPVOID lpParam) fprintf(stderr, "failed to install keyboard hook\n"); } - wfi->keyboardThreadId = 0; + wfc->keyboardThreadId = 0; printf("Keyboard thread exited.\n"); + return (DWORD) NULL; } -int freerdp_client_global_init() +rdpSettings* freerdp_client_get_settings(wfContext* wfc) +{ + return wfc->instance->settings; +} + +int freerdp_client_focus_in(wfContext* wfc) +{ + PostThreadMessage(wfc->mainThreadId, WM_SETFOCUS, 0, 1); + return 0; +} + +int freerdp_client_focus_out(wfContext* wfc) +{ + PostThreadMessage(wfc->mainThreadId, WM_KILLFOCUS, 0, 1); + return 0; +} + +int freerdp_client_set_window_size(wfContext* wfc, int width, int height) +{ + if ((width != wfc->client_width) || (height != wfc->client_height)) + { + PostThreadMessage(wfc->mainThreadId, WM_SIZE, SIZE_RESTORED, ((UINT) height << 16) | (UINT) width); + } + + return 0; +} + +void wf_on_param_change(freerdp* instance, int id) +{ + RECT rect; + HMENU hMenu; + wfContext* wfc = (wfContext*) instance->context; + + // specific processing here + switch (id) + { + case FreeRDP_SmartSizing: + fprintf(stderr, "SmartSizing changed.\n"); + + if (!instance->settings->SmartSizing && (wfc->client_width > instance->settings->DesktopWidth || wfc->client_height > instance->settings->DesktopHeight)) + { + GetWindowRect(wfc->hwnd, &rect); + SetWindowPos(wfc->hwnd, HWND_TOP, 0, 0, MIN(wfc->client_width + wfc->offset_x, rect.right - rect.left), MIN(wfc->client_height + wfc->offset_y, rect.bottom - rect.top), SWP_NOMOVE | SWP_FRAMECHANGED); + wf_update_canvas_diff(wfc); + } + + hMenu = GetSystemMenu(wfc->hwnd, FALSE); + CheckMenuItem(hMenu, SYSCOMMAND_ID_SMARTSIZING, instance->settings->SmartSizing); + wf_size_scrollbars(wfc, wfc->client_width, wfc->client_height); + GetClientRect(wfc->hwnd, &rect); + InvalidateRect(wfc->hwnd, &rect, TRUE); + break; + + case FreeRDP_ConnectionType: + fprintf(stderr, "ConnectionType changed.\n"); + freerdp_set_connection_type(wfc->instance->settings, wfc->instance->settings->ConnectionType); + break; + } +} + +// TODO: Some of that code is a duplicate of wf_pre_connect. Refactor? +int freerdp_client_load_settings_from_rdp_file(wfContext* wfc, char* filename) +{ + rdpSettings* settings; + + settings = wfc->instance->settings; + + if (filename) + { + settings->ConnectionFile = _strdup(filename); + + // free old settings file + freerdp_client_rdp_file_free(wfc->connectionRdpFile); + wfc->connectionRdpFile = freerdp_client_rdp_file_new(); + + fprintf(stderr, "Using connection file: %s\n", settings->ConnectionFile); + + if (!freerdp_client_parse_rdp_file(wfc->connectionRdpFile, settings->ConnectionFile)) + { + return 1; + } + + if (!freerdp_client_populate_settings_from_rdp_file(wfc->connectionRdpFile, settings)) + { + return 2; + } + } + + return 0; +} + +int freerdp_client_save_settings_to_rdp_file(wfContext* wfc, char* filename) +{ + if (!filename) + return 1; + + if (wfc->instance->settings->ConnectionFile) + { + free(wfc->instance->settings->ConnectionFile); + } + + wfc->instance->settings->ConnectionFile = _strdup(filename); + + // Reuse existing rdpFile structure if available, to preserve unsupported settings when saving to disk. + if (wfc->connectionRdpFile == NULL) + { + wfc->connectionRdpFile = freerdp_client_rdp_file_new(); + } + + if (!freerdp_client_populate_rdp_file_from_settings(wfc->connectionRdpFile, wfc->instance->settings)) + { + return 1; + } + + if (!freerdp_client_write_rdp_file(wfc->connectionRdpFile, filename, UNICODE)); + { + return 2; + } + + return 0; +} + +void wf_size_scrollbars(wfContext* wfc, int client_width, int client_height) +{ + BOOL rc; + + if (wfc->disablewindowtracking == TRUE) + { + return; + } + + // prevent infinite message loop + wfc->disablewindowtracking = TRUE; + + if (wfc->instance->settings->SmartSizing) + { + wfc->xCurrentScroll = 0; + wfc->yCurrentScroll = 0; + + if (wfc->xScrollVisible || wfc->yScrollVisible) + { + if (ShowScrollBar(wfc->hwnd, SB_BOTH, FALSE)) + { + wfc->xScrollVisible = FALSE; + wfc->yScrollVisible = FALSE; + } + } + } + else + { + SCROLLINFO si; + BOOL horiz = wfc->xScrollVisible; + BOOL vert = wfc->yScrollVisible;; + + if (!horiz && client_width < wfc->instance->settings->DesktopWidth) + { + horiz = TRUE; + } + else if (horiz && client_width >= wfc->instance->settings->DesktopWidth/* - GetSystemMetrics(SM_CXVSCROLL)*/) + { + horiz = FALSE; + } + + if (!vert && client_height < wfc->instance->settings->DesktopHeight) + { + vert = TRUE; + } + else if (vert && client_height >= wfc->instance->settings->DesktopHeight/* - GetSystemMetrics(SM_CYHSCROLL)*/) + { + vert = FALSE; + } + + if (horiz == vert && (horiz != wfc->xScrollVisible && vert != wfc->yScrollVisible)) + { + if (ShowScrollBar(wfc->hwnd, SB_BOTH, horiz)) + { + wfc->xScrollVisible = horiz; + wfc->yScrollVisible = vert; + } + } + + if (horiz != wfc->xScrollVisible) + { + if (ShowScrollBar(wfc->hwnd, SB_HORZ, horiz)) + { + wfc->xScrollVisible = horiz; + } + } + + if (vert != wfc->yScrollVisible) + { + if (ShowScrollBar(wfc->hwnd, SB_VERT, vert)) + { + wfc->yScrollVisible = vert; + } + } + + if (horiz) + { + // The horizontal scrolling range is defined by + // (bitmap_width) - (client_width). The current horizontal + // scroll value remains within the horizontal scrolling range. + wfc->xMaxScroll = MAX(wfc->instance->settings->DesktopWidth - client_width, 0); + wfc->xCurrentScroll = MIN(wfc->xCurrentScroll, wfc->xMaxScroll); + si.cbSize = sizeof(si); + si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; + si.nMin = wfc->xMinScroll; + si.nMax = wfc->instance->settings->DesktopWidth; + si.nPage = client_width; + si.nPos = wfc->xCurrentScroll; + SetScrollInfo(wfc->hwnd, SB_HORZ, &si, TRUE); + } + + if (vert) + { + // The vertical scrolling range is defined by + // (bitmap_height) - (client_height). The current vertical + // scroll value remains within the vertical scrolling range. + wfc->yMaxScroll = MAX(wfc->instance->settings->DesktopHeight - client_height, 0); + wfc->yCurrentScroll = MIN(wfc->yCurrentScroll, wfc->yMaxScroll); + si.cbSize = sizeof(si); + si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; + si.nMin = wfc->yMinScroll; + si.nMax = wfc->instance->settings->DesktopHeight; + si.nPage = client_height; + si.nPos = wfc->yCurrentScroll; + SetScrollInfo(wfc->hwnd, SB_VERT, &si, TRUE); + } + } + + wfc->disablewindowtracking = FALSE; + wf_update_canvas_diff(wfc); +} + +void wfreerdp_client_global_init(void) { WSADATA wsaData; @@ -803,8 +986,7 @@ int freerdp_client_global_init() _putenv(home); } - if (WSAStartup(0x101, &wsaData) != 0) - return 1; + WSAStartup(0x101, &wsaData); #if defined(WITH_DEBUG) || defined(_DEBUG) wf_create_console(); @@ -813,378 +995,112 @@ int freerdp_client_global_init() freerdp_channels_global_init(); freerdp_register_addin_provider(freerdp_channels_load_static_addin_entry, 0); - - return 0; } -int freerdp_client_global_uninit() +void wfreerdp_client_global_uninit(void) { WSACleanup(); - - return 0; } -wfInfo* freerdp_client_new(int argc, char** argv) +int wfreerdp_client_new(freerdp* instance, rdpContext* context) { - int index; - int status; - wfInfo* wfi; - freerdp* instance; + wfContext* wfc = (wfContext*) context; + + wfreerdp_client_global_init(); - instance = freerdp_new(); instance->PreConnect = wf_pre_connect; instance->PostConnect = wf_post_connect; instance->Authenticate = wf_authenticate; instance->VerifyCertificate = wf_verify_certificate; instance->ReceiveChannelData = wf_receive_channel_data; - instance->context_size = sizeof(wfContext); - instance->ContextNew = wf_context_new; - instance->ContextFree = wf_context_free; - freerdp_context_new(instance); + wfc->instance = instance; + context->channels = freerdp_channels_new(); - wfi = ((wfContext*) (instance->context))->wfi; - - wfi->instance = instance; - wfi->client = instance->context->client; - - instance->context->argc = argc; - instance->context->argv = (char**) malloc(sizeof(char*) * argc); - - for (index = 0; index < argc; index++) - instance->context->argv[index] = _strdup(argv[index]); - - status = freerdp_client_parse_command_line_arguments(instance->context->argc, instance->context->argv, instance->settings); - - return wfi; + return 0; } -rdpSettings* freerdp_client_get_settings(wfInfo* wfi) +void wfreerdp_client_free(freerdp* instance, rdpContext* context) { - return wfi->instance->settings; + if (context->cache) + cache_free(context->cache); + + freerdp_channels_free(context->channels); } -int freerdp_client_start(wfInfo* wfi) +int wfreerdp_client_start(rdpContext* context) { HWND hWndParent; HINSTANCE hInstance; - freerdp* instance = wfi->instance; + wfContext* wfc = (wfContext*) context; + freerdp* instance = context->instance; hInstance = GetModuleHandle(NULL); hWndParent = (HWND) instance->settings->ParentWindowId; instance->settings->EmbeddedWindow = (hWndParent) ? TRUE : FALSE; - wfi->hWndParent = hWndParent; - wfi->hInstance = hInstance; - wfi->cursor = LoadCursor(NULL, IDC_ARROW); - wfi->icon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1)); - wfi->wndClassName = _tcsdup(_T("FreeRDP")); + wfc->hWndParent = hWndParent; + wfc->hInstance = hInstance; + wfc->cursor = LoadCursor(NULL, IDC_ARROW); + wfc->icon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1)); + wfc->wndClassName = _tcsdup(_T("FreeRDP")); - wfi->wndClass.cbSize = sizeof(WNDCLASSEX); - wfi->wndClass.style = CS_HREDRAW | CS_VREDRAW; - wfi->wndClass.lpfnWndProc = wf_event_proc; - wfi->wndClass.cbClsExtra = 0; - wfi->wndClass.cbWndExtra = 0; - wfi->wndClass.hCursor = wfi->cursor; - wfi->wndClass.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH); - wfi->wndClass.lpszMenuName = NULL; - wfi->wndClass.lpszClassName = wfi->wndClassName; - wfi->wndClass.hInstance = hInstance; - wfi->wndClass.hIcon = wfi->icon; - wfi->wndClass.hIconSm = wfi->icon; - RegisterClassEx(&(wfi->wndClass)); + wfc->wndClass.cbSize = sizeof(WNDCLASSEX); + wfc->wndClass.style = CS_HREDRAW | CS_VREDRAW; + wfc->wndClass.lpfnWndProc = wf_event_proc; + wfc->wndClass.cbClsExtra = 0; + wfc->wndClass.cbWndExtra = 0; + wfc->wndClass.hCursor = wfc->cursor; + wfc->wndClass.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH); + wfc->wndClass.lpszMenuName = NULL; + wfc->wndClass.lpszClassName = wfc->wndClassName; + wfc->wndClass.hInstance = hInstance; + wfc->wndClass.hIcon = wfc->icon; + wfc->wndClass.hIconSm = wfc->icon; + RegisterClassEx(&(wfc->wndClass)); - wfi->keyboardThread = CreateThread(NULL, 0, wf_keyboard_thread, (void*) wfi, 0, &wfi->keyboardThreadId); + wfc->keyboardThread = CreateThread(NULL, 0, wf_keyboard_thread, (void*) wfc, 0, &wfc->keyboardThreadId); - if (!wfi->keyboardThread) + if (!wfc->keyboardThread) return -1; - freerdp_client_load_addins(instance->context->channels, instance->settings); + freerdp_client_load_addins(context->channels, instance->settings); - wfi->thread = CreateThread(NULL, 0, wf_thread, (void*) instance, 0, &wfi->mainThreadId); + wfc->thread = CreateThread(NULL, 0, wf_client_thread, (void*) instance, 0, &wfc->mainThreadId); - if (!wfi->thread) + if (!wfc->thread) return -1; - printf("Main thread exited.\n"); return 0; } -int freerdp_client_stop(wfInfo* wfi) +int wfreerdp_client_stop(rdpContext* context) { - if (wfi->mainThreadId) - PostThreadMessage(wfi->mainThreadId, WM_QUIT, 0, 0); + wfContext* wfc = (wfContext*) context; - if (wfi->keyboardThreadId) - PostThreadMessage(wfi->keyboardThreadId, WM_QUIT, 0, 0); - return 0; -} + if (wfc->mainThreadId) + PostThreadMessage(wfc->mainThreadId, WM_QUIT, 0, 0); -HANDLE freerdp_client_get_thread(wfInfo* cfi) -{ - return cfi->thread; -} - -freerdp* freerdp_client_get_instance(wfInfo* cfi) -{ - return cfi->instance; -} - -rdpClient* freerdp_client_get_interface(wfInfo* cfi) -{ - return cfi->client; -} - -int freerdp_client_focus_in(wfInfo* wfi) -{ - PostThreadMessage(wfi->mainThreadId, WM_SETFOCUS, 0, 1); - return 0; -} - -int freerdp_client_focus_out(wfInfo* wfi) -{ - PostThreadMessage(wfi->mainThreadId, WM_KILLFOCUS, 0, 1); - return 0; -} - -int freerdp_client_set_window_size(wfInfo* wfi, int width, int height) -{ - if ((width != wfi->client_width) || (height != wfi->client_height)) - { - PostThreadMessage(wfi->mainThreadId, WM_SIZE, SIZE_RESTORED, ((UINT) height << 16) | (UINT) width); - } + if (wfc->keyboardThreadId) + PostThreadMessage(wfc->keyboardThreadId, WM_QUIT, 0, 0); return 0; } -int freerdp_client_free(wfInfo* wfi) +int RdpClientEntry(RDP_CLIENT_ENTRY_POINTS* pEntryPoints) { - freerdp* instance = wfi->instance; + pEntryPoints->Version = 1; + pEntryPoints->Size = sizeof(RDP_CLIENT_ENTRY_POINTS_V1); - freerdp_context_free(instance); - freerdp_free(instance); + pEntryPoints->GlobalInit = wfreerdp_client_global_init; + pEntryPoints->GlobalUninit = wfreerdp_client_global_uninit; + + pEntryPoints->ContextSize = sizeof(wfContext); + pEntryPoints->ClientNew = wfreerdp_client_new; + pEntryPoints->ClientFree = wfreerdp_client_free; + + pEntryPoints->ClientStart = wfreerdp_client_start; + pEntryPoints->ClientStop = wfreerdp_client_stop; return 0; } - -void wf_on_param_change(freerdp* instance, int id) -{ - wfInfo* cfi = ((wfContext*) instance->context)->wfi; - RECT rect; - HMENU hMenu; - - // specific processing here - switch(id) - { - case FreeRDP_SmartSizing: - fprintf(stderr, "SmartSizing changed.\n"); - - if (!instance->settings->SmartSizing && (cfi->client_width > instance->settings->DesktopWidth || cfi->client_height > instance->settings->DesktopHeight)) - { - GetWindowRect(cfi->hwnd, &rect); - SetWindowPos(cfi->hwnd, HWND_TOP, 0, 0, MIN(cfi->client_width + cfi->offset_x, rect.right - rect.left), MIN(cfi->client_height + cfi->offset_y, rect.bottom - rect.top), SWP_NOMOVE | SWP_FRAMECHANGED); - wf_update_canvas_diff(cfi); - } - - hMenu = GetSystemMenu(cfi->hwnd, FALSE); - CheckMenuItem(hMenu, SYSCOMMAND_ID_SMARTSIZING, instance->settings->SmartSizing); - wf_size_scrollbars(cfi, cfi->client_width, cfi->client_height); - GetClientRect(cfi->hwnd, &rect); - InvalidateRect(cfi->hwnd, &rect, TRUE); - break; - - case FreeRDP_ConnectionType: - fprintf(stderr, "ConnectionType changed.\n"); - freerdp_set_connection_type(cfi->instance->settings, cfi->instance->settings->ConnectionType); - break; - } - - // trigger callback to client - - if (cfi->client_callback_func != NULL) - { - fprintf(stderr, "Notifying client..."); - cfi->client_callback_func(cfi, CALLBACK_TYPE_PARAM_CHANGE, id, 0); - } -} - -int freerdp_client_set_client_callback_function(wfInfo* cfi, callbackFunc callbackFunc) -{ - cfi->client_callback_func = callbackFunc; - return 0; -} - -// TODO: Some of that code is a duplicate of wf_pre_connect. Refactor? -int freerdp_client_load_settings_from_rdp_file(wfInfo* cfi, char* filename) -{ - rdpSettings* settings; - - settings = cfi->instance->settings; - - if (filename) - { - settings->ConnectionFile = _strdup(filename); - - // free old settings file - freerdp_client_rdp_file_free(cfi->connectionRdpFile); - cfi->connectionRdpFile = freerdp_client_rdp_file_new(); - - fprintf(stderr, "Using connection file: %s\n", settings->ConnectionFile); - - if (!freerdp_client_parse_rdp_file(cfi->connectionRdpFile, settings->ConnectionFile)) - { - return 1; - } - - if (!freerdp_client_populate_settings_from_rdp_file(cfi->connectionRdpFile, settings)) - { - return 2; - } - } - - return 0; -} - -int freerdp_client_save_settings_to_rdp_file(wfInfo* cfi, char* filename) -{ - if (filename == NULL) - return 1; - - if (cfi->instance->settings->ConnectionFile) - { - free(cfi->instance->settings->ConnectionFile); - } - - cfi->instance->settings->ConnectionFile = _strdup(filename); - - // Reuse existing rdpFile structure if available, to preserve unsupported settings when saving to disk. - if (cfi->connectionRdpFile == NULL) - { - cfi->connectionRdpFile = freerdp_client_rdp_file_new(); - } - - if (!freerdp_client_populate_rdp_file_from_settings(cfi->connectionRdpFile, cfi->instance->settings)) - { - return 1; - } - - if (!freerdp_client_write_rdp_file(cfi->connectionRdpFile, filename, UNICODE)); - { - return 2; - } - - return 0; -} - - -void wf_size_scrollbars(wfInfo* wfi, int client_width, int client_height) -{ - BOOL rc; - if (wfi->disablewindowtracking == TRUE) - { - return; - } - - - // prevent infinite message loop - wfi->disablewindowtracking = TRUE; - - if (wfi->instance->settings->SmartSizing) - { - wfi->xCurrentScroll = 0; - wfi->yCurrentScroll = 0; - - if (wfi->xScrollVisible || wfi->yScrollVisible) - { - if (ShowScrollBar(wfi->hwnd, SB_BOTH, FALSE)) - { - wfi->xScrollVisible = FALSE; - wfi->yScrollVisible = FALSE; - } - } - } - else - { - SCROLLINFO si; - BOOL horiz = wfi->xScrollVisible; - BOOL vert = wfi->yScrollVisible;; - - if (!horiz && client_width < wfi->instance->settings->DesktopWidth) - { - horiz = TRUE; - } - else if (horiz && client_width >= wfi->instance->settings->DesktopWidth/* - GetSystemMetrics(SM_CXVSCROLL)*/) - { - horiz = FALSE; - } - - if (!vert && client_height < wfi->instance->settings->DesktopHeight) - { - vert = TRUE; - } - else if (vert && client_height >= wfi->instance->settings->DesktopHeight/* - GetSystemMetrics(SM_CYHSCROLL)*/) - { - vert = FALSE; - } - - if (horiz == vert && (horiz != wfi->xScrollVisible && vert != wfi->yScrollVisible)) - { - if (ShowScrollBar(wfi->hwnd, SB_BOTH, horiz)) - { - wfi->xScrollVisible = horiz; - wfi->yScrollVisible = vert; - } - } - - if (horiz != wfi->xScrollVisible) - { - if (ShowScrollBar(wfi->hwnd, SB_HORZ, horiz)) - { - wfi->xScrollVisible = horiz; - } - } - - if (vert != wfi->yScrollVisible) - { - if (ShowScrollBar(wfi->hwnd, SB_VERT, vert)) - { - wfi->yScrollVisible = vert; - } - } - - if (horiz) - { - // The horizontal scrolling range is defined by - // (bitmap_width) - (client_width). The current horizontal - // scroll value remains within the horizontal scrolling range. - wfi->xMaxScroll = MAX(wfi->instance->settings->DesktopWidth - client_width, 0); - wfi->xCurrentScroll = MIN(wfi->xCurrentScroll, wfi->xMaxScroll); - si.cbSize = sizeof(si); - si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; - si.nMin = wfi->xMinScroll; - si.nMax = wfi->instance->settings->DesktopWidth; - si.nPage = client_width; - si.nPos = wfi->xCurrentScroll; - SetScrollInfo(wfi->hwnd, SB_HORZ, &si, TRUE); - } - - if (vert) - { - // The vertical scrolling range is defined by - // (bitmap_height) - (client_height). The current vertical - // scroll value remains within the vertical scrolling range. - wfi->yMaxScroll = MAX(wfi->instance->settings->DesktopHeight - client_height, 0); - wfi->yCurrentScroll = MIN(wfi->yCurrentScroll, wfi->yMaxScroll); - si.cbSize = sizeof(si); - si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; - si.nMin = wfi->yMinScroll; - si.nMax = wfi->instance->settings->DesktopHeight; - si.nPage = client_height; - si.nPos = wfi->yCurrentScroll; - SetScrollInfo(wfi->hwnd, SB_VERT, &si, TRUE); - } - } - - wfi->disablewindowtracking = FALSE; - wf_update_canvas_diff(wfi); -} diff --git a/client/Windows/wf_interface.h b/client/Windows/wf_interface.h index 669e606f2..028e1a853 100644 --- a/client/Windows/wf_interface.h +++ b/client/Windows/wf_interface.h @@ -43,11 +43,6 @@ extern "C" { #endif -// Callback type codes. Move elsewhere? -#define CALLBACK_TYPE_PARAM_CHANGE 0x01 -#define CALLBACK_TYPE_CONNECTED 0x02 -#define CALLBACK_TYPE_DISCONNECTED 0x03 - // System menu constants #define SYSCOMMAND_ID_SMARTSIZING 1000 @@ -68,21 +63,10 @@ struct wf_pointer }; typedef struct wf_pointer wfPointer; -typedef struct wf_info wfInfo; - struct wf_context { - rdpContext _p; - - wfInfo* wfi; -}; -typedef struct wf_context wfContext; - -typedef void (CALLBACK * callbackFunc)(wfInfo* wfi, int callback_type, DWORD param1, DWORD param2); - -struct wf_info -{ - rdpClient* client; + rdpContext context; + DEFINE_RDP_CLIENT_COMMON(); int width; int height; @@ -97,7 +81,6 @@ struct wf_info int client_width; int client_height; - HANDLE thread; HANDLE keyboardThread; HICON icon; @@ -129,61 +112,33 @@ struct wf_info NSC_CONTEXT* nsc_context; BOOL sw_gdi; - callbackFunc client_callback_func; rdpFile* connectionRdpFile; // Keep track of window size and position, disable when in fullscreen mode. - BOOL disablewindowtracking; + BOOL disablewindowtracking; - // These variables are required for horizontal scrolling. + // These variables are required for horizontal scrolling. BOOL updating_scrollbars; BOOL xScrollVisible; - int xMinScroll; // minimum horizontal scroll value - int xCurrentScroll; // current horizontal scroll value - int xMaxScroll; // maximum horizontal scroll value - - // These variables are required for vertical scrolling. + int xMinScroll; // minimum horizontal scroll value + int xCurrentScroll; // current horizontal scroll value + int xMaxScroll; // maximum horizontal scroll value + + // These variables are required for vertical scrolling. BOOL yScrollVisible; - int yMinScroll; // minimum vertical scroll value - int yCurrentScroll; // current vertical scroll value - int yMaxScroll; // maximum vertical scroll value + int yMinScroll; // minimum vertical scroll value + int yCurrentScroll; // current vertical scroll value + int yMaxScroll; // maximum vertical scroll value }; +typedef struct wf_context wfContext; /** * Client Interface */ -#define cfInfo wfInfo +FREERDP_API int RdpClientEntry(RDP_CLIENT_ENTRY_POINTS* pEntryPoints); -void wf_on_param_change(freerdp* instance, int id); -void wf_size_scrollbars(wfInfo* wfi, int client_width, int client_height); - -FREERDP_API int freerdp_client_global_init(); -FREERDP_API int freerdp_client_global_uninit(); - -FREERDP_API int freerdp_client_start(wfInfo* cfi); -FREERDP_API int freerdp_client_stop(wfInfo* cfi); - -FREERDP_API HANDLE freerdp_client_get_thread(wfInfo* cfi); -FREERDP_API freerdp* freerdp_client_get_instance(wfInfo* cfi); -FREERDP_API rdpClient* freerdp_client_get_interface(wfInfo* cfi); - -FREERDP_API int freerdp_client_focus_in(wfInfo* cfi); -FREERDP_API int freerdp_client_focus_out(wfInfo* cfi); - -FREERDP_API int freerdp_client_set_window_size(wfInfo* cfi, int width, int height); - -FREERDP_API cfInfo* freerdp_client_new(int argc, char** argv); -FREERDP_API int freerdp_client_free(wfInfo* cfi); - -FREERDP_API int freerdp_client_set_client_callback_function(wfInfo* cfi, callbackFunc callbackFunc); - -FREERDP_API rdpSettings* freerdp_client_get_settings(wfInfo* wfi); - -FREERDP_API int freerdp_client_load_settings_from_rdp_file(wfInfo* cfi, char* filename); -FREERDP_API int freerdp_client_save_settings_to_rdp_file(wfInfo* cfi, char* filename); - #ifdef __cplusplus } #endif diff --git a/client/Windows/wf_rail.c b/client/Windows/wf_rail.c index 5cc3c09fe..a776828fc 100644 --- a/client/Windows/wf_rail.c +++ b/client/Windows/wf_rail.c @@ -29,30 +29,30 @@ #include "wf_window.h" #include "wf_rail.h" -void wf_rail_paint(wfInfo* wfi, rdpRail* rail, INT32 uleft, INT32 utop, UINT32 uright, UINT32 ubottom) +void wf_rail_paint(wfContext* wfc, rdpRail* rail, INT32 uleft, INT32 utop, UINT32 uright, UINT32 ubottom) { } -void wf_rail_register_callbacks(wfInfo* wfi, rdpRail* rail) +void wf_rail_register_callbacks(wfContext* wfc, rdpRail* rail) { } -void wf_rail_send_client_system_command(wfInfo* wfi, UINT32 windowId, UINT16 command) +void wf_rail_send_client_system_command(wfContext* wfc, UINT32 windowId, UINT16 command) { } -void wf_rail_send_activate(wfInfo* wfi, HWND window, BOOL enabled) +void wf_rail_send_activate(wfContext* wfc, HWND window, BOOL enabled) { } -void wf_process_rail_event(wfInfo* wfi, rdpChannels* chanman, wMessage* event) +void wf_process_rail_event(wfContext* wfc, rdpChannels* channels, wMessage* event) { } -void wf_rail_adjust_position(wfInfo* wfi, rdpWindow *window) +void wf_rail_adjust_position(wfContext* wfc, rdpWindow* window) { } -void wf_rail_end_local_move(wfInfo* wfi, rdpWindow *window) +void wf_rail_end_local_move(wfContext* wfc, rdpWindow* window) { } diff --git a/client/Windows/wf_rail.h b/client/Windows/wf_rail.h index 171733706..e4cbcec4a 100644 --- a/client/Windows/wf_rail.h +++ b/client/Windows/wf_rail.h @@ -21,12 +21,12 @@ #include "wf_interface.h" -void wf_rail_paint(wfInfo* wfi, rdpRail* rail, INT32 uleft, INT32 utop, UINT32 uright, UINT32 ubottom); -void wf_rail_register_callbacks(wfInfo* wfi, rdpRail* rail); -void wf_rail_send_client_system_command(wfInfo* wfi, UINT32 windowId, UINT16 command); -void wf_rail_send_activate(wfInfo* wfi, HWND window, BOOL enabled); -void wf_process_rail_event(wfInfo* wfi, rdpChannels* chanman, wMessage* event); -void wf_rail_adjust_position(wfInfo* wfi, rdpWindow *window); -void wf_rail_end_local_move(wfInfo* wfi, rdpWindow *window); +void wf_rail_paint(wfContext* wfc, rdpRail* rail, INT32 uleft, INT32 utop, UINT32 uright, UINT32 ubottom); +void wf_rail_register_callbacks(wfContext* wfc, rdpRail* rail); +void wf_rail_send_client_system_command(wfContext* wfc, UINT32 windowId, UINT16 command); +void wf_rail_send_activate(wfContext* wfc, HWND window, BOOL enabled); +void wf_process_rail_event(wfContext* wfc, rdpChannels* channels, wMessage* event); +void wf_rail_adjust_position(wfContext* wfc, rdpWindow* window); +void wf_rail_end_local_move(wfContext* wfc, rdpWindow* window); #endif diff --git a/client/X11/CMakeLists.txt b/client/X11/CMakeLists.txt index 3cb6cdc5f..baecfe7a4 100644 --- a/client/X11/CMakeLists.txt +++ b/client/X11/CMakeLists.txt @@ -47,8 +47,8 @@ set(${MODULE_PREFIX}_SRCS xf_keyboard.h xf_window.c xf_window.h - xf_interface.c - xf_interface.h) + xf_client.c + xf_client.h) if(WITH_CLIENT_INTERFACE) if(CLIENT_INTERFACE_SHARED) diff --git a/client/X11/cli/xfreerdp.c b/client/X11/cli/xfreerdp.c index 0fa20b98b..8e39158c2 100644 --- a/client/X11/cli/xfreerdp.c +++ b/client/X11/cli/xfreerdp.c @@ -27,37 +27,56 @@ #include #include +#include -#include "xf_interface.h" - +#include "xf_client.h" #include "xfreerdp.h" int main(int argc, char* argv[]) { - xfInfo* xfi; + int status; + HANDLE thread; + xfContext* xfc; DWORD dwExitCode; - freerdp* instance; + rdpContext* context; + rdpSettings* settings; + RDP_CLIENT_ENTRY_POINTS clientEntryPoints; - freerdp_client_global_init(); + ZeroMemory(&clientEntryPoints, sizeof(RDP_CLIENT_ENTRY_POINTS)); + clientEntryPoints.Size = sizeof(RDP_CLIENT_ENTRY_POINTS); + clientEntryPoints.Version = RDP_CLIENT_INTERFACE_VERSION; - xfi = freerdp_client_new(argc, argv); + RdpClientEntry(&clientEntryPoints); - if (xfi == NULL) + context = freerdp_client_context_new(&clientEntryPoints); + + settings = context->settings; + xfc = (xfContext*) context; + + status = freerdp_client_parse_command_line(context, argc, argv); + + status = freerdp_client_command_line_status_print(argc, argv, settings, status); + + if (status) { - return 1; + if (settings->ListMonitors) + xf_list_monitors(xfc); + + freerdp_client_context_free(context); + return 0; } - instance = xfi->instance; + freerdp_client_start(context); - freerdp_client_start(xfi); + thread = freerdp_client_get_thread(context); - WaitForSingleObject(xfi->thread, INFINITE); + WaitForSingleObject(thread, INFINITE); - GetExitCodeThread(xfi->thread, &dwExitCode); + GetExitCodeThread(thread, &dwExitCode); - freerdp_client_free(xfi); + freerdp_client_stop(context); - freerdp_client_global_uninit(); + freerdp_client_context_free(context); return xf_exit_code_from_disconnect_reason(dwExitCode); } diff --git a/client/X11/xf_channels.c b/client/X11/xf_channels.c index 84a70b106..91dda0b8e 100644 --- a/client/X11/xf_channels.c +++ b/client/X11/xf_channels.c @@ -23,16 +23,16 @@ #include "xf_channels.h" -#include "xf_interface.h" +#include "xf_client.h" #include "xfreerdp.h" int xf_on_channel_connected(freerdp* instance, const char* name, void* pInterface) { - xfInfo* xfi = ((xfContext*) instance->context)->xfi; + xfContext* xfc = (xfContext*) instance->context; if (strcmp(name, RDPEI_DVC_CHANNEL_NAME) == 0) { - xfi->rdpei = (RdpeiClientContext*) pInterface; + xfc->rdpei = (RdpeiClientContext*) pInterface; } return 0; diff --git a/client/X11/xf_interface.c b/client/X11/xf_client.c similarity index 59% rename from client/X11/xf_interface.c rename to client/X11/xf_client.c index 640735d35..b9ab52096 100644 --- a/client/X11/xf_interface.c +++ b/client/X11/xf_client.c @@ -102,7 +102,7 @@ static int initialized_xi = 0; static long xv_port = 0; static const size_t password_size = 512; -void xf_transform_window(xfInfo* xfi) +void xf_transform_window(xfContext* xfc) { int ret; int w; @@ -111,15 +111,15 @@ void xf_transform_window(xfInfo* xfi) Atom hints_atom; XSizeHints* size_hints = NULL; - hints_atom = XInternAtom(xfi->display, "WM_SIZE_HINTS", 1); + hints_atom = XInternAtom(xfc->display, "WM_SIZE_HINTS", 1); - ret = XGetWMSizeHints(xfi->display, xfi->window->handle, size_hints, &supplied, hints_atom); + ret = XGetWMSizeHints(xfc->display, xfc->window->handle, size_hints, &supplied, hints_atom); if(ret == 0) size_hints = XAllocSizeHints(); - w = (xfi->originalWidth * xfi->scale) + xfi->offset_x; - h = (xfi->originalHeight * xfi->scale) + xfi->offset_y; + w = (xfc->originalWidth * xfc->scale) + xfc->offset_x; + h = (xfc->originalHeight * xfc->scale) + xfc->offset_y; if(w < 1) w = 1; @@ -132,14 +132,14 @@ void xf_transform_window(xfInfo* xfi) size_hints->flags |= PMinSize | PMaxSize; size_hints->min_width = size_hints->max_width = w; size_hints->min_height = size_hints->max_height = h; - XSetWMNormalHints(xfi->display, xfi->window->handle, size_hints); - XResizeWindow(xfi->display, xfi->window->handle, w, h); + XSetWMNormalHints(xfc->display, xfc->window->handle, size_hints); + XResizeWindow(xfc->display, xfc->window->handle, w, h); XFree(size_hints); } } -void xf_draw_screen_scaled(xfInfo* xfi, int x, int y, int w, int h, BOOL scale) +void xf_draw_screen_scaled(xfContext* xfc, int x, int y, int w, int h, BOOL scale) { #ifdef WITH_XRENDER XTransform transform; @@ -149,10 +149,10 @@ void xf_draw_screen_scaled(xfInfo* xfi, int x, int y, int w, int h, BOOL scale) XRenderPictFormat* picFormat; XRectangle xr; - picFormat = XRenderFindStandardFormat(xfi->display, PictStandardRGB24); + picFormat = XRenderFindStandardFormat(xfc->display, PictStandardRGB24); pa.subwindow_mode = IncludeInferiors; - primaryPicture = XRenderCreatePicture(xfi->display, xfi->primary, picFormat, CPSubwindowMode, &pa); - windowPicture = XRenderCreatePicture(xfi->display, xfi->window->handle, picFormat, CPSubwindowMode, &pa); + primaryPicture = XRenderCreatePicture(xfc->display, xfc->primary, picFormat, CPSubwindowMode, &pa); + windowPicture = XRenderCreatePicture(xfc->display, xfc->window->handle, picFormat, CPSubwindowMode, &pa); transform.matrix[0][0] = XDoubleToFixed(1); transform.matrix[0][1] = XDoubleToFixed(0); @@ -164,17 +164,17 @@ void xf_draw_screen_scaled(xfInfo* xfi, int x, int y, int w, int h, BOOL scale) transform.matrix[2][0] = XDoubleToFixed(0); transform.matrix[2][1] = XDoubleToFixed(0); - transform.matrix[2][2] = XDoubleToFixed(xfi->scale); + transform.matrix[2][2] = XDoubleToFixed(xfc->scale); if( (w != 0) && (h != 0) ) { if(scale == TRUE) { - xr.x = x * xfi->scale; - xr.y = y * xfi->scale; - xr.width = (w+1) * xfi->scale; - xr.height = (h+1) * xfi->scale; + xr.x = x * xfc->scale; + xr.y = y * xfc->scale; + xr.width = (w+1) * xfc->scale; + xr.height = (h+1) * xfc->scale; } else { @@ -184,30 +184,20 @@ void xf_draw_screen_scaled(xfInfo* xfi, int x, int y, int w, int h, BOOL scale) xr.height = h; } - XRenderSetPictureClipRectangles(xfi->display, primaryPicture, 0, 0, &xr, 1); + XRenderSetPictureClipRectangles(xfc->display, primaryPicture, 0, 0, &xr, 1); } - XRenderSetPictureTransform(xfi->display, primaryPicture, &transform); + XRenderSetPictureTransform(xfc->display, primaryPicture, &transform); - XRenderComposite(xfi->display, PictOpSrc, primaryPicture, 0, windowPicture, 0, 0, 0, 0, xfi->offset_x, xfi->offset_y, xfi->currentWidth, xfi->currentHeight); + XRenderComposite(xfc->display, PictOpSrc, primaryPicture, 0, windowPicture, 0, 0, 0, 0, xfc->offset_x, xfc->offset_y, xfc->currentWidth, xfc->currentHeight); - XRenderFreePicture(xfi->display, primaryPicture); - XRenderFreePicture(xfi->display, windowPicture); + XRenderFreePicture(xfc->display, primaryPicture); + XRenderFreePicture(xfc->display, windowPicture); #endif } -void xf_context_new(freerdp* instance, rdpContext* context) -{ - context->channels = freerdp_channels_new(); -} - -void xf_context_free(freerdp* instance, rdpContext* context) -{ - -} - void xf_sw_begin_paint(rdpContext* context) { rdpGdi* gdi = context->gdi; @@ -218,16 +208,15 @@ void xf_sw_begin_paint(rdpContext* context) void xf_sw_end_paint(rdpContext* context) { rdpGdi* gdi; - xfInfo* xfi; INT32 x, y; UINT32 w, h; + xfContext* xfc = (xfContext*) context; - xfi = ((xfContext*) context)->xfi; gdi = context->gdi; - if (!xfi->remote_app) + if (!xfc->remote_app) { - if (!xfi->complex_regions) + if (!xfc->complex_regions) { if (gdi->primary->hdc->hwnd->invalid->null) return; @@ -236,21 +225,21 @@ void xf_sw_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; - - xf_lock_x11(xfi, FALSE); - XPutImage(xfi->display, xfi->primary, xfi->gc, xfi->image, x, y, x, y, w, h); + xf_lock_x11(xfc, FALSE); - if ( (xfi->scale != 1.0) || (xfi->offset_x) || (xfi->offset_y) ) + XPutImage(xfc->display, xfc->primary, xfc->gc, xfc->image, x, y, x, y, w, h); + + if ( (xfc->scale != 1.0) || (xfc->offset_x) || (xfc->offset_y) ) { - xf_draw_screen_scaled(xfi, x, y, w, h, TRUE); + xf_draw_screen_scaled(xfc, x, y, w, h, TRUE); } else { - XCopyArea(xfi->display, xfi->primary, xfi->window->handle, xfi->gc, x, y, w, h, x, y); + XCopyArea(xfc->display, xfc->primary, xfc->window->handle, xfc->gc, x, y, w, h, x, y); } - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } else { @@ -264,7 +253,7 @@ void xf_sw_end_paint(rdpContext* context) ninvalid = gdi->primary->hdc->hwnd->ninvalid; cinvalid = gdi->primary->hdc->hwnd->cinvalid; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); for (i = 0; i < ninvalid; i++) { @@ -273,23 +262,22 @@ void xf_sw_end_paint(rdpContext* context) w = cinvalid[i].w; h = cinvalid[i].h; - //combine xfi->primary with xfi->image - XPutImage(xfi->display, xfi->primary, xfi->gc, xfi->image, x, y, x, y, w, h); + //combine xfc->primary with xfc->image + XPutImage(xfc->display, xfc->primary, xfc->gc, xfc->image, x, y, x, y, w, h); - //if (xfi->scale != 1.0) - if ( (xfi->scale != 1.0) || (xfi->offset_x) || (xfi->offset_y) ) + if ( (xfc->scale != 1.0) || (xfc->offset_x) || (xfc->offset_y) ) { - xf_draw_screen_scaled(xfi, x, y, w, h, TRUE); + xf_draw_screen_scaled(xfc, x, y, w, h, TRUE); } else { - XCopyArea(xfi->display, xfi->primary, xfi->window->handle, xfi->gc, x, y, w, h, x, y); + XCopyArea(xfc->display, xfc->primary, xfc->window->handle, xfc->gc, x, y, w, h, x, y); } } - XFlush(xfi->display); + XFlush(xfc->display); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } } else @@ -301,84 +289,79 @@ void xf_sw_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; - - xf_lock_x11(xfi, FALSE); - xf_rail_paint(xfi, context->rail, x, y, x + w - 1, y + h - 1); + xf_lock_x11(xfc, FALSE); - xf_unlock_x11(xfi, FALSE); + xf_rail_paint(xfc, context->rail, x, y, x + w - 1, y + h - 1); + + xf_unlock_x11(xfc, FALSE); } } void xf_sw_desktop_resize(rdpContext* context) { - xfInfo* xfi; rdpSettings* settings; + xfContext* xfc = (xfContext*) context; - xfi = ((xfContext*) context)->xfi; - settings = xfi->instance->settings; + settings = xfc->instance->settings; - xf_lock_x11(xfi, TRUE); + xf_lock_x11(xfc, TRUE); - if (!xfi->fullscreen) + if (!xfc->fullscreen) { rdpGdi* gdi = context->gdi; - gdi_resize(gdi, xfi->width, xfi->height); + gdi_resize(gdi, xfc->width, xfc->height); - if (xfi->image) + if (xfc->image) { - xfi->image->data = NULL; - XDestroyImage(xfi->image); - xfi->image = XCreateImage(xfi->display, xfi->visual, xfi->depth, ZPixmap, 0, - (char*) gdi->primary_buffer, gdi->width, gdi->height, xfi->scanline_pad, 0); + xfc->image->data = NULL; + XDestroyImage(xfc->image); + xfc->image = XCreateImage(xfc->display, xfc->visual, xfc->depth, ZPixmap, 0, + (char*) gdi->primary_buffer, gdi->width, gdi->height, xfc->scanline_pad, 0); } } - xf_unlock_x11(xfi, TRUE); + xf_unlock_x11(xfc, TRUE); } void xf_hw_begin_paint(rdpContext* context) { - xfInfo* xfi; - xfi = ((xfContext*) context)->xfi; + xfContext* xfc = (xfContext*) context; - xfi->hdc->hwnd->invalid->null = 1; - xfi->hdc->hwnd->ninvalid = 0; + xfc->hdc->hwnd->invalid->null = 1; + xfc->hdc->hwnd->ninvalid = 0; } void xf_hw_end_paint(rdpContext* context) { - xfInfo* xfi; INT32 x, y; UINT32 w, h; + xfContext* xfc = (xfContext*) context; - xfi = ((xfContext*) context)->xfi; - - if (!xfi->remote_app) + if (!xfc->remote_app) { - if (!xfi->complex_regions) + if (!xfc->complex_regions) { - if (xfi->hdc->hwnd->invalid->null) + if (xfc->hdc->hwnd->invalid->null) return; - x = xfi->hdc->hwnd->invalid->x; - y = xfi->hdc->hwnd->invalid->y; - w = xfi->hdc->hwnd->invalid->w; - h = xfi->hdc->hwnd->invalid->h; + x = xfc->hdc->hwnd->invalid->x; + y = xfc->hdc->hwnd->invalid->y; + w = xfc->hdc->hwnd->invalid->w; + h = xfc->hdc->hwnd->invalid->h; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); - //if (xfi->scale != 1.0) - if ( (xfi->scale != 1.0) || (xfi->offset_x) || (xfi->offset_y) ) + if ( (xfc->scale != 1.0) || (xfc->offset_x) || (xfc->offset_y) ) { - xf_draw_screen_scaled(xfi, x, y, w, h, TRUE); + xf_draw_screen_scaled(xfc, x, y, w, h, TRUE); } else { - XCopyArea(xfi->display, xfi->primary, xfi->drawable, xfi->gc, x, y, w, h, x, y); + XCopyArea(xfc->display, xfc->primary, xfc->drawable, xfc->gc, x, y, w, h, x, y); } - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } else { @@ -386,13 +369,13 @@ void xf_hw_end_paint(rdpContext* context) int ninvalid; HGDI_RGN cinvalid; - if (xfi->hdc->hwnd->ninvalid < 1) + if (xfc->hdc->hwnd->ninvalid < 1) return; - ninvalid = xfi->hdc->hwnd->ninvalid; - cinvalid = xfi->hdc->hwnd->cinvalid; + ninvalid = xfc->hdc->hwnd->ninvalid; + cinvalid = xfc->hdc->hwnd->cinvalid; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); for (i = 0; i < ninvalid; i++) { @@ -401,88 +384,86 @@ void xf_hw_end_paint(rdpContext* context) w = cinvalid[i].w; h = cinvalid[i].h; - //if(xfi->scale != 1.0) - if ( (xfi->scale != 1.0) || (xfi->offset_x) || (xfi->offset_y) ) + if ( (xfc->scale != 1.0) || (xfc->offset_x) || (xfc->offset_y) ) { - xf_draw_screen_scaled(xfi, x, y, w, h, TRUE); + xf_draw_screen_scaled(xfc, x, y, w, h, TRUE); } else { - XCopyArea(xfi->display, xfi->primary, xfi->drawable, xfi->gc, x, y, w, h, x, y); + XCopyArea(xfc->display, xfc->primary, xfc->drawable, xfc->gc, x, y, w, h, x, y); } } - XFlush(xfi->display); + XFlush(xfc->display); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } } else { - if (xfi->hdc->hwnd->invalid->null) + if (xfc->hdc->hwnd->invalid->null) return; - x = xfi->hdc->hwnd->invalid->x; - y = xfi->hdc->hwnd->invalid->y; - w = xfi->hdc->hwnd->invalid->w; - h = xfi->hdc->hwnd->invalid->h; + x = xfc->hdc->hwnd->invalid->x; + y = xfc->hdc->hwnd->invalid->y; + w = xfc->hdc->hwnd->invalid->w; + h = xfc->hdc->hwnd->invalid->h; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); - xf_rail_paint(xfi, context->rail, x, y, x + w - 1, y + h - 1); + xf_rail_paint(xfc, context->rail, x, y, x + w - 1, y + h - 1); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } } void xf_hw_desktop_resize(rdpContext* context) { - xfInfo* xfi; BOOL same; rdpSettings* settings; + xfContext* xfc = (xfContext*) context; - xfi = ((xfContext*) context)->xfi; - settings = xfi->instance->settings; + settings = xfc->instance->settings; - xf_lock_x11(xfi, TRUE); + xf_lock_x11(xfc, TRUE); - if (!xfi->fullscreen) + if (!xfc->fullscreen) { - xfi->width = settings->DesktopWidth; - xfi->height = settings->DesktopHeight; + xfc->width = settings->DesktopWidth; + xfc->height = settings->DesktopHeight; - if (xfi->window) - xf_ResizeDesktopWindow(xfi, xfi->window, settings->DesktopWidth, settings->DesktopHeight); + if (xfc->window) + xf_ResizeDesktopWindow(xfc, xfc->window, settings->DesktopWidth, settings->DesktopHeight); - if (xfi->primary) + if (xfc->primary) { - same = (xfi->primary == xfi->drawing) ? TRUE : FALSE; + same = (xfc->primary == xfc->drawing) ? TRUE : FALSE; - XFreePixmap(xfi->display, xfi->primary); + XFreePixmap(xfc->display, xfc->primary); - xfi->primary = XCreatePixmap(xfi->display, xfi->drawable, - xfi->width, xfi->height, xfi->depth); + xfc->primary = XCreatePixmap(xfc->display, xfc->drawable, + xfc->width, xfc->height, xfc->depth); if (same) - xfi->drawing = xfi->primary; + xfc->drawing = xfc->primary; } } else { - XSetFunction(xfi->display, xfi->gc, GXcopy); - XSetFillStyle(xfi->display, xfi->gc, FillSolid); - XSetForeground(xfi->display, xfi->gc, 0); - XFillRectangle(xfi->display, xfi->drawable, xfi->gc, 0, 0, xfi->width, xfi->height); + XSetFunction(xfc->display, xfc->gc, GXcopy); + XSetFillStyle(xfc->display, xfc->gc, FillSolid); + XSetForeground(xfc->display, xfc->gc, 0); + XFillRectangle(xfc->display, xfc->drawable, xfc->gc, 0, 0, xfc->width, xfc->height); } - xf_unlock_x11(xfi, TRUE); + xf_unlock_x11(xfc, TRUE); } BOOL xf_get_fds(freerdp* instance, void** rfds, int* rcount, void** wfds, int* wcount) { - xfInfo* xfi = ((xfContext*) instance->context)->xfi; + xfContext* xfc = (xfContext*) instance->context; - rfds[*rcount] = (void*)(long)(xfi->xfds); + rfds[*rcount] = (void*)(long)(xfc->xfds); (*rcount)++; return TRUE; @@ -493,7 +474,7 @@ BOOL xf_process_x_events(freerdp* instance) BOOL status; XEvent xevent; int pending_status; - xfInfo* xfi = ((xfContext*) instance->context)->xfi; + xfContext* xfc = (xfContext*) instance->context; if (initialized_xi == 0) { @@ -506,17 +487,17 @@ BOOL xf_process_x_events(freerdp* instance) while (pending_status) { - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); - pending_status = XPending(xfi->display); + pending_status = XPending(xfc->display); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); if (pending_status) { ZeroMemory(&xevent, sizeof(xevent)); - XNextEvent(xfi->display, &xevent); + XNextEvent(xfc->display, &xevent); status = xf_event_process(instance, &xevent); if (!status) @@ -527,7 +508,7 @@ BOOL xf_process_x_events(freerdp* instance) return status; } -void xf_create_window(xfInfo* xfi) +void xf_create_window(xfContext* xfc) { XEvent xevent; int width, height; @@ -535,107 +516,102 @@ void xf_create_window(xfInfo* xfi) ZeroMemory(&xevent, sizeof(xevent)); - width = xfi->width; - height = xfi->height; + width = xfc->width; + height = xfc->height; - if (!xfi->remote_app) + if (!xfc->remote_app) { - xfi->attribs.background_pixel = BlackPixelOfScreen(xfi->screen); - xfi->attribs.border_pixel = WhitePixelOfScreen(xfi->screen); - xfi->attribs.backing_store = xfi->primary ? NotUseful : Always; - xfi->attribs.override_redirect = xfi->grab_keyboard ? xfi->fullscreen : False; - xfi->attribs.colormap = xfi->colormap; - xfi->attribs.bit_gravity = NorthWestGravity; - xfi->attribs.win_gravity = NorthWestGravity; + xfc->attribs.background_pixel = BlackPixelOfScreen(xfc->screen); + xfc->attribs.border_pixel = WhitePixelOfScreen(xfc->screen); + xfc->attribs.backing_store = xfc->primary ? NotUseful : Always; + xfc->attribs.override_redirect = xfc->grab_keyboard ? xfc->fullscreen : False; + xfc->attribs.colormap = xfc->colormap; + xfc->attribs.bit_gravity = NorthWestGravity; + xfc->attribs.win_gravity = NorthWestGravity; - if (xfi->instance->settings->WindowTitle) + if (xfc->instance->settings->WindowTitle) { - windowTitle = _strdup(xfi->instance->settings->WindowTitle); + windowTitle = _strdup(xfc->instance->settings->WindowTitle); } - else if (xfi->instance->settings->ServerPort == 3389) + else if (xfc->instance->settings->ServerPort == 3389) { - windowTitle = malloc(1 + sizeof("FreeRDP: ") + strlen(xfi->instance->settings->ServerHostname)); - sprintf(windowTitle, "FreeRDP: %s", xfi->instance->settings->ServerHostname); + windowTitle = malloc(1 + sizeof("FreeRDP: ") + strlen(xfc->instance->settings->ServerHostname)); + sprintf(windowTitle, "FreeRDP: %s", xfc->instance->settings->ServerHostname); } else { - 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); + windowTitle = malloc(1 + sizeof("FreeRDP: ") + strlen(xfc->instance->settings->ServerHostname) + sizeof(":00000")); + sprintf(windowTitle, "FreeRDP: %s:%i", xfc->instance->settings->ServerHostname, xfc->instance->settings->ServerPort); } - xfi->window = xf_CreateDesktopWindow(xfi, windowTitle, width, height, xfi->settings->Decorations); + xfc->window = xf_CreateDesktopWindow(xfc, windowTitle, width, height, xfc->settings->Decorations); free(windowTitle); - if (xfi->fullscreen) - xf_SetWindowFullscreen(xfi, xfi->window, xfi->fullscreen); + if (xfc->fullscreen) + xf_SetWindowFullscreen(xfc, xfc->window, xfc->fullscreen); - xfi->unobscured = (xevent.xvisibility.state == VisibilityUnobscured); + xfc->unobscured = (xevent.xvisibility.state == VisibilityUnobscured); - XSetWMProtocols(xfi->display, xfi->window->handle, &(xfi->WM_DELETE_WINDOW), 1); - xfi->drawable = xfi->window->handle; - - /* - //allow resizing from half to double - xf_SetWindowMinMaxInfo(xfi, xfi->window, - 0, 0, 0, 0, //these aren't used - xfi->width * 0.5, xfi->height * 0.5, xfi->width * 2, xfi->height * 2); - */ + XSetWMProtocols(xfc->display, xfc->window->handle, &(xfc->WM_DELETE_WINDOW), 1); + xfc->drawable = xfc->window->handle; } else { - xfi->drawable = DefaultRootWindow(xfi->display); + xfc->drawable = DefaultRootWindow(xfc->display); } } -void xf_toggle_fullscreen(xfInfo* xfi) +void xf_toggle_fullscreen(xfContext* xfc) { Pixmap contents = 0; + WindowStateChangeEventArgs e; - xf_lock_x11(xfi, TRUE); + xf_lock_x11(xfc, TRUE); - contents = XCreatePixmap(xfi->display, xfi->window->handle, xfi->width, xfi->height, xfi->depth); - XCopyArea(xfi->display, xfi->primary, contents, xfi->gc, 0, 0, xfi->width, xfi->height, 0, 0); + contents = XCreatePixmap(xfc->display, xfc->window->handle, xfc->width, xfc->height, xfc->depth); + XCopyArea(xfc->display, xfc->primary, contents, xfc->gc, 0, 0, xfc->width, xfc->height, 0, 0); - XDestroyWindow(xfi->display, xfi->window->handle); - xfi->fullscreen = (xfi->fullscreen) ? FALSE : TRUE; - xf_create_window(xfi); + XDestroyWindow(xfc->display, xfc->window->handle); + xfc->fullscreen = (xfc->fullscreen) ? FALSE : TRUE; + xf_create_window(xfc); - XCopyArea(xfi->display, contents, xfi->primary, xfi->gc, 0, 0, xfi->width, xfi->height, 0, 0); - XFreePixmap(xfi->display, contents); + XCopyArea(xfc->display, contents, xfc->primary, xfc->gc, 0, 0, xfc->width, xfc->height, 0, 0); + XFreePixmap(xfc->display, contents); - xf_unlock_x11(xfi, TRUE); + xf_unlock_x11(xfc, TRUE); - IFCALL(xfi->client->OnWindowStateChange, xfi->instance, - xfi->fullscreen ? FREERDP_WINDOW_STATE_FULLSCREEN : 0); + EventArgsInit(&e, "xfreerdp"); + e.state = xfc->fullscreen ? FREERDP_WINDOW_STATE_FULLSCREEN : 0; + PubSub_OnWindowStateChange(((rdpContext*) xfc)->pubSub, xfc, &e); } -void xf_lock_x11(xfInfo* xfi, BOOL display) +void xf_lock_x11(xfContext* xfc, BOOL display) { - if (!xfi->UseXThreads) + if (!xfc->UseXThreads) { - WaitForSingleObject(xfi->mutex, INFINITE); + WaitForSingleObject(xfc->mutex, INFINITE); } else { if (display) - XLockDisplay(xfi->display); + XLockDisplay(xfc->display); } } -void xf_unlock_x11(xfInfo* xfi, BOOL display) +void xf_unlock_x11(xfContext* xfc, BOOL display) { - if (!xfi->UseXThreads) + if (!xfc->UseXThreads) { - ReleaseMutex(xfi->mutex); + ReleaseMutex(xfc->mutex); } else { if (display) - XUnlockDisplay(xfi->display); + XUnlockDisplay(xfc->display); } } -BOOL xf_get_pixmap_info(xfInfo* xfi) +BOOL xf_get_pixmap_info(xfContext* xfc) { int i; int vi_count; @@ -647,7 +623,7 @@ BOOL xf_get_pixmap_info(xfInfo* xfi) XPixmapFormatValues* pfs; XWindowAttributes window_attributes; - pfs = XListPixmapFormats(xfi->display, &pf_count); + pfs = XListPixmapFormats(xfc->display, &pf_count); if (pfs == NULL) { @@ -659,10 +635,10 @@ BOOL xf_get_pixmap_info(xfInfo* xfi) { pf = pfs + i; - if (pf->depth == xfi->depth) + if (pf->depth == xfc->depth) { - xfi->bpp = pf->bits_per_pixel; - xfi->scanline_pad = pf->scanline_pad; + xfc->bpp = pf->bits_per_pixel; + xfc->scanline_pad = pf->scanline_pad; break; } } @@ -670,15 +646,15 @@ BOOL xf_get_pixmap_info(xfInfo* xfi) ZeroMemory(&template, sizeof(template)); template.class = TrueColor; - template.screen = xfi->screen_number; + template.screen = xfc->screen_number; - if (XGetWindowAttributes(xfi->display, RootWindowOfScreen(xfi->screen), &window_attributes) == 0) + if (XGetWindowAttributes(xfc->display, RootWindowOfScreen(xfc->screen), &window_attributes) == 0) { fprintf(stderr, "xf_get_pixmap_info: XGetWindowAttributes failed\n"); return FALSE; } - vis = XGetVisualInfo(xfi->display, VisualClassMask | VisualScreenMask, &template, &vi_count); + vis = XGetVisualInfo(xfc->display, VisualClassMask | VisualScreenMask, &template, &vi_count); if (vis == NULL) { @@ -693,7 +669,7 @@ BOOL xf_get_pixmap_info(xfInfo* xfi) if (vi->visual == window_attributes.visual) { - xfi->visual = vi->visual; + xfc->visual = vi->visual; break; } } @@ -707,13 +683,13 @@ BOOL xf_get_pixmap_info(xfInfo* xfi) if (vi->red_mask & 0xFF) { - xfi->clrconv->invert = TRUE; + xfc->clrconv->invert = TRUE; } } XFree(vis); - if ((xfi->visual == NULL) || (xfi->scanline_pad == 0)) + if ((xfc->visual == NULL) || (xfc->scanline_pad == 0)) { return FALSE; } @@ -762,27 +738,21 @@ int _xf_error_handler(Display* d, XErrorEvent* ev) */ BOOL xf_pre_connect(freerdp* instance) { - xfInfo* xfi; rdpChannels* channels; rdpSettings* settings; + xfContext* xfc = (xfContext*) instance->context; - xfi = ((xfContext*) instance->context)->xfi; + xfc->mutex = CreateMutex(NULL, FALSE, NULL); - xfi->mutex = CreateMutex(NULL, FALSE, NULL); + xfc->settings = instance->settings; + xfc->instance = instance; - xfi->_context = instance->context; - xfi->context = (xfContext*) instance->context; - xfi->context->settings = instance->settings; - xfi->instance = instance; settings = instance->settings; channels = instance->context->channels; instance->OnChannelConnected = xf_on_channel_connected; instance->OnChannelDisconnected = xf_on_channel_disconnected; - //if (status < 0) - // exit(XF_EXIT_PARSE_ARGUMENTS); - freerdp_client_load_addins(channels, instance->settings); freerdp_channels_pre_connect(channels, instance); @@ -805,73 +775,73 @@ BOOL xf_pre_connect(freerdp* instance) return TRUE; } - xfi->UseXThreads = TRUE; + xfc->UseXThreads = TRUE; - if (xfi->UseXThreads) + if (xfc->UseXThreads) { if (!XInitThreads()) { fprintf(stderr, "warning: XInitThreads() failure\n"); - xfi->UseXThreads = FALSE; + xfc->UseXThreads = FALSE; } } - xfi->display = XOpenDisplay(NULL); + xfc->display = XOpenDisplay(NULL); - if (!xfi->display) + if (!xfc->display) { fprintf(stderr, "xf_pre_connect: failed to open display: %s\n", XDisplayName(NULL)); fprintf(stderr, "Please check that the $DISPLAY environment variable is properly set.\n"); return FALSE; } - if (xfi->debug) + if (xfc->debug) { fprintf(stderr, "Enabling X11 debug mode.\n"); - XSynchronize(xfi->display, TRUE); + XSynchronize(xfc->display, TRUE); _def_error_handler = XSetErrorHandler(_xf_error_handler); } - xfi->_NET_WM_ICON = XInternAtom(xfi->display, "_NET_WM_ICON", False); - xfi->_MOTIF_WM_HINTS = XInternAtom(xfi->display, "_MOTIF_WM_HINTS", False); - xfi->_NET_CURRENT_DESKTOP = XInternAtom(xfi->display, "_NET_CURRENT_DESKTOP", False); - xfi->_NET_WORKAREA = XInternAtom(xfi->display, "_NET_WORKAREA", False); - xfi->_NET_WM_STATE = XInternAtom(xfi->display, "_NET_WM_STATE", False); - xfi->_NET_WM_STATE_FULLSCREEN = XInternAtom(xfi->display, "_NET_WM_STATE_FULLSCREEN", False); - xfi->_NET_WM_WINDOW_TYPE = XInternAtom(xfi->display, "_NET_WM_WINDOW_TYPE", False); + xfc->_NET_WM_ICON = XInternAtom(xfc->display, "_NET_WM_ICON", False); + xfc->_MOTIF_WM_HINTS = XInternAtom(xfc->display, "_MOTIF_WM_HINTS", False); + xfc->_NET_CURRENT_DESKTOP = XInternAtom(xfc->display, "_NET_CURRENT_DESKTOP", False); + xfc->_NET_WORKAREA = XInternAtom(xfc->display, "_NET_WORKAREA", False); + xfc->_NET_WM_STATE = XInternAtom(xfc->display, "_NET_WM_STATE", False); + xfc->_NET_WM_STATE_FULLSCREEN = XInternAtom(xfc->display, "_NET_WM_STATE_FULLSCREEN", False); + xfc->_NET_WM_WINDOW_TYPE = XInternAtom(xfc->display, "_NET_WM_WINDOW_TYPE", False); - xfi->_NET_WM_WINDOW_TYPE_NORMAL = XInternAtom(xfi->display, "_NET_WM_WINDOW_TYPE_NORMAL", False); - xfi->_NET_WM_WINDOW_TYPE_DIALOG = XInternAtom(xfi->display, "_NET_WM_WINDOW_TYPE_DIALOG", False); - xfi->_NET_WM_WINDOW_TYPE_POPUP = XInternAtom(xfi->display, "_NET_WM_WINDOW_TYPE_POPUP", False); - xfi->_NET_WM_WINDOW_TYPE_UTILITY = XInternAtom(xfi->display, "_NET_WM_WINDOW_TYPE_UTILITY", False); - xfi->_NET_WM_WINDOW_TYPE_DROPDOWN_MENU = XInternAtom(xfi->display, "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU", False); - xfi->_NET_WM_STATE_SKIP_TASKBAR = XInternAtom(xfi->display, "_NET_WM_STATE_SKIP_TASKBAR", False); - xfi->_NET_WM_STATE_SKIP_PAGER = XInternAtom(xfi->display, "_NET_WM_STATE_SKIP_PAGER", False); - xfi->_NET_WM_MOVERESIZE = XInternAtom(xfi->display, "_NET_WM_MOVERESIZE", False); - xfi->_NET_MOVERESIZE_WINDOW = XInternAtom(xfi->display, "_NET_MOVERESIZE_WINDOW", False); + xfc->_NET_WM_WINDOW_TYPE_NORMAL = XInternAtom(xfc->display, "_NET_WM_WINDOW_TYPE_NORMAL", False); + xfc->_NET_WM_WINDOW_TYPE_DIALOG = XInternAtom(xfc->display, "_NET_WM_WINDOW_TYPE_DIALOG", False); + xfc->_NET_WM_WINDOW_TYPE_POPUP = XInternAtom(xfc->display, "_NET_WM_WINDOW_TYPE_POPUP", False); + xfc->_NET_WM_WINDOW_TYPE_UTILITY = XInternAtom(xfc->display, "_NET_WM_WINDOW_TYPE_UTILITY", False); + xfc->_NET_WM_WINDOW_TYPE_DROPDOWN_MENU = XInternAtom(xfc->display, "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU", False); + xfc->_NET_WM_STATE_SKIP_TASKBAR = XInternAtom(xfc->display, "_NET_WM_STATE_SKIP_TASKBAR", False); + xfc->_NET_WM_STATE_SKIP_PAGER = XInternAtom(xfc->display, "_NET_WM_STATE_SKIP_PAGER", False); + xfc->_NET_WM_MOVERESIZE = XInternAtom(xfc->display, "_NET_WM_MOVERESIZE", False); + xfc->_NET_MOVERESIZE_WINDOW = XInternAtom(xfc->display, "_NET_MOVERESIZE_WINDOW", False); - xfi->WM_PROTOCOLS = XInternAtom(xfi->display, "WM_PROTOCOLS", False); - xfi->WM_DELETE_WINDOW = XInternAtom(xfi->display, "WM_DELETE_WINDOW", False); - xfi->WM_STATE = XInternAtom(xfi->display, "WM_STATE", False); + xfc->WM_PROTOCOLS = XInternAtom(xfc->display, "WM_PROTOCOLS", False); + xfc->WM_DELETE_WINDOW = XInternAtom(xfc->display, "WM_DELETE_WINDOW", False); + xfc->WM_STATE = XInternAtom(xfc->display, "WM_STATE", False); - xf_kbd_init(xfi); + xf_kbd_init(xfc); - xfi->clrconv = freerdp_clrconv_new(CLRCONV_ALPHA); + xfc->clrconv = freerdp_clrconv_new(CLRCONV_ALPHA); instance->context->cache = cache_new(instance->settings); - xfi->xfds = ConnectionNumber(xfi->display); - xfi->screen_number = DefaultScreen(xfi->display); - xfi->screen = ScreenOfDisplay(xfi->display, xfi->screen_number); - xfi->depth = DefaultDepthOfScreen(xfi->screen); - xfi->big_endian = (ImageByteOrder(xfi->display) == MSBFirst); + xfc->xfds = ConnectionNumber(xfc->display); + xfc->screen_number = DefaultScreen(xfc->display); + xfc->screen = ScreenOfDisplay(xfc->display, xfc->screen_number); + xfc->depth = DefaultDepthOfScreen(xfc->screen); + xfc->big_endian = (ImageByteOrder(xfc->display) == MSBFirst); - xfi->complex_regions = TRUE; - xfi->fullscreen = settings->Fullscreen; - xfi->grab_keyboard = settings->GrabKeyboard; - xfi->fullscreen_toggle = settings->ToggleFullscreen; + xfc->complex_regions = TRUE; + xfc->fullscreen = settings->Fullscreen; + xfc->grab_keyboard = settings->GrabKeyboard; + xfc->fullscreen_toggle = settings->ToggleFullscreen; - xf_detect_monitors(xfi, settings); + xf_detect_monitors(xfc, settings); return TRUE; } @@ -883,103 +853,101 @@ BOOL xf_pre_connect(freerdp* instance) */ BOOL xf_post_connect(freerdp* instance) { - xfInfo* xfi; XGCValues gcv; rdpCache* cache; rdpChannels* channels; rdpSettings* settings; + ResizeWindowEventArgs e; RFX_CONTEXT* rfx_context = NULL; NSC_CONTEXT* nsc_context = NULL; + xfContext* xfc = (xfContext*) instance->context; - xfi = ((xfContext*) instance->context)->xfi; cache = instance->context->cache; - channels = xfi->_context->channels; + channels = instance->context->channels; settings = instance->settings; - if (!xf_get_pixmap_info(xfi)) + if (!xf_get_pixmap_info(xfc)) return FALSE; xf_register_graphics(instance->context->graphics); - - - if (xfi->settings->SoftwareGdi) + if (xfc->settings->SoftwareGdi) { rdpGdi* gdi; UINT32 flags; flags = CLRCONV_ALPHA; - if (xfi->bpp > 16) + if (xfc->bpp > 16) flags |= CLRBUF_32BPP; else flags |= CLRBUF_16BPP; gdi_init(instance, flags, NULL); gdi = instance->context->gdi; - xfi->primary_buffer = gdi->primary_buffer; + xfc->primary_buffer = gdi->primary_buffer; rfx_context = gdi->rfx_context; } else { - xfi->srcBpp = instance->settings->ColorDepth; + xfc->srcBpp = instance->settings->ColorDepth; xf_gdi_register_update_callbacks(instance->update); - xfi->hdc = gdi_CreateDC(xfi->clrconv, xfi->bpp); + xfc->hdc = gdi_CreateDC(xfc->clrconv, xfc->bpp); if (instance->settings->RemoteFxCodec) { rfx_context = (void*) rfx_context_new(); - xfi->rfx_context = rfx_context; + xfc->rfx_context = rfx_context; } if (instance->settings->NSCodec) { nsc_context = (void*) nsc_context_new(); - xfi->nsc_context = nsc_context; + xfc->nsc_context = nsc_context; } } - xfi->originalWidth = settings->DesktopWidth; - xfi->originalHeight = settings->DesktopHeight; - xfi->currentWidth = xfi->originalWidth; - xfi->currentHeight = xfi->originalWidth; - xfi->scale = 1.0; + xfc->originalWidth = settings->DesktopWidth; + xfc->originalHeight = settings->DesktopHeight; + xfc->currentWidth = xfc->originalWidth; + xfc->currentHeight = xfc->originalWidth; + xfc->scale = 1.0; - xfi->offset_x = 0; - xfi->offset_y = 0; + xfc->offset_x = 0; + xfc->offset_y = 0; - xfi->width = settings->DesktopWidth; - xfi->height = settings->DesktopHeight; + xfc->width = settings->DesktopWidth; + xfc->height = settings->DesktopHeight; if (settings->RemoteApplicationMode) - xfi->remote_app = TRUE; + xfc->remote_app = TRUE; - xf_create_window(xfi); + xf_create_window(xfc); ZeroMemory(&gcv, sizeof(gcv)); - xfi->modifier_map = XGetModifierMapping(xfi->display); + xfc->modifier_map = XGetModifierMapping(xfc->display); - xfi->gc = XCreateGC(xfi->display, xfi->drawable, GCGraphicsExposures, &gcv); - xfi->primary = XCreatePixmap(xfi->display, xfi->drawable, xfi->width, xfi->height, xfi->depth); - xfi->drawing = xfi->primary; + xfc->gc = XCreateGC(xfc->display, xfc->drawable, GCGraphicsExposures, &gcv); + xfc->primary = XCreatePixmap(xfc->display, xfc->drawable, xfc->width, xfc->height, xfc->depth); + xfc->drawing = xfc->primary; - xfi->bitmap_mono = XCreatePixmap(xfi->display, xfi->drawable, 8, 8, 1); - xfi->gc_mono = XCreateGC(xfi->display, xfi->bitmap_mono, GCGraphicsExposures, &gcv); + xfc->bitmap_mono = XCreatePixmap(xfc->display, xfc->drawable, 8, 8, 1); + xfc->gc_mono = XCreateGC(xfc->display, xfc->bitmap_mono, GCGraphicsExposures, &gcv); - XSetFunction(xfi->display, xfi->gc, GXcopy); - XSetFillStyle(xfi->display, xfi->gc, FillSolid); - XSetForeground(xfi->display, xfi->gc, BlackPixelOfScreen(xfi->screen)); - XFillRectangle(xfi->display, xfi->primary, xfi->gc, 0, 0, xfi->width, xfi->height); - XFlush(xfi->display); + XSetFunction(xfc->display, xfc->gc, GXcopy); + XSetFillStyle(xfc->display, xfc->gc, FillSolid); + XSetForeground(xfc->display, xfc->gc, BlackPixelOfScreen(xfc->screen)); + XFillRectangle(xfc->display, xfc->primary, xfc->gc, 0, 0, xfc->width, xfc->height); + XFlush(xfc->display); - xfi->image = XCreateImage(xfi->display, xfi->visual, xfi->depth, ZPixmap, 0, - (char*) xfi->primary_buffer, xfi->width, xfi->height, xfi->scanline_pad, 0); + xfc->image = XCreateImage(xfc->display, xfc->visual, xfc->depth, ZPixmap, 0, + (char*) xfc->primary_buffer, xfc->width, xfc->height, xfc->scanline_pad, 0); - xfi->bmp_codec_none = (BYTE*) malloc(64 * 64 * 4); + xfc->bmp_codec_none = (BYTE*) malloc(64 * 64 * 4); - if (xfi->settings->SoftwareGdi) + if (xfc->settings->SoftwareGdi) { instance->update->BeginPaint = xf_sw_begin_paint; instance->update->EndPaint = xf_sw_end_paint; @@ -994,7 +962,7 @@ BOOL xf_post_connect(freerdp* instance) pointer_cache_register_callbacks(instance->update); - if (!xfi->settings->SoftwareGdi) + if (!xfc->settings->SoftwareGdi) { glyph_cache_register_callbacks(instance->update); brush_cache_register_callbacks(instance->update); @@ -1005,23 +973,18 @@ BOOL xf_post_connect(freerdp* instance) instance->context->rail = rail_new(instance->settings); rail_register_update_callbacks(instance->context->rail, instance->update); - xf_rail_register_callbacks(xfi, instance->context->rail); + xf_rail_register_callbacks(xfc, instance->context->rail); freerdp_channels_post_connect(channels, instance); - xf_tsmf_init(xfi, xv_port); + xf_tsmf_init(xfc, xv_port); - xf_cliprdr_init(xfi, channels); + xf_cliprdr_init(xfc, channels); - //begin init touch input - - { - - } - - //end init touch input - - IFCALL(xfi->client->OnResizeWindow, instance, settings->DesktopWidth, settings->DesktopHeight); + EventArgsInit(&e, "xfreerdp"); + e.width = settings->DesktopWidth; + e.height = settings->DesktopHeight; + PubSub_OnResizeWindow(((rdpContext*) xfc)->pubSub, xfc, &e); return TRUE; } @@ -1102,11 +1065,9 @@ BOOL xf_verify_certificate(freerdp* instance, char* subject, char* issuer, char* int xf_logon_error_info(freerdp* instance, UINT32 data, UINT32 type) { - xfInfo* xfi; + xfContext* xfc = (xfContext*) instance->context; - xfi = ((xfContext*) instance->context)->xfi; - - xf_rail_disable_remoteapp_mode(xfi); + xf_rail_disable_remoteapp_mode(xfc); return 1; } @@ -1118,10 +1079,10 @@ int xf_receive_channel_data(freerdp* instance, int channelId, BYTE* data, int si void xf_process_channel_event(rdpChannels* channels, freerdp* instance) { - xfInfo* xfi; + xfContext* xfc; wMessage* event; - xfi = ((xfContext*) instance->context)->xfi; + xfc = (xfContext*) instance->context; event = freerdp_channels_pop_event(channels); @@ -1130,19 +1091,19 @@ void xf_process_channel_event(rdpChannels* channels, freerdp* instance) switch (GetMessageClass(event->id)) { case RailChannel_Class: - xf_process_rail_event(xfi, channels, event); + xf_process_rail_event(xfc, channels, event); break; case TsmfChannel_Class: - xf_process_tsmf_event(xfi, event); + xf_process_tsmf_event(xfc, event); break; case CliprdrChannel_Class: - xf_process_cliprdr_event(xfi, event); + xf_process_cliprdr_event(xfc, event); break; case RdpeiChannel_Class: - xf_process_rdpei_event(xfi, event); + xf_process_rdpei_event(xfc, event); break; default: @@ -1153,79 +1114,97 @@ void xf_process_channel_event(rdpChannels* channels, freerdp* instance) } } -void xf_window_free(xfInfo* xfi) +void xf_window_free(xfContext* xfc) { - rdpContext* context = xfi->instance->context; + rdpContext* context = (rdpContext*) xfc; - XFreeModifiermap(xfi->modifier_map); - xfi->modifier_map = 0; - - if (xfi->gc) + if (xfc->modifier_map) { - XFreeGC(xfi->display, xfi->gc); - xfi->gc = 0; + XFreeModifiermap(xfc->modifier_map); + xfc->modifier_map = NULL; } - if (xfi->gc_mono) + if (xfc->gc) { - XFreeGC(xfi->display, xfi->gc_mono); - xfi->gc_mono = 0; + XFreeGC(xfc->display, xfc->gc); + xfc->gc = 0; } - if (xfi->window) + if (xfc->gc_mono) { - xf_DestroyWindow(xfi, xfi->window); - xfi->window = NULL; + XFreeGC(xfc->display, xfc->gc_mono); + xfc->gc_mono = 0; } - if (xfi->primary) + if (xfc->window) { - XFreePixmap(xfi->display, xfi->primary); - xfi->primary = 0; + xf_DestroyWindow(xfc, xfc->window); + xfc->window = NULL; } - if (xfi->bitmap_mono) + if (xfc->primary) { - XFreePixmap(xfi->display, xfi->bitmap_mono); - xfi->bitmap_mono = 0; + XFreePixmap(xfc->display, xfc->primary); + xfc->primary = 0; } - if (xfi->image) + if (xfc->bitmap_mono) { - xfi->image->data = NULL; - XDestroyImage(xfi->image); - xfi->image = NULL; + XFreePixmap(xfc->display, xfc->bitmap_mono); + xfc->bitmap_mono = 0; } - if (context) + if (xfc->image) + { + xfc->image->data = NULL; + XDestroyImage(xfc->image); + xfc->image = NULL; + } + + if (context->cache) { cache_free(context->cache); context->cache = NULL; + } + if (context->rail) + { rail_free(context->rail); context->rail = NULL; } - if (xfi->rfx_context) + if (xfc->rfx_context) { - rfx_context_free(xfi->rfx_context); - xfi->rfx_context = NULL; + rfx_context_free(xfc->rfx_context); + xfc->rfx_context = NULL; } - if (xfi->nsc_context) + if (xfc->nsc_context) { - nsc_context_free(xfi->nsc_context); - xfi->nsc_context = NULL; + nsc_context_free(xfc->nsc_context); + xfc->nsc_context = NULL; } - freerdp_clrconv_free(xfi->clrconv); - xfi->clrconv = NULL; + if (xfc->clrconv) + { + freerdp_clrconv_free(xfc->clrconv); + xfc->clrconv = NULL; + } - if (xfi->hdc) - gdi_DeleteDC(xfi->hdc); + if (xfc->hdc) + gdi_DeleteDC(xfc->hdc); - xf_tsmf_uninit(xfi); - xf_cliprdr_uninit(xfi); + if (xfc->xv_context) + { + xf_tsmf_uninit(xfc); + xfc->xv_context = NULL; + } + + if (xfc->clipboard_context) + { + xf_cliprdr_uninit(xfc); + xfc->clipboard_context = NULL; + } } void* xf_update_thread(void* arg) @@ -1257,7 +1236,7 @@ void* xf_update_thread(void* arg) void* xf_input_thread(void* arg) { - xfInfo* xfi; + xfContext* xfc; HANDLE event; XEvent xevent; wMessageQueue* queue; @@ -1265,31 +1244,29 @@ void* xf_input_thread(void* arg) int process_status = 1; freerdp* instance = (freerdp*) arg; - xfi = ((xfContext*) instance->context)->xfi; + xfc = (xfContext*) instance->context; - //xf_input_init(xfi); - - event = CreateFileDescriptorEvent(NULL, FALSE, FALSE, xfi->xfds); + event = CreateFileDescriptorEvent(NULL, FALSE, FALSE, xfc->xfds); while (WaitForSingleObject(event, INFINITE) == WAIT_OBJECT_0) { do { - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); - pending_status = XPending(xfi->display); + pending_status = XPending(xfc->display); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); if (pending_status) { - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); ZeroMemory(&xevent, sizeof(xevent)); - XNextEvent(xfi->display, &xevent); + XNextEvent(xfc->display, &xevent); process_status = xf_event_process(instance, &xevent); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); if (!process_status) break; @@ -1310,12 +1287,12 @@ void* xf_input_thread(void* arg) void* xf_channels_thread(void* arg) { int status; - xfInfo* xfi; + xfContext* xfc; HANDLE event; rdpChannels* channels; freerdp* instance = (freerdp*) arg; - xfi = ((xfContext*) instance->context)->xfi; + xfc = (xfContext*) instance->context; channels = instance->context->channels; event = freerdp_channels_get_event_handle(instance); @@ -1340,7 +1317,7 @@ void* xf_thread(void* param) { int i; int fds; - xfInfo* xfi; + xfContext* xfc; int max_fds; int rcount; int wcount; @@ -1376,7 +1353,7 @@ void* xf_thread(void* param) status = freerdp_connect(instance); - xfi = ((xfContext*) instance->context)->xfi; + xfc = (xfContext*) instance->context; /* Connection succeeded. --authonly ? */ if (instance->settings->AuthenticationOnly) @@ -1391,6 +1368,7 @@ void* xf_thread(void* param) exit_code = XF_EXIT_CONN_FAILED; ExitThread(exit_code); } + channels = instance->context->channels; settings = instance->context->settings; @@ -1414,14 +1392,14 @@ void* xf_thread(void* param) channels_thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) xf_channels_thread, instance, 0, NULL); } - while (!xfi->disconnect && !freerdp_shall_disconnect(instance)) + while (!xfc->disconnect && !freerdp_shall_disconnect(instance)) { rcount = 0; wcount = 0; if (freerdp_focus_required(instance)) { - xf_kbd_focus_in(xfi); + xf_kbd_focus_in(xfc); } if (!async_transport) @@ -1532,7 +1510,7 @@ void* xf_thread(void* param) if (!freerdp_message_queue_process_pending_messages(instance, FREERDP_INPUT_MESSAGE_QUEUE)) { fprintf(stderr, "User Disconnect\n"); - xfi->disconnect = TRUE; + xfc->disconnect = TRUE; break; } } @@ -1613,29 +1591,45 @@ DWORD xf_exit_code_from_disconnect_reason(DWORD reason) return reason; } +void xf_TerminateEventHandler(rdpContext* context, TerminateEventArgs* e) +{ + wMessageQueue* queue; + xfContext* xfc = (xfContext*) context; + + if (context->settings->AsyncInput) + { + queue = freerdp_get_message_queue(context->instance, FREERDP_INPUT_MESSAGE_QUEUE); + + if (queue) + MessageQueue_PostQuit(queue, 0); + } + else + { + xfc->disconnect = TRUE; + } +} + /** * Client Interface */ -int freerdp_client_global_init() +void xfreerdp_client_global_init() { setlocale(LC_ALL, ""); freerdp_handle_signals(); freerdp_channels_global_init(); - - return 0; } -int freerdp_client_global_uninit() +void xfreerdp_client_global_uninit() { freerdp_channels_global_uninit(); - - return 0; } -int freerdp_client_start(xfInfo* xfi) +int xfreerdp_client_start(rdpContext* context) { - rdpSettings* settings = xfi->settings; + xfContext* xfc = (xfContext*) context; + + rdpSettings* settings = context->settings; if (!settings->ServerHostname) { @@ -1643,93 +1637,98 @@ int freerdp_client_start(xfInfo* xfi) return -1; } - xfi->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) xf_thread, (void*) xfi->instance, 0, NULL); + xfc->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) xf_thread, context->instance, 0, NULL); return 0; } -int freerdp_client_stop(xfInfo* xfi) +int xfreerdp_client_stop(rdpContext* context) { - if (xfi->instance->settings->AsyncInput) + xfContext* xfc = (xfContext*) context; + + if (context->settings->AsyncInput) { wMessageQueue* queue; - queue = freerdp_get_message_queue(xfi->instance, FREERDP_INPUT_MESSAGE_QUEUE); - MessageQueue_PostQuit(queue, 0); + queue = freerdp_get_message_queue(context->instance, FREERDP_INPUT_MESSAGE_QUEUE); + + if (queue) + MessageQueue_PostQuit(queue, 0); } else { - xfi->disconnect = TRUE; + xfc->disconnect = TRUE; } return 0; } -freerdp* freerdp_client_get_instance(cfInfo* cfi) +double freerdp_client_get_scale(rdpContext* context) { - return cfi->instance; + xfContext* xfc = (xfContext*) context; + return xfc->scale; } -HANDLE freerdp_client_get_thread(cfInfo* cfi) -{ - return cfi->thread; -} -rdpClient* freerdp_client_get_interface(cfInfo* cfi) +void freerdp_client_set_scale(rdpContext* context, double newScale) { - return cfi->client; -} + ResizeWindowEventArgs e; -double freerdp_client_get_scale(xfInfo* xfi) -{ - return xfi->scale; -} + xfContext* xfc = (xfContext*) context; + xfc->scale = newScale; -void freerdp_client_set_scale(xfInfo* xfi, double newScale) -{ - xfi->scale = newScale; - - xfi->currentWidth = xfi->originalWidth * xfi->scale; - xfi->currentHeight = xfi->originalHeight * xfi->scale; + xfc->currentWidth = xfc->originalWidth * xfc->scale; + xfc->currentHeight = xfc->originalHeight * xfc->scale; - xf_transform_window(xfi); - IFCALL(xfi->client->OnResizeWindow, xfi->instance, xfi->originalWidth * xfi->scale, xfi->originalHeight * xfi->scale); - xf_draw_screen_scaled(xfi, 0, 0, 0, 0, FALSE); + xf_transform_window(xfc); + //IFCALL(xfc->client->OnResizeWindow, xfc->instance, xfc->originalWidth * xfc->scale, xfc->originalHeight * xfc->scale); + + EventArgsInit(&e, "xfreerdp"); + e.width = (int) xfc->originalWidth * xfc->scale; + e.height = (int) xfc->originalHeight * xfc->scale; + PubSub_OnResizeWindow(((rdpContext*) xfc)->pubSub, xfc, &e); + + xf_draw_screen_scaled(xfc, 0, 0, 0, 0, FALSE); } -int freerdp_client_get_xpan(xfInfo* xfi) +int freerdp_client_get_xpan(xfContext* xfc) { - return xfi->offset_x; + return xfc->offset_x; } -int freerdp_client_get_ypan(xfInfo* xfi) +int freerdp_client_get_ypan(xfContext* xfc) { - return xfi->offset_y; + return xfc->offset_y; } -void freerdp_client_reset_scale(xfInfo* xfi) +void freerdp_client_reset_scale(xfContext* xfc) { - xfi->scale = 1.0; - xfi->offset_x = 0; - xfi->offset_y = 0; + ResizeWindowEventArgs e; - xfi->currentWidth = xfi->originalWidth; - xfi->currentHeight = xfi->originalHeight; + xfc->scale = 1.0; + xfc->offset_x = 0; + xfc->offset_y = 0; - XResizeWindow(xfi->display, xfi->window->handle, xfi->originalWidth * xfi->scale, xfi->originalHeight * xfi->scale); - IFCALL(xfi->client->OnResizeWindow, xfi->instance, xfi->originalWidth * xfi->scale, xfi->originalHeight * xfi->scale); - xf_draw_screen_scaled(xfi, 0, 0, 0, 0, FALSE); + xfc->currentWidth = xfc->originalWidth; + xfc->currentHeight = xfc->originalHeight; + + XResizeWindow(xfc->display, xfc->window->handle, xfc->originalWidth * xfc->scale, xfc->originalHeight * xfc->scale); + //IFCALL(xfc->client->OnResizeWindow, xfc->instance, xfc->originalWidth * xfc->scale, xfc->originalHeight * xfc->scale); + + EventArgsInit(&e, "xfreerdp"); + e.width = (int) xfc->originalWidth * xfc->scale; + e.height = (int) xfc->originalHeight * xfc->scale; + PubSub_OnResizeWindow(((rdpContext*) xfc)->pubSub, xfc, &e); + + xf_draw_screen_scaled(xfc, 0, 0, 0, 0, FALSE); } -xfInfo* freerdp_client_new(int argc, char** argv) +int xfreerdp_client_new(freerdp* instance, rdpContext* context) { - int index; - int status; - xfInfo* xfi; - rdpFile* file; - freerdp* instance; + xfContext* xfc; rdpSettings* settings; - instance = freerdp_new(); + xfc = (xfContext*) instance->context; + instance->PreConnect = xf_pre_connect; instance->PostConnect = xf_post_connect; instance->Authenticate = xf_authenticate; @@ -1737,46 +1736,10 @@ xfInfo* freerdp_client_new(int argc, char** argv) instance->LogonErrorInfo = xf_logon_error_info; instance->ReceiveChannelData = xf_receive_channel_data; - instance->context_size = sizeof(xfContext); - instance->ContextNew = (pContextNew) xf_context_new; - instance->ContextFree = (pContextFree) xf_context_free; - freerdp_context_new(instance); + context->channels = freerdp_channels_new(); - instance->context->argc = argc; - instance->context->argv = (char**) malloc(sizeof(char*) * argc); - - for (index = 0; index < argc; index++) - instance->context->argv[index] = _strdup(argv[index]); - - xfi = (xfInfo*) malloc(sizeof(xfInfo)); - ZeroMemory(xfi, sizeof(xfInfo)); - - ((xfContext*) instance->context)->xfi = xfi; - - 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); - if (status < 0) - { - freerdp_context_free(xfi->instance); - freerdp_free(xfi->instance); - free(xfi); - return NULL; - } - - if (settings->ConnectionFile) - { - file = freerdp_client_rdp_file_new(); - - fprintf(stderr, "Using connection file: %s\n", settings->ConnectionFile); - - freerdp_client_parse_rdp_file(file, settings->ConnectionFile); - freerdp_client_populate_settings_from_rdp_file(file, settings); - } + xfc->settings = instance->context->settings; settings->OsMajorType = OSMAJORTYPE_UNIX; settings->OsMinorType = OSMINORTYPE_NATIVE_XSERVER; @@ -1794,53 +1757,53 @@ xfInfo* freerdp_client_new(int argc, char** argv) settings->OrderSupport[NEG_LINETO_INDEX] = TRUE; settings->OrderSupport[NEG_POLYLINE_INDEX] = TRUE; settings->OrderSupport[NEG_MEMBLT_INDEX] = settings->BitmapCacheEnabled; - settings->OrderSupport[NEG_MEM3BLT_INDEX] = (settings->SoftwareGdi) ? TRUE : FALSE; - 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] = (settings->SoftwareGdi) ? FALSE : TRUE; settings->OrderSupport[NEG_POLYGON_CB_INDEX] = (settings->SoftwareGdi) ? FALSE : TRUE; - settings->OrderSupport[NEG_ELLIPSE_SC_INDEX] = FALSE; settings->OrderSupport[NEG_ELLIPSE_CB_INDEX] = FALSE; - if (settings->ListMonitors) - { - xf_list_monitors(xfi); - } + PubSub_SubscribeTerminate(context->pubSub, (pTerminateEventHandler) xf_TerminateEventHandler); - return xfi; + return 0; } -void freerdp_client_free(xfInfo* xfi) +void xfreerdp_client_free(freerdp* instance, rdpContext* context) { - if (xfi) + xfContext* xfc = (xfContext*) context; + + if (context) { - int index; - rdpContext* context; + xf_window_free(xfc); - xf_window_free(xfi); + if (xfc->bmp_codec_none) + free(xfc->bmp_codec_none); - free(xfi->bmp_codec_none); - - XCloseDisplay(xfi->display); - - context = (rdpContext*) xfi->context; - - for (index = 0; index < context->argc; index++) - free(context->argv[index]); - - free(context->argv); - - freerdp_context_free(xfi->instance); - freerdp_free(xfi->instance); - - free(xfi); + if (xfc->display) + XCloseDisplay(xfc->display); } } + +int RdpClientEntry(RDP_CLIENT_ENTRY_POINTS* pEntryPoints) +{ + pEntryPoints->Version = 1; + pEntryPoints->Size = sizeof(RDP_CLIENT_ENTRY_POINTS_V1); + + pEntryPoints->GlobalInit = xfreerdp_client_global_init; + pEntryPoints->GlobalUninit = xfreerdp_client_global_uninit; + + pEntryPoints->ContextSize = sizeof(xfContext); + pEntryPoints->ClientNew = xfreerdp_client_new; + pEntryPoints->ClientFree = xfreerdp_client_free; + + pEntryPoints->ClientStart = xfreerdp_client_start; + pEntryPoints->ClientStop = xfreerdp_client_stop; + + return 0; +} diff --git a/client/X11/xf_interface.h b/client/X11/xf_client.h similarity index 82% rename from client/X11/xf_interface.h rename to client/X11/xf_client.h index f97fc9045..6d274c605 100644 --- a/client/X11/xf_interface.h +++ b/client/X11/xf_client.h @@ -17,11 +17,12 @@ * limitations under the License. */ -#ifndef __XF_INTERFACE_H -#define __XF_INTERFACE_H +#ifndef __XF_CLIENT_H +#define __XF_CLIENT_H #include #include +#include #include #include @@ -33,8 +34,7 @@ #include #include #include - -typedef struct xf_info xfInfo; +#include #ifdef __cplusplus extern "C" { @@ -242,32 +242,11 @@ DWORD xf_exit_code_from_disconnect_reason(DWORD reason); * Client Interface */ -#define cfInfo xfInfo -FREERDP_API int freerdp_client_get_xpan(xfInfo* xfi); -FREERDP_API int freerdp_client_get_ypan(xfInfo* xfi); - -FREERDP_API double freerdp_client_get_scale(xfInfo* xfi); -FREERDP_API void freerdp_client_set_scale(xfInfo* xfi, double newScale); -FREERDP_API void freerdp_client_reset_scale(xfInfo* xfi); - -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 freerdp* freerdp_client_get_instance(cfInfo* cfi); -FREERDP_API HANDLE freerdp_client_get_thread(cfInfo* cfi); -FREERDP_API rdpClient* freerdp_client_get_interface(cfInfo* cfi); -FREERDP_API double freerdp_client_get_scale(xfInfo* xfi); -FREERDP_API void freerdp_client_reset_scale(xfInfo* xfi); - -FREERDP_API cfInfo* freerdp_client_new(int argc, char** argv); -FREERDP_API void freerdp_client_free(cfInfo* cfi); +FREERDP_API int RdpClientEntry(RDP_CLIENT_ENTRY_POINTS* pEntryPoints); #ifdef __cplusplus } #endif -#endif /* __XF_INTERFACE_H */ +#endif /* __XF_CLIENT_H */ diff --git a/client/X11/xf_cliprdr.c b/client/X11/xf_cliprdr.c index d7e0e44f1..19c433279 100644 --- a/client/X11/xf_cliprdr.c +++ b/client/X11/xf_cliprdr.c @@ -90,7 +90,7 @@ struct clipboard_context int incr_data_length; }; -void xf_cliprdr_init(xfInfo* xfi, rdpChannels* channels) +void xf_cliprdr_init(xfContext* xfc, rdpChannels* channels) { int n; UINT32 id; @@ -99,13 +99,13 @@ void xf_cliprdr_init(xfInfo* xfi, rdpChannels* channels) cb = (clipboardContext*) malloc(sizeof(clipboardContext)); ZeroMemory(cb, sizeof(clipboardContext)); - xfi->clipboard_context = cb; + xfc->clipboard_context = cb; cb->channels = channels; cb->request_index = -1; - cb->root_window = DefaultRootWindow(xfi->display); - cb->clipboard_atom = XInternAtom(xfi->display, "CLIPBOARD", FALSE); + cb->root_window = DefaultRootWindow(xfc->display); + cb->clipboard_atom = XInternAtom(xfc->display, "CLIPBOARD", FALSE); if (cb->clipboard_atom == None) { @@ -113,20 +113,20 @@ void xf_cliprdr_init(xfInfo* xfi, rdpChannels* channels) } id = 1; - cb->property_atom = XInternAtom(xfi->display, "_FREERDP_CLIPRDR", FALSE); - cb->identity_atom = XInternAtom(xfi->display, "_FREERDP_CLIPRDR_ID", FALSE); + cb->property_atom = XInternAtom(xfc->display, "_FREERDP_CLIPRDR", FALSE); + cb->identity_atom = XInternAtom(xfc->display, "_FREERDP_CLIPRDR_ID", FALSE); - XChangeProperty(xfi->display, xfi->drawable, cb->identity_atom, + XChangeProperty(xfc->display, xfc->drawable, cb->identity_atom, XA_INTEGER, 32, PropModeReplace, (BYTE*) &id, 1); - XSelectInput(xfi->display, cb->root_window, PropertyChangeMask); + XSelectInput(xfc->display, cb->root_window, PropertyChangeMask); n = 0; - cb->format_mappings[n].target_format = XInternAtom(xfi->display, "_FREERDP_RAW", FALSE); + cb->format_mappings[n].target_format = XInternAtom(xfc->display, "_FREERDP_RAW", FALSE); cb->format_mappings[n].format_id = CB_FORMAT_RAW; n++; - cb->format_mappings[n].target_format = XInternAtom(xfi->display, "UTF8_STRING", FALSE); + cb->format_mappings[n].target_format = XInternAtom(xfc->display, "UTF8_STRING", FALSE); cb->format_mappings[n].format_id = CB_FORMAT_UNICODETEXT; n++; @@ -134,36 +134,36 @@ void xf_cliprdr_init(xfInfo* xfi, rdpChannels* channels) cb->format_mappings[n].format_id = CB_FORMAT_TEXT; n++; - cb->format_mappings[n].target_format = XInternAtom(xfi->display, "image/png", FALSE); + cb->format_mappings[n].target_format = XInternAtom(xfc->display, "image/png", FALSE); cb->format_mappings[n].format_id = CB_FORMAT_PNG; n++; - cb->format_mappings[n].target_format = XInternAtom(xfi->display, "image/jpeg", FALSE); + cb->format_mappings[n].target_format = XInternAtom(xfc->display, "image/jpeg", FALSE); cb->format_mappings[n].format_id = CB_FORMAT_JPEG; n++; - cb->format_mappings[n].target_format = XInternAtom(xfi->display, "image/gif", FALSE); + cb->format_mappings[n].target_format = XInternAtom(xfc->display, "image/gif", FALSE); cb->format_mappings[n].format_id = CB_FORMAT_GIF; n++; - cb->format_mappings[n].target_format = XInternAtom(xfi->display, "image/bmp", FALSE); + cb->format_mappings[n].target_format = XInternAtom(xfc->display, "image/bmp", FALSE); cb->format_mappings[n].format_id = CB_FORMAT_DIB; n++; - cb->format_mappings[n].target_format = XInternAtom(xfi->display, "text/html", FALSE); + cb->format_mappings[n].target_format = XInternAtom(xfc->display, "text/html", FALSE); cb->format_mappings[n].format_id = CB_FORMAT_HTML; cb->num_format_mappings = n + 1; - cb->targets[0] = XInternAtom(xfi->display, "TIMESTAMP", FALSE); - cb->targets[1] = XInternAtom(xfi->display, "TARGETS", FALSE); + cb->targets[0] = XInternAtom(xfc->display, "TIMESTAMP", FALSE); + cb->targets[1] = XInternAtom(xfc->display, "TARGETS", FALSE); cb->num_targets = 2; - cb->incr_atom = XInternAtom(xfi->display, "INCR", FALSE); + cb->incr_atom = XInternAtom(xfc->display, "INCR", FALSE); } -void xf_cliprdr_uninit(xfInfo* xfi) +void xf_cliprdr_uninit(xfContext* xfc) { - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; if (cb) { @@ -172,7 +172,7 @@ void xf_cliprdr_uninit(xfInfo* xfi) free(cb->respond); free(cb->incr_data); free(cb); - xfi->clipboard_context = NULL; + xfc->clipboard_context = NULL; } } @@ -250,20 +250,20 @@ static void be2le(BYTE* data, int size) } } -static BOOL xf_cliprdr_is_self_owned(xfInfo* xfi) +static BOOL xf_cliprdr_is_self_owned(xfContext* xfc) { Atom type; UINT32 id = 0; UINT32* pid = NULL; int format, result = 0; unsigned long length, bytes_left; - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; - cb->owner = XGetSelectionOwner(xfi->display, cb->clipboard_atom); + cb->owner = XGetSelectionOwner(xfc->display, cb->clipboard_atom); if (cb->owner != None) { - result = XGetWindowProperty(xfi->display, cb->owner, + result = XGetWindowProperty(xfc->display, cb->owner, cb->identity_atom, 0, 4, 0, XA_INTEGER, &type, &format, &length, &bytes_left, (BYTE**) &pid); } @@ -274,7 +274,7 @@ static BOOL xf_cliprdr_is_self_owned(xfInfo* xfi) XFree(pid); } - if ((cb->owner == None) || (cb->owner == xfi->drawable)) + if ((cb->owner == None) || (cb->owner == xfc->drawable)) return FALSE; if (result != Success) @@ -322,16 +322,16 @@ static int xf_cliprdr_select_format_by_atom(clipboardContext* cb, Atom target) return -1; } -static void xf_cliprdr_send_raw_format_list(xfInfo* xfi) +static void xf_cliprdr_send_raw_format_list(xfContext* xfc) { Atom type; BYTE* format_data; int format, result; unsigned long length, bytes_left; RDP_CB_FORMAT_LIST_EVENT* event; - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; - result = XGetWindowProperty(xfi->display, cb->root_window, + result = XGetWindowProperty(xfc->display, cb->root_window, cb->property_atom, 0, 3600, 0, XA_STRING, &type, &format, &length, &bytes_left, (BYTE**) &format_data); @@ -353,10 +353,10 @@ static void xf_cliprdr_send_raw_format_list(xfInfo* xfi) freerdp_channels_send_event(cb->channels, (wMessage*) event); } -static void xf_cliprdr_send_null_format_list(xfInfo* xfi) +static void xf_cliprdr_send_null_format_list(xfContext* xfc) { RDP_CB_FORMAT_LIST_EVENT* event; - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; event = (RDP_CB_FORMAT_LIST_EVENT*) freerdp_event_new(CliprdrChannel_Class, CliprdrChannel_FormatList, NULL, NULL); @@ -366,11 +366,11 @@ static void xf_cliprdr_send_null_format_list(xfInfo* xfi) freerdp_channels_send_event(cb->channels, (wMessage*) event); } -static void xf_cliprdr_send_supported_format_list(xfInfo* xfi) +static void xf_cliprdr_send_supported_format_list(xfContext* xfc) { int i; RDP_CB_FORMAT_LIST_EVENT* event; - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; event = (RDP_CB_FORMAT_LIST_EVENT*) freerdp_event_new(CliprdrChannel_Class, CliprdrChannel_FormatList, NULL, NULL); @@ -384,30 +384,30 @@ static void xf_cliprdr_send_supported_format_list(xfInfo* xfi) freerdp_channels_send_event(cb->channels, (wMessage*) event); } -static void xf_cliprdr_send_format_list(xfInfo* xfi) +static void xf_cliprdr_send_format_list(xfContext* xfc) { - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; - if (xf_cliprdr_is_self_owned(xfi)) + if (xf_cliprdr_is_self_owned(xfc)) { - xf_cliprdr_send_raw_format_list(xfi); + xf_cliprdr_send_raw_format_list(xfc); } else if (cb->owner == None) { - xf_cliprdr_send_null_format_list(xfi); + xf_cliprdr_send_null_format_list(xfc); } - else if (cb->owner != xfi->drawable) + else if (cb->owner != xfc->drawable) { /* Request the owner for TARGETS, and wait for SelectionNotify event */ - XConvertSelection(xfi->display, cb->clipboard_atom, - cb->targets[1], cb->property_atom, xfi->drawable, CurrentTime); + XConvertSelection(xfc->display, cb->clipboard_atom, + cb->targets[1], cb->property_atom, xfc->drawable, CurrentTime); } } -static void xf_cliprdr_send_data_request(xfInfo* xfi, UINT32 format) +static void xf_cliprdr_send_data_request(xfContext* xfc, UINT32 format) { RDP_CB_DATA_REQUEST_EVENT* event; - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; event = (RDP_CB_DATA_REQUEST_EVENT*) freerdp_event_new(CliprdrChannel_Class, CliprdrChannel_DataRequest, NULL, NULL); @@ -417,10 +417,10 @@ static void xf_cliprdr_send_data_request(xfInfo* xfi, UINT32 format) freerdp_channels_send_event(cb->channels, (wMessage*) event); } -static void xf_cliprdr_send_data_response(xfInfo* xfi, BYTE* data, int size) +static void xf_cliprdr_send_data_response(xfContext* xfc, BYTE* data, int size) { RDP_CB_DATA_RESPONSE_EVENT* event; - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; event = (RDP_CB_DATA_RESPONSE_EVENT*) freerdp_event_new(CliprdrChannel_Class, CliprdrChannel_DataResponse, NULL, NULL); @@ -431,31 +431,31 @@ static void xf_cliprdr_send_data_response(xfInfo* xfi, BYTE* data, int size) freerdp_channels_send_event(cb->channels, (wMessage*) event); } -static void xf_cliprdr_send_null_data_response(xfInfo* xfi) +static void xf_cliprdr_send_null_data_response(xfContext* xfc) { - xf_cliprdr_send_data_response(xfi, NULL, 0); + xf_cliprdr_send_data_response(xfc, NULL, 0); } -static void xf_cliprdr_process_cb_monitor_ready_event(xfInfo* xfi) +static void xf_cliprdr_process_cb_monitor_ready_event(xfContext* xfc) { - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; - xf_cliprdr_send_format_list(xfi); + xf_cliprdr_send_format_list(xfc); cb->sync = TRUE; } -static void xf_cliprdr_process_cb_data_request_event(xfInfo* xfi, RDP_CB_DATA_REQUEST_EVENT* event) +static void xf_cliprdr_process_cb_data_request_event(xfContext* xfc, RDP_CB_DATA_REQUEST_EVENT* event) { int i; - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; DEBUG_X11_CLIPRDR("format %d", event->format); - if (xf_cliprdr_is_self_owned(xfi)) + if (xf_cliprdr_is_self_owned(xfc)) { /* CB_FORMAT_RAW */ i = 0; - XChangeProperty(xfi->display, xfi->drawable, cb->property_atom, + XChangeProperty(xfc->display, xfc->drawable, cb->property_atom, XA_INTEGER, 32, PropModeReplace, (BYTE*) &event->format, 1); } else @@ -466,7 +466,7 @@ static void xf_cliprdr_process_cb_data_request_event(xfInfo* xfi, RDP_CB_DATA_RE if (i < 0) { DEBUG_X11_CLIPRDR("unsupported format requested"); - xf_cliprdr_send_null_data_response(xfi); + xf_cliprdr_send_null_data_response(xfc); } else { @@ -474,15 +474,15 @@ static void xf_cliprdr_process_cb_data_request_event(xfInfo* xfi, RDP_CB_DATA_RE DEBUG_X11_CLIPRDR("target=%d", (int) cb->format_mappings[i].target_format); - XConvertSelection(xfi->display, cb->clipboard_atom, + XConvertSelection(xfc->display, cb->clipboard_atom, cb->format_mappings[i].target_format, cb->property_atom, - xfi->drawable, CurrentTime); - XFlush(xfi->display); + xfc->drawable, CurrentTime); + XFlush(xfc->display); /* After this point, we expect a SelectionNotify event from the clipboard owner. */ } } -static void xf_cliprdr_get_requested_targets(xfInfo* xfi) +static void xf_cliprdr_get_requested_targets(xfContext* xfc) { int num; int i, j; @@ -491,9 +491,9 @@ static void xf_cliprdr_get_requested_targets(xfInfo* xfi) BYTE* data = NULL; unsigned long length, bytes_left; RDP_CB_FORMAT_LIST_EVENT* event; - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; - XGetWindowProperty(xfi->display, xfi->drawable, cb->property_atom, + XGetWindowProperty(xfc->display, xfc->drawable, cb->property_atom, 0, 200, 0, XA_ATOM, &atom, &format, &length, &bytes_left, &data); DEBUG_X11_CLIPRDR("type=%d format=%d length=%d bytes_left=%d", @@ -534,7 +534,7 @@ static void xf_cliprdr_get_requested_targets(xfInfo* xfi) if (data) XFree(data); - xf_cliprdr_send_null_format_list(xfi); + xf_cliprdr_send_null_format_list(xfc); } } @@ -669,17 +669,17 @@ static BYTE* xf_cliprdr_process_requested_html(BYTE* data, int* size) return outbuf; } -static void xf_cliprdr_process_requested_data(xfInfo* xfi, BOOL has_data, BYTE* data, int size) +static void xf_cliprdr_process_requested_data(xfContext* xfc, BOOL has_data, BYTE* data, int size) { BYTE* outbuf; - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; if (cb->incr_starts && has_data) return; if (!has_data || data == NULL) { - xf_cliprdr_send_null_data_response(xfi); + xf_cliprdr_send_null_data_response(xfc); return; } @@ -714,31 +714,31 @@ static void xf_cliprdr_process_requested_data(xfInfo* xfi, BOOL has_data, BYTE* } if (outbuf) - xf_cliprdr_send_data_response(xfi, outbuf, size); + xf_cliprdr_send_data_response(xfc, outbuf, size); else - xf_cliprdr_send_null_data_response(xfi); + xf_cliprdr_send_null_data_response(xfc); /* Resend the format list, otherwise the server won't request again for the next paste */ - xf_cliprdr_send_format_list(xfi); + xf_cliprdr_send_format_list(xfc); } -static BOOL xf_cliprdr_get_requested_data(xfInfo* xfi, Atom target) +static BOOL xf_cliprdr_get_requested_data(xfContext* xfc, Atom target) { Atom type; int format; BYTE* data = NULL; BOOL has_data = FALSE; unsigned long length, bytes_left, dummy; - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; if ((cb->request_index < 0) || (cb->format_mappings[cb->request_index].target_format != target)) { DEBUG_X11_CLIPRDR("invalid target"); - xf_cliprdr_send_null_data_response(xfi); + xf_cliprdr_send_null_data_response(xfc); return FALSE; } - XGetWindowProperty(xfi->display, xfi->drawable, + XGetWindowProperty(xfc->display, xfc->drawable, cb->property_atom, 0, 0, 0, target, &type, &format, &length, &bytes_left, &data); @@ -780,7 +780,7 @@ static BOOL xf_cliprdr_get_requested_data(xfInfo* xfi, Atom target) DEBUG_X11("INCR finished"); has_data = TRUE; } - else if (XGetWindowProperty(xfi->display, xfi->drawable, + else if (XGetWindowProperty(xfc->display, xfc->drawable, cb->property_atom, 0, bytes_left, 0, target, &type, &format, &length, &dummy, &data) == Success) { @@ -801,9 +801,9 @@ static BOOL xf_cliprdr_get_requested_data(xfInfo* xfi, Atom target) DEBUG_X11_CLIPRDR("XGetWindowProperty failed"); } } - XDeleteProperty(xfi->display, xfi->drawable, cb->property_atom); + XDeleteProperty(xfc->display, xfc->drawable, cb->property_atom); - xf_cliprdr_process_requested_data(xfi, has_data, data, (int) bytes_left); + xf_cliprdr_process_requested_data(xfc, has_data, data, (int) bytes_left); if (data) XFree(data); @@ -827,13 +827,13 @@ static void xf_cliprdr_append_target(clipboardContext* cb, Atom target) cb->targets[cb->num_targets++] = target; } -static void xf_cliprdr_provide_targets(xfInfo* xfi, XEvent* respond) +static void xf_cliprdr_provide_targets(xfContext* xfc, XEvent* respond) { - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; if (respond->xselection.property != None) { - XChangeProperty(xfi->display, + XChangeProperty(xfc->display, respond->xselection.requestor, respond->xselection.property, XA_ATOM, 32, PropModeReplace, @@ -841,13 +841,13 @@ static void xf_cliprdr_provide_targets(xfInfo* xfi, XEvent* respond) } } -static void xf_cliprdr_provide_data(xfInfo* xfi, XEvent* respond) +static void xf_cliprdr_provide_data(xfContext* xfc, XEvent* respond) { - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; if (respond->xselection.property != None) { - XChangeProperty(xfi->display, + XChangeProperty(xfc->display, respond->xselection.requestor, respond->xselection.property, respond->xselection.target, 8, PropModeReplace, @@ -855,10 +855,10 @@ static void xf_cliprdr_provide_data(xfInfo* xfi, XEvent* respond) } } -static void xf_cliprdr_process_cb_format_list_event(xfInfo* xfi, RDP_CB_FORMAT_LIST_EVENT* event) +static void xf_cliprdr_process_cb_format_list_event(xfContext* xfc, RDP_CB_FORMAT_LIST_EVENT* event) { int i, j; - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; if (cb->data) { @@ -888,16 +888,16 @@ static void xf_cliprdr_process_cb_format_list_event(xfInfo* xfi, RDP_CB_FORMAT_L } } - XSetSelectionOwner(xfi->display, cb->clipboard_atom, xfi->drawable, CurrentTime); + XSetSelectionOwner(xfc->display, cb->clipboard_atom, xfc->drawable, CurrentTime); if (event->raw_format_data) { - XChangeProperty(xfi->display, cb->root_window, cb->property_atom, + XChangeProperty(xfc->display, cb->root_window, cb->property_atom, XA_STRING, 8, PropModeReplace, event->raw_format_data, event->raw_format_data_size); } - XFlush(xfi->display); + XFlush(xfc->display); } static void xf_cliprdr_process_text(clipboardContext* cb, BYTE* data, int size) @@ -979,9 +979,9 @@ static void xf_cliprdr_process_html(clipboardContext* cb, BYTE* data, int size) crlf2lf(cb->data, &cb->data_length); } -static void xf_cliprdr_process_cb_data_response_event(xfInfo* xfi, RDP_CB_DATA_RESPONSE_EVENT* event) +static void xf_cliprdr_process_cb_data_response_event(xfContext* xfc, RDP_CB_DATA_RESPONSE_EVENT* event) { - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; DEBUG_X11_CLIPRDR("size=%d", event->size); @@ -1035,33 +1035,33 @@ static void xf_cliprdr_process_cb_data_response_event(xfInfo* xfi, RDP_CB_DATA_R cb->respond->xselection.property = None; break; } - xf_cliprdr_provide_data(xfi, cb->respond); + xf_cliprdr_provide_data(xfc, cb->respond); } - XSendEvent(xfi->display, cb->respond->xselection.requestor, 0, 0, cb->respond); - XFlush(xfi->display); + XSendEvent(xfc->display, cb->respond->xselection.requestor, 0, 0, cb->respond); + XFlush(xfc->display); free(cb->respond); cb->respond = NULL; } -void xf_process_cliprdr_event(xfInfo* xfi, wMessage* event) +void xf_process_cliprdr_event(xfContext* xfc, wMessage* event) { switch (GetMessageType(event->id)) { case CliprdrChannel_MonitorReady: - xf_cliprdr_process_cb_monitor_ready_event(xfi); + xf_cliprdr_process_cb_monitor_ready_event(xfc); break; case CliprdrChannel_FormatList: - xf_cliprdr_process_cb_format_list_event(xfi, (RDP_CB_FORMAT_LIST_EVENT*) event); + xf_cliprdr_process_cb_format_list_event(xfc, (RDP_CB_FORMAT_LIST_EVENT*) event); break; case CliprdrChannel_DataRequest: - xf_cliprdr_process_cb_data_request_event(xfi, (RDP_CB_DATA_REQUEST_EVENT*) event); + xf_cliprdr_process_cb_data_request_event(xfc, (RDP_CB_DATA_REQUEST_EVENT*) event); break; case CliprdrChannel_DataResponse: - xf_cliprdr_process_cb_data_response_event(xfi, (RDP_CB_DATA_RESPONSE_EVENT*) event); + xf_cliprdr_process_cb_data_response_event(xfc, (RDP_CB_DATA_RESPONSE_EVENT*) event); break; default: @@ -1070,31 +1070,31 @@ void xf_process_cliprdr_event(xfInfo* xfi, wMessage* event) } } -BOOL xf_cliprdr_process_selection_notify(xfInfo* xfi, XEvent* xevent) +BOOL xf_cliprdr_process_selection_notify(xfContext* xfc, XEvent* xevent) { - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; if (xevent->xselection.target == cb->targets[1]) { if (xevent->xselection.property == None) { DEBUG_X11_CLIPRDR("owner not support TARGETS. sending all format."); - xf_cliprdr_send_supported_format_list(xfi); + xf_cliprdr_send_supported_format_list(xfc); } else { - xf_cliprdr_get_requested_targets(xfi); + xf_cliprdr_get_requested_targets(xfc); } return TRUE; } else { - return xf_cliprdr_get_requested_data(xfi, xevent->xselection.target); + return xf_cliprdr_get_requested_data(xfc, xevent->xselection.target); } } -BOOL xf_cliprdr_process_selection_request(xfInfo* xfi, XEvent* xevent) +BOOL xf_cliprdr_process_selection_request(xfContext* xfc, XEvent* xevent) { int i; int fmt; @@ -1105,11 +1105,11 @@ BOOL xf_cliprdr_process_selection_request(xfInfo* xfi, XEvent* xevent) BYTE* data = NULL; BOOL delay_respond; unsigned long length, bytes_left; - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; DEBUG_X11_CLIPRDR("target=%d", (int) xevent->xselectionrequest.target); - if (xevent->xselectionrequest.owner != xfi->drawable) + if (xevent->xselectionrequest.owner != xfc->drawable) { DEBUG_X11_CLIPRDR("not owner"); return FALSE; @@ -1138,7 +1138,7 @@ BOOL xf_cliprdr_process_selection_request(xfInfo* xfi, XEvent* xevent) /* Someone else requests our available formats */ DEBUG_X11_CLIPRDR("target: TARGETS"); respond->xselection.property = xevent->xselectionrequest.property; - xf_cliprdr_provide_targets(xfi, respond); + xf_cliprdr_provide_targets(xfc, respond); } else { @@ -1146,14 +1146,14 @@ BOOL xf_cliprdr_process_selection_request(xfInfo* xfi, XEvent* xevent) i = xf_cliprdr_select_format_by_atom(cb, xevent->xselectionrequest.target); - if (i >= 0 && xevent->xselectionrequest.requestor != xfi->drawable) + if (i >= 0 && xevent->xselectionrequest.requestor != xfc->drawable) { format = cb->format_mappings[i].format_id; alt_format = format; if (format == CB_FORMAT_RAW) { - if (XGetWindowProperty(xfi->display, xevent->xselectionrequest.requestor, + if (XGetWindowProperty(xfc->display, xevent->xselectionrequest.requestor, cb->property_atom, 0, 4, 0, XA_INTEGER, &type, &fmt, &length, &bytes_left, &data) != Success) { @@ -1172,7 +1172,7 @@ BOOL xf_cliprdr_process_selection_request(xfInfo* xfi, XEvent* xevent) { /* Cached clipboard data available. Send it now */ respond->xselection.property = xevent->xselectionrequest.property; - xf_cliprdr_provide_data(xfi, respond); + xf_cliprdr_provide_data(xfc, respond); } else if (cb->respond) { @@ -1196,36 +1196,36 @@ BOOL xf_cliprdr_process_selection_request(xfInfo* xfi, XEvent* xevent) cb->data_alt_format = alt_format; delay_respond = TRUE; - xf_cliprdr_send_data_request(xfi, alt_format); + xf_cliprdr_send_data_request(xfc, alt_format); } } } if (delay_respond == FALSE) { - XSendEvent(xfi->display, xevent->xselectionrequest.requestor, 0, 0, respond); - XFlush(xfi->display); + XSendEvent(xfc->display, xevent->xselectionrequest.requestor, 0, 0, respond); + XFlush(xfc->display); free(respond); } return TRUE; } -BOOL xf_cliprdr_process_selection_clear(xfInfo* xfi, XEvent* xevent) +BOOL xf_cliprdr_process_selection_clear(xfContext* xfc, XEvent* xevent) { - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; - if (xf_cliprdr_is_self_owned(xfi)) + if (xf_cliprdr_is_self_owned(xfc)) return FALSE; - XDeleteProperty(xfi->display, cb->root_window, cb->property_atom); + XDeleteProperty(xfc->display, cb->root_window, cb->property_atom); return TRUE; } -BOOL xf_cliprdr_process_property_notify(xfInfo* xfi, XEvent* xevent) +BOOL xf_cliprdr_process_property_notify(xfContext* xfc, XEvent* xevent) { - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; if (!cb) return TRUE; @@ -1236,33 +1236,33 @@ BOOL xf_cliprdr_process_property_notify(xfInfo* xfi, XEvent* xevent) if (xevent->xproperty.window == cb->root_window) { DEBUG_X11_CLIPRDR("root window PropertyNotify"); - xf_cliprdr_send_format_list(xfi); + xf_cliprdr_send_format_list(xfc); } - else if (xevent->xproperty.window == xfi->drawable && + else if (xevent->xproperty.window == xfc->drawable && xevent->xproperty.state == PropertyNewValue && cb->incr_starts && cb->request_index >= 0) { DEBUG_X11_CLIPRDR("cliprdr window PropertyNotify"); - xf_cliprdr_get_requested_data(xfi, + xf_cliprdr_get_requested_data(xfc, cb->format_mappings[cb->request_index].target_format); } return TRUE; } -void xf_cliprdr_check_owner(xfInfo* xfi) +void xf_cliprdr_check_owner(xfContext* xfc) { Window owner; - clipboardContext* cb = (clipboardContext*) xfi->clipboard_context; + clipboardContext* cb = (clipboardContext*) xfc->clipboard_context; if (cb->sync) { - owner = XGetSelectionOwner(xfi->display, cb->clipboard_atom); + owner = XGetSelectionOwner(xfc->display, cb->clipboard_atom); if (cb->owner != owner) { cb->owner = owner; - xf_cliprdr_send_format_list(xfi); + xf_cliprdr_send_format_list(xfc); } } } diff --git a/client/X11/xf_cliprdr.h b/client/X11/xf_cliprdr.h index f2ee57dfd..3e3d680ee 100644 --- a/client/X11/xf_cliprdr.h +++ b/client/X11/xf_cliprdr.h @@ -20,16 +20,16 @@ #ifndef __XF_CLIPRDR_H #define __XF_CLIPRDR_H -#include "xf_interface.h" +#include "xf_client.h" #include "xfreerdp.h" -void xf_cliprdr_init(xfInfo* xfi, rdpChannels* chanman); -void xf_cliprdr_uninit(xfInfo* xfi); -void xf_process_cliprdr_event(xfInfo* xfi, wMessage* event); -BOOL xf_cliprdr_process_selection_notify(xfInfo* xfi, XEvent* xevent); -BOOL xf_cliprdr_process_selection_request(xfInfo* xfi, XEvent* xevent); -BOOL xf_cliprdr_process_selection_clear(xfInfo* xfi, XEvent* xevent); -BOOL xf_cliprdr_process_property_notify(xfInfo* xfi, XEvent* xevent); -void xf_cliprdr_check_owner(xfInfo* xfi); +void xf_cliprdr_init(xfContext* xfc, rdpChannels* channels); +void xf_cliprdr_uninit(xfContext* xfc); +void xf_process_cliprdr_event(xfContext* xfc, wMessage* event); +BOOL xf_cliprdr_process_selection_notify(xfContext* xfc, XEvent* xevent); +BOOL xf_cliprdr_process_selection_request(xfContext* xfc, XEvent* xevent); +BOOL xf_cliprdr_process_selection_clear(xfContext* xfc, XEvent* xevent); +BOOL xf_cliprdr_process_property_notify(xfContext* xfc, XEvent* xevent); +void xf_cliprdr_check_owner(xfContext* xfc); #endif /* __XF_CLIPRDR_H */ diff --git a/client/X11/xf_event.c b/client/X11/xf_event.c index a59789763..bbe96ac36 100644 --- a/client/X11/xf_event.c +++ b/client/X11/xf_event.c @@ -85,7 +85,7 @@ const char* const X11_EVENT_STRINGS[] = #define DEBUG_X11_LMS(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__) #endif -static BOOL xf_event_Expose(xfInfo* xfi, XEvent* event, BOOL app) +static BOOL xf_event_Expose(xfContext* xfc, XEvent* event, BOOL app) { int x, y; int w, h; @@ -97,23 +97,21 @@ static BOOL xf_event_Expose(xfInfo* xfi, XEvent* event, BOOL app) if (!app) { - - //if (xfi->scale != 1.0) if ((xfi->scale != 1.0) || (xfi->offset_x) || (xfi->offset_y)) { - xf_draw_screen_scaled(xfi, x - xfi->offset_x, - y - xfi->offset_y, w, h, FALSE); + xf_draw_screen_scaled(xfc, x - xfc->offset_x, + y - xfc->offset_y, w, h, FALSE); } else { - XCopyArea(xfi->display, xfi->primary, - xfi->window->handle, xfi->gc, x, y, w, + XCopyArea(xfc->display, xfc->primary, + xfc->window->handle, xfc->gc, x, y, w, h, x, y); } } else { xfWindow* xfw; rdpWindow* window; - rdpRail* rail = ((rdpContext*) xfi->context)->rail; + rdpRail* rail = ((rdpContext*) xfc)->rail; window = window_list_get_by_extra_id(rail->list, (void*) event->xexpose.window); @@ -121,101 +119,93 @@ static BOOL xf_event_Expose(xfInfo* xfi, XEvent* event, BOOL app) if (window != NULL ) { xfw = (xfWindow*) window->extra; - xf_UpdateWindowArea(xfi, xfw, x, y, w, h); + xf_UpdateWindowArea(xfc, xfw, x, y, w, h); } } return TRUE; } -static BOOL xf_event_VisibilityNotify(xfInfo* xfi, XEvent* event, BOOL app) +static BOOL xf_event_VisibilityNotify(xfContext* xfc, XEvent* event, BOOL app) { - xfi->unobscured = event->xvisibility.state == VisibilityUnobscured; + xfc->unobscured = event->xvisibility.state == VisibilityUnobscured; return TRUE; } -static BOOL xf_event_MotionNotify(xfInfo* xfi, XEvent* event, BOOL app) +BOOL xf_generic_MotionNotify(xfContext* xfc, int x, int y, int state, Window window, BOOL app) { - int x, y; rdpInput* input; Window childWindow; - input = xfi->instance->input; - x = event->xmotion.x; - y = event->xmotion.y; + input = xfc->instance->input; - if (!xfi->settings->MouseMotion) + if (!xfc->settings->MouseMotion) { - if ((event->xmotion.state & (Button1Mask | Button2Mask | Button3Mask)) == 0) + if ((state & (Button1Mask | Button2Mask | Button3Mask)) == 0) return TRUE; - } + } if (app) { /* make sure window exists */ - if (xf_rdpWindowFromWindow(xfi, event->xmotion.window) == 0) + if (xf_rdpWindowFromWindow(xfc, window) == 0) { return TRUE; } /* Translate to desktop coordinates */ - XTranslateCoordinates(xfi->display, event->xmotion.window, - RootWindowOfScreen(xfi->screen), + XTranslateCoordinates(xfc->display, window, + RootWindowOfScreen(xfc->screen), x, y, &x, &y, &childWindow); } /* Take scaling in to consideration */ - //if(xfi->scale != 1.0) - if ( (xfi->scale != 1.0) || (xfi->offset_x) || (xfi->offset_y) ) + if ( (xfc->scale != 1.0) || (xfc->offset_x) || (xfc->offset_y) ) { - x = (int)((x - xfi->offset_x) * (1.0 / xfi->scale) ); - y = (int)((y - xfi->offset_y) * (1.0 / xfi->scale) ); + x = (int)((x - xfc->offset_x) * (1.0 / xfc->scale) ); + y = (int)((y - xfc->offset_y) * (1.0 / xfc->scale) ); } input->MouseEvent(input, PTR_FLAGS_MOVE, x, y); - if (xfi->fullscreen) + if (xfc->fullscreen) { - XSetInputFocus(xfi->display, xfi->window->handle, RevertToPointerRoot, CurrentTime); + XSetInputFocus(xfc->display, xfc->window->handle, RevertToPointerRoot, CurrentTime); } return TRUE; } -static BOOL xf_event_ButtonPress(xfInfo* xfi, XEvent* event, BOOL app) +static BOOL xf_event_MotionNotify(xfContext* xfc, XEvent* event, BOOL app) +{ + return xf_generic_MotionNotify(xfc, event->xmotion.x, event->xmotion.y, + event->xmotion.state, event->xmotion.window, app); +} + +BOOL xf_generic_ButtonPress(xfContext* xfc, int x, int y, int button, Window window, BOOL app) { - int x, y; int flags; BOOL wheel; BOOL extended; rdpInput* input; Window childWindow; - input = xfi->instance->input; - - x = 0; - y = 0; flags = 0; wheel = FALSE; extended = FALSE; + input = xfc->instance->input; - switch (event->xbutton.button) + switch (button) { case 1: - x = event->xbutton.x; - y = event->xbutton.y; flags = PTR_FLAGS_DOWN | PTR_FLAGS_BUTTON1; break; case 2: - x = event->xbutton.x; - y = event->xbutton.y; flags = PTR_FLAGS_DOWN | PTR_FLAGS_BUTTON3; break; case 3: - x = event->xbutton.x; - y = event->xbutton.y; flags = PTR_FLAGS_DOWN | PTR_FLAGS_BUTTON2; break; @@ -233,8 +223,6 @@ static BOOL xf_event_ButtonPress(xfInfo* xfi, XEvent* event, BOOL app) case 8: /* back */ case 97: /* Xming */ extended = TRUE; - x = event->xbutton.x; - y = event->xbutton.y; flags = PTR_XFLAGS_DOWN | PTR_XFLAGS_BUTTON1; break; @@ -242,8 +230,6 @@ static BOOL xf_event_ButtonPress(xfInfo* xfi, XEvent* event, BOOL app) case 9: /* forward */ case 112: /* Xming */ extended = TRUE; - x = event->xbutton.x; - y = event->xbutton.y; flags = PTR_XFLAGS_DOWN | PTR_XFLAGS_BUTTON2; break; @@ -265,25 +251,24 @@ static BOOL xf_event_ButtonPress(xfInfo* xfi, XEvent* event, BOOL app) if (app) { /* make sure window exists */ - if (xf_rdpWindowFromWindow(xfi, event->xbutton.window) == 0) + if (xf_rdpWindowFromWindow(xfc, window) == 0) { return TRUE; } /* Translate to desktop coordinates */ - XTranslateCoordinates(xfi->display, event->xbutton.window, - RootWindowOfScreen(xfi->screen), + XTranslateCoordinates(xfc->display, window, + RootWindowOfScreen(xfc->screen), x, y, &x, &y, &childWindow); } - //if (xfi->scale != 1.0) - if ((xfi->scale != 1.0) || (xfi->offset_x) - || (xfi->offset_y)) + if ((xfc->scale != 1.0) || (xfc->offset_x) + || (xfc->offset_y)) { - x = (int) ((x - xfi->offset_x) - * (1.0 / xfi->scale)); - y = (int) ((y - xfi->offset_y) - * (1.0 / xfi->scale)); + x = (int) ((x - xfc->offset_x) + * (1.0 / xfc->scale)); + y = (int) ((y - xfc->offset_y) + * (1.0 / xfc->scale)); } if (extended) @@ -296,38 +281,36 @@ static BOOL xf_event_ButtonPress(xfInfo* xfi, XEvent* event, BOOL app) return TRUE; } -static BOOL xf_event_ButtonRelease(xfInfo* xfi, XEvent* event, BOOL app) +static BOOL xf_event_ButtonPress(xfContext* xfc, XEvent* event, BOOL app) +{ + return xf_generic_ButtonPress(xfc, event->xbutton.x, event->xbutton.y, + event->xbutton.button, event->xbutton.window, app); +} + +BOOL xf_generic_ButtonRelease(xfContext* xfc, int x, int y, int button, Window window, BOOL app) { - int x, y; int flags; + BOOL wheel; BOOL extended; rdpInput* input; Window childWindow; - input = xfi->instance->input; - - x = 0; - y = 0; flags = 0; + wheel = FALSE; extended = FALSE; + input = xfc->instance->input; - switch (event->xbutton.button) + switch (button) { case 1: - x = event->xbutton.x; - y = event->xbutton.y; flags = PTR_FLAGS_BUTTON1; break; case 2: - x = event->xbutton.x; - y = event->xbutton.y; flags = PTR_FLAGS_BUTTON3; break; case 3: - x = event->xbutton.x; - y = event->xbutton.y; flags = PTR_FLAGS_BUTTON2; break; @@ -335,8 +318,6 @@ static BOOL xf_event_ButtonRelease(xfInfo* xfi, XEvent* event, BOOL app) case 8: case 97: extended = TRUE; - x = event->xbutton.x; - y = event->xbutton.y; flags = PTR_XFLAGS_BUTTON1; break; @@ -344,8 +325,6 @@ static BOOL xf_event_ButtonRelease(xfInfo* xfi, XEvent* event, BOOL app) case 9: case 112: extended = TRUE; - x = event->xbutton.x; - y = event->xbutton.y; flags = PTR_XFLAGS_BUTTON2; break; @@ -359,22 +338,21 @@ static BOOL xf_event_ButtonRelease(xfInfo* xfi, XEvent* event, BOOL app) if (app) { /* make sure window exists */ - if (xf_rdpWindowFromWindow(xfi, event->xbutton.window) == NULL) + if (xf_rdpWindowFromWindow(xfc, window) == NULL) { return TRUE; } /* Translate to desktop coordinates */ - XTranslateCoordinates(xfi->display, event->xbutton.window, - RootWindowOfScreen(xfi->screen), + XTranslateCoordinates(xfc->display, window, + RootWindowOfScreen(xfc->screen), x, y, &x, &y, &childWindow); } - //if (xfi->scale != 1.0) - if ((xfi->scale != 1.0) || (xfi->offset_x) || (xfi->offset_y)) + if ((xfc->scale != 1.0) || (xfc->offset_x) || (xfc->offset_y)) { - x = (int) ((x - xfi->offset_x) * (1.0 / xfi->scale)); - y = (int) ((y - xfi->offset_y) * (1.0 / xfi->scale)); + x = (int) ((x - xfc->offset_x) * (1.0 / xfc->scale)); + y = (int) ((y - xfc->offset_y) * (1.0 / xfc->scale)); } if (extended) @@ -386,31 +364,37 @@ static BOOL xf_event_ButtonRelease(xfInfo* xfi, XEvent* event, BOOL app) return TRUE; } -static BOOL xf_event_KeyPress(xfInfo* xfi, XEvent* event, BOOL app) +static BOOL xf_event_ButtonRelease(xfContext* xfc, XEvent* event, BOOL app) +{ + return xf_generic_ButtonRelease(xfc, event->xbutton.x, event->xbutton.y, + event->xbutton.button, event->xbutton.window, app); +} + +static BOOL xf_event_KeyPress(xfContext* xfc, XEvent* event, BOOL app) { KeySym keysym; char str[256]; XLookupString((XKeyEvent*) event, str, sizeof(str), &keysym, NULL); - xf_kbd_set_keypress(xfi, event->xkey.keycode, keysym); + xf_kbd_set_keypress(xfc, event->xkey.keycode, keysym); - if (xfi->fullscreen_toggle && xf_kbd_handle_special_keys(xfi, keysym)) + if (xfc->fullscreen_toggle && xf_kbd_handle_special_keys(xfc, keysym)) return TRUE; - xf_kbd_send_key(xfi, TRUE, event->xkey.keycode); + xf_kbd_send_key(xfc, TRUE, event->xkey.keycode); return TRUE; } -static BOOL xf_event_KeyRelease(xfInfo* xfi, XEvent* event, BOOL app) +static BOOL xf_event_KeyRelease(xfContext* xfc, XEvent* event, BOOL app) { XEvent next_event; - if (XPending(xfi->display)) + if (XPending(xfc->display)) { ZeroMemory(&next_event, sizeof(next_event)); - XPeekEvent(xfi->display, &next_event); + XPeekEvent(xfc->display, &next_event); if (next_event.type == KeyPress) { @@ -419,89 +403,89 @@ static BOOL xf_event_KeyRelease(xfInfo* xfi, XEvent* event, BOOL app) } } - xf_kbd_unset_keypress(xfi, event->xkey.keycode); - xf_kbd_send_key(xfi, FALSE, event->xkey.keycode); + xf_kbd_unset_keypress(xfc, event->xkey.keycode); + xf_kbd_send_key(xfc, FALSE, event->xkey.keycode); return TRUE; } -static BOOL xf_event_FocusIn(xfInfo* xfi, XEvent* event, BOOL app) +static BOOL xf_event_FocusIn(xfContext* xfc, XEvent* event, BOOL app) { if (event->xfocus.mode == NotifyGrab) return TRUE; - xfi->focused = TRUE; + xfc->focused = TRUE; - if (xfi->mouse_active && (!app)) - XGrabKeyboard(xfi->display, xfi->window->handle, TRUE, GrabModeAsync, GrabModeAsync, CurrentTime); + if (xfc->mouse_active && (!app)) + XGrabKeyboard(xfc->display, xfc->window->handle, TRUE, GrabModeAsync, GrabModeAsync, CurrentTime); if (app) { - xf_rail_send_activate(xfi, event->xany.window, TRUE); + xf_rail_send_activate(xfc, event->xany.window, TRUE); rdpWindow* window; - rdpRail* rail = ((rdpContext*) xfi->context)->rail; + rdpRail* rail = ((rdpContext*) xfc)->rail; window = window_list_get_by_extra_id(rail->list, (void*) event->xany.window); /* Update the server with any window changes that occured while the window was not focused. */ if (window != NULL) - xf_rail_adjust_position(xfi, window); + xf_rail_adjust_position(xfc, window); } - xf_kbd_focus_in(xfi); + xf_kbd_focus_in(xfc); if (!app) - xf_cliprdr_check_owner(xfi); + xf_cliprdr_check_owner(xfc); return TRUE; } -static BOOL xf_event_FocusOut(xfInfo* xfi, XEvent* event, BOOL app) +static BOOL xf_event_FocusOut(xfContext* xfc, XEvent* event, BOOL app) { if (event->xfocus.mode == NotifyUngrab) return TRUE; - xfi->focused = FALSE; + xfc->focused = FALSE; if (event->xfocus.mode == NotifyWhileGrabbed) - XUngrabKeyboard(xfi->display, CurrentTime); + XUngrabKeyboard(xfc->display, CurrentTime); - xf_kbd_clear(xfi); + xf_kbd_clear(xfc); if (app) - xf_rail_send_activate(xfi, event->xany.window, FALSE); + xf_rail_send_activate(xfc, event->xany.window, FALSE); return TRUE; } -static BOOL xf_event_MappingNotify(xfInfo* xfi, XEvent* event, BOOL app) +static BOOL xf_event_MappingNotify(xfContext* xfc, XEvent* event, BOOL app) { if (event->xmapping.request == MappingModifier) { - XFreeModifiermap(xfi->modifier_map); - xfi->modifier_map = XGetModifierMapping(xfi->display); + XFreeModifiermap(xfc->modifier_map); + xfc->modifier_map = XGetModifierMapping(xfc->display); } return TRUE; } -static BOOL xf_event_ClientMessage(xfInfo* xfi, XEvent* event, BOOL app) +static BOOL xf_event_ClientMessage(xfContext* xfc, XEvent* event, BOOL app) { - if ((event->xclient.message_type == xfi->WM_PROTOCOLS) - && ((Atom) event->xclient.data.l[0] == xfi->WM_DELETE_WINDOW)) + if ((event->xclient.message_type == xfc->WM_PROTOCOLS) + && ((Atom) event->xclient.data.l[0] == xfc->WM_DELETE_WINDOW)) { if (app) { DEBUG_X11("RAIL window closed"); rdpWindow* window; - rdpRail* rail = ((rdpContext*) xfi->context)->rail; + rdpRail* rail = ((rdpContext*) xfc)->rail; window = window_list_get_by_extra_id(rail->list, (void*) event->xclient.window); if (window != NULL) { - xf_rail_send_client_system_command(xfi, window->windowId, SC_CLOSE); + xf_rail_send_client_system_command(xfc, window->windowId, SC_CLOSE); } return TRUE; @@ -516,17 +500,17 @@ static BOOL xf_event_ClientMessage(xfInfo* xfi, XEvent* event, BOOL app) return TRUE; } -static BOOL xf_event_EnterNotify(xfInfo* xfi, XEvent* event, BOOL app) +static BOOL xf_event_EnterNotify(xfContext* xfc, XEvent* event, BOOL app) { if (!app) { - xfi->mouse_active = TRUE; + xfc->mouse_active = TRUE; - if (xfi->fullscreen) - XSetInputFocus(xfi->display, xfi->window->handle, RevertToPointerRoot, CurrentTime); + if (xfc->fullscreen) + XSetInputFocus(xfc->display, xfc->window->handle, RevertToPointerRoot, CurrentTime); - if (xfi->focused) - XGrabKeyboard(xfi->display, xfi->window->handle, TRUE, GrabModeAsync, GrabModeAsync, CurrentTime); + if (xfc->focused) + XGrabKeyboard(xfc->display, xfc->window->handle, TRUE, GrabModeAsync, GrabModeAsync, CurrentTime); } else { @@ -534,45 +518,45 @@ static BOOL xf_event_EnterNotify(xfInfo* xfi, XEvent* event, BOOL app) xfWindow* xfw; rdpWindow* window; - rdpRail* rail = ((rdpContext*) xfi->context)->rail; + rdpRail* rail = ((rdpContext*) xfc)->rail; window = window_list_get_by_extra_id(rail->list, (void*) event->xexpose.window); if (window != NULL) { xfw = (xfWindow*) window->extra; - xfi->window = xfw; + xfc->window = xfw; } } return TRUE; } -static BOOL xf_event_LeaveNotify(xfInfo* xfi, XEvent* event, BOOL app) +static BOOL xf_event_LeaveNotify(xfContext* xfc, XEvent* event, BOOL app) { if (!app) { - xfi->mouse_active = FALSE; - XUngrabKeyboard(xfi->display, CurrentTime); + xfc->mouse_active = FALSE; + XUngrabKeyboard(xfc->display, CurrentTime); } return TRUE; } -static BOOL xf_event_ConfigureNotify(xfInfo* xfi, XEvent* event, BOOL app) +static BOOL xf_event_ConfigureNotify(xfContext* xfc, XEvent* event, BOOL app) { rdpWindow* window; - rdpRail* rail = ((rdpContext*) xfi->context)->rail; + rdpRail* rail = ((rdpContext*) xfc)->rail; /* This is for resizing the window by dragging the border - if (xfi->width != event->xconfigure.width) + if (xfc->width != event->xconfigure.width) { - xfi->scale = (double) event->xconfigure.width / (double) xfi->originalWidth; - xfi->currentWidth = event->xconfigure.width; - xfi->currentHeight = event->xconfigure.width; + xfc->scale = (double) event->xconfigure.width / (double) xfc->originalWidth; + xfc->currentWidth = event->xconfigure.width; + xfc->currentHeight = event->xconfigure.width; - xf_draw_screen_scaled(xfi); + xf_draw_screen_scaled(xfc); } */ window = window_list_get_by_extra_id(rail->list, (void*) event->xconfigure.window); @@ -588,8 +572,8 @@ static BOOL xf_event_ConfigureNotify(xfInfo* xfi, XEvent* event, BOOL app) * Translate these to root window coordinates. */ - XTranslateCoordinates(xfi->display, xfw->handle, - RootWindowOfScreen(xfi->screen), + XTranslateCoordinates(xfc->display, xfw->handle, + RootWindowOfScreen(xfc->screen), 0, 0, &xfw->left, &xfw->top, &childWindow); @@ -613,7 +597,7 @@ static BOOL xf_event_ConfigureNotify(xfInfo* xfi, XEvent* event, BOOL app) if (app && xfw->decorations) { /* moving resizing using window decoration */ - xf_rail_adjust_position(xfi, window); + xf_rail_adjust_position(xfc, window); window->windowOffsetX = xfw->left; window->visibleOffsetX = window->windowOffsetX; window->windowOffsetY = xfw->top; @@ -623,9 +607,9 @@ static BOOL xf_event_ConfigureNotify(xfInfo* xfi, XEvent* event, BOOL app) } else { - if (app && (!event->xconfigure.send_event || xfi->window->local_move.state == LMS_NOT_ACTIVE) - && !xfw->rail_ignore_configure && xfi->focused) - xf_rail_adjust_position(xfi, window); + if (app && (!event->xconfigure.send_event || xfc->window->local_move.state == LMS_NOT_ACTIVE) + && !xfw->rail_ignore_configure && xfc->focused) + xf_rail_adjust_position(xfc, window); } } @@ -633,21 +617,21 @@ static BOOL xf_event_ConfigureNotify(xfInfo* xfi, XEvent* event, BOOL app) return True; } -static BOOL xf_event_MapNotify(xfInfo* xfi, XEvent* event, BOOL app) +static BOOL xf_event_MapNotify(xfContext* xfc, XEvent* event, BOOL app) { RECTANGLE_16 rect; rdpWindow* window; - rdpUpdate* update = xfi->instance->update; - rdpRail* rail = ((rdpContext*) xfi->context)->rail; + rdpUpdate* update = xfc->instance->update; + rdpRail* rail = ((rdpContext*) xfc)->rail; if (!app) { rect.left = 0; rect.top = 0; - rect.right = xfi->width; - rect.bottom = xfi->height; + rect.right = xfc->width; + rect.bottom = xfc->height; - update->SuppressOutput((rdpContext*) xfi->context, 1, &rect); + update->SuppressOutput((rdpContext*) xfc, 1, &rect); } else { @@ -662,7 +646,7 @@ static BOOL xf_event_MapNotify(xfInfo* xfi, XEvent* event, BOOL app) * that is minimized back to the maximized state */ - //xf_rail_send_client_system_command(xfi, window->windowId, SC_RESTORE); + //xf_rail_send_client_system_command(xfc, window->windowId, SC_RESTORE); xfWindow* xfw = (xfWindow*) window->extra; xfw->is_mapped = TRUE; } @@ -671,17 +655,17 @@ static BOOL xf_event_MapNotify(xfInfo* xfi, XEvent* event, BOOL app) return TRUE; } -static BOOL xf_event_UnmapNotify(xfInfo* xfi, XEvent* event, BOOL app) +static BOOL xf_event_UnmapNotify(xfContext* xfc, XEvent* event, BOOL app) { rdpWindow* window; - rdpUpdate* update = xfi->instance->update; - rdpRail* rail = ((rdpContext*) xfi->context)->rail; + rdpUpdate* update = xfc->instance->update; + rdpRail* rail = ((rdpContext*) xfc)->rail; - xf_kbd_release_all_keypress(xfi); + xf_kbd_release_all_keypress(xfc); if (!app) { - update->SuppressOutput((rdpContext*) xfi->context, 0, NULL); + update->SuppressOutput((rdpContext*) xfc, 0, NULL); } else { @@ -697,40 +681,40 @@ static BOOL xf_event_UnmapNotify(xfInfo* xfi, XEvent* event, BOOL app) return TRUE; } -static BOOL xf_event_SelectionNotify(xfInfo* xfi, XEvent* event, BOOL app) +static BOOL xf_event_SelectionNotify(xfContext* xfc, XEvent* event, BOOL app) { if (!app) { - if (xf_cliprdr_process_selection_notify(xfi, event)) + if (xf_cliprdr_process_selection_notify(xfc, event)) return TRUE; } return TRUE; } -static BOOL xf_event_SelectionRequest(xfInfo* xfi, XEvent* event, BOOL app) +static BOOL xf_event_SelectionRequest(xfContext* xfc, XEvent* event, BOOL app) { if (!app) { - if (xf_cliprdr_process_selection_request(xfi, event)) + if (xf_cliprdr_process_selection_request(xfc, event)) return TRUE; } return TRUE; } -static BOOL xf_event_SelectionClear(xfInfo* xfi, XEvent* event, BOOL app) +static BOOL xf_event_SelectionClear(xfContext* xfc, XEvent* event, BOOL app) { if (!app) { - if (xf_cliprdr_process_selection_clear(xfi, event)) + if (xf_cliprdr_process_selection_clear(xfc, event)) return TRUE; } return TRUE; } -static BOOL xf_event_PropertyNotify(xfInfo* xfi, XEvent* event, BOOL app) +static BOOL xf_event_PropertyNotify(xfContext* xfc, XEvent* event, BOOL app) { /* * This section handles sending the appropriate commands to the rail server @@ -742,13 +726,13 @@ static BOOL xf_event_PropertyNotify(xfInfo* xfi, XEvent* event, BOOL app) { rdpWindow* window; - window = xf_rdpWindowFromWindow(xfi, event->xproperty.window); + window = xf_rdpWindowFromWindow(xfc, event->xproperty.window); if (window == NULL) return TRUE; - if ((((Atom) event->xproperty.atom == xfi->_NET_WM_STATE) && (event->xproperty.state != PropertyDelete)) || - (((Atom) event->xproperty.atom == xfi->WM_STATE) && (event->xproperty.state != PropertyDelete))) + if ((((Atom) event->xproperty.atom == xfc->_NET_WM_STATE) && (event->xproperty.state != PropertyDelete)) || + (((Atom) event->xproperty.atom == xfc->WM_STATE) && (event->xproperty.state != PropertyDelete))) { int i; BOOL status; @@ -759,10 +743,10 @@ static BOOL xf_event_PropertyNotify(xfInfo* xfi, XEvent* event, BOOL app) unsigned long bytes; unsigned char* prop; - if ((Atom) event->xproperty.atom == xfi->_NET_WM_STATE) + if ((Atom) event->xproperty.atom == xfc->_NET_WM_STATE) { - status = xf_GetWindowProperty(xfi, event->xproperty.window, - xfi->_NET_WM_STATE, 12, &nitems, &bytes, &prop); + status = xf_GetWindowProperty(xfc, event->xproperty.window, + xfc->_NET_WM_STATE, 12, &nitems, &bytes, &prop); if (!status) { @@ -771,12 +755,12 @@ static BOOL xf_event_PropertyNotify(xfInfo* xfi, XEvent* event, BOOL app) for (i = 0; i < nitems; i++) { - if ((Atom) ((UINT16**) prop)[i] == XInternAtom(xfi->display, "_NET_WM_STATE_MAXIMIZED_VERT", False)) + if ((Atom) ((UINT16**) prop)[i] == XInternAtom(xfc->display, "_NET_WM_STATE_MAXIMIZED_VERT", False)) { maxVert = TRUE; } - if ((Atom) ((UINT16**) prop)[i] == XInternAtom(xfi->display, "_NET_WM_STATE_MAXIMIZED_HORZ", False)) + if ((Atom) ((UINT16**) prop)[i] == XInternAtom(xfc->display, "_NET_WM_STATE_MAXIMIZED_HORZ", False)) { maxHorz = TRUE; } @@ -785,9 +769,9 @@ static BOOL xf_event_PropertyNotify(xfInfo* xfi, XEvent* event, BOOL app) XFree(prop); } - if ((Atom) event->xproperty.atom == xfi->WM_STATE) + if ((Atom) event->xproperty.atom == xfc->WM_STATE) { - status = xf_GetWindowProperty(xfi, event->xproperty.window, xfi->WM_STATE, 1, &nitems, &bytes, &prop); + status = xf_GetWindowProperty(xfc, event->xproperty.window, xfc->WM_STATE, 1, &nitems, &bytes, &prop); if (!status) { @@ -806,51 +790,51 @@ static BOOL xf_event_PropertyNotify(xfInfo* xfi, XEvent* event, BOOL app) } - if (maxVert && maxHorz && !minimized && (xfi->window->rail_state != WINDOW_SHOW_MAXIMIZED)) + if (maxVert && maxHorz && !minimized && (xfc->window->rail_state != WINDOW_SHOW_MAXIMIZED)) { DEBUG_X11_LMS("Send SC_MAXIMIZE command to rail server."); - xfi->window->rail_state = WINDOW_SHOW_MAXIMIZED; - xf_rail_send_client_system_command(xfi, window->windowId, SC_MAXIMIZE); + xfc->window->rail_state = WINDOW_SHOW_MAXIMIZED; + xf_rail_send_client_system_command(xfc, window->windowId, SC_MAXIMIZE); } - else if (minimized && (xfi->window->rail_state != WINDOW_SHOW_MINIMIZED)) + else if (minimized && (xfc->window->rail_state != WINDOW_SHOW_MINIMIZED)) { DEBUG_X11_LMS("Send SC_MINIMIZE command to rail server."); - xfi->window->rail_state = WINDOW_SHOW_MINIMIZED; - xf_rail_send_client_system_command(xfi, window->windowId, SC_MINIMIZE); + xfc->window->rail_state = WINDOW_SHOW_MINIMIZED; + xf_rail_send_client_system_command(xfc, window->windowId, SC_MINIMIZE); } - else if (!minimized && !maxVert && !maxHorz && (xfi->window->rail_state != WINDOW_SHOW)) + else if (!minimized && !maxVert && !maxHorz && (xfc->window->rail_state != WINDOW_SHOW)) { DEBUG_X11_LMS("Send SC_RESTORE command to rail server"); - xfi->window->rail_state = WINDOW_SHOW; - xf_rail_send_client_system_command(xfi, window->windowId, SC_RESTORE); + xfc->window->rail_state = WINDOW_SHOW; + xf_rail_send_client_system_command(xfc, window->windowId, SC_RESTORE); } } } else { - if (xf_cliprdr_process_property_notify(xfi, event)) + if (xf_cliprdr_process_property_notify(xfc, event)) return TRUE; } return TRUE; } -static BOOL xf_event_suppress_events(xfInfo *xfi, rdpWindow *window, XEvent*event) +static BOOL xf_event_suppress_events(xfContext* xfc, rdpWindow* window, XEvent*event) { - if (!xfi->remote_app) + if (!xfc->remote_app) return FALSE; - switch (xfi->window->local_move.state) + switch (xfc->window->local_move.state) { case LMS_NOT_ACTIVE: /* No local move in progress, nothing to do */ /* Prevent Configure from happening during indeterminant state of Horz or Vert Max only */ - if ( (event->type == ConfigureNotify) && xfi->window->rail_ignore_configure) + if ( (event->type == ConfigureNotify) && xfc->window->rail_ignore_configure) { DEBUG_X11_LMS("ConfigureNotify Event Ignored"); - xfi->window->rail_ignore_configure = FALSE; + xfc->window->rail_ignore_configure = FALSE; return TRUE; } @@ -862,7 +846,7 @@ static BOOL xf_event_suppress_events(xfInfo *xfi, rdpWindow *window, XEvent*even { case ConfigureNotify: /* Starting to see move events from the X server. Local move is now in progress. */ - xfi->window->local_move.state = LMS_ACTIVE; + xfc->window->local_move.state = LMS_ACTIVE; /* Allow these events to be processed during move to keep our state up to date. */ break; @@ -902,7 +886,7 @@ static BOOL xf_event_suppress_events(xfInfo *xfi, rdpWindow *window, XEvent*even default: DEBUG_X11_LMS("Event Type to break LMS: %s", X11_EVENT_STRINGS[event->type]); /* Any other event terminates move */ - xf_rail_end_local_move(xfi, window); + xf_rail_end_local_move(xfc, window); break; } break; @@ -919,20 +903,20 @@ static BOOL xf_event_suppress_events(xfInfo *xfi, rdpWindow *window, XEvent*even BOOL xf_event_process(freerdp* instance, XEvent* event) { BOOL status = TRUE; - xfInfo* xfi = ((xfContext*) instance->context)->xfi; - rdpRail* rail = ((rdpContext*) xfi->context)->rail; rdpWindow* window; + xfContext* xfc = (xfContext*) instance->context; + rdpRail* rail = ((rdpContext*) xfc)->rail; - if (xfi->remote_app) + if (xfc->remote_app) { window = window_list_get_by_extra_id(rail->list, (void*) event->xexpose.window); - if (window) + if (window) { /* Update "current" window for cursor change orders */ - xfi->window = (xfWindow*) window->extra; + xfc->window = (xfWindow*) window->extra; - if (xf_event_suppress_events(xfi, window, event)) + if (xf_event_suppress_events(xfc, window, event)) return TRUE; } } @@ -943,46 +927,46 @@ BOOL xf_event_process(freerdp* instance, XEvent* event) switch (event->type) { case Expose: - status = xf_event_Expose(xfi, event, xfi->remote_app); + status = xf_event_Expose(xfc, event, xfc->remote_app); break; case VisibilityNotify: - status = xf_event_VisibilityNotify(xfi, event, xfi->remote_app); + status = xf_event_VisibilityNotify(xfc, event, xfc->remote_app); break; case MotionNotify: - status = xf_event_MotionNotify(xfi, event, xfi->remote_app); + status = xf_event_MotionNotify(xfc, event, xfc->remote_app); break; case ButtonPress: - status = xf_event_ButtonPress(xfi, event, xfi->remote_app); + status = xf_event_ButtonPress(xfc, event, xfc->remote_app); break; case ButtonRelease: - status = xf_event_ButtonRelease(xfi, event, xfi->remote_app); + status = xf_event_ButtonRelease(xfc, event, xfc->remote_app); break; case KeyPress: - status = xf_event_KeyPress(xfi, event, xfi->remote_app); + status = xf_event_KeyPress(xfc, event, xfc->remote_app); break; case KeyRelease: - status = xf_event_KeyRelease(xfi, event, xfi->remote_app); + status = xf_event_KeyRelease(xfc, event, xfc->remote_app); break; case FocusIn: - status = xf_event_FocusIn(xfi, event, xfi->remote_app); + status = xf_event_FocusIn(xfc, event, xfc->remote_app); break; case FocusOut: - status = xf_event_FocusOut(xfi, event, xfi->remote_app); + status = xf_event_FocusOut(xfc, event, xfc->remote_app); break; case EnterNotify: - status = xf_event_EnterNotify(xfi, event, xfi->remote_app); + status = xf_event_EnterNotify(xfc, event, xfc->remote_app); break; case LeaveNotify: - status = xf_event_LeaveNotify(xfi, event, xfi->remote_app); + status = xf_event_LeaveNotify(xfc, event, xfc->remote_app); break; case NoExpose: @@ -992,49 +976,49 @@ BOOL xf_event_process(freerdp* instance, XEvent* event) break; case ConfigureNotify: - status = xf_event_ConfigureNotify(xfi, event, xfi->remote_app); + status = xf_event_ConfigureNotify(xfc, event, xfc->remote_app); break; case MapNotify: - status = xf_event_MapNotify(xfi, event, xfi->remote_app); + status = xf_event_MapNotify(xfc, event, xfc->remote_app); break; case UnmapNotify: - status = xf_event_UnmapNotify(xfi, event, xfi->remote_app); + status = xf_event_UnmapNotify(xfc, event, xfc->remote_app); break; case ReparentNotify: break; case MappingNotify: - status = xf_event_MappingNotify(xfi, event, xfi->remote_app); + status = xf_event_MappingNotify(xfc, event, xfc->remote_app); break; case ClientMessage: - status = xf_event_ClientMessage(xfi, event, xfi->remote_app); + status = xf_event_ClientMessage(xfc, event, xfc->remote_app); break; case SelectionNotify: - status = xf_event_SelectionNotify(xfi, event, xfi->remote_app); + status = xf_event_SelectionNotify(xfc, event, xfc->remote_app); break; case SelectionRequest: - status = xf_event_SelectionRequest(xfi, event, xfi->remote_app); + status = xf_event_SelectionRequest(xfc, event, xfc->remote_app); break; case SelectionClear: - status = xf_event_SelectionClear(xfi, event, xfi->remote_app); + status = xf_event_SelectionClear(xfc, event, xfc->remote_app); break; case PropertyNotify: - status = xf_event_PropertyNotify(xfi, event, xfi->remote_app); + status = xf_event_PropertyNotify(xfc, event, xfc->remote_app); break; } - xf_input_handle_event(xfi, event); + xf_input_handle_event(xfc, event); - XSync(xfi->display, FALSE); + XSync(xfc->display, FALSE); return status; } diff --git a/client/X11/xf_event.h b/client/X11/xf_event.h index 93e0c7732..05d4e3e04 100644 --- a/client/X11/xf_event.h +++ b/client/X11/xf_event.h @@ -22,10 +22,14 @@ #include "xf_keyboard.h" -#include "xf_interface.h" +#include "xf_client.h" #include "xfreerdp.h" BOOL xf_event_process(freerdp* instance, XEvent* event); -void xf_event_SendClientEvent(xfInfo *xfi, xfWindow* window, Atom atom, unsigned int numArgs, ...); +void xf_event_SendClientEvent(xfContext* xfc, xfWindow* window, Atom atom, unsigned int numArgs, ...); + +BOOL xf_generic_MotionNotify(xfContext* xfc, int x, int y, int state, Window window, BOOL app); +BOOL xf_generic_ButtonPress(xfContext* xfc, int x, int y, int button, Window window, BOOL app); +BOOL xf_generic_ButtonRelease(xfContext* xfc, int x, int y, int button, Window window, BOOL app); #endif /* __XF_EVENT_H */ diff --git a/client/X11/xf_gdi.c b/client/X11/xf_gdi.c index e21c00762..acdc0da47 100644 --- a/client/X11/xf_gdi.c +++ b/client/X11/xf_gdi.c @@ -64,7 +64,7 @@ static const BYTE xf_rop2_table[] = GXset /* 1 */ }; -BOOL xf_set_rop2(xfInfo* xfi, int rop2) +BOOL xf_set_rop2(xfContext* xfc, int rop2) { if ((rop2 < 0x01) || (rop2 > 0x10)) { @@ -72,11 +72,11 @@ BOOL xf_set_rop2(xfInfo* xfi, int rop2) return FALSE; } - XSetFunction(xfi->display, xfi->gc, xf_rop2_table[rop2]); + XSetFunction(xfc->display, xfc->gc, xf_rop2_table[rop2]); return TRUE; } -BOOL xf_set_rop3(xfInfo* xfi, int rop3) +BOOL xf_set_rop3(xfContext* xfc, int rop3) { int function = -1; @@ -205,46 +205,46 @@ BOOL xf_set_rop3(xfInfo* xfi, int rop3) if (function < 0) { fprintf(stderr, "Unsupported ROP3: 0x%08X\n", rop3); - XSetFunction(xfi->display, xfi->gc, GXclear); + XSetFunction(xfc->display, xfc->gc, GXclear); return FALSE; } - XSetFunction(xfi->display, xfi->gc, function); + XSetFunction(xfc->display, xfc->gc, function); return TRUE; } -Pixmap xf_brush_new(xfInfo* xfi, int width, int height, int bpp, BYTE* data) +Pixmap xf_brush_new(xfContext* xfc, int width, int height, int bpp, BYTE* data) { Pixmap bitmap; BYTE* cdata; XImage* image; - bitmap = XCreatePixmap(xfi->display, xfi->drawable, width, height, xfi->depth); + bitmap = XCreatePixmap(xfc->display, xfc->drawable, width, height, xfc->depth); if (data != NULL) { GC gc; - cdata = freerdp_image_convert(data, NULL, width, height, bpp, xfi->bpp, xfi->clrconv); + cdata = freerdp_image_convert(data, NULL, width, height, bpp, xfc->bpp, xfc->clrconv); - image = XCreateImage(xfi->display, xfi->visual, xfi->depth, - ZPixmap, 0, (char*) cdata, width, height, xfi->scanline_pad, 0); + image = XCreateImage(xfc->display, xfc->visual, xfc->depth, + ZPixmap, 0, (char*) cdata, width, height, xfc->scanline_pad, 0); - gc = XCreateGC(xfi->display, xfi->drawable, 0, NULL); - XPutImage(xfi->display, bitmap, gc, image, 0, 0, 0, 0, width, height); + gc = XCreateGC(xfc->display, xfc->drawable, 0, NULL); + XPutImage(xfc->display, bitmap, gc, image, 0, 0, 0, 0, width, height); XFree(image); if (cdata != data) free(cdata); - XFreeGC(xfi->display, gc); + XFreeGC(xfc->display, gc); } return bitmap; } -Pixmap xf_mono_bitmap_new(xfInfo* xfi, int width, int height, BYTE* data) +Pixmap xf_mono_bitmap_new(xfContext* xfc, int width, int height, BYTE* data) { int scanline; XImage* image; @@ -252,12 +252,12 @@ Pixmap xf_mono_bitmap_new(xfInfo* xfi, int width, int height, BYTE* data) scanline = (width + 7) / 8; - bitmap = XCreatePixmap(xfi->display, xfi->drawable, width, height, 1); + bitmap = XCreatePixmap(xfc->display, xfc->drawable, width, height, 1); - image = XCreateImage(xfi->display, xfi->visual, 1, + image = XCreateImage(xfc->display, xfc->visual, 1, ZPixmap, 0, (char*) data, width, height, 8, scanline); - XPutImage(xfi->display, bitmap, xfi->gc_mono, image, 0, 0, 0, 0, width, height); + XPutImage(xfc->display, bitmap, xfc->gc_mono, image, 0, 0, 0, 0, width, height); XFree(image); return bitmap; @@ -265,21 +265,21 @@ Pixmap xf_mono_bitmap_new(xfInfo* xfi, int width, int height, BYTE* data) void xf_gdi_palette_update(rdpContext* context, PALETTE_UPDATE* palette) { - xfInfo* xfi = ((xfContext*) context)->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); - CopyMemory(xfi->clrconv->palette, palette, sizeof(rdpPalette)); + CopyMemory(xfc->clrconv->palette, palette, sizeof(rdpPalette)); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } void xf_gdi_set_bounds(rdpContext* context, rdpBounds* bounds) { XRectangle clip; - xfInfo* xfi = ((xfContext*) context)->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); if (bounds != NULL) { @@ -287,37 +287,37 @@ void xf_gdi_set_bounds(rdpContext* context, rdpBounds* bounds) clip.y = bounds->top; clip.width = bounds->right - bounds->left + 1; clip.height = bounds->bottom - bounds->top + 1; - XSetClipRectangles(xfi->display, xfi->gc, 0, 0, &clip, 1, YXBanded); + XSetClipRectangles(xfc->display, xfc->gc, 0, 0, &clip, 1, YXBanded); } else { - XSetClipMask(xfi->display, xfi->gc, None); + XSetClipMask(xfc->display, xfc->gc, None); } - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } void xf_gdi_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt) { - xfInfo* xfi = ((xfContext*) context)->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); - xf_set_rop3(xfi, gdi_rop3_code(dstblt->bRop)); + xf_set_rop3(xfc, gdi_rop3_code(dstblt->bRop)); - XSetFillStyle(xfi->display, xfi->gc, FillSolid); - XFillRectangle(xfi->display, xfi->drawing, xfi->gc, + XSetFillStyle(xfc->display, xfc->gc, FillSolid); + XFillRectangle(xfc->display, xfc->drawing, xfc->gc, dstblt->nLeftRect, dstblt->nTopRect, dstblt->nWidth, dstblt->nHeight); - if (xfi->drawing == xfi->primary) + if (xfc->drawing == xfc->primary) { - gdi_InvalidateRegion(xfi->hdc, dstblt->nLeftRect, dstblt->nTopRect, dstblt->nWidth, dstblt->nHeight); + gdi_InvalidateRegion(xfc->hdc, dstblt->nLeftRect, dstblt->nTopRect, dstblt->nWidth, dstblt->nHeight); } - XSetFunction(xfi->display, xfi->gc, GXcopy); + XSetFunction(xfc->display, xfc->gc, GXcopy); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } void xf_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) @@ -326,71 +326,70 @@ void xf_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) rdpBrush* brush; UINT32 foreColor; UINT32 backColor; - xfContext* context_ = (xfContext*) context; - xfInfo* xfi = context_->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); brush = &patblt->brush; - xf_set_rop3(xfi, gdi_rop3_code(patblt->bRop)); + xf_set_rop3(xfc, gdi_rop3_code(patblt->bRop)); - foreColor = freerdp_color_convert_var(patblt->foreColor, context_->settings->ColorDepth, xfi->bpp, xfi->clrconv); - backColor = freerdp_color_convert_var(patblt->backColor, context_->settings->ColorDepth, xfi->bpp, xfi->clrconv); + foreColor = freerdp_color_convert_var(patblt->foreColor, context->settings->ColorDepth, xfc->bpp, xfc->clrconv); + backColor = freerdp_color_convert_var(patblt->backColor, context->settings->ColorDepth, xfc->bpp, xfc->clrconv); if (brush->style == GDI_BS_SOLID) { - XSetFillStyle(xfi->display, xfi->gc, FillSolid); - XSetForeground(xfi->display, xfi->gc, foreColor); + XSetFillStyle(xfc->display, xfc->gc, FillSolid); + XSetForeground(xfc->display, xfc->gc, foreColor); - XFillRectangle(xfi->display, xfi->drawing, xfi->gc, + XFillRectangle(xfc->display, xfc->drawing, xfc->gc, patblt->nLeftRect, patblt->nTopRect, patblt->nWidth, patblt->nHeight); } else if (brush->style == GDI_BS_HATCHED) { - pattern = xf_mono_bitmap_new(xfi, 8, 8, GDI_BS_HATCHED_PATTERNS + 8 * brush->hatch); + pattern = xf_mono_bitmap_new(xfc, 8, 8, GDI_BS_HATCHED_PATTERNS + 8 * brush->hatch); - XSetForeground(xfi->display, xfi->gc, backColor); - XSetBackground(xfi->display, xfi->gc, foreColor); - XSetFillStyle(xfi->display, xfi->gc, FillOpaqueStippled); - XSetStipple(xfi->display, xfi->gc, pattern); - XSetTSOrigin(xfi->display, xfi->gc, brush->x, brush->y); + XSetForeground(xfc->display, xfc->gc, backColor); + XSetBackground(xfc->display, xfc->gc, foreColor); + XSetFillStyle(xfc->display, xfc->gc, FillOpaqueStippled); + XSetStipple(xfc->display, xfc->gc, pattern); + XSetTSOrigin(xfc->display, xfc->gc, brush->x, brush->y); - XFillRectangle(xfi->display, xfi->drawing, xfi->gc, + XFillRectangle(xfc->display, xfc->drawing, xfc->gc, patblt->nLeftRect, patblt->nTopRect, patblt->nWidth, patblt->nHeight); - XFreePixmap(xfi->display, pattern); + XFreePixmap(xfc->display, pattern); } else if (brush->style == GDI_BS_PATTERN) { if (brush->bpp > 1) { - pattern = xf_brush_new(xfi, 8, 8, brush->bpp, brush->data); + pattern = xf_brush_new(xfc, 8, 8, brush->bpp, brush->data); - XSetFillStyle(xfi->display, xfi->gc, FillTiled); - XSetTile(xfi->display, xfi->gc, pattern); - XSetTSOrigin(xfi->display, xfi->gc, brush->x, brush->y); + XSetFillStyle(xfc->display, xfc->gc, FillTiled); + XSetTile(xfc->display, xfc->gc, pattern); + XSetTSOrigin(xfc->display, xfc->gc, brush->x, brush->y); - XFillRectangle(xfi->display, xfi->drawing, xfi->gc, + XFillRectangle(xfc->display, xfc->drawing, xfc->gc, patblt->nLeftRect, patblt->nTopRect, patblt->nWidth, patblt->nHeight); - XSetTile(xfi->display, xfi->gc, xfi->primary); + XSetTile(xfc->display, xfc->gc, xfc->primary); - XFreePixmap(xfi->display, pattern); + XFreePixmap(xfc->display, pattern); } else { - pattern = xf_mono_bitmap_new(xfi, 8, 8, brush->data); + pattern = xf_mono_bitmap_new(xfc, 8, 8, brush->data); - XSetForeground(xfi->display, xfi->gc, backColor); - XSetBackground(xfi->display, xfi->gc, foreColor); - XSetFillStyle(xfi->display, xfi->gc, FillOpaqueStippled); - XSetStipple(xfi->display, xfi->gc, pattern); - XSetTSOrigin(xfi->display, xfi->gc, brush->x, brush->y); + XSetForeground(xfc->display, xfc->gc, backColor); + XSetBackground(xfc->display, xfc->gc, foreColor); + XSetFillStyle(xfc->display, xfc->gc, FillOpaqueStippled); + XSetStipple(xfc->display, xfc->gc, pattern); + XSetTSOrigin(xfc->display, xfc->gc, brush->x, brush->y); - XFillRectangle(xfi->display, xfi->drawing, xfi->gc, + XFillRectangle(xfc->display, xfc->drawing, xfc->gc, patblt->nLeftRect, patblt->nTopRect, patblt->nWidth, patblt->nHeight); - XFreePixmap(xfi->display, pattern); + XFreePixmap(xfc->display, pattern); } } else @@ -398,62 +397,61 @@ void xf_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) fprintf(stderr, "unimplemented brush style:%d\n", brush->style); } - if (xfi->drawing == xfi->primary) + if (xfc->drawing == xfc->primary) { - gdi_InvalidateRegion(xfi->hdc, patblt->nLeftRect, patblt->nTopRect, patblt->nWidth, patblt->nHeight); + gdi_InvalidateRegion(xfc->hdc, patblt->nLeftRect, patblt->nTopRect, patblt->nWidth, patblt->nHeight); } - XSetFunction(xfi->display, xfi->gc, GXcopy); + XSetFunction(xfc->display, xfc->gc, GXcopy); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } void xf_gdi_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt) { - xfInfo* xfi = ((xfContext*) context)->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); - xf_set_rop3(xfi, gdi_rop3_code(scrblt->bRop)); + xf_set_rop3(xfc, gdi_rop3_code(scrblt->bRop)); - XCopyArea(xfi->display, xfi->primary, xfi->drawing, xfi->gc, scrblt->nXSrc, scrblt->nYSrc, + XCopyArea(xfc->display, xfc->primary, xfc->drawing, xfc->gc, scrblt->nXSrc, scrblt->nYSrc, scrblt->nWidth, scrblt->nHeight, scrblt->nLeftRect, scrblt->nTopRect); - if (xfi->drawing == xfi->primary) + if (xfc->drawing == xfc->primary) { - gdi_InvalidateRegion(xfi->hdc, scrblt->nLeftRect, scrblt->nTopRect, scrblt->nWidth, scrblt->nHeight); + gdi_InvalidateRegion(xfc->hdc, scrblt->nLeftRect, scrblt->nTopRect, scrblt->nWidth, scrblt->nHeight); } - XSetFunction(xfi->display, xfi->gc, GXcopy); + XSetFunction(xfc->display, xfc->gc, GXcopy); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } void xf_gdi_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect) { UINT32 color; - xfContext* context_ = (xfContext*) context; - xfInfo* xfi = context_->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); - color = freerdp_color_convert_var(opaque_rect->color, context_->settings->ColorDepth, xfi->bpp, xfi->clrconv); + color = freerdp_color_convert_var(opaque_rect->color, context->settings->ColorDepth, xfc->bpp, xfc->clrconv); - XSetFunction(xfi->display, xfi->gc, GXcopy); - XSetFillStyle(xfi->display, xfi->gc, FillSolid); - XSetForeground(xfi->display, xfi->gc, color); + XSetFunction(xfc->display, xfc->gc, GXcopy); + XSetFillStyle(xfc->display, xfc->gc, FillSolid); + XSetForeground(xfc->display, xfc->gc, color); - XFillRectangle(xfi->display, xfi->drawing, xfi->gc, + XFillRectangle(xfc->display, xfc->drawing, xfc->gc, opaque_rect->nLeftRect, opaque_rect->nTopRect, opaque_rect->nWidth, opaque_rect->nHeight); - if (xfi->drawing == xfi->primary) + if (xfc->drawing == xfc->primary) { - gdi_InvalidateRegion(xfi->hdc, opaque_rect->nLeftRect, opaque_rect->nTopRect, + gdi_InvalidateRegion(xfc->hdc, opaque_rect->nLeftRect, opaque_rect->nTopRect, opaque_rect->nWidth, opaque_rect->nHeight); } - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } void xf_gdi_multi_opaque_rect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect) @@ -461,32 +459,31 @@ void xf_gdi_multi_opaque_rect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* mult int i; UINT32 color; DELTA_RECT* rectangle; - xfContext* context_ = (xfContext*) context; - xfInfo* xfi = context_->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); - color = freerdp_color_convert_var(multi_opaque_rect->color, context_->settings->ColorDepth, xfi->bpp, xfi->clrconv); + color = freerdp_color_convert_var(multi_opaque_rect->color, context->settings->ColorDepth, xfc->bpp, xfc->clrconv); - XSetFunction(xfi->display, xfi->gc, GXcopy); - XSetFillStyle(xfi->display, xfi->gc, FillSolid); - XSetForeground(xfi->display, xfi->gc, color); + XSetFunction(xfc->display, xfc->gc, GXcopy); + XSetFillStyle(xfc->display, xfc->gc, FillSolid); + XSetForeground(xfc->display, xfc->gc, color); for (i = 1; i < multi_opaque_rect->numRectangles + 1; i++) { rectangle = &multi_opaque_rect->rectangles[i]; - XFillRectangle(xfi->display, xfi->drawing, xfi->gc, + XFillRectangle(xfc->display, xfc->drawing, xfc->gc, rectangle->left, rectangle->top, rectangle->width, rectangle->height); - if (xfi->drawing == xfi->primary) + if (xfc->drawing == xfc->primary) { - gdi_InvalidateRegion(xfi->hdc, rectangle->left, rectangle->top, rectangle->width, rectangle->height); + gdi_InvalidateRegion(xfc->hdc, rectangle->left, rectangle->top, rectangle->width, rectangle->height); } } - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } void xf_gdi_draw_nine_grid(rdpContext* context, DRAW_NINE_GRID_ORDER* draw_nine_grid) @@ -497,21 +494,20 @@ void xf_gdi_draw_nine_grid(rdpContext* context, DRAW_NINE_GRID_ORDER* draw_nine_ void xf_gdi_line_to(rdpContext* context, LINE_TO_ORDER* line_to) { UINT32 color; - xfContext* context_ = (xfContext*) context; - xfInfo* xfi = context_->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); - xf_set_rop2(xfi, line_to->bRop2); - color = freerdp_color_convert_var(line_to->penColor, context_->settings->ColorDepth, xfi->bpp, xfi->clrconv); + xf_set_rop2(xfc, line_to->bRop2); + color = freerdp_color_convert_var(line_to->penColor, context->settings->ColorDepth, xfc->bpp, xfc->clrconv); - XSetFillStyle(xfi->display, xfi->gc, FillSolid); - XSetForeground(xfi->display, xfi->gc, color); + XSetFillStyle(xfc->display, xfc->gc, FillSolid); + XSetForeground(xfc->display, xfc->gc, color); - XDrawLine(xfi->display, xfi->drawing, xfi->gc, + XDrawLine(xfc->display, xfc->drawing, xfc->gc, line_to->nXStart, line_to->nYStart, line_to->nXEnd, line_to->nYEnd); - if (xfi->drawing == xfi->primary) + if (xfc->drawing == xfc->primary) { int width, height; @@ -524,13 +520,13 @@ void xf_gdi_line_to(rdpContext* context, LINE_TO_ORDER* line_to) if (height < 0) height *= (-1); - gdi_InvalidateRegion(xfi->hdc, line_to->nXStart, line_to->nYStart, width, height); + gdi_InvalidateRegion(xfc->hdc, line_to->nXStart, line_to->nYStart, width, height); } - XSetFunction(xfi->display, xfi->gc, GXcopy); + XSetFunction(xfc->display, xfc->gc, GXcopy); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } void xf_gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline) @@ -543,16 +539,15 @@ void xf_gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline) UINT32 color; XPoint* points; int width, height; - xfContext* context_ = (xfContext*) context; - xfInfo* xfi = context_->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); - xf_set_rop2(xfi, polyline->bRop2); - color = freerdp_color_convert_var(polyline->penColor, context_->settings->ColorDepth, xfi->bpp, xfi->clrconv); + xf_set_rop2(xfc, polyline->bRop2); + color = freerdp_color_convert_var(polyline->penColor, context->settings->ColorDepth, xfc->bpp, xfc->clrconv); - XSetFillStyle(xfi->display, xfi->gc, FillSolid); - XSetForeground(xfi->display, xfi->gc, color); + XSetFillStyle(xfc->display, xfc->gc, FillSolid); + XSetForeground(xfc->display, xfc->gc, color); npoints = polyline->numPoints + 1; points = malloc(sizeof(XPoint) * npoints); @@ -566,9 +561,9 @@ void xf_gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline) points[i + 1].y = polyline->points[i].y; } - XDrawLines(xfi->display, xfi->drawing, xfi->gc, points, npoints, CoordModePrevious); + XDrawLines(xfc->display, xfc->drawing, xfc->gc, points, npoints, CoordModePrevious); - if (xfi->drawing == xfi->primary) + if (xfc->drawing == xfc->primary) { x1 = points[0].x; y1 = points[0].y; @@ -587,38 +582,38 @@ void xf_gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline) x1 = x2; y1 = y2; - gdi_InvalidateRegion(xfi->hdc, x, y, width, height); + gdi_InvalidateRegion(xfc->hdc, x, y, width, height); } } - XSetFunction(xfi->display, xfi->gc, GXcopy); + XSetFunction(xfc->display, xfc->gc, GXcopy); free(points); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } void xf_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) { xfBitmap* bitmap; - xfInfo* xfi = ((xfContext*) context)->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); bitmap = (xfBitmap*) memblt->bitmap; - xf_set_rop3(xfi, gdi_rop3_code(memblt->bRop)); + xf_set_rop3(xfc, gdi_rop3_code(memblt->bRop)); - XCopyArea(xfi->display, bitmap->pixmap, xfi->drawing, xfi->gc, + XCopyArea(xfc->display, bitmap->pixmap, xfc->drawing, xfc->gc, memblt->nXSrc, memblt->nYSrc, memblt->nWidth, memblt->nHeight, memblt->nLeftRect, memblt->nTopRect); - if (xfi->drawing == xfi->primary) + if (xfc->drawing == xfc->primary) { - gdi_InvalidateRegion(xfi->hdc, memblt->nLeftRect, memblt->nTopRect, memblt->nWidth, memblt->nHeight); + gdi_InvalidateRegion(xfc->hdc, memblt->nLeftRect, memblt->nTopRect, memblt->nWidth, memblt->nHeight); } - XSetFunction(xfi->display, xfi->gc, GXcopy); + XSetFunction(xfc->display, xfc->gc, GXcopy); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } void xf_gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) @@ -628,69 +623,68 @@ void xf_gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) UINT32 foreColor; UINT32 backColor; Pixmap pattern = 0; - xfContext* context_ = (xfContext*) context; - xfInfo* xfi = context_->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); brush = &mem3blt->brush; bitmap = (xfBitmap*) mem3blt->bitmap; - xf_set_rop3(xfi, gdi_rop3_code(mem3blt->bRop)); - foreColor = freerdp_color_convert_var(mem3blt->foreColor, context_->settings->ColorDepth, xfi->bpp, xfi->clrconv); - backColor = freerdp_color_convert_var(mem3blt->backColor, context_->settings->ColorDepth, xfi->bpp, xfi->clrconv); + xf_set_rop3(xfc, gdi_rop3_code(mem3blt->bRop)); + foreColor = freerdp_color_convert_var(mem3blt->foreColor, context->settings->ColorDepth, xfc->bpp, xfc->clrconv); + backColor = freerdp_color_convert_var(mem3blt->backColor, context->settings->ColorDepth, xfc->bpp, xfc->clrconv); if (brush->style == GDI_BS_PATTERN) { if (brush->bpp > 1) { - pattern = xf_brush_new(xfi, 8, 8, brush->bpp, brush->data); + pattern = xf_brush_new(xfc, 8, 8, brush->bpp, brush->data); - XSetFillStyle(xfi->display, xfi->gc, FillTiled); - XSetTile(xfi->display, xfi->gc, pattern); - XSetTSOrigin(xfi->display, xfi->gc, brush->x, brush->y); + XSetFillStyle(xfc->display, xfc->gc, FillTiled); + XSetTile(xfc->display, xfc->gc, pattern); + XSetTSOrigin(xfc->display, xfc->gc, brush->x, brush->y); } else { - pattern = xf_mono_bitmap_new(xfi, 8, 8, brush->data); + pattern = xf_mono_bitmap_new(xfc, 8, 8, brush->data); - XSetForeground(xfi->display, xfi->gc, backColor); - XSetBackground(xfi->display, xfi->gc, foreColor); - XSetFillStyle(xfi->display, xfi->gc, FillOpaqueStippled); - XSetStipple(xfi->display, xfi->gc, pattern); - XSetTSOrigin(xfi->display, xfi->gc, brush->x, brush->y); + XSetForeground(xfc->display, xfc->gc, backColor); + XSetBackground(xfc->display, xfc->gc, foreColor); + XSetFillStyle(xfc->display, xfc->gc, FillOpaqueStippled); + XSetStipple(xfc->display, xfc->gc, pattern); + XSetTSOrigin(xfc->display, xfc->gc, brush->x, brush->y); } } else if (brush->style == GDI_BS_SOLID) { - XSetFillStyle(xfi->display, xfi->gc, FillSolid); - XSetForeground(xfi->display, xfi->gc, backColor); - XSetBackground(xfi->display, xfi->gc, foreColor); + XSetFillStyle(xfc->display, xfc->gc, FillSolid); + XSetForeground(xfc->display, xfc->gc, backColor); + XSetBackground(xfc->display, xfc->gc, foreColor); - XSetTSOrigin(xfi->display, xfi->gc, brush->x, brush->y); + XSetTSOrigin(xfc->display, xfc->gc, brush->x, brush->y); } else { fprintf(stderr, "Mem3Blt unimplemented brush style:%d\n", brush->style); } - XCopyArea(xfi->display, bitmap->pixmap, xfi->drawing, xfi->gc, + XCopyArea(xfc->display, bitmap->pixmap, xfc->drawing, xfc->gc, mem3blt->nXSrc, mem3blt->nYSrc, mem3blt->nWidth, mem3blt->nHeight, mem3blt->nLeftRect, mem3blt->nTopRect); - if (xfi->drawing == xfi->primary) + if (xfc->drawing == xfc->primary) { - gdi_InvalidateRegion(xfi->hdc, mem3blt->nLeftRect, mem3blt->nTopRect, mem3blt->nWidth, mem3blt->nHeight); + gdi_InvalidateRegion(xfc->hdc, mem3blt->nLeftRect, mem3blt->nTopRect, mem3blt->nWidth, mem3blt->nHeight); } - XSetFillStyle(xfi->display, xfi->gc, FillSolid); - XSetTSOrigin(xfi->display, xfi->gc, 0, 0); + XSetFillStyle(xfc->display, xfc->gc, FillSolid); + XSetTSOrigin(xfc->display, xfc->gc, 0, 0); if (pattern != 0) - XFreePixmap(xfi->display, pattern); + XFreePixmap(xfc->display, pattern); - XSetFunction(xfi->display, xfi->gc, GXcopy); + XSetFunction(xfc->display, xfc->gc, GXcopy); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } void xf_gdi_polygon_sc(rdpContext* context, POLYGON_SC_ORDER* polygon_sc) @@ -698,12 +692,12 @@ void xf_gdi_polygon_sc(rdpContext* context, POLYGON_SC_ORDER* polygon_sc) int i, npoints; XPoint* points; UINT32 brush_color; - xfInfo* xfi = ((xfContext*) context)->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); - xf_set_rop2(xfi, polygon_sc->bRop2); - brush_color = freerdp_color_convert_var(polygon_sc->brushColor, ((xfContext*)context)->settings->ColorDepth, xfi->bpp, xfi->clrconv); + xf_set_rop2(xfc, polygon_sc->bRop2); + brush_color = freerdp_color_convert_var(polygon_sc->brushColor, context->settings->ColorDepth, xfc->bpp, xfc->clrconv); npoints = polygon_sc->numPoints + 1; points = malloc(sizeof(XPoint) * npoints); @@ -720,11 +714,11 @@ void xf_gdi_polygon_sc(rdpContext* context, POLYGON_SC_ORDER* polygon_sc) switch (polygon_sc->fillMode) { case 1: /* alternate */ - XSetFillRule(xfi->display, xfi->gc, EvenOddRule); + XSetFillRule(xfc->display, xfc->gc, EvenOddRule); break; case 2: /* winding */ - XSetFillRule(xfi->display, xfi->gc, WindingRule); + XSetFillRule(xfc->display, xfc->gc, WindingRule); break; default: @@ -732,22 +726,22 @@ void xf_gdi_polygon_sc(rdpContext* context, POLYGON_SC_ORDER* polygon_sc) break; } - XSetFillStyle(xfi->display, xfi->gc, FillSolid); - XSetForeground(xfi->display, xfi->gc, brush_color); + XSetFillStyle(xfc->display, xfc->gc, FillSolid); + XSetForeground(xfc->display, xfc->gc, brush_color); - XFillPolygon(xfi->display, xfi->drawing, xfi->gc, + XFillPolygon(xfc->display, xfc->drawing, xfc->gc, points, npoints, Complex, CoordModePrevious); - if (xfi->drawing == xfi->primary) + if (xfc->drawing == xfc->primary) { - XFillPolygon(xfi->display, xfi->drawable, xfi->gc, + XFillPolygon(xfc->display, xfc->drawable, xfc->gc, points, npoints, Complex, CoordModePrevious); } - XSetFunction(xfi->display, xfi->gc, GXcopy); + XSetFunction(xfc->display, xfc->gc, GXcopy); free(points); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } void xf_gdi_polygon_cb(rdpContext* context, POLYGON_CB_ORDER* polygon_cb) @@ -758,14 +752,14 @@ void xf_gdi_polygon_cb(rdpContext* context, POLYGON_CB_ORDER* polygon_cb) rdpBrush* brush; UINT32 foreColor; UINT32 backColor; - xfInfo* xfi = ((xfContext*) context)->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); brush = &(polygon_cb->brush); - xf_set_rop2(xfi, polygon_cb->bRop2); - foreColor = freerdp_color_convert_var(polygon_cb->foreColor, ((xfContext*) context)->settings->ColorDepth, xfi->bpp, xfi->clrconv); - backColor = freerdp_color_convert_var(polygon_cb->backColor, ((xfContext*) context)->settings->ColorDepth, xfi->bpp, xfi->clrconv); + xf_set_rop2(xfc, polygon_cb->bRop2); + foreColor = freerdp_color_convert_var(polygon_cb->foreColor, context->settings->ColorDepth, xfc->bpp, xfc->clrconv); + backColor = freerdp_color_convert_var(polygon_cb->backColor, context->settings->ColorDepth, xfc->bpp, xfc->clrconv); npoints = polygon_cb->numPoints + 1; points = malloc(sizeof(XPoint) * npoints); @@ -782,11 +776,11 @@ void xf_gdi_polygon_cb(rdpContext* context, POLYGON_CB_ORDER* polygon_cb) switch (polygon_cb->fillMode) { case 1: /* alternate */ - XSetFillRule(xfi->display, xfi->gc, EvenOddRule); + XSetFillRule(xfc->display, xfc->gc, EvenOddRule); break; case 2: /* winding */ - XSetFillRule(xfi->display, xfi->gc, WindingRule); + XSetFillRule(xfc->display, xfc->gc, WindingRule); break; default: @@ -798,52 +792,52 @@ void xf_gdi_polygon_cb(rdpContext* context, POLYGON_CB_ORDER* polygon_cb) { if (brush->bpp > 1) { - pattern = xf_brush_new(xfi, 8, 8, brush->bpp, brush->data); + pattern = xf_brush_new(xfc, 8, 8, brush->bpp, brush->data); - XSetFillStyle(xfi->display, xfi->gc, FillTiled); - XSetTile(xfi->display, xfi->gc, pattern); - XSetTSOrigin(xfi->display, xfi->gc, brush->x, brush->y); + XSetFillStyle(xfc->display, xfc->gc, FillTiled); + XSetTile(xfc->display, xfc->gc, pattern); + XSetTSOrigin(xfc->display, xfc->gc, brush->x, brush->y); - XFillPolygon(xfi->display, xfi->drawing, xfi->gc, + XFillPolygon(xfc->display, xfc->drawing, xfc->gc, points, npoints, Complex, CoordModePrevious); - if (xfi->drawing == xfi->primary) + if (xfc->drawing == xfc->primary) { - XFillPolygon(xfi->display, xfi->drawable, xfi->gc, + XFillPolygon(xfc->display, xfc->drawable, xfc->gc, points, npoints, Complex, CoordModePrevious); } - XSetFillStyle(xfi->display, xfi->gc, FillSolid); - XSetTSOrigin(xfi->display, xfi->gc, 0, 0); - XFreePixmap(xfi->display, pattern); + XSetFillStyle(xfc->display, xfc->gc, FillSolid); + XSetTSOrigin(xfc->display, xfc->gc, 0, 0); + XFreePixmap(xfc->display, pattern); } else { - pattern = xf_mono_bitmap_new(xfi, 8, 8, brush->data); + pattern = xf_mono_bitmap_new(xfc, 8, 8, brush->data); - XSetForeground(xfi->display, xfi->gc, backColor); - XSetBackground(xfi->display, xfi->gc, foreColor); + XSetForeground(xfc->display, xfc->gc, backColor); + XSetBackground(xfc->display, xfc->gc, foreColor); if (polygon_cb->backMode == BACKMODE_TRANSPARENT) - XSetFillStyle(xfi->display, xfi->gc, FillStippled); + XSetFillStyle(xfc->display, xfc->gc, FillStippled); else if (polygon_cb->backMode == BACKMODE_OPAQUE) - XSetFillStyle(xfi->display, xfi->gc, FillOpaqueStippled); + XSetFillStyle(xfc->display, xfc->gc, FillOpaqueStippled); - XSetStipple(xfi->display, xfi->gc, pattern); - XSetTSOrigin(xfi->display, xfi->gc, brush->x, brush->y); + XSetStipple(xfc->display, xfc->gc, pattern); + XSetTSOrigin(xfc->display, xfc->gc, brush->x, brush->y); - XFillPolygon(xfi->display, xfi->drawing, xfi->gc, + XFillPolygon(xfc->display, xfc->drawing, xfc->gc, points, npoints, Complex, CoordModePrevious); - if (xfi->drawing == xfi->primary) + if (xfc->drawing == xfc->primary) { - XFillPolygon(xfi->display, xfi->drawable, xfi->gc, + XFillPolygon(xfc->display, xfc->drawable, xfc->gc, points, npoints, Complex, CoordModePrevious); } - XSetFillStyle(xfi->display, xfi->gc, FillSolid); - XSetTSOrigin(xfi->display, xfi->gc, 0, 0); - XFreePixmap(xfi->display, pattern); + XSetFillStyle(xfc->display, xfc->gc, FillSolid); + XSetTSOrigin(xfc->display, xfc->gc, 0, 0); + XFreePixmap(xfc->display, pattern); } } else @@ -851,10 +845,10 @@ void xf_gdi_polygon_cb(rdpContext* context, POLYGON_CB_ORDER* polygon_cb) fprintf(stderr, "PolygonCB unimplemented brush style:%d\n", brush->style); } - XSetFunction(xfi->display, xfi->gc, GXcopy); + XSetFunction(xfc->display, xfc->gc, GXcopy); free(points); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } void xf_gdi_ellipse_sc(rdpContext* context, ELLIPSE_SC_ORDER* ellipse_sc) @@ -869,70 +863,69 @@ void xf_gdi_ellipse_cb(rdpContext* context, ELLIPSE_CB_ORDER* ellipse_cb) void xf_gdi_surface_frame_marker(rdpContext* context, SURFACE_FRAME_MARKER* surface_frame_marker) { - xfInfo* xfi; rdpSettings* settings; + xfContext* xfc = (xfContext*) context; - xfi = ((xfContext*) context)->xfi; - settings = xfi->instance->settings; + settings = xfc->instance->settings; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); switch (surface_frame_marker->frameAction) { case SURFACECMD_FRAMEACTION_BEGIN: - xfi->frame_begin = TRUE; - xfi->frame_x1 = 0; - xfi->frame_y1 = 0; - xfi->frame_x2 = 0; - xfi->frame_y2 = 0; + xfc->frame_begin = TRUE; + xfc->frame_x1 = 0; + xfc->frame_y1 = 0; + xfc->frame_x2 = 0; + xfc->frame_y2 = 0; break; case SURFACECMD_FRAMEACTION_END: - xfi->frame_begin = FALSE; - if ((xfi->frame_x2 > xfi->frame_x1) && (xfi->frame_y2 > xfi->frame_y1)) + xfc->frame_begin = FALSE; + if ((xfc->frame_x2 > xfc->frame_x1) && (xfc->frame_y2 > xfc->frame_y1)) { - gdi_InvalidateRegion(xfi->hdc, xfi->frame_x1, xfi->frame_y1, - xfi->frame_x2 - xfi->frame_x1, xfi->frame_y2 - xfi->frame_y1); + gdi_InvalidateRegion(xfc->hdc, xfc->frame_x1, xfc->frame_y1, + xfc->frame_x2 - xfc->frame_x1, xfc->frame_y2 - xfc->frame_y1); } if (settings->FrameAcknowledge > 0) { - IFCALL(xfi->instance->update->SurfaceFrameAcknowledge, context, surface_frame_marker->frameId); + IFCALL(xfc->instance->update->SurfaceFrameAcknowledge, context, surface_frame_marker->frameId); } break; } - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } -static void xf_gdi_surface_update_frame(xfInfo* xfi, UINT16 tx, UINT16 ty, UINT16 width, UINT16 height) +static void xf_gdi_surface_update_frame(xfContext* xfc, UINT16 tx, UINT16 ty, UINT16 width, UINT16 height) { - if (!xfi->remote_app) + if (!xfc->remote_app) { - if (xfi->frame_begin) + if (xfc->frame_begin) { - if (xfi->frame_x2 > xfi->frame_x1 && xfi->frame_y2 > xfi->frame_y1) + if (xfc->frame_x2 > xfc->frame_x1 && xfc->frame_y2 > xfc->frame_y1) { - xfi->frame_x1 = MIN(xfi->frame_x1, tx); - xfi->frame_y1 = MIN(xfi->frame_y1, ty); - xfi->frame_x2 = MAX(xfi->frame_x2, tx + width); - xfi->frame_y2 = MAX(xfi->frame_y2, ty + height); + xfc->frame_x1 = MIN(xfc->frame_x1, tx); + xfc->frame_y1 = MIN(xfc->frame_y1, ty); + xfc->frame_x2 = MAX(xfc->frame_x2, tx + width); + xfc->frame_y2 = MAX(xfc->frame_y2, ty + height); } else { - xfi->frame_x1 = tx; - xfi->frame_y1 = ty; - xfi->frame_x2 = tx + width; - xfi->frame_y2 = ty + height; + xfc->frame_x1 = tx; + xfc->frame_y1 = ty; + xfc->frame_x2 = tx + width; + xfc->frame_y2 = ty + height; } } else { - gdi_InvalidateRegion(xfi->hdc, tx, ty, width, height); + gdi_InvalidateRegion(xfc->hdc, tx, ty, width, height); } } else { - gdi_InvalidateRegion(xfi->hdc, tx, ty, width, height); + gdi_InvalidateRegion(xfc->hdc, tx, ty, width, height); } } @@ -941,34 +934,34 @@ void xf_gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* surface_bits int i, tx, ty; XImage* image; RFX_MESSAGE* message; - xfInfo* xfi = ((xfContext*) context)->xfi; - RFX_CONTEXT* rfx_context = (RFX_CONTEXT*) xfi->rfx_context; - NSC_CONTEXT* nsc_context = (NSC_CONTEXT*) xfi->nsc_context; + xfContext* xfc = (xfContext*) context; + RFX_CONTEXT* rfx_context = (RFX_CONTEXT*) xfc->rfx_context; + NSC_CONTEXT* nsc_context = (NSC_CONTEXT*) xfc->nsc_context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); if (surface_bits_command->codecID == RDP_CODEC_ID_REMOTEFX) { message = rfx_process_message(rfx_context, surface_bits_command->bitmapData, surface_bits_command->bitmapDataLength); - XSetFunction(xfi->display, xfi->gc, GXcopy); - XSetFillStyle(xfi->display, xfi->gc, FillSolid); + XSetFunction(xfc->display, xfc->gc, GXcopy); + XSetFillStyle(xfc->display, xfc->gc, FillSolid); - XSetClipRectangles(xfi->display, xfi->gc, + XSetClipRectangles(xfc->display, xfc->gc, surface_bits_command->destLeft, surface_bits_command->destTop, (XRectangle*) message->rects, message->num_rects, YXBanded); /* Draw the tiles to primary surface, each is 64x64. */ for (i = 0; i < message->num_tiles; i++) { - image = XCreateImage(xfi->display, xfi->visual, 24, ZPixmap, 0, + image = XCreateImage(xfc->display, xfc->visual, 24, ZPixmap, 0, (char*) message->tiles[i]->data, 64, 64, 32, 0); tx = message->tiles[i]->x + surface_bits_command->destLeft; ty = message->tiles[i]->y + surface_bits_command->destTop; - XPutImage(xfi->display, xfi->primary, xfi->gc, image, 0, 0, tx, ty, 64, 64); + XPutImage(xfc->display, xfc->primary, xfc->gc, image, 0, 0, tx, ty, 64, 64); XFree(image); } @@ -978,10 +971,10 @@ void xf_gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* surface_bits tx = message->rects[i].x + surface_bits_command->destLeft; ty = message->rects[i].y + surface_bits_command->destTop; - xf_gdi_surface_update_frame(xfi, tx, ty, message->rects[i].width, message->rects[i].height); + xf_gdi_surface_update_frame(xfc, tx, ty, message->rects[i].width, message->rects[i].height); } - XSetClipMask(xfi->display, xfi->gc, None); + XSetClipMask(xfc->display, xfc->gc, None); rfx_message_free(rfx_context, message); } else if (surface_bits_command->codecID == RDP_CODEC_ID_NSCODEC) @@ -989,56 +982,56 @@ void xf_gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* surface_bits nsc_process_message(nsc_context, surface_bits_command->bpp, surface_bits_command->width, surface_bits_command->height, surface_bits_command->bitmapData, surface_bits_command->bitmapDataLength); - XSetFunction(xfi->display, xfi->gc, GXcopy); - XSetFillStyle(xfi->display, xfi->gc, FillSolid); + XSetFunction(xfc->display, xfc->gc, GXcopy); + XSetFillStyle(xfc->display, xfc->gc, FillSolid); - xfi->bmp_codec_nsc = (BYTE*) realloc(xfi->bmp_codec_nsc, + xfc->bmp_codec_nsc = (BYTE*) realloc(xfc->bmp_codec_nsc, surface_bits_command->width * surface_bits_command->height * 4); - freerdp_image_flip(nsc_context->bmpdata, xfi->bmp_codec_nsc, + freerdp_image_flip(nsc_context->bmpdata, xfc->bmp_codec_nsc, surface_bits_command->width, surface_bits_command->height, 32); - image = XCreateImage(xfi->display, xfi->visual, 24, ZPixmap, 0, - (char*) xfi->bmp_codec_nsc, surface_bits_command->width, surface_bits_command->height, 32, 0); + image = XCreateImage(xfc->display, xfc->visual, 24, ZPixmap, 0, + (char*) xfc->bmp_codec_nsc, surface_bits_command->width, surface_bits_command->height, 32, 0); - XPutImage(xfi->display, xfi->primary, xfi->gc, image, 0, 0, + XPutImage(xfc->display, xfc->primary, xfc->gc, image, 0, 0, surface_bits_command->destLeft, surface_bits_command->destTop, surface_bits_command->width, surface_bits_command->height); XFree(image); - xf_gdi_surface_update_frame(xfi, + xf_gdi_surface_update_frame(xfc, surface_bits_command->destLeft, surface_bits_command->destTop, surface_bits_command->width, surface_bits_command->height); - XSetClipMask(xfi->display, xfi->gc, None); + XSetClipMask(xfc->display, xfc->gc, None); } else if (surface_bits_command->codecID == RDP_CODEC_ID_NONE) { - XSetFunction(xfi->display, xfi->gc, GXcopy); - XSetFillStyle(xfi->display, xfi->gc, FillSolid); + XSetFunction(xfc->display, xfc->gc, GXcopy); + XSetFillStyle(xfc->display, xfc->gc, FillSolid); /* Validate that the data received is large enough */ if ((surface_bits_command->width * surface_bits_command->height * surface_bits_command->bpp / 8) <= (surface_bits_command->bitmapDataLength)) { - xfi->bmp_codec_none = (BYTE*) realloc(xfi->bmp_codec_none, + xfc->bmp_codec_none = (BYTE*) realloc(xfc->bmp_codec_none, surface_bits_command->width * surface_bits_command->height * 4); - freerdp_image_flip(surface_bits_command->bitmapData, xfi->bmp_codec_none, + freerdp_image_flip(surface_bits_command->bitmapData, xfc->bmp_codec_none, surface_bits_command->width, surface_bits_command->height, 32); - image = XCreateImage(xfi->display, xfi->visual, 24, ZPixmap, 0, - (char*) xfi->bmp_codec_none, surface_bits_command->width, surface_bits_command->height, 32, 0); + image = XCreateImage(xfc->display, xfc->visual, 24, ZPixmap, 0, + (char*) xfc->bmp_codec_none, surface_bits_command->width, surface_bits_command->height, 32, 0); - XPutImage(xfi->display, xfi->primary, xfi->gc, image, 0, 0, + XPutImage(xfc->display, xfc->primary, xfc->gc, image, 0, 0, surface_bits_command->destLeft, surface_bits_command->destTop, surface_bits_command->width, surface_bits_command->height); XFree(image); - xf_gdi_surface_update_frame(xfi, + xf_gdi_surface_update_frame(xfc, surface_bits_command->destLeft, surface_bits_command->destTop, surface_bits_command->width, surface_bits_command->height); - XSetClipMask(xfi->display, xfi->gc, None); + XSetClipMask(xfc->display, xfc->gc, None); } else { @@ -1050,7 +1043,7 @@ void xf_gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* surface_bits fprintf(stderr, "Unsupported codecID %d\n", surface_bits_command->codecID); } - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } void xf_gdi_register_update_callbacks(rdpUpdate* update) diff --git a/client/X11/xf_gdi.h b/client/X11/xf_gdi.h index 64e98d0cb..413f1c6e7 100644 --- a/client/X11/xf_gdi.h +++ b/client/X11/xf_gdi.h @@ -22,7 +22,7 @@ #include -#include "xf_interface.h" +#include "xf_client.h" #include "xfreerdp.h" void xf_gdi_register_update_callbacks(rdpUpdate* update); diff --git a/client/X11/xf_graphics.c b/client/X11/xf_graphics.c index da609790a..96fbf974d 100644 --- a/client/X11/xf_graphics.c +++ b/client/X11/xf_graphics.c @@ -43,25 +43,24 @@ void xf_Bitmap_New(rdpContext* context, rdpBitmap* bitmap) BYTE* data; Pixmap pixmap; XImage* image; - xfContext* context_ = (xfContext*) context; - xfInfo* xfi = context_->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); - XSetFunction(xfi->display, xfi->gc, GXcopy); - pixmap = XCreatePixmap(xfi->display, xfi->drawable, bitmap->width, bitmap->height, xfi->depth); + XSetFunction(xfc->display, xfc->gc, GXcopy); + pixmap = XCreatePixmap(xfc->display, xfc->drawable, bitmap->width, bitmap->height, xfc->depth); if (bitmap->data != NULL) { data = freerdp_image_convert(bitmap->data, NULL, - bitmap->width, bitmap->height, context_->settings->ColorDepth, xfi->bpp, xfi->clrconv); + bitmap->width, bitmap->height, context->settings->ColorDepth, xfc->bpp, xfc->clrconv); if (bitmap->ephemeral != TRUE) { - image = XCreateImage(xfi->display, xfi->visual, xfi->depth, - ZPixmap, 0, (char*) data, bitmap->width, bitmap->height, xfi->scanline_pad, 0); + image = XCreateImage(xfc->display, xfc->visual, xfc->depth, + ZPixmap, 0, (char*) data, bitmap->width, bitmap->height, xfc->scanline_pad, 0); - XPutImage(xfi->display, pixmap, xfi->gc, image, 0, 0, 0, 0, bitmap->width, bitmap->height); + XPutImage(xfc->display, pixmap, xfc->gc, image, 0, 0, 0, 0, bitmap->width, bitmap->height); XFree(image); if (data != bitmap->data) @@ -78,45 +77,45 @@ void xf_Bitmap_New(rdpContext* context, rdpBitmap* bitmap) ((xfBitmap*) bitmap)->pixmap = pixmap; - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } void xf_Bitmap_Free(rdpContext* context, rdpBitmap* bitmap) { - xfInfo* xfi = ((xfContext*) context)->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); if (((xfBitmap*) bitmap)->pixmap != 0) - XFreePixmap(xfi->display, ((xfBitmap*) bitmap)->pixmap); + XFreePixmap(xfc->display, ((xfBitmap*) bitmap)->pixmap); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } void xf_Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap) { XImage* image; int width, height; - xfInfo* xfi = ((xfContext*) context)->xfi; + xfContext* xfc = (xfContext*) context; width = bitmap->right - bitmap->left + 1; height = bitmap->bottom - bitmap->top + 1; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); - XSetFunction(xfi->display, xfi->gc, GXcopy); + XSetFunction(xfc->display, xfc->gc, GXcopy); - image = XCreateImage(xfi->display, xfi->visual, xfi->depth, - ZPixmap, 0, (char*) bitmap->data, bitmap->width, bitmap->height, xfi->scanline_pad, 0); + image = XCreateImage(xfc->display, xfc->visual, xfc->depth, + ZPixmap, 0, (char*) bitmap->data, bitmap->width, bitmap->height, xfc->scanline_pad, 0); - XPutImage(xfi->display, xfi->primary, xfi->gc, + XPutImage(xfc->display, xfc->primary, xfc->gc, image, 0, 0, bitmap->left, bitmap->top, width, height); XFree(image); - gdi_InvalidateRegion(xfi->hdc, bitmap->left, bitmap->top, width, height); + gdi_InvalidateRegion(xfc->hdc, bitmap->left, bitmap->top, width, height); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } void xf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, @@ -128,11 +127,9 @@ void xf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, BYTE* dst; int yindex; int xindex; - xfInfo* xfi; BOOL status; RFX_MESSAGE* msg; - - xfi = ((xfContext*) context)->xfi; + xfContext* xfc = (xfContext*) context; size = width * height * (bpp + 7) / 8; @@ -148,8 +145,8 @@ void xf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, break; case RDP_CODEC_ID_REMOTEFX: - rfx_context_set_pixel_format(xfi->rfx_context, RDP_PIXEL_FORMAT_B8G8R8A8); - msg = rfx_process_message(xfi->rfx_context, data, length); + rfx_context_set_pixel_format(xfc->rfx_context, RDP_PIXEL_FORMAT_B8G8R8A8); + msg = rfx_process_message(xfc->rfx_context, data, length); if (msg == NULL) { @@ -169,7 +166,7 @@ void xf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, src++; } } - rfx_message_free(xfi->rfx_context, msg); + rfx_message_free(xfc->rfx_context, msg); } break; @@ -204,16 +201,16 @@ void xf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, void xf_Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, BOOL primary) { - xfInfo* xfi = ((xfContext*) context)->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); if (primary) - xfi->drawing = xfi->primary; + xfc->drawing = xfc->primary; else - xfi->drawing = ((xfBitmap*) bitmap)->pixmap; + xfc->drawing = ((xfBitmap*) bitmap)->pixmap; - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } /* Pointer Class */ @@ -222,9 +219,9 @@ void xf_Pointer_New(rdpContext* context, rdpPointer* pointer) { #ifdef WITH_XCURSOR XcursorImage ci; - xfInfo* xfi = ((xfContext*) context)->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); ZeroMemory(&ci, sizeof(ci)); ci.version = XCURSOR_IMAGE_VERSION; @@ -240,54 +237,54 @@ void xf_Pointer_New(rdpContext* context, rdpPointer* pointer) if ((pointer->andMaskData != 0) && (pointer->xorMaskData != 0)) { freerdp_alpha_cursor_convert((BYTE*) (ci.pixels), pointer->xorMaskData, pointer->andMaskData, - pointer->width, pointer->height, pointer->xorBpp, xfi->clrconv); + pointer->width, pointer->height, pointer->xorBpp, xfc->clrconv); } - ((xfPointer*) pointer)->cursor = XcursorImageLoadCursor(xfi->display, &ci); + ((xfPointer*) pointer)->cursor = XcursorImageLoadCursor(xfc->display, &ci); free(ci.pixels); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); #endif } void xf_Pointer_Free(rdpContext* context, rdpPointer* pointer) { #ifdef WITH_XCURSOR - xfInfo* xfi = ((xfContext*) context)->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); if (((xfPointer*) pointer)->cursor != 0) - XFreeCursor(xfi->display, ((xfPointer*) pointer)->cursor); + XFreeCursor(xfc->display, ((xfPointer*) pointer)->cursor); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); #endif } void xf_Pointer_Set(rdpContext* context, rdpPointer* pointer) { #ifdef WITH_XCURSOR - xfInfo* xfi = ((xfContext*) context)->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); /* in RemoteApp mode, window can be null if none has had focus */ - if (xfi->window != NULL) - XDefineCursor(xfi->display, xfi->window->handle, ((xfPointer*) pointer)->cursor); + if (xfc->window != NULL) + XDefineCursor(xfc->display, xfc->window->handle, ((xfPointer*) pointer)->cursor); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); #endif } void xf_Pointer_SetNull(rdpContext* context) { #ifdef WITH_XCURSOR - xfInfo* xfi = ((xfContext*) context)->xfi; + xfContext* xfc = (xfContext*) context; static Cursor nullcursor = None; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); if (nullcursor == None) { @@ -299,27 +296,27 @@ void xf_Pointer_SetNull(rdpContext* context) ci.width = ci.height = 1; ci.xhot = ci.yhot = 0; ci.pixels = &xp; - nullcursor = XcursorImageLoadCursor(xfi->display, &ci); + nullcursor = XcursorImageLoadCursor(xfc->display, &ci); } - if (xfi->window != NULL && nullcursor != None) - XDefineCursor(xfi->display, xfi->window->handle, nullcursor); + if (xfc->window != NULL && nullcursor != None) + XDefineCursor(xfc->display, xfc->window->handle, nullcursor); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); #endif } void xf_Pointer_SetDefault(rdpContext* context) { #ifdef WITH_XCURSOR - xfInfo* xfi = ((xfContext*) context)->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); - if (xfi->window != NULL) - XUndefineCursor(xfi->display, xfi->window->handle); + if (xfc->window != NULL) + XUndefineCursor(xfc->display, xfc->window->handle); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); #endif } @@ -327,101 +324,100 @@ void xf_Pointer_SetDefault(rdpContext* context) void xf_Glyph_New(rdpContext* context, rdpGlyph* glyph) { - xfInfo* xfi; int scanline; XImage* image; xfGlyph* xf_glyph; xf_glyph = (xfGlyph*) glyph; - xfi = ((xfContext*) context)->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); scanline = (glyph->cx + 7) / 8; - xf_glyph->pixmap = XCreatePixmap(xfi->display, xfi->drawing, glyph->cx, glyph->cy, 1); + xf_glyph->pixmap = XCreatePixmap(xfc->display, xfc->drawing, glyph->cx, glyph->cy, 1); - image = XCreateImage(xfi->display, xfi->visual, 1, + image = XCreateImage(xfc->display, xfc->visual, 1, ZPixmap, 0, (char*) glyph->aj, glyph->cx, glyph->cy, 8, scanline); image->byte_order = MSBFirst; image->bitmap_bit_order = MSBFirst; XInitImage(image); - XPutImage(xfi->display, xf_glyph->pixmap, xfi->gc_mono, image, 0, 0, 0, 0, glyph->cx, glyph->cy); + XPutImage(xfc->display, xf_glyph->pixmap, xfc->gc_mono, image, 0, 0, 0, 0, glyph->cx, glyph->cy); XFree(image); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } void xf_Glyph_Free(rdpContext* context, rdpGlyph* glyph) { - xfInfo* xfi = ((xfContext*) context)->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); if (((xfGlyph*) glyph)->pixmap != 0) - XFreePixmap(xfi->display, ((xfGlyph*) glyph)->pixmap); + XFreePixmap(xfc->display, ((xfGlyph*) glyph)->pixmap); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } void xf_Glyph_Draw(rdpContext* context, rdpGlyph* glyph, int x, int y) { xfGlyph* xf_glyph; - xfInfo* xfi = ((xfContext*) context)->xfi; + xfContext* xfc = (xfContext*) context; xf_glyph = (xfGlyph*) glyph; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); - XSetStipple(xfi->display, xfi->gc, xf_glyph->pixmap); - XSetTSOrigin(xfi->display, xfi->gc, x, y); - XFillRectangle(xfi->display, xfi->drawing, xfi->gc, x, y, glyph->cx, glyph->cy); - XSetStipple(xfi->display, xfi->gc, xfi->bitmap_mono); + XSetStipple(xfc->display, xfc->gc, xf_glyph->pixmap); + XSetTSOrigin(xfc->display, xfc->gc, x, y); + XFillRectangle(xfc->display, xfc->drawing, xfc->gc, x, y, glyph->cx, glyph->cy); + XSetStipple(xfc->display, xfc->gc, xfc->bitmap_mono); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } void xf_Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor) { xfContext* context_ = (xfContext*) context; - xfInfo* xfi = context_->xfi; + xfContext* xfc = (xfContext*) context; - bgcolor = (xfi->clrconv->invert)? - freerdp_color_convert_var_bgr(bgcolor, context_->settings->ColorDepth, xfi->bpp, xfi->clrconv): - freerdp_color_convert_var_rgb(bgcolor, context_->settings->ColorDepth, xfi->bpp, xfi->clrconv); + bgcolor = (xfc->clrconv->invert)? + freerdp_color_convert_var_bgr(bgcolor, context_->settings->ColorDepth, xfc->bpp, xfc->clrconv): + freerdp_color_convert_var_rgb(bgcolor, context_->settings->ColorDepth, xfc->bpp, xfc->clrconv); - fgcolor = (xfi->clrconv->invert)? - freerdp_color_convert_var_bgr(fgcolor, context_->settings->ColorDepth, xfi->bpp, xfi->clrconv): - freerdp_color_convert_var_rgb(fgcolor, context_->settings->ColorDepth, xfi->bpp, xfi->clrconv); + fgcolor = (xfc->clrconv->invert)? + freerdp_color_convert_var_bgr(fgcolor, context_->settings->ColorDepth, xfc->bpp, xfc->clrconv): + freerdp_color_convert_var_rgb(fgcolor, context_->settings->ColorDepth, xfc->bpp, xfc->clrconv); - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); - XSetFunction(xfi->display, xfi->gc, GXcopy); - XSetFillStyle(xfi->display, xfi->gc, FillSolid); - XSetForeground(xfi->display, xfi->gc, fgcolor); - XFillRectangle(xfi->display, xfi->drawing, xfi->gc, x, y, width, height); + XSetFunction(xfc->display, xfc->gc, GXcopy); + XSetFillStyle(xfc->display, xfc->gc, FillSolid); + XSetForeground(xfc->display, xfc->gc, fgcolor); + XFillRectangle(xfc->display, xfc->drawing, xfc->gc, x, y, width, height); - XSetForeground(xfi->display, xfi->gc, bgcolor); - XSetBackground(xfi->display, xfi->gc, fgcolor); - XSetFillStyle(xfi->display, xfi->gc, FillStippled); + XSetForeground(xfc->display, xfc->gc, bgcolor); + XSetBackground(xfc->display, xfc->gc, fgcolor); + XSetFillStyle(xfc->display, xfc->gc, FillStippled); - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } void xf_Glyph_EndDraw(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor) { - xfInfo* xfi = ((xfContext*) context)->xfi; + xfContext* xfc = (xfContext*) context; - xf_lock_x11(xfi, FALSE); + xf_lock_x11(xfc, FALSE); - if (xfi->drawing == xfi->primary) + if (xfc->drawing == xfc->primary) { - gdi_InvalidateRegion(xfi->hdc, x, y, width, height); + gdi_InvalidateRegion(xfc->hdc, x, y, width, height); } - xf_unlock_x11(xfi, FALSE); + xf_unlock_x11(xfc, FALSE); } /* Graphics Module */ diff --git a/client/X11/xf_graphics.h b/client/X11/xf_graphics.h index 60bbba6bf..8363bf553 100644 --- a/client/X11/xf_graphics.h +++ b/client/X11/xf_graphics.h @@ -20,7 +20,7 @@ #ifndef __XF_GRAPHICS_H #define __XF_GRAPHICS_H -#include "xf_interface.h" +#include "xf_client.h" #include "xfreerdp.h" void xf_register_graphics(rdpGraphics* graphics); diff --git a/client/X11/xf_input.c b/client/X11/xf_input.c index f8626a1e8..1d84595ef 100644 --- a/client/X11/xf_input.c +++ b/client/X11/xf_input.c @@ -28,6 +28,10 @@ #include #include "xf_event.h" +<<<<<<< HEAD +======= + +>>>>>>> awake/master #include "xf_input.h" #ifdef WITH_XI @@ -83,7 +87,8 @@ const char* xf_input_get_class_string(int class) return "XIUnknownClass"; } -int xf_input_init(xfInfo* xfi, Window window) + +int xf_input_init(xfContext* xfc, Window window) { int i, j; int nmasks; @@ -109,15 +114,15 @@ int xf_input_init(xfInfo* xfi, Window window) active_contacts = 0; ZeroMemory(contacts, sizeof(touchContact) * MAX_CONTACTS); - if (!XQueryExtension(xfi->display, "XInputExtension", &opcode, &event, &error)) + if (!XQueryExtension(xfc->display, "XInputExtension", &opcode, &event, &error)) { printf("XInput extension not available.\n"); return -1; } - xfi->XInputOpcode = opcode; + xfc->XInputOpcode = opcode; - XIQueryVersion(xfi->display, &major, &minor); + XIQueryVersion(xfc->display, &major, &minor); if (major * 1000 + minor < 2002) { @@ -125,12 +130,10 @@ int xf_input_init(xfInfo* xfi, Window window) return -1; } + if (xfc->settings->MultiTouchInput) + xfc->use_xinput = TRUE; - if (xfi->settings->MultiTouchInput) - xfi->use_xinput = TRUE; - - - info = XIQueryDevice(xfi->display, XIAllDevices, &ndevices); + info = XIQueryDevice(xfc->display, XIAllDevices, &ndevices); for (i = 0; i < ndevices; i++) { @@ -154,11 +157,11 @@ int xf_input_init(xfInfo* xfi, Window window) XIAnyClassInfo* class = dev->classes[j]; XITouchClassInfo* t = (XITouchClassInfo*) class; - if (xfi->settings->MultiTouchInput) + if (xfc->settings->MultiTouchInput) { printf("%s (%d) \"%s\" id: %d\n", - xf_input_get_class_string(class->type), - class->type, dev->name, dev->deviceid); + xf_input_get_class_string(class->type), + class->type, dev->name, dev->deviceid); } evmasks[nmasks].mask = masks[nmasks]; @@ -169,11 +172,11 @@ int xf_input_init(xfInfo* xfi, Window window) if ((class->type == XITouchClass) && (t->mode == XIDirectTouch) && (strcmp(dev->name, "Virtual core pointer") != 0)) { - if (xfi->settings->MultiTouchInput) + if (xfc->settings->MultiTouchInput) { printf("%s %s touch device (id: %d, mode: %d), supporting %d touches.\n", - dev->name, (t->mode == XIDirectTouch) ? "direct" : "dependent", - dev->deviceid, t->mode, t->num_touches); + dev->name, (t->mode == XIDirectTouch) ? "direct" : "dependent", + dev->deviceid, t->mode, t->num_touches); } XISetMask(masks[nmasks], XI_TouchBegin); @@ -182,7 +185,7 @@ int xf_input_init(xfInfo* xfi, Window window) nmasks++; } - if (xfi->use_xinput) + if (xfc->use_xinput) { if (!touch && (class->type == XIButtonClass)) { @@ -196,7 +199,7 @@ int xf_input_init(xfInfo* xfi, Window window) } if (nmasks > 0) - xstatus = XISelectEvents(xfi->display, window, evmasks, nmasks); + xstatus = XISelectEvents(xfc->display, window, evmasks, nmasks); initialized = 1; return 0; @@ -361,12 +364,13 @@ void xf_input_detect_pan(xfInfo* xfi) } -void xf_input_detect_pinch(xfInfo* xfi) +void xf_input_detect_pinch(xfContext* xfc) { double dist; double zoom; double delta; + ResizeWindowEventArgs e; if (active_contacts != 2) { @@ -411,17 +415,28 @@ void xf_input_detect_pinch(xfInfo* xfi) if (z_vector > ZOOM_THRESHOLD) { - xfi->scale -= 0.05; + xfc->scale -= 0.05; if (xfi->scale < 0.8) xfi->scale = 0.8; - +/* xfi->currentWidth = xfi->originalWidth * xfi->scale; xfi->currentHeight = xfi->originalHeight * xfi->scale; xf_transform_window(xfi); IFCALL(xfi->client->OnResizeWindow, xfi->instance, xfi->originalWidth * xfi->scale, xfi->originalHeight * xfi->scale); xf_draw_screen_scaled(xfi, 0, 0, 0, 0, FALSE); + */ + + //XResizeWindow(xfc->display, xfc->window->handle, xfc->originalWidth * xfc->scale, xfc->originalHeight * xfc->scale); + + + EventArgsInit(&e, "xfreerdp"); + e.width = (int) xfc->originalWidth * xfc->scale; + e.height = (int) xfc->originalHeight * xfc->scale; + + xf_transform_window(xfi); + PubSub_OnResizeWindow(((rdpContext*) xfc)->pubSub, xfc, &e); z_vector = 0; @@ -432,17 +447,29 @@ void xf_input_detect_pinch(xfInfo* xfi) if (z_vector < -ZOOM_THRESHOLD) { - xfi->scale += 0.05; + xfc->scale += 0.05; if (xfi->scale > 1.2) xfi->scale = 1.2; - +/* xfi->currentWidth = xfi->originalWidth * xfi->scale; xfi->currentHeight = xfi->originalHeight * xfi->scale; xf_transform_window(xfi); IFCALL(xfi->client->OnResizeWindow, xfi->instance, xfi->originalWidth * xfi->scale, xfi->originalHeight * xfi->scale); xf_draw_screen_scaled(xfi, 0, 0, 0, 0, FALSE); + */ + + if (xfc->scale > 1.5) + xfc->scale = 1.5; + + EventArgsInit(&e, "xfreerdp"); + e.width = (int) xfc->originalWidth * xfc->scale; + e.height = (int) xfc->originalHeight * xfc->scale; + + xf_transform_window(xfi); + PubSub_OnResizeWindow(((rdpContext*) xfc)->pubSub, xfc, &e); + z_vector = 0; @@ -453,7 +480,7 @@ void xf_input_detect_pinch(xfInfo* xfi) } } -void xf_input_touch_begin(xfInfo* xfi, XIDeviceEvent* event) +void xf_input_touch_begin(xfContext* xfc, XIDeviceEvent* event) { int i; /* @@ -482,7 +509,7 @@ void xf_input_touch_begin(xfInfo* xfi, XIDeviceEvent* event) } } -void xf_input_touch_update(xfInfo* xfi, XIDeviceEvent* event) +void xf_input_touch_update(xfContext* xfc, XIDeviceEvent* event) { int i; /* @@ -503,15 +530,15 @@ void xf_input_touch_update(xfInfo* xfi, XIDeviceEvent* event) contacts[i].pos_x = event->event_x; contacts[i].pos_y = event->event_y; - xf_input_detect_pinch(xfi); - xf_input_detect_pan(xfi); + xf_input_detect_pinch(xfc); + xf_input_detect_pan(xfc); break; } } } -void xf_input_touch_end(xfInfo* xfi, XIDeviceEvent* event) +void xf_input_touch_end(xfContext* xfc, XIDeviceEvent* event) { int i; @@ -537,31 +564,31 @@ void xf_input_touch_end(xfInfo* xfi, XIDeviceEvent* event) } } -int xf_input_handle_event_local(xfInfo* xfi, XEvent* event) +int xf_input_handle_event_local(xfContext* xfc, XEvent* event) { XGenericEventCookie* cookie = &event->xcookie; - XGetEventData(xfi->display, cookie); + XGetEventData(xfc->display, cookie); - if ((cookie->type == GenericEvent) && (cookie->extension == xfi->XInputOpcode)) + if ((cookie->type == GenericEvent) && (cookie->extension == xfc->XInputOpcode)) { switch (cookie->evtype) { case XI_TouchBegin: if (xf_input_is_duplicate(cookie) == FALSE) - xf_input_touch_begin(xfi, cookie->data); + xf_input_touch_begin(xfc, cookie->data); xf_input_save_last_event(cookie); break; case XI_TouchUpdate: if (xf_input_is_duplicate(cookie) == FALSE) - xf_input_touch_update(xfi, cookie->data); + xf_input_touch_update(xfc, cookie->data); xf_input_save_last_event(cookie); break; case XI_TouchEnd: if (xf_input_is_duplicate(cookie) == FALSE) - xf_input_touch_end(xfi, cookie->data); + xf_input_touch_end(xfc, cookie->data); xf_input_save_last_event(cookie); break; @@ -571,7 +598,7 @@ int xf_input_handle_event_local(xfInfo* xfi, XEvent* event) } } - XFreeEventData(xfi->display,cookie); + XFreeEventData(xfc->display,cookie); return 0; } @@ -588,12 +615,12 @@ char* xf_input_touch_state_string(DWORD flags) return "TouchUnknown"; } -int xf_input_touch_remote(xfInfo* xfi, XIDeviceEvent* event, DWORD flags) +int xf_input_touch_remote(xfContext* xfc, XIDeviceEvent* event, int evtype) { int x, y; int touchId; - RDPINPUT_CONTACT_DATA contact; - RdpeiClientContext* rdpei = xfi->rdpei; + int contactId; + RdpeiClientContext* rdpei = xfc->rdpei; if (!rdpei) return 0; @@ -601,77 +628,97 @@ int xf_input_touch_remote(xfInfo* xfi, XIDeviceEvent* event, DWORD flags) touchId = event->detail; x = (int) event->event_x; y = (int) event->event_y; - ZeroMemory(&contact, sizeof(RDPINPUT_CONTACT_DATA)); - contact.fieldsPresent = 0; - contact.x = x; - contact.y = y; - contact.contactFlags = flags; - - if (flags & CONTACT_FLAG_DOWN) + if (evtype == XI_TouchBegin) { - contact.contactId = rdpei->ContactBegin(rdpei, touchId); - contact.contactFlags |= CONTACT_FLAG_INRANGE; - contact.contactFlags |= CONTACT_FLAG_INCONTACT; + //printf("TouchBegin: %d\n", touchId); + contactId = rdpei->TouchBegin(rdpei, touchId, x, y); } - else if (flags & CONTACT_FLAG_UPDATE) + else if (evtype == XI_TouchUpdate) { - contact.contactId = rdpei->ContactUpdate(rdpei, touchId); - contact.contactFlags |= CONTACT_FLAG_INRANGE; - contact.contactFlags |= CONTACT_FLAG_INCONTACT; + //printf("TouchUpdate: %d\n", touchId); + contactId = rdpei->TouchUpdate(rdpei, touchId, x, y); } - else if (flags & CONTACT_FLAG_UP) + else if (evtype == XI_TouchEnd) { - contact.contactId = rdpei->ContactEnd(rdpei, touchId); + //printf("TouchEnd: %d\n", touchId); + contactId = rdpei->TouchEnd(rdpei, touchId, x, y); } - rdpei->AddContact(rdpei, &contact); - return 0; } -int xf_input_handle_event_remote(xfInfo* xfi, XEvent* event) +int xf_input_event(xfContext* xfc, XIDeviceEvent* event, int evtype) +{ + return TRUE; + + switch (evtype) + { + case XI_ButtonPress: + printf("ButtonPress\n"); + xf_generic_ButtonPress(xfc, (int) event->event_x, (int) event->event_y, + event->detail, event->event, xfc->remote_app); + break; + + case XI_ButtonRelease: + printf("ButtonRelease\n"); + xf_generic_ButtonRelease(xfc, (int) event->event_x, (int) event->event_y, + event->detail, event->event, xfc->remote_app); + break; + + case XI_Motion: + printf("Motion\n"); + xf_generic_MotionNotify(xfc, (int) event->event_x, (int) event->event_y, + event->detail, event->event, xfc->remote_app); + break; + } + + return 0; +} + +int xf_input_handle_event_remote(xfContext* xfc, XEvent* event) { XGenericEventCookie* cookie = &event->xcookie; - XGetEventData(xfi->display, cookie); + XGetEventData(xfc->display, cookie); - if ((cookie->type == GenericEvent) && (cookie->extension == xfi->XInputOpcode)) + if ((cookie->type == GenericEvent) && (cookie->extension == xfc->XInputOpcode)) { switch (cookie->evtype) { case XI_TouchBegin: - xf_input_touch_remote(xfi, cookie->data, CONTACT_FLAG_DOWN); + xf_input_touch_remote(xfc, cookie->data, XI_TouchBegin); break; case XI_TouchUpdate: - xf_input_touch_remote(xfi, cookie->data, CONTACT_FLAG_UPDATE); + xf_input_touch_remote(xfc, cookie->data, XI_TouchUpdate); break; case XI_TouchEnd: - xf_input_touch_remote(xfi, cookie->data, CONTACT_FLAG_UP); + xf_input_touch_remote(xfc, cookie->data, XI_TouchEnd); break; default: + xf_input_event(xfc, cookie->data, cookie->evtype); break; } } - XFreeEventData(xfi->display,cookie); + XFreeEventData(xfc->display,cookie); return 0; } #else -int xf_input_init(xfInfo* xfi, Window window) +int xf_input_init(xfContext* xfc, Window window) { return 0; } #endif -void xf_process_rdpei_event(xfInfo* xfi, wMessage* event) +void xf_process_rdpei_event(xfContext* xfc, wMessage* event) { switch (GetMessageType(event->id)) { @@ -686,16 +733,17 @@ void xf_process_rdpei_event(xfInfo* xfi, wMessage* event) } } -int xf_input_handle_event(xfInfo* xfi, XEvent* event) +int xf_input_handle_event(xfContext* xfc, XEvent* event) { #ifdef WITH_XI - if (xfi->settings->MultiTouchInput) + if (xfc->settings->MultiTouchInput) { - return xf_input_handle_event_remote(xfi, event); + return xf_input_handle_event_remote(xfc, event); } - if (xfi->settings->MultiTouchGestures) - return xf_input_handle_event_local(xfi, event); + if (xfc->settings->MultiTouchGestures) + return xf_input_handle_event_local(xfc, event); + #endif return 0; diff --git a/client/X11/xf_input.h b/client/X11/xf_input.h index 9803193bd..367c7da23 100644 --- a/client/X11/xf_input.h +++ b/client/X11/xf_input.h @@ -20,16 +20,16 @@ #ifndef __XF_INPUT_H #define __XF_INPUT_H -#include "xf_interface.h" +#include "xf_client.h" #include "xfreerdp.h" #ifdef WITH_XI #include #endif -int xf_input_init(xfInfo* xfi, Window window); +int xf_input_init(xfContext* xfc, Window window); -int xf_input_handle_event(xfInfo* xfi, XEvent* event); -void xf_process_rdpei_event(xfInfo* xfi, wMessage* event); +int xf_input_handle_event(xfContext* xfc, XEvent* event); +void xf_process_rdpei_event(xfContext* xfc, wMessage* event); #endif diff --git a/client/X11/xf_keyboard.c b/client/X11/xf_keyboard.c index a57451fb3..b89e1cae8 100644 --- a/client/X11/xf_keyboard.c +++ b/client/X11/xf_keyboard.c @@ -35,64 +35,64 @@ #include "xf_keyboard.h" -void xf_kbd_init(xfInfo* xfi) +void xf_kbd_init(xfContext* xfc) { - xf_kbd_clear(xfi); - xfi->keyboard_layout_id = xfi->instance->settings->KeyboardLayout; - xfi->keyboard_layout_id = freerdp_keyboard_init(xfi->keyboard_layout_id); - xfi->instance->settings->KeyboardLayout = xfi->keyboard_layout_id; - xfi->modifier_map = XGetModifierMapping(xfi->display); + xf_kbd_clear(xfc); + xfc->keyboard_layout_id = xfc->instance->settings->KeyboardLayout; + xfc->keyboard_layout_id = freerdp_keyboard_init(xfc->keyboard_layout_id); + xfc->instance->settings->KeyboardLayout = xfc->keyboard_layout_id; + xfc->modifier_map = XGetModifierMapping(xfc->display); } -void xf_kbd_clear(xfInfo* xfi) +void xf_kbd_clear(xfContext* xfc) { - ZeroMemory(xfi->pressed_keys, 256 * sizeof(BOOL)); + ZeroMemory(xfc->pressed_keys, 256 * sizeof(BOOL)); } -void xf_kbd_set_keypress(xfInfo* xfi, BYTE keycode, KeySym keysym) +void xf_kbd_set_keypress(xfContext* xfc, BYTE keycode, KeySym keysym) { if (keycode >= 8) - xfi->pressed_keys[keycode] = keysym; + xfc->pressed_keys[keycode] = keysym; else return; } -void xf_kbd_unset_keypress(xfInfo* xfi, BYTE keycode) +void xf_kbd_unset_keypress(xfContext* xfc, BYTE keycode) { if (keycode >= 8) - xfi->pressed_keys[keycode] = NoSymbol; + xfc->pressed_keys[keycode] = NoSymbol; else return; } -void xf_kbd_release_all_keypress(xfInfo* xfi) +void xf_kbd_release_all_keypress(xfContext* xfc) { int keycode; DWORD rdp_scancode; - for (keycode = 0; keycode < ARRAYSIZE(xfi->pressed_keys); keycode++) + for (keycode = 0; keycode < ARRAYSIZE(xfc->pressed_keys); keycode++) { - if (xfi->pressed_keys[keycode] != NoSymbol) + if (xfc->pressed_keys[keycode] != NoSymbol) { rdp_scancode = freerdp_keyboard_get_rdp_scancode_from_x11_keycode(keycode); - freerdp_input_send_keyboard_event_ex(xfi->instance->input, FALSE, rdp_scancode); - xfi->pressed_keys[keycode] = NoSymbol; + freerdp_input_send_keyboard_event_ex(xfc->instance->input, FALSE, rdp_scancode); + xfc->pressed_keys[keycode] = NoSymbol; } } } -BOOL xf_kbd_key_pressed(xfInfo* xfi, KeySym keysym) +BOOL xf_kbd_key_pressed(xfContext* xfc, KeySym keysym) { - KeyCode keycode = XKeysymToKeycode(xfi->display, keysym); - return (xfi->pressed_keys[keycode] == keysym); + KeyCode keycode = XKeysymToKeycode(xfc->display, keysym); + return (xfc->pressed_keys[keycode] == keysym); } -void xf_kbd_send_key(xfInfo* xfi, BOOL down, BYTE keycode) +void xf_kbd_send_key(xfContext* xfc, BOOL down, BYTE keycode) { DWORD rdp_scancode; rdpInput* input; - input = xfi->instance->input; + input = xfc->instance->input; rdp_scancode = freerdp_keyboard_get_rdp_scancode_from_x11_keycode(keycode); if (rdp_scancode == RDP_SCANCODE_UNKNOWN) @@ -100,7 +100,7 @@ void xf_kbd_send_key(xfInfo* xfi, BOOL down, BYTE keycode) fprintf(stderr, "Unknown key with X keycode 0x%02x\n", keycode); } else if (rdp_scancode == RDP_SCANCODE_PAUSE && - !xf_kbd_key_pressed(xfi, XK_Control_L) && !xf_kbd_key_pressed(xfi, XK_Control_R)) + !xf_kbd_key_pressed(xfc, XK_Control_L) && !xf_kbd_key_pressed(xfc, XK_Control_R)) { /* Pause without Ctrl has to be sent as Ctrl + NumLock. */ if (down) @@ -118,47 +118,47 @@ void xf_kbd_send_key(xfInfo* xfi, BOOL down, BYTE keycode) if ((rdp_scancode == RDP_SCANCODE_CAPSLOCK) && (down == FALSE)) { UINT32 syncFlags; - syncFlags = xf_kbd_get_toggle_keys_state(xfi); + syncFlags = xf_kbd_get_toggle_keys_state(xfc); input->SynchronizeEvent(input, syncFlags); } } } -int xf_kbd_read_keyboard_state(xfInfo* xfi) +int xf_kbd_read_keyboard_state(xfContext* xfc) { int dummy; Window wdummy; UINT32 state = 0; - if (!xfi->remote_app) + if (!xfc->remote_app) { - XQueryPointer(xfi->display, xfi->window->handle, + XQueryPointer(xfc->display, xfc->window->handle, &wdummy, &wdummy, &dummy, &dummy, &dummy, &dummy, &state); } else { - XQueryPointer(xfi->display, DefaultRootWindow(xfi->display), + XQueryPointer(xfc->display, DefaultRootWindow(xfc->display), &wdummy, &wdummy, &dummy, &dummy, &dummy, &dummy, &state); } return state; } -BOOL xf_kbd_get_key_state(xfInfo* xfi, int state, int keysym) +BOOL xf_kbd_get_key_state(xfContext* xfc, int state, int keysym) { int offset; int modifierpos, key, keysymMask = 0; - KeyCode keycode = XKeysymToKeycode(xfi->display, keysym); + KeyCode keycode = XKeysymToKeycode(xfc->display, keysym); if (keycode == NoSymbol) return FALSE; for (modifierpos = 0; modifierpos < 8; modifierpos++) { - offset = xfi->modifier_map->max_keypermod * modifierpos; + offset = xfc->modifier_map->max_keypermod * modifierpos; - for (key = 0; key < xfi->modifier_map->max_keypermod; key++) + for (key = 0; key < xfc->modifier_map->max_keypermod; key++) { - if (xfi->modifier_map->modifiermap[offset + key] == keycode) + if (xfc->modifier_map->modifiermap[offset + key] == keycode) { keysymMask |= 1 << modifierpos; } @@ -168,26 +168,26 @@ BOOL xf_kbd_get_key_state(xfInfo* xfi, int state, int keysym) return (state & keysymMask) ? TRUE : FALSE; } -int xf_kbd_get_toggle_keys_state(xfInfo* xfi) +int xf_kbd_get_toggle_keys_state(xfContext* xfc) { int state; int toggle_keys_state = 0; - state = xf_kbd_read_keyboard_state(xfi); + state = xf_kbd_read_keyboard_state(xfc); - if (xf_kbd_get_key_state(xfi, state, XK_Scroll_Lock)) + if (xf_kbd_get_key_state(xfc, state, XK_Scroll_Lock)) toggle_keys_state |= KBD_SYNC_SCROLL_LOCK; - if (xf_kbd_get_key_state(xfi, state, XK_Num_Lock)) + if (xf_kbd_get_key_state(xfc, state, XK_Num_Lock)) toggle_keys_state |= KBD_SYNC_NUM_LOCK; - if (xf_kbd_get_key_state(xfi, state, XK_Caps_Lock)) + if (xf_kbd_get_key_state(xfc, state, XK_Caps_Lock)) toggle_keys_state |= KBD_SYNC_CAPS_LOCK; - if (xf_kbd_get_key_state(xfi, state, XK_Kana_Lock)) + if (xf_kbd_get_key_state(xfc, state, XK_Kana_Lock)) toggle_keys_state |= KBD_SYNC_KANA_LOCK; return toggle_keys_state; } -void xf_kbd_focus_in(xfInfo* xfi) +void xf_kbd_focus_in(xfContext* xfc) { rdpInput* input; UINT32 syncFlags; @@ -195,27 +195,24 @@ void xf_kbd_focus_in(xfInfo* xfi) Window wdummy; UINT32 state = 0; - if (xfi->display && xfi->window) + if (xfc->display && xfc->window) { - input = xfi->instance->input; - syncFlags = xf_kbd_get_toggle_keys_state(xfi); - XQueryPointer(xfi->display, xfi->window->handle, &wdummy, &wdummy, &mouseX, &mouseY, &dummy, &dummy, &state); + input = xfc->instance->input; + syncFlags = xf_kbd_get_toggle_keys_state(xfc); + XQueryPointer(xfc->display, xfc->window->handle, &wdummy, &wdummy, &mouseX, &mouseY, &dummy, &dummy, &state); input->FocusInEvent(input, syncFlags, mouseX, mouseY); } } -BOOL xf_kbd_handle_special_keys(xfInfo* xfi, KeySym keysym) +BOOL xf_kbd_handle_special_keys(xfContext* xfc, KeySym keysym) { if (keysym == XK_Return) { - if ((xf_kbd_key_pressed(xfi, XK_Alt_L) - || xf_kbd_key_pressed(xfi, XK_Alt_R)) - && (xf_kbd_key_pressed(xfi, XK_Control_L) - || xf_kbd_key_pressed(xfi, - XK_Control_R))) + if ((xf_kbd_key_pressed(xfc, XK_Alt_L) || xf_kbd_key_pressed(xfc, XK_Alt_R)) + && (xf_kbd_key_pressed(xfc, XK_Control_L) || xf_kbd_key_pressed(xfc, XK_Control_R))) { /* Ctrl-Alt-Enter: toggle full screen */ - xf_toggle_fullscreen(xfi); + xf_toggle_fullscreen(xfc); return TRUE; } } diff --git a/client/X11/xf_keyboard.h b/client/X11/xf_keyboard.h index 493a67cb5..0b84efa43 100644 --- a/client/X11/xf_keyboard.h +++ b/client/X11/xf_keyboard.h @@ -22,20 +22,20 @@ #include -#include "xf_interface.h" +#include "xf_client.h" #include "xfreerdp.h" -void xf_kbd_init(xfInfo* xfi); -void xf_kbd_clear(xfInfo* xfi); -void xf_kbd_set_keypress(xfInfo* xfi, BYTE keycode, KeySym keysym); -void xf_kbd_unset_keypress(xfInfo* xfi, BYTE keycode); -void xf_kbd_release_all_keypress(xfInfo* xfi); -BOOL xf_kbd_key_pressed(xfInfo* xfi, KeySym keysym); -void xf_kbd_send_key(xfInfo* xfi, BOOL down, BYTE keycode); -int xf_kbd_read_keyboard_state(xfInfo* xfi); -BOOL xf_kbd_get_key_state(xfInfo* xfi, int state, int keysym); -int xf_kbd_get_toggle_keys_state(xfInfo* xfi); -void xf_kbd_focus_in(xfInfo* xfi); -BOOL xf_kbd_handle_special_keys(xfInfo* xfi, KeySym keysym); +void xf_kbd_init(xfContext* xfc); +void xf_kbd_clear(xfContext* xfc); +void xf_kbd_set_keypress(xfContext* xfc, BYTE keycode, KeySym keysym); +void xf_kbd_unset_keypress(xfContext* xfc, BYTE keycode); +void xf_kbd_release_all_keypress(xfContext* xfc); +BOOL xf_kbd_key_pressed(xfContext* xfc, KeySym keysym); +void xf_kbd_send_key(xfContext* xfc, BOOL down, BYTE keycode); +int xf_kbd_read_keyboard_state(xfContext* xfc); +BOOL xf_kbd_get_key_state(xfContext* xfc, int state, int keysym); +int xf_kbd_get_toggle_keys_state(xfContext* xfc); +void xf_kbd_focus_in(xfContext* xfc); +BOOL xf_kbd_handle_special_keys(xfContext* xfc, KeySym keysym); #endif /* __XF_KEYBOARD_H */ diff --git a/client/X11/xf_monitor.c b/client/X11/xf_monitor.c index 0667e354c..cd9301681 100644 --- a/client/X11/xf_monitor.c +++ b/client/X11/xf_monitor.c @@ -37,7 +37,7 @@ /* See MSDN Section on Multiple Display Monitors: http://msdn.microsoft.com/en-us/library/dd145071 */ -int xf_list_monitors(xfInfo* xfi) +int xf_list_monitors(xfContext* xfc) { #ifdef WITH_XINERAMA Display* display; @@ -81,7 +81,7 @@ int xf_list_monitors(xfInfo* xfi) return 0; } -BOOL xf_detect_monitors(xfInfo* xfi, rdpSettings* settings) +BOOL xf_detect_monitors(xfContext* xfc, rdpSettings* settings) { int i, j; int nmonitors; @@ -95,14 +95,14 @@ BOOL xf_detect_monitors(xfInfo* xfi, rdpSettings* settings) XineramaScreenInfo* screen_info = NULL; #endif - vscreen = &xfi->vscreen; + vscreen = &xfc->vscreen; #ifdef WITH_XINERAMA - if (XineramaQueryExtension(xfi->display, &ignored, &ignored2)) + if (XineramaQueryExtension(xfc->display, &ignored, &ignored2)) { - if (XineramaIsActive(xfi->display)) + if (XineramaIsActive(xfc->display)) { - screen_info = XineramaQueryScreens(xfi->display, &vscreen->nmonitors); + screen_info = XineramaQueryScreens(xfc->display, &vscreen->nmonitors); if (vscreen->nmonitors > 16) vscreen->nmonitors = 0; @@ -129,39 +129,39 @@ BOOL xf_detect_monitors(xfInfo* xfi, rdpSettings* settings) } #endif - if (!xf_GetWorkArea(xfi)) + if (!xf_GetWorkArea(xfc)) { - xfi->workArea.x = 0; - xfi->workArea.y = 0; - xfi->workArea.width = WidthOfScreen(xfi->screen); - xfi->workArea.height = HeightOfScreen(xfi->screen); + xfc->workArea.x = 0; + xfc->workArea.y = 0; + xfc->workArea.width = WidthOfScreen(xfc->screen); + xfc->workArea.height = HeightOfScreen(xfc->screen); } if (settings->Fullscreen) { - settings->DesktopWidth = WidthOfScreen(xfi->screen); - settings->DesktopHeight = HeightOfScreen(xfi->screen); + settings->DesktopWidth = WidthOfScreen(xfc->screen); + settings->DesktopHeight = HeightOfScreen(xfc->screen); maxWidth = settings->DesktopWidth; maxHeight = settings->DesktopHeight; } else if (settings->Workarea) { - settings->DesktopWidth = xfi->workArea.width; - settings->DesktopHeight = xfi->workArea.height; + settings->DesktopWidth = xfc->workArea.width; + settings->DesktopHeight = xfc->workArea.height; maxWidth = settings->DesktopWidth; maxHeight = settings->DesktopHeight; } else if (settings->PercentScreen) { - settings->DesktopWidth = (xfi->workArea.width * settings->PercentScreen) / 100; - settings->DesktopHeight = (xfi->workArea.height * settings->PercentScreen) / 100; + settings->DesktopWidth = (xfc->workArea.width * settings->PercentScreen) / 100; + settings->DesktopHeight = (xfc->workArea.height * settings->PercentScreen) / 100; maxWidth = settings->DesktopWidth; maxHeight = settings->DesktopHeight; } else { - maxWidth = WidthOfScreen(xfi->screen); - maxHeight = HeightOfScreen(xfi->screen); + maxWidth = WidthOfScreen(xfc->screen); + maxHeight = HeightOfScreen(xfc->screen); } if (!settings->Fullscreen && !settings->Workarea && !settings->UseMultimon) @@ -240,8 +240,8 @@ BOOL xf_detect_monitors(xfInfo* xfi, rdpSettings* settings) if (settings->Workarea) { - vscreen->area.top = xfi->workArea.y; - vscreen->area.bottom = (vHeight - (vHeight - (xfi->workArea.height + xfi->workArea.y))) - 1; + vscreen->area.top = xfc->workArea.y; + vscreen->area.bottom = (vHeight - (vHeight - (xfc->workArea.height + xfc->workArea.y))) - 1; } if (nmonitors && !primaryMonitor) diff --git a/client/X11/xf_monitor.h b/client/X11/xf_monitor.h index 4f3b1de8e..ed4bd21a8 100644 --- a/client/X11/xf_monitor.h +++ b/client/X11/xf_monitor.h @@ -40,10 +40,10 @@ struct _VIRTUAL_SCREEN }; typedef struct _VIRTUAL_SCREEN VIRTUAL_SCREEN; -#include "xf_interface.h" +#include "xf_client.h" #include "xfreerdp.h" -int xf_list_monitors(xfInfo* xfi); -BOOL xf_detect_monitors(xfInfo* xfi, rdpSettings* settings); +int xf_list_monitors(xfContext* xfc); +BOOL xf_detect_monitors(xfContext* xfc, rdpSettings* settings); #endif /* __XF_MONITOR_H */ diff --git a/client/X11/xf_rail.c b/client/X11/xf_rail.c index 66ec20dae..459d0f911 100644 --- a/client/X11/xf_rail.c +++ b/client/X11/xf_rail.c @@ -38,27 +38,27 @@ #define DEBUG_X11_LMS(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__) #endif -void xf_rail_enable_remoteapp_mode(xfInfo* xfi) +void xf_rail_enable_remoteapp_mode(xfContext* xfc) { - if (!xfi->remote_app) + if (!xfc->remote_app) { - xfi->remote_app = TRUE; - xfi->drawable = DefaultRootWindow(xfi->display); - xf_DestroyWindow(xfi, xfi->window); - xfi->window = NULL; + xfc->remote_app = TRUE; + xfc->drawable = DefaultRootWindow(xfc->display); + xf_DestroyWindow(xfc, xfc->window); + xfc->window = NULL; } } -void xf_rail_disable_remoteapp_mode(xfInfo* xfi) +void xf_rail_disable_remoteapp_mode(xfContext* xfc) { - if (xfi->remote_app) + if (xfc->remote_app) { - xfi->remote_app = FALSE; - xf_create_window(xfi); + xfc->remote_app = FALSE; + xf_create_window(xfc); } } -void xf_rail_paint(xfInfo* xfi, rdpRail* rail, INT32 uleft, INT32 utop, UINT32 uright, UINT32 ubottom) +void xf_rail_paint(xfContext* xfc, rdpRail* rail, INT32 uleft, INT32 utop, UINT32 uright, UINT32 ubottom) { xfWindow* xfw; rdpWindow* window; @@ -100,36 +100,35 @@ void xf_rail_paint(xfInfo* xfi, rdpRail* rail, INT32 uleft, INT32 utop, UINT32 u if (intersect) { - xf_UpdateWindowArea(xfi, xfw, ileft - wleft, itop - wtop, iwidth, iheight); + xf_UpdateWindowArea(xfc, xfw, ileft - wleft, itop - wtop, iwidth, iheight); } } } void xf_rail_DesktopNonMonitored(rdpRail *rail, rdpWindow* window) { - xfInfo* xfi; + xfContext* xfc; - xfi = (xfInfo*) rail->extra; - xf_rail_disable_remoteapp_mode(xfi); + xfc = (xfContext*) rail->extra; + xf_rail_disable_remoteapp_mode(xfc); } static void xf_rail_CreateWindow(rdpRail* rail, rdpWindow* window) { - xfInfo* xfi; + xfContext* xfc; xfWindow* xfw; - xfi = (xfInfo*) rail->extra; + xfc = (xfContext*) rail->extra; - xf_rail_enable_remoteapp_mode(xfi); + xf_rail_enable_remoteapp_mode(xfc); - xfw = xf_CreateWindow((xfInfo*) rail->extra, window, + xfw = xf_CreateWindow(xfc, window, window->windowOffsetX, window->windowOffsetY, - window->windowWidth, window->windowHeight, - window->windowId); + window->windowWidth, window->windowHeight, window->windowId); - xf_SetWindowStyle(xfi, xfw, window->style, window->extendedStyle); + xf_SetWindowStyle(xfc, xfw, window->style, window->extendedStyle); - xf_SetWindowText(xfi, xfw, window->title); + xf_SetWindowText(xfc, xfw, window->title); window->extra = (void*) xfw; window->extraId = (void*) xfw->handle; @@ -137,10 +136,10 @@ static void xf_rail_CreateWindow(rdpRail* rail, rdpWindow* window) static void xf_rail_MoveWindow(rdpRail* rail, rdpWindow* window) { - xfInfo* xfi; + xfContext* xfc; xfWindow* xfw; - xfi = (xfInfo*) rail->extra; + xfc = (xfContext*) rail->extra; xfw = (xfWindow*) window->extra; /* @@ -161,83 +160,87 @@ static void xf_rail_MoveWindow(rdpRail* rail, rdpWindow* window) * Just ensure entire window area is updated to handle cases where we * have drawn locally before getting new bitmap from the server */ - xf_UpdateWindowArea(xfi, xfw, 0, 0, window->windowWidth, window->windowHeight); + xf_UpdateWindowArea(xfc, xfw, 0, 0, window->windowWidth, window->windowHeight); return; } - xf_MoveWindow(xfi, xfw, + xf_MoveWindow(xfc, xfw, window->visibleOffsetX, window->visibleOffsetY, window->windowWidth, window->windowHeight); } static void xf_rail_ShowWindow(rdpRail* rail, rdpWindow* window, BYTE state) { - xfInfo* xfi; + xfContext* xfc; xfWindow* xfw; - xfi = (xfInfo*) rail->extra; + xfc = (xfContext*) rail->extra; xfw = (xfWindow*) window->extra; - xf_ShowWindow(xfi, xfw, state); + xf_ShowWindow(xfc, xfw, state); } static void xf_rail_SetWindowText(rdpRail* rail, rdpWindow* window) { - xfInfo* xfi; + xfContext* xfc; xfWindow* xfw; - xfi = (xfInfo*) rail->extra; + xfc = (xfContext*) rail->extra; xfw = (xfWindow*) window->extra; - xf_SetWindowText(xfi, xfw, window->title); + xf_SetWindowText(xfc, xfw, window->title); } static void xf_rail_SetWindowIcon(rdpRail* rail, rdpWindow* window, rdpIcon* icon) { - xfInfo* xfi; + xfContext* xfc; xfWindow* xfw; - xfi = (xfInfo*) rail->extra; + xfc = (xfContext*) rail->extra; xfw = (xfWindow*) window->extra; icon->extra = freerdp_icon_convert(icon->entry->bitsColor, NULL, icon->entry->bitsMask, icon->entry->width, icon->entry->height, icon->entry->bpp, rail->clrconv); - xf_SetWindowIcon(xfi, xfw, icon); + xf_SetWindowIcon(xfc, xfw, icon); } static void xf_rail_SetWindowRects(rdpRail* rail, rdpWindow* window) { - xfInfo* xfi; + xfContext* xfc; xfWindow* xfw; - xfi = (xfInfo*) rail->extra; + xfc = (xfContext*) rail->extra; xfw = (xfWindow*) window->extra; - xf_SetWindowRects(xfi, xfw, window->windowRects, window->numWindowRects); + xf_SetWindowRects(xfc, xfw, window->windowRects, window->numWindowRects); } static void xf_rail_SetWindowVisibilityRects(rdpRail* rail, rdpWindow* window) { - xfInfo* xfi; xfWindow* xfw; + xfContext* xfc; - xfi = (xfInfo*) rail->extra; + xfc = (xfContext*) rail->extra; xfw = (xfWindow*) window->extra; - xf_SetWindowVisibilityRects(xfi, xfw, window->windowRects, window->numWindowRects); + xf_SetWindowVisibilityRects(xfc, xfw, window->windowRects, window->numWindowRects); } static void xf_rail_DestroyWindow(rdpRail* rail, rdpWindow* window) { xfWindow* xfw; + xfContext* xfc; + + xfc = (xfContext*) rail->extra; xfw = (xfWindow*) window->extra; - xf_DestroyWindow((xfInfo*) rail->extra, xfw); + + xf_DestroyWindow(xfc, xfw); } -void xf_rail_register_callbacks(xfInfo* xfi, rdpRail* rail) +void xf_rail_register_callbacks(xfContext* xfc, rdpRail* rail) { - rail->extra = (void*) xfi; + rail->extra = (void*) xfc; rail->rail_CreateWindow = xf_rail_CreateWindow; rail->rail_MoveWindow = xf_rail_MoveWindow; rail->rail_ShowWindow = xf_rail_ShowWindow; @@ -270,15 +273,15 @@ static void xf_send_rail_client_event(rdpChannels* channels, UINT16 event_type, } } -void xf_rail_send_activate(xfInfo* xfi, Window xwindow, BOOL enabled) +void xf_rail_send_activate(xfContext* xfc, Window xwindow, BOOL enabled) { rdpRail* rail; rdpChannels* channels; rdpWindow* rail_window; RAIL_ACTIVATE_ORDER activate; - rail = xfi->_context->rail; - channels = xfi->_context->channels; + rail = ((rdpContext*) xfc)->rail; + channels = ((rdpContext*) xfc)->channels; rail_window = window_list_get_by_extra_id(rail->list, (void*) xwindow); @@ -291,12 +294,12 @@ void xf_rail_send_activate(xfInfo* xfi, Window xwindow, BOOL enabled) xf_send_rail_client_event(channels, RailChannel_ClientActivate, &activate); } -void xf_rail_send_client_system_command(xfInfo* xfi, UINT32 windowId, UINT16 command) +void xf_rail_send_client_system_command(xfContext* xfc, UINT32 windowId, UINT16 command) { rdpChannels* channels; RAIL_SYSCOMMAND_ORDER syscommand; - channels = xfi->_context->channels; + channels = ((rdpContext*) xfc)->channels; syscommand.windowId = windowId; syscommand.command = command; @@ -310,14 +313,14 @@ void xf_rail_send_client_system_command(xfInfo* xfi, UINT32 windowId, UINT16 com * send an update to the RDP server informing it of the new window position * and size. */ -void xf_rail_adjust_position(xfInfo* xfi, rdpWindow* window) +void xf_rail_adjust_position(xfContext* xfc, rdpWindow* window) { xfWindow* xfw; rdpChannels* channels; RAIL_WINDOW_MOVE_ORDER window_move; xfw = (xfWindow*) window->extra; - channels = xfi->_context->channels; + channels = ((rdpContext*) xfc)->channels; if (! xfw->is_mapped || xfw->local_move.state != LMS_NOT_ACTIVE) return; @@ -371,12 +374,12 @@ void xf_rail_adjust_position(xfInfo* xfi, rdpWindow* window) } } -void xf_rail_end_local_move(xfInfo* xfi, rdpWindow *window) +void xf_rail_end_local_move(xfContext* xfc, rdpWindow *window) { xfWindow* xfw; rdpChannels* channels; RAIL_WINDOW_MOVE_ORDER window_move; - rdpInput* input = xfi->instance->input; + rdpInput* input = xfc->instance->input; int x,y; Window root_window; Window child_window; @@ -385,7 +388,7 @@ void xf_rail_end_local_move(xfInfo* xfi, rdpWindow *window) int child_y; xfw = (xfWindow*) window->extra; - channels = xfi->_context->channels; + channels = ((rdpContext*) xfc)->channels; DEBUG_X11_LMS("window=0x%X rc={l=%d t=%d r=%d b=%d} w=%d h=%d", (UINT32) xfw->handle, @@ -427,7 +430,7 @@ void xf_rail_end_local_move(xfInfo* xfi, rdpWindow *window) * Simulate button up at new position to end the local move (per RDP spec) */ - XQueryPointer(xfi->display, xfw->handle, + XQueryPointer(xfc->display, xfw->handle, &root_window, &child_window, &x, &y, &child_x, &child_y, &mask); input->MouseEvent(input, PTR_FLAGS_BUTTON1, x, y); @@ -454,16 +457,16 @@ void xf_rail_end_local_move(xfInfo* xfi, rdpWindow *window) xfw->local_move.state = LMS_TERMINATING; } -void xf_process_rail_get_sysparams_event(xfInfo* xfi, rdpChannels* channels, wMessage* event) +void xf_process_rail_get_sysparams_event(xfContext* xfc, rdpChannels* channels, wMessage* event) { RAIL_SYSPARAM_ORDER* sysparam; sysparam = (RAIL_SYSPARAM_ORDER*) event->wParam; - sysparam->workArea.left = xfi->workArea.x; - sysparam->workArea.top = xfi->workArea.y; - sysparam->workArea.right = xfi->workArea.x + xfi->workArea.width; - sysparam->workArea.bottom = xfi->workArea.y + xfi->workArea.height; + sysparam->workArea.left = xfc->workArea.x; + sysparam->workArea.top = xfc->workArea.y; + sysparam->workArea.right = xfc->workArea.x + xfc->workArea.width; + sysparam->workArea.bottom = xfc->workArea.y + xfc->workArea.height; sysparam->taskbarPos.left = 0; sysparam->taskbarPos.top = 0; @@ -486,7 +489,7 @@ const char* error_code_names[] = "RAIL_EXEC_E_SESSION_LOCKED" }; -void xf_process_rail_exec_result_event(xfInfo* xfi, rdpChannels* channels, wMessage* event) +void xf_process_rail_exec_result_event(xfContext* xfc, rdpChannels* channels, wMessage* event) { RAIL_EXEC_RESULT_ORDER* exec_result; @@ -496,15 +499,15 @@ void xf_process_rail_exec_result_event(xfInfo* xfi, rdpChannels* channels, wMess { fprintf(stderr, "RAIL exec error: execResult=%s NtError=0x%X\n", error_code_names[exec_result->execResult], exec_result->rawResult); - xfi->disconnect = True; + xfc->disconnect = True; } else { - xf_rail_enable_remoteapp_mode(xfi); + xf_rail_enable_remoteapp_mode(xfc); } } -void xf_process_rail_server_sysparam_event(xfInfo* xfi, rdpChannels* channels, wMessage* event) +void xf_process_rail_server_sysparam_event(xfContext* xfc, rdpChannels* channels, wMessage* event) { RAIL_SYSPARAM_ORDER* sysparam = (RAIL_SYSPARAM_ORDER*) event->wParam; @@ -518,13 +521,13 @@ void xf_process_rail_server_sysparam_event(xfInfo* xfi, rdpChannels* channels, w } } -void xf_process_rail_server_minmaxinfo_event(xfInfo* xfi, rdpChannels* channels, wMessage* event) +void xf_process_rail_server_minmaxinfo_event(xfContext* xfc, rdpChannels* channels, wMessage* event) { rdpRail* rail; rdpWindow* rail_window = NULL; RAIL_MINMAXINFO_ORDER* minmax = (RAIL_MINMAXINFO_ORDER*) event->wParam; - rail = ((rdpContext*) xfi->context)->rail; + rail = ((rdpContext*) xfc)->rail; rail_window = window_list_get_by_id(rail->list, minmax->windowId); if (rail_window != NULL) @@ -539,7 +542,7 @@ void xf_process_rail_server_minmaxinfo_event(xfInfo* xfi, rdpChannels* channels, minmax->minTrackWidth, minmax->minTrackHeight, minmax->maxTrackWidth, minmax->maxTrackHeight); - xf_SetWindowMinMaxInfo(xfi, window, minmax->maxWidth, minmax->maxHeight, minmax->maxPosX, minmax->maxPosY, + xf_SetWindowMinMaxInfo(xfc, window, minmax->maxWidth, minmax->maxHeight, minmax->maxPosX, minmax->maxPosY, minmax->minTrackWidth, minmax->minTrackHeight, minmax->maxTrackWidth, minmax->maxTrackHeight); } } @@ -560,7 +563,7 @@ const char* movetype_names[] = "RAIL_WMSZ_KEYSIZE" }; -void xf_process_rail_server_localmovesize_event(xfInfo* xfi, rdpChannels* channels, wMessage* event) +void xf_process_rail_server_localmovesize_event(xfContext* xfc, rdpChannels* channels, wMessage* event) { int x, y; rdpRail* rail; @@ -569,7 +572,7 @@ void xf_process_rail_server_localmovesize_event(xfInfo* xfi, rdpChannels* channe rdpWindow* rail_window = NULL; RAIL_LOCALMOVESIZE_ORDER* movesize = (RAIL_LOCALMOVESIZE_ORDER*) event->wParam; - rail = ((rdpContext*) xfi->context)->rail; + rail = ((rdpContext*) xfc)->rail; rail_window = window_list_get_by_id(rail->list, movesize->windowId); if (rail_window != NULL) @@ -625,8 +628,8 @@ void xf_process_rail_server_localmovesize_event(xfInfo* xfi, rdpChannels* channe break; case RAIL_WMSZ_MOVE: //0x9 direction = _NET_WM_MOVERESIZE_MOVE; - XTranslateCoordinates(xfi->display, xfw->handle, - RootWindowOfScreen(xfi->screen), + XTranslateCoordinates(xfc->display, xfw->handle, + RootWindowOfScreen(xfc->screen), movesize->posX, movesize->posY, &x, &y, &child_window); break; case RAIL_WMSZ_KEYMOVE: //0xA @@ -645,14 +648,14 @@ void xf_process_rail_server_localmovesize_event(xfInfo* xfi, rdpChannels* channe if (movesize->isMoveSizeStart) { - xf_StartLocalMoveSize(xfi, xfw, direction, x, y); + xf_StartLocalMoveSize(xfc, xfw, direction, x, y); } else { - xf_EndLocalMoveSize(xfi, xfw); + xf_EndLocalMoveSize(xfc, xfw); } } } -void xf_process_rail_appid_resp_event(xfInfo* xfi, rdpChannels* channels, wMessage* event) +void xf_process_rail_appid_resp_event(xfContext* xfc, rdpChannels* channels, wMessage* event) { RAIL_GET_APPID_RESP_ORDER* appid_resp = (RAIL_GET_APPID_RESP_ORDER*) event->wParam; @@ -664,7 +667,7 @@ void xf_process_rail_appid_resp_event(xfInfo* xfi, rdpChannels* channels, wMessa winpr_HexDump(appid_resp->applicationId.string, appid_resp->applicationId.length); } -void xf_process_rail_langbarinfo_event(xfInfo* xfi, rdpChannels* channels, wMessage* event) +void xf_process_rail_langbarinfo_event(xfContext* xfc, rdpChannels* channels, wMessage* event) { RAIL_LANGBAR_INFO_ORDER* langbar = (RAIL_LANGBAR_INFO_ORDER*) event->wParam; @@ -673,36 +676,36 @@ void xf_process_rail_langbarinfo_event(xfInfo* xfi, rdpChannels* channels, wMess langbar->languageBarStatus); } -void xf_process_rail_event(xfInfo* xfi, rdpChannels* channels, wMessage* event) +void xf_process_rail_event(xfContext* xfc, rdpChannels* channels, wMessage* event) { switch (GetMessageType(event->id)) { case RailChannel_GetSystemParam: - xf_process_rail_get_sysparams_event(xfi, channels, event); + xf_process_rail_get_sysparams_event(xfc, channels, event); break; case RailChannel_ServerExecuteResult: - xf_process_rail_exec_result_event(xfi, channels, event); + xf_process_rail_exec_result_event(xfc, channels, event); break; case RailChannel_ServerSystemParam: - xf_process_rail_server_sysparam_event(xfi, channels, event); + xf_process_rail_server_sysparam_event(xfc, channels, event); break; case RailChannel_ServerMinMaxInfo: - xf_process_rail_server_minmaxinfo_event(xfi, channels, event); + xf_process_rail_server_minmaxinfo_event(xfc, channels, event); break; case RailChannel_ServerLocalMoveSize: - xf_process_rail_server_localmovesize_event(xfi, channels, event); + xf_process_rail_server_localmovesize_event(xfc, channels, event); break; case RailChannel_ServerGetAppIdResponse: - xf_process_rail_appid_resp_event(xfi, channels, event); + xf_process_rail_appid_resp_event(xfc, channels, event); break; case RailChannel_ServerLanguageBarInfo: - xf_process_rail_langbarinfo_event(xfi, channels, event); + xf_process_rail_langbarinfo_event(xfc, channels, event); break; default: diff --git a/client/X11/xf_rail.h b/client/X11/xf_rail.h index 29e24b8e9..d10bb03e5 100644 --- a/client/X11/xf_rail.h +++ b/client/X11/xf_rail.h @@ -20,17 +20,17 @@ #ifndef __XF_RAIL_H #define __XF_RAIL_H -#include "xf_interface.h" +#include "xf_client.h" #include "xfreerdp.h" -void xf_rail_paint(xfInfo* xfi, rdpRail* rail, INT32 uleft, INT32 utop, UINT32 uright, UINT32 ubottom); -void xf_rail_register_callbacks(xfInfo* xfi, rdpRail* rail); -void xf_rail_send_client_system_command(xfInfo* xfi, UINT32 windowId, UINT16 command); -void xf_rail_send_activate(xfInfo* xfi, Window xwindow, BOOL enabled); -void xf_process_rail_event(xfInfo* xfi, rdpChannels* channels, wMessage* event); -void xf_rail_adjust_position(xfInfo* xfi, rdpWindow* window); -void xf_rail_end_local_move(xfInfo* xfi, rdpWindow* window); -void xf_rail_enable_remoteapp_mode(xfInfo* xfi); -void xf_rail_disable_remoteapp_mode(xfInfo* xfi); +void xf_rail_paint(xfContext* xfc, rdpRail* rail, INT32 uleft, INT32 utop, UINT32 uright, UINT32 ubottom); +void xf_rail_register_callbacks(xfContext* xfc, rdpRail* rail); +void xf_rail_send_client_system_command(xfContext* xfc, UINT32 windowId, UINT16 command); +void xf_rail_send_activate(xfContext* xfc, Window xwindow, BOOL enabled); +void xf_process_rail_event(xfContext* xfc, rdpChannels* channels, wMessage* event); +void xf_rail_adjust_position(xfContext* xfc, rdpWindow* window); +void xf_rail_end_local_move(xfContext* xfc, rdpWindow* window); +void xf_rail_enable_remoteapp_mode(xfContext* xfc); +void xf_rail_disable_remoteapp_mode(xfContext* xfc); #endif /* __XF_RAIL_H */ diff --git a/client/X11/xf_tsmf.c b/client/X11/xf_tsmf.c index 420ff818f..131d2ea2b 100644 --- a/client/X11/xf_tsmf.c +++ b/client/X11/xf_tsmf.c @@ -63,7 +63,7 @@ struct xf_xv_context #define DEBUG_XV(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__) #endif -void xf_tsmf_init(xfInfo* xfi, long xv_port) +void xf_tsmf_init(xfContext* xfc, long xv_port) { int ret; unsigned int i; @@ -81,19 +81,19 @@ void xf_tsmf_init(xfInfo* xfi, long xv_port) xv = (xfXvContext*) malloc(sizeof(xfXvContext)); ZeroMemory(xv, sizeof(xfXvContext)); - xfi->xv_context = xv; + xfc->xv_context = xv; xv->xv_colorkey_atom = None; xv->xv_image_size = 0; xv->xv_port = xv_port; - if (!XShmQueryExtension(xfi->display)) + if (!XShmQueryExtension(xfc->display)) { DEBUG_XV("no shmem available."); return; } - ret = XvQueryExtension(xfi->display, &version, &release, &request_base, &event_base, &error_base); + ret = XvQueryExtension(xfc->display, &version, &release, &request_base, &event_base, &error_base); if (ret != Success) { DEBUG_XV("XvQueryExtension failed %d.", ret); @@ -101,7 +101,7 @@ void xf_tsmf_init(xfInfo* xfi, long xv_port) } DEBUG_XV("version %u release %u", version, release); - ret = XvQueryAdaptors(xfi->display, DefaultRootWindow(xfi->display), + ret = XvQueryAdaptors(xfc->display, DefaultRootWindow(xfc->display), &num_adaptors, &ai); if (ret != Success) { @@ -127,13 +127,13 @@ void xf_tsmf_init(xfInfo* xfi, long xv_port) } DEBUG_XV("selected %ld", xv->xv_port); - attr = XvQueryPortAttributes(xfi->display, xv->xv_port, &ret); + attr = XvQueryPortAttributes(xfc->display, xv->xv_port, &ret); for (i = 0; i < (unsigned int)ret; i++) { if (strcmp(attr[i].name, "XV_COLORKEY") == 0) { - xv->xv_colorkey_atom = XInternAtom(xfi->display, "XV_COLORKEY", FALSE); - XvSetPortAttribute(xfi->display, xv->xv_port, xv->xv_colorkey_atom, attr[i].min_value + 1); + xv->xv_colorkey_atom = XInternAtom(xfc->display, "XV_COLORKEY", FALSE); + XvSetPortAttribute(xfc->display, xv->xv_port, xv->xv_colorkey_atom, attr[i].min_value + 1); break; } } @@ -142,7 +142,7 @@ void xf_tsmf_init(xfInfo* xfi, long xv_port) #ifdef WITH_DEBUG_XV fprintf(stderr, "xf_tsmf_init: pixel format "); #endif - fo = XvListImageFormats(xfi->display, xv->xv_port, &ret); + fo = XvListImageFormats(xfc->display, xv->xv_port, &ret); if (ret > 0) { xv->xv_pixfmts = (UINT32*) malloc((ret + 1) * sizeof(UINT32)); @@ -164,9 +164,9 @@ void xf_tsmf_init(xfInfo* xfi, long xv_port) #endif } -void xf_tsmf_uninit(xfInfo* xfi) +void xf_tsmf_uninit(xfContext* xfc) { - xfXvContext* xv = (xfXvContext*) xfi->xv_context; + xfXvContext* xv = (xfXvContext*) xfc->xv_context; if (xv) { @@ -181,7 +181,7 @@ void xf_tsmf_uninit(xfInfo* xfi) xv->xv_pixfmts = NULL; } free(xv); - xfi->xv_context = NULL; + xfc->xv_context = NULL; } } @@ -202,7 +202,7 @@ xf_tsmf_is_format_supported(xfXvContext* xv, UINT32 pixfmt) return FALSE; } -static void xf_process_tsmf_video_frame_event(xfInfo* xfi, RDP_VIDEO_FRAME_EVENT* vevent) +static void xf_process_tsmf_video_frame_event(xfContext* xfc, RDP_VIDEO_FRAME_EVENT* vevent) { int i; BYTE* data1; @@ -213,7 +213,7 @@ static void xf_process_tsmf_video_frame_event(xfInfo* xfi, RDP_VIDEO_FRAME_EVENT XvImage * image; int colorkey = 0; XShmSegmentInfo shminfo; - xfXvContext* xv = (xfXvContext*) xfi->xv_context; + xfXvContext* xv = (xfXvContext*) xfc->xv_context; if (xv->xv_port == 0) return; @@ -224,13 +224,13 @@ static void xf_process_tsmf_video_frame_event(xfInfo* xfi, RDP_VIDEO_FRAME_EVENT if (xv->xv_colorkey_atom != None) { - XvGetPortAttribute(xfi->display, xv->xv_port, xv->xv_colorkey_atom, &colorkey); - XSetFunction(xfi->display, xfi->gc, GXcopy); - XSetFillStyle(xfi->display, xfi->gc, FillSolid); - XSetForeground(xfi->display, xfi->gc, colorkey); + XvGetPortAttribute(xfc->display, xv->xv_port, xv->xv_colorkey_atom, &colorkey); + XSetFunction(xfc->display, xfc->gc, GXcopy); + XSetFillStyle(xfc->display, xfc->gc, FillSolid); + XSetForeground(xfc->display, xfc->gc, colorkey); for (i = 0; i < vevent->num_visible_rects; i++) { - XFillRectangle(xfi->display, xfi->window->handle, xfi->gc, + XFillRectangle(xfc->display, xfc->window->handle, xfc->gc, vevent->x + vevent->visible_rects[i].x, vevent->y + vevent->visible_rects[i].y, vevent->visible_rects[i].width, @@ -239,7 +239,7 @@ static void xf_process_tsmf_video_frame_event(xfInfo* xfi, RDP_VIDEO_FRAME_EVENT } else { - XSetClipRectangles(xfi->display, xfi->gc, vevent->x, vevent->y, + XSetClipRectangles(xfc->display, xfc->gc, vevent->x, vevent->y, (XRectangle*) vevent->visible_rects, vevent->num_visible_rects, YXBanded); } @@ -265,7 +265,7 @@ static void xf_process_tsmf_video_frame_event(xfInfo* xfi, RDP_VIDEO_FRAME_EVENT return; } - image = XvShmCreateImage(xfi->display, xv->xv_port, + image = XvShmCreateImage(xfc->display, xv->xv_port, xvpixfmt, 0, vevent->frame_width, vevent->frame_height, &shminfo); if (xv->xv_image_size != image->data_size) @@ -283,7 +283,7 @@ static void xf_process_tsmf_video_frame_event(xfInfo* xfi, RDP_VIDEO_FRAME_EVENT shminfo.shmaddr = image->data = xv->xv_shmaddr; shminfo.readOnly = FALSE; - if (!XShmAttach(xfi->display, &shminfo)) + if (!XShmAttach(xfc->display, &shminfo)) { XFree(image); DEBUG_XV("XShmAttach failed."); @@ -356,35 +356,35 @@ static void xf_process_tsmf_video_frame_event(xfInfo* xfi, RDP_VIDEO_FRAME_EVENT break; } - XvShmPutImage(xfi->display, xv->xv_port, xfi->window->handle, xfi->gc, image, + XvShmPutImage(xfc->display, xv->xv_port, xfc->window->handle, xfc->gc, image, 0, 0, image->width, image->height, vevent->x, vevent->y, vevent->width, vevent->height, FALSE); if (xv->xv_colorkey_atom == None) - XSetClipMask(xfi->display, xfi->gc, None); - XSync(xfi->display, FALSE); + XSetClipMask(xfc->display, xfc->gc, None); + XSync(xfc->display, FALSE); - XShmDetach(xfi->display, &shminfo); + XShmDetach(xfc->display, &shminfo); XFree(image); } -static void xf_process_tsmf_redraw_event(xfInfo* xfi, RDP_REDRAW_EVENT* revent) +static void xf_process_tsmf_redraw_event(xfContext* xfc, RDP_REDRAW_EVENT* revent) { - XSetFunction(xfi->display, xfi->gc, GXcopy); - XSetFillStyle(xfi->display, xfi->gc, FillSolid); - XCopyArea(xfi->display, xfi->primary, xfi->window->handle, xfi->gc, + XSetFunction(xfc->display, xfc->gc, GXcopy); + XSetFillStyle(xfc->display, xfc->gc, FillSolid); + XCopyArea(xfc->display, xfc->primary, xfc->window->handle, xfc->gc, revent->x, revent->y, revent->width, revent->height, revent->x, revent->y); } -void xf_process_tsmf_event(xfInfo* xfi, wMessage* event) +void xf_process_tsmf_event(xfContext* xfc, wMessage* event) { switch (GetMessageType(event->id)) { case TsmfChannel_VideoFrame: - xf_process_tsmf_video_frame_event(xfi, (RDP_VIDEO_FRAME_EVENT*) event); + xf_process_tsmf_video_frame_event(xfc, (RDP_VIDEO_FRAME_EVENT*) event); break; case TsmfChannel_Redraw: - xf_process_tsmf_redraw_event(xfi, (RDP_REDRAW_EVENT*) event); + xf_process_tsmf_redraw_event(xfc, (RDP_REDRAW_EVENT*) event); break; } @@ -392,15 +392,15 @@ void xf_process_tsmf_event(xfInfo* xfi, wMessage* event) #else /* WITH_XV */ -void xf_tsmf_init(xfInfo* xfi, long xv_port) +void xf_tsmf_init(xfContext* xfc, long xv_port) { } -void xf_tsmf_uninit(xfInfo* xfi) +void xf_tsmf_uninit(xfContext* xfc) { } -void xf_process_tsmf_event(xfInfo* xfi, wMessage* event) +void xf_process_tsmf_event(xfContext* xfc, wMessage* event) { } diff --git a/client/X11/xf_tsmf.h b/client/X11/xf_tsmf.h index 65d7838d8..eb7981851 100644 --- a/client/X11/xf_tsmf.h +++ b/client/X11/xf_tsmf.h @@ -20,11 +20,11 @@ #ifndef __XF_TSMF_H #define __XF_TSMF_H -#include "xf_interface.h" +#include "xf_client.h" #include "xfreerdp.h" -void xf_tsmf_init(xfInfo* xfi, long xv_port); -void xf_tsmf_uninit(xfInfo* xfi); -void xf_process_tsmf_event(xfInfo* xfi, wMessage* event); +void xf_tsmf_init(xfContext* xfc, long xv_port); +void xf_tsmf_uninit(xfContext* xfc); +void xf_process_tsmf_event(xfContext* xfc, wMessage* event); #endif /* __XF_TSMF_H */ diff --git a/client/X11/xf_window.c b/client/X11/xf_window.c index 76db600e7..e12cdc344 100644 --- a/client/X11/xf_window.c +++ b/client/X11/xf_window.c @@ -109,7 +109,7 @@ typedef struct _PropMotifWmHints PropMotifWmHints; /** * Post an event from the client to the X server */ -void xf_SendClientEvent(xfInfo* xfi, xfWindow* window, Atom atom, unsigned int numArgs, ...) +void xf_SendClientEvent(xfContext* xfc, xfWindow* window, Atom atom, unsigned int numArgs, ...) { XEvent xevent; unsigned int i; @@ -120,7 +120,7 @@ void xf_SendClientEvent(xfInfo* xfi, xfWindow* window, Atom atom, unsigned int n xevent.xclient.type = ClientMessage; xevent.xclient.serial = 0; xevent.xclient.send_event = False; - xevent.xclient.display = xfi->display; + xevent.xclient.display = xfc->display; xevent.xclient.window = window->handle; xevent.xclient.message_type = atom; xevent.xclient.format = 32; @@ -132,23 +132,23 @@ void xf_SendClientEvent(xfInfo* xfi, xfWindow* window, Atom atom, unsigned int n DEBUG_X11("Send ClientMessage Event: wnd=0x%04X", (unsigned int) xevent.xclient.window); - XSendEvent(xfi->display, RootWindowOfScreen(xfi->screen), False, + XSendEvent(xfc->display, RootWindowOfScreen(xfc->screen), False, SubstructureRedirectMask | SubstructureNotifyMask, &xevent); - XSync(xfi->display, False); + XSync(xfc->display, False); va_end(argp); } -void xf_SetWindowFullscreen(xfInfo* xfi, xfWindow* window, BOOL fullscreen) +void xf_SetWindowFullscreen(xfContext* xfc, xfWindow* window, BOOL fullscreen) { if (fullscreen) { - rdpSettings* settings = xfi->instance->settings; + rdpSettings* settings = xfc->instance->settings; - xf_SetWindowDecorations(xfi, window, FALSE); + xf_SetWindowDecorations(xfc, window, FALSE); - XMoveResizeWindow(xfi->display, window->handle, settings->DesktopPosX, settings->DesktopPosY, window->width, window->height); - XMapRaised(xfi->display, window->handle); + XMoveResizeWindow(xfc->display, window->handle, settings->DesktopPosX, settings->DesktopPosY, window->width, window->height); + XMapRaised(xfc->display, window->handle); window->fullscreen = TRUE; } @@ -156,7 +156,7 @@ void xf_SetWindowFullscreen(xfInfo* xfi, xfWindow* window, BOOL fullscreen) /* http://tronche.com/gui/x/xlib/window-information/XGetWindowProperty.html */ -BOOL xf_GetWindowProperty(xfInfo* xfi, Window window, Atom property, int length, +BOOL xf_GetWindowProperty(xfContext* xfc, Window window, Atom property, int length, unsigned long* nitems, unsigned long* bytes, BYTE** prop) { int status; @@ -166,7 +166,7 @@ BOOL xf_GetWindowProperty(xfInfo* xfi, Window window, Atom property, int length, if (property == None) return FALSE; - status = XGetWindowProperty(xfi->display, window, + status = XGetWindowProperty(xfc->display, window, property, 0, length, FALSE, AnyPropertyType, &actual_type, &actual_format, nitems, bytes, prop); @@ -182,26 +182,26 @@ BOOL xf_GetWindowProperty(xfInfo* xfi, Window window, Atom property, int length, return TRUE; } -BOOL xf_GetCurrentDesktop(xfInfo* xfi) +BOOL xf_GetCurrentDesktop(xfContext* xfc) { BOOL status; unsigned long nitems; unsigned long bytes; unsigned char* prop; - status = xf_GetWindowProperty(xfi, DefaultRootWindow(xfi->display), - xfi->_NET_CURRENT_DESKTOP, 1, &nitems, &bytes, &prop); + status = xf_GetWindowProperty(xfc, DefaultRootWindow(xfc->display), + xfc->_NET_CURRENT_DESKTOP, 1, &nitems, &bytes, &prop); if (!status) return FALSE; - xfi->current_desktop = (int) *prop; + xfc->current_desktop = (int) *prop; free(prop); return TRUE; } -BOOL xf_GetWorkArea(xfInfo* xfi) +BOOL xf_GetWorkArea(xfContext* xfc) { long* plong; BOOL status; @@ -209,18 +209,18 @@ BOOL xf_GetWorkArea(xfInfo* xfi) unsigned long bytes; unsigned char* prop; - status = xf_GetCurrentDesktop(xfi); + status = xf_GetCurrentDesktop(xfc); if (status != TRUE) return FALSE; - status = xf_GetWindowProperty(xfi, DefaultRootWindow(xfi->display), - xfi->_NET_WORKAREA, 32 * 4, &nitems, &bytes, &prop); + status = xf_GetWindowProperty(xfc, DefaultRootWindow(xfc->display), + xfc->_NET_WORKAREA, 32 * 4, &nitems, &bytes, &prop); if (status != TRUE) return FALSE; - if ((xfi->current_desktop * 4 + 3) >= nitems) + if ((xfc->current_desktop * 4 + 3) >= nitems) { free(prop); return FALSE; @@ -228,16 +228,16 @@ BOOL xf_GetWorkArea(xfInfo* xfi) plong = (long*) prop; - xfi->workArea.x = plong[xfi->current_desktop * 4 + 0]; - xfi->workArea.y = plong[xfi->current_desktop * 4 + 1]; - xfi->workArea.width = plong[xfi->current_desktop * 4 + 2]; - xfi->workArea.height = plong[xfi->current_desktop * 4 + 3]; + xfc->workArea.x = plong[xfc->current_desktop * 4 + 0]; + xfc->workArea.y = plong[xfc->current_desktop * 4 + 1]; + xfc->workArea.width = plong[xfc->current_desktop * 4 + 2]; + xfc->workArea.height = plong[xfc->current_desktop * 4 + 3]; free(prop); return TRUE; } -void xf_SetWindowDecorations(xfInfo* xfi, xfWindow* window, BOOL show) +void xf_SetWindowDecorations(xfContext* xfc, xfWindow* window, BOOL show) { PropMotifWmHints hints; @@ -247,22 +247,22 @@ void xf_SetWindowDecorations(xfInfo* xfi, xfWindow* window, BOOL show) hints.inputMode = 0; hints.status = 0; - XChangeProperty(xfi->display, window->handle, xfi->_MOTIF_WM_HINTS, xfi->_MOTIF_WM_HINTS, 32, + XChangeProperty(xfc->display, window->handle, xfc->_MOTIF_WM_HINTS, xfc->_MOTIF_WM_HINTS, 32, PropModeReplace, (BYTE*) &hints, PROP_MOTIF_WM_HINTS_ELEMENTS); } -void xf_SetWindowUnlisted(xfInfo* xfi, xfWindow* window) +void xf_SetWindowUnlisted(xfContext* xfc, xfWindow* window) { Atom window_state[2]; - window_state[0] = xfi->_NET_WM_STATE_SKIP_PAGER; - window_state[1] = xfi->_NET_WM_STATE_SKIP_TASKBAR; + window_state[0] = xfc->_NET_WM_STATE_SKIP_PAGER; + window_state[1] = xfc->_NET_WM_STATE_SKIP_TASKBAR; - XChangeProperty(xfi->display, window->handle, xfi->_NET_WM_STATE, + XChangeProperty(xfc->display, window->handle, xfc->_NET_WM_STATE, XA_ATOM, 32, PropModeReplace, (BYTE*) &window_state, 2); } -void xf_SetWindowStyle(xfInfo* xfi, xfWindow* window, UINT32 style, UINT32 ex_style) +void xf_SetWindowStyle(xfContext* xfc, xfWindow* window, UINT32 style, UINT32 ex_style) { Atom window_type; @@ -279,11 +279,11 @@ void xf_SetWindowStyle(xfInfo* xfi, xfWindow* window, UINT32 style, UINT32 ex_st */ XSetWindowAttributes attrs; attrs.override_redirect = True; - XChangeWindowAttributes(xfi->display, window->handle, CWOverrideRedirect, &attrs); + XChangeWindowAttributes(xfc->display, window->handle, CWOverrideRedirect, &attrs); window->is_transient = TRUE; - xf_SetWindowUnlisted(xfi, window); - window_type = xfi->_NET_WM_WINDOW_TYPE_POPUP; + xf_SetWindowUnlisted(xfc, window); + window_type = xfc->_NET_WM_WINDOW_TYPE_POPUP; } /* * TOPMOST window that is not a toolwindow is treated like a regular window(ie. task manager). @@ -291,44 +291,44 @@ void xf_SetWindowStyle(xfInfo* xfi, xfWindow* window, UINT32 style, UINT32 ex_st */ else if (ex_style & WS_EX_TOPMOST) { - window_type = xfi->_NET_WM_WINDOW_TYPE_NORMAL; + window_type = xfc->_NET_WM_WINDOW_TYPE_NORMAL; } else if (style & WS_POPUP) { /* this includes dialogs, popups, etc, that need to be full-fledged windows */ window->is_transient = TRUE; - window_type = xfi->_NET_WM_WINDOW_TYPE_DIALOG; - xf_SetWindowUnlisted(xfi, window); + window_type = xfc->_NET_WM_WINDOW_TYPE_DIALOG; + xf_SetWindowUnlisted(xfc, window); } else { - window_type = xfi->_NET_WM_WINDOW_TYPE_NORMAL; + window_type = xfc->_NET_WM_WINDOW_TYPE_NORMAL; } - XChangeProperty(xfi->display, window->handle, xfi->_NET_WM_WINDOW_TYPE, + XChangeProperty(xfc->display, window->handle, xfc->_NET_WM_WINDOW_TYPE, XA_ATOM, 32, PropModeReplace, (BYTE*) &window_type, 1); } -void xf_SetWindowText(xfInfo *xfi, xfWindow* window, char *name) +void xf_SetWindowText(xfContext* xfc, xfWindow* window, char *name) { - XStoreName(xfi->display, window->handle, name); + XStoreName(xfc->display, window->handle, name); } -static void xf_SetWindowPID(xfInfo* xfi, xfWindow* window, pid_t pid) +static void xf_SetWindowPID(xfContext* xfc, xfWindow* window, pid_t pid) { Atom am_wm_pid; if (!pid) pid = getpid(); - am_wm_pid = XInternAtom(xfi->display, "_NET_WM_PID", False); + am_wm_pid = XInternAtom(xfc->display, "_NET_WM_PID", False); - XChangeProperty(xfi->display, window->handle, am_wm_pid, XA_CARDINAL, + XChangeProperty(xfc->display, window->handle, am_wm_pid, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&pid, 1); } -xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height, BOOL decorations) +xfWindow* xf_CreateDesktopWindow(xfContext* xfc, char* name, int width, int height, BOOL decorations) { xfWindow* window; XEvent xevent; @@ -336,7 +336,7 @@ xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height, window = (xfWindow*) malloc(sizeof(xfWindow)); ZeroMemory(window, sizeof(xfWindow)); - settings = xfi->instance->settings; + settings = xfc->instance->settings; if (window) { @@ -352,10 +352,10 @@ xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height, window->is_mapped = FALSE; window->is_transient = FALSE; - window->handle = XCreateWindow(xfi->display, RootWindowOfScreen(xfi->screen), - xfi->workArea.x, xfi->workArea.y, xfi->workArea.width, xfi->workArea.height, 0, xfi->depth, InputOutput, xfi->visual, + window->handle = XCreateWindow(xfc->display, RootWindowOfScreen(xfc->screen), + xfc->workArea.x, xfc->workArea.y, xfc->workArea.width, xfc->workArea.height, 0, xfc->depth, InputOutput, xfc->visual, CWBackPixel | CWBackingStore | CWOverrideRedirect | CWColormap | - CWBorderPixel | CWWinGravity | CWBitGravity, &xfi->attribs); + CWBorderPixel | CWWinGravity | CWBitGravity, &xfc->attribs); shmid = shmget(SHARED_MEM_KEY, sizeof(int), IPC_CREAT | 0666); @@ -383,47 +383,46 @@ xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height, { class_hints->res_name = "xfreerdp"; - if (xfi->instance->settings->WmClass) - class_hints->res_class = xfi->instance->settings->WmClass; + if (xfc->instance->settings->WmClass) + class_hints->res_class = xfc->instance->settings->WmClass; else class_hints->res_class = "xfreerdp"; - XSetClassHint(xfi->display, window->handle, class_hints); + XSetClassHint(xfc->display, window->handle, class_hints); XFree(class_hints); } - xf_ResizeDesktopWindow(xfi, window, width, height); - xf_SetWindowDecorations(xfi, window, decorations); - xf_SetWindowPID(xfi, window, 0); + xf_ResizeDesktopWindow(xfc, window, width, height); + xf_SetWindowDecorations(xfc, window, decorations); + xf_SetWindowPID(xfc, window, 0); input_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | VisibilityChangeMask | FocusChangeMask | StructureNotifyMask | PointerMotionMask | ExposureMask | PropertyChangeMask; - if (xfi->grab_keyboard) + if (xfc->grab_keyboard) input_mask |= EnterWindowMask | LeaveWindowMask; - XChangeProperty(xfi->display, window->handle, xfi->_NET_WM_ICON, XA_CARDINAL, 32, + XChangeProperty(xfc->display, window->handle, xfc->_NET_WM_ICON, XA_CARDINAL, 32, PropModeReplace, (BYTE*) xf_icon_prop, ARRAYSIZE(xf_icon_prop)); - if (xfi->settings->ParentWindowId) - XReparentWindow(xfi->display, window->handle, (Window) xfi->settings->ParentWindowId, 0, 0); + if (xfc->settings->ParentWindowId) + XReparentWindow(xfc->display, window->handle, (Window) xfc->settings->ParentWindowId, 0, 0); - XSelectInput(xfi->display, window->handle, input_mask); - XClearWindow(xfi->display, window->handle); - XMapWindow(xfi->display, window->handle); + XSelectInput(xfc->display, window->handle, input_mask); + XClearWindow(xfc->display, window->handle); + XMapWindow(xfc->display, window->handle); + + xf_input_init(xfc, window->handle); -#ifdef WITH_XI - xf_input_init(xfi, settings->ParentWindowId);//window->handle); -#endif /* * NOTE: This must be done here to handle reparenting the window, * so that we don't miss the event and hang waiting for the next one */ do { - XMaskEvent(xfi->display, VisibilityChangeMask, &xevent); + XMaskEvent(xfc->display, VisibilityChangeMask, &xevent); } while (xevent.type != VisibilityNotify); @@ -433,22 +432,22 @@ xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height, * This extra call after the window is mapped will position the login window correctly */ - if (xfi->instance->settings->RemoteApplicationMode) + if (xfc->instance->settings->RemoteApplicationMode) { - XMoveWindow(xfi->display, window->handle, 0, 0); + XMoveWindow(xfc->display, window->handle, 0, 0); } else if (settings->DesktopPosX || settings->DesktopPosY) { - XMoveWindow(xfi->display, window->handle, settings->DesktopPosX, settings->DesktopPosY); + XMoveWindow(xfc->display, window->handle, settings->DesktopPosX, settings->DesktopPosY); } } - xf_SetWindowText(xfi, window, name); + xf_SetWindowText(xfc, window, name); return window; } -void xf_ResizeDesktopWindow(xfInfo* xfi, xfWindow* window, int width, int height) +void xf_ResizeDesktopWindow(xfContext* xfc, xfWindow* window, int width, int height) { XSizeHints* size_hints; @@ -457,21 +456,21 @@ void xf_ResizeDesktopWindow(xfInfo* xfi, xfWindow* window, int width, int height if (size_hints) { size_hints->flags = PMinSize | PMaxSize; - size_hints->min_width = size_hints->max_width = xfi->width; - size_hints->min_height = size_hints->max_height = xfi->height; - XSetWMNormalHints(xfi->display, window->handle, size_hints); - XResizeWindow(xfi->display, window->handle, xfi->width, xfi->height); + size_hints->min_width = size_hints->max_width = xfc->width; + size_hints->min_height = size_hints->max_height = xfc->height; + XSetWMNormalHints(xfc->display, window->handle, size_hints); + XResizeWindow(xfc->display, window->handle, xfc->width, xfc->height); XFree(size_hints); } } -void xf_FixWindowCoordinates(xfInfo* xfi, int* x, int* y, int* width, int* height) +void xf_FixWindowCoordinates(xfContext* xfc, int* x, int* y, int* width, int* height) { int vscreen_width; int vscreen_height; - vscreen_width = xfi->vscreen.area.right - xfi->vscreen.area.left + 1; - vscreen_height = xfi->vscreen.area.bottom - xfi->vscreen.area.top + 1; + vscreen_width = xfc->vscreen.area.right - xfc->vscreen.area.left + 1; + vscreen_height = xfc->vscreen.area.bottom - xfc->vscreen.area.top + 1; if (*width < 1) { @@ -481,15 +480,15 @@ void xf_FixWindowCoordinates(xfInfo* xfi, int* x, int* y, int* width, int* heigh { *height = 1; } - if (*x < xfi->vscreen.area.left) + if (*x < xfc->vscreen.area.left) { *width += *x; - *x = xfi->vscreen.area.left; + *x = xfc->vscreen.area.left; } - if (*y < xfi->vscreen.area.top) + if (*y < xfc->vscreen.area.top) { *height += *y; - *y = xfi->vscreen.area.top; + *y = xfc->vscreen.area.top; } if (*width > vscreen_width) { @@ -503,7 +502,7 @@ void xf_FixWindowCoordinates(xfInfo* xfi, int* x, int* y, int* width, int* heigh char rail_window_class[] = "RAIL:00000000"; -xfWindow* xf_CreateWindow(xfInfo* xfi, rdpWindow* wnd, int x, int y, int width, int height, UINT32 id) +xfWindow* xf_CreateWindow(xfContext* xfc, rdpWindow* wnd, int x, int y, int width, int height, UINT32 id) { XGCValues gcv; int input_mask; @@ -514,7 +513,7 @@ xfWindow* xf_CreateWindow(xfInfo* xfi, rdpWindow* wnd, int x, int y, int width, window = (xfWindow*) malloc(sizeof(xfWindow)); ZeroMemory(window, sizeof(xfWindow)); - xf_FixWindowCoordinates(xfi, &x, &y, &width, &height); + xf_FixWindowCoordinates(xfc, &x, &y, &width, &height); window->left = x; window->top = y; @@ -538,17 +537,17 @@ xfWindow* xf_CreateWindow(xfInfo* xfi, rdpWindow* wnd, int x, int y, int width, window->rail_state = 0; window->rail_ignore_configure = FALSE; - window->handle = XCreateWindow(xfi->display, RootWindowOfScreen(xfi->screen), - x, y, window->width, window->height, 0, xfi->depth, InputOutput, xfi->visual, + window->handle = XCreateWindow(xfc->display, RootWindowOfScreen(xfc->screen), + x, y, window->width, window->height, 0, xfc->depth, InputOutput, xfc->visual, CWBackPixel | CWBackingStore | CWOverrideRedirect | CWColormap | - CWBorderPixel | CWWinGravity | CWBitGravity, &xfi->attribs); + CWBorderPixel | CWWinGravity | CWBitGravity, &xfc->attribs); DEBUG_X11_LMS("Create window=0x%X rc={l=%d t=%d r=%d b=%d} w=%d h=%d rdp=0x%X", (UINT32) window->handle, window->left, window->top, window->right, window->bottom, window->width, window->height, wnd->windowId); ZeroMemory(&gcv, sizeof(gcv)); - window->gc = XCreateGC(xfi->display, window->handle, GCGraphicsExposures, &gcv); + window->gc = XCreateGC(xfc->display, window->handle, GCGraphicsExposures, &gcv); class_hints = XAllocClassHint(); @@ -556,9 +555,9 @@ xfWindow* xf_CreateWindow(xfInfo* xfi, rdpWindow* wnd, int x, int y, int width, { char* class = NULL; - if (xfi->instance->settings->WmClass != NULL) + if (xfc->instance->settings->WmClass != NULL) { - class_hints->res_class = xfi->instance->settings->WmClass; + class_hints->res_class = xfc->instance->settings->WmClass; } else { @@ -568,7 +567,7 @@ xfWindow* xf_CreateWindow(xfInfo* xfi, rdpWindow* wnd, int x, int y, int width, } class_hints->res_name = "RAIL"; - XSetClassHint(xfi->display, window->handle, class_hints); + XSetClassHint(xfc->display, window->handle, class_hints); XFree(class_hints); if (class) @@ -579,10 +578,10 @@ xfWindow* xf_CreateWindow(xfInfo* xfi, rdpWindow* wnd, int x, int y, int width, InputModeHint = XAllocWMHints(); InputModeHint->flags = (1L << 0); InputModeHint->input = True; - XSetWMHints(xfi->display, window->handle, InputModeHint); + XSetWMHints(xfc->display, window->handle, InputModeHint); XFree(InputModeHint); - XSetWMProtocols(xfi->display, window->handle, &(xfi->WM_DELETE_WINDOW), 1); + XSetWMProtocols(xfc->display, window->handle, &(xfc->WM_DELETE_WINDOW), 1); input_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask | @@ -593,23 +592,23 @@ xfWindow* xf_CreateWindow(xfInfo* xfi, rdpWindow* wnd, int x, int y, int width, SubstructureRedirectMask | FocusChangeMask | PropertyChangeMask | ColormapChangeMask | OwnerGrabButtonMask; - XSelectInput(xfi->display, window->handle, input_mask); + XSelectInput(xfc->display, window->handle, input_mask); - xf_SetWindowDecorations(xfi, window, window->decorations); - xf_SetWindowStyle(xfi, window, wnd->style, wnd->extendedStyle); - xf_SetWindowPID(xfi, window, 0); - xf_ShowWindow(xfi, window, WINDOW_SHOW); + xf_SetWindowDecorations(xfc, window, window->decorations); + xf_SetWindowStyle(xfc, window, wnd->style, wnd->extendedStyle); + xf_SetWindowPID(xfc, window, 0); + xf_ShowWindow(xfc, window, WINDOW_SHOW); - XClearWindow(xfi->display, window->handle); - XMapWindow(xfi->display, window->handle); + XClearWindow(xfc->display, window->handle); + XMapWindow(xfc->display, window->handle); /* Move doesn't seem to work until window is mapped. */ - xf_MoveWindow(xfi, window, x, y, width, height); + xf_MoveWindow(xfc, window, x, y, width, height); return window; } -void xf_SetWindowMinMaxInfo(xfInfo* xfi, xfWindow* window, +void xf_SetWindowMinMaxInfo(xfContext* xfc, xfWindow* window, int maxWidth, int maxHeight, int maxPosX, int maxPosY, int minTrackWidth, int minTrackHeight, int maxTrackWidth, int maxTrackHeight) { @@ -630,12 +629,12 @@ void xf_SetWindowMinMaxInfo(xfInfo* xfi, xfWindow* window, /* to speedup window drawing we need to select optimal value for sizing step. */ size_hints->width_inc = size_hints->height_inc = 1; - XSetWMNormalHints(xfi->display, window->handle, size_hints); + XSetWMNormalHints(xfc->display, window->handle, size_hints); XFree(size_hints); } } -void xf_StartLocalMoveSize(xfInfo* xfi, xfWindow* window, int direction, int x, int y) +void xf_StartLocalMoveSize(xfContext* xfc, xfWindow* window, int direction, int x, int y) { if (window->local_move.state != LMS_NOT_ACTIVE) return; @@ -657,10 +656,10 @@ void xf_StartLocalMoveSize(xfInfo* xfi, xfWindow* window, int direction, int x, window->local_move.state = LMS_STARTING; window->local_move.direction = direction; - XUngrabPointer(xfi->display, CurrentTime); + XUngrabPointer(xfc->display, CurrentTime); - xf_SendClientEvent(xfi, window, - xfi->_NET_WM_MOVERESIZE, /* request X window manager to initiate a local move */ + xf_SendClientEvent(xfc, window, + xfc->_NET_WM_MOVERESIZE, /* request X window manager to initiate a local move */ 5, /* 5 arguments to follow */ x, /* x relative to root window */ y, /* y relative to root window */ @@ -669,7 +668,7 @@ void xf_StartLocalMoveSize(xfInfo* xfi, xfWindow* window, int direction, int x, 1); /* 1 == application request per extended ICCM */ } -void xf_EndLocalMoveSize(xfInfo *xfi, xfWindow *window) +void xf_EndLocalMoveSize(xfContext* xfc, xfWindow *window) { DEBUG_X11_LMS("state=%d window=0x%X rc={l=%d t=%d r=%d b=%d} w=%d h=%d " @@ -691,8 +690,8 @@ void xf_EndLocalMoveSize(xfInfo *xfi, xfWindow *window) * RDP server for local moves. We must cancel the X window manager move. * Per ICCM, the X client can ask to cancel an active move. */ - xf_SendClientEvent(xfi, window, - xfi->_NET_WM_MOVERESIZE, /* request X window manager to abort a local move */ + xf_SendClientEvent(xfc, window, + xfc->_NET_WM_MOVERESIZE, /* request X window manager to abort a local move */ 5, /* 5 arguments to follow */ window->local_move.root_x, /* x relative to root window */ window->local_move.root_y, /* y relative to root window */ @@ -704,7 +703,7 @@ void xf_EndLocalMoveSize(xfInfo *xfi, xfWindow *window) window->local_move.state = LMS_NOT_ACTIVE; } -void xf_MoveWindow(xfInfo* xfi, xfWindow* window, int x, int y, int width, int height) +void xf_MoveWindow(xfContext* xfc, xfWindow* window, int x, int y, int width, int height) { BOOL resize = FALSE; @@ -736,30 +735,30 @@ void xf_MoveWindow(xfInfo* xfi, xfWindow* window, int x, int y, int width, int h window->height = height; if (resize) - XMoveResizeWindow(xfi->display, window->handle, x, y, width, height); + XMoveResizeWindow(xfc->display, window->handle, x, y, width, height); else - XMoveWindow(xfi->display, window->handle, x, y); + XMoveWindow(xfc->display, window->handle, x, y); - xf_UpdateWindowArea(xfi, window, 0, 0, width, height); + xf_UpdateWindowArea(xfc, window, 0, 0, width, height); } -void xf_ShowWindow(xfInfo* xfi, xfWindow* window, BYTE state) +void xf_ShowWindow(xfContext* xfc, xfWindow* window, BYTE state) { switch (state) { case WINDOW_HIDE: - XWithdrawWindow(xfi->display, window->handle, xfi->screen_number); + XWithdrawWindow(xfc->display, window->handle, xfc->screen_number); break; case WINDOW_SHOW_MINIMIZED: - XIconifyWindow(xfi->display, window->handle, xfi->screen_number); + XIconifyWindow(xfc->display, window->handle, xfc->screen_number); break; case WINDOW_SHOW_MAXIMIZED: /* Set the window as maximized */ - xf_SendClientEvent(xfi, window, xfi->_NET_WM_STATE, 4, 1, - XInternAtom(xfi->display, "_NET_WM_STATE_MAXIMIZED_VERT", False), - XInternAtom(xfi->display, "_NET_WM_STATE_MAXIMIZED_HORZ", False), 0); + xf_SendClientEvent(xfc, window, xfc->_NET_WM_STATE, 4, 1, + XInternAtom(xfc->display, "_NET_WM_STATE_MAXIMIZED_VERT", False), + XInternAtom(xfc->display, "_NET_WM_STATE_MAXIMIZED_HORZ", False), 0); /* * This is a workaround for the case where the window is maximized locally before the rail server is told to maximize @@ -769,14 +768,14 @@ void xf_ShowWindow(xfInfo* xfi, xfWindow* window, BYTE state) */ if (window->rail_state == WINDOW_SHOW_MAXIMIZED) - xf_UpdateWindowArea(xfi, window, 0, 0, window->window->windowWidth, window->window->windowHeight); + xf_UpdateWindowArea(xfc, window, 0, 0, window->window->windowWidth, window->window->windowHeight); break; case WINDOW_SHOW: /* Ensure the window is not maximized */ - xf_SendClientEvent(xfi, window, xfi->_NET_WM_STATE, 4, 0, - XInternAtom(xfi->display, "_NET_WM_STATE_MAXIMIZED_VERT", False), - XInternAtom(xfi->display, "_NET_WM_STATE_MAXIMIZED_HORZ", False), 0); + xf_SendClientEvent(xfc, window, xfc->_NET_WM_STATE, 4, 0, + XInternAtom(xfc->display, "_NET_WM_STATE_MAXIMIZED_VERT", False), + XInternAtom(xfc->display, "_NET_WM_STATE_MAXIMIZED_HORZ", False), 0); /* * Ignore configure requests until both the Maximized properties have been processed @@ -789,7 +788,7 @@ void xf_ShowWindow(xfInfo* xfi, xfWindow* window, BYTE state) window->rail_ignore_configure = TRUE; if (window->is_transient) - xf_SetWindowUnlisted(xfi, window); + xf_SetWindowUnlisted(xfc, window); break; } @@ -797,10 +796,10 @@ void xf_ShowWindow(xfInfo* xfi, xfWindow* window, BYTE state) /* Save the current rail state of this window */ window->rail_state = state; - XFlush(xfi->display); + XFlush(xfc->display); } -void xf_SetWindowIcon(xfInfo* xfi, xfWindow* window, rdpIcon* icon) +void xf_SetWindowIcon(xfContext* xfc, xfWindow* window, rdpIcon* icon) { int x, y; int pixels; @@ -829,13 +828,13 @@ void xf_SetWindowIcon(xfInfo* xfi, xfWindow* window, rdpIcon* icon) } } - XChangeProperty(xfi->display, window->handle, xfi->_NET_WM_ICON, XA_CARDINAL, 32, + XChangeProperty(xfc->display, window->handle, xfc->_NET_WM_ICON, XA_CARDINAL, 32, PropModeReplace, (BYTE*) propdata, propsize); - XFlush(xfi->display); + XFlush(xfc->display); } -void xf_SetWindowRects(xfInfo* xfi, xfWindow* window, RECTANGLE_16* rects, int nrects) +void xf_SetWindowRects(xfContext* xfc, xfWindow* window, RECTANGLE_16* rects, int nrects) { int i; XRectangle* xrects; @@ -859,13 +858,13 @@ void xf_SetWindowRects(xfInfo* xfi, xfWindow* window, RECTANGLE_16* rects, int n * * Marc: enabling it works, and is required for round corners. */ - XShapeCombineRectangles(xfi->display, window->handle, ShapeBounding, 0, 0, xrects, nrects, ShapeSet, 0); + XShapeCombineRectangles(xfc->display, window->handle, ShapeBounding, 0, 0, xrects, nrects, ShapeSet, 0); #endif free(xrects); } -void xf_SetWindowVisibilityRects(xfInfo* xfi, xfWindow* window, RECTANGLE_16* rects, int nrects) +void xf_SetWindowVisibilityRects(xfContext* xfc, xfWindow* window, RECTANGLE_16* rects, int nrects) { int i; XRectangle* xrects; @@ -889,13 +888,13 @@ void xf_SetWindowVisibilityRects(xfInfo* xfi, xfWindow* window, RECTANGLE_16* re * * Marc: enabling it works, and is required for round corners. */ - XShapeCombineRectangles(xfi->display, window->handle, ShapeBounding, 0, 0, xrects, nrects, ShapeSet, 0); + XShapeCombineRectangles(xfc->display, window->handle, ShapeBounding, 0, 0, xrects, nrects, ShapeSet, 0); #endif free(xrects); } -void xf_UpdateWindowArea(xfInfo* xfi, xfWindow* window, int x, int y, int width, int height) +void xf_UpdateWindowArea(xfContext* xfc, xfWindow* window, int x, int y, int width, int height) { int ax, ay; rdpWindow* wnd; @@ -903,7 +902,7 @@ void xf_UpdateWindowArea(xfInfo* xfi, xfWindow* window, int x, int y, int width, /* RemoteApp mode uses visibleOffset instead of windowOffset */ - if (!xfi->remote_app) + if (!xfc->remote_app) { ax = x + wnd->windowOffsetX; ay = y + wnd->windowOffsetY; @@ -926,23 +925,23 @@ void xf_UpdateWindowArea(xfInfo* xfi, xfWindow* window, int x, int y, int width, height = (wnd->visibleOffsetY + wnd->windowHeight - 1) - ay; } - WaitForSingleObject(xfi->mutex, INFINITE); + WaitForSingleObject(xfc->mutex, INFINITE); - if (xfi->settings->SoftwareGdi) + if (xfc->settings->SoftwareGdi) { - XPutImage(xfi->display, xfi->primary, window->gc, xfi->image, + XPutImage(xfc->display, xfc->primary, window->gc, xfc->image, ax, ay, ax, ay, width, height); } - XCopyArea(xfi->display, xfi->primary, window->handle, window->gc, + XCopyArea(xfc->display, xfc->primary, window->handle, window->gc, ax, ay, width, height, x, y); - XFlush(xfi->display); + XFlush(xfc->display); - ReleaseMutex(xfi->mutex); + ReleaseMutex(xfc->mutex); } -BOOL xf_IsWindowBorder(xfInfo* xfi, xfWindow* xfw, int x, int y) +BOOL xf_IsWindowBorder(xfContext* xfc, xfWindow* xfw, int x, int y) { rdpWindow* wnd; BOOL clientArea = FALSE; @@ -961,41 +960,38 @@ BOOL xf_IsWindowBorder(xfInfo* xfi, xfWindow* xfw, int x, int y) return (windowArea && !(clientArea)); } -void xf_DestroyWindow(xfInfo* xfi, xfWindow* window) +void xf_DestroyWindow(xfContext* xfc, xfWindow* window) { if (window == NULL) return; - if (xfi->window == window) - xfi->window = NULL; + if (xfc->window == window) + xfc->window = NULL; if (window->gc) - XFreeGC(xfi->display, window->gc); + XFreeGC(xfc->display, window->gc); if (window->handle) { - XUnmapWindow(xfi->display, window->handle); - XDestroyWindow(xfi->display, window->handle); + XUnmapWindow(xfc->display, window->handle); + XDestroyWindow(xfc->display, window->handle); } free(window); } -rdpWindow* xf_rdpWindowFromWindow(xfInfo* xfi, Window wnd) +rdpWindow* xf_rdpWindowFromWindow(xfContext* xfc, Window wnd) { rdpRail* rail; - if (xfi != NULL) + if (xfc) { - if (wnd != 0) + if (wnd) { - if (xfi->_context != NULL) - { - rail = xfi->_context->rail; + rail = ((rdpContext*) xfc)->rail; - if (rail != NULL) - return window_list_get_by_extra_id(rail->list, (void*) (long) wnd); - } + if (rail) + return window_list_get_by_extra_id(rail->list, (void*) (long) wnd); } } diff --git a/client/X11/xf_window.h b/client/X11/xf_window.h index 96d08be50..e80023981 100644 --- a/client/X11/xf_window.h +++ b/client/X11/xf_window.h @@ -27,7 +27,7 @@ typedef struct xf_localmove xfLocalMove; typedef struct xf_window xfWindow; -#include "xf_interface.h" +#include "xf_client.h" #include "xfreerdp.h" // Extended ICCM flags http://standards.freedesktop.org/wm-spec/wm-spec-latest.html @@ -82,39 +82,39 @@ struct xf_window BOOL rail_ignore_configure; }; -void xf_ewmhints_init(xfInfo* xfi); +void xf_ewmhints_init(xfContext* xfc); -BOOL xf_GetCurrentDesktop(xfInfo* xfi); -BOOL xf_GetWorkArea(xfInfo* xfi); +BOOL xf_GetCurrentDesktop(xfContext* xfc); +BOOL xf_GetWorkArea(xfContext* xfc); -void xf_SetWindowFullscreen(xfInfo* xfi, xfWindow* window, BOOL fullscreen); -void xf_SetWindowDecorations(xfInfo* xfi, xfWindow* window, BOOL show); -void xf_SetWindowUnlisted(xfInfo* xfi, xfWindow* window); +void xf_SetWindowFullscreen(xfContext* xfc, xfWindow* window, BOOL fullscreen); +void xf_SetWindowDecorations(xfContext* xfc, xfWindow* window, BOOL show); +void xf_SetWindowUnlisted(xfContext* xfc, xfWindow* window); -xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height, BOOL decorations); -void xf_ResizeDesktopWindow(xfInfo* xfi, xfWindow* window, int width, int height); +xfWindow* xf_CreateDesktopWindow(xfContext* xfc, char* name, int width, int height, BOOL decorations); +void xf_ResizeDesktopWindow(xfContext* xfc, xfWindow* window, int width, int height); -xfWindow* xf_CreateWindow(xfInfo* xfi, rdpWindow* wnd, int x, int y, int width, int height, UINT32 id); -void xf_SetWindowText(xfInfo *xfi, xfWindow* window, char *name); -void xf_MoveWindow(xfInfo* xfi, xfWindow* window, int x, int y, int width, int height); -void xf_ShowWindow(xfInfo* xfi, xfWindow* window, BYTE state); -void xf_SetWindowIcon(xfInfo* xfi, xfWindow* window, rdpIcon* icon); -void xf_SetWindowRects(xfInfo* xfi, xfWindow* window, RECTANGLE_16* rects, int nrects); -void xf_SetWindowVisibilityRects(xfInfo* xfi, xfWindow* window, RECTANGLE_16* rects, int nrects); -void xf_SetWindowStyle(xfInfo* xfi, xfWindow* window, UINT32 style, UINT32 ex_style); -void xf_UpdateWindowArea(xfInfo* xfi, xfWindow* window, int x, int y, int width, int height); -BOOL xf_IsWindowBorder(xfInfo* xfi, xfWindow* xfw, int x, int y); -void xf_DestroyWindow(xfInfo* xfi, xfWindow* window); -rdpWindow* xf_rdpWindowFromWindow(xfInfo* xfi, Window wnd); +xfWindow* xf_CreateWindow(xfContext* xfc, rdpWindow* wnd, int x, int y, int width, int height, UINT32 id); +void xf_SetWindowText(xfContext* xfc, xfWindow* window, char *name); +void xf_MoveWindow(xfContext* xfc, xfWindow* window, int x, int y, int width, int height); +void xf_ShowWindow(xfContext* xfc, xfWindow* window, BYTE state); +void xf_SetWindowIcon(xfContext* xfc, xfWindow* window, rdpIcon* icon); +void xf_SetWindowRects(xfContext* xfc, xfWindow* window, RECTANGLE_16* rects, int nrects); +void xf_SetWindowVisibilityRects(xfContext* xfc, xfWindow* window, RECTANGLE_16* rects, int nrects); +void xf_SetWindowStyle(xfContext* xfc, xfWindow* window, UINT32 style, UINT32 ex_style); +void xf_UpdateWindowArea(xfContext* xfc, xfWindow* window, int x, int y, int width, int height); +BOOL xf_IsWindowBorder(xfContext* xfc, xfWindow* xfw, int x, int y); +void xf_DestroyWindow(xfContext* xfc, xfWindow* window); +rdpWindow* xf_rdpWindowFromWindow(xfContext* xfc, Window wnd); -BOOL xf_GetWindowProperty(xfInfo* xfi, Window window, Atom property, int length, +BOOL xf_GetWindowProperty(xfContext* xfc, Window window, Atom property, int length, unsigned long* nitems, unsigned long* bytes, BYTE** prop); -void xf_SetWindowMinMaxInfo(xfInfo* xfi, xfWindow* window, int maxWidth, int maxHeight, +void xf_SetWindowMinMaxInfo(xfContext* xfc, xfWindow* window, int maxWidth, int maxHeight, int maxPosX, int maxPosY, int minTrackWidth, int minTrackHeight, int maxTrackWidth, int maxTrackHeight); -void xf_StartLocalMoveSize(xfInfo* xfi, xfWindow* window, int direction, int x, int y); -void xf_EndLocalMoveSize(xfInfo *xfi, xfWindow *window); -void xf_SendClientEvent(xfInfo *xfi, xfWindow* window, Atom atom, unsigned int numArgs, ...); +void xf_StartLocalMoveSize(xfContext* xfc, xfWindow* window, int direction, int x, int y); +void xf_EndLocalMoveSize(xfContext* xfc, xfWindow *window); +void xf_SendClientEvent(xfContext* xfc, xfWindow* window, Atom atom, unsigned int numArgs, ...); #endif /* __XF_WINDOW_H */ diff --git a/client/X11/xfreerdp.h b/client/X11/xfreerdp.h index 6e8cb4304..e9bf0ec36 100644 --- a/client/X11/xfreerdp.h +++ b/client/X11/xfreerdp.h @@ -20,6 +20,8 @@ #ifndef __XFREERDP_H #define __XFREERDP_H +typedef struct xf_context xfContext; + #include "xf_window.h" #include "xf_monitor.h" #include "xf_channels.h" @@ -56,20 +58,10 @@ typedef struct xf_glyph xfGlyph; struct xf_context { - rdpContext _p; + rdpContext context; + DEFINE_RDP_CLIENT_COMMON(); - xfInfo* xfi; - rdpSettings* settings; -}; -typedef struct xf_context xfContext; - -struct xf_info -{ freerdp* instance; - xfContext* context; - rdpContext* _context; - - rdpClient* client; rdpSettings* settings; GC gc; @@ -103,7 +95,6 @@ struct xf_info BOOL disconnect; HCLRCONV clrconv; HANDLE mutex; - HANDLE thread; BOOL UseXThreads; HGDI_DC hdc; @@ -127,6 +118,7 @@ struct xf_info int offset_y; BOOL focused; + BOOL use_xinput; BOOL mouse_active; BOOL suppress_output; BOOL fullscreen_toggle; @@ -173,8 +165,8 @@ struct xf_info BOOL use_xinput; }; -void xf_create_window(xfInfo* xfi); -void xf_toggle_fullscreen(xfInfo* xfi); +void xf_create_window(xfContext* xfc); +void xf_toggle_fullscreen(xfContext* xfc); BOOL xf_post_connect(freerdp* instance); enum XF_EXIT_CODE @@ -218,10 +210,10 @@ enum XF_EXIT_CODE XF_EXIT_UNKNOWN = 255, }; -void xf_lock_x11(xfInfo* xfi, BOOL display); -void xf_unlock_x11(xfInfo* xfi, BOOL display); +void xf_lock_x11(xfContext* xfc, BOOL display); +void xf_unlock_x11(xfContext* xfc, BOOL display); -void xf_draw_screen_scaled(xfInfo* xfi, int x, int y, int w, int h, BOOL scale); +void xf_draw_screen_scaled(xfContext* xfc, int x, int y, int w, int h, BOOL scale); void xf_transform_window(xfInfo* xfi); DWORD xf_exit_code_from_disconnect_reason(DWORD reason); diff --git a/client/common/client.c b/client/common/client.c index 0629d7a70..acc47d064 100644 --- a/client/common/client.c +++ b/client/common/client.c @@ -21,4 +21,126 @@ #include "config.h" #endif +#include +#include +#include + +int freerdp_client_common_new(freerdp* instance, rdpContext* context) +{ + RDP_CLIENT_ENTRY_POINTS* pEntryPoints = instance->pClientEntryPoints; + return pEntryPoints->ClientNew(instance, context); +} + +void freerdp_client_common_free(freerdp* instance, rdpContext* context) +{ + RDP_CLIENT_ENTRY_POINTS* pEntryPoints = instance->pClientEntryPoints; + pEntryPoints->ClientFree(instance, context); +} + +/* Common API */ + +rdpContext* freerdp_client_context_new(RDP_CLIENT_ENTRY_POINTS* pEntryPoints) +{ + freerdp* instance; + rdpContext* context; + + pEntryPoints->GlobalInit(); + + instance = freerdp_new(); + instance->ContextSize = pEntryPoints->ContextSize; + instance->ContextNew = freerdp_client_common_new; + instance->ContextFree = freerdp_client_common_free; + instance->pClientEntryPoints = (RDP_CLIENT_ENTRY_POINTS*) malloc(pEntryPoints->Size); + CopyMemory(instance->pClientEntryPoints, pEntryPoints, pEntryPoints->Size); + freerdp_context_new(instance); + + context = instance->context; + context->instance = instance; + context->settings = instance->settings; + + return context; +} + +void freerdp_client_context_free(rdpContext* context) +{ + freerdp* instance = context->instance; + + freerdp_context_free(instance); + freerdp_free(instance); +} + +int freerdp_client_start(rdpContext* context) +{ + RDP_CLIENT_ENTRY_POINTS* pEntryPoints = context->instance->pClientEntryPoints; + return pEntryPoints->ClientStart(context); +} + +int freerdp_client_stop(rdpContext* context) +{ + RDP_CLIENT_ENTRY_POINTS* pEntryPoints = context->instance->pClientEntryPoints; + return pEntryPoints->ClientStop(context); +} + +freerdp* freerdp_client_get_instance(rdpContext* context) +{ + return context->instance; +} + +HANDLE freerdp_client_get_thread(rdpContext* context) +{ + return ((rdpClientContext*) context)->thread; +} + +int freerdp_client_parse_command_line(rdpContext* context, int argc, char** argv) +{ + int status; + rdpSettings* settings; + + context->argc = argc; + context->argv = argv; + + if (context->argc < 1) + return 0; + + if (!context->argv) + return -1; + + settings = context->settings; + + status = freerdp_client_parse_command_line_arguments(context->argc, context->argv, settings); + + if (settings->ConnectionFile) + { + rdpFile* file = freerdp_client_rdp_file_new(); + freerdp_client_parse_rdp_file(file, settings->ConnectionFile); + freerdp_client_populate_settings_from_rdp_file(file, settings); + freerdp_client_rdp_file_free(file); + } + + return status; +} + +int freerdp_client_parse_connection_file(rdpContext* context, char* filename) +{ + rdpFile* file; + + file = freerdp_client_rdp_file_new(); + freerdp_client_parse_rdp_file(file, filename); + freerdp_client_populate_settings_from_rdp_file(file, context->settings); + freerdp_client_rdp_file_free(file); + + return 0; +} + +int freerdp_client_parse_connection_file_buffer(rdpContext* context, BYTE* buffer, size_t size) +{ + rdpFile* file; + + file = freerdp_client_rdp_file_new(); + freerdp_client_parse_rdp_file_buffer(file, buffer, size); + freerdp_client_populate_settings_from_rdp_file(file, context->settings); + freerdp_client_rdp_file_free(file); + + return 0; +} diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 4df22482b..91c1a623c 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -959,32 +959,10 @@ BOOL freerdp_client_detect_command_line(int argc, char** argv, DWORD* flags) return compatibility; } -int freerdp_client_parse_command_line_arguments(int argc, char** argv, rdpSettings* settings) +int freerdp_client_command_line_status_print(int argc, char** argv, rdpSettings* settings, int status) { - char* p; - char* str; - int length; - int status; - DWORD flags; - BOOL compatibility; COMMAND_LINE_ARGUMENT_A* arg; - freerdp_register_addin_provider(freerdp_channels_load_static_addin_entry, 0); - - compatibility = freerdp_client_detect_command_line(argc, argv, &flags); - - if (compatibility) - { - fprintf(stderr, "WARNING: Using deprecated command-line interface!\n"); - return freerdp_client_parse_old_command_line_arguments(argc, argv, settings); - } - else - { - CommandLineClearArgumentsA(args); - status = CommandLineParseArgumentsA(argc, (const char**) argv, args, flags, settings, - freerdp_client_command_line_pre_filter, freerdp_client_command_line_post_filter); - } - if (status == COMMAND_LINE_STATUS_PRINT_HELP) { freerdp_client_print_command_line_help(argc, argv); @@ -1035,13 +1013,36 @@ int freerdp_client_parse_command_line_arguments(int argc, char** argv, rdpSettin return COMMAND_LINE_STATUS_PRINT; } - arg = CommandLineFindArgumentA(args, "v"); + return 0; +} - if (!settings->ConnectionFile && !(arg->Flags & COMMAND_LINE_VALUE_PRESENT)) +int freerdp_client_parse_command_line_arguments(int argc, char** argv, rdpSettings* settings) +{ + char* p; + char* str; + int length; + int status; + DWORD flags; + BOOL compatibility; + COMMAND_LINE_ARGUMENT_A* arg; + + freerdp_register_addin_provider(freerdp_channels_load_static_addin_entry, 0); + + compatibility = freerdp_client_detect_command_line(argc, argv, &flags); + + if (compatibility) { - //fprintf(stderr, "error: server hostname was not specified with /v:[:port]\n"); - //return COMMAND_LINE_ERROR_MISSING_ARGUMENT; + fprintf(stderr, "WARNING: Using deprecated command-line interface!\n"); + return freerdp_client_parse_old_command_line_arguments(argc, argv, settings); } + else + { + CommandLineClearArgumentsA(args); + status = CommandLineParseArgumentsA(argc, (const char**) argv, args, flags, settings, + freerdp_client_command_line_pre_filter, freerdp_client_command_line_post_filter); + } + + arg = CommandLineFindArgumentA(args, "v"); arg = args; diff --git a/client/iOS/FreeRDP/ios_freerdp.m b/client/iOS/FreeRDP/ios_freerdp.m index a5aeafd66..4196c955a 100644 --- a/client/iOS/FreeRDP/ios_freerdp.m +++ b/client/iOS/FreeRDP/ios_freerdp.m @@ -249,7 +249,7 @@ ios_run_freerdp(freerdp * instance) #pragma mark - #pragma mark Context callbacks -void ios_context_new(freerdp* instance, rdpContext* context) +int ios_context_new(freerdp* instance, rdpContext* context) { mfInfo* mfi = (mfInfo*)calloc(1, sizeof(mfInfo)); ((mfContext*) context)->mfi = mfi; @@ -260,6 +260,7 @@ void ios_context_new(freerdp* instance, rdpContext* context) mfi->context = (mfContext*)context; mfi->context->settings = instance->settings; mfi->instance = instance; + return 0; } void ios_context_free(freerdp* instance, rdpContext* context) @@ -284,7 +285,7 @@ freerdp* ios_freerdp_new() inst->VerifyChangedCertificate = ios_ui_check_changed_certificate; inst->ReceiveChannelData = ios_receive_channel_data; - inst->context_size = sizeof(mfContext); + inst->ContextSize = sizeof(mfContext); inst->ContextNew = ios_context_new; inst->ContextFree = ios_context_free; freerdp_context_new(inst); diff --git a/cmake/FindXrender.cmake b/cmake/FindXrender.cmake index 7e8ca3e35..efcf72595 100644 --- a/cmake/FindXrender.cmake +++ b/cmake/FindXrender.cmake @@ -36,8 +36,10 @@ include(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(Xrender DEFAULT_MSG XRENDER_LIBRARY XRENDER_INCLUDE_DIR) if(XRENDER_FOUND) -set(XRENDER_LIBRARIES ${XRENDER_LIBRARY}) -set(XRENDER_INCLUDE_DIRS ${XRENDER_INCLUDE_DIR}) + + set(XRENDER_LIBRARIES ${XRENDER_LIBRARY}) + set(XRENDER_INCLUDE_DIRS ${XRENDER_INCLUDE_DIR}) + endif() mark_as_advanced(XRENDER_INCLUDE_DIR XRENDER_LIBRARY) diff --git a/cmake/MergeStaticLibs.cmake b/cmake/MergeStaticLibs.cmake new file mode 100644 index 000000000..a0673fa7e --- /dev/null +++ b/cmake/MergeStaticLibs.cmake @@ -0,0 +1,130 @@ + +# Copyright (C) 2012 Modelon AB + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the BSD style license. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# FMILIB_License.txt file for more details. + +# You should have received a copy of the FMILIB_License.txt file +# along with this program. If not, contact Modelon AB . + +# Merge_static_libs(outlib lib1 lib2 ... libn) merges a number of static +# libs into a single static library +function(merge_static_libs outlib) + set(libs ${ARGV}) + list(REMOVE_AT libs 0) +# Create a dummy file that the target will depend on + set(dummyfile ${CMAKE_CURRENT_BINARY_DIR}/${outlib}_dummy.c) + file(WRITE ${dummyfile} "const char * dummy = \"${dummyfile}\";") + + add_library(${outlib} STATIC ${dummyfile}) + + if("${CMAKE_CFG_INTDIR}" STREQUAL ".") + set(multiconfig FALSE) + else() + set(multiconfig TRUE) + endif() + +# First get the file names of the libraries to be merged + foreach(lib ${libs}) + get_target_property(libtype ${lib} TYPE) + if(NOT libtype STREQUAL "STATIC_LIBRARY") + message(FATAL_ERROR "Merge_static_libs can only process static libraries") + endif() + if(multiconfig) + foreach(CONFIG_TYPE ${CMAKE_CONFIGURATION_TYPES}) + get_target_property("libfile_${CONFIG_TYPE}" ${lib} "LOCATION_${CONFIG_TYPE}") + list(APPEND libfiles_${CONFIG_TYPE} ${libfile_${CONFIG_TYPE}}) + endforeach() + else() + get_target_property(libfile ${lib} LOCATION) + list(APPEND libfiles "${libfile}") + endif(multiconfig) + endforeach() + #message(STATUS "will be merging ${libfiles}") +# Just to be sure: cleanup from duplicates + if(multiconfig) + foreach(CONFIG_TYPE ${CMAKE_CONFIGURATION_TYPES}) + list(REMOVE_DUPLICATES libfiles_${CONFIG_TYPE}) + set(libfiles ${libfiles} ${libfiles_${CONFIG_TYPE}}) + endforeach() + endif() + list(REMOVE_DUPLICATES libfiles) + +# Now the easy part for MSVC and for MAC + if(MSVC) + # lib.exe does the merging of libraries just need to conver the list into string + foreach(CONFIG_TYPE ${CMAKE_CONFIGURATION_TYPES}) + set(flags "") + foreach(lib ${libfiles_${CONFIG_TYPE}}) + set(flags "${flags} ${lib}") + endforeach() + string(TOUPPER "STATIC_LIBRARY_FLAGS_${CONFIG_TYPE}" PROPNAME) + set_target_properties(${outlib} PROPERTIES ${PROPNAME} "${flags}") + endforeach() + + elseif(APPLE) + # Use OSX's libtool to merge archives + if(multiconfig) + message(FATAL_ERROR "Multiple configurations are not supported") + endif() + get_target_property(outfile ${outlib} LOCATION) + add_custom_command(TARGET ${outlib} POST_BUILD + COMMAND rm ${outfile} + COMMAND /usr/bin/libtool -static -o ${outfile} + ${libfiles} + ) + else() + # general UNIX - need to "ar -x" and then "ar -ru" + if(multiconfig) + message(FATAL_ERROR "Multiple configurations are not supported") + endif() + get_target_property(outfile ${outlib} LOCATION) + message(STATUS "outfile location is ${outfile}") + foreach(lib ${libfiles}) +# objlistfile will contain the list of object files for the library + set(objlistfile ${lib}.objlist) + set(objdir ${lib}.objdir) + set(objlistcmake ${objlistfile}.cmake) +# we only need to extract files once + if(${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/cmake.check_cache IS_NEWER_THAN ${objlistcmake}) +#--------------------------------- + FILE(WRITE ${objlistcmake} +"# Extract object files from the library +message(STATUS \"Extracting object files from ${lib}\") +EXECUTE_PROCESS(COMMAND ${CMAKE_AR} -x ${lib} + WORKING_DIRECTORY ${objdir}) +# save the list of object files +EXECUTE_PROCESS(COMMAND ls . + OUTPUT_FILE ${objlistfile} + WORKING_DIRECTORY ${objdir})") +#--------------------------------- + file(MAKE_DIRECTORY ${objdir}) + add_custom_command( + OUTPUT ${objlistfile} + COMMAND ${CMAKE_COMMAND} -P ${objlistcmake} + DEPENDS ${lib}) + endif() + list(APPEND extrafiles "${objlistfile}") + # relative path is needed by ar under MSYS + file(RELATIVE_PATH objlistfilerpath ${objdir} ${objlistfile}) + add_custom_command(TARGET ${outlib} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E echo "Running: ${CMAKE_AR} ru ${outfile} @${objlistfilerpath}" + COMMAND ${CMAKE_AR} ru "${outfile}" @"${objlistfilerpath}" + WORKING_DIRECTORY ${objdir}) + endforeach() + add_custom_command(TARGET ${outlib} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E echo "Running: ${CMAKE_RANLIB} ${outfile}" + COMMAND ${CMAKE_RANLIB} ${outfile}) + endif() + file(WRITE ${dummyfile}.base "const char* ${outlib}_sublibs=\"${libs}\";") + add_custom_command( + OUTPUT ${dummyfile} + COMMAND ${CMAKE_COMMAND} -E copy ${dummyfile}.base ${dummyfile} + DEPENDS ${libs} ${extrafiles}) + +endfunction() diff --git a/config.h.in b/config.h.in old mode 100644 new mode 100755 index 864ebda6e..63de66d8d --- a/config.h.in +++ b/config.h.in @@ -27,6 +27,7 @@ #cmakedefine HAVE_INTTYPES_H #cmakedefine HAVE_SYS_MODEM_H #cmakedefine HAVE_SYS_FILIO_H +#cmakedefine HAVE_SYS_SELECT_H #cmakedefine HAVE_SYS_STRTIO_H #cmakedefine HAVE_EVENTFD_H #cmakedefine HAVE_TM_GMTOFF @@ -67,6 +68,7 @@ #cmakedefine WITH_DEBUG_RFX #cmakedefine WITH_DEBUG_SCARD #cmakedefine WITH_DEBUG_SVC +#cmakedefine WITH_DEBUG_RDPEI #cmakedefine WITH_DEBUG_TIMEZONE #cmakedefine WITH_DEBUG_TRANSPORT #cmakedefine WITH_DEBUG_WND diff --git a/include/freerdp/client.h b/include/freerdp/client.h index 1a30a1a1e..e3f7b2eb0 100644 --- a/include/freerdp/client.h +++ b/include/freerdp/client.h @@ -20,8 +20,6 @@ #ifndef FREERDP_CLIENT_H #define FREERDP_CLIENT_H -typedef struct rdp_client rdpClient; - #include #include @@ -29,17 +27,17 @@ typedef struct rdp_client rdpClient; extern "C" { #endif -#define FREERDP_WINDOW_STATE_NORMAL 0 -#define FREERDP_WINDOW_STATE_MINIMIZED 1 -#define FREERDP_WINDOW_STATE_MAXIMIZED 2 -#define FREERDP_WINDOW_STATE_FULLSCREEN 3 -#define FREERDP_WINDOW_STATE_ACTIVE 4 +/** + * Client Entry Points + */ -typedef void (*pOnResizeWindow)(freerdp* instance, int width, int height); -typedef void (*pOnWindowStateChange)(freerdp* instance, int state); -typedef void (*pOnErrorInfo)(freerdp* instance, UINT32 code); -typedef void (*pOnParamChange)(freerdp* instance, int id); +typedef void (*pRdpGlobalInit)(void); +typedef void (*pRdpGlobalUninit)(void); +typedef int (*pRdpClientNew)(freerdp* instance, rdpContext* context); +typedef void (*pRdpClientFree)(freerdp* instance, rdpContext* context); + +/* typedef void (*pOnPan)(freerdp* instance, int xdiff, int ydiff); struct rdp_client @@ -49,26 +47,58 @@ struct rdp_client pOnErrorInfo OnErrorInfo; pOnParamChange OnParamChange; pOnPan OnPan; +*/ + + +typedef int (*pRdpClientStart)(rdpContext* context); +typedef int (*pRdpClientStop)(rdpContext* context); + +struct rdp_client_entry_points_v1 +{ + DWORD Size; + DWORD Version; + + pRdpGlobalInit GlobalInit; + pRdpGlobalUninit GlobalUninit; + + DWORD ContextSize; + pRdpClientNew ClientNew; + pRdpClientFree ClientFree; + + pRdpClientStart ClientStart; + pRdpClientStop ClientStop; }; -/** - * Generic Client Interface - */ +#define RDP_CLIENT_INTERFACE_VERSION 1 +#define RDP_CLIENT_ENTRY_POINT_NAME "RdpClientEntry" -#if 0 +typedef int (*pRdpClientEntry)(RDP_CLIENT_ENTRY_POINTS* pEntryPoints); -#define cfInfo void* +/* Common Client Interface */ -FREERDP_API int freerdp_client_global_init(); -FREERDP_API int freerdp_client_global_uninit(); +#define DEFINE_RDP_CLIENT_COMMON() \ + HANDLE thread -FREERDP_API int freerdp_client_start(cfInfo* cfi); -FREERDP_API int freerdp_client_stop(cfInfo* cfi); +struct rdp_client_context +{ + rdpContext context; + DEFINE_RDP_CLIENT_COMMON(); +}; -FREERDP_API cfInfo* freerdp_client_new(int argc, char** argv); -FREERDP_API void freerdp_client_free(cfInfo* cfi); +/* Common client functions */ -#endif +FREERDP_API rdpContext* freerdp_client_context_new(RDP_CLIENT_ENTRY_POINTS* pEntryPoints); +FREERDP_API void freerdp_client_context_free(rdpContext* context); + +FREERDP_API int freerdp_client_start(rdpContext* context); +FREERDP_API int freerdp_client_stop(rdpContext* context); + +FREERDP_API freerdp* freerdp_client_get_instance(rdpContext* context); +FREERDP_API HANDLE freerdp_client_get_thread(rdpContext* context); + +FREERDP_API int freerdp_client_parse_command_line(rdpContext* context, int argc, char** argv); +FREERDP_API int freerdp_client_parse_connection_file(rdpContext* context, char* filename); +FREERDP_API int freerdp_client_parse_connection_file_buffer(rdpContext* context, BYTE* buffer, size_t size); #ifdef __cplusplus } diff --git a/include/freerdp/client/cmdline.h b/include/freerdp/client/cmdline.h index e0a424e7e..8e4ab21ed 100644 --- a/include/freerdp/client/cmdline.h +++ b/include/freerdp/client/cmdline.h @@ -28,6 +28,7 @@ extern "C" { #endif FREERDP_API int freerdp_client_parse_command_line_arguments(int argc, char** argv, rdpSettings* settings); +FREERDP_API int freerdp_client_command_line_status_print(int argc, char** argv, rdpSettings* settings, int status); FREERDP_API int freerdp_client_load_addins(rdpChannels* channels, rdpSettings* settings); FREERDP_API int freerdp_client_print_version(void); diff --git a/include/freerdp/client/rdpei.h b/include/freerdp/client/rdpei.h index a38c940dc..d7881b11c 100644 --- a/include/freerdp/client/rdpei.h +++ b/include/freerdp/client/rdpei.h @@ -66,9 +66,9 @@ typedef struct _rdpei_client_context RdpeiClientContext; typedef int (*pcRdpeiGetVersion)(RdpeiClientContext* context); typedef int (*pcRdpeiAddContact)(RdpeiClientContext* context, RDPINPUT_CONTACT_DATA* contact); -typedef int (*pcRdpeiContactBegin)(RdpeiClientContext* context, int externalId); -typedef int (*pcRdpeiContactUpdate)(RdpeiClientContext* context, int externalId); -typedef int (*pcRdpeiContactEnd)(RdpeiClientContext* context, int externalId); +typedef int (*pcRdpeiTouchBegin)(RdpeiClientContext* context, int externalId, int x, int y); +typedef int (*pcRdpeiTouchUpdate)(RdpeiClientContext* context, int externalId, int x, int y); +typedef int (*pcRdpeiTouchEnd)(RdpeiClientContext* context, int externalId, int x, int y); struct _rdpei_client_context { @@ -78,9 +78,10 @@ struct _rdpei_client_context pcRdpeiGetVersion GetVersion; pcRdpeiAddContact AddContact; - pcRdpeiContactBegin ContactBegin; - pcRdpeiContactUpdate ContactUpdate; - pcRdpeiContactEnd ContactEnd; + + pcRdpeiTouchBegin TouchBegin; + pcRdpeiTouchUpdate TouchUpdate; + pcRdpeiTouchEnd TouchEnd; }; #endif /* FREERDP_CHANNEL_CLIENT_RDPEI_H */ diff --git a/include/freerdp/event.h b/include/freerdp/event.h new file mode 100644 index 000000000..7753e133d --- /dev/null +++ b/include/freerdp/event.h @@ -0,0 +1,66 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Event Definitions + * + * 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 FREERDP_EVENT_H +#define FREERDP_EVENT_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define FREERDP_WINDOW_STATE_NORMAL 0 +#define FREERDP_WINDOW_STATE_MINIMIZED 1 +#define FREERDP_WINDOW_STATE_MAXIMIZED 2 +#define FREERDP_WINDOW_STATE_FULLSCREEN 3 +#define FREERDP_WINDOW_STATE_ACTIVE 4 + +DEFINE_EVENT_BEGIN(WindowStateChange) + int state; +DEFINE_EVENT_END(WindowStateChange) + +DEFINE_EVENT_BEGIN(ResizeWindow) + int width; + int height; +DEFINE_EVENT_END(ResizeWindow) + +DEFINE_EVENT_BEGIN(EmbedWindow) + BOOL embed; + void* handle; +DEFINE_EVENT_END(EmbedWindow) + +DEFINE_EVENT_BEGIN(ErrorInfo) + UINT32 code; +DEFINE_EVENT_END(ErrorInfo) + +DEFINE_EVENT_BEGIN(ParamChange) + int id; +DEFINE_EVENT_END(ParamChange) + +DEFINE_EVENT_BEGIN(Terminate) + int code; +DEFINE_EVENT_END(Terminate) + +#ifdef __cplusplus +} +#endif + +#endif /* FREERDP_EVENT_H */ diff --git a/include/freerdp/freerdp.h b/include/freerdp/freerdp.h index 1c531d992..214c2f719 100644 --- a/include/freerdp/freerdp.h +++ b/include/freerdp/freerdp.h @@ -31,16 +31,19 @@ typedef struct rdp_freerdp freerdp; typedef struct rdp_context rdpContext; typedef struct rdp_freerdp_peer freerdp_peer; +typedef struct rdp_client_context rdpClientContext; +typedef struct rdp_client_entry_points_v1 RDP_CLIENT_ENTRY_POINTS_V1; +typedef RDP_CLIENT_ENTRY_POINTS_V1 RDP_CLIENT_ENTRY_POINTS; + #include #include #include +#include #include #include #include -#include - #include #include #include @@ -49,7 +52,7 @@ typedef struct rdp_freerdp_peer freerdp_peer; extern "C" { #endif -typedef void (*pContextNew)(freerdp* instance, rdpContext* context); +typedef int (*pContextNew)(freerdp* instance, rdpContext* context); typedef void (*pContextFree)(freerdp* instance, rdpContext* context); typedef BOOL (*pPreConnect)(freerdp* instance); @@ -73,46 +76,52 @@ typedef int (*pOnChannelDisconnected)(freerdp* instance, const char* name, void* */ struct rdp_context { - freerdp* instance; /**< (offset 0) + ALIGN64 freerdp* instance; /**< (offset 0) Pointer to a rdp_freerdp structure. This is a back-link to retrieve the freerdp instance from the context. It is set by the freerdp_context_new() function */ - freerdp_peer* peer; /**< (offset 1) + ALIGN64 freerdp_peer* peer; /**< (offset 1) Pointer to the client peer. This is set by a call to freerdp_peer_context_new() during peer initialization. This field is used only on the server side. */ - UINT32 paddingA[16 - 2]; /* 2 */ + UINT64 paddingA[16 - 2]; /* 2 */ - int argc; /**< (offset 16) + ALIGN64 int argc; /**< (offset 16) Number of arguments given to the program at launch time. Used to keep this data available and used later on, typically just before connection initialization. @see freerdp_parse_args() */ - char** argv; /**< (offset 17) + ALIGN64 char** argv; /**< (offset 17) List of arguments given to the program at launch time. Used to keep this data available and used later on, typically just before connection initialization. @see freerdp_parse_args() */ - UINT32 paddingB[32 - 18]; /* 18 */ + ALIGN64 wPubSub* pubSub; /* (offset 18) */ - rdpRdp* rdp; /**< (offset 32) + UINT64 paddingB[32 - 19]; /* 19 */ + + ALIGN64 rdpRdp* rdp; /**< (offset 32) Pointer to a rdp_rdp structure used to keep the connection's parameters. It is allocated by freerdp_context_new() and deallocated by freerdp_context_free(), at the same time that this rdp_context structure - there is no need to specifically allocate/deallocate this. */ - rdpGdi* gdi; /**< (offset 33) + ALIGN64 rdpGdi* gdi; /**< (offset 33) Pointer to a rdp_gdi structure used to keep the gdi settings. It is allocated by gdi_init() and deallocated by gdi_free(). It must be deallocated before deallocating this rdp_context structure. */ - rdpRail* rail; /* 34 */ - rdpCache* cache; /* 35 */ - rdpChannels* channels; /* 36 */ - rdpGraphics* graphics; /* 37 */ - rdpInput* input; /* 38 */ - rdpUpdate* update; /* 39 */ - rdpSettings* settings; /* 40 */ - rdpClient* client; /* 41 */ - UINT32 paddingC[64 - 42]; /* 42 */ + ALIGN64 rdpRail* rail; /* 34 */ + ALIGN64 rdpCache* cache; /* 35 */ + ALIGN64 rdpChannels* channels; /* 36 */ + ALIGN64 rdpGraphics* graphics; /* 37 */ + ALIGN64 rdpInput* input; /* 38 */ + ALIGN64 rdpUpdate* update; /* 39 */ + ALIGN64 rdpSettings* settings; /* 40 */ + UINT64 paddingC[64 - 41]; /* 41 */ + + UINT64 paddingD[96 - 64]; /* 64 */ + UINT64 paddingE[128 - 96]; /* 96 */ }; +#include + /** Defines the options for a given instance of RDP connection. * This is built by the client and given to the FreeRDP library to create the connection * with the expected options. @@ -121,29 +130,31 @@ struct rdp_context */ struct rdp_freerdp { - rdpContext* context; /**< (offset 0) + ALIGN64 rdpContext* context; /**< (offset 0) Pointer to a rdpContext structure. - Client applications can use the context_size field to register a context bigger than the rdpContext + Client applications can use the ContextSize field to register a context bigger than the rdpContext structure. This allow clients to use additional context information. When using this capability, client application should ALWAYS declare their structure with the rdpContext field first, and any additional content following it. Can be allocated by a call to freerdp_context_new(). Must be deallocated by a call to freerdp_context_free() before deallocating the current instance. */ - UINT32 paddingA[16 - 1]; /* 1 */ + ALIGN64 RDP_CLIENT_ENTRY_POINTS* pClientEntryPoints; - rdpInput* input; /* (offset 16) + UINT64 paddingA[16 - 2]; /* 2 */ + + ALIGN64 rdpInput* input; /* (offset 16) Input handle for the connection. Will be initialized by a call to freerdp_context_new() */ - rdpUpdate* update; /* (offset 17) + ALIGN64 rdpUpdate* update; /* (offset 17) Update display parameters. Used to register display events callbacks and settings. Will be initialized by a call to freerdp_context_new() */ - rdpSettings* settings; /**< (offset 18) + ALIGN64 rdpSettings* settings; /**< (offset 18) Pointer to a rdpSettings structure. Will be used to maintain the required RDP settings. Will be initialized by a call to freerdp_context_new() */ - UINT32 paddingB[32 - 19]; /* 19 */ + UINT64 paddingB[32 - 19]; /* 19 */ - size_t context_size; /* (offset 32) + ALIGN64 size_t ContextSize; /* (offset 32) Specifies the size of the 'context' field. freerdp_context_new() will use this size to allocate the context buffer. freerdp_new() sets it to sizeof(rdpContext). If modifying it, there should always be a minimum of sizeof(rdpContext), as the freerdp library will assume it can use the @@ -152,58 +163,58 @@ struct rdp_freerdp adding additional information after that. */ - pContextNew ContextNew; /**< (offset 33) + ALIGN64 pContextNew ContextNew; /**< (offset 33) Callback for context allocation Can be set before calling freerdp_context_new() to have it executed after allocation and initialization. Must be set to NULL if not needed. */ - pContextFree ContextFree; /**< (offset 34) + ALIGN64 pContextFree ContextFree; /**< (offset 34) Callback for context deallocation Can be set before calling freerdp_context_free() to have it executed before deallocation. Must be set to NULL if not needed. */ - UINT32 paddingC[48 - 35]; /* 35 */ + UINT64 paddingC[48 - 35]; /* 35 */ - pPreConnect PreConnect; /**< (offset 48) + ALIGN64 pPreConnect PreConnect; /**< (offset 48) Callback for pre-connect operations. Can be set before calling freerdp_connect() to have it executed before the actual connection happens. Must be set to NULL if not needed. */ - pPostConnect PostConnect; /**< (offset 49) + ALIGN64 pPostConnect PostConnect; /**< (offset 49) Callback for post-connect operations. Can be set before calling freerdp_connect() to have it executed after the actual connection has succeeded. Must be set to NULL if not needed. */ - pAuthenticate Authenticate; /**< (offset 50) + ALIGN64 pAuthenticate Authenticate; /**< (offset 50) Callback for authentication. It is used to get the username/password when it was not provided at connection time. */ - pVerifyCertificate VerifyCertificate; /**< (offset 51) + ALIGN64 pVerifyCertificate VerifyCertificate; /**< (offset 51) Callback for certificate validation. Used to verify that an unknown certificate is trusted. */ - pVerifyChangedCertificate VerifyChangedCertificate; /**< (offset 52) + ALIGN64 pVerifyChangedCertificate VerifyChangedCertificate; /**< (offset 52) Callback for changed certificate validation. Used when a certificate differs from stored fingerprint. If returns TRUE, the new fingerprint will be trusted and old thrown out. */ - pLogonErrorInfo LogonErrorInfo; /**< (offset 53) Callback for logon error info, important for logon system messages with RemoteApp */ + ALIGN64 pLogonErrorInfo LogonErrorInfo; /**< (offset 53) Callback for logon error info, important for logon system messages with RemoteApp */ - UINT32 paddingD[64 - 54]; /* 54 */ + UINT64 paddingD[64 - 54]; /* 54 */ - pSendChannelData SendChannelData; /* (offset 64) + ALIGN64 pSendChannelData SendChannelData; /* (offset 64) Callback for sending data to a channel. By default, it is set by freerdp_new() to freerdp_send_channel_data(), which eventually calls freerdp_channel_send() */ - pReceiveChannelData ReceiveChannelData; /* (offset 65) + ALIGN64 pReceiveChannelData ReceiveChannelData; /* (offset 65) Callback for receiving data from a channel. This is called by freerdp_channel_process() (if not NULL). Clients will typically use a function that calls freerdp_channels_data() to perform the needed tasks. */ - pOnChannelConnected OnChannelConnected; - pOnChannelDisconnected OnChannelDisconnected; + ALIGN64 pOnChannelConnected OnChannelConnected; + ALIGN64 pOnChannelDisconnected OnChannelDisconnected; - UINT32 paddingE[80 - 66]; /* 66 */ + UINT64 paddingE[80 - 66]; /* 66 */ }; -FREERDP_API void freerdp_context_new(freerdp* instance); +FREERDP_API int freerdp_context_new(freerdp* instance); FREERDP_API void freerdp_context_free(freerdp* instance); FREERDP_API BOOL freerdp_connect(freerdp* instance); @@ -226,6 +237,7 @@ FREERDP_API freerdp* freerdp_new(void); FREERDP_API void freerdp_free(freerdp* instance); FREERDP_API BOOL freerdp_focus_required(freerdp* instance); + #ifdef __cplusplus } #endif diff --git a/include/freerdp/peer.h b/include/freerdp/peer.h index 7c9058b33..6279c92bc 100644 --- a/include/freerdp/peer.h +++ b/include/freerdp/peer.h @@ -54,7 +54,7 @@ struct rdp_freerdp_peer rdpUpdate* update; rdpSettings* settings; - size_t context_size; + size_t ContextSize; psPeerContextNew ContextNew; psPeerContextFree ContextFree; diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index ee0accc3c..9ad84d4ad 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -653,6 +653,7 @@ typedef struct _RDPDR_PARALLEL RDPDR_PARALLEL; #define FreeRDP_SaltedChecksum 2309 #define FreeRDP_LongCredentialsSupported 2310 #define FreeRDP_NoBitmapCompressionHeader 2311 +#define FreeRDP_BitmapCompressionDisabled 2312 #define FreeRDP_DesktopResize 2368 #define FreeRDP_DrawAllowDynamicColorFidelity 2369 #define FreeRDP_DrawAllowColorSubsampling 2370 @@ -1062,7 +1063,8 @@ struct rdp_settings ALIGN64 BOOL SaltedChecksum; /* 2309 */ ALIGN64 BOOL LongCredentialsSupported; /* 2310 */ ALIGN64 BOOL NoBitmapCompressionHeader; /* 2311 */ - UINT64 padding2368[2368 - 2312]; /* 2312 */ + ALIGN64 BOOL BitmapCompressionDisabled; /* 2312 */ + UINT64 padding2368[2368 - 2313]; /* 2313 */ /* Bitmap Capabilities */ ALIGN64 BOOL DesktopResize; /* 2368 */ diff --git a/libfreerdp/common/settings.c b/libfreerdp/common/settings.c index 638de3260..ff3691cc9 100644 --- a/libfreerdp/common/settings.c +++ b/libfreerdp/common/settings.c @@ -602,6 +602,10 @@ BOOL freerdp_get_param_bool(rdpSettings* settings, int id) return settings->NoBitmapCompressionHeader; break; + case FreeRDP_BitmapCompressionDisabled: + return settings->BitmapCompressionDisabled; + break; + case FreeRDP_DesktopResize: return settings->DesktopResize; break; @@ -748,6 +752,9 @@ BOOL freerdp_get_param_bool(rdpSettings* settings, int id) int freerdp_set_param_bool(rdpSettings* settings, int id, BOOL param) { + ParamChangeEventArgs e; + rdpContext* context = ((freerdp*) settings->instance)->context; + switch (id) { case FreeRDP_ServerMode: @@ -1050,6 +1057,10 @@ int freerdp_set_param_bool(rdpSettings* settings, int id, BOOL param) settings->NoBitmapCompressionHeader = param; break; + case FreeRDP_BitmapCompressionDisabled: + settings->BitmapCompressionDisabled = param; + break; + case FreeRDP_DesktopResize: settings->DesktopResize = param; break; @@ -1193,7 +1204,10 @@ int freerdp_set_param_bool(rdpSettings* settings, int id, BOOL param) // Mark field as modified settings->settings_modified[id] = 1; - IFCALL(((freerdp*) settings->instance)->context->client->OnParamChange, ((freerdp*) settings->instance), id); + + EventArgsInit(&e, "freerdp"); + e.id = id; + PubSub_OnParamChange(context->pubSub, context->instance, &e); return -1; } @@ -1516,6 +1530,9 @@ UINT32 freerdp_get_param_uint32(rdpSettings* settings, int id) int freerdp_set_param_uint32(rdpSettings* settings, int id, UINT32 param) { + ParamChangeEventArgs e; + rdpContext* context = ((freerdp*) settings->instance)->context; + switch (id) { case FreeRDP_ShareId: @@ -1829,7 +1846,10 @@ int freerdp_set_param_uint32(rdpSettings* settings, int id, UINT32 param) // Mark field as modified settings->settings_modified[id] = 1; - IFCALL(((freerdp*) settings->instance)->context->client->OnParamChange, ((freerdp*) settings->instance), id); + + EventArgsInit(&e, "freerdp"); + e.id = id; + PubSub_OnParamChange(context->pubSub, context->instance, &e); return 0; } @@ -1852,6 +1872,9 @@ UINT64 freerdp_get_param_uint64(rdpSettings* settings, int id) int freerdp_set_param_uint64(rdpSettings* settings, int id, UINT64 param) { + ParamChangeEventArgs e; + rdpContext* context = ((freerdp*) settings->instance)->context; + switch (id) { case FreeRDP_ParentWindowId: @@ -1865,7 +1888,10 @@ int freerdp_set_param_uint64(rdpSettings* settings, int id, UINT64 param) // Mark field as modified settings->settings_modified[id] = 1; - IFCALL(((freerdp*) settings->instance)->context->client->OnParamChange, ((freerdp*) settings->instance), id); + + EventArgsInit(&e, "freerdp"); + e.id = id; + PubSub_OnParamChange(context->pubSub, context->instance, &e); return 0; } @@ -2036,6 +2062,9 @@ char* freerdp_get_param_string(rdpSettings* settings, int id) int freerdp_set_param_string(rdpSettings* settings, int id, char* param) { + ParamChangeEventArgs e; + rdpContext* context = ((freerdp*) settings->instance)->context; + switch (id) { case FreeRDP_ServerHostname: @@ -2197,7 +2226,10 @@ int freerdp_set_param_string(rdpSettings* settings, int id, char* param) // Mark field as modified settings->settings_modified[id] = 1; - IFCALL(((freerdp*) settings->instance)->context->client->OnParamChange, ((freerdp*) settings->instance), id); + + EventArgsInit(&e, "freerdp"); + e.id = id; + PubSub_OnParamChange(context->pubSub, context->instance, &e); return 0; } diff --git a/libfreerdp/core/capabilities.c b/libfreerdp/core/capabilities.c index 04df95e42..4d69b4ed7 100644 --- a/libfreerdp/core/capabilities.c +++ b/libfreerdp/core/capabilities.c @@ -448,6 +448,8 @@ BOOL rdp_read_order_capability_set(wStream* s, UINT16 length, rdpSettings* setti UINT16 orderFlags; BYTE orderSupport[32]; UINT16 orderSupportExFlags; + BOOL BitmapCacheV3Enabled = FALSE; + BOOL FrameMarkerCommandEnabled = FALSE; if (length < 88) return FALSE; @@ -476,6 +478,23 @@ BOOL rdp_read_order_capability_set(wStream* s, UINT16 length, rdpSettings* setti settings->OrderSupport[i] = FALSE; } + if (orderFlags & ORDER_FLAGS_EXTRA_SUPPORT) + { + if (orderSupportExFlags & CACHE_BITMAP_V3_SUPPORT) + BitmapCacheV3Enabled = TRUE; + + if (orderSupportExFlags & ALTSEC_FRAME_MARKER_SUPPORT) + FrameMarkerCommandEnabled = TRUE; + } + + if (settings->BitmapCacheV3Enabled && BitmapCacheV3Enabled) + settings->BitmapCacheVersion = 3; + else + settings ->BitmapCacheV3Enabled = FALSE; + + if (settings->FrameMarkerCommandEnabled && !FrameMarkerCommandEnabled) + settings->FrameMarkerCommandEnabled = FALSE; + return TRUE; } diff --git a/libfreerdp/core/freerdp.c b/libfreerdp/core/freerdp.c index b28437ea5..3c77b8e05 100644 --- a/libfreerdp/core/freerdp.c +++ b/libfreerdp/core/freerdp.c @@ -34,6 +34,7 @@ #include #include +#include #include /* connectErrorCode is 'extern' in error.h. See comment there.*/ @@ -188,7 +189,16 @@ BOOL freerdp_check_fds(freerdp* instance) status = rdp_check_fds(rdp); if (status < 0) + { + TerminateEventArgs e; + rdpContext* context = instance->context; + + EventArgsInit(&e, "freerdp"); + e.code = 0; + PubSub_OnTerminate(context->pubSub, context, &e); + return FALSE; + } return TRUE; } @@ -308,6 +318,16 @@ void freerdp_get_version(int* major, int* minor, int* revision) *revision = FREERDP_VERSION_REVISION; } +static wEventType FreeRDP_Events[] = +{ + DEFINE_EVENT_ENTRY(WindowStateChange) + DEFINE_EVENT_ENTRY(ResizeWindow) + DEFINE_EVENT_ENTRY(EmbedWindow) + DEFINE_EVENT_ENTRY(ErrorInfo) + DEFINE_EVENT_ENTRY(ParamChange) + DEFINE_EVENT_ENTRY(Terminate) +}; + /** Allocator function for a rdp context. * The function will allocate a rdpRdp structure using rdp_new(), then copy * its contents to the appropriate fields in the rdp_freerdp structure given in parameters. @@ -316,30 +336,30 @@ void freerdp_get_version(int* major, int* minor, int* revision) * * @param instance - Pointer to the rdp_freerdp structure that will be initialized with the new context. */ -void freerdp_context_new(freerdp* instance) +int freerdp_context_new(freerdp* instance) { rdpRdp* rdp; + rdpContext* context; + + instance->context = (rdpContext*) malloc(instance->ContextSize); + ZeroMemory(instance->context, instance->ContextSize); + context = instance->context; + + context->pubSub = PubSub_New(TRUE); + PubSub_AddEventTypes(context->pubSub, FreeRDP_Events, sizeof(FreeRDP_Events) / sizeof(wEventType)); rdp = rdp_new(instance); - // FIXME - we're not checking where rdp_new returns NULL, and have no way to report an error to the caller - instance->input = rdp->input; instance->update = rdp->update; instance->settings = rdp->settings; - instance->context = (rdpContext*) malloc(instance->context_size); - ZeroMemory(instance->context, instance->context_size); + context->graphics = graphics_new(context); + context->instance = instance; + context->rdp = rdp; - instance->context->graphics = graphics_new(instance->context); - instance->context->instance = instance; - instance->context->rdp = rdp; - - instance->context->input = instance->input; - instance->context->update = instance->update; - instance->context->settings = instance->settings; - - instance->context->client = (rdpClient*) malloc(sizeof(rdpClient)); - ZeroMemory(instance->context->client, sizeof(rdpClient)); + context->input = instance->input; + context->update = instance->update; + context->settings = instance->settings; instance->update->context = instance->context; instance->update->pointer->context = instance->context; @@ -347,11 +367,13 @@ void freerdp_context_new(freerdp* instance) instance->update->secondary->context = instance->context; instance->update->altsec->context = instance->context; - instance->input->context = instance->context; + instance->input->context = context; update_register_client_callbacks(rdp->update); IFCALL(instance->ContextNew, instance, instance->context); + + return 0; } /** Deallocator function for a rdp context. @@ -372,7 +394,7 @@ void freerdp_context_free(freerdp* instance) rdp_free(instance->context->rdp); graphics_free(instance->context->graphics); - free(instance->context->client); + PubSub_Free(instance->context->pubSub); free(instance->context); instance->context = NULL; @@ -395,7 +417,7 @@ freerdp* freerdp_new() if (instance) { ZeroMemory(instance, sizeof(freerdp)); - instance->context_size = sizeof(rdpContext); + instance->ContextSize = sizeof(rdpContext); instance->SendChannelData = freerdp_send_channel_data; } diff --git a/libfreerdp/core/gateway/rpc_client.c b/libfreerdp/core/gateway/rpc_client.c index 0c4908afa..a0afb3438 100644 --- a/libfreerdp/core/gateway/rpc_client.c +++ b/libfreerdp/core/gateway/rpc_client.c @@ -91,6 +91,9 @@ int rpc_client_on_fragment_received_event(rdpRpc* rpc) UINT32 StubLength; wStream* fragment; rpcconn_hdr_t* header; + freerdp* instance; + + instance = (freerdp*) rpc->transport->settings->instance; if (!rpc->client->pdu) rpc->client->pdu = rpc_client_receive_pool_take(rpc); @@ -158,15 +161,21 @@ int rpc_client_on_fragment_received_event(rdpRpc* rpc) if (StubLength == 4) { //fprintf(stderr, "Ignoring TsProxySendToServer Response\n"); - printf("Got stub length 4 with flags %d and callid %d\n", header->common.pfc_flags, header->common.call_id); - - /* received a disconnect request from the server? */ - if (header->common.call_id == rpc->PipeCallId && header->common.pfc_flags & PFC_LAST_FRAG) - { - ((freerdp*)rpc->settings->instance)->context->rdp->disconnect = TRUE; - ((freerdp*)rpc->settings->instance)->context->rdp->transport->tsg->state = TSG_STATE_TUNNEL_CLOSE_PENDING; - } - + printf("Got stub length 4 with flags %d and callid %d\n", header->common.pfc_flags, header->common.call_id); + + /* received a disconnect request from the server? */ + if ((header->common.call_id == rpc->PipeCallId) && (header->common.pfc_flags & PFC_LAST_FRAG)) + { + TerminateEventArgs e; + + instance->context->rdp->disconnect = TRUE; + rpc->transport->tsg->state = TSG_STATE_TUNNEL_CLOSE_PENDING; + + EventArgsInit(&e, "freerdp"); + e.code = 0; + PubSub_OnTerminate(instance->context->pubSub, instance->context, &e); + } + rpc_client_fragment_pool_return(rpc, fragment); return 0; } diff --git a/libfreerdp/core/orders.c b/libfreerdp/core/orders.c index 6fef8dff2..e5cc520b7 100644 --- a/libfreerdp/core/orders.c +++ b/libfreerdp/core/orders.c @@ -831,11 +831,16 @@ BOOL update_read_dstblt_order(wStream* s, ORDER_INFO* orderInfo, DSTBLT_ORDER* d return TRUE; } +int update_approximate_dstblt_order(ORDER_INFO* orderInfo, DSTBLT_ORDER* dstblt) +{ + return 32; +} + BOOL update_write_dstblt_order(wStream* s, ORDER_INFO* orderInfo, DSTBLT_ORDER* dstblt) { orderInfo->fieldFlags = 0; - Stream_EnsureRemainingCapacity(s, 64); + Stream_EnsureRemainingCapacity(s, update_approximate_dstblt_order(orderInfo, dstblt)); orderInfo->fieldFlags |= ORDER_FIELD_01; update_write_coord(s, dstblt->nLeftRect); @@ -867,11 +872,16 @@ BOOL update_read_patblt_order(wStream* s, ORDER_INFO* orderInfo, PATBLT_ORDER* p return update_read_brush(s, &patblt->brush, orderInfo->fieldFlags >> 7); } +int update_approximate_patblt_order(ORDER_INFO* orderInfo, PATBLT_ORDER* patblt) +{ + return 32; +} + BOOL update_write_patblt_order(wStream* s, ORDER_INFO* orderInfo, PATBLT_ORDER* patblt) { orderInfo->fieldFlags = 0; - Stream_EnsureRemainingCapacity(s, 64); + Stream_EnsureRemainingCapacity(s, update_approximate_patblt_order(orderInfo, patblt)); orderInfo->fieldFlags |= ORDER_FIELD_01; update_write_coord(s, patblt->nLeftRect); @@ -917,11 +927,16 @@ BOOL update_read_scrblt_order(wStream* s, ORDER_INFO* orderInfo, SCRBLT_ORDER* s return TRUE; } +int update_approximate_scrblt_order(ORDER_INFO* orderInfo, SCRBLT_ORDER* scrblt) +{ + return 32; +} + BOOL update_write_scrblt_order(wStream* s, ORDER_INFO* orderInfo, SCRBLT_ORDER* scrblt) { orderInfo->fieldFlags = 0; - Stream_EnsureRemainingCapacity(s, 32); + Stream_EnsureRemainingCapacity(s, update_approximate_scrblt_order(orderInfo, scrblt)); orderInfo->fieldFlags |= ORDER_FIELD_01; update_write_coord(s, scrblt->nLeftRect); @@ -986,11 +1001,16 @@ BOOL update_read_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, OPAQUE_REC return TRUE; } +int update_approximate_opaque_rect_order(ORDER_INFO* orderInfo, OPAQUE_RECT_ORDER* opaque_rect) +{ + return 32; +} + BOOL update_write_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, OPAQUE_RECT_ORDER* opaque_rect) { BYTE byte; - Stream_EnsureRemainingCapacity(s, 32); + Stream_EnsureRemainingCapacity(s, update_approximate_opaque_rect_order(orderInfo, opaque_rect)); orderInfo->fieldFlags = 0; @@ -1025,9 +1045,15 @@ BOOL update_read_draw_nine_grid_order(wStream* s, ORDER_INFO* orderInfo, DRAW_NI ORDER_FIELD_COORD(3, draw_nine_grid->srcRight); ORDER_FIELD_COORD(4, draw_nine_grid->srcBottom); ORDER_FIELD_UINT16(5, draw_nine_grid->bitmapId); + return TRUE; } +int update_approximate_draw_nine_grid_order(ORDER_INFO* orderInfo, DRAW_NINE_GRID_ORDER* draw_nine_grid) +{ + return 32; +} + BOOL update_write_draw_nine_grid_order(wStream* s, ORDER_INFO* orderInfo, DRAW_NINE_GRID_ORDER* draw_nine_grid) { return TRUE; @@ -1046,12 +1072,20 @@ BOOL update_read_multi_dstblt_order(wStream* s, ORDER_INFO* orderInfo, MULTI_DST { if (Stream_GetRemainingLength(s) < 2) return FALSE; + Stream_Read_UINT16(s, multi_dstblt->cbData); + return update_read_delta_rects(s, multi_dstblt->rectangles, multi_dstblt->numRectangles); } + return TRUE; } +int update_approximate_multi_dstblt_order(ORDER_INFO* orderInfo, MULTI_DSTBLT_ORDER* multi_dstblt) +{ + return 32; +} + BOOL update_write_multi_dstblt_order(wStream* s, ORDER_INFO* orderInfo, MULTI_DSTBLT_ORDER* multi_dstblt) { return TRUE; @@ -1076,13 +1110,20 @@ BOOL update_read_multi_patblt_order(wStream* s, ORDER_INFO* orderInfo, MULTI_PAT { if (Stream_GetRemainingLength(s) < 2) return FALSE; + Stream_Read_UINT16(s, multi_patblt->cbData); + if (!update_read_delta_rects(s, multi_patblt->rectangles, multi_patblt->numRectangles)) return FALSE; } return TRUE; } +int update_approximate_multi_patblt_order(ORDER_INFO* orderInfo, MULTI_PATBLT_ORDER* multi_patblt) +{ + return 32; +} + BOOL update_write_multi_patblt_order(wStream* s, ORDER_INFO* orderInfo, MULTI_PATBLT_ORDER* multi_patblt) { return TRUE; @@ -1103,12 +1144,18 @@ BOOL update_read_multi_scrblt_order(wStream* s, ORDER_INFO* orderInfo, MULTI_SCR { if (Stream_GetRemainingLength(s) < 2) return FALSE; + Stream_Read_UINT16(s, multi_scrblt->cbData); return update_read_delta_rects(s, multi_scrblt->rectangles, multi_scrblt->numRectangles); } return TRUE; } +int update_approximate_multi_scrblt_order(wStream* s, ORDER_INFO* orderInfo, MULTI_SCRBLT_ORDER* multi_scrblt) +{ + return 32; +} + BOOL update_write_multi_scrblt_order(wStream* s, ORDER_INFO* orderInfo, MULTI_SCRBLT_ORDER* multi_scrblt) { return TRUE; @@ -1127,6 +1174,7 @@ BOOL update_read_multi_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, MULT { if (Stream_GetRemainingLength(s) < 1) return FALSE; + Stream_Read_UINT8(s, byte); multi_opaque_rect->color = (multi_opaque_rect->color & 0xFFFFFF00) | byte; } @@ -1135,6 +1183,7 @@ BOOL update_read_multi_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, MULT { if (Stream_GetRemainingLength(s) < 1) return FALSE; + Stream_Read_UINT8(s, byte); multi_opaque_rect->color = (multi_opaque_rect->color & 0xFFFF00FF) | (byte << 8); } @@ -1143,6 +1192,7 @@ BOOL update_read_multi_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, MULT { if (Stream_GetRemainingLength(s) < 1) return FALSE; + Stream_Read_UINT8(s, byte); multi_opaque_rect->color = (multi_opaque_rect->color & 0xFF00FFFF) | (byte << 16); } @@ -1156,9 +1206,15 @@ BOOL update_read_multi_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, MULT Stream_Read_UINT16(s, multi_opaque_rect->cbData); return update_read_delta_rects(s, multi_opaque_rect->rectangles, multi_opaque_rect->numRectangles); } + return TRUE; } +int update_approximate_multi_opaque_rect_order(ORDER_INFO* orderInfo, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect) +{ + return 32; +} + BOOL update_write_multi_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect) { return TRUE; @@ -1177,9 +1233,15 @@ BOOL update_read_multi_draw_nine_grid_order(wStream* s, ORDER_INFO* orderInfo, M { FIELD_SKIP_BUFFER16(s, multi_draw_nine_grid->cbData); } + return TRUE; } +int update_approximate_multi_draw_nine_grid_order(ORDER_INFO* orderInfo, MULTI_DRAW_NINE_GRID_ORDER* multi_draw_nine_grid) +{ + return 32; +} + BOOL update_write_multi_draw_nine_grid_order(wStream* s, ORDER_INFO* orderInfo, MULTI_DRAW_NINE_GRID_ORDER* multi_draw_nine_grid) { return TRUE; @@ -1200,9 +1262,14 @@ BOOL update_read_line_to_order(wStream* s, ORDER_INFO* orderInfo, LINE_TO_ORDER* return TRUE; } +int update_approximate_line_to_order(ORDER_INFO* orderInfo, LINE_TO_ORDER* line_to) +{ + return 32; +} + BOOL update_write_line_to_order(wStream* s, ORDER_INFO* orderInfo, LINE_TO_ORDER* line_to) { - Stream_EnsureRemainingCapacity(s, 32); + Stream_EnsureRemainingCapacity(s, update_approximate_line_to_order(orderInfo, line_to)); orderInfo->fieldFlags = 0; @@ -1267,6 +1334,11 @@ BOOL update_read_polyline_order(wStream* s, ORDER_INFO* orderInfo, POLYLINE_ORDE return TRUE; } +int update_approximate_polyline_order(ORDER_INFO* orderInfo, POLYLINE_ORDER* polyline) +{ + return 32; +} + BOOL update_write_polyline_order(wStream* s, ORDER_INFO* orderInfo, POLYLINE_ORDER* polyline) { return TRUE; @@ -1290,11 +1362,16 @@ BOOL update_read_memblt_order(wStream* s, ORDER_INFO* orderInfo, MEMBLT_ORDER* m return TRUE; } +int update_approximate_memblt_order(ORDER_INFO* orderInfo, MEMBLT_ORDER* memblt) +{ + return 32; +} + BOOL update_write_memblt_order(wStream* s, ORDER_INFO* orderInfo, MEMBLT_ORDER* memblt) { UINT16 cacheId; - Stream_EnsureRemainingCapacity(s, 32); + Stream_EnsureRemainingCapacity(s, update_approximate_memblt_order(orderInfo, memblt)); cacheId = (memblt->cacheId & 0xFF) | ((memblt->colorIndex & 0xFF) << 8); @@ -1347,9 +1424,15 @@ BOOL update_read_mem3blt_order(wStream* s, ORDER_INFO* orderInfo, MEM3BLT_ORDER* ORDER_FIELD_UINT16(16, mem3blt->cacheIndex); mem3blt->colorIndex = (mem3blt->cacheId >> 8); mem3blt->cacheId = (mem3blt->cacheId & 0xFF); + return TRUE; } +int update_approximate_mem3blt_order(ORDER_INFO* orderInfo, MEM3BLT_ORDER* mem3blt) +{ + return 32; +} + BOOL update_write_mem3blt_order(wStream* s, ORDER_INFO* orderInfo, MEM3BLT_ORDER* mem3blt) { return TRUE; @@ -1366,6 +1449,11 @@ BOOL update_read_save_bitmap_order(wStream* s, ORDER_INFO* orderInfo, SAVE_BITMA return TRUE; } +int update_approximate_save_bitmap_order(ORDER_INFO* orderInfo, SAVE_BITMAP_ORDER* save_bitmap) +{ + return 32; +} + BOOL update_write_save_bitmap_order(wStream* s, ORDER_INFO* orderInfo, SAVE_BITMAP_ORDER* save_bitmap) { return TRUE; @@ -1404,18 +1492,23 @@ BOOL update_read_glyph_index_order(wStream* s, ORDER_INFO* orderInfo, GLYPH_INDE if (Stream_GetRemainingLength(s) < glyph_index->cbData) return FALSE; - memcpy(glyph_index->data, Stream_Pointer(s), glyph_index->cbData); + CopyMemory(glyph_index->data, Stream_Pointer(s), glyph_index->cbData); Stream_Seek(s, glyph_index->cbData); } return TRUE; } +int update_approximate_glyph_index_order(ORDER_INFO* orderInfo, GLYPH_INDEX_ORDER* glyph_index) +{ + return 64; +} + BOOL update_write_glyph_index_order(wStream* s, ORDER_INFO* orderInfo, GLYPH_INDEX_ORDER* glyph_index) { orderInfo->fieldFlags = 0; - Stream_EnsureRemainingCapacity(s, 64); + Stream_EnsureRemainingCapacity(s, update_approximate_glyph_index_order(orderInfo, glyph_index)); orderInfo->fieldFlags |= ORDER_FIELD_01; Stream_Write_UINT8(s, glyph_index->cacheId); @@ -1500,16 +1593,24 @@ BOOL update_read_fast_index_order(wStream* s, ORDER_INFO* orderInfo, FAST_INDEX_ { if (Stream_GetRemainingLength(s) < 1) return FALSE; + Stream_Read_UINT8(s, fast_index->cbData); if (Stream_GetRemainingLength(s) < fast_index->cbData) return FALSE; - memcpy(fast_index->data, Stream_Pointer(s), fast_index->cbData); + + CopyMemory(fast_index->data, Stream_Pointer(s), fast_index->cbData); Stream_Seek(s, fast_index->cbData); } + return TRUE; } +int update_approximate_fast_index_order(ORDER_INFO* orderInfo, FAST_INDEX_ORDER* fast_index) +{ + return 32; +} + BOOL update_write_fast_index_order(wStream* s, ORDER_INFO* orderInfo, FAST_INDEX_ORDER* fast_index) { return TRUE; @@ -1545,7 +1646,7 @@ BOOL update_read_fast_glyph_order(wStream* s, ORDER_INFO* orderInfo, FAST_GLYPH_ if (Stream_GetRemainingLength(s) < fast_glyph->cbData) return FALSE; - memcpy(fast_glyph->data, Stream_Pointer(s), fast_glyph->cbData); + CopyMemory(fast_glyph->data, Stream_Pointer(s), fast_glyph->cbData); phold = Stream_Pointer(s); if (!Stream_SafeSeek(s, 1)) @@ -1575,9 +1676,15 @@ BOOL update_read_fast_glyph_order(wStream* s, ORDER_INFO* orderInfo, FAST_GLYPH_ Stream_Pointer(s) = phold + fast_glyph->cbData; } + return TRUE; } +int update_approximate_fast_glyph_order(ORDER_INFO* orderInfo, FAST_GLYPH_ORDER* fast_glyph) +{ + return 32; +} + BOOL update_write_fast_glyph_order(wStream* s, ORDER_INFO* orderInfo, FAST_GLYPH_ORDER* fast_glyph) { return TRUE; @@ -1596,18 +1703,25 @@ BOOL update_read_polygon_sc_order(wStream* s, ORDER_INFO* orderInfo, POLYGON_SC_ { if (Stream_GetRemainingLength(s) < 1) return FALSE; + Stream_Read_UINT8(s, polygon_sc->cbData); - if (polygon_sc->points == NULL) + if (!polygon_sc->points) polygon_sc->points = (DELTA_POINT*) malloc(sizeof(DELTA_POINT) * polygon_sc->numPoints); else polygon_sc->points = (DELTA_POINT*) realloc(polygon_sc->points, sizeof(DELTA_POINT) * polygon_sc->numPoints); return update_read_delta_points(s, polygon_sc->points, polygon_sc->numPoints, polygon_sc->xStart, polygon_sc->yStart); } + return TRUE; } +int update_approximate_polygon_sc_order(ORDER_INFO* orderInfo, POLYGON_SC_ORDER* polygon_sc) +{ + return 32; +} + BOOL update_write_polygon_sc_order(wStream* s, ORDER_INFO* orderInfo, POLYGON_SC_ORDER* polygon_sc) { return TRUE; @@ -1631,9 +1745,10 @@ BOOL update_read_polygon_cb_order(wStream* s, ORDER_INFO* orderInfo, POLYGON_CB_ { if (Stream_GetRemainingLength(s) < 1) return FALSE; + Stream_Read_UINT8(s, polygon_cb->cbData); - if (polygon_cb->points == NULL) + if (!polygon_cb->points) polygon_cb->points = (DELTA_POINT*) malloc(sizeof(DELTA_POINT) * polygon_cb->numPoints); else polygon_cb->points = (DELTA_POINT*) realloc(polygon_cb->points, sizeof(DELTA_POINT) * polygon_cb->numPoints); @@ -1644,9 +1759,15 @@ BOOL update_read_polygon_cb_order(wStream* s, ORDER_INFO* orderInfo, POLYGON_CB_ polygon_cb->backMode = (polygon_cb->bRop2 & 0x80) ? BACKMODE_TRANSPARENT : BACKMODE_OPAQUE; polygon_cb->bRop2 = (polygon_cb->bRop2 & 0x1F); + return TRUE; } +int update_approximate_polygon_cb_order(ORDER_INFO* orderInfo, POLYGON_CB_ORDER* polygon_cb) +{ + return 32; +} + BOOL update_write_polygon_cb_order(wStream* s, ORDER_INFO* orderInfo, POLYGON_CB_ORDER* polygon_cb) { return TRUE; @@ -1664,6 +1785,11 @@ BOOL update_read_ellipse_sc_order(wStream* s, ORDER_INFO* orderInfo, ELLIPSE_SC_ return TRUE; } +int update_approximate_ellipse_sc_order(ORDER_INFO* orderInfo, ELLIPSE_SC_ORDER* ellipse_sc) +{ + return 32; +} + BOOL update_write_ellipse_sc_order(wStream* s, ORDER_INFO* orderInfo, ELLIPSE_SC_ORDER* ellipse_sc) { return TRUE; @@ -1682,6 +1808,11 @@ BOOL update_read_ellipse_cb_order(wStream* s, ORDER_INFO* orderInfo, ELLIPSE_CB_ return update_read_brush(s, &ellipse_cb->brush, orderInfo->fieldFlags >> 8); } +int update_approximate_ellipse_cb_order(ORDER_INFO* orderInfo, ELLIPSE_CB_ORDER* ellipse_cb) +{ + return 32; +} + BOOL update_write_ellipse_cb_order(wStream* s, ORDER_INFO* orderInfo, ELLIPSE_CB_ORDER* ellipse_cb) { return TRUE; @@ -1735,11 +1866,16 @@ BOOL update_read_cache_bitmap_order(wStream* s, CACHE_BITMAP_ORDER* cache_bitmap return TRUE; } +int update_approximate_cache_bitmap_order(CACHE_BITMAP_ORDER* cache_bitmap, BOOL compressed, UINT16* flags) +{ + return 64 + cache_bitmap->bitmapLength; +} + BOOL update_write_cache_bitmap_order(wStream* s, CACHE_BITMAP_ORDER* cache_bitmap, BOOL compressed, UINT16* flags) { *flags = NO_BITMAP_COMPRESSION_HDR; - Stream_EnsureRemainingCapacity(s, 64 + cache_bitmap->bitmapLength); + Stream_EnsureRemainingCapacity(s, update_approximate_cache_bitmap_order(cache_bitmap, compressed, flags)); if ((*flags & NO_BITMAP_COMPRESSION_HDR) == 0) cache_bitmap->bitmapLength += 8; @@ -1845,11 +1981,16 @@ BOOL update_read_cache_bitmap_v2_order(wStream* s, CACHE_BITMAP_V2_ORDER* cache_ return TRUE; } +int update_approximate_cache_bitmap_v2_order(CACHE_BITMAP_V2_ORDER* cache_bitmap_v2, BOOL compressed, UINT16* flags) +{ + return 64 + cache_bitmap_v2->bitmapLength; +} + BOOL update_write_cache_bitmap_v2_order(wStream* s, CACHE_BITMAP_V2_ORDER* cache_bitmap_v2, BOOL compressed, UINT16* flags) { BYTE bitsPerPixelId; - Stream_EnsureRemainingCapacity(s, 64 + cache_bitmap_v2->bitmapLength); + Stream_EnsureRemainingCapacity(s, update_approximate_cache_bitmap_v2_order(cache_bitmap_v2, compressed, flags)); bitsPerPixelId = BPP_CBR2[cache_bitmap_v2->bitmapBpp]; @@ -1947,6 +2088,12 @@ BOOL update_read_cache_bitmap_v3_order(wStream* s, CACHE_BITMAP_V3_ORDER* cache_ return TRUE; } +int update_approximate_cache_bitmap_v3_order(CACHE_BITMAP_V3_ORDER* cache_bitmap_v3, UINT16* flags) +{ + BITMAP_DATA_EX* bitmapData = &cache_bitmap_v3->bitmapData; + return 64 + bitmapData->length; +} + BOOL update_write_cache_bitmap_v3_order(wStream* s, CACHE_BITMAP_V3_ORDER* cache_bitmap_v3, UINT16* flags) { BYTE bitsPerPixelId; @@ -1954,7 +2101,7 @@ BOOL update_write_cache_bitmap_v3_order(wStream* s, CACHE_BITMAP_V3_ORDER* cache bitmapData = &cache_bitmap_v3->bitmapData; - Stream_EnsureRemainingCapacity(s, 64 + bitmapData->length); + Stream_EnsureRemainingCapacity(s, update_approximate_cache_bitmap_v3_order(cache_bitmap_v3, flags)); bitsPerPixelId = BPP_CBR23[cache_bitmap_v3->bpp]; @@ -2009,6 +2156,11 @@ BOOL update_read_cache_color_table_order(wStream* s, CACHE_COLOR_TABLE_ORDER* ca return TRUE; } +int update_approximate_cache_color_table_order(CACHE_COLOR_TABLE_ORDER* cache_color_table, UINT16* flags) +{ + return 16 + (256 * 4); +} + BOOL update_write_cache_color_table_order(wStream* s, CACHE_COLOR_TABLE_ORDER* cache_color_table, UINT16* flags) { int i; @@ -2017,7 +2169,7 @@ BOOL update_write_cache_color_table_order(wStream* s, CACHE_COLOR_TABLE_ORDER* c if (cache_color_table->numberColors != 256) return FALSE; - Stream_EnsureRemainingCapacity(s, 16 + (256 * 4)); + Stream_EnsureRemainingCapacity(s, update_approximate_cache_color_table_order(cache_color_table, flags)); Stream_Write_UINT8(s, cache_color_table->cacheIndex); /* cacheIndex (1 byte) */ Stream_Write_UINT16(s, cache_color_table->numberColors); /* numberColors (2 bytes) */ @@ -2077,13 +2229,18 @@ BOOL update_read_cache_glyph_order(wStream* s, CACHE_GLYPH_ORDER* cache_glyph_or return TRUE; } +int update_approximate_cache_glyph_order(CACHE_GLYPH_ORDER* cache_glyph, UINT16* flags) +{ + return 2 + cache_glyph->cGlyphs * 32; +} + BOOL update_write_cache_glyph_order(wStream* s, CACHE_GLYPH_ORDER* cache_glyph, UINT16* flags) { int i; INT16 lsi16; GLYPH_DATA* glyph; - Stream_EnsureRemainingCapacity(s, 2 + cache_glyph->cGlyphs * 32); + Stream_EnsureRemainingCapacity(s, update_approximate_cache_glyph_order(cache_glyph, flags)); Stream_Write_UINT8(s, cache_glyph->cacheId); /* cacheId (1 byte) */ Stream_Write_UINT8(s, cache_glyph->cGlyphs); /* cGlyphs (1 byte) */ @@ -2161,12 +2318,17 @@ BOOL update_read_cache_glyph_v2_order(wStream* s, CACHE_GLYPH_V2_ORDER* cache_gl return TRUE; } +int update_approximate_cache_glyph_v2_order(CACHE_GLYPH_V2_ORDER* cache_glyph_v2, UINT16* flags) +{ + return 8 + cache_glyph_v2->cGlyphs * 32; +} + BOOL update_write_cache_glyph_v2_order(wStream* s, CACHE_GLYPH_V2_ORDER* cache_glyph_v2, UINT16* flags) { int i; GLYPH_DATA_V2* glyph; - Stream_EnsureRemainingCapacity(s, cache_glyph_v2->cGlyphs * 32); + Stream_EnsureRemainingCapacity(s, update_approximate_cache_glyph_v2_order(cache_glyph_v2, flags)); *flags = (cache_glyph_v2->cacheId & 0x000F) | ((cache_glyph_v2->flags & 0x000F) << 4) | @@ -2312,6 +2474,11 @@ BOOL update_read_cache_brush_order(wStream* s, CACHE_BRUSH_ORDER* cache_brush, U return TRUE; } +int update_approximate_cache_brush_order(CACHE_BRUSH_ORDER* cache_brush, UINT16* flags) +{ + return 64; +} + BOOL update_write_cache_brush_order(wStream* s, CACHE_BRUSH_ORDER* cache_brush, UINT16* flags) { int i; @@ -2319,7 +2486,7 @@ BOOL update_write_cache_brush_order(wStream* s, CACHE_BRUSH_ORDER* cache_brush, BYTE iBitmapFormat; BOOL compressed = FALSE; - Stream_EnsureRemainingCapacity(s, 64); + Stream_EnsureRemainingCapacity(s, update_approximate_cache_brush_order(cache_brush, flags)); iBitmapFormat = BPP_BMF[cache_brush->bpp]; @@ -2430,6 +2597,12 @@ BOOL update_read_create_offscreen_bitmap_order(wStream* s, CREATE_OFFSCREEN_BITM return TRUE; } +int update_approximate_create_offscreen_bitmap_order(CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap) +{ + OFFSCREEN_DELETE_LIST* deleteList = &(create_offscreen_bitmap->deleteList); + return 8 + deleteList->cIndices * 2; +} + BOOL update_write_create_offscreen_bitmap_order(wStream* s, CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap) { UINT16 flags; @@ -2438,7 +2611,7 @@ BOOL update_write_create_offscreen_bitmap_order(wStream* s, CREATE_OFFSCREEN_BIT deleteList = &(create_offscreen_bitmap->deleteList); - Stream_EnsureRemainingCapacity(s, 8 + deleteList->cIndices * 2); + Stream_EnsureRemainingCapacity(s, update_approximate_create_offscreen_bitmap_order(create_offscreen_bitmap)); flags = create_offscreen_bitmap->id & 0x7FFF; @@ -2477,9 +2650,14 @@ BOOL update_read_switch_surface_order(wStream* s, SWITCH_SURFACE_ORDER* switch_s return TRUE; } +int update_approximate_switch_surface_order(SWITCH_SURFACE_ORDER* switch_surface) +{ + return 2; +} + BOOL update_write_switch_surface_order(wStream* s, SWITCH_SURFACE_ORDER* switch_surface) { - Stream_EnsureRemainingCapacity(s, 2); + Stream_EnsureRemainingCapacity(s, update_approximate_switch_surface_order(switch_surface)); Stream_Write_UINT16(s, switch_surface->bitmapId); /* bitmapId (2 bytes) */ @@ -2503,6 +2681,7 @@ BOOL update_read_create_nine_grid_bitmap_order(wStream* s, CREATE_NINE_GRID_BITM Stream_Read_UINT16(s, nineGridInfo->ulTopHeight); /* ulTopHeight (2 bytes) */ Stream_Read_UINT16(s, nineGridInfo->ulBottomHeight); /* ulBottomHeight (2 bytes) */ update_read_colorref(s, &nineGridInfo->crTransparent); /* crTransparent (4 bytes) */ + return TRUE; } @@ -2510,7 +2689,9 @@ BOOL update_read_frame_marker_order(wStream* s, FRAME_MARKER_ORDER* frame_marker { if (Stream_GetRemainingLength(s) < 4) return FALSE; + Stream_Read_UINT32(s, frame_marker->action); /* action (4 bytes) */ + return TRUE; } diff --git a/libfreerdp/core/orders.h b/libfreerdp/core/orders.h index 7860694fa..d4d161b8b 100644 --- a/libfreerdp/core/orders.h +++ b/libfreerdp/core/orders.h @@ -195,87 +195,156 @@ BOOL update_read_bounds(wStream* s, rdpBounds* bounds); BOOL update_write_bounds(wStream* s, ORDER_INFO* orderInfo); BOOL update_read_dstblt_order(wStream* s, ORDER_INFO* orderInfo, DSTBLT_ORDER* dstblt); +int update_approximate_dstblt_order(ORDER_INFO* orderInfo, DSTBLT_ORDER* dstblt); BOOL update_write_dstblt_order(wStream* s, ORDER_INFO* orderInfo, DSTBLT_ORDER* dstblt); + BOOL update_read_patblt_order(wStream* s, ORDER_INFO* orderInfo, PATBLT_ORDER* patblt); +int update_approximate_patblt_order(ORDER_INFO* orderInfo, PATBLT_ORDER* patblt); BOOL update_write_patblt_order(wStream* s, ORDER_INFO* orderInfo, PATBLT_ORDER* patblt); + BOOL update_read_scrblt_order(wStream* s, ORDER_INFO* orderInfo, SCRBLT_ORDER* scrblt); +int update_approximate_scrblt_order(ORDER_INFO* orderInfo, SCRBLT_ORDER* scrblt); BOOL update_write_scrblt_order(wStream* s, ORDER_INFO* orderInfo, SCRBLT_ORDER* scrblt); + BOOL update_read_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, OPAQUE_RECT_ORDER* opaque_rect); +int update_approximate_opaque_rect_order(ORDER_INFO* orderInfo, OPAQUE_RECT_ORDER* opaque_rect); BOOL update_write_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, OPAQUE_RECT_ORDER* opaque_rect); + BOOL update_read_draw_nine_grid_order(wStream* s, ORDER_INFO* orderInfo, DRAW_NINE_GRID_ORDER* draw_nine_grid); +int update_approximate_draw_nine_grid_order(ORDER_INFO* orderInfo, DRAW_NINE_GRID_ORDER* draw_nine_grid); BOOL update_write_draw_nine_grid_order(wStream* s, ORDER_INFO* orderInfo, DRAW_NINE_GRID_ORDER* draw_nine_grid); + BOOL update_read_multi_dstblt_order(wStream* s, ORDER_INFO* orderInfo, MULTI_DSTBLT_ORDER* multi_dstblt); +int update_approximate_multi_dstblt_order(ORDER_INFO* orderInfo, MULTI_DSTBLT_ORDER* multi_dstblt); BOOL update_write_multi_dstblt_order(wStream* s, ORDER_INFO* orderInfo, MULTI_DSTBLT_ORDER* multi_dstblt); + BOOL update_read_multi_patblt_order(wStream* s, ORDER_INFO* orderInfo, MULTI_PATBLT_ORDER* multi_patblt); +int update_approximate_multi_patblt_order(ORDER_INFO* orderInfo, MULTI_PATBLT_ORDER* multi_patblt); BOOL update_write_multi_patblt_order(wStream* s, ORDER_INFO* orderInfo, MULTI_PATBLT_ORDER* multi_patblt); + BOOL update_read_multi_scrblt_order(wStream* s, ORDER_INFO* orderInfo, MULTI_SCRBLT_ORDER* multi_scrblt); +int update_approximate_multi_scrblt_order(wStream* s, ORDER_INFO* orderInfo, MULTI_SCRBLT_ORDER* multi_scrblt); BOOL update_write_multi_scrblt_order(wStream* s, ORDER_INFO* orderInfo, MULTI_SCRBLT_ORDER* multi_scrblt); + BOOL update_read_multi_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect); +int update_approximate_multi_opaque_rect_order(ORDER_INFO* orderInfo, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect); BOOL update_write_multi_opaque_rect_order(wStream* s, ORDER_INFO* orderInfo, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect); + BOOL update_read_multi_draw_nine_grid_order(wStream* s, ORDER_INFO* orderInfo, MULTI_DRAW_NINE_GRID_ORDER* multi_draw_nine_grid); +int update_approximate_multi_draw_nine_grid_order(ORDER_INFO* orderInfo, MULTI_DRAW_NINE_GRID_ORDER* multi_draw_nine_grid); BOOL update_write_multi_draw_nine_grid_order(wStream* s, ORDER_INFO* orderInfo, MULTI_DRAW_NINE_GRID_ORDER* multi_draw_nine_grid); + BOOL update_read_line_to_order(wStream* s, ORDER_INFO* orderInfo, LINE_TO_ORDER* line_to); +int update_approximate_line_to_order(ORDER_INFO* orderInfo, LINE_TO_ORDER* line_to); BOOL update_write_line_to_order(wStream* s, ORDER_INFO* orderInfo, LINE_TO_ORDER* line_to); + BOOL update_read_polyline_order(wStream* s, ORDER_INFO* orderInfo, POLYLINE_ORDER* polyline); +int update_approximate_polyline_order(ORDER_INFO* orderInfo, POLYLINE_ORDER* polyline); BOOL update_write_polyline_order(wStream* s, ORDER_INFO* orderInfo, POLYLINE_ORDER* polyline); + BOOL update_read_memblt_order(wStream* s, ORDER_INFO* orderInfo, MEMBLT_ORDER* memblt); +int update_approximate_memblt_order(ORDER_INFO* orderInfo, MEMBLT_ORDER* memblt); BOOL update_write_memblt_order(wStream* s, ORDER_INFO* orderInfo, MEMBLT_ORDER* memblt); + BOOL update_read_mem3blt_order(wStream* s, ORDER_INFO* orderInfo, MEM3BLT_ORDER* mem3blt); +int update_approximate_mem3blt_order(ORDER_INFO* orderInfo, MEM3BLT_ORDER* mem3blt); BOOL update_write_mem3blt_order(wStream* s, ORDER_INFO* orderInfo, MEM3BLT_ORDER* mem3blt); + BOOL update_read_save_bitmap_order(wStream* s, ORDER_INFO* orderInfo, SAVE_BITMAP_ORDER* save_bitmap); +int update_approximate_save_bitmap_order(ORDER_INFO* orderInfo, SAVE_BITMAP_ORDER* save_bitmap); BOOL update_write_save_bitmap_order(wStream* s, ORDER_INFO* orderInfo, SAVE_BITMAP_ORDER* save_bitmap); + BOOL update_read_glyph_index_order(wStream* s, ORDER_INFO* orderInfo, GLYPH_INDEX_ORDER* glyph_index); +int update_approximate_glyph_index_order(ORDER_INFO* orderInfo, GLYPH_INDEX_ORDER* glyph_index); BOOL update_write_glyph_index_order(wStream* s, ORDER_INFO* orderInfo, GLYPH_INDEX_ORDER* glyph_index); + BOOL update_read_fast_index_order(wStream* s, ORDER_INFO* orderInfo, FAST_INDEX_ORDER* fast_index); +int update_approximate_fast_index_order(ORDER_INFO* orderInfo, FAST_INDEX_ORDER* fast_index); BOOL update_write_fast_index_order(wStream* s, ORDER_INFO* orderInfo, FAST_INDEX_ORDER* fast_index); + BOOL update_read_fast_glyph_order(wStream* s, ORDER_INFO* orderInfo, FAST_GLYPH_ORDER* fast_glyph); +int update_approximate_fast_glyph_order(ORDER_INFO* orderInfo, FAST_GLYPH_ORDER* fast_glyph); BOOL update_write_fast_glyph_order(wStream* s, ORDER_INFO* orderInfo, FAST_GLYPH_ORDER* fast_glyph); + BOOL update_read_polygon_sc_order(wStream* s, ORDER_INFO* orderInfo, POLYGON_SC_ORDER* polygon_sc); +int update_approximate_polygon_sc_order(ORDER_INFO* orderInfo, POLYGON_SC_ORDER* polygon_sc); BOOL update_write_polygon_sc_order(wStream* s, ORDER_INFO* orderInfo, POLYGON_SC_ORDER* polygon_sc); + BOOL update_read_polygon_cb_order(wStream* s, ORDER_INFO* orderInfo, POLYGON_CB_ORDER* polygon_cb); +int update_approximate_polygon_cb_order(ORDER_INFO* orderInfo, POLYGON_CB_ORDER* polygon_cb); BOOL update_write_polygon_cb_order(wStream* s, ORDER_INFO* orderInfo, POLYGON_CB_ORDER* polygon_cb); + BOOL update_read_ellipse_sc_order(wStream* s, ORDER_INFO* orderInfo, ELLIPSE_SC_ORDER* ellipse_sc); +int update_approximate_ellipse_sc_order(ORDER_INFO* orderInfo, ELLIPSE_SC_ORDER* ellipse_sc); BOOL update_write_ellipse_sc_order(wStream* s, ORDER_INFO* orderInfo, ELLIPSE_SC_ORDER* ellipse_sc); + BOOL update_read_ellipse_cb_order(wStream* s, ORDER_INFO* orderInfo, ELLIPSE_CB_ORDER* ellipse_cb); +int update_approximate_ellipse_cb_order(ORDER_INFO* orderInfo, ELLIPSE_CB_ORDER* ellipse_cb); BOOL update_write_ellipse_cb_order(wStream* s, ORDER_INFO* orderInfo, ELLIPSE_CB_ORDER* ellipse_cb); BOOL update_read_cache_bitmap_order(wStream* s, CACHE_BITMAP_ORDER* cache_bitmap_order, BOOL compressed, UINT16 flags); +int update_approximate_cache_bitmap_order(CACHE_BITMAP_ORDER* cache_bitmap, BOOL compressed, UINT16* flags); BOOL update_write_cache_bitmap_order(wStream* s, CACHE_BITMAP_ORDER* cache_bitmap_order, BOOL compressed, UINT16* flags); + BOOL update_read_cache_bitmap_v2_order(wStream* s, CACHE_BITMAP_V2_ORDER* cache_bitmap_v2_order, BOOL compressed, UINT16 flags); +int update_approximate_cache_bitmap_v2_order(CACHE_BITMAP_V2_ORDER* cache_bitmap_v2, BOOL compressed, UINT16* flags); BOOL update_write_cache_bitmap_v2_order(wStream* s, CACHE_BITMAP_V2_ORDER* cache_bitmap_v2_order, BOOL compressed, UINT16* flags); + BOOL update_read_cache_bitmap_v3_order(wStream* s, CACHE_BITMAP_V3_ORDER* cache_bitmap_v3_order, UINT16 flags); +int update_approximate_cache_bitmap_v3_order(CACHE_BITMAP_V3_ORDER* cache_bitmap_v3, UINT16* flags); BOOL update_write_cache_bitmap_v3_order(wStream* s, CACHE_BITMAP_V3_ORDER* cache_bitmap_v3_order, UINT16* flags); + BOOL update_read_cache_color_table_order(wStream* s, CACHE_COLOR_TABLE_ORDER* cache_color_table_order, UINT16 flags); +int update_approximate_cache_color_table_order(CACHE_COLOR_TABLE_ORDER* cache_color_table, UINT16* flags); BOOL update_write_cache_color_table_order(wStream* s, CACHE_COLOR_TABLE_ORDER* cache_color_table_order, UINT16* flags); + BOOL update_read_cache_glyph_order(wStream* s, CACHE_GLYPH_ORDER* cache_glyph_order, UINT16 flags); +int update_approximate_cache_glyph_order(CACHE_GLYPH_ORDER* cache_glyph, UINT16* flags); BOOL update_write_cache_glyph_order(wStream* s, CACHE_GLYPH_ORDER* cache_glyph_order, UINT16* flags); + BOOL update_read_cache_glyph_v2_order(wStream* s, CACHE_GLYPH_V2_ORDER* cache_glyph_v2_order, UINT16 flags); +int update_approximate_cache_glyph_v2_order(CACHE_GLYPH_V2_ORDER* cache_glyph_v2, UINT16* flags); BOOL update_write_cache_glyph_v2_order(wStream* s, CACHE_GLYPH_V2_ORDER* cache_glyph_v2, UINT16* flags); + BOOL update_read_cache_brush_order(wStream* s, CACHE_BRUSH_ORDER* cache_brush_order, UINT16 flags); +int update_approximate_cache_brush_order(CACHE_BRUSH_ORDER* cache_brush, UINT16* flags); BOOL update_write_cache_brush_order(wStream* s, CACHE_BRUSH_ORDER* cache_brush_order, UINT16* flags); BOOL update_read_create_offscreen_bitmap_order(wStream* s, CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap); +int update_approximate_create_offscreen_bitmap_order(CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap); BOOL update_write_create_offscreen_bitmap_order(wStream* s, CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap); + BOOL update_read_switch_surface_order(wStream* s, SWITCH_SURFACE_ORDER* switch_surface); +int update_approximate_switch_surface_order(SWITCH_SURFACE_ORDER* switch_surface); BOOL update_write_switch_surface_order(wStream* s, SWITCH_SURFACE_ORDER* switch_surface); + BOOL update_read_create_nine_grid_bitmap_order(wStream* s, CREATE_NINE_GRID_BITMAP_ORDER* create_nine_grid_bitmap); BOOL update_write_create_nine_grid_bitmap_order(wStream* s, CREATE_NINE_GRID_BITMAP_ORDER* create_nine_grid_bitmap); + BOOL update_read_frame_marker_order(wStream* s, FRAME_MARKER_ORDER* frame_marker); BOOL update_write_frame_marker_order(wStream* s, FRAME_MARKER_ORDER* frame_marker); + BOOL update_read_stream_bitmap_first_order(wStream* s, STREAM_BITMAP_FIRST_ORDER* stream_bitmap_first); BOOL update_write_stream_bitmap_first_order(wStream* s, STREAM_BITMAP_FIRST_ORDER* stream_bitmap_first); + BOOL update_read_stream_bitmap_next_order(wStream* s, STREAM_BITMAP_NEXT_ORDER* stream_bitmap_next); BOOL update_write_stream_bitmap_next_order(wStream* s, STREAM_BITMAP_NEXT_ORDER* stream_bitmap_next); + BOOL update_read_draw_gdiplus_first_order(wStream* s, DRAW_GDIPLUS_FIRST_ORDER* draw_gdiplus_first); BOOL update_write_draw_gdiplus_first_order(wStream* s, DRAW_GDIPLUS_FIRST_ORDER* draw_gdiplus_first); + BOOL update_read_draw_gdiplus_next_order(wStream* s, DRAW_GDIPLUS_NEXT_ORDER* draw_gdiplus_next); BOOL update_write_draw_gdiplus_next_order(wStream* s, DRAW_GDIPLUS_NEXT_ORDER* draw_gdiplus_next); + BOOL update_read_draw_gdiplus_end_order(wStream* s, DRAW_GDIPLUS_END_ORDER* draw_gdiplus_end); BOOL update_write_draw_gdiplus_end_order(wStream* s, DRAW_GDIPLUS_END_ORDER* draw_gdiplus_end); + BOOL update_read_draw_gdiplus_cache_first_order(wStream* s, DRAW_GDIPLUS_CACHE_FIRST_ORDER* draw_gdiplus_cache_first); BOOL update_write_draw_gdiplus_cache_first_order(wStream* s, DRAW_GDIPLUS_CACHE_FIRST_ORDER* draw_gdiplus_cache_first); + BOOL update_read_draw_gdiplus_cache_next_order(wStream* s, DRAW_GDIPLUS_CACHE_NEXT_ORDER* draw_gdiplus_cache_next); BOOL update_write_draw_gdiplus_cache_next_order(wStream* s, DRAW_GDIPLUS_CACHE_NEXT_ORDER* draw_gdiplus_cache_next); + BOOL update_read_draw_gdiplus_cache_end_order(wStream* s, DRAW_GDIPLUS_CACHE_END_ORDER* draw_gdiplus_cache_end); BOOL update_write_draw_gdiplus_cache_end_order(wStream* s, DRAW_GDIPLUS_CACHE_END_ORDER* draw_gdiplus_cache_end); diff --git a/libfreerdp/core/peer.c b/libfreerdp/core/peer.c index 40e066747..3806a736e 100644 --- a/libfreerdp/core/peer.c +++ b/libfreerdp/core/peer.c @@ -376,8 +376,8 @@ void freerdp_peer_context_new(freerdp_peer* client) client->update = rdp->update; client->settings = rdp->settings; - client->context = (rdpContext*) malloc(client->context_size); - ZeroMemory(client->context, client->context_size); + client->context = (rdpContext*) malloc(client->ContextSize); + ZeroMemory(client->context, client->ContextSize); client->context->rdp = rdp; client->context->peer = client; @@ -416,7 +416,7 @@ freerdp_peer* freerdp_peer_new(int sockfd) if (client != NULL) { client->sockfd = sockfd; - client->context_size = sizeof(rdpContext); + client->ContextSize = sizeof(rdpContext); client->Initialize = freerdp_peer_initialize; client->GetFileDescriptor = freerdp_peer_get_fds; client->CheckFileDescriptor = freerdp_peer_check_fds; diff --git a/libfreerdp/core/rdp.c b/libfreerdp/core/rdp.c index 2f23b895a..1a4704d3c 100644 --- a/libfreerdp/core/rdp.c +++ b/libfreerdp/core/rdp.c @@ -255,12 +255,18 @@ BOOL rdp_read_header(rdpRdp* rdp, wStream* s, UINT16* length, UINT16* channel_id if (MCSPDU == DomainMCSPDU_DisconnectProviderUltimatum) { BYTE reason; + TerminateEventArgs e; + rdpContext* context = rdp->instance->context; (void) per_read_enumerated(s, &reason, 0); DEBUG_RDP("DisconnectProviderUltimatum from server, reason code 0x%02x\n", reason); rdp->disconnect = TRUE; + EventArgsInit(&e, "freerdp"); + e.code = 0; + PubSub_OnTerminate(context->pubSub, context, &e); + return TRUE; } @@ -502,11 +508,14 @@ BOOL rdp_recv_set_error_info_data_pdu(rdpRdp* rdp, wStream* s) if (rdp->errorInfo != ERRINFO_SUCCESS) { - rdpClient* client = rdp->instance->context->client; + ErrorInfoEventArgs e; + rdpContext* context = rdp->instance->context; rdp_print_errinfo(rdp->errorInfo); - IFCALL(client->OnErrorInfo, rdp->instance, rdp->errorInfo); + EventArgsInit(&e, "freerdp"); + e.code = rdp->errorInfo; + PubSub_OnErrorInfo(context->pubSub, context, &e); } return TRUE; diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index ba8f9c800..a9a710511 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -784,10 +784,13 @@ static void* transport_client_thread(void* arg) DWORD nCount; HANDLE events[32]; freerdp* instance; + rdpContext* context; rdpTransport* transport; + TerminateEventArgs e; transport = (rdpTransport*) arg; instance = (freerdp*) transport->settings->instance; + context = instance->context; while (1) { @@ -858,6 +861,8 @@ void transport_free(rdpTransport* transport) { if (transport != NULL) { + SetEvent(transport->stopEvent); + if (transport->ReceiveBuffer) Stream_Release(transport->ReceiveBuffer); diff --git a/libfreerdp/core/update.c b/libfreerdp/core/update.c index 9984791d2..6b24f178b 100644 --- a/libfreerdp/core/update.c +++ b/libfreerdp/core/update.c @@ -487,6 +487,45 @@ static void update_end_paint(rdpContext* context) Stream_Free(s, TRUE); } +static void update_flush(rdpContext* context) +{ + rdpUpdate* update = context->update; + + if (update->numberOrders > 0) + { + update->EndPaint(context); + update->BeginPaint(context); + } +} + +static void update_force_flush(rdpContext* context) +{ + rdpUpdate* update = context->update; + + if (update->numberOrders > 0) + { + update->EndPaint(context); + update->BeginPaint(context); + } +} + +static BOOL update_check_flush(rdpContext* context, int size) +{ + wStream* s; + rdpUpdate* update = context->update; + rdpSettings* settings = context->settings; + + s = update->us; + + if (Stream_GetPosition(s) + size + 256 >= settings->MultifragMaxRequestSize) + { + update_flush(context); + return TRUE; + } + + return FALSE; +} + static void update_set_bounds(rdpContext* context, rdpBounds* bounds) { rdpUpdate* update = context->update; @@ -685,11 +724,15 @@ static void update_send_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* wStream* s; rdpRdp* rdp = context->rdp; + update_force_flush(context); + s = fastpath_update_pdu_init(rdp->fastpath); Stream_EnsureRemainingCapacity(s, SURFCMD_SURFACE_BITS_HEADER_LENGTH + (int) surface_bits_command->bitmapDataLength); update_write_surfcmd_surface_bits_header(s, surface_bits_command); Stream_Write(s, surface_bits_command->bitmapData, surface_bits_command->bitmapDataLength); fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_SURFCMDS, s); + + update_force_flush(context); } static void update_send_surface_frame_marker(rdpContext* context, SURFACE_FRAME_MARKER* surface_frame_marker) @@ -697,9 +740,13 @@ static void update_send_surface_frame_marker(rdpContext* context, SURFACE_FRAME_ wStream* s; rdpRdp* rdp = context->rdp; + update_force_flush(context); + s = fastpath_update_pdu_init(rdp->fastpath); update_write_surfcmd_frame_marker(s, surface_frame_marker->frameAction, surface_frame_marker->frameId); fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_SURFCMDS, s); + + update_force_flush(context); } static void update_send_frame_acknowledge(rdpContext* context, UINT32 frameId) @@ -743,6 +790,8 @@ static void update_send_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt) headerLength = update_prepare_order_info(context, &orderInfo, ORDER_TYPE_DSTBLT); + update_check_flush(context, headerLength + update_approximate_dstblt_order(&orderInfo, dstblt)); + s = update->us; offset = Stream_GetPosition(s); @@ -765,6 +814,8 @@ static void update_send_patblt(rdpContext* context, PATBLT_ORDER* patblt) headerLength = update_prepare_order_info(context, &orderInfo, ORDER_TYPE_PATBLT); + update_check_flush(context, headerLength + update_approximate_patblt_order(&orderInfo, patblt)); + s = update->us; offset = Stream_GetPosition(s); @@ -787,6 +838,8 @@ static void update_send_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt) headerLength = update_prepare_order_info(context, &orderInfo, ORDER_TYPE_SCRBLT); + update_check_flush(context, headerLength + update_approximate_scrblt_order(&orderInfo, scrblt)); + s = update->us; offset = Stream_GetPosition(s); @@ -809,6 +862,8 @@ static void update_send_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaq headerLength = update_prepare_order_info(context, &orderInfo, ORDER_TYPE_OPAQUE_RECT); + update_check_flush(context, headerLength + update_approximate_opaque_rect_order(&orderInfo, opaque_rect)); + s = update->us; offset = Stream_GetPosition(s); @@ -831,6 +886,8 @@ static void update_send_line_to(rdpContext* context, LINE_TO_ORDER* line_to) headerLength = update_prepare_order_info(context, &orderInfo, ORDER_TYPE_LINE_TO); + update_check_flush(context, headerLength + update_approximate_line_to_order(&orderInfo, line_to)); + s = update->us; offset = Stream_GetPosition(s); @@ -853,6 +910,8 @@ static void update_send_memblt(rdpContext* context, MEMBLT_ORDER* memblt) headerLength = update_prepare_order_info(context, &orderInfo, ORDER_TYPE_MEMBLT); + update_check_flush(context, headerLength + update_approximate_memblt_order(&orderInfo, memblt)); + s = update->us; offset = Stream_GetPosition(s); @@ -875,6 +934,8 @@ static void update_send_glyph_index(rdpContext* context, GLYPH_INDEX_ORDER* glyp headerLength = update_prepare_order_info(context, &orderInfo, ORDER_TYPE_GLYPH_INDEX); + update_check_flush(context, headerLength + update_approximate_glyph_index_order(&orderInfo, glyph_index)); + s = update->us; offset = Stream_GetPosition(s); @@ -903,6 +964,8 @@ static void update_send_cache_bitmap(rdpContext* context, CACHE_BITMAP_ORDER* ca orderType = cache_bitmap->compressed ? ORDER_TYPE_CACHE_BITMAP_COMPRESSED : ORDER_TYPE_BITMAP_UNCOMPRESSED; + update_check_flush(context, headerLength + update_approximate_cache_bitmap_order(cache_bitmap, cache_bitmap->compressed, &extraFlags)); + s = update->us; bm = Stream_GetPosition(s); @@ -922,13 +985,6 @@ static void update_send_cache_bitmap(rdpContext* context, CACHE_BITMAP_ORDER* ca Stream_SetPosition(s, em); update->numberOrders++; - - /** - * temporary workaround to avoid PDUs exceeding maximum size - */ - - update->EndPaint(context); - update->BeginPaint(context); } static void update_send_cache_bitmap_v2(rdpContext* context, CACHE_BITMAP_V2_ORDER* cache_bitmap_v2) @@ -941,12 +997,16 @@ static void update_send_cache_bitmap_v2(rdpContext* context, CACHE_BITMAP_V2_ORD INT16 orderLength; rdpUpdate* update = context->update; + update_force_flush(context); + extraFlags = 0; headerLength = 6; orderType = cache_bitmap_v2->compressed ? ORDER_TYPE_BITMAP_COMPRESSED_V2 : ORDER_TYPE_BITMAP_UNCOMPRESSED_V2; + update_check_flush(context, headerLength + update_approximate_cache_bitmap_v2_order(cache_bitmap_v2, cache_bitmap_v2->compressed, &extraFlags)); + s = update->us; bm = Stream_GetPosition(s); @@ -967,12 +1027,7 @@ static void update_send_cache_bitmap_v2(rdpContext* context, CACHE_BITMAP_V2_ORD update->numberOrders++; - /** - * temporary workaround to avoid PDUs exceeding maximum size - */ - - update->EndPaint(context); - update->BeginPaint(context); + update_force_flush(context); } static void update_send_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cache_bitmap_v3) @@ -985,10 +1040,14 @@ static void update_send_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORD INT16 orderLength; rdpUpdate* update = context->update; + update_force_flush(context); + extraFlags = 0; headerLength = 6; orderType = ORDER_TYPE_BITMAP_COMPRESSED_V3; + update_check_flush(context, headerLength + update_approximate_cache_bitmap_v3_order(cache_bitmap_v3, &extraFlags)); + s = update->us; bm = Stream_GetPosition(s); @@ -1009,12 +1068,7 @@ static void update_send_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORD update->numberOrders++; - /** - * temporary workaround to avoid PDUs exceeding maximum size - */ - - update->EndPaint(context); - update->BeginPaint(context); + update_force_flush(context); } static void update_send_cache_color_table(rdpContext* context, CACHE_COLOR_TABLE_ORDER* cache_color_table) @@ -1026,9 +1080,13 @@ static void update_send_cache_color_table(rdpContext* context, CACHE_COLOR_TABLE INT16 orderLength; rdpUpdate* update = context->update; + update_force_flush(context); + flags = 0; headerLength = 6; + update_check_flush(context, headerLength + update_approximate_cache_color_table_order(cache_color_table, &flags)); + s = update->us; bm = Stream_GetPosition(s); @@ -1048,6 +1106,8 @@ static void update_send_cache_color_table(rdpContext* context, CACHE_COLOR_TABLE Stream_SetPosition(s, em); update->numberOrders++; + + update_force_flush(context); } static void update_send_cache_glyph(rdpContext* context, CACHE_GLYPH_ORDER* cache_glyph) @@ -1059,9 +1119,13 @@ static void update_send_cache_glyph(rdpContext* context, CACHE_GLYPH_ORDER* cach INT16 orderLength; rdpUpdate* update = context->update; + update_force_flush(context); + flags = 0; headerLength = 6; + update_check_flush(context, headerLength + update_approximate_cache_glyph_order(cache_glyph, &flags)); + s = update->us; bm = Stream_GetPosition(s); @@ -1081,6 +1145,8 @@ static void update_send_cache_glyph(rdpContext* context, CACHE_GLYPH_ORDER* cach Stream_SetPosition(s, em); update->numberOrders++; + + update_force_flush(context); } static void update_send_cache_glyph_v2(rdpContext* context, CACHE_GLYPH_V2_ORDER* cache_glyph_v2) @@ -1092,9 +1158,13 @@ static void update_send_cache_glyph_v2(rdpContext* context, CACHE_GLYPH_V2_ORDER INT16 orderLength; rdpUpdate* update = context->update; + update_force_flush(context); + flags = 0; headerLength = 6; + update_check_flush(context, headerLength + update_approximate_cache_glyph_v2_order(cache_glyph_v2, &flags)); + s = update->us; bm = Stream_GetPosition(s); @@ -1114,6 +1184,8 @@ static void update_send_cache_glyph_v2(rdpContext* context, CACHE_GLYPH_V2_ORDER Stream_SetPosition(s, em); update->numberOrders++; + + update_force_flush(context); } static void update_send_cache_brush(rdpContext* context, CACHE_BRUSH_ORDER* cache_brush) @@ -1125,9 +1197,13 @@ static void update_send_cache_brush(rdpContext* context, CACHE_BRUSH_ORDER* cach INT16 orderLength; rdpUpdate* update = context->update; + update_force_flush(context); + flags = 0; headerLength = 6; + update_check_flush(context, headerLength + update_approximate_cache_brush_order(cache_brush, &flags)); + s = update->us; bm = Stream_GetPosition(s); @@ -1147,6 +1223,8 @@ static void update_send_cache_brush(rdpContext* context, CACHE_BRUSH_ORDER* cach Stream_SetPosition(s, em); update->numberOrders++; + + update_force_flush(context); } static void update_send_create_offscreen_bitmap_order(rdpContext* context, CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap) @@ -1158,10 +1236,14 @@ static void update_send_create_offscreen_bitmap_order(rdpContext* context, CREAT int headerLength; rdpUpdate* update = context->update; + update_force_flush(context); + headerLength = 1; orderType = ORDER_TYPE_CREATE_OFFSCREEN_BITMAP; controlFlags = ORDER_SECONDARY | (orderType << 2); + update_check_flush(context, headerLength + update_approximate_create_offscreen_bitmap_order(create_offscreen_bitmap)); + s = update->us; bm = Stream_GetPosition(s); @@ -1176,6 +1258,8 @@ static void update_send_create_offscreen_bitmap_order(rdpContext* context, CREAT Stream_SetPosition(s, em); update->numberOrders++; + + update_force_flush(context); } static void update_send_switch_surface_order(rdpContext* context, SWITCH_SURFACE_ORDER* switch_surface) @@ -1187,10 +1271,14 @@ static void update_send_switch_surface_order(rdpContext* context, SWITCH_SURFACE int headerLength; rdpUpdate* update = context->update; + update_force_flush(context); + headerLength = 1; orderType = ORDER_TYPE_SWITCH_SURFACE; controlFlags = ORDER_SECONDARY | (orderType << 2); + update_check_flush(context, headerLength + update_approximate_switch_surface_order(switch_surface)); + s = update->us; bm = Stream_GetPosition(s); @@ -1205,6 +1293,8 @@ static void update_send_switch_surface_order(rdpContext* context, SWITCH_SURFACE Stream_SetPosition(s, em); update->numberOrders++; + + update_force_flush(context); } static void update_send_pointer_system(rdpContext* context, POINTER_SYSTEM_UPDATE* pointer_system) diff --git a/libfreerdp/crypto/certificate.c b/libfreerdp/crypto/certificate.c index 5bfaa5c42..3d86944ae 100644 --- a/libfreerdp/crypto/certificate.c +++ b/libfreerdp/crypto/certificate.c @@ -34,12 +34,14 @@ #include static const char certificate_store_dir[] = "certs"; +static const char certificate_server_dir[] = "server"; static const char certificate_known_hosts_file[] = "known_hosts"; #include void certificate_store_init(rdpCertificateStore* certificate_store) { + char* server_path; rdpSettings* settings; settings = certificate_store->settings; @@ -58,6 +60,16 @@ void certificate_store_init(rdpCertificateStore* certificate_store) fprintf(stderr, "creating directory %s\n", certificate_store->path); } + server_path = GetCombinedPath(settings->ConfigPath, (char*) certificate_server_dir); + + if (!PathFileExistsA(server_path)) + { + CreateDirectoryA(server_path, 0); + fprintf(stderr, "creating directory %s\n", server_path); + } + + free(server_path); + certificate_store->file = GetCombinedPath(settings->ConfigPath, (char*) certificate_known_hosts_file); if (PathFileExistsA(certificate_store->file) == FALSE) diff --git a/server/Mac/mf_peer.c b/server/Mac/mf_peer.c index 019efb0eb..074ece076 100644 --- a/server/Mac/mf_peer.c +++ b/server/Mac/mf_peer.c @@ -172,7 +172,7 @@ void mf_peer_rfx_update(freerdp_peer* client) } /* Called when we have a new peer connecting */ -void mf_peer_context_new(freerdp_peer* client, mfPeerContext* context) +int mf_peer_context_new(freerdp_peer* client, mfPeerContext* context) { context->info = mf_info_get_instance(); context->rfx_context = rfx_context_new(); @@ -191,6 +191,8 @@ void mf_peer_context_new(freerdp_peer* client, mfPeerContext* context) //#endif mf_info_peer_register(context->info, context); + + return 0; } @@ -228,7 +230,7 @@ void mf_peer_context_free(freerdp_peer* client, mfPeerContext* context) /* Called when a new client connects */ void mf_peer_init(freerdp_peer* client) { - client->context_size = sizeof(mfPeerContext); + client->ContextSize = sizeof(mfPeerContext); client->ContextNew = (psPeerContextNew) mf_peer_context_new; client->ContextFree = (psPeerContextFree) mf_peer_context_free; freerdp_peer_context_new(client); diff --git a/server/Sample/sfreerdp.c b/server/Sample/sfreerdp.c index 637e634ba..5dadbd013 100644 --- a/server/Sample/sfreerdp.c +++ b/server/Sample/sfreerdp.c @@ -96,7 +96,7 @@ void test_peer_context_free(freerdp_peer* client, testPeerContext* context) static void test_peer_init(freerdp_peer* client) { - client->context_size = sizeof(testPeerContext); + client->ContextSize = sizeof(testPeerContext); client->ContextNew = (psPeerContextNew) test_peer_context_new; client->ContextFree = (psPeerContextFree) test_peer_context_free; freerdp_peer_context_new(client); diff --git a/server/Windows/wf_peer.c b/server/Windows/wf_peer.c index 8148c3a2d..f06ea3ec0 100644 --- a/server/Windows/wf_peer.c +++ b/server/Windows/wf_peer.c @@ -62,7 +62,7 @@ void wf_peer_context_free(freerdp_peer* client, wfPeerContext* context) void wf_peer_init(freerdp_peer* client) { - client->context_size = sizeof(wfPeerContext); + client->ContextSize = sizeof(wfPeerContext); client->ContextNew = (psPeerContextNew) wf_peer_context_new; client->ContextFree = (psPeerContextFree) wf_peer_context_free; diff --git a/server/X11/xf_cursor.c b/server/X11/xf_cursor.c index ebd523f29..da43d8ed5 100644 --- a/server/X11/xf_cursor.c +++ b/server/X11/xf_cursor.c @@ -38,6 +38,7 @@ int xf_cursor_init(xfInfo* xfi) { +#ifdef WITH_XFIXES int event; int error; @@ -50,6 +51,6 @@ int xf_cursor_init(xfInfo* xfi) xfi->xfixes_notify_event = event + XFixesCursorNotify; XFixesSelectCursorInput(xfi->display, DefaultRootWindow(xfi->display), XFixesDisplayCursorNotifyMask); - +#endif return 0; } diff --git a/server/X11/xf_peer.c b/server/X11/xf_peer.c index 28316c87e..7b08eff1a 100644 --- a/server/X11/xf_peer.c +++ b/server/X11/xf_peer.c @@ -323,7 +323,7 @@ void xf_peer_init(freerdp_peer* client) xfInfo* xfi; xfPeerContext* xfp; - client->context_size = sizeof(xfPeerContext); + client->ContextSize = sizeof(xfPeerContext); client->ContextNew = (psPeerContextNew) xf_peer_context_new; client->ContextFree = (psPeerContextFree) xf_peer_context_free; freerdp_peer_context_new(client); diff --git a/server/X11/xf_update.c b/server/X11/xf_update.c index 33dd426b3..67addb550 100644 --- a/server/X11/xf_update.c +++ b/server/X11/xf_update.c @@ -80,12 +80,13 @@ void* xf_update_thread(void* param) ResetEvent(xfp->updateSentEvent); } } +#ifdef WITH_XFIXES else if (xevent.type == xfi->xfixes_notify_event) { XFixesCursorImage* ci = XFixesGetCursorImage(xfi->display); - XFree(ci); } +#endif } end = GetTickCount(); diff --git a/winpr/include/winpr/collections.h b/winpr/include/winpr/collections.h index a8ed0765e..03d06a9a8 100644 --- a/winpr/include/winpr/collections.h +++ b/winpr/include/winpr/collections.h @@ -339,6 +339,92 @@ WINPR_API void MessagePipe_PostQuit(wMessagePipe* pipe, int nExitCode); WINPR_API wMessagePipe* MessagePipe_New(void); WINPR_API void MessagePipe_Free(wMessagePipe* pipe); +/* Publisher/Subscriber Pattern */ + +struct _wEventArgs +{ + DWORD Size; + const char* Sender; +}; +typedef struct _wEventArgs wEventArgs; + +typedef void (*pEventHandler)(void* context, wEventArgs* e); + +#define MAX_EVENT_HANDLERS 32 + +struct _wEventType +{ + const char* EventName; + wEventArgs EventArgs; + int EventHandlerCount; + pEventHandler EventHandlers[MAX_EVENT_HANDLERS]; +}; +typedef struct _wEventType wEventType; + +#define EventArgsInit(_event_args, _sender) \ + memset(_event_args, 0, sizeof(*_event_args)); \ + ((wEventArgs*) _event_args)->Size = sizeof(*_event_args); \ + ((wEventArgs*) _event_args)->Sender = _sender + +#define DEFINE_EVENT_HANDLER(_name) \ + typedef void (*p ## _name ## EventHandler)(void* context, _name ## EventArgs* e) + +#define DEFINE_EVENT_RAISE(_name) \ + static INLINE int PubSub_On ## _name (wPubSub* pubSub, void* context, _name ## EventArgs* e) { \ + return PubSub_OnEvent(pubSub, #_name, context, (wEventArgs*) e); } + +#define DEFINE_EVENT_SUBSCRIBE(_name) \ + static INLINE int PubSub_Subscribe ## _name (wPubSub* pubSub, p ## _name ## EventHandler EventHandler) { \ + return PubSub_Subscribe(pubSub, #_name, (pEventHandler) EventHandler); } + +#define DEFINE_EVENT_UNSUBSCRIBE(_name) \ + static INLINE int PubSub_Unsubscribe ## _name (wPubSub* pubSub, p ## _name ## EventHandler EventHandler) { \ + return PubSub_Unsubscribe(pubSub, #_name, (pEventHandler) EventHandler); } + +#define DEFINE_EVENT_BEGIN(_name) \ + typedef struct _ ## _name ## EventArgs { \ + wEventArgs e; + +#define DEFINE_EVENT_END(_name) \ + } _name ## EventArgs; \ + DEFINE_EVENT_HANDLER(_name); \ + DEFINE_EVENT_RAISE(_name); \ + DEFINE_EVENT_SUBSCRIBE(_name); \ + DEFINE_EVENT_UNSUBSCRIBE(_name); + +#define DEFINE_EVENT_ENTRY(_name) \ + { #_name, { sizeof( _name ## EventArgs) }, 0, { \ + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, \ + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, \ + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, \ + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL } }, + +struct _wPubSub +{ + HANDLE mutex; + BOOL synchronized; + + int size; + int count; + wEventType* events; +}; +typedef struct _wPubSub wPubSub; + +WINPR_API BOOL PubSub_Lock(wPubSub* pubSub); +WINPR_API BOOL PubSub_Unlock(wPubSub* pubSub); + +WINPR_API wEventType* PubSub_GetEventTypes(wPubSub* pubSub, int* count); +WINPR_API void PubSub_AddEventTypes(wPubSub* pubSub, wEventType* events, int count); +WINPR_API wEventType* PubSub_FindEventType(wPubSub* pubSub, const char* EventName); + +WINPR_API int PubSub_Subscribe(wPubSub* pubSub, const char* EventName, pEventHandler EventHandler); +WINPR_API int PubSub_Unsubscribe(wPubSub* pubSub, const char* EventName, pEventHandler EventHandler); + +WINPR_API int PubSub_OnEvent(wPubSub* pubSub, const char* EventName, void* context, wEventArgs* e); + +WINPR_API wPubSub* PubSub_New(BOOL synchronized); +WINPR_API void PubSub_Free(wPubSub* pubSub); + #ifdef __cplusplus } #endif diff --git a/winpr/include/winpr/stream.h b/winpr/include/winpr/stream.h index 0232841ad..e9805714b 100644 --- a/winpr/include/winpr/stream.h +++ b/winpr/include/winpr/stream.h @@ -57,6 +57,11 @@ WINPR_API void Stream_Free(wStream* s, BOOL bFreeBuffer); (((UINT16)(*(_s->pointer + 1))) << 8); \ _s->pointer += 2; } while (0) +#define Stream_Read_INT16(_s, _v) do { _v = \ + (INT16)(*_s->pointer) + \ + (((INT16)(*(_s->pointer + 1))) << 8); \ + _s->pointer += 2; } while (0) + #define Stream_Read_UINT16_BE(_s, _v) do { _v = \ (((UINT16)(*_s->pointer)) << 8) + \ (UINT16)(*(_s->pointer + 1)); \ diff --git a/winpr/include/winpr/wtypes.h b/winpr/include/winpr/wtypes.h index a840f16ad..2aa8bb813 100644 --- a/winpr/include/winpr/wtypes.h +++ b/winpr/include/winpr/wtypes.h @@ -47,9 +47,11 @@ #if defined(__APPLE__) typedef signed char BOOL; #else +#ifndef XMD_H typedef int BOOL; #endif #endif +#endif typedef BOOL *PBOOL, *LPBOOL; @@ -87,7 +89,9 @@ typedef int INT, *LPINT; typedef signed char INT8; typedef signed short INT16; typedef signed int INT32; +#ifndef XMD_H typedef signed __int64 INT64; +#endif typedef const WCHAR* LMCSTR; typedef WCHAR* LMSTR; typedef long LONG, *PLONG, *LPLONG; @@ -97,7 +101,10 @@ typedef __int3264 LONG_PTR, *PLONG_PTR; typedef unsigned __int3264 ULONG_PTR, *PULONG_PTR; typedef signed int LONG32; + +#ifndef XMD_H typedef signed __int64 LONG64; +#endif typedef CHAR* PSTR, *LPSTR, *LPCH; typedef const CHAR *LPCSTR,*PCSTR; diff --git a/winpr/libwinpr/handle/handle.h b/winpr/libwinpr/handle/handle.h index 5011e826d..9e9e44a25 100644 --- a/winpr/libwinpr/handle/handle.h +++ b/winpr/libwinpr/handle/handle.h @@ -32,7 +32,7 @@ #define HANDLE_TYPE_ANONYMOUS_PIPE 7 #define WINPR_HANDLE_DEF() \ - ULONG Type; + ULONG Type struct winpr_handle { diff --git a/winpr/libwinpr/pipe/pipe.c b/winpr/libwinpr/pipe/pipe.c index 8b2ee59e9..1363763ee 100644 --- a/winpr/libwinpr/pipe/pipe.c +++ b/winpr/libwinpr/pipe/pipe.c @@ -38,8 +38,6 @@ BOOL CreatePipe(PHANDLE hReadPipe, PHANDLE hWritePipe, LPSECURITY_ATTRIBUTES lpPipeAttributes, DWORD nSize) { - void* ptr; - HANDLE handle; int pipe_fd[2]; WINPR_PIPE* pReadPipe; WINPR_PIPE* pWritePipe; diff --git a/winpr/libwinpr/utils/CMakeLists.txt b/winpr/libwinpr/utils/CMakeLists.txt index 50c6eaad7..2a8c53afe 100644 --- a/winpr/libwinpr/utils/CMakeLists.txt +++ b/winpr/libwinpr/utils/CMakeLists.txt @@ -21,6 +21,7 @@ set(MODULE_PREFIX "WINPR_UTILS") set(${MODULE_PREFIX}_COLLECTIONS_SRCS collections/Queue.c collections/Stack.c + collections/PubSub.c collections/Reference.c collections/ArrayList.c collections/Dictionary.c diff --git a/winpr/libwinpr/utils/cmdline.c b/winpr/libwinpr/utils/cmdline.c index 7ba1822c5..0c998ea4c 100644 --- a/winpr/libwinpr/utils/cmdline.c +++ b/winpr/libwinpr/utils/cmdline.c @@ -49,6 +49,7 @@ int CommandLineParseArgumentsA(int argc, LPCSTR* argv, COMMAND_LINE_ARGUMENT_A* void* context, COMMAND_LINE_PRE_FILTER_FN_A preFilter, COMMAND_LINE_POST_FILTER_FN_A postFilter) { int i, j; + int status; int count; int length; int index; @@ -67,11 +68,16 @@ int CommandLineParseArgumentsA(int argc, LPCSTR* argv, COMMAND_LINE_ARGUMENT_A* int value_index; int toggle; + status = 0; + if (!argv) - return 0; + return status; if (argc == 1) - return COMMAND_LINE_STATUS_PRINT_HELP; + { + status = COMMAND_LINE_STATUS_PRINT_HELP; + return status; + } for (i = 1; i < argc; i++) { @@ -82,7 +88,10 @@ int CommandLineParseArgumentsA(int argc, LPCSTR* argv, COMMAND_LINE_ARGUMENT_A* count = preFilter(context, i, argc, argv); if (count < 0) - return COMMAND_LINE_ERROR; + { + status = COMMAND_LINE_ERROR; + return status; + } if (count > 0) { @@ -257,7 +266,10 @@ int CommandLineParseArgumentsA(int argc, LPCSTR* argv, COMMAND_LINE_ARGUMENT_A* } if (!value && (options[j].Flags & COMMAND_LINE_VALUE_REQUIRED)) - return COMMAND_LINE_ERROR_MISSING_VALUE; + { + status = COMMAND_LINE_ERROR_MISSING_VALUE; + return status; + } options[j].Flags |= COMMAND_LINE_ARGUMENT_PRESENT; @@ -311,7 +323,7 @@ int CommandLineParseArgumentsA(int argc, LPCSTR* argv, COMMAND_LINE_ARGUMENT_A* } } - return 0; + return status; } int CommandLineParseArgumentsW(int argc, LPCWSTR* argv, COMMAND_LINE_ARGUMENT_W* options, DWORD flags, diff --git a/winpr/libwinpr/utils/collections/PubSub.c b/winpr/libwinpr/utils/collections/PubSub.c new file mode 100644 index 000000000..160a0ddf0 --- /dev/null +++ b/winpr/libwinpr/utils/collections/PubSub.c @@ -0,0 +1,229 @@ +/** + * WinPR: Windows Portable Runtime + * Publisher/Subscriber Pattern + * + * Copyright 2012 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 + +/** + * Events (C# Programming Guide) + * http://msdn.microsoft.com/en-us/library/awbftdfh.aspx + */ + +/** + * Properties + */ + +wEventType* PubSub_GetEventTypes(wPubSub* pubSub, int* count) +{ + if (count) + *count = pubSub->count; + + return pubSub->events; +} + +/** + * Methods + */ + +BOOL PubSub_Lock(wPubSub* pubSub) +{ + return (WaitForSingleObject(pubSub->mutex, INFINITE) == WAIT_OBJECT_0) ? TRUE : FALSE; +} + +BOOL PubSub_Unlock(wPubSub* pubSub) +{ + return ReleaseMutex(pubSub->mutex); +} + +wEventType* PubSub_FindEventType(wPubSub* pubSub, const char* EventName) +{ + int index; + wEventType* event = NULL; + + for (index = 0; pubSub->count; index++) + { + if (strcmp(pubSub->events[index].EventName, EventName) == 0) + { + event = &(pubSub->events[index]); + break; + } + } + + return event; +} + +void PubSub_AddEventTypes(wPubSub* pubSub, wEventType* events, int count) +{ + if (pubSub->synchronized) + PubSub_Lock(pubSub); + + while (pubSub->count + count >= pubSub->size) + { + pubSub->size *= 2; + pubSub->events = (wEventType*) realloc(pubSub->events, pubSub->size); + } + + CopyMemory(&pubSub->events[pubSub->count], events, count * sizeof(wEventType)); + pubSub->count += count; + + if (pubSub->synchronized) + PubSub_Unlock(pubSub); +} + +int PubSub_Subscribe(wPubSub* pubSub, const char* EventName, pEventHandler EventHandler) +{ + wEventType* event; + int status = -1; + + if (pubSub->synchronized) + PubSub_Lock(pubSub); + + event = PubSub_FindEventType(pubSub, EventName); + + if (event) + { + status = 0; + + if (event->EventHandlerCount <= MAX_EVENT_HANDLERS) + { + event->EventHandlers[event->EventHandlerCount] = EventHandler; + event->EventHandlerCount++; + } + else + { + status = -1; + } + } + + if (pubSub->synchronized) + PubSub_Unlock(pubSub); + + return status; +} + +int PubSub_Unsubscribe(wPubSub* pubSub, const char* EventName, pEventHandler EventHandler) +{ + int index; + wEventType* event; + int status = -1; + + if (pubSub->synchronized) + PubSub_Lock(pubSub); + + event = PubSub_FindEventType(pubSub, EventName); + + if (event) + { + status = 0; + + for (index = 0; index < event->EventHandlerCount; index++) + { + if (event->EventHandlers[index] == EventHandler) + { + event->EventHandlers[index] = NULL; + event->EventHandlerCount--; + MoveMemory(&event->EventHandlers[index], &event->EventHandlers[index + 1], + (MAX_EVENT_HANDLERS - index - 1) * sizeof(wEventType)); + status = 1; + } + } + } + + if (pubSub->synchronized) + PubSub_Unlock(pubSub); + + return status; +} + +int PubSub_OnEvent(wPubSub* pubSub, const char* EventName, void* context, wEventArgs* e) +{ + int index; + wEventType* event; + int status = -1; + + if (pubSub->synchronized) + PubSub_Lock(pubSub); + + event = PubSub_FindEventType(pubSub, EventName); + + if (event) + { + status = 0; + + for (index = 0; index < event->EventHandlerCount; index++) + { + if (event->EventHandlers[index]) + { + event->EventHandlers[index](context, e); + status++; + } + } + } + + if (pubSub->synchronized) + PubSub_Unlock(pubSub); + + return status; +} + +/** + * Construction, Destruction + */ + +wPubSub* PubSub_New(BOOL synchronized) +{ + wPubSub* pubSub = NULL; + + pubSub = (wPubSub*) malloc(sizeof(wPubSub)); + + if (pubSub) + { + pubSub->synchronized = synchronized; + + if (pubSub->synchronized) + pubSub->mutex = CreateMutex(NULL, FALSE, NULL); + + pubSub->count = 0; + pubSub->size = 64; + + pubSub->events = (wEventType*) malloc(sizeof(wEventType) * pubSub->size); + ZeroMemory(pubSub->events, sizeof(wEventType) * pubSub->size); + } + + return pubSub; +} + +void PubSub_Free(wPubSub* pubSub) +{ + if (pubSub) + { + if (pubSub->synchronized) + CloseHandle(pubSub->mutex); + + if (pubSub->events) + free(pubSub->events); + + free(pubSub); + } +} diff --git a/winpr/libwinpr/utils/test/CMakeLists.txt b/winpr/libwinpr/utils/test/CMakeLists.txt index 307aae204..2656109b0 100644 --- a/winpr/libwinpr/utils/test/CMakeLists.txt +++ b/winpr/libwinpr/utils/test/CMakeLists.txt @@ -7,6 +7,7 @@ set(${MODULE_PREFIX}_DRIVER ${MODULE_NAME}.c) set(${MODULE_PREFIX}_TESTS TestQueue.c TestPrint.c + TestPubSub.c TestArrayList.c TestCmdLine.c TestStreamPool.c diff --git a/winpr/libwinpr/utils/test/TestPubSub.c b/winpr/libwinpr/utils/test/TestPubSub.c new file mode 100644 index 000000000..78478b732 --- /dev/null +++ b/winpr/libwinpr/utils/test/TestPubSub.c @@ -0,0 +1,72 @@ + +#include +#include +#include + +DEFINE_EVENT_BEGIN(MouseMotion) + int x; + int y; +DEFINE_EVENT_END(MouseMotion) + +DEFINE_EVENT_BEGIN(MouseButton) + int x; + int y; + int flags; + int button; +DEFINE_EVENT_END(MouseButton) + +void MouseMotionEventHandler(void* context, MouseMotionEventArgs* e) +{ + printf("MouseMotionEvent: x: %d y: %d\n", e->x, e->y); +} + +void MouseButtonEventHandler(void* context, MouseButtonEventArgs* e) +{ + printf("MouseButtonEvent: x: %d y: %d flags: %d button: %d\n", e->x, e->y, e->flags, e->button); +} + +static wEventType Node_Events[] = +{ + DEFINE_EVENT_ENTRY(MouseMotion) + DEFINE_EVENT_ENTRY(MouseButton) +}; + +#define NODE_EVENT_COUNT (sizeof(Node_Events) / sizeof(wEventType)) + +int TestPubSub(int argc, char* argv[]) +{ + wPubSub* node; + + node = PubSub_New(TRUE); + + PubSub_AddEventTypes(node, Node_Events, NODE_EVENT_COUNT); + + PubSub_SubscribeMouseMotion(node, MouseMotionEventHandler); + PubSub_SubscribeMouseButton(node, MouseButtonEventHandler); + + /* Call Event Handler */ + { + MouseMotionEventArgs e; + + e.x = 64; + e.y = 128; + + PubSub_OnMouseMotion(node, NULL, &e); + } + + { + MouseButtonEventArgs e; + + e.x = 23; + e.y = 56; + e.flags = 7; + e.button = 1; + + PubSub_OnMouseButton(node, NULL, &e); + } + + PubSub_Free(node); + + return 0; +} +