diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 index fef711ec252f..2de0d8419ed8 --- a/.gitignore +++ b/.gitignore @@ -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 ca6e154b05da..67cde27f3aff --- 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) @@ -194,6 +194,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 +227,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 000000000000..cb6976502de6 --- /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/client/Mac/CMakeLists.txt b/client/Mac/CMakeLists.txt old mode 100644 new mode 100755 index fb0c85d3a957..fbc27e869279 --- a/client/Mac/CMakeLists.txt +++ b/client/Mac/CMakeLists.txt @@ -1,4 +1,3 @@ - project(MacFreeRDP-library) # add directory for App @@ -29,6 +28,14 @@ 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) + +message(WARNING "public headers:" ${${MODULE_NAME}_HEADERS}) + # Include XIB file in Xcode resources. if("${CMAKE_GENERATOR}" MATCHES "Xcode") message(STATUS "Adding Xcode XIB resources for ${MODULE_NAME}") @@ -37,10 +44,7 @@ endif("${CMAKE_GENERATOR}" MATCHES "Xcode") add_library(${MODULE_NAME} SHARED - MRDPView.h - MRDPView.m - MRDPCursor.m - PasswordDialog.m + ${${MODULE_NAME}_SRC} ${${MODULE_NAME}_RESOURCES}) # configures the framework to always be looked for in the application bundle in the Frameworks sub-folder. @@ -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,35 @@ 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() - - -# 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} -) +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() -# 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/$" -# ) + # 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() + endforeach() + endforeach() +endif() # Add post-build NIB file generation in unix makefiles. XCode handles this implicitly. if("${CMAKE_GENERATOR}" MATCHES "Unix Makefiles") @@ -153,4 +154,22 @@ if("${CMAKE_GENERATOR}" MATCHES "Unix Makefiles") COMMENT "Compiling ${xib}") endforeach() + # 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} + + ) + + endif() diff --git a/client/Mac/MRDPView.h b/client/Mac/MRDPView.h old mode 100644 new mode 100755 index 96b6f2bd0bcb..1845f481a51a --- a/client/Mac/MRDPView.h +++ b/client/Mac/MRDPView.h @@ -19,6 +19,8 @@ #import + + #ifdef HAVE_RAIL #import "MRDPWindow.h" #endif @@ -36,9 +38,9 @@ #import "freerdp/rail/rail.h" #import "freerdp/rail.h" #import "freerdp/utils/rail.h" -*/ - +#import "mf_interface.h" +*/ @interface MRDPView : NSView { diff --git a/client/Mac/cli/CMakeLists.txt b/client/Mac/cli/CMakeLists.txt index 789bd5cde425..1c55053da74d 100644 --- a/client/Mac/cli/CMakeLists.txt +++ b/client/Mac/cli/CMakeLists.txt @@ -18,7 +18,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") @@ -60,10 +60,10 @@ 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 set_target_properties(${MODULE_NAME} PROPERTIES XCODE_ATTRIBUTE_FRAMEWORK_SEARCH_PATHS @@ -112,7 +112,7 @@ if("${CMAKE_GENERATOR}" MATCHES "Unix Makefiles") # 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) + 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 foreach(xib ${${MODULE_NAME}_XIBS}) @@ -120,8 +120,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_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/mf_event.c b/client/Mac/mf_event.c new file mode 100755 index 000000000000..9b2e2085cd95 --- /dev/null +++ b/client/Mac/mf_event.c @@ -0,0 +1,32 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Event Handling + * + * 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include + +#include "mf_interface.h" +#include "mf_event.h" + diff --git a/client/Mac/mf_event.h b/client/Mac/mf_event.h new file mode 100755 index 000000000000..1e8ee5ff158d --- /dev/null +++ b/client/Mac/mf_event.h @@ -0,0 +1,31 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Event Handling + * + * 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 __WF_EVENT_H +#define __WF_EVENT_H + +#ifdef WITH_DEBUG_KBD +#define DEBUG_KBD(fmt, ...) DEBUG_CLASS(KBD, fmt, ## __VA_ARGS__) +#else +#define DEBUG_KBD(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__) +#endif + +#endif /* __WF_EVENT_H */ diff --git a/client/Mac/mf_interface.c b/client/Mac/mf_interface.c new file mode 100755 index 000000000000..d2806c18728e --- /dev/null +++ b/client/Mac/mf_interface.c @@ -0,0 +1,318 @@ +/** + * 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 + +/** + * Client Interface + */ + +int freerdp_client_global_init() +{ +// setlocale(LC_ALL, ""); + freerdp_handle_signals(); + freerdp_channels_global_init(); + + return 0; +} + +int freerdp_client_global_uninit() +{ + freerdp_channels_global_uninit(); + + return 0; +} + +int freerdp_client_start(void* cfi) +{ + mfInfo* mfi = (mfInfo*) cfi; + + rdpSettings* settings = mfi->instance->settings; + + if (!settings->ServerHostname) + { + fprintf(stderr, "error: server hostname was not specified with /v:[:port]\n"); + return -1; + } + + //mfi->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) mf_thread, (void*) mfi->instance, 0, NULL); + + return 0; +} + +int freerdp_client_stop(void* cfi) +{ + mfInfo* mfi = (mfInfo*) cfi; + +// if (mfi->instance->settings->AsyncInput) +// { +// wMessageQueue* queue; +// queue = freerdp_get_message_queue(mfi->instance, FREERDP_INPUT_MESSAGE_QUEUE); +// MessageQueue_PostQuit(queue, 0); +// } +// else +// { +// mfi->disconnect = TRUE; +// } + + return 0; +} + +void* freerdp_client_get_instance(void* cfi) +{ + mfInfo* mfi = (mfInfo*) cfi; + return mfi->instance; +} + +HANDLE freerdp_client_get_thread(void* cfi) +{ + mfInfo* mfi = (mfInfo*) cfi; + + return mfi->thread; +} + +void* freerdp_client_get_interface(void* cfi) +{ + mfInfo* mfi = (mfInfo*) cfi; + + return mfi->client; +} + +cfInfo* freerdp_client_new(int argc, char** argv) +{ + int index; + int status; + mfInfo* mfi; + rdpFile* file; + freerdp* instance; + rdpSettings* settings; + + instance = freerdp_new(); +// instance->PreConnect = mf_pre_connect; +// instance->PostConnect = mf_post_connect; +// instance->Authenticate = mf_authenticate; +// instance->VerifyCertificate = mf_verify_certificate; +// instance->LogonErrorInfo = mf_logon_error_info; +// instance->ReceiveChannelData = mf_receive_channel_data; + + instance->context_size = sizeof(mfContext); + instance->ContextNew = (pContextNew) mf_context_new; + instance->ContextFree = (pContextFree) mf_context_free; + freerdp_context_new(instance); + + 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]); + + mfi = (mfInfo*) malloc(sizeof(mfInfo)); + ZeroMemory(mfi, sizeof(mfInfo)); + + ((mfContext*) instance->context)->mfi = mfi; + + mfi->instance = instance; + settings = instance->settings; + mfi->client = instance->context->client; + + status = freerdp_client_parse_command_line_arguments(instance->context->argc, + instance->context->argv, settings); + if (status < 0) + { + freerdp_context_free(mfi->instance); + freerdp_free(mfi->instance); + free(mfi); + 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); + } + + 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; + 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; + +// if (settings->ListMonitors) +// { +// mf_list_monitors(mfi); +// } + + return mfi; +} + +void freerdp_client_free(void* cfi) +{ + mfInfo* mfi = (mfInfo*) cfi; + + if (mfi) + { + int index; + rdpContext* context; + +// mf_window_free(mfi); + +// free(mfi->bmp_codec_none); + +// XCloseDisplay(mfi->display); + +// context = (rdpContext*) mfi->context; + + for (index = 0; index < context->argc; index++) + free(context->argv[index]); + + free(context->argv); + + freerdp_context_free(mfi->instance); + freerdp_free(mfi->instance); + + free(mfi); + } +} + + +BOOL freerdp_client_get_param_bool(void* cfi, int id) +{ + mfInfo* mfi = (mfInfo*) cfi; + rdpSettings* settings = mfi->instance->settings; + + return freerdp_get_param_bool(settings, id); +} + +int freerdp_client_set_param_bool(void* cfi, int id, BOOL param) +{ + mfInfo* mfi = (mfInfo*) cfi; + rdpSettings* settings = mfi->instance->settings; + + return freerdp_set_param_bool(settings, id, param); +} + +UINT32 freerdp_client_get_param_uint32(void* cfi, int id) +{ + mfInfo* mfi = (mfInfo*) cfi; + rdpSettings* settings = mfi->instance->settings; + + return freerdp_get_param_uint32(settings, id); +} + +int freerdp_client_set_param_uint32(void* cfi, int id, UINT32 param) +{ + mfInfo* mfi = (mfInfo*) cfi; + rdpSettings* settings = mfi->instance->settings; + + return freerdp_set_param_uint32(settings, id, param); +} + +UINT64 freerdp_client_get_param_uint64(void* cfi, int id) +{ + mfInfo* mfi = (mfInfo*) cfi; + rdpSettings* settings = mfi->instance->settings; + + return freerdp_get_param_uint64(settings, id); +} + +int freerdp_client_set_param_uint64(void* cfi, int id, UINT64 param) +{ + mfInfo* mfi = (mfInfo*) cfi; + rdpSettings* settings = mfi->instance->settings; + + return freerdp_set_param_uint64(settings, id, param); +} + +char* freerdp_client_get_param_string(void* cfi, int id) +{ + mfInfo* mfi = (mfInfo*) cfi; + rdpSettings* settings = mfi->instance->settings; + + return freerdp_get_param_string(settings, id); +} + +int freerdp_client_set_param_string(void* cfi, int id, char* param) +{ + mfInfo* mfi = (mfInfo*) cfi; + rdpSettings* settings = mfi->instance->settings; + + return freerdp_set_param_string(settings, id, param); +} + + +void freerdp_client_mouse_event(void* cfi, DWORD flags, int x, int y) +{ + int width, height; + mfInfo* mfi = (mfInfo*) cfi; + rdpInput* input = mfi->instance->input; + rdpSettings* settings = mfi->instance->settings; + + width = settings->DesktopWidth; + height = settings->DesktopHeight; + + if (x < 0) + x = 0; + + if (x >= width) + x = width - 1; + + if (y < 0) + y = 0; + + if (y >= height) + y = height - 1; + + input->MouseEvent(input, flags, x, y); +} diff --git a/client/Mac/mf_interface.h b/client/Mac/mf_interface.h new file mode 100755 index 000000000000..32d91a22fb2b --- /dev/null +++ b/client/Mac/mf_interface.h @@ -0,0 +1,82 @@ +/** + * 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_INTERFACE_H +#define __MF_INTERFACE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mfreerdp.h" +#include + +// Callback type codes. Move elsewhere? +#define CALLBACK_TYPE_PARAM_CHANGE 0x01 +#define CALLBACK_TYPE_CONNECTED 0x02 +#define CALLBACK_TYPE_DISCONNECTED 0x03 + +// Public API functions + +FREERDP_API int freerdp_client_global_init(); +FREERDP_API int freerdp_client_global_uninit(); + +FREERDP_API int freerdp_client_start(void* cfi); // mfInfo +FREERDP_API int freerdp_client_stop(void* cfi); // mfInfo + +FREERDP_API void* freerdp_client_get_thread(void* cfi); // HANDLE, mfInfo +FREERDP_API void* freerdp_client_get_instance(void* cfi); // freerdp, mfInfo +FREERDP_API void* freerdp_client_get_interface(void* cfi); // rdpClient, mfInfo + +FREERDP_API int freerdp_client_focus_in(void* cfi); // mfInfo +FREERDP_API int freerdp_client_focus_out(void* cfi); // mfInfo + +FREERDP_API int freerdp_client_set_window_size(void* cfi, int width, int height); + +FREERDP_API cfInfo* freerdp_client_new(int argc, char** argv); // cfInfo* +FREERDP_API void freerdp_client_free(cfInfo* cfi); // mfInfo* + +FREERDP_API int freerdp_client_set_client_callback_function(void* cfi, void* callbackFunc); + +FREERDP_API void* freerdp_client_get_settings(void* cfi); // rdpSettings*, mfInfo* + +FREERDP_API int freerdp_client_load_settings_from_rdp_file(void* cfi, char* filename); // mfInfo* +FREERDP_API int freerdp_client_save_settings_to_rdp_file(void* cfi, char* filename); // mfInfo* + +FREERDP_API BOOL freerdp_client_get_param_bool(void* cfi, int id); +FREERDP_API int freerdp_client_set_param_bool(void* cfi, int id, BOOL param); + +FREERDP_API UINT32 freerdp_client_get_param_uint32(void* cfi, int id); +FREERDP_API int freerdp_client_set_param_uint32(void* cfi, int id, UINT32 param); + +FREERDP_API UINT64 freerdp_client_get_param_uint64(void* cfi, int id); +FREERDP_API int freerdp_client_set_param_uint64(void* cfi, int id, UINT64 param); + +FREERDP_API char* freerdp_client_get_param_string(void* cfi, int id); +FREERDP_API int freerdp_client_set_param_string(void* cfi, int id, char* param); + +FREERDP_API void freerdp_client_mouse_event(void* cfi, DWORD flags, int x, int y); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/client/Mac/mfreerdp.c b/client/Mac/mfreerdp.c new file mode 100644 index 000000000000..170a68698743 --- /dev/null +++ b/client/Mac/mfreerdp.c @@ -0,0 +1,109 @@ +/** + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include + +#include "mf_interface.h" +#include "mfreerdp.h" + +static long xv_port = 0; +static const size_t password_size = 512; + + + +mfInfo* mf_mfi_new() +{ + mfInfo* mfi; + + mfi = (mfInfo*) malloc(sizeof(mfInfo)); + ZeroMemory(mfi, sizeof(mfInfo)); + + return mfi; +} + +void mf_mfi_free(mfInfo* mfi) +{ + free(mfi); +} + +void mf_context_new(freerdp* instance, rdpContext* context) +{ + mfInfo* mfi; + + context->channels = freerdp_channels_new(); + + mfi = mf_mfi_new(); + + ((mfContext*) context)->mfi = mfi; + mfi->instance = instance; + + // Register callbacks + instance->context->client->OnParamChange = mf_on_param_change; +} + +void mf_context_free(freerdp* instance, rdpContext* context) +{ + if (context->cache) + cache_free(context->cache); + + freerdp_channels_free(context->channels); + + mf_mfi_free(((mfContext*) context)->mfi); + ((mfContext*) context)->mfi = NULL; +} + +void mf_on_param_change(freerdp* instance, int id) +{ +} diff --git a/client/Mac/mfreerdp.h b/client/Mac/mfreerdp.h new file mode 100644 index 000000000000..380b29e67cbc --- /dev/null +++ b/client/Mac/mfreerdp.h @@ -0,0 +1,144 @@ +#ifndef MFREERDP_H +#define MFREERDP_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mf_event.h" + +#ifdef __cplusplus +} +#endif + + + +// System menu constants +#define SYSCOMMAND_ID_SMARTSIZING 1000 + +typedef struct mf_info mfInfo; + +struct mf_context +{ + rdpContext _p; + + mfInfo* mfi; +}; +typedef struct mf_context mfContext; + +typedef void (CALLBACK * callbackFunc)(mfInfo* mfi, int callback_type, DWORD param1, DWORD param2); + +struct mf_info +{ + rdpClient* client; + + 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 thread; + HANDLE keyboardThread; + + HGDI_DC hdc; + UINT16 srcBpp; + UINT16 dstBpp; + freerdp* instance; + + DWORD mainThreadId; + DWORD keyboardThreadId; + RFX_CONTEXT* rfx_context; + 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; + + // 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 +}; + +/** + * Client Interface + */ + +#define cfInfo mfInfo + +void mf_on_param_change(freerdp* instance, int id); + + + +//FREERDP_API int freerdp_client_global_init(); +//FREERDP_API int freerdp_client_global_uninit(); + +//FREERDP_API int freerdp_client_start(mfInfo* cfi); +//FREERDP_API int freerdp_client_stop(mfInfo* cfi); + +//FREERDP_API HANDLE freerdp_client_get_thread(mfInfo* cfi); +//FREERDP_API freerdp* freerdp_client_get_instance(mfInfo* cfi); +//FREERDP_API rdpClient* freerdp_client_get_interface(mfInfo* cfi); + +//FREERDP_API int freerdp_client_focus_in(mfInfo* cfi); +//FREERDP_API int freerdp_client_focus_out(mfInfo* cfi); + +//FREERDP_API int freerdp_client_set_window_size(mfInfo* cfi, int width, int height); + +//FREERDP_API cfInfo* freerdp_client_new(int argc, char** argv); +//FREERDP_API void freerdp_client_free(mfInfo* cfi); + +//FREERDP_API int freerdp_client_set_client_callback_function(mfInfo* cfi, callbackFunc callbackFunc); + +//FREERDP_API rdpSettings* freerdp_client_get_settings(mfInfo* wfi); + +//FREERDP_API int freerdp_client_load_settings_from_rdp_file(mfInfo* cfi, char* filename); +//FREERDP_API int freerdp_client_save_settings_to_rdp_file(mfInfo* cfi, char* filename); + + +mfInfo* mf_mfi_new(); + +void mf_mfi_free(mfInfo* mfi); + +void mf_context_new(freerdp* instance, rdpContext* context); + +void mf_context_free(freerdp* instance, rdpContext* context); + +void mf_on_param_change(freerdp* instance, int id); + +#endif // MFREERDP_H diff --git a/config.h.in b/config.h.in old mode 100644 new mode 100755 index 864ebda6e10d..c5071fb895b6 --- 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