88
99#include " config.h"
1010#include " platform/sdl/syswm.h"
11+ #include " lib/str.h"
1112
1213#define DEFAULT_FONT_SIZE 12
1314#define DEFAULT_FONT_SIZE_PTS 11
1415
15- extern char g_appPath[];
1616extern int g_debugPort;
1717
1818void appLog (const char *format, ...);
@@ -21,6 +21,12 @@ void appLog(const char *format, ...);
2121#include < SDL_syswm.h>
2222#include < shellapi.h>
2323
24+ WCHAR g_appPath[MAX_PATH + 1 ];
25+
26+ void setupAppPath (const char *path) {
27+ GetModuleFileNameW (NULL , g_appPath, MAX_PATH);
28+ }
29+
2430void loadIcon (SDL_Window *window) {
2531 HINSTANCE handle = ::GetModuleHandle (NULL );
2632 HICON icon = ::LoadIcon (handle, MAKEINTRESOURCE (101 ));
@@ -49,19 +55,19 @@ int getStartupFontSize(SDL_Window *window) {
4955}
5056
5157void launchDebug (const char *file) {
52- STARTUPINFO info = {sizeof (info)};
58+ STARTUPINFOW info = {sizeof (info)};
5359 PROCESS_INFORMATION processInfo;
54- char cmd[1024 ];
55- sprintf (cmd, " -p %d -d %s" , g_debugPort, file);
56- if (!CreateProcess (g_appPath, cmd, NULL , NULL , TRUE , 0 , NULL , NULL , &info, &processInfo)) {
60+ WCHAR cmd[MAX_PATH + 1 ];
61+ swprintf (cmd, MAX_PATH, L " -p %d -d %s" , g_debugPort, file);
62+ if (!CreateProcessW (g_appPath, cmd, NULL , NULL , TRUE , 0 , NULL , NULL , &info, &processInfo)) {
5763 appLog (" failed to start %d %s %s\n " , GetLastError (), g_appPath, cmd);
5864 }
5965}
6066
6167void launch (const char *command, const char *file) {
6268 STARTUPINFO info = {sizeof (info)};
6369 PROCESS_INFORMATION processInfo;
64- char cmd[1024 ];
70+ char cmd[MAX_PATH + 1 ];
6571 sprintf (cmd, " %s -x %s" , command, file);
6672 if (!CreateProcess (command, cmd, NULL , NULL , TRUE , 0 , NULL , NULL , &info, &processInfo)) {
6773 appLog (" failed to start %d %s %s\n " , GetLastError (), command, cmd);
@@ -77,12 +83,25 @@ void browseFile(SDL_Window *window, const char *url) {
7783 }
7884}
7985
86+ void launchExec (const char *file) {
87+ STARTUPINFOW info = {sizeof (info)};
88+ PROCESS_INFORMATION processInfo;
89+ WCHAR cmd[MAX_PATH + 1 ];
90+ swprintf (cmd, MAX_PATH, L" %s -x %s" , g_appPath, file);
91+ if (!CreateProcessW (g_appPath, cmd, NULL , NULL , TRUE , 0 , NULL , NULL , &info, &processInfo)) {
92+ appLog (" failed to start %d %s %s\n " , GetLastError (), g_appPath, cmd);
93+ }
94+ }
95+
8096#else
8197#include < unistd.h>
8298#include < errno.h>
99+ #include < limits.h>
83100#include " icon.h"
84101#include " lib/lodepng/lodepng.h"
85102
103+ char g_appPath[PATH_MAX + 1 ];
104+
86105void loadIcon (SDL_Window *window) {
87106 unsigned w, h;
88107 unsigned char *image;
@@ -165,8 +184,35 @@ void browseFile(SDL_Window *window, const char *url) {
165184 }
166185}
167186
187+ void setupAppPath (const char *path) {
188+ g_appPath[0 ] = ' \0 ' ;
189+ if (path[0 ] == ' /' ||
190+ (path[1 ] == ' :' && ((path[2 ] == ' \\ ' ) || path[2 ] == ' /' ))) {
191+ // full path or C:/
192+ strlcpy (g_appPath, path, sizeof (g_appPath));
193+ } else {
194+ // relative path
195+ char cwd[PATH_MAX + 1 ];
196+ cwd[0 ] = ' \0 ' ;
197+ getcwd (cwd, sizeof (cwd) - 1 );
198+ strlcpy (g_appPath, cwd, sizeof (g_appPath));
199+ strlcat (g_appPath, " /" , sizeof (g_appPath));
200+ strlcat (g_appPath, path, sizeof (g_appPath));
201+ #if defined(__linux__) || defined(__midipix__)
202+ if (access (g_appPath, X_OK) != 0 ) {
203+ // launched via PATH, retrieve full path
204+ ssize_t len = ::readlink (" /proc/self/exe" , g_appPath, sizeof (g_appPath));
205+ if (len == -1 || len == sizeof (g_appPath)) {
206+ len = 0 ;
207+ }
208+ g_appPath[len] = ' \0 ' ;
209+ }
168210#endif
211+ }
212+ }
169213
170214void launchExec (const char *file) {
171215 launch (g_appPath, file);
172216}
217+
218+ #endif
0 commit comments