diff --git a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj index 2df7ac7b49fd..d1a1fe278801 100644 --- a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj +++ b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj @@ -134,6 +134,7 @@ 46D7D24420736F1E004CA602 /* topic_generators.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 46D7D23520736F1D004CA602 /* topic_generators.cpp */; }; 46EEFB762087434300E1E75A /* chat_log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 46EEFB742087434200E1E75A /* chat_log.cpp */; }; 46EEFB772087434300E1E75A /* chat_log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 46EEFB742087434200E1E75A /* chat_log.cpp */; }; + 46F54C27211DFB7200374A1C /* apple_version.mm in Sources */ = {isa = PBXBuildFile; fileRef = 46F54C26211DFB7200374A1C /* apple_version.mm */; }; 46F57084205FCE34007031BF /* base64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 469BDB53205C357400DBF748 /* base64.cpp */; }; 46F57085205FCE48007031BF /* crypt_blowfish.c in Sources */ = {isa = PBXBuildFile; fileRef = 46BED4D1205060EA00842FA5 /* crypt_blowfish.c */; }; 46F57086205FCE79007031BF /* hash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8AD121359A600CFBDAB /* hash.cpp */; }; @@ -1464,6 +1465,8 @@ 46DF5BCC1F46173700BE6D24 /* irdya_datetime.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = irdya_datetime.cpp; sourceTree = ""; }; 46EEFB742087434200E1E75A /* chat_log.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = chat_log.cpp; sourceTree = ""; }; 46EEFB752087434200E1E75A /* chat_log.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = chat_log.hpp; sourceTree = ""; }; + 46F54C26211DFB7200374A1C /* apple_version.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = apple_version.mm; path = ../../src/desktop/apple_version.mm; sourceTree = ""; }; + 46F54C28211DFB9100374A1C /* apple_version.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = apple_version.hpp; path = ../../src/desktop/apple_version.hpp; sourceTree = ""; }; 46F5709D205FF856007031BF /* fs_commit.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = fs_commit.hpp; sourceTree = ""; }; 46F5709E205FF856007031BF /* addon_utils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = addon_utils.cpp; sourceTree = ""; }; 46F5709F205FF856007031BF /* blacklist.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = blacklist.hpp; sourceTree = ""; }; @@ -2846,6 +2849,8 @@ children = ( F40A13BD1A3AA56800C4D071 /* apple_notification.hpp */, F40A13BB1A3A88BA00C4D071 /* apple_notification.mm */, + 46F54C28211DFB9100374A1C /* apple_version.hpp */, + 46F54C26211DFB7200374A1C /* apple_version.mm */, B559986A0EC616B3008DD061 /* SDLMain.h */, B559986B0EC616B3008DD061 /* SDLMain.mm */, ); @@ -4951,6 +4956,7 @@ 62D24F321519987400350848 /* context_manager.cpp in Sources */, EC59F2611A4529D2001910CB /* context.cpp in Sources */, B597EBEE0FC082AB00CE81F5 /* contexts.cpp in Sources */, + 46F54C27211DFB7200374A1C /* apple_version.mm in Sources */, B54AC6D90FEA9EB5006F6FBD /* contexts.cpp in Sources */, B54AC6E00FEA9EB5006F6FBD /* contexts.cpp in Sources */, B5A9BD5E0ECA805A002BE442 /* styled_widget.cpp in Sources */, diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e3b697e305c3..b5c8c132124f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -266,6 +266,7 @@ if(APPLE) set(libwesnoth-game_STAT_SRC ${libwesnoth-game_STAT_SRC} desktop/apple_notification.mm + desktop/apple_version.mm ) endif(APPLE) diff --git a/src/SConscript b/src/SConscript index 65e8220960cd..035617e0b84a 100644 --- a/src/SConscript +++ b/src/SConscript @@ -90,6 +90,7 @@ if env["PLATFORM"] == "win32": if env["PLATFORM"] == 'darwin': wesnoth_client_sources.append("desktop/apple_notification.mm") + wesnoth_client_sources.append("desktop/apple_version.mm") if env["notifications"]: wesnoth_client_sources.append("desktop/dbus_notification.cpp") diff --git a/src/desktop/apple_version.hpp b/src/desktop/apple_version.hpp new file mode 100644 index 000000000000..8924cf384316 --- /dev/null +++ b/src/desktop/apple_version.hpp @@ -0,0 +1,27 @@ +/* + Copyright (C) 2018 by Martin HrubĂ˝ + Part of the Battle for Wesnoth Project https://www.wesnoth.org/ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY. + + See the COPYING file for more details. + */ + +#pragma once + +#include "version.hpp" + +#include + +namespace desktop { + namespace apple { + + std::string os_version(); + + } // end namespace apple +} // end namespace desktop diff --git a/src/desktop/apple_version.mm b/src/desktop/apple_version.mm new file mode 100644 index 000000000000..d34b1be7766e --- /dev/null +++ b/src/desktop/apple_version.mm @@ -0,0 +1,59 @@ +/* + Copyright (C) 2018 by Martin HrubĂ˝ + Part of the Battle for Wesnoth Project https://www.wesnoth.org/ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY. + + See the COPYING file for more details. + */ + +#ifdef __APPLE__ + +#include "apple_version.hpp" + +#import "../version.hpp" + +#if defined(__APPLE__) && defined(__MACH__) && defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) +#define __IPHONEOS__ (__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__*1000) +#endif + +#if defined(__IPHONEOS__) +//TODO: Implement iOS version detection +#else +#import +#endif + +namespace desktop { + namespace apple { + std::string os_version() { +#if defined(__IPHONEOS__) + //TODO: Implement iOS version detection +#else + std::string version_string = "Apple"; + NSArray *version_array = [[[NSProcessInfo processInfo] operatingSystemVersionString] componentsSeparatedByString:@" "]; + + const version_info version_info([[version_array objectAtIndex:1] UTF8String]); + + if (version_info.major_version() == 10 && version_info.minor_version() < 12) { + version_string += " OS X "; + } else { + version_string += " macOS "; + } + + version_string += [[version_array objectAtIndex:1] UTF8String]; + version_string += " ("; + version_string += [[version_array objectAtIndex:3] UTF8String]; + + return version_string; +#endif + } + + } // end namespace apple +} // end namespace desktop + +#endif //end __APPLE__ diff --git a/src/desktop/version.cpp b/src/desktop/version.cpp index 00efb683089a..95415c929984 100644 --- a/src/desktop/version.cpp +++ b/src/desktop/version.cpp @@ -21,11 +21,14 @@ #include "gettext.hpp" #include "log.hpp" #include "serialization/unicode.hpp" -#include "../version.hpp" #include -#if defined(_X11) || defined(__APPLE__) +#if defined(__APPLE__) + +#include "apple_version.hpp" + +#elif defined(_X11) #include #include @@ -71,7 +74,7 @@ bool on_wine() } #endif -#if defined(_X11) || defined(__APPLE__) +#if defined(_X11) /** * Release policy for POSIX pipe streams opened with popen(3). */ @@ -117,49 +120,15 @@ std::string read_pipe_line(scoped_posix_pipe& p) std::string os_version() { -#if defined(_X11) || defined(__APPLE__) - -#ifdef __APPLE__ +#if defined(__APPLE__) // // Standard Mac OS X version // - std::string version_string = "Apple"; - - static const std::string version_plist = "/System/Library/CoreServices/SystemVersion.plist"; - static const std::string defaults_bin = "/usr/bin/defaults"; - - if(filesystem::file_exists(defaults_bin) && filesystem::file_exists(version_plist)) { - static const std::string cmdline_version = defaults_bin + " read " + version_plist + " ProductUserVisibleVersion"; - static const std::string cmdline_build = defaults_bin + " read " + version_plist + " ProductBuildVersion"; - - scoped_posix_pipe p_version(popen(cmdline_version.c_str(), "r")); - const std::string& version = read_pipe_line(p_version); - - scoped_posix_pipe p_build(popen(cmdline_build.c_str(), "r")); - const std::string& build = read_pipe_line(p_build); - - if(!version.empty()) { - const version_info version_info(version); - - if (version_info.major_version() == 10 && version_info.minor_version() < 12) { - version_string += " OS X "; - } else { - version_string += " macOS "; - } - - version_string += version; - } - - if(!build.empty()) { - version_string += " (" + build + ")"; - } - } - - return version_string; + return desktop::apple::os_version(); -#else +#elif defined(_X11) // // Linux Standard Base version. @@ -183,10 +152,9 @@ std::string os_version() return ver; } } -#endif // - // POSIX uname version. + // POSIX uname version fallback. // utsname u;