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