diff --git a/Android.mk b/Android.mk index 6036a3502..0d2916766 100644 --- a/Android.mk +++ b/Android.mk @@ -37,6 +37,8 @@ LOCAL_SRC_FILES := \ $(wildcard $(LOCAL_PATH)/src/loadso/dlopen/*.c) \ $(wildcard $(LOCAL_PATH)/src/locale/*.c) \ $(wildcard $(LOCAL_PATH)/src/locale/android/*.c) \ + $(wildcard $(LOCAL_PATH)/src/misc/*.c) \ + $(wildcard $(LOCAL_PATH)/src/misc/android/*.c) \ $(wildcard $(LOCAL_PATH)/src/power/*.c) \ $(wildcard $(LOCAL_PATH)/src/power/android/*.c) \ $(wildcard $(LOCAL_PATH)/src/filesystem/android/*.c) \ diff --git a/CMakeLists.txt b/CMakeLists.txt index 1bbe2b065..c51044072 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -407,6 +407,7 @@ file(GLOB SOURCE_FILES ${SDL2_SOURCE_DIR}/src/haptic/*.c ${SDL2_SOURCE_DIR}/src/libm/*.c ${SDL2_SOURCE_DIR}/src/locale/*.c + ${SDL2_SOURCE_DIR}/src/misc/*.c ${SDL2_SOURCE_DIR}/src/power/*.c ${SDL2_SOURCE_DIR}/src/render/*.c ${SDL2_SOURCE_DIR}/src/render/*/*.c @@ -941,6 +942,10 @@ if(ANDROID) file(GLOB ANDROID_CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/android/*.c) set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_CORE_SOURCES} ${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c) + file(GLOB ANDROID_MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/android/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_MISC_SOURCES}) + set(HAVE_SDL_MISC TRUE) + # SDL_spinlock.c Needs to be compiled in ARM mode. # There seems to be no better way currently to set the ARM mode. # see: https://issuetracker.google.com/issues/62264618 @@ -1301,6 +1306,10 @@ elseif(UNIX AND NOT APPLE AND NOT ANDROID AND NOT RISCOS) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_LINUX_VERSION_H") endif() + file(GLOB MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/unix/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${MISC_SOURCES}) + set(HAVE_SDL_MISC TRUE) + if(SDL_POWER) if(LINUX) set(SDL_POWER_LINUX 1) @@ -1366,6 +1375,10 @@ elseif(WINDOWS) endif() endif() + file(GLOB MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/windows/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${MISC_SOURCES}) + set(HAVE_SDL_MISC TRUE) + # Check for DirectX if(DIRECTX) if(DEFINED MSVC_VERSION AND NOT ${MSVC_VERSION} LESS 1700) @@ -1606,6 +1619,10 @@ elseif(APPLE) message_error("SDL_FILE must be enabled to build on MacOS X") endif() + file(GLOB MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/macosx/*.m) + set(SOURCE_FILES ${SOURCE_FILES} ${MISC_SOURCES}) + set(HAVE_SDL_MISC TRUE) + if(SDL_AUDIO) set(SDL_AUDIO_DRIVER_COREAUDIO 1) file(GLOB AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/coreaudio/*.m) @@ -1860,6 +1877,10 @@ elseif(APPLE) CheckPTHREAD() elseif(HAIKU) + file(GLOB MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/haiku/*.cc) + set(SOURCE_FILES ${SOURCE_FILES} ${MISC_SOURCES}) + set(HAVE_SDL_MISC TRUE) + if(SDL_VIDEO) set(SDL_VIDEO_DRIVER_HAIKU 1) file(GLOB HAIKUVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/haiku/*.c) @@ -1961,6 +1982,11 @@ if(NOT HAVE_SDL_LOCALE) file(GLOB LOCALE_SOURCES ${SDL2_SOURCE_DIR}/src/locale/dummy/*.c) set(SOURCE_FILES ${SOURCE_FILES} ${LOCALE_SOURCES}) endif() +if(NOT HAVE_SDL_MISC) + set(SDL_MISC_DISABLED 1) + file(GLOB LOCALE_SOURCES ${SDL2_SOURCE_DIR}/src/misc/dummy/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${LOCALE_SOURCES}) +endif() # We always need to have threads and timers around if(NOT HAVE_SDL_THREADS) diff --git a/Makefile.in b/Makefile.in index 2e7db2cdb..834e7c6a4 100644 --- a/Makefile.in +++ b/Makefile.in @@ -87,6 +87,7 @@ HDRS = \ SDL_main.h \ SDL_messagebox.h \ SDL_metal.h \ + SDL_misc.h \ SDL_mouse.h \ SDL_mutex.h \ SDL_name.h \ diff --git a/configure b/configure index 00bf5ebf7..2fc410710 100755 --- a/configure +++ b/configure @@ -17313,6 +17313,7 @@ SOURCES="$SOURCES $srcdir/src/file/*.c" SOURCES="$SOURCES $srcdir/src/haptic/*.c" SOURCES="$SOURCES $srcdir/src/joystick/*.c" SOURCES="$SOURCES $srcdir/src/libm/*.c" +SOURCES="$SOURCES $srcdir/src/misc/*.c" SOURCES="$SOURCES $srcdir/src/power/*.c" #SOURCES="$SOURCES $srcdir/src/filesystem/*.c" SOURCES="$SOURCES $srcdir/src/render/*.c" @@ -24685,6 +24686,9 @@ case "$host" in CheckRPATH CheckVivanteVideo + SOURCES="$SOURCES $srcdir/src/misc/unix/*.c" + have_misc=yes + SOURCES="$SOURCES $srcdir/src/locale/unix/*.c" have_locale=yes @@ -24865,6 +24869,9 @@ $as_echo "#define SDL_TIMER_UNIX 1" >>confdefs.h # Set up the core platform files SOURCES="$SOURCES $srcdir/src/core/windows/*.c" + SOURCES="$SOURCES $srcdir/src/misc/windows/*.c" + have_misc=yes + # Use the Windows locale APIs. SOURCES="$SOURCES $srcdir/src/locale/windows/*.c" have_locale=yes @@ -25121,6 +25128,9 @@ $as_echo "#define SDL_FILESYSTEM_HAIKU 1" >>confdefs.h have_filesystem=yes fi + SOURCES="$SOURCES $srcdir/src/misc/haiku/*.cc" + have_misc=yes + # Set up files for the locale library SOURCES="$SOURCES $srcdir/src/locale/haiku/*.cc" have_locale=yes @@ -25167,6 +25177,9 @@ fi CheckVulkan CheckPTHREAD + SOURCES="$SOURCES $srcdir/src/misc/ios/*.m" + have_misc=yes + # Set up files for the locale library SOURCES="$SOURCES $srcdir/src/locale/macosx/*.m" have_locale=yes @@ -25295,6 +25308,9 @@ $as_echo "#define SDL_VIDEO_RENDER_OGL_ES2 1" >>confdefs.h CheckPTHREAD CheckHIDAPI + SOURCES="$SOURCES $srcdir/src/misc/macosx/*.m" + have_misc=yes + # Set up files for the locale library SOURCES="$SOURCES $srcdir/src/locale/macosx/*.m" have_locale=yes @@ -25514,6 +25530,9 @@ INSTALL_SDL2_CONFIG=$enable_sdl2_config # Verify that we have all the platform specific files we need +if test x$have_misc != xyes; then + SOURCES="$SOURCES $srcdir/src/misc/dummy/*.c" +fi if test x$have_locale != xyes; then SOURCES="$SOURCES $srcdir/src/locale/dummy/*.c" fi diff --git a/configure.ac b/configure.ac index 9b2b324d9..4675d36e9 100644 --- a/configure.ac +++ b/configure.ac @@ -413,6 +413,7 @@ SOURCES="$SOURCES $srcdir/src/file/*.c" SOURCES="$SOURCES $srcdir/src/haptic/*.c" SOURCES="$SOURCES $srcdir/src/joystick/*.c" SOURCES="$SOURCES $srcdir/src/libm/*.c" +SOURCES="$SOURCES $srcdir/src/misc/*.c" SOURCES="$SOURCES $srcdir/src/power/*.c" #SOURCES="$SOURCES $srcdir/src/filesystem/*.c" SOURCES="$SOURCES $srcdir/src/render/*.c" @@ -3533,6 +3534,9 @@ case "$host" in CheckRPATH CheckVivanteVideo + SOURCES="$SOURCES $srcdir/src/misc/unix/*.c" + have_misc=yes + SOURCES="$SOURCES $srcdir/src/locale/unix/*.c" have_locale=yes @@ -3685,6 +3689,9 @@ case "$host" in # Set up the core platform files SOURCES="$SOURCES $srcdir/src/core/windows/*.c" + SOURCES="$SOURCES $srcdir/src/misc/windows/*.c" + have_misc=yes + # Use the Windows locale APIs. SOURCES="$SOURCES $srcdir/src/locale/windows/*.c" have_locale=yes @@ -3861,6 +3868,9 @@ AS_HELP_STRING([--enable-render-d3d], [enable the Direct3D render driver [[defau have_filesystem=yes fi + SOURCES="$SOURCES $srcdir/src/misc/haiku/*.cc" + have_misc=yes + # Set up files for the locale library SOURCES="$SOURCES $srcdir/src/locale/haiku/*.cc" have_locale=yes @@ -3885,6 +3895,9 @@ AS_HELP_STRING([--enable-render-d3d], [enable the Direct3D render driver [[defau CheckVulkan CheckPTHREAD + SOURCES="$SOURCES $srcdir/src/misc/ios/*.m" + have_misc=yes + # Set up files for the locale library SOURCES="$SOURCES $srcdir/src/locale/macosx/*.m" have_locale=yes @@ -3991,6 +4004,9 @@ AS_HELP_STRING([--enable-render-d3d], [enable the Direct3D render driver [[defau CheckPTHREAD CheckHIDAPI + SOURCES="$SOURCES $srcdir/src/misc/macosx/*.m" + have_misc=yes + # Set up files for the locale library SOURCES="$SOURCES $srcdir/src/locale/macosx/*.m" have_locale=yes @@ -4173,6 +4189,9 @@ AC_SUBST([INSTALL_SDL2_CONFIG], [$enable_sdl2_config]) # Verify that we have all the platform specific files we need +if test x$have_misc != xyes; then + SOURCES="$SOURCES $srcdir/src/misc/dummy/*.c" +fi if test x$have_locale != xyes; then SOURCES="$SOURCES $srcdir/src/locale/dummy/*.c" fi diff --git a/include/SDL.h b/include/SDL.h index 9a8f580f1..e2656caf7 100644 --- a/include/SDL.h +++ b/include/SDL.h @@ -60,6 +60,7 @@ #include "SDL_version.h" #include "SDL_video.h" #include "SDL_locale.h" +#include "SDL_misc.h" #include "begin_code.h" /* Set up for C function definitions, even when using C++ */ diff --git a/include/SDL_misc.h b/include/SDL_misc.h new file mode 100644 index 000000000..e6ac925c6 --- /dev/null +++ b/include/SDL_misc.h @@ -0,0 +1,75 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2020 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_misc.h + * + * \brief Include file for SDL API functions that don't fit elsewhere. + */ + +#ifndef SDL_misc_h_ +#define SDL_misc_h_ + +#include "SDL_stdinc.h" + +#include "begin_code.h" + +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Open an URL / URI in the browser or other + * + * Open a URL in a separate, system-provided application. How this works will + * vary wildly depending on the platform. This will likely launch what + * makes sense to handle a specific URL's protocol (a web browser for http://, + * etc), but it might also be able to launch file managers for directories + * and other things. + * + * What happens when you open a URL varies wildly as well: your game window + * may lose focus (and may or may not lose focus if your game was fullscreen + * or grabbing input at the time). On mobile devices, your app will likely + * move to the background or your process might be paused. Any given platform + * may or may not handle a given URL. + * + * If this is unimplemented (or simply unavailable) for a platform, this will + * fail with an error. A successful result does not mean the URL loaded, just + * that we launched something to handle it (or at least believe we did). + * + * All this to say: this function can be useful, but you should definitely + * test it on every platform you target. + * + * \param url A valid URL to open. + * \return 0 on success, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_OpenURL(const char *url); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_filesystem_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL_system.h b/include/SDL_system.h index 8ad0184bc..48878b7aa 100644 --- a/include/SDL_system.h +++ b/include/SDL_system.h @@ -206,13 +206,6 @@ extern DECLSPEC const char * SDLCALL SDL_AndroidGetExternalStoragePath(void); */ extern DECLSPEC SDL_bool SDLCALL SDL_AndroidRequestPermission(const char *permission); -/** - \brief Open an URL / URI in the browser or other - - \return 0 on success, or -1 on error. - */ -extern DECLSPEC int SDLCALL SDL_AndroidOpenURL(const char *url); - #endif /* __ANDROID__ */ /* Platform specific functions for WinRT */ diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c index 598d17137..f8c02ea1d 100644 --- a/src/core/android/SDL_android.c +++ b/src/core/android/SDL_android.c @@ -2469,19 +2469,6 @@ SDL_bool SDL_AndroidRequestPermission(const char *permission) return Android_JNI_RequestPermission(permission); } -int SDL_AndroidOpenURL(const char *url) -{ - JNIEnv *env = Android_JNI_GetEnv(); - int ret = -1; - - if (url) { - jstring jurl = (*env)->NewStringUTF(env, url); - ret = (*env)->CallStaticIntMethod(env, mActivityClass, midOpenURL, jurl); - (*env)->DeleteLocalRef(env, jurl); - } - return ret; -} - void Android_JNI_GetManifestEnvironmentVariables(void) { if (!mActivityClass || !midGetManifestEnvironmentVariables) { diff --git a/src/dynapi/SDL_dynapi_overrides.h b/src/dynapi/SDL_dynapi_overrides.h index bbdc9da99..8720258e7 100644 --- a/src/dynapi/SDL_dynapi_overrides.h +++ b/src/dynapi/SDL_dynapi_overrides.h @@ -766,4 +766,4 @@ #define SDL_truncf SDL_truncf_REAL #define SDL_GetPreferredLocales SDL_GetPreferredLocales_REAL #define SDL_AndroidRequestPermission SDL_AndroidRequestPermission_REAL -#define SDL_AndroidOpenURL SDL_AndroidOpenURL_REAL +#define SDL_OpenURL SDL_OpenURL_REAL diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h index 885d17729..bb5843d61 100644 --- a/src/dynapi/SDL_dynapi_procs.h +++ b/src/dynapi/SDL_dynapi_procs.h @@ -826,5 +826,5 @@ SDL_DYNAPI_PROC(float,SDL_truncf,(float a),(a),return) SDL_DYNAPI_PROC(SDL_Locale *,SDL_GetPreferredLocales,(void),(),return) #ifdef __ANDROID__ SDL_DYNAPI_PROC(SDL_bool,SDL_AndroidRequestPermission,(const char *a),(a),return) -SDL_DYNAPI_PROC(int,SDL_AndroidOpenURL,(const char *a),(a),return) #endif +SDL_DYNAPI_PROC(int,SDL_OpenURL,(const char *a),(a),return) diff --git a/src/misc/SDL_url.c b/src/misc/SDL_url.c new file mode 100644 index 000000000..3f49bb9d2 --- /dev/null +++ b/src/misc/SDL_url.c @@ -0,0 +1,36 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2020 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "../../SDL_internal.h" +#include "SDL_error.h" + +extern int SDL_SYS_OpenURL(const char *url); + +int +SDL_OpenURL(const char *url) +{ + if (!url) { + return SDL_InvalidParamError("url"); + } + return SDL_SYS_OpenURL(url); +} + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/misc/android/SDL_sysurl.c b/src/misc/android/SDL_sysurl.c new file mode 100644 index 000000000..6ee5f8b23 --- /dev/null +++ b/src/misc/android/SDL_sysurl.c @@ -0,0 +1,36 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2020 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "../../SDL_internal.h" +#include "../../core/android/SDL_android.h" + +int +SDL_SYS_OpenURL(const char *url) +{ + JNIEnv *env = Android_JNI_GetEnv(); + jstring jurl = (*env)->NewStringUTF(env, url); + const int ret = (*env)->CallStaticIntMethod(env, mActivityClass, midOpenURL, jurl); + (*env)->DeleteLocalRef(env, jurl); + return ret; +} + +/* vi: set ts=4 sw=4 expandtab: */ + diff --git a/src/misc/dummy/SDL_sysurl.c b/src/misc/dummy/SDL_sysurl.c new file mode 100644 index 000000000..5fa49c0b3 --- /dev/null +++ b/src/misc/dummy/SDL_sysurl.c @@ -0,0 +1,32 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2020 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "../../SDL_internal.h" +#include "SDL_error.h" + +int +SDL_SYS_OpenURL(const char *url) +{ + return SDL_Unimplemented(); +} + +/* vi: set ts=4 sw=4 expandtab: */ + diff --git a/src/misc/haiku/SDL_sysurl.cc b/src/misc/haiku/SDL_sysurl.cc new file mode 100644 index 000000000..150028dd5 --- /dev/null +++ b/src/misc/haiku/SDL_sysurl.cc @@ -0,0 +1,35 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2020 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "../../SDL_internal.h" +#include "SDL_error.h" +#include + +int +SDL_SYS_OpenURL(const char *url) +{ + BUrl burl(url); + const status_t rc = burl.OpenWithPreferredApplication(false); + return (rc == B_NO_ERROR) ? 0 : SDL_SetError("URL open failed (err=%d)", (int) rc); +} + +/* vi: set ts=4 sw=4 expandtab: */ + diff --git a/src/misc/ios/SDL_sysurl.m b/src/misc/ios/SDL_sysurl.m new file mode 100644 index 000000000..73b9fee22 --- /dev/null +++ b/src/misc/ios/SDL_sysurl.m @@ -0,0 +1,34 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2020 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "../../SDL_internal.h" + +int +SDL_SYS_OpenURL(const char *url) +{ @autoreleasepool { + + NSString *nsstr = [NSString stringWithUTF8String:url]; + NSURL *nsurl = [NSURL URLWithString:nsstr]; + return [[UIApplication sharedApplication] openURL:nsurl] ? 0 : -1; +}} + +/* vi: set ts=4 sw=4 expandtab: */ + diff --git a/src/misc/macosx/SDL_sysurl.m b/src/misc/macosx/SDL_sysurl.m new file mode 100644 index 000000000..18324e335 --- /dev/null +++ b/src/misc/macosx/SDL_sysurl.m @@ -0,0 +1,34 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2020 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "../../SDL_internal.h" + +int +SDL_SYS_OpenURL(const char *url) +{ @autoreleasepool +{ + NSString *nsstr = [NSString stringWithUTF8String:url]; + NSURL *nsurl = [NSURL URLWithString:nsstr]; + return [[NSWorkspace sharedWorkspace] openURL:nsurl] ? 0 : -1; +}} + +/* vi: set ts=4 sw=4 expandtab: */ + diff --git a/src/misc/unix/SDL_sysurl.c b/src/misc/unix/SDL_sysurl.c new file mode 100644 index 000000000..df00e930a --- /dev/null +++ b/src/misc/unix/SDL_sysurl.c @@ -0,0 +1,71 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2020 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "../../SDL_internal.h" +#include "SDL_error.h" + +#include +#include +#include +#include +#include +#include + +int +SDL_SYS_OpenURL(const char *url) +{ + const pid_t pid1 = fork(); + if (pid1 == 0) { /* child process */ + /* Notice this is vfork and not fork! */ + const pid_t pid2 = vfork(); + if (pid2 == 0) { /* Grandchild process will try to launch the url */ + execlp("xdg-open", "xdg-open", url, NULL); + _exit(EXIT_FAILURE); + } else if (pid2 < 0) { /* There was an error forking */ + _exit(EXIT_FAILURE); + } else { + /* Child process doesn't wait for possibly-blocking grandchild. */ + _exit(EXIT_SUCCESS); + } + } else if (pid1 < 0) { + return SDL_SetError("fork() failed: %s", strerror(errno)); + } else { + int status; + if (waitpid(pid1, &status, 0) == pid1) { + if (WIFEXITED(status)) { + if (WEXITSTATUS(status) == 0) { + return 0; /* success! */ + } else { + return SDL_SetError("xdg-open reported error or failed to launch: %d", WEXITSTATUS(status)); + } + } else { + return SDL_SetError("xdg-open failed for some reason"); + } + } else { + return SDL_SetError("Waiting on xdg-open failed: %s", strerror(errno)); + } + } + + return 0; +} + +/* vi: set ts=4 sw=4 expandtab: */ + diff --git a/src/misc/windows/SDL_sysurl.c b/src/misc/windows/SDL_sysurl.c new file mode 100644 index 000000000..d4c5a23e6 --- /dev/null +++ b/src/misc/windows/SDL_sysurl.c @@ -0,0 +1,43 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2020 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "../../SDL_internal.h" +#include "../../core/windows/SDL_windows.h" + +/* https://msdn.microsoft.com/en-us/library/windows/desktop/bb762153%28v=vs.85%29.aspx */ +int +SDL_SYS_OpenURL(const char *url) +{ + WCHAR* wurl = WIN_UTF8ToString(url); + int rc; + + if (wurl == NULL) { + return SDL_OutOfMemory(); + } + + /* Success returns value greater than 32. Less is an error. */ + rc = (int) ShellExecuteW(NULL, L"open", wurl, NULL, NULL, SW_SHOWNORMAL); + SDL_free(wurl); + return (rc > 32) ? 0 : WIN_SetError("Couldn't open given URL."); +} + +/* vi: set ts=4 sw=4 expandtab: */ + diff --git a/src/video/haiku/SDL_bvideo.cc b/src/video/haiku/SDL_bvideo.cc index 669a2ae43..817fccf43 100644 --- a/src/video/haiku/SDL_bvideo.cc +++ b/src/video/haiku/SDL_bvideo.cc @@ -37,6 +37,8 @@ extern "C" { #include "SDL_bframebuffer.h" #include "SDL_bevents.h" +#include + /* FIXME: Undefined functions */ // #define HAIKU_PumpEvents NULL #define HAIKU_StartTextInput NULL @@ -193,6 +195,15 @@ void HAIKU_VideoQuit(_THIS) SDL_QuitBeApp(); } +// just sticking this function in here so it's in a C++ source file. +extern "C" { int HAIKU_OpenURL(const char *url); } +int HAIKU_OpenURL(const char *url) +{ + BUrl burl(url); + const status_t rc = burl.OpenWithPreferredApplication(false); + return (rc == B_NO_ERROR) ? 0 : SDL_SetError("URL open failed (err=%d)", (int) rc); +} + #ifdef __cplusplus } #endif diff --git a/test/Makefile.in b/test/Makefile.in index c14692451..41fa6039e 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -60,6 +60,7 @@ TARGETS = \ teststreaming$(EXE) \ testthread$(EXE) \ testtimer$(EXE) \ + testurl$(EXE) \ testver$(EXE) \ testviewport$(EXE) \ testvulkan$(EXE) \ @@ -265,6 +266,9 @@ teststreaming$(EXE): $(srcdir)/teststreaming.c testtimer$(EXE): $(srcdir)/testtimer.c $(CC) -o $@ $^ $(CFLAGS) $(LIBS) +testurl$(EXE): $(srcdir)/testurl.c + $(CC) -o $@ $^ $(CFLAGS) $(LIBS) + testver$(EXE): $(srcdir)/testver.c $(CC) -o $@ $^ $(CFLAGS) $(LIBS) diff --git a/test/testurl.c b/test/testurl.c new file mode 100644 index 000000000..c1b26f0f3 --- /dev/null +++ b/test/testurl.c @@ -0,0 +1,36 @@ +/* + Copyright (C) 1997-2020 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely. +*/ +#include "SDL.h" + +int main(int argc, char **argv) +{ + int i; + if (SDL_Init(SDL_INIT_VIDEO) == -1) { + fprintf(stderr, "SDL_Init failed: %s\n", SDL_GetError()); + return 1; + } + + for (i = 1; i < argc; i++) { + const char *url = argv[i]; + SDL_Log("Opening '%s' ...", url); + if (SDL_OpenURL(url) == 0) { + SDL_Log(" success!"); + } else { + SDL_Log(" failed! %s", SDL_GetError()); + } + } + + SDL_Quit(); + return 0; +} + +/* vi: set ts=4 sw=4 expandtab: */