FreeBSD Bugzilla – Attachment 249758 Details for
Bug 268946
games/renpy: update to 8.0.3 or greater
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Ren'Py 8.2.1 patch
0001-Update-game-renpy-8.2.1-patched-and-running.patch (text/plain), 520.91 KB, created by
Brad D
on 2024-04-06 12:17:35 UTC
(
hide
)
Description:
Ren'Py 8.2.1 patch
Filename:
MIME Type:
Creator:
Brad D
Created:
2024-04-06 12:17:35 UTC
Size:
520.91 KB
patch
obsolete
>From 802628a632bf4d59a53e05132fcb1e5fc4fe7371 Mon Sep 17 00:00:00 2001 >From: Brad D <entertainment@brandongrows.me> >Date: Fri, 5 Apr 2024 23:19:25 -0500 >Subject: [PATCH 5/5] Update: game/renpy 8.2.1 patched and running > >--- > devel/py-game_sdl2/Makefile | 8 +- > devel/py-game_sdl2/distinfo | 6 +- > games/renpy/Makefile | 32 +- > games/renpy/distinfo | 2 +- > .../files/patch-renpy.sh-freebsd-support | 15 + > .../files/patch-tinyfd-3.17.5-upgrade.patch | 13882 ++++++++++++++++ > games/renpy/files/renpy.sh | 3 + > 7 files changed, 13932 insertions(+), 16 deletions(-) > create mode 100644 games/renpy/files/patch-renpy.sh-freebsd-support > create mode 100644 games/renpy/files/patch-tinyfd-3.17.5-upgrade.patch > create mode 100755 games/renpy/files/renpy.sh > >diff --git a/devel/py-game_sdl2/Makefile b/devel/py-game_sdl2/Makefile >index efbd9bf2f324..2da974eb2765 100644 >--- a/devel/py-game_sdl2/Makefile >+++ b/devel/py-game_sdl2/Makefile >@@ -1,11 +1,11 @@ > PORTNAME= game_sdl2 >-PORTVERSION= 7.4.11 >-PORTREVISION= 3 >+PORTVERSION= 8.2.1 >+PORTREVISION= 4 > CATEGORIES= devel python > MASTER_SITES= http://www.renpy.org/dl/${PORTVERSION}/ \ > GENTOO > PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX} >-DISTNAME= py${PORTNAME}-2.1.0-for-renpy-${DISTVERSION} >+DISTNAME= py${PORTNAME}-2.1.0+renpy${DISTVERSION} > > MAINTAINER= social@brandongrows.me > COMMENT= Reimplementation of portions of the pygame API using SDL2 >@@ -19,7 +19,7 @@ LIB_DEPENDS= libpng.so:graphics/png > # Upstream tends to reroll distfiles before moving under /release/ > PORTSCOUT= site:http://www.renpy.org/dl/release/ > >-USES= jpeg localbase python:2.7+ sdl >+USES= jpeg localbase python:3.9+ sdl > USE_SDL= image2 mixer2 ttf2 > USE_PYTHON= autoplist distutils cython > EXCLUDE= gen gen3 PKG-INFO '*.egg-info' >diff --git a/devel/py-game_sdl2/distinfo b/devel/py-game_sdl2/distinfo >index de498f19bb65..64d8e770bdc5 100644 >--- a/devel/py-game_sdl2/distinfo >+++ b/devel/py-game_sdl2/distinfo >@@ -1,3 +1,3 @@ >-TIMESTAMP = 1638428838 >-SHA256 (pygame_sdl2-2.1.0-for-renpy-7.4.11.tar.gz) = ff497cb2f2406b08d99a4e720cab0f42b31e714e427b70b5e93225618262bb5b >-SIZE (pygame_sdl2-2.1.0-for-renpy-7.4.11.tar.gz) = 3969064 >+TIMESTAMP = 1712368771 >+SHA256 (pygame_sdl2-2.1.0+renpy8.2.1.tar.gz) = 6626f7f4dc90d691950963eb2b9fd3977740ca552598a64ac54f297fe3a901d6 >+SIZE (pygame_sdl2-2.1.0+renpy8.2.1.tar.gz) = 4256982 >diff --git a/games/renpy/Makefile b/games/renpy/Makefile >index 3558c08b08e6..19671b36541e 100644 >--- a/games/renpy/Makefile >+++ b/games/renpy/Makefile >@@ -16,14 +16,29 @@ LICENSE_FILE= ${WRKSRC}/LICENSE.txt > LICENSE_FILE_DejaVu= ${WRKSRC}/renpy/common/DejaVuSans.txt > LICENSE_PERMS_DejaVu= dist-mirror dist-sell pkg-mirror pkg-sell auto-accept > >+# most taken from the official build system here: https://github.com/renpy/renpy-build/blob/master/tasks/python3.py > BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}future>0:devel/py-future@${PY_FLAVOR} \ >- ${PYTHON_PKGNAMEPREFIX}game_sdl2>0:devel/py-game_sdl2@${PY_FLAVOR} \ > ${PYTHON_PKGNAMEPREFIX}cython>0:lang/cython@${PY_FLAVOR} \ >- ${PYTHON_PKGNAMEPREFIX}ecdsa>0:security/py-ecdsa@${PY_FLAVOR} >+ ${PYTHON_PKGNAMEPREFIX}ecdsa>0:security/py-ecdsa@${PY_FLAVOR} \ >+ ${PYTHON_PKGNAMEPREFIX}six>0:devel/py-six@${PY_FLAVOR} \ >+ ${PYTHON_PKGNAMEPREFIX}rsa>0:security/py-rsa@${PY_FLAVOR} \ >+ ${PYTHON_PKGNAMEPREFIX}pyasn1>0:devel/py-pyasn1@${PY_FLAVOR} \ >+ ${PYTHON_PKGNAMEPREFIX}urllib3>0:net/py-urllib3@${PY_FLAVOR} \ >+ ${PYTHON_PKGNAMEPREFIX}charset-normalizer>0:textproc/py-charset-normalizer@${PY_FLAVOR} \ >+ ${PYTHON_PKGNAMEPREFIX}certifi>0:security/py-certifi@${PY_FLAVOR} \ >+ ${PYTHON_PKGNAMEPREFIX}idna>0:dns/py-idna@${PY_FLAVOR} \ >+ ${PYTHON_PKGNAMEPREFIX}requests>0:www/py-requests@${PY_FLAVOR} \ >+ ${PYTHON_PKGNAMEPREFIX}pefile>0:devel/py-pefile@${PY_FLAVOR} \ >+ ${PYTHON_PKGNAMEPREFIX}cchardet>0:textproc/py-cchardet@${PY_FLAVOR} \ >+ ${PYTHON_PKGNAMEPREFIX}websockets>0:devel/py-websockets@${PY_FLAVOR} \ >+ ${PYTHON_PKGNAMEPREFIX}game_sdl2>0:devel/py-game_sdl2@${PY_FLAVOR} \ >+ fribidi>0:converters/fribidi \ >+ zenity>0:x11/zenity > LIB_DEPENDS= libfribidi.so:converters/fribidi \ > libpng.so:graphics/png \ > libavcodec.so:multimedia/ffmpeg \ >- libfreetype.so:print/freetype2 >+ libfreetype.so:print/freetype2 \ >+ libharfbuzz.so:print/harfbuzz > RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}future>0:devel/py-future@${PY_FLAVOR} \ > ${PYTHON_PKGNAMEPREFIX}game_sdl2>0:devel/py-game_sdl2@${PY_FLAVOR} > >@@ -40,7 +55,8 @@ TARGET_ORDER_OVERRIDE=610:fix-shebang > BUILD_WRKSRC= ${WRKSRC}/module > INSTALL_WRKSRC= ${BUILD_WRKSRC} > MAKE_ENV+= RENPY_DEPS_INSTALL="${LOCALBASE}" \ >- RENPY_CYTHON=cython-${PYTHON_VER} >+ RENPY_CYTHON=cython-${PYTHON_VER} \ >+ RENPY_PLATFORM="freebsd-x86_64" > PORTDATA= gui launcher renpy renpy.py > PORTDOCS= * > PLIST_FILES= bin/${PORTNAME} >@@ -62,9 +78,6 @@ EXAMPLES_VARS= PORTDATA+="the_question tutorial" > TKINTER_DESC= Install Tkinter to allow choosing Projects Directory > TKINTER_RUN_DEPENDS=${PYTHON_PKGNAMEPREFIX}tkinter>0:x11-toolkits/py-tkinter@${PY_FLAVOR} > >-post-extract: >- @${FIND} ${WRKSRC}/lib ${WRKSRC}/renpy.app -type d -empty -delete >- > post-patch: > @${REINPLACE_CMD} -e 's,/usr/bin/python[[:>:]],${PYTHON_CMD},' \ > ${WRKSRC}/launcher/game/choose_directory.rpy >@@ -85,13 +98,16 @@ add-empty-dirs: > post-install: > ${FIND} ${STAGEDIR}${PYTHONPREFIX_SITELIBDIR} -name \*.so \ > -exec ${STRIP_CMD} {} + >- ${LN} -fs ../${DATADIR_REL}/renpy.py \ >+ install files/renpy.sh \ > ${STAGEDIR}${PREFIX}/bin/${PORTNAME} >+ ${REINPLACE_CMD} -e 's%replace%${DATADIR}%' ${STAGEDIR}${PREFIX}/bin/${PORTNAME} >+ > (cd ${WRKSRC} && ${COPYTREE_SHARE} \ > "${PORTDATA}" ${STAGEDIR}${DATADIR} \ > "! -name *.orig ! -name *.bak \ > ! -name saves ! -name log.txt") > ${CHMOD} +x ${STAGEDIR}${DATADIR}/renpy.py >+ ${CHMOD} +x ${STAGEDIR}${PREFIX}/bin/renpy > > post-install-DOCS-on: > (cd ${WRKSRC}/doc && ${COPYTREE_SHARE} \ >diff --git a/games/renpy/distinfo b/games/renpy/distinfo >index b510a23f72c2..80900092a3f2 100644 >--- a/games/renpy/distinfo >+++ b/games/renpy/distinfo >@@ -1,3 +1,3 @@ >-TIMESTAMP = 1712298031 >+TIMESTAMP = 1712368489 > SHA256 (renpy-8.2.1-sdk.tar.bz2) = 415bcd23f3bc69d61e107d2a4008474327e0bda9899398230094e71af07d2d96 > SIZE (renpy-8.2.1-sdk.tar.bz2) = 138118266 >diff --git a/games/renpy/files/patch-renpy.sh-freebsd-support b/games/renpy/files/patch-renpy.sh-freebsd-support >new file mode 100644 >index 000000000000..d3968337d6e2 >--- /dev/null >+++ b/games/renpy/files/patch-renpy.sh-freebsd-support >@@ -0,0 +1,15 @@ >+--- renpy.sh.orig 2024-04-05 22:20:25.282192000 -0500 >++++ renpy.sh 2024-04-05 22:23:02.119206000 -0500 >+@@ -40,6 +40,12 @@ >+ Linux-*) >+ RENPY_PLATFORM="linux-$(uname -m)" >+ ;; >++ FreeBSD-amd64) >++ RENPY_PLATFORM="freebsd-x86_64" >++ ;; >++ FreeBSD-i*86) >++ RENPY_PLATFORM="freebsd-i386" >++ ;; >+ *) >+ ;; >+ esac >diff --git a/games/renpy/files/patch-tinyfd-3.17.5-upgrade.patch b/games/renpy/files/patch-tinyfd-3.17.5-upgrade.patch >new file mode 100644 >index 000000000000..067140898a9f >--- /dev/null >+++ b/games/renpy/files/patch-tinyfd-3.17.5-upgrade.patch >@@ -0,0 +1,13882 @@ >+--- module/tinyfiledialogs/tinyfiledialogs.c.orig 2024-04-05 20:38:06.709682000 -0500 >++++ module/tinyfiledialogs/tinyfiledialogs.c 2024-04-05 20:38:24.211102000 -0500 >+@@ -1,17 +1,21 @@ >+-/* this file can be renamed with extension ".cpp" and compiled as C++. >+-The code is 100% compatible C C++ >+-(just comment out << extern "C" >> in the header file) */ >++/* SPDX-License-Identifier: Zlib >++Copyright (c) 2014 - 2024 Guillaume Vareille http://ysengrin.com >++ ________________________________________________________________ >++ | | >++ | 100% compatible C C++ -> You can rename this .c file as .cpp | >++ |________________________________________________________________| >+ >+-/*_________ >+- / \ tinyfiledialogs.c v3.8.8 [Apr 22, 2021] zlib licence >++********* TINY FILE DIALOGS OFFICIAL WEBSITE IS ON SOURCEFORGE ********* >++ _________ >++ / \ tinyfiledialogs.c v3.17.5 [Mar 28, 2024] zlib licence >+ |tiny file| Unique code file created [November 9, 2014] >+- | dialogs | Copyright (c) 2014 - 2021 Guillaume Vareille http://ysengrin.com >++ | dialogs | >+ \____ ___/ http://tinyfiledialogs.sourceforge.net >+- \| git clone http://git.code.sf.net/p/tinyfiledialogs/code tinyfd >+- ____________________________________________ >+- | | >+- | email: tinyfiledialogs at ysengrin.com | >+- |____________________________________________| >++ \| git clone http://git.code.sf.net/p/tinyfiledialogs/code tinyfd >++ ____________________________________________ >++ | | >++ | email: tinyfiledialogs at ysengrin.com | >++ |____________________________________________| >+ _________________________________________________________________________________ >+ | | >+ | the windows only wchar_t UTF-16 prototypes are at the bottom of the header file | >+@@ -40,23 +44,28 @@ >+ 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. >+------------ >+ >+-Thanks for contributions, bug corrections & thorough testing to: >+-- Don Heyse http://ldglite.sf.net for bug corrections & thorough testing! >+-- Paul Rouget >++ __________________________________________ >++ | ______________________________________ | >++ | | | | >++ | | DO NOT USE USER INPUT IN THE DIALOGS | | >++ | |______________________________________| | >++ |__________________________________________| >+ */ >+ >+ >+-#ifndef __sun >+-#ifndef _POSIX_C_SOURCE >+-#define _POSIX_C_SOURCE 2 /* to accept POSIX 2 in old ANSI C standards */ >+-#endif >+-#endif >+- >+-#if !defined(_WIN32) && ( defined(__GNUC__) || defined(__clang__) ) >+-#if !defined(_GNU_SOURCE) >++#if defined(__GNUC__) || defined(__clang__) >++#ifndef _GNU_SOURCE >+ #define _GNU_SOURCE /* used only to resolve symbolic links. Can be commented out */ >++ #ifndef _POSIX_C_SOURCE >++ #ifdef __FreeBSD__ >++ #define _POSIX_C_SOURCE 199506L /* 199506L is enough for freebsd for realpath() */ >++ #elif defined(__illumos__) || defined(__solaris__) >++ #define _POSIX_C_SOURCE 200112L /* illumos/solaris needs 200112L for realpath() */ >++ #else >++ #define _POSIX_C_SOURCE 2 /* to accept POSIX 2 in old ANSI C standards */ >++ #endif >++ #endif >+ #endif >+ #endif >+ >+@@ -99,7 +108,7 @@ >+ #endif >+ #define LOW_MULTIPLE_FILES 32 >+ >+-char tinyfd_version[8] = "3.8.8"; >++char tinyfd_version[8] = "3.17.5"; >+ >+ /******************************************************************************************************/ >+ /**************************************** UTF-8 on Windows ********************************************/ >+@@ -134,13 +143,13 @@ >+ char tinyfd_response[1024]; >+ /* if you pass "tinyfd_query" as aTitle, >+ the functions will not display the dialogs >+-but and return 0 for console mode, 1 for graphic mode. >++but return 0 for console mode, 1 for graphic mode. >+ tinyfd_response is then filled with the retain solution. >+ possible values for tinyfd_response are (all lowercase) >+ for graphic mode: >+- windows_wchar windows applescript kdialog zenity zenity3 matedialog >+- shellementary qarma yad python2-tkinter python3-tkinter python-dbus >+- perl-dbus gxmessage gmessage xmessage xdialog gdialog >++ windows_wchar windows applescript kdialog zenity zenity3 yad matedialog >++ shellementary qarma python2-tkinter python3-tkinter python-dbus >++ perl-dbus gxmessage gmessage xmessage xdialog gdialog dunst >+ for console mode: >+ dialog whiptail basicinput no_solution */ >+ >+@@ -157,7 +166,7 @@ >+ \\|\ >+ \ntiny file dialogs on Windows needs:\ >+ \n a graphic display\ >+-\nor dialog.exe (curses console mode)\ >++\nor dialog.exe (curses console mode ** Disabled by default **)\ >+ \nor a console for basic input"; >+ #else >+ char tinyfd_needs[] = "\ >+@@ -171,9 +180,10 @@ >+ \n applescript or kdialog or yad or Xdialog\ >+ \nor zenity (or matedialog or shellementary or qarma)\ >+ \nor python (2 or 3) + tkinter + python-dbus (optional)\ >+-\nor dialog (opens console if needed)\ >++\nor dialog (opens console if needed) ** Disabled by default **\ >+ \nor xterm + bash (opens console for basic input)\ >+-\nor existing console for basic input"; >++\nor existing console for basic input."; >++ >+ #endif >+ >+ #ifdef _MSC_VER >+@@ -184,198 +194,198 @@ >+ >+ static int getenvDISPLAY(void) >+ { >+- return tinyfd_assumeGraphicDisplay || getenv("DISPLAY"); >++ return tinyfd_assumeGraphicDisplay || getenv("DISPLAY"); >+ } >+ >+ >+ static char * getCurDir(void) >+ { >+- static char lCurDir[MAX_PATH_OR_CMD]; >+- return getcwd(lCurDir, sizeof(lCurDir)); >++ static char lCurDir[MAX_PATH_OR_CMD]; >++ return getcwd(lCurDir, sizeof(lCurDir)); >+ } >+ >+ >+ static char * getPathWithoutFinalSlash( >+- char * aoDestination, /* make sure it is allocated, use _MAX_PATH */ >+- char const * aSource) /* aoDestination and aSource can be the same */ >++ char * aoDestination, /* make sure it is allocated, use _MAX_PATH */ >++ char const * aSource) /* aoDestination and aSource can be the same */ >+ { >+- char const * lTmp ; >+- if ( aSource ) >+- { >+- lTmp = strrchr(aSource, '/'); >+- if (!lTmp) >+- { >+- lTmp = strrchr(aSource, '\\'); >+- } >+- if (lTmp) >+- { >+- strncpy(aoDestination, aSource, lTmp - aSource ); >+- aoDestination[lTmp - aSource] = '\0'; >+- } >+- else >+- { >+- * aoDestination = '\0'; >+- } >+- } >+- else >+- { >+- * aoDestination = '\0'; >+- } >+- return aoDestination; >++ char const * lTmp ; >++ if ( aSource ) >++ { >++ lTmp = strrchr(aSource, '/'); >++ if (!lTmp) >++ { >++ lTmp = strrchr(aSource, '\\'); >++ } >++ if (lTmp) >++ { >++ strncpy(aoDestination, aSource, lTmp - aSource ); >++ aoDestination[lTmp - aSource] = '\0'; >++ } >++ else >++ { >++ * aoDestination = '\0'; >++ } >++ } >++ else >++ { >++ * aoDestination = '\0'; >++ } >++ return aoDestination; >+ } >+ >+ >+ static char * getLastName( >+- char * aoDestination, /* make sure it is allocated */ >+- char const * aSource) >++ char * aoDestination, /* make sure it is allocated */ >++ char const * aSource) >+ { >+- /* copy the last name after '/' or '\' */ >+- char const * lTmp ; >+- if ( aSource ) >+- { >+- lTmp = strrchr(aSource, '/'); >+- if (!lTmp) >+- { >+- lTmp = strrchr(aSource, '\\'); >+- } >+- if (lTmp) >+- { >+- strcpy(aoDestination, lTmp + 1); >+- } >+- else >+- { >+- strcpy(aoDestination, aSource); >+- } >+- } >+- else >+- { >+- * aoDestination = '\0'; >+- } >+- return aoDestination; >++ /* copy the last name after '/' or '\' */ >++ char const * lTmp ; >++ if ( aSource ) >++ { >++ lTmp = strrchr(aSource, '/'); >++ if (!lTmp) >++ { >++ lTmp = strrchr(aSource, '\\'); >++ } >++ if (lTmp) >++ { >++ strcpy(aoDestination, lTmp + 1); >++ } >++ else >++ { >++ strcpy(aoDestination, aSource); >++ } >++ } >++ else >++ { >++ * aoDestination = '\0'; >++ } >++ return aoDestination; >+ } >+ >+ >+ static void ensureFinalSlash( char * aioString ) >+ { >+- if ( aioString && strlen( aioString ) ) >+- { >+- char * lastcar = aioString + strlen( aioString ) - 1 ; >+- if ( strncmp( lastcar , SLASH , 1 ) ) >+- { >+- strcat( lastcar , SLASH ) ; >+- } >+- } >++ if ( aioString && strlen( aioString ) ) >++ { >++ char * lastcar = aioString + strlen( aioString ) - 1 ; >++ if ( strncmp( lastcar , SLASH , 1 ) ) >++ { >++ strcat( lastcar , SLASH ) ; >++ } >++ } >+ } >+ >+ >+ static void Hex2RGB( char const aHexRGB[8] , unsigned char aoResultRGB[3] ) >+ { >+- char lColorChannel[8] ; >+- if ( aoResultRGB ) >+- { >+- if ( aHexRGB ) >+- { >+- strcpy(lColorChannel, aHexRGB ) ; >+- aoResultRGB[2] = (unsigned char)strtoul(lColorChannel+5,NULL,16); >+- lColorChannel[5] = '\0'; >+- aoResultRGB[1] = (unsigned char)strtoul(lColorChannel+3,NULL,16); >+- lColorChannel[3] = '\0'; >+- aoResultRGB[0] = (unsigned char)strtoul(lColorChannel+1,NULL,16); >++ char lColorChannel[8] ; >++ if ( aoResultRGB ) >++ { >++ if ( aHexRGB ) >++ { >++ strcpy(lColorChannel, aHexRGB ) ; >++ aoResultRGB[2] = (unsigned char)strtoul(lColorChannel+5,NULL,16); >++ lColorChannel[5] = '\0'; >++ aoResultRGB[1] = (unsigned char)strtoul(lColorChannel+3,NULL,16); >++ lColorChannel[3] = '\0'; >++ aoResultRGB[0] = (unsigned char)strtoul(lColorChannel+1,NULL,16); >+ /* printf("%d %d %d\n", aoResultRGB[0], aoResultRGB[1], aoResultRGB[2]); */ >+- } >+- else >+- { >+- aoResultRGB[0]=0; >+- aoResultRGB[1]=0; >+- aoResultRGB[2]=0; >+- } >+- } >++ } >++ else >++ { >++ aoResultRGB[0]=0; >++ aoResultRGB[1]=0; >++ aoResultRGB[2]=0; >++ } >++ } >+ } >+ >+ static void RGB2Hex( unsigned char const aRGB[3], char aoResultHexRGB[8] ) >+ { >+- if ( aoResultHexRGB ) >+- { >+- if ( aRGB ) >+- { >++ if ( aoResultHexRGB ) >++ { >++ if ( aRGB ) >++ { >+ #if (defined(__cplusplus ) && __cplusplus >= 201103L) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__clang__) >+- sprintf(aoResultHexRGB, "#%02hhx%02hhx%02hhx", aRGB[0], aRGB[1], aRGB[2]); >++ sprintf(aoResultHexRGB, "#%02hhx%02hhx%02hhx", aRGB[0], aRGB[1], aRGB[2]); >+ #else >+- sprintf(aoResultHexRGB, "#%02hx%02hx%02hx", aRGB[0], aRGB[1], aRGB[2]); >++ sprintf(aoResultHexRGB, "#%02hx%02hx%02hx", aRGB[0], aRGB[1], aRGB[2]); >+ #endif >+- /*printf("aoResultHexRGB %s\n", aoResultHexRGB);*/ >+- } >+- else >+- { >+- aoResultHexRGB[0]=0; >+- aoResultHexRGB[1]=0; >+- aoResultHexRGB[2]=0; >+- } >+- } >++ /*printf("aoResultHexRGB %s\n", aoResultHexRGB);*/ >++ } >++ else >++ { >++ aoResultHexRGB[0]=0; >++ aoResultHexRGB[1]=0; >++ aoResultHexRGB[2]=0; >++ } >++ } >+ } >+ >+ >+ void tfd_replaceSubStr( char const * aSource, char const * aOldSubStr, >+- char const * aNewSubStr, char * aoDestination ) >++ char const * aNewSubStr, char * aoDestination ) >+ { >+- char const * pOccurence ; >+- char const * p ; >+- char const * lNewSubStr = "" ; >+- size_t lOldSubLen = strlen( aOldSubStr ) ; >++ char const * pOccurence ; >++ char const * p ; >++ char const * lNewSubStr = "" ; >++ size_t lOldSubLen = strlen( aOldSubStr ) ; >+ >+- if ( ! aSource ) >+- { >+- * aoDestination = '\0' ; >+- return ; >+- } >+- if ( ! aOldSubStr ) >+- { >+- strcpy( aoDestination , aSource ) ; >+- return ; >+- } >+- if ( aNewSubStr ) >+- { >+- lNewSubStr = aNewSubStr ; >+- } >+- p = aSource ; >+- * aoDestination = '\0' ; >+- while ( ( pOccurence = strstr( p , aOldSubStr ) ) != NULL ) >+- { >+- strncat( aoDestination , p , pOccurence - p ) ; >+- strcat( aoDestination , lNewSubStr ) ; >+- p = pOccurence + lOldSubLen ; >+- } >+- strcat( aoDestination , p ) ; >++ if ( ! aSource ) >++ { >++ * aoDestination = '\0' ; >++ return ; >++ } >++ if ( ! aOldSubStr ) >++ { >++ strcpy( aoDestination , aSource ) ; >++ return ; >++ } >++ if ( aNewSubStr ) >++ { >++ lNewSubStr = aNewSubStr ; >++ } >++ p = aSource ; >++ * aoDestination = '\0' ; >++ while ( ( pOccurence = strstr( p , aOldSubStr ) ) != NULL ) >++ { >++ strncat( aoDestination , p , pOccurence - p ) ; >++ strcat( aoDestination , lNewSubStr ) ; >++ p = pOccurence + lOldSubLen ; >++ } >++ strcat( aoDestination , p ) ; >+ } >+ >+ >+ static int filenameValid( char const * aFileNameWithoutPath ) >+ { >+- if ( ! aFileNameWithoutPath >+- || ! strlen(aFileNameWithoutPath) >+- || strpbrk(aFileNameWithoutPath , "\\/:*?\"<>|") ) >+- { >+- return 0 ; >+- } >+- return 1 ; >++ if ( ! aFileNameWithoutPath >++ || ! strlen(aFileNameWithoutPath) >++ || strpbrk(aFileNameWithoutPath , "\\/:*?\"<>|") ) >++ { >++ return 0 ; >++ } >++ return 1 ; >+ } >+ >+ #ifndef _WIN32 >+ >+ static int fileExists( char const * aFilePathAndName ) >+ { >+- FILE * lIn ; >+- if ( ! aFilePathAndName || ! strlen(aFilePathAndName) ) >+- { >+- return 0 ; >+- } >+- lIn = fopen( aFilePathAndName , "r" ) ; >+- if ( ! lIn ) >+- { >+- return 0 ; >+- } >+- fclose( lIn ) ; >+- return 1 ; >++ FILE * lIn ; >++ if ( ! aFilePathAndName || ! strlen(aFilePathAndName) ) >++ { >++ return 0 ; >++ } >++ lIn = fopen( aFilePathAndName , "r" ) ; >++ if ( ! lIn ) >++ { >++ return 0 ; >++ } >++ fclose( lIn ) ; >++ return 1 ; >+ } >+ >+ #endif >+@@ -383,21 +393,21 @@ >+ >+ static void wipefile(char const * aFilename) >+ { >+- int i; >+- struct stat st; >+- FILE * lIn; >++ int i; >++ struct stat st; >++ FILE * lIn; >+ >+- if (stat(aFilename, &st) == 0) >+- { >+- if ((lIn = fopen(aFilename, "w"))) >+- { >+- for (i = 0; i < st.st_size; i++) >+- { >+- fputc('A', lIn); >+- } >+- fclose(lIn); >+- } >+- } >++ if (stat(aFilename, &st) == 0) >++ { >++ if ((lIn = fopen(aFilename, "w"))) >++ { >++ for (i = 0; i < st.st_size; i++) >++ { >++ fputc('A', lIn); >++ } >++ fclose(lIn); >++ } >++ } >+ } >+ >+ >+@@ -408,137 +418,148 @@ >+ if (!aString) return 0; >+ >+ p = aString; >+- while ((p = strchr(p, '\''))) >++ if ( strchr(p, '\'')) >+ { >+ return 1; >+ } >+ >+- p = aString; >+- while ((p = strchr(p, '\"'))) >++ if ( strchr(p, '\"')) >+ { >+ return 1; >+ } >+ >++ if ( strchr(p, '`')) >++ { >++ return 1; >++ } >++ >++ p = aString; >++ while ((p = strchr(p, '$'))) >++ { >++ p ++ ; >++ if ( ( * p == '(' ) || ( * p == '_' ) || isalpha( * p) ) return 1 ; >++ } >++ >+ return 0; >+ } >+ >+ >+ char const * tinyfd_getGlobalChar(char const * aCharVariableName) /* to be called from C# (you don't need this in C or C++) */ >+ { >+- if (!aCharVariableName || !strlen(aCharVariableName)) return NULL; >+- else if (!strcmp(aCharVariableName, "tinyfd_version")) return tinyfd_version; >+- else if (!strcmp(aCharVariableName, "tinyfd_needs")) return tinyfd_needs; >+- else if (!strcmp(aCharVariableName, "tinyfd_response")) return tinyfd_response; >+- else return NULL ; >++ if (!aCharVariableName || !strlen(aCharVariableName)) return NULL; >++ else if (!strcmp(aCharVariableName, "tinyfd_version")) return tinyfd_version; >++ else if (!strcmp(aCharVariableName, "tinyfd_needs")) return tinyfd_needs; >++ else if (!strcmp(aCharVariableName, "tinyfd_response")) return tinyfd_response; >++ else return NULL ; >+ } >+ >+ >+ int tinyfd_getGlobalInt(char const * aIntVariableName) /* to be called from C# (you don't need this in C or C++) */ >+ { >+- if ( !aIntVariableName || !strlen(aIntVariableName) ) return -1 ; >+- else if ( !strcmp(aIntVariableName, "tinyfd_verbose") ) return tinyfd_verbose ; >+- else if ( !strcmp(aIntVariableName, "tinyfd_silent") ) return tinyfd_silent ; >+- else if ( !strcmp(aIntVariableName, "tinyfd_allowCursesDialogs") ) return tinyfd_allowCursesDialogs ; >+- else if ( !strcmp(aIntVariableName, "tinyfd_forceConsole") ) return tinyfd_forceConsole ; >+- else if ( !strcmp(aIntVariableName, "tinyfd_assumeGraphicDisplay") ) return tinyfd_assumeGraphicDisplay ; >++ if ( !aIntVariableName || !strlen(aIntVariableName) ) return -1 ; >++ else if ( !strcmp(aIntVariableName, "tinyfd_verbose") ) return tinyfd_verbose ; >++ else if ( !strcmp(aIntVariableName, "tinyfd_silent") ) return tinyfd_silent ; >++ else if ( !strcmp(aIntVariableName, "tinyfd_allowCursesDialogs") ) return tinyfd_allowCursesDialogs ; >++ else if ( !strcmp(aIntVariableName, "tinyfd_forceConsole") ) return tinyfd_forceConsole ; >++ else if ( !strcmp(aIntVariableName, "tinyfd_assumeGraphicDisplay") ) return tinyfd_assumeGraphicDisplay ; >+ #ifdef _WIN32 >+- else if ( !strcmp(aIntVariableName, "tinyfd_winUtf8") ) return tinyfd_winUtf8 ; >++ else if ( !strcmp(aIntVariableName, "tinyfd_winUtf8") ) return tinyfd_winUtf8 ; >+ #endif >+- else return -1; >++ else return -1; >+ } >+ >+ >+ int tinyfd_setGlobalInt(char const * aIntVariableName, int aValue) /* to be called from C# (you don't need this in C or C++) */ >+ { >+- if (!aIntVariableName || !strlen(aIntVariableName)) return -1 ; >+- else if (!strcmp(aIntVariableName, "tinyfd_verbose")) { tinyfd_verbose = aValue; return tinyfd_verbose; } >+- else if (!strcmp(aIntVariableName, "tinyfd_silent")) { tinyfd_silent = aValue; return tinyfd_silent; } >+- else if (!strcmp(aIntVariableName, "tinyfd_allowCursesDialogs")) { tinyfd_allowCursesDialogs = aValue; return tinyfd_allowCursesDialogs; } >+- else if (!strcmp(aIntVariableName, "tinyfd_forceConsole")) { tinyfd_forceConsole = aValue; return tinyfd_forceConsole; } >+- else if (!strcmp(aIntVariableName, "tinyfd_assumeGraphicDisplay")) { tinyfd_assumeGraphicDisplay = aValue; return tinyfd_assumeGraphicDisplay; } >++ if (!aIntVariableName || !strlen(aIntVariableName)) return -1 ; >++ else if (!strcmp(aIntVariableName, "tinyfd_verbose")) { tinyfd_verbose = aValue; return tinyfd_verbose; } >++ else if (!strcmp(aIntVariableName, "tinyfd_silent")) { tinyfd_silent = aValue; return tinyfd_silent; } >++ else if (!strcmp(aIntVariableName, "tinyfd_allowCursesDialogs")) { tinyfd_allowCursesDialogs = aValue; return tinyfd_allowCursesDialogs; } >++ else if (!strcmp(aIntVariableName, "tinyfd_forceConsole")) { tinyfd_forceConsole = aValue; return tinyfd_forceConsole; } >++ else if (!strcmp(aIntVariableName, "tinyfd_assumeGraphicDisplay")) { tinyfd_assumeGraphicDisplay = aValue; return tinyfd_assumeGraphicDisplay; } >+ #ifdef _WIN32 >+- else if (!strcmp(aIntVariableName, "tinyfd_winUtf8")) { tinyfd_winUtf8 = aValue; return tinyfd_winUtf8; } >++ else if (!strcmp(aIntVariableName, "tinyfd_winUtf8")) { tinyfd_winUtf8 = aValue; return tinyfd_winUtf8; } >+ #endif >+- else return -1; >++ else return -1; >+ } >+ >+ >+ #ifdef _WIN32 >+ static int powershellPresent(void) >+ { /*only on vista and above (or installed on xp)*/ >+- static int lPowershellPresent = -1; >+- char lBuff[MAX_PATH_OR_CMD]; >+- FILE* lIn; >+- char const* lString = "powershell.exe"; >++ static int lPowershellPresent = -1; >++ char lBuff[MAX_PATH_OR_CMD]; >++ FILE* lIn; >++ char const* lString = "powershell.exe"; >+ >+- if (lPowershellPresent < 0) >+- { >+- if (!(lIn = _popen("where powershell.exe", "r"))) >+- { >+- lPowershellPresent = 0; >+- return 0; >+- } >+- while (fgets(lBuff, sizeof(lBuff), lIn) != NULL) >+- { >+- } >+- _pclose(lIn); >+- if (lBuff[strlen(lBuff) - 1] == '\n') >+- { >+- lBuff[strlen(lBuff) - 1] = '\0'; >+- } >+- if (strcmp(lBuff + strlen(lBuff) - strlen(lString), lString)) >+- { >+- lPowershellPresent = 0; >+- } >+- else >+- { >+- lPowershellPresent = 1; >+- } >+- } >+- return lPowershellPresent; >++ if (lPowershellPresent < 0) >++ { >++ if (!(lIn = _popen("where powershell.exe", "r"))) >++ { >++ lPowershellPresent = 0; >++ return 0; >++ } >++ while (fgets(lBuff, sizeof(lBuff), lIn) != NULL) >++ { >++ } >++ _pclose(lIn); >++ if (lBuff[strlen(lBuff) - 1] == '\n') >++ { >++ lBuff[strlen(lBuff) - 1] = '\0'; >++ } >++ if (strcmp(lBuff + strlen(lBuff) - strlen(lString), lString)) >++ { >++ lPowershellPresent = 0; >++ } >++ else >++ { >++ lPowershellPresent = 1; >++ } >++ } >++ return lPowershellPresent; >+ } >+ >+ static int windowsVersion(void) >+ { >+ #if !defined(__MINGW32__) || defined(__MINGW64_VERSION_MAJOR) >+- typedef LONG NTSTATUS ; >+- typedef NTSTATUS(WINAPI* RtlGetVersionPtr)(PRTL_OSVERSIONINFOW); >+- HMODULE hMod; >+- RtlGetVersionPtr lFxPtr; >+- RTL_OSVERSIONINFOW lRovi = { 0 }; >++ typedef LONG NTSTATUS ; >++ typedef NTSTATUS(WINAPI* RtlGetVersionPtr)(PRTL_OSVERSIONINFOW); >++ HMODULE hMod; >++ RtlGetVersionPtr lFxPtr; >++ RTL_OSVERSIONINFOW lRovi = { 0 }; >+ >+- hMod = GetModuleHandleW(L"ntdll.dll"); >+- if (hMod) { >+- lFxPtr = (RtlGetVersionPtr)GetProcAddress(hMod, "RtlGetVersion"); >+- if (lFxPtr) >+- { >+- lRovi.dwOSVersionInfoSize = sizeof(lRovi); >+- if (!lFxPtr(&lRovi)) >+- { >+- return lRovi.dwMajorVersion; >+- } >+- } >+- } >++ hMod = GetModuleHandleW(L"ntdll.dll"); >++ if (hMod) { >++ lFxPtr = (RtlGetVersionPtr)GetProcAddress(hMod, "RtlGetVersion"); >++ if (lFxPtr) >++ { >++ lRovi.dwOSVersionInfoSize = sizeof(lRovi); >++ if (!lFxPtr(&lRovi)) >++ { >++ return lRovi.dwMajorVersion; >++ } >++ } >++ } >+ #endif >+- if (powershellPresent()) return 6; /*minimum is vista or installed on xp*/ >+- return 0; >++ if (powershellPresent()) return 6; /*minimum is vista or installed on xp*/ >++ return 0; >+ } >+ >+ >+ static void replaceChr(char * aString, char aOldChr, char aNewChr) >+ { >+- char * p; >++ char * p; >+ >+- if (!aString) return; >+- if (aOldChr == aNewChr) return; >++ if (!aString) return; >++ if (aOldChr == aNewChr) return; >+ >+- p = aString; >+- while ((p = strchr(p, aOldChr))) >+- { >+- *p = aNewChr; >+- p++; >+- } >+- return; >++ p = aString; >++ while ((p = strchr(p, aOldChr))) >++ { >++ *p = aNewChr; >++ p++; >++ } >++ return; >+ } >+ >+ >+@@ -549,604 +570,623 @@ >+ >+ static int sizeUtf16From8(char const * aUtf8string) >+ { >+- return MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, >+- aUtf8string, -1, NULL, 0); >++ return MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, >++ aUtf8string, -1, NULL, 0); >+ } >+ >+ >+ static int sizeUtf16FromMbcs(char const * aMbcsString) >+ { >+- return MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, >+- aMbcsString, -1, NULL, 0); >++ return MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, >++ aMbcsString, -1, NULL, 0); >+ } >+ >+ >+ static int sizeUtf8(wchar_t const * aUtf16string) >+ { >+- return WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, >+- aUtf16string, -1, NULL, 0, NULL, NULL); >++ return WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, >++ aUtf16string, -1, NULL, 0, NULL, NULL); >+ } >+ >+ >+ static int sizeMbcs(wchar_t const * aMbcsString) >+ { >+- int lRes = WideCharToMultiByte(CP_ACP, 0, >+- aMbcsString, -1, NULL, 0, NULL, NULL); >+- /* DWORD licic = GetLastError(); */ >+- return lRes; >++ int lRes = WideCharToMultiByte(CP_ACP, 0, >++ aMbcsString, -1, NULL, 0, NULL, NULL); >++ /* DWORD licic = GetLastError(); */ >++ return lRes; >+ } >+ >+ >+ wchar_t* tinyfd_mbcsTo16(char const* aMbcsString) >+ { >+- static wchar_t* lMbcsString = NULL; >+- int lSize; >++ static wchar_t* lMbcsString = NULL; >++ int lSize; >+ >+- free(lMbcsString); >+- if (!aMbcsString) { lMbcsString = NULL; return NULL; } >+- lSize = sizeUtf16FromMbcs(aMbcsString); >+- if (lSize) >+- { >+- lMbcsString = (wchar_t*)malloc(lSize * sizeof(wchar_t)); >+- lSize = MultiByteToWideChar(CP_ACP, 0, aMbcsString, -1, lMbcsString, lSize); >+- } >+- else wcscpy(lMbcsString, L""); >+- return lMbcsString; >++ free(lMbcsString); >++ if (!aMbcsString) { lMbcsString = NULL; return NULL; } >++ lSize = sizeUtf16FromMbcs(aMbcsString); >++ if (lSize) >++ { >++ lMbcsString = (wchar_t*) malloc(lSize * sizeof(wchar_t)); >++ lSize = MultiByteToWideChar(CP_ACP, 0, aMbcsString, -1, lMbcsString, lSize); >++ } >++ else wcscpy(lMbcsString, L""); >++ return lMbcsString; >+ } >+ >+ >+ wchar_t * tinyfd_utf8to16(char const * aUtf8string) >+ { >+- static wchar_t * lUtf16string = NULL; >+- int lSize; >++ static wchar_t * lUtf16string = NULL; >++ int lSize; >+ >+- free(lUtf16string); >+- if (!aUtf8string) {lUtf16string = NULL; return NULL;} >+- lSize = sizeUtf16From8(aUtf8string); >+- if (lSize) >+- { >+- lUtf16string = (wchar_t*)malloc(lSize * sizeof(wchar_t)); >+- lSize = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, >+- aUtf8string, -1, lUtf16string, lSize); >+- return lUtf16string; >+- } >+- else >+- { >+- /* let's try mbcs anyway */ >+- lUtf16string = NULL; >+- return tinyfd_mbcsTo16(aUtf8string); >+- } >++ free(lUtf16string); >++ if (!aUtf8string) {lUtf16string = NULL; return NULL;} >++ lSize = sizeUtf16From8(aUtf8string); >++ if (lSize) >++ { >++ lUtf16string = (wchar_t*) malloc(lSize * sizeof(wchar_t)); >++ lSize = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, >++ aUtf8string, -1, lUtf16string, lSize); >++ return lUtf16string; >++ } >++ else >++ { >++ /* let's try mbcs anyway */ >++ lUtf16string = NULL; >++ return tinyfd_mbcsTo16(aUtf8string); >++ } >+ } >+ >+ >+ char * tinyfd_utf16toMbcs(wchar_t const * aUtf16string) >+ { >+- static char * lMbcsString = NULL; >+- int lSize; >++ static char * lMbcsString = NULL; >++ int lSize; >+ >+- free(lMbcsString); >+- if (!aUtf16string) { lMbcsString = NULL; return NULL; } >+- lSize = sizeMbcs(aUtf16string); >+- if (lSize) >+- { >+- lMbcsString = (char*)malloc(lSize); >+- lSize = WideCharToMultiByte(CP_ACP, 0, aUtf16string, -1, lMbcsString, lSize, NULL, NULL); >+- } >+- else strcpy(lMbcsString, ""); >+- return lMbcsString; >++ free(lMbcsString); >++ if (!aUtf16string) { lMbcsString = NULL; return NULL; } >++ lSize = sizeMbcs(aUtf16string); >++ if (lSize) >++ { >++ lMbcsString = (char*) malloc(lSize); >++ lSize = WideCharToMultiByte(CP_ACP, 0, aUtf16string, -1, lMbcsString, lSize, NULL, NULL); >++ } >++ else strcpy(lMbcsString, ""); >++ return lMbcsString; >+ } >+ >+ >+ char * tinyfd_utf8toMbcs(char const * aUtf8string) >+ { >+- wchar_t const * lUtf16string; >+- lUtf16string = tinyfd_utf8to16(aUtf8string); >+- return tinyfd_utf16toMbcs(lUtf16string); >++ wchar_t const * lUtf16string; >++ lUtf16string = tinyfd_utf8to16(aUtf8string); >++ return tinyfd_utf16toMbcs(lUtf16string); >+ } >+ >+ >+ char * tinyfd_utf16to8(wchar_t const * aUtf16string) >+ { >+- static char * lUtf8string = NULL; >+- int lSize; >++ static char * lUtf8string = NULL; >++ int lSize; >+ >+- free(lUtf8string); >+- if (!aUtf16string) { lUtf8string = NULL; return NULL; } >+- lSize = sizeUtf8(aUtf16string); >+- if (lSize) >+- { >+- lUtf8string = (char*)malloc(lSize); >+- lSize = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, aUtf16string, -1, lUtf8string, lSize, NULL, NULL); >+- } >+- else strcpy(lUtf8string, ""); >+- return lUtf8string; >++ free(lUtf8string); >++ if (!aUtf16string) { lUtf8string = NULL; return NULL; } >++ lSize = sizeUtf8(aUtf16string); >++ if (lSize) >++ { >++ lUtf8string = (char*) malloc(lSize); >++ lSize = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, aUtf16string, -1, lUtf8string, lSize, NULL, NULL); >++ } >++ else strcpy(lUtf8string, ""); >++ return lUtf8string; >+ } >+ >+ >+ char * tinyfd_mbcsTo8(char const * aMbcsString) >+ { >+- wchar_t const * lUtf16string; >+- lUtf16string = tinyfd_mbcsTo16(aMbcsString); >+- return tinyfd_utf16to8(lUtf16string); >++ wchar_t const * lUtf16string; >++ lUtf16string = tinyfd_mbcsTo16(aMbcsString); >++ return tinyfd_utf16to8(lUtf16string); >+ } >+ >+ >+ void tinyfd_beep(void) >+ { >+- if (windowsVersion() > 5) Beep(440, 300); >+- else MessageBeep(-1); >++ if (windowsVersion() > 5) Beep(440, 300); >++ else MessageBeep(MB_OK); >+ } >+ >+ >+ static void wipefileW(wchar_t const * aFilename) >+ { >+- int i; >+- FILE * lIn; >+-#if defined(__MINGW32_MAJOR_VERSION) && !defined(__MINGW64__) && (__MINGW32_MAJOR_VERSION <= 3) >+- struct _stat st; >+- if (_wstat(aFilename, &st) == 0) >++ int i; >++ FILE * lIn; >++#if (defined(__MINGW32_MAJOR_VERSION) && !defined(__MINGW64__) && (__MINGW32_MAJOR_VERSION <= 3)) || defined(__BORLANDC__) || defined(__WATCOMC__) >++ struct _stat st; >++ if (_wstat(aFilename, &st) == 0) >+ #else >+- struct __stat64 st; >+- if (_wstat64(aFilename, &st) == 0) >++ struct __stat64 st; >++ if (_wstat64(aFilename, &st) == 0) >+ #endif >+- { >+- if ((lIn = _wfopen(aFilename, L"w"))) >+- { >+- for (i = 0; i < st.st_size; i++) >+- { >+- fputc('A', lIn); >+- } >+- fclose(lIn); >+- } >+- } >++ { >++ if ((lIn = _wfopen(aFilename, L"w"))) >++ { >++ for (i = 0; i < st.st_size; i++) >++ { >++ fputc('A', lIn); >++ } >++ fclose(lIn); >++ } >++ } >+ } >+ >+ >+ static wchar_t * getPathWithoutFinalSlashW( >+- wchar_t * aoDestination, /* make sure it is allocated, use _MAX_PATH */ >+- wchar_t const * aSource) /* aoDestination and aSource can be the same */ >++ wchar_t * aoDestination, /* make sure it is allocated, use _MAX_PATH */ >++ wchar_t const * aSource) /* aoDestination and aSource can be the same */ >+ { >+- wchar_t const * lTmp; >+- if (aSource) >+- { >+- lTmp = wcsrchr(aSource, L'/'); >+- if (!lTmp) >+- { >+- lTmp = wcsrchr(aSource, L'\\'); >+- } >+- if (lTmp) >+- { >+- wcsncpy(aoDestination, aSource, lTmp - aSource); >+- aoDestination[lTmp - aSource] = L'\0'; >+- } >+- else >+- { >+- *aoDestination = L'\0'; >+- } >+- } >+- else >+- { >+- *aoDestination = L'\0'; >+- } >+- return aoDestination; >++ wchar_t const * lTmp; >++ if (aSource) >++ { >++ lTmp = wcsrchr(aSource, L'/'); >++ if (!lTmp) >++ { >++ lTmp = wcsrchr(aSource, L'\\'); >++ } >++ if (lTmp) >++ { >++ wcsncpy(aoDestination, aSource, lTmp - aSource); >++ aoDestination[lTmp - aSource] = L'\0'; >++ } >++ else >++ { >++ *aoDestination = L'\0'; >++ } >++ } >++ else >++ { >++ *aoDestination = L'\0'; >++ } >++ return aoDestination; >+ } >+ >+ >+ static wchar_t * getLastNameW( >+- wchar_t * aoDestination, /* make sure it is allocated */ >+- wchar_t const * aSource) >++ wchar_t * aoDestination, /* make sure it is allocated */ >++ wchar_t const * aSource) >+ { >+- /* copy the last name after '/' or '\' */ >+- wchar_t const * lTmp; >+- if (aSource) >+- { >+- lTmp = wcsrchr(aSource, L'/'); >+- if (!lTmp) >+- { >+- lTmp = wcsrchr(aSource, L'\\'); >+- } >+- if (lTmp) >+- { >+- wcscpy(aoDestination, lTmp + 1); >+- } >+- else >+- { >+- wcscpy(aoDestination, aSource); >+- } >+- } >+- else >+- { >+- *aoDestination = L'\0'; >+- } >+- return aoDestination; >++ /* copy the last name after '/' or '\' */ >++ wchar_t const * lTmp; >++ if (aSource) >++ { >++ lTmp = wcsrchr(aSource, L'/'); >++ if (!lTmp) >++ { >++ lTmp = wcsrchr(aSource, L'\\'); >++ } >++ if (lTmp) >++ { >++ wcscpy(aoDestination, lTmp + 1); >++ } >++ else >++ { >++ wcscpy(aoDestination, aSource); >++ } >++ } >++ else >++ { >++ *aoDestination = L'\0'; >++ } >++ return aoDestination; >+ } >+ >+ >+ static void Hex2RGBW(wchar_t const aHexRGB[8], unsigned char aoResultRGB[3]) >+ { >+- wchar_t lColorChannel[8]; >+- if (aoResultRGB) >+- { >+- if (aHexRGB) >+- { >+- wcscpy(lColorChannel, aHexRGB); >+- aoResultRGB[2] = (unsigned char)wcstoul(lColorChannel + 5, NULL, 16); >+- lColorChannel[5] = '\0'; >+- aoResultRGB[1] = (unsigned char)wcstoul(lColorChannel + 3, NULL, 16); >+- lColorChannel[3] = '\0'; >+- aoResultRGB[0] = (unsigned char)wcstoul(lColorChannel + 1, NULL, 16); >+- /* printf("%d %d %d\n", aoResultRGB[0], aoResultRGB[1], aoResultRGB[2]); */ >+- } >+- else >+- { >+- aoResultRGB[0] = 0; >+- aoResultRGB[1] = 0; >+- aoResultRGB[2] = 0; >+- } >+- } >++ wchar_t lColorChannel[8]; >++ if (aoResultRGB) >++ { >++ if (aHexRGB) >++ { >++ wcscpy(lColorChannel, aHexRGB); >++ aoResultRGB[2] = (unsigned char)wcstoul(lColorChannel + 5, NULL, 16); >++ lColorChannel[5] = '\0'; >++ aoResultRGB[1] = (unsigned char)wcstoul(lColorChannel + 3, NULL, 16); >++ lColorChannel[3] = '\0'; >++ aoResultRGB[0] = (unsigned char)wcstoul(lColorChannel + 1, NULL, 16); >++ /* printf("%d %d %d\n", aoResultRGB[0], aoResultRGB[1], aoResultRGB[2]); */ >++ } >++ else >++ { >++ aoResultRGB[0] = 0; >++ aoResultRGB[1] = 0; >++ aoResultRGB[2] = 0; >++ } >++ } >+ } >+ >+ >+ static void RGB2HexW( unsigned char const aRGB[3], wchar_t aoResultHexRGB[8]) >+ { >+ #if (defined(__cplusplus ) && __cplusplus >= 201103L) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__clang__) >+- wchar_t const * const lPrintFormat = L"#%02hhx%02hhx%02hhx"; >++ wchar_t const * const lPrintFormat = L"#%02hhx%02hhx%02hhx"; >+ #else >+- wchar_t const * const lPrintFormat = L"#%02hx%02hx%02hx"; >++ wchar_t const * const lPrintFormat = L"#%02hx%02hx%02hx"; >+ #endif >+ >+- if (aoResultHexRGB) >+- { >+- if (aRGB) >+- { >+- /* wprintf(L"aoResultHexRGB %s\n", aoResultHexRGB); */ >++ if (aoResultHexRGB) >++ { >++ if (aRGB) >++ { >++ /* wprintf(L"aoResultHexRGB %s\n", aoResultHexRGB); */ >+ #if !defined(__BORLANDC__) && !defined(__TINYC__) && !(defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) >+- swprintf(aoResultHexRGB, 8, lPrintFormat, aRGB[0], aRGB[1], aRGB[2]); >++ swprintf(aoResultHexRGB, 8, lPrintFormat, aRGB[0], aRGB[1], aRGB[2]); >+ #else >+- swprintf(aoResultHexRGB, lPrintFormat, aRGB[0], aRGB[1], aRGB[2]); >++ swprintf(aoResultHexRGB, lPrintFormat, aRGB[0], aRGB[1], aRGB[2]); >+ #endif >+ >+- } >+- else >+- { >+- aoResultHexRGB[0] = 0; >+- aoResultHexRGB[1] = 0; >+- aoResultHexRGB[2] = 0; >+- } >+- } >++ } >++ else >++ { >++ aoResultHexRGB[0] = 0; >++ aoResultHexRGB[1] = 0; >++ aoResultHexRGB[2] = 0; >++ } >++ } >+ } >+ >+ >+ static int dirExists(char const * aDirPath) >+ { >+-#if defined(__MINGW32_MAJOR_VERSION) && !defined(__MINGW64__) && (__MINGW32_MAJOR_VERSION <= 3) >+- struct _stat lInfo; >++#if (defined(__MINGW32_MAJOR_VERSION) && !defined(__MINGW64__) && (__MINGW32_MAJOR_VERSION <= 3)) || defined(__BORLANDC__) || defined(__WATCOMC__) >++ struct _stat lInfo; >+ #else >+- struct __stat64 lInfo; >++ struct __stat64 lInfo; >+ #endif >+- wchar_t * lTmpWChar; >+- int lStatRet; >+- size_t lDirLen; >++ wchar_t * lTmpWChar; >++ int lStatRet; >++ size_t lDirLen; >+ >+- if (!aDirPath) >+- return 0; >+- lDirLen = strlen(aDirPath); >+- if (!lDirLen) >+- return 1; >+- if ( (lDirLen == 2) && (aDirPath[1] == ':') ) >+- return 1; >++ if (!aDirPath) >++ return 0; >++ lDirLen = strlen(aDirPath); >++ if (!lDirLen) >++ return 1; >++ if ( (lDirLen == 2) && (aDirPath[1] == ':') ) >++ return 1; >+ >+- if (tinyfd_winUtf8) >+- { >+- lTmpWChar = tinyfd_utf8to16(aDirPath); >+-#if defined(__MINGW32_MAJOR_VERSION) && !defined(__MINGW64__) && (__MINGW32_MAJOR_VERSION <= 3) >+- lStatRet = _wstat(lTmpWChar, &lInfo); >++ if (tinyfd_winUtf8) >++ { >++ lTmpWChar = tinyfd_utf8to16(aDirPath); >++#if (defined(__MINGW32_MAJOR_VERSION) && !defined(__MINGW64__) && (__MINGW32_MAJOR_VERSION <= 3)) || defined(__BORLANDC__) || defined(__WATCOMC__) >++ lStatRet = _wstat(lTmpWChar, &lInfo); >+ #else >+- lStatRet = _wstat64(lTmpWChar, &lInfo); >++ lStatRet = _wstat64(lTmpWChar, &lInfo); >+ #endif >+- if (lStatRet != 0) >+- return 0; >+- else if (lInfo.st_mode & S_IFDIR) >+- return 1; >+- else >+- return 0; >+- } >+-#if defined(__MINGW32_MAJOR_VERSION) && !defined(__MINGW64__) && (__MINGW32_MAJOR_VERSION <= 3) >+- else if (_stat(aDirPath, &lInfo) != 0) >++ if (lStatRet != 0) >++ return 0; >++ else if (lInfo.st_mode & S_IFDIR) >++ return 1; >++ else >++ return 0; >++ } >++#if (defined(__MINGW32_MAJOR_VERSION) && !defined(__MINGW64__) && (__MINGW32_MAJOR_VERSION <= 3)) || defined(__BORLANDC__) || defined(__WATCOMC__) >++ else if (_stat(aDirPath, &lInfo) != 0) >+ #else >+- else if (_stat64(aDirPath, &lInfo) != 0) >++ else if (_stat64(aDirPath, &lInfo) != 0) >+ #endif >+- return 0; >+- else if (lInfo.st_mode & S_IFDIR) >+- return 1; >+- else >+- return 0; >++ return 0; >++ else if (lInfo.st_mode & S_IFDIR) >++ return 1; >++ else >++ return 0; >+ } >+ >+ >+ static int fileExists(char const * aFilePathAndName) >+ { >+-#if defined(__MINGW32_MAJOR_VERSION) && !defined(__MINGW64__) && (__MINGW32_MAJOR_VERSION <= 3) >+- struct _stat lInfo; >++#if (defined(__MINGW32_MAJOR_VERSION) && !defined(__MINGW64__) && (__MINGW32_MAJOR_VERSION <= 3)) || defined(__BORLANDC__) || defined(__WATCOMC__) >++ struct _stat lInfo; >+ #else >+- struct __stat64 lInfo; >++ struct __stat64 lInfo; >+ #endif >+- wchar_t * lTmpWChar; >+- int lStatRet; >+- FILE * lIn; >++ wchar_t * lTmpWChar; >++ int lStatRet; >++ FILE * lIn; >+ >+- if (!aFilePathAndName || !strlen(aFilePathAndName)) >+- { >+- return 0; >+- } >++ if (!aFilePathAndName || !strlen(aFilePathAndName)) >++ { >++ return 0; >++ } >+ >+- if (tinyfd_winUtf8) >+- { >+- lTmpWChar = tinyfd_utf8to16(aFilePathAndName); >+-#if defined(__MINGW32_MAJOR_VERSION) && !defined(__MINGW64__) && (__MINGW32_MAJOR_VERSION <= 3) >+- lStatRet = _wstat(lTmpWChar, &lInfo); >++ if (tinyfd_winUtf8) >++ { >++ lTmpWChar = tinyfd_utf8to16(aFilePathAndName); >++#if (defined(__MINGW32_MAJOR_VERSION) && !defined(__MINGW64__) && (__MINGW32_MAJOR_VERSION <= 3)) || defined(__BORLANDC__) || defined(__WATCOMC__) >++ lStatRet = _wstat(lTmpWChar, &lInfo); >+ #else >+- lStatRet = _wstat64(lTmpWChar, &lInfo); >++ lStatRet = _wstat64(lTmpWChar, &lInfo); >+ #endif >+ >+- if (lStatRet != 0) >+- return 0; >+- else if (lInfo.st_mode & _S_IFREG) >+- return 1; >+- else >+- return 0; >+- } >+- else >+- { >+- lIn = fopen(aFilePathAndName, "r"); >+- if (!lIn) >+- { >+- return 0; >+- } >+- fclose(lIn); >+- return 1; >+- } >++ if (lStatRet != 0) >++ return 0; >++ else if (lInfo.st_mode & _S_IFREG) >++ return 1; >++ else >++ return 0; >++ } >++ else >++ { >++ lIn = fopen(aFilePathAndName, "r"); >++ if (!lIn) >++ { >++ return 0; >++ } >++ fclose(lIn); >++ return 1; >++ } >+ } >+ >+ static void replaceWchar(wchar_t * aString, >+- wchar_t aOldChr, >+- wchar_t aNewChr) >++ wchar_t aOldChr, >++ wchar_t aNewChr) >+ { >+- wchar_t * p; >++ wchar_t * p; >+ >+- if (!aString) >+- { >+- return ; >+- } >++ if (!aString) >++ { >++ return ; >++ } >+ >+- if (aOldChr == aNewChr) >+- { >+- return ; >+- } >++ if (aOldChr == aNewChr) >++ { >++ return ; >++ } >+ >+- p = aString; >+- while ((p = wcsrchr(p, aOldChr))) >+- { >+- *p = aNewChr; >++ p = aString; >++ while ((p = wcsrchr(p, aOldChr))) >++ { >++ *p = aNewChr; >+ #ifdef TINYFD_NOCCSUNICODE >+- p++; >++ p++; >+ #endif >+- p++; >+- } >+- return ; >++ p++; >++ } >++ return ; >+ } >+ >+ >+ static int quoteDetectedW(wchar_t const * aString) >+ { >+- wchar_t const * p; >++ wchar_t const * p; >+ >+- if (!aString) return 0; >++ if (!aString) return 0; >+ >+- p = aString; >+- while ((p = wcsrchr(p, L'\''))) >+- { >+- return 1; >+- } >++ p = aString; >++ while ((p = wcsrchr(p, L'\''))) >++ { >++ return 1; >++ } >+ >+- p = aString; >+- while ((p = wcsrchr(p, L'\"'))) >+- { >+- return 1; >+- } >++ p = aString; >++ while ((p = wcsrchr(p, L'\"'))) >++ { >++ return 1; >++ } >+ >+- return 0; >++ return 0; >+ } >+ >+ #endif /* _WIN32 */ >+ >+ /* source and destination can be the same or ovelap*/ >+ static char * ensureFilesExist(char * aDestination, >+- char const * aSourcePathsAndNames) >++ char const * aSourcePathsAndNames) >+ { >+- char * lDestination = aDestination; >+- char const * p; >+- char const * p2; >+- size_t lLen; >++ char * lDestination = aDestination; >++ char const * p; >++ char const * p2; >++ size_t lLen; >+ >+- if (!aSourcePathsAndNames) >+- { >+- return NULL; >+- } >+- lLen = strlen(aSourcePathsAndNames); >+- if (!lLen) >+- { >+- return NULL; >+- } >++ if (!aSourcePathsAndNames) >++ { >++ return NULL; >++ } >++ lLen = strlen(aSourcePathsAndNames); >++ if (!lLen) >++ { >++ return NULL; >++ } >+ >+- p = aSourcePathsAndNames; >+- while ((p2 = strchr(p, '|')) != NULL) >+- { >+- lLen = p2 - p; >+- memmove(lDestination, p, lLen); >+- lDestination[lLen] = '\0'; >+- if (fileExists(lDestination)) >+- { >+- lDestination += lLen; >+- *lDestination = '|'; >+- lDestination++; >+- } >+- p = p2 + 1; >+- } >+- if (fileExists(p)) >+- { >+- lLen = strlen(p); >+- memmove(lDestination, p, lLen); >+- lDestination[lLen] = '\0'; >+- } >+- else >+- { >+- *(lDestination - 1) = '\0'; >+- } >+- return aDestination; >++ p = aSourcePathsAndNames; >++ while ((p2 = strchr(p, '|')) != NULL) >++ { >++ lLen = p2 - p; >++ memmove(lDestination, p, lLen); >++ lDestination[lLen] = '\0'; >++ if (fileExists(lDestination)) >++ { >++ lDestination += lLen; >++ *lDestination = '|'; >++ lDestination++; >++ } >++ p = p2 + 1; >++ } >++ if (fileExists(p)) >++ { >++ lLen = strlen(p); >++ memmove(lDestination, p, lLen); >++ lDestination[lLen] = '\0'; >++ } >++ else >++ { >++ *(lDestination - 1) = '\0'; >++ } >++ return aDestination; >+ } >+ >+ #ifdef _WIN32 >+ >+ static int __stdcall EnumThreadWndProc(HWND hwnd, LPARAM lParam) >+ { >+- wchar_t lTitleName[MAX_PATH]; >+- GetWindowTextW(hwnd, lTitleName, MAX_PATH); >+- /* wprintf(L"lTitleName %ls \n", lTitleName); */ >+- if (wcscmp(L"tinyfiledialogsTopWindow", lTitleName) == 0) >+- { >+- SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); >+- return 0; >+- } >+- return 1; >++ wchar_t lTitleName[MAX_PATH]; >++ wchar_t const* lDialogTitle = (wchar_t const *) lParam; >++ >++ GetWindowTextW(hwnd, lTitleName, MAX_PATH); >++ /* wprintf(L"lTitleName %ls \n", lTitleName); */ >++ >++ if (wcscmp(lDialogTitle, lTitleName) == 0) >++ { >++ SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); >++ return 0; >++ } >++ return 1; >+ } >+ >+ >+ static void hiddenConsoleW(wchar_t const * aString, wchar_t const * aDialogTitle, int aInFront) >+ { >+- STARTUPINFOW StartupInfo; >+- PROCESS_INFORMATION ProcessInfo; >++ STARTUPINFOW StartupInfo; >++ PROCESS_INFORMATION ProcessInfo; >+ >+- if (!aString || !wcslen(aString) ) return; >++ if (!aString || !wcslen(aString) ) return; >+ >+- memset(&StartupInfo, 0, sizeof(StartupInfo)); >+- StartupInfo.cb = sizeof(STARTUPINFOW); >+- StartupInfo.dwFlags = STARTF_USESHOWWINDOW; >+- StartupInfo.wShowWindow = SW_HIDE; >++ memset(&StartupInfo, 0, sizeof(StartupInfo)); >++ StartupInfo.cb = sizeof(STARTUPINFOW); >++ StartupInfo.dwFlags = STARTF_USESHOWWINDOW; >++ StartupInfo.wShowWindow = SW_HIDE; >+ >+- if (!CreateProcessW(NULL, (LPWSTR)aString, NULL, NULL, FALSE, >+- CREATE_NEW_CONSOLE, NULL, NULL, >+- &StartupInfo, &ProcessInfo)) >+- { >+- return; /* GetLastError(); */ >+- } >++ if (!CreateProcessW(NULL, (LPWSTR)aString, NULL, NULL, FALSE, >++ CREATE_NEW_CONSOLE, NULL, NULL, >++ &StartupInfo, &ProcessInfo)) >++ { >++ return; /* GetLastError(); */ >++ } >+ >+- WaitForInputIdle(ProcessInfo.hProcess, INFINITE); >+- if (aInFront) >+- { >+- while (EnumWindows(EnumThreadWndProc, (LPARAM)NULL)) {} >+- SetWindowTextW(GetForegroundWindow(), aDialogTitle); >+- } >+- WaitForSingleObject(ProcessInfo.hProcess, INFINITE); >+- CloseHandle(ProcessInfo.hThread); >+- CloseHandle(ProcessInfo.hProcess); >++ WaitForInputIdle(ProcessInfo.hProcess, INFINITE); >++ if (aInFront) >++ { >++ while (EnumWindows(EnumThreadWndProc, (LPARAM)aDialogTitle)) {} >++ } >++ WaitForSingleObject(ProcessInfo.hProcess, INFINITE); >++ CloseHandle(ProcessInfo.hThread); >++ CloseHandle(ProcessInfo.hProcess); >+ } >+ >+ >+ int tinyfd_messageBoxW( >+- wchar_t const * aTitle, /* NULL or "" */ >+- wchar_t const * aMessage, /* NULL or "" may contain \n and \t */ >+- wchar_t const * aDialogType, /* "ok" "okcancel" "yesno" "yesnocancel" */ >+- wchar_t const * aIconType, /* "info" "warning" "error" "question" */ >+- int aDefaultButton) /* 0 for cancel/no , 1 for ok/yes , 2 for no in yesnocancel */ >++ wchar_t const * aTitle, /* NULL or "" */ >++ wchar_t const * aMessage, /* NULL or "" may contain \n and \t */ >++ wchar_t const * aDialogType, /* "ok" "okcancel" "yesno" "yesnocancel" */ >++ wchar_t const * aIconType, /* "info" "warning" "error" "question" */ >++ int aDefaultButton) /* 0 for cancel/no , 1 for ok/yes , 2 for no in yesnocancel */ >+ { >+- int lBoxReturnValue; >+- UINT aCode; >++ int lBoxReturnValue; >++ UINT aCode; >+ >+- if (aTitle&&!wcscmp(aTitle, L"tinyfd_query")){ strcpy(tinyfd_response, "windows_wchar"); return 1; } >++ if (aTitle&&!wcscmp(aTitle, L"tinyfd_query")){ strcpy(tinyfd_response, "windows_wchar"); return 1; } >+ >+- if (quoteDetectedW(aTitle)) return tinyfd_messageBoxW(L"INVALID TITLE WITH QUOTES", aMessage, aDialogType, aIconType, aDefaultButton); >+- if (quoteDetectedW(aMessage)) return tinyfd_messageBoxW(aTitle, L"INVALID MESSAGE WITH QUOTES", aDialogType, aIconType, aDefaultButton); >++ /*if (quoteDetectedW(aTitle)) return tinyfd_messageBoxW(L"INVALID TITLE WITH QUOTES", aMessage, aDialogType, aIconType, aDefaultButton); >++ if (quoteDetectedW(aMessage)) return tinyfd_messageBoxW(aTitle, L"INVALID MESSAGE WITH QUOTES", aDialogType, aIconType, aDefaultButton);*/ >+ >+- if (aIconType && !wcscmp(L"warning", aIconType)) >+- { >+- aCode = MB_ICONWARNING; >+- } >+- else if (aIconType && !wcscmp(L"error", aIconType)) >+- { >+- aCode = MB_ICONERROR; >+- } >+- else if (aIconType && !wcscmp(L"question", aIconType)) >+- { >+- aCode = MB_ICONQUESTION; >+- } >+- else >+- { >+- aCode = MB_ICONINFORMATION; >+- } >++ if (aIconType && !wcscmp(L"warning", aIconType)) >++ { >++ aCode = MB_ICONWARNING; >++ } >++ else if (aIconType && !wcscmp(L"error", aIconType)) >++ { >++ aCode = MB_ICONERROR; >++ } >++ else if (aIconType && !wcscmp(L"question", aIconType)) >++ { >++ aCode = MB_ICONQUESTION; >++ } >++ else >++ { >++ aCode = MB_ICONINFORMATION; >++ } >+ >+- if (aDialogType && !wcscmp(L"okcancel", aDialogType)) >+- { >+- aCode += MB_OKCANCEL; >+- if (!aDefaultButton) >+- { >+- aCode += MB_DEFBUTTON2; >+- } >+- } >+- else if (aDialogType && !wcscmp(L"yesno", aDialogType)) >+- { >+- aCode += MB_YESNO; >+- if (!aDefaultButton) >+- { >+- aCode += MB_DEFBUTTON2; >+- } >+- } >+- else >+- { >+- aCode += MB_OK; >+- } >++ if (aDialogType && !wcscmp(L"okcancel", aDialogType)) >++ { >++ aCode += MB_OKCANCEL; >++ if (!aDefaultButton) >++ { >++ aCode += MB_DEFBUTTON2; >++ } >++ } >++ else if (aDialogType && !wcscmp(L"yesno", aDialogType)) >++ { >++ aCode += MB_YESNO; >++ if (!aDefaultButton) >++ { >++ aCode += MB_DEFBUTTON2; >++ } >++ } >++ else if (aDialogType && !wcscmp(L"yesnocancel", aDialogType)) >++ { >++ aCode += MB_YESNOCANCEL; >++ if (aDefaultButton == 1) >++ { >++ aCode += MB_DEFBUTTON1; >++ } >++ else if (aDefaultButton == 2) >++ { >++ aCode += MB_DEFBUTTON2; >++ } >++ else >++ { >++ aCode += MB_DEFBUTTON3; >++ } >++ } >++ else >++ { >++ aCode += MB_OK; >++ } >+ >+- aCode += MB_TOPMOST; >++ aCode += MB_TOPMOST; >+ >+- lBoxReturnValue = MessageBoxW(GetForegroundWindow(), aMessage, aTitle, aCode); >+- if (((aDialogType >+- && wcscmp(L"okcancel", aDialogType) >+- && wcscmp(L"yesno", aDialogType))) >+- || (lBoxReturnValue == IDOK) >+- || (lBoxReturnValue == IDYES)) >+- { >+- return 1; >+- } >+- else >+- { >+- return 0; >+- } >++ lBoxReturnValue = MessageBoxW(GetForegroundWindow(), aMessage, aTitle, aCode); >++ >++ if ( (lBoxReturnValue == IDNO) && (aDialogType && !wcscmp(L"yesnocancel", aDialogType)) ) >++ { >++ return 2; >++ } >++ else if ( (lBoxReturnValue == IDOK) || (lBoxReturnValue == IDYES) ) >++ { >++ return 1; >++ } >++ else >++ { >++ return 0; >++ } >+ } >+ >+ >+ /* return has only meaning for tinyfd_query */ >+ int tinyfd_notifyPopupW( >+- wchar_t const * aTitle, /* NULL or L"" */ >+- wchar_t const * aMessage, /* NULL or L"" may contain \n \t */ >+- wchar_t const * aIconType) /* L"info" L"warning" L"error" */ >++ wchar_t const * aTitle, /* NULL or L"" */ >++ wchar_t const * aMessage, /* NULL or L"" may contain \n \t */ >++ wchar_t const * aIconType) /* L"info" L"warning" L"error" */ >+ { >+- wchar_t * lDialogString; >+- size_t lTitleLen; >+- size_t lMessageLen; >+- size_t lDialogStringLen; >++ wchar_t * lDialogString; >++ size_t lTitleLen; >++ size_t lMessageLen; >++ size_t lDialogStringLen; >+ >+- if (aTitle && !wcscmp(aTitle, L"tinyfd_query")) { strcpy(tinyfd_response, "windows_wchar"); return 1; } >++ if (aTitle && !wcscmp(aTitle, L"tinyfd_query")) { strcpy(tinyfd_response, "windows_wchar"); return 1; } >+ >+- if (quoteDetectedW(aTitle)) return tinyfd_notifyPopupW(L"INVALID TITLE WITH QUOTES", aMessage, aIconType); >++ if (quoteDetectedW(aTitle)) return tinyfd_notifyPopupW(L"INVALID TITLE WITH QUOTES", aMessage, aIconType); >+ if (quoteDetectedW(aMessage)) return tinyfd_notifyPopupW(aTitle, L"INVALID MESSAGE WITH QUOTES", aIconType); >+ >+- lTitleLen = aTitle ? wcslen(aTitle) : 0; >+- lMessageLen = aMessage ? wcslen(aMessage) : 0; >+- lDialogStringLen = 3 * MAX_PATH_OR_CMD + lTitleLen + lMessageLen; >+- lDialogString = (wchar_t *)malloc(2 * lDialogStringLen); >+- if (!lDialogString) return 0; >++ lTitleLen = aTitle ? wcslen(aTitle) : 0; >++ lMessageLen = aMessage ? wcslen(aMessage) : 0; >++ lDialogStringLen = 3 * MAX_PATH_OR_CMD + lTitleLen + lMessageLen; >++ lDialogString = (wchar_t *) malloc(2 * lDialogStringLen); >++ if (!lDialogString) return 0; >+ >+- wcscpy(lDialogString, L"powershell.exe -command \"\ >++ wcscpy(lDialogString, L"powershell.exe -command \"\ >+ function Show-BalloonTip {\ >+ [cmdletbinding()] \ >+ param( \ >+@@ -1159,7 +1199,7 @@ >+ $path = Get-Process -id $pid | Select-Object -ExpandProperty Path ; \ >+ $icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path) ;"); >+ >+- wcscat(lDialogString, L"\ >++ wcscat(lDialogString, L"\ >+ $balloon.Icon = $icon ; \ >+ $balloon.BalloonTipIcon = $IconType ; \ >+ $balloon.BalloonTipText = $Message ; \ >+@@ -1169,110 +1209,112 @@ >+ $balloon.ShowBalloonTip(5000)};\ >+ Show-BalloonTip"); >+ >+- if (aTitle && wcslen(aTitle)) >+- { >+- wcscat(lDialogString, L" -Title '"); >+- wcscat(lDialogString, aTitle); >+- wcscat(lDialogString, L"'"); >+- } >+- if (aMessage && wcslen(aMessage)) >+- { >+- wcscat(lDialogString, L" -Message '"); >+- wcscat(lDialogString, aMessage); >+- wcscat(lDialogString, L"'"); >+- } >+- if (aMessage && wcslen(aIconType)) >+- { >+- wcscat(lDialogString, L" -IconType '"); >+- wcscat(lDialogString, aIconType); >+- wcscat(lDialogString, L"'"); >+- } >+- wcscat(lDialogString, L"\""); >++ if (aTitle && wcslen(aTitle)) >++ { >++ wcscat(lDialogString, L" -Title '"); >++ wcscat(lDialogString, aTitle); >++ wcscat(lDialogString, L"'"); >++ } >++ if (aMessage && wcslen(aMessage)) >++ { >++ wcscat(lDialogString, L" -Message '"); >++ wcscat(lDialogString, aMessage); >++ wcscat(lDialogString, L"'"); >++ } >++ if (aMessage && wcslen(aIconType)) >++ { >++ wcscat(lDialogString, L" -IconType '"); >++ wcscat(lDialogString, aIconType); >++ wcscat(lDialogString, L"'"); >++ } >++ wcscat(lDialogString, L"\""); >+ >+- /* wprintf ( L"lDialogString: %ls\n" , lDialogString ) ; */ >++ /* wprintf ( L"lDialogString: %ls\n" , lDialogString ) ; */ >+ >+- hiddenConsoleW(lDialogString, aTitle, 0); >+- free(lDialogString); >+- return 1; >++ hiddenConsoleW(lDialogString, aTitle, 0); >++ free(lDialogString); >++ return 1; >+ } >+ >+ >+ wchar_t * tinyfd_inputBoxW( >+- wchar_t const * aTitle, /* NULL or L"" */ >+- wchar_t const * aMessage, /* NULL or L"" (\n and \t have no effect) */ >+- wchar_t const * aDefaultInput) /* L"" , if NULL it's a passwordBox */ >++ wchar_t const * aTitle, /* NULL or L"" */ >++ wchar_t const * aMessage, /* NULL or L"" (\n and \t have no effect) */ >++ wchar_t const * aDefaultInput) /* L"" , if NULL it's a passwordBox */ >+ { >+- static wchar_t lBuff[MAX_PATH_OR_CMD]; >+- wchar_t * lDialogString; >+- FILE * lIn; >+- FILE * lFile; >+- int lResult; >+- size_t lTitleLen; >+- size_t lMessageLen; >+- size_t lDialogStringLen; >++ static wchar_t lBuff[MAX_PATH_OR_CMD]; >++ wchar_t * lDialogString; >++ FILE * lIn; >++ FILE * lFile; >++ int lResult; >++ size_t lTitleLen; >++ size_t lMessageLen; >++ size_t lDialogStringLen; >+ >+- if (aTitle&&!wcscmp(aTitle, L"tinyfd_query")){ strcpy(tinyfd_response, "windows_wchar"); return (wchar_t *)1; } >++ if (aTitle&&!wcscmp(aTitle, L"tinyfd_query")){ strcpy(tinyfd_response, "windows_wchar"); return (wchar_t *)1; } >+ >+ if (quoteDetectedW(aTitle)) return tinyfd_inputBoxW(L"INVALID TITLE WITH QUOTES", aMessage, aDefaultInput); >+ if (quoteDetectedW(aMessage)) return tinyfd_inputBoxW(aTitle, L"INVALID MESSAGE WITH QUOTES", aDefaultInput); >+- if (quoteDetectedW(aDefaultInput)) return tinyfd_inputBoxW(aTitle, aMessage, L"INVALID DEFAULT_INPUT WITH QUOTES"); >++ if (quoteDetectedW(aDefaultInput)) return tinyfd_inputBoxW(aTitle, aMessage, L"INVALID DEFAULT_INPUT WITH QUOTES: use the GRAVE ACCENT \\x60 instead."); >+ >+- lTitleLen = aTitle ? wcslen(aTitle) : 0 ; >+- lMessageLen = aMessage ? wcslen(aMessage) : 0 ; >+- lDialogStringLen = 3 * MAX_PATH_OR_CMD + lTitleLen + lMessageLen; >+- lDialogString = (wchar_t *)malloc(2 * lDialogStringLen); >++ lTitleLen = aTitle ? wcslen(aTitle) : 0 ; >++ lMessageLen = aMessage ? wcslen(aMessage) : 0 ; >++ lDialogStringLen = 3 * MAX_PATH_OR_CMD + lTitleLen + lMessageLen; >++ lDialogString = (wchar_t *) malloc(2 * lDialogStringLen); >+ >+- if (aDefaultInput) >+- { >+- swprintf(lDialogString, >++ if (aDefaultInput) >++ { >++ swprintf(lDialogString, >+ #if !defined(__BORLANDC__) && !defined(__TINYC__) && !(defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) >+- lDialogStringLen, >++ lDialogStringLen, >+ #endif >+- L"%ls\\tinyfd.vbs", _wgetenv(L"TEMP")); >+- } >+- else >+- { >+- swprintf(lDialogString, >++ L"%ls\\tinyfd.vbs", _wgetenv(L"TEMP")); >++ } >++ else >++ { >++ swprintf(lDialogString, >+ #if !defined(__BORLANDC__) && !defined(__TINYC__) && !(defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) >+- lDialogStringLen, >++ lDialogStringLen, >+ #endif >+- L"%ls\\tinyfd.hta", _wgetenv(L"TEMP")); >+- } >+- lIn = _wfopen(lDialogString, L"w"); >+- if (!lIn) >+- { >+- free(lDialogString); >+- return NULL; >+- } >++ L"%ls\\tinyfd.hta", _wgetenv(L"TEMP")); >++ } >++ lIn = _wfopen(lDialogString, L"w"); >++ if (!lIn) >++ { >++ free(lDialogString); >++ return NULL; >++ } >+ >+- if ( aDefaultInput ) >+- { >+- wcscpy(lDialogString, L"Dim result:result=InputBox(\""); >+- if (aMessage && wcslen(aMessage)) >+- { >+- wcscpy(lBuff, aMessage); >+- replaceWchar(lBuff, L'\n', L' '); >+- wcscat(lDialogString, lBuff); >+- } >+- wcscat(lDialogString, L"\",\"tinyfiledialogsTopWindow\",\""); >+- if (aDefaultInput && wcslen(aDefaultInput)) >+- { >+- wcscpy(lBuff, aDefaultInput); >+- replaceWchar(lBuff, L'\n', L' '); >+- wcscat(lDialogString, lBuff); >+- } >+- wcscat(lDialogString, L"\"):If IsEmpty(result) then:WScript.Echo 0"); >+- wcscat(lDialogString, L":Else: WScript.Echo \"1\" & result : End If"); >+- } >+- else >+- { >+- wcscpy(lDialogString, L"\n\ >++ if ( aDefaultInput ) >++ { >++ wcscpy(lDialogString, L"Dim result:result=InputBox(\""); >++ if (aMessage && wcslen(aMessage)) >++ { >++ wcscpy(lBuff, aMessage); >++ replaceWchar(lBuff, L'\n', L' '); >++ wcscat(lDialogString, lBuff); >++ } >++ wcscat(lDialogString, L"\",\""); >++ if (aTitle) wcscat(lDialogString, aTitle); >++ wcscat(lDialogString, L"\",\""); >++ >++ if (aDefaultInput && wcslen(aDefaultInput)) >++ { >++ wcscpy(lBuff, aDefaultInput); >++ replaceWchar(lBuff, L'\n', L' '); >++ wcscat(lDialogString, lBuff); >++ } >++ wcscat(lDialogString, L"\"):If IsEmpty(result) then:WScript.Echo 0"); >++ wcscat(lDialogString, L":Else: WScript.Echo \"1\" & result : End If"); >++ } >++ else >++ { >++ wcscpy(lDialogString, L"\n\ >+ <html>\n\ >+ <head>\n\ >+ <title>"); >+- >+- wcscat(lDialogString, L"tinyfiledialogsTopWindow"); >+- wcscat(lDialogString, L"</title>\n\ >++ if (aTitle) wcscat(lDialogString, aTitle); >++ wcscat(lDialogString, L"</title>\n\ >+ <HTA:APPLICATION\n\ >+ ID = 'tinyfdHTA'\n\ >+ APPLICATIONNAME = 'tinyfd_inputBox'\n\ >+@@ -1296,7 +1338,7 @@ >+ End Sub\n\ >+ \n"); >+ >+- wcscat(lDialogString, L"\ >++ wcscat(lDialogString, L"\ >+ Sub Window_onUnload\n\ >+ Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n\ >+ Set oShell = CreateObject(\"WScript.Shell\")\n\ >+@@ -1320,7 +1362,7 @@ >+ End Sub\n\ >+ \n"); >+ >+- wcscat(lDialogString, L"Sub Default_Buttons\n\ >++ wcscat(lDialogString, L"Sub Default_Buttons\n\ >+ If Window.Event.KeyCode = 13 Then\n\ >+ btn_OK.Click\n\ >+ ElseIf Window.Event.KeyCode = 27 Then\n\ >+@@ -1335,9 +1377,9 @@ >+ <tr border = '0'>\n\ >+ <td align = 'left' valign = 'middle' style='Font-Family:Arial'>\n"); >+ >+- wcscat(lDialogString, aMessage ? aMessage : L""); >++ wcscat(lDialogString, aMessage ? aMessage : L""); >+ >+- wcscat(lDialogString, L"\n\ >++ wcscat(lDialogString, L"\n\ >+ </td>\n\ >+ <td align = 'right' valign = 'middle' style = 'margin-top: 0em'>\n\ >+ <table align = 'right' style = 'margin-right: 0em;'>\n\ >+@@ -1350,7 +1392,7 @@ >+ </tr>\n\ >+ </table>\n"); >+ >+- wcscat(lDialogString, L"<table width = '100%' height = '100%' align = 'center' border = '0'>\n\ >++ wcscat(lDialogString, L"<table width = '100%' height = '100%' align = 'center' border = '0'>\n\ >+ <tr>\n\ >+ <td align = 'left' valign = 'top'>\n\ >+ <input type = 'password' id = 'txt_input'\n\ >+@@ -1361,238 +1403,238 @@ >+ </body>\n\ >+ </html>\n\ >+ " ) ; >+- } >+- fputws(lDialogString, lIn); >+- fclose(lIn); >++ } >++ fputws(lDialogString, lIn); >++ fclose(lIn); >+ >+- if (aDefaultInput) >+- { >+- swprintf(lDialogString, >++ if (aDefaultInput) >++ { >++ swprintf(lDialogString, >+ #if !defined(__BORLANDC__) && !defined(__TINYC__) && !(defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) >+- lDialogStringLen, >++ lDialogStringLen, >+ #endif >+- L"%ls\\tinyfd.txt",_wgetenv(L"TEMP")); >++ L"%ls\\tinyfd.txt",_wgetenv(L"TEMP")); >+ >+ #ifdef TINYFD_NOCCSUNICODE >+- lFile = _wfopen(lDialogString, L"w"); >+- fputc(0xFF, lFile); >+- fputc(0xFE, lFile); >++ lFile = _wfopen(lDialogString, L"w"); >++ fputc(0xFF, lFile); >++ fputc(0xFE, lFile); >+ #else >+- lFile = _wfopen(lDialogString, L"wt, ccs=UNICODE"); /*or ccs=UTF-16LE*/ >++ lFile = _wfopen(lDialogString, L"wt, ccs=UNICODE"); /*or ccs=UTF-16LE*/ >+ #endif >+- fclose(lFile); >++ fclose(lFile); >+ >+- wcscpy(lDialogString, L"cmd.exe /c cscript.exe //U //Nologo "); >+- wcscat(lDialogString, L"\"%TEMP%\\tinyfd.vbs\" "); >+- wcscat(lDialogString, L">> \"%TEMP%\\tinyfd.txt\""); >+- } >+- else >+- { >+- wcscpy(lDialogString, >+- L"cmd.exe /c mshta.exe \"%TEMP%\\tinyfd.hta\""); >+- } >++ wcscpy(lDialogString, L"cmd.exe /c cscript.exe //U //Nologo "); >++ wcscat(lDialogString, L"\"%TEMP%\\tinyfd.vbs\" "); >++ wcscat(lDialogString, L">> \"%TEMP%\\tinyfd.txt\""); >++ } >++ else >++ { >++ wcscpy(lDialogString, >++ L"cmd.exe /c mshta.exe \"%TEMP%\\tinyfd.hta\""); >++ } >+ >+- /* wprintf ( "lDialogString: %ls\n" , lDialogString ) ; */ >++ /* wprintf ( "lDialogString: %ls\n" , lDialogString ) ; */ >+ >+- hiddenConsoleW(lDialogString, aTitle, 1); >++ hiddenConsoleW(lDialogString, aTitle, 1); >+ >+- swprintf(lDialogString, >++ swprintf(lDialogString, >+ #if !defined(__BORLANDC__) && !defined(__TINYC__) && !(defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) >+- lDialogStringLen, >++ lDialogStringLen, >+ #endif >+- L"%ls\\tinyfd.txt", _wgetenv(L"TEMP")); >+- /* wprintf(L"lDialogString: %ls\n", lDialogString); */ >++ L"%ls\\tinyfd.txt", _wgetenv(L"TEMP")); >++ /* wprintf(L"lDialogString: %ls\n", lDialogString); */ >+ #ifdef TINYFD_NOCCSUNICODE >+- if (!(lIn = _wfopen(lDialogString, L"r"))) >++ if (!(lIn = _wfopen(lDialogString, L"r"))) >+ #else >+- if (!(lIn = _wfopen(lDialogString, L"rt, ccs=UNICODE"))) /*or ccs=UTF-16LE*/ >++ if (!(lIn = _wfopen(lDialogString, L"rt, ccs=UNICODE"))) /*or ccs=UTF-16LE*/ >+ #endif >+- { >+- _wremove(lDialogString); >+- free(lDialogString); >+- return NULL; >+- } >++ { >++ _wremove(lDialogString); >++ free(lDialogString); >++ return NULL; >++ } >+ >+- memset(lBuff, 0, MAX_PATH_OR_CMD * sizeof(wchar_t) ); >++ memset(lBuff, 0, MAX_PATH_OR_CMD * sizeof(wchar_t) ); >+ >+ #ifdef TINYFD_NOCCSUNICODE >+- fgets((char *)lBuff, 2*MAX_PATH_OR_CMD, lIn); >++ fgets((char *)lBuff, 2*MAX_PATH_OR_CMD, lIn); >+ #else >+- fgetws(lBuff, MAX_PATH_OR_CMD, lIn); >++ fgetws(lBuff, MAX_PATH_OR_CMD, lIn); >+ #endif >+- fclose(lIn); >+- wipefileW(lDialogString); >+- _wremove(lDialogString); >++ fclose(lIn); >++ wipefileW(lDialogString); >++ _wremove(lDialogString); >+ >+- if (aDefaultInput) >+- { >+- swprintf(lDialogString, >++ if (aDefaultInput) >++ { >++ swprintf(lDialogString, >+ #if !defined(__BORLANDC__) && !defined(__TINYC__) && !(defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) >+- lDialogStringLen, >++ lDialogStringLen, >+ #endif >+- L"%ls\\tinyfd.vbs", _wgetenv(L"TEMP")); >+- } >+- else >+- { >+- swprintf(lDialogString, >++ L"%ls\\tinyfd.vbs", _wgetenv(L"TEMP")); >++ } >++ else >++ { >++ swprintf(lDialogString, >+ #if !defined(__BORLANDC__) && !defined(__TINYC__) && !(defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) >+- lDialogStringLen, >++ lDialogStringLen, >+ #endif >+- L"%ls\\tinyfd.hta", _wgetenv(L"TEMP")); >+- } >+- _wremove(lDialogString); >+- free(lDialogString); >+- /* wprintf( L"lBuff: %ls\n" , lBuff ) ; */ >++ L"%ls\\tinyfd.hta", _wgetenv(L"TEMP")); >++ } >++ _wremove(lDialogString); >++ free(lDialogString); >++ /* wprintf( L"lBuff: %ls\n" , lBuff ) ; */ >+ #ifdef TINYFD_NOCCSUNICODE >+- lResult = !wcsncmp(lBuff+1, L"1", 1); >++ lResult = !wcsncmp(lBuff+1, L"1", 1); >+ #else >+- lResult = !wcsncmp(lBuff, L"1", 1); >++ lResult = !wcsncmp(lBuff, L"1", 1); >+ #endif >+ >+- /* printf( "lResult: %d \n" , lResult ) ; */ >+- if (!lResult) >+- { >+- return NULL ; >+- } >++ /* printf( "lResult: %d \n" , lResult ) ; */ >++ if (!lResult) >++ { >++ return NULL ; >++ } >+ >+- /* wprintf( "lBuff+1: %ls\n" , lBuff+1 ) ; */ >++ /* wprintf( "lBuff+1: %ls\n" , lBuff+1 ) ; */ >+ >+ #ifdef TINYFD_NOCCSUNICODE >+- if (aDefaultInput) >+- { >+- lDialogStringLen = wcslen(lBuff) ; >+- lBuff[lDialogStringLen - 1] = L'\0'; >+- lBuff[lDialogStringLen - 2] = L'\0'; >+- } >+- return lBuff + 2; >++ if (aDefaultInput) >++ { >++ lDialogStringLen = wcslen(lBuff) ; >++ lBuff[lDialogStringLen - 1] = L'\0'; >++ lBuff[lDialogStringLen - 2] = L'\0'; >++ } >++ return lBuff + 2; >+ #else >+- if (aDefaultInput) lBuff[wcslen(lBuff) - 1] = L'\0'; >+- return lBuff + 1; >++ if (aDefaultInput) lBuff[wcslen(lBuff) - 1] = L'\0'; >++ return lBuff + 1; >+ #endif >+ } >+ >+ >+ wchar_t * tinyfd_saveFileDialogW( >+- wchar_t const * aTitle, /* NULL or "" */ >+- wchar_t const * aDefaultPathAndFile, /* NULL or "" */ >+- int aNumOfFilterPatterns, /* 0 */ >+- wchar_t const * const * aFilterPatterns, /* NULL or {"*.jpg","*.png"} */ >+- wchar_t const * aSingleFilterDescription) /* NULL or "image files" */ >++ wchar_t const * aTitle, /* NULL or "" */ >++ wchar_t const * aDefaultPathAndOrFile, /* NULL or "" */ >++ int aNumOfFilterPatterns, /* 0 */ >++ wchar_t const * const * aFilterPatterns, /* NULL or {"*.jpg","*.png"} */ >++ wchar_t const * aSingleFilterDescription) /* NULL or "image files" */ >+ { >+- static wchar_t lBuff[MAX_PATH_OR_CMD]; >+- wchar_t lDirname[MAX_PATH_OR_CMD]; >+- wchar_t lDialogString[MAX_PATH_OR_CMD]; >+- wchar_t lFilterPatterns[MAX_PATH_OR_CMD] = L""; >+- wchar_t * p; >+- wchar_t * lRetval; >+- wchar_t const * ldefExt = NULL; >+- int i; >+- HRESULT lHResult; >+- OPENFILENAMEW ofn = {0}; >++ static wchar_t lBuff[MAX_PATH_OR_CMD]; >++ wchar_t lDirname[MAX_PATH_OR_CMD]; >++ wchar_t lDialogString[MAX_PATH_OR_CMD]; >++ wchar_t lFilterPatterns[MAX_PATH_OR_CMD] = L""; >++ wchar_t * p; >++ wchar_t * lRetval; >++ wchar_t const * ldefExt = NULL; >++ int i; >++ HRESULT lHResult; >++ OPENFILENAMEW ofn = {0}; >+ >+- if (aTitle&&!wcscmp(aTitle, L"tinyfd_query")){ strcpy(tinyfd_response, "windows_wchar"); return (wchar_t *)1; } >++ if (aTitle&&!wcscmp(aTitle, L"tinyfd_query")){ strcpy(tinyfd_response, "windows_wchar"); return (wchar_t *)1; } >+ >+- if (quoteDetectedW(aTitle)) return tinyfd_saveFileDialogW(L"INVALID TITLE WITH QUOTES", aDefaultPathAndFile, aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription); >+- if (quoteDetectedW(aDefaultPathAndFile)) return tinyfd_saveFileDialogW(aTitle, L"INVALID DEFAULT_PATH WITH QUOTES", aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription); >+- if (quoteDetectedW(aSingleFilterDescription)) return tinyfd_saveFileDialogW(aTitle, aDefaultPathAndFile, aNumOfFilterPatterns, aFilterPatterns, L"INVALID FILTER_DESCRIPTION WITH QUOTES"); >++ /*if (quoteDetectedW(aTitle)) return tinyfd_saveFileDialogW(L"INVALID TITLE WITH QUOTES", aDefaultPathAndOrFile, aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription); >++ if (quoteDetectedW(aDefaultPathAndOrFile)) return tinyfd_saveFileDialogW(aTitle, L"INVALID DEFAULT_PATH WITH QUOTES", aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription); >++ if (quoteDetectedW(aSingleFilterDescription)) return tinyfd_saveFileDialogW(aTitle, aDefaultPathAndOrFile, aNumOfFilterPatterns, aFilterPatterns, L"INVALID FILTER_DESCRIPTION WITH QUOTES"); >+ for (i = 0; i < aNumOfFilterPatterns; i++) >+ { >+- if (quoteDetectedW(aFilterPatterns[i])) return tinyfd_saveFileDialogW(L"INVALID FILTER_PATTERN WITH QUOTES", aDefaultPathAndFile, 0, NULL, NULL); >+- } >++ if (quoteDetectedW(aFilterPatterns[i])) return tinyfd_saveFileDialogW(L"INVALID FILTER_PATTERN WITH QUOTES: use the GRAVE ACCENT \\x60 instead.", aDefaultPathAndOrFile, 0, NULL, NULL); >++ }*/ >+ >+- lHResult = CoInitializeEx(NULL, 0); >++ lHResult = CoInitializeEx(NULL, 0); >+ >+- getPathWithoutFinalSlashW(lDirname, aDefaultPathAndFile); >+- getLastNameW(lBuff, aDefaultPathAndFile); >++ getPathWithoutFinalSlashW(lDirname, aDefaultPathAndOrFile); >++ getLastNameW(lBuff, aDefaultPathAndOrFile); >+ >+- if (aNumOfFilterPatterns > 0) >+- { >+- ldefExt = aFilterPatterns[0]; >++ if (aNumOfFilterPatterns > 0) >++ { >++ ldefExt = aFilterPatterns[0]; >+ >+- if (aSingleFilterDescription && wcslen(aSingleFilterDescription)) >+- { >+- wcscpy(lFilterPatterns, aSingleFilterDescription); >+- wcscat(lFilterPatterns, L"\n"); >+- } >+- wcscat(lFilterPatterns, aFilterPatterns[0]); >+- for (i = 1; i < aNumOfFilterPatterns; i++) >+- { >+- wcscat(lFilterPatterns, L";"); >+- wcscat(lFilterPatterns, aFilterPatterns[i]); >+- } >+- wcscat(lFilterPatterns, L"\n"); >+- if (!(aSingleFilterDescription && wcslen(aSingleFilterDescription))) >+- { >+- wcscpy(lDialogString, lFilterPatterns); >+- wcscat(lFilterPatterns, lDialogString); >+- } >+- wcscat(lFilterPatterns, L"All Files\n*.*\n"); >+- p = lFilterPatterns; >+- while ((p = wcschr(p, L'\n')) != NULL) >+- { >+- *p = L'\0'; >+- p++; >+- } >+- } >++ if (aSingleFilterDescription && wcslen(aSingleFilterDescription)) >++ { >++ wcscpy(lFilterPatterns, aSingleFilterDescription); >++ wcscat(lFilterPatterns, L"\n"); >++ } >++ wcscat(lFilterPatterns, aFilterPatterns[0]); >++ for (i = 1; i < aNumOfFilterPatterns; i++) >++ { >++ wcscat(lFilterPatterns, L";"); >++ wcscat(lFilterPatterns, aFilterPatterns[i]); >++ } >++ wcscat(lFilterPatterns, L"\n"); >++ if (!(aSingleFilterDescription && wcslen(aSingleFilterDescription))) >++ { >++ wcscpy(lDialogString, lFilterPatterns); >++ wcscat(lFilterPatterns, lDialogString); >++ } >++ wcscat(lFilterPatterns, L"All Files\n*.*\n"); >++ p = lFilterPatterns; >++ while ((p = wcschr(p, L'\n')) != NULL) >++ { >++ *p = L'\0'; >++ p++; >++ } >++ } >+ >+- ofn.lStructSize = sizeof(OPENFILENAMEW); >+- ofn.hwndOwner = GetForegroundWindow(); >+- ofn.hInstance = 0; >+- ofn.lpstrFilter = wcslen(lFilterPatterns) ? lFilterPatterns : NULL; >+- ofn.lpstrCustomFilter = NULL; >+- ofn.nMaxCustFilter = 0; >+- ofn.nFilterIndex = 1; >+- ofn.lpstrFile = lBuff; >++ ofn.lStructSize = sizeof(OPENFILENAMEW); >++ ofn.hwndOwner = GetForegroundWindow(); >++ ofn.hInstance = 0; >++ ofn.lpstrFilter = wcslen(lFilterPatterns) ? lFilterPatterns : NULL; >++ ofn.lpstrCustomFilter = NULL; >++ ofn.nMaxCustFilter = 0; >++ ofn.nFilterIndex = 1; >++ ofn.lpstrFile = lBuff; >+ >+- ofn.nMaxFile = MAX_PATH_OR_CMD; >+- ofn.lpstrFileTitle = NULL; >+- ofn.nMaxFileTitle = MAX_PATH_OR_CMD/2; >+- ofn.lpstrInitialDir = wcslen(lDirname) ? lDirname : NULL; >+- ofn.lpstrTitle = aTitle && wcslen(aTitle) ? aTitle : NULL; >+- ofn.Flags = OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR | OFN_PATHMUSTEXIST ; >+- ofn.nFileOffset = 0; >+- ofn.nFileExtension = 0; >+- ofn.lpstrDefExt = ldefExt; >+- ofn.lCustData = 0L; >+- ofn.lpfnHook = NULL; >+- ofn.lpTemplateName = NULL; >++ ofn.nMaxFile = MAX_PATH_OR_CMD; >++ ofn.lpstrFileTitle = NULL; >++ ofn.nMaxFileTitle = MAX_PATH_OR_CMD/2; >++ ofn.lpstrInitialDir = wcslen(lDirname) ? lDirname : NULL; >++ ofn.lpstrTitle = aTitle && wcslen(aTitle) ? aTitle : NULL; >++ ofn.Flags = OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR | OFN_PATHMUSTEXIST ; >++ ofn.nFileOffset = 0; >++ ofn.nFileExtension = 0; >++ ofn.lpstrDefExt = ldefExt; >++ ofn.lCustData = 0L; >++ ofn.lpfnHook = NULL; >++ ofn.lpTemplateName = NULL; >+ >+- if (GetSaveFileNameW(&ofn) == 0) >+- { >+- lRetval = NULL; >+- } >+- else >+- { >+- lRetval = lBuff; >+- } >++ if (GetSaveFileNameW(&ofn) == 0) >++ { >++ lRetval = NULL; >++ } >++ else >++ { >++ lRetval = lBuff; >++ } >+ >+- if (lHResult == S_OK || lHResult == S_FALSE) >+- { >+- CoUninitialize(); >+- } >+- return lRetval; >++ if (lHResult == S_OK || lHResult == S_FALSE) >++ { >++ CoUninitialize(); >++ } >++ return lRetval; >+ } >+ >+ >+ wchar_t * tinyfd_openFileDialogW( >+- wchar_t const * aTitle, /* NULL or "" */ >+- wchar_t const * aDefaultPathAndFile, /* NULL or "" */ >+- int aNumOfFilterPatterns, /* 0 */ >++ wchar_t const * aTitle, /* NULL or "" */ >++ wchar_t const * aDefaultPathAndOrFile, /* NULL or "" */ >++ int aNumOfFilterPatterns, /* 0 */ >+ wchar_t const * const * aFilterPatterns, /* NULL or {"*.jpg","*.png"} */ >+ wchar_t const * aSingleFilterDescription, /* NULL or "image files" */ >+- int aAllowMultipleSelects) /* 0 or 1 ; -1 to free allocated memory and return */ >++ int aAllowMultipleSelects) /* 0 or 1 ; -1 to free allocated memory and return */ >+ { >+- size_t lLengths[MAX_MULTIPLE_FILES]; >+- wchar_t lDirname[MAX_PATH_OR_CMD]; >+- wchar_t lFilterPatterns[MAX_PATH_OR_CMD] = L""; >+- wchar_t lDialogString[MAX_PATH_OR_CMD]; >+- wchar_t * lPointers[MAX_MULTIPLE_FILES+1]; >+- wchar_t * p; >+- int i, j; >++ size_t lLengths[MAX_MULTIPLE_FILES]; >++ wchar_t lDirname[MAX_PATH_OR_CMD]; >++ wchar_t lFilterPatterns[MAX_PATH_OR_CMD] = L""; >++ wchar_t lDialogString[MAX_PATH_OR_CMD]; >++ wchar_t * lPointers[MAX_MULTIPLE_FILES+1]; >++ wchar_t * p; >++ int i, j; >+ size_t lBuffLen; >+ DWORD lFullBuffLen; >+- HRESULT lHResult; >+- OPENFILENAMEW ofn = { 0 }; >++ HRESULT lHResult; >++ OPENFILENAMEW ofn = { 0 }; >+ static wchar_t * lBuff = NULL; >+ >+ free(lBuff); >+@@ -1601,120 +1643,121 @@ >+ >+ if (aTitle&&!wcscmp(aTitle, L"tinyfd_query")){ strcpy(tinyfd_response, "windows_wchar"); return (wchar_t *)1; } >+ >+- if (quoteDetectedW(aTitle)) return tinyfd_openFileDialogW(L"INVALID TITLE WITH QUOTES", aDefaultPathAndFile, aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription, aAllowMultipleSelects); >+- if (quoteDetectedW(aDefaultPathAndFile)) return tinyfd_openFileDialogW(aTitle, L"INVALID DEFAULT_PATH WITH QUOTES", aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription, aAllowMultipleSelects); >+- if (quoteDetectedW(aSingleFilterDescription)) return tinyfd_openFileDialogW(aTitle, aDefaultPathAndFile, aNumOfFilterPatterns, aFilterPatterns, L"INVALID FILTER_DESCRIPTION WITH QUOTES", aAllowMultipleSelects); >++ /*if (quoteDetectedW(aTitle)) return tinyfd_openFileDialogW(L"INVALID TITLE WITH QUOTES", aDefaultPathAndOrFile, aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription, aAllowMultipleSelects); >++ if (quoteDetectedW(aDefaultPathAndOrFile)) return tinyfd_openFileDialogW(aTitle, L"INVALID DEFAULT_PATH WITH QUOTES", aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription, aAllowMultipleSelects); >++ if (quoteDetectedW(aSingleFilterDescription)) return tinyfd_openFileDialogW(aTitle, aDefaultPathAndOrFile, aNumOfFilterPatterns, aFilterPatterns, L"INVALID FILTER_DESCRIPTION WITH QUOTES", aAllowMultipleSelects); >+ for (i = 0; i < aNumOfFilterPatterns; i++) >+ { >+- if (quoteDetectedW(aFilterPatterns[i])) return tinyfd_openFileDialogW(L"INVALID FILTER_PATTERN WITH QUOTES", aDefaultPathAndFile, 0, NULL, NULL, aAllowMultipleSelects); >+- } >++ if (quoteDetectedW(aFilterPatterns[i])) return tinyfd_openFileDialogW(L"INVALID FILTER_PATTERN WITH QUOTES: use the GRAVE ACCENT \\x60 instead.", aDefaultPathAndOrFile, 0, NULL, NULL, aAllowMultipleSelects); >++ }*/ >+ >+ if (aAllowMultipleSelects) >+ { >+- lFullBuffLen = MAX_MULTIPLE_FILES * MAX_PATH_OR_CMD + 1; >+- lBuff = (wchar_t*)(malloc(lFullBuffLen * sizeof(wchar_t))); >+- if (!lBuff) >+- { >+- lFullBuffLen = LOW_MULTIPLE_FILES * MAX_PATH_OR_CMD + 1; >+- lBuff = (wchar_t*)( malloc( lFullBuffLen * sizeof(wchar_t))); >+- } >++ lFullBuffLen = MAX_MULTIPLE_FILES * MAX_PATH_OR_CMD + 1; >++ lBuff = (wchar_t*) malloc(lFullBuffLen * sizeof(wchar_t)); >++ if (!lBuff) >++ { >++ lFullBuffLen = LOW_MULTIPLE_FILES * MAX_PATH_OR_CMD + 1; >++ lBuff = (wchar_t*) malloc( lFullBuffLen * sizeof(wchar_t)); >++ } >+ } >+ else >+ { >+- lFullBuffLen = MAX_PATH_OR_CMD + 1; >+- lBuff = (wchar_t*)(malloc(lFullBuffLen * sizeof(wchar_t))); >++ lFullBuffLen = MAX_PATH_OR_CMD + 1; >++ lBuff = (wchar_t*) malloc(lFullBuffLen * sizeof(wchar_t)); >+ } >+ if (!lBuff) return NULL; >+ >+- lHResult = CoInitializeEx(NULL, 0); >++ lHResult = CoInitializeEx(NULL, 0); >+ >+- getPathWithoutFinalSlashW(lDirname, aDefaultPathAndFile); >+- getLastNameW(lBuff, aDefaultPathAndFile); >++ getPathWithoutFinalSlashW(lDirname, aDefaultPathAndOrFile); >++ getLastNameW(lBuff, aDefaultPathAndOrFile); >+ >+- if (aNumOfFilterPatterns > 0) >+- { >+- if (aSingleFilterDescription && wcslen(aSingleFilterDescription)) >+- { >+- wcscpy(lFilterPatterns, aSingleFilterDescription); >+- wcscat(lFilterPatterns, L"\n"); >+- } >+- wcscat(lFilterPatterns, aFilterPatterns[0]); >+- for (i = 1; i < aNumOfFilterPatterns; i++) >+- { >+- wcscat(lFilterPatterns, L";"); >+- wcscat(lFilterPatterns, aFilterPatterns[i]); >+- } >+- wcscat(lFilterPatterns, L"\n"); >+- if (!(aSingleFilterDescription && wcslen(aSingleFilterDescription))) >+- { >+- wcscpy(lDialogString, lFilterPatterns); >+- wcscat(lFilterPatterns, lDialogString); >+- } >+- wcscat(lFilterPatterns, L"All Files\n*.*\n"); >+- p = lFilterPatterns; >+- while ((p = wcschr(p, L'\n')) != NULL) >+- { >+- *p = L'\0'; >+- p++; >+- } >+- } >++ if (aNumOfFilterPatterns > 0) >++ { >++ if (aSingleFilterDescription && wcslen(aSingleFilterDescription)) >++ { >++ wcscpy(lFilterPatterns, aSingleFilterDescription); >++ wcscat(lFilterPatterns, L"\n"); >++ } >++ wcscat(lFilterPatterns, aFilterPatterns[0]); >++ for (i = 1; i < aNumOfFilterPatterns; i++) >++ { >++ wcscat(lFilterPatterns, L";"); >++ wcscat(lFilterPatterns, aFilterPatterns[i]); >++ } >++ wcscat(lFilterPatterns, L"\n"); >++ if (!(aSingleFilterDescription && wcslen(aSingleFilterDescription))) >++ { >++ wcscpy(lDialogString, lFilterPatterns); >++ wcscat(lFilterPatterns, lDialogString); >++ } >++ wcscat(lFilterPatterns, L"All Files\n*.*\n"); >++ p = lFilterPatterns; >++ while ((p = wcschr(p, L'\n')) != NULL) >++ { >++ *p = L'\0'; >++ p++; >++ } >++ } >+ >+- ofn.lStructSize = sizeof(OPENFILENAME); >+- ofn.hwndOwner = GetForegroundWindow(); >+- ofn.hInstance = 0; >+- ofn.lpstrFilter = wcslen(lFilterPatterns) ? lFilterPatterns : NULL; >+- ofn.lpstrCustomFilter = NULL; >+- ofn.nMaxCustFilter = 0; >+- ofn.nFilterIndex = 1; >+- ofn.lpstrFile = lBuff; >++ ofn.lStructSize = sizeof(OPENFILENAME); >++ ofn.hwndOwner = GetForegroundWindow(); >++ ofn.hInstance = 0; >++ ofn.lpstrFilter = wcslen(lFilterPatterns) ? lFilterPatterns : NULL; >++ ofn.lpstrCustomFilter = NULL; >++ ofn.nMaxCustFilter = 0; >++ ofn.nFilterIndex = 1; >++ ofn.lpstrFile = lBuff; >+ ofn.nMaxFile = lFullBuffLen; >+- ofn.lpstrFileTitle = NULL; >+- ofn.nMaxFileTitle = MAX_PATH_OR_CMD / 2; >+- ofn.lpstrInitialDir = wcslen(lDirname) ? lDirname : NULL; >+- ofn.lpstrTitle = aTitle && wcslen(aTitle) ? aTitle : NULL; >+- ofn.Flags = OFN_EXPLORER | OFN_NOCHANGEDIR | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; >+- ofn.nFileOffset = 0; >+- ofn.nFileExtension = 0; >+- ofn.lpstrDefExt = NULL; >+- ofn.lCustData = 0L; >+- ofn.lpfnHook = NULL; >+- ofn.lpTemplateName = NULL; >++ ofn.lpstrFileTitle = NULL; >++ ofn.nMaxFileTitle = MAX_PATH_OR_CMD / 2; >++ ofn.lpstrInitialDir = wcslen(lDirname) ? lDirname : NULL; >++ ofn.lpstrTitle = aTitle && wcslen(aTitle) ? aTitle : NULL; >++ ofn.Flags = OFN_EXPLORER | OFN_NOCHANGEDIR | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; >++ ofn.nFileOffset = 0; >++ ofn.nFileExtension = 0; >++ ofn.lpstrDefExt = NULL; >++ ofn.lCustData = 0L; >++ ofn.lpfnHook = NULL; >++ ofn.lpTemplateName = NULL; >+ >+- if (aAllowMultipleSelects) >+- { >+- ofn.Flags |= OFN_ALLOWMULTISELECT; >+- } >++ if (aAllowMultipleSelects) >++ { >++ ofn.Flags |= OFN_ALLOWMULTISELECT; >++ } >+ >+- if (GetOpenFileNameW(&ofn) == 0) >+- { >++ if (GetOpenFileNameW(&ofn) == 0) >++ { >+ free(lBuff); >+ lBuff = NULL; >+- } >+- else >+- { >+- lBuffLen = wcslen(lBuff); >+- lPointers[0] = lBuff + lBuffLen + 1; >+- if (aAllowMultipleSelects && (lPointers[0][0] != L'\0')) >++ } >++ else >++ { >++ lBuffLen = wcslen(lBuff); >++ lPointers[0] = lBuff + lBuffLen + 1; >++ if (aAllowMultipleSelects && (lPointers[0][0] != L'\0')) >++ { >++ i = 0; >++ do >+ { >+- i = 0; >+- do >+- { >+- lLengths[i] = wcslen(lPointers[i]); >+- lPointers[i + 1] = lPointers[i] + lLengths[i] + 1; >+- i++; >+- } while (lPointers[i][0] != L'\0' && i < MAX_MULTIPLE_FILES ); >+- if (i > MAX_MULTIPLE_FILES) >++ lLengths[i] = wcslen(lPointers[i]); >++ lPointers[i + 1] = lPointers[i] + lLengths[i] + 1; >++ i++; >++ } while (lPointers[i][0] != L'\0' && i < MAX_MULTIPLE_FILES ); >++ >++ if (i > MAX_MULTIPLE_FILES) >++ { >++ free(lBuff); >++ lBuff = NULL; >++ } >++ else >++ { >++ i--; >++ p = lBuff + lFullBuffLen - 1; >++ *p = L'\0'; >++ for (j = i; j >= 0; j--) >+ { >+- free(lBuff); >+- lBuff = NULL; >+- } >+- else >+- { >+- i--; >+- p = lBuff + lFullBuffLen - 1; >+- *p = L'\0'; >+- for (j = i; j >= 0; j--) >+- { >+ p -= lLengths[j]; >+ memmove(p, lPointers[j], lLengths[j] * sizeof(wchar_t)); >+ p--; >+@@ -1723,1497 +1766,1504 @@ >+ memmove(p, lBuff, lBuffLen*sizeof(wchar_t)); >+ p--; >+ *p = L'|'; >+- } >+- p++; >+- wcscpy(lBuff, p); >+- lBuffLen = wcslen(lBuff); >+ } >++ p++; >++ wcscpy(lBuff, p); >++ lBuffLen = wcslen(lBuff); >+ } >+- if (lBuff) lBuff = (wchar_t*)(realloc(lBuff, (lBuffLen + 1) * sizeof(wchar_t))); >+- } >++ } >++ if (lBuff) lBuff = (wchar_t*)(realloc(lBuff, (lBuffLen + 1) * sizeof(wchar_t))); >++ } >+ >+- if (lHResult == S_OK || lHResult == S_FALSE) >+- { >+- CoUninitialize(); >+- } >++ if (lHResult == S_OK || lHResult == S_FALSE) >++ { >++ CoUninitialize(); >++ } >++ >+ return lBuff; >+ } >+ >+ >+ BOOL CALLBACK BrowseCallbackProcW_enum(HWND hWndChild, LPARAM lParam) >+ { >+- wchar_t buf[255]; >+- GetClassNameW(hWndChild, buf, sizeof(buf)); >+- if (wcscmp(buf, L"SysTreeView32") == 0) { >+- HTREEITEM hNode = TreeView_GetSelection(hWndChild); >+- TreeView_EnsureVisible(hWndChild, hNode); >+- return FALSE; >+- } >+- return TRUE; >++ wchar_t buf[255]; >++ GetClassNameW(hWndChild, buf, sizeof(buf)); >++ if (wcscmp(buf, L"SysTreeView32") == 0) >++ { >++ HTREEITEM hNode = TreeView_GetSelection(hWndChild); >++ TreeView_EnsureVisible(hWndChild, hNode); >++ return FALSE; >++ } >++ return TRUE; >+ } >+ >+ >+ static int __stdcall BrowseCallbackProcW(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData) >+ { >+- switch (uMsg) { >+- case BFFM_INITIALIZED: >+- SendMessage(hwnd, BFFM_SETSELECTIONW, TRUE, (LPARAM)pData); >+- break; >+- case BFFM_SELCHANGED: >+- EnumChildWindows(hwnd, BrowseCallbackProcW_enum, 0); >+- } >+- return 0; >++ switch (uMsg) >++ { >++ case BFFM_INITIALIZED: >++ SendMessage(hwnd, BFFM_SETSELECTIONW, TRUE, (LPARAM)pData); >++ break; >++ case BFFM_SELCHANGED: >++ EnumChildWindows(hwnd, BrowseCallbackProcW_enum, 0); >++ } >++ return 0; >+ } >+ >+ wchar_t * tinyfd_selectFolderDialogW( >+- wchar_t const * aTitle, /* NULL or "" */ >+- wchar_t const * aDefaultPath) /* NULL or "" */ >++ wchar_t const * aTitle, /* NULL or "" */ >++ wchar_t const * aDefaultPath) /* NULL or "" */ >+ { >+- static wchar_t lBuff[MAX_PATH_OR_CMD]; >++ static wchar_t lBuff[MAX_PATH_OR_CMD]; >+ wchar_t * lRetval; >+ >+- BROWSEINFOW bInfo; >+- LPITEMIDLIST lpItem; >+- HRESULT lHResult; >++ BROWSEINFOW bInfo; >++ LPITEMIDLIST lpItem; >++ HRESULT lHResult; >+ >+- if (aTitle&&!wcscmp(aTitle, L"tinyfd_query")){ strcpy(tinyfd_response, "windows_wchar"); return (wchar_t *)1; } >++ if (aTitle&&!wcscmp(aTitle, L"tinyfd_query")){ strcpy(tinyfd_response, "windows_wchar"); return (wchar_t *)1; } >+ >+- if (quoteDetectedW(aTitle)) return tinyfd_selectFolderDialogW(L"INVALID TITLE WITH QUOTES", aDefaultPath); >+- if (quoteDetectedW(aDefaultPath)) return tinyfd_selectFolderDialogW(aTitle, L"INVALID DEFAULT_PATH WITH QUOTES"); >++ /*if (quoteDetectedW(aTitle)) return tinyfd_selectFolderDialogW(L"INVALID TITLE WITH QUOTES", aDefaultPath); >++ if (quoteDetectedW(aDefaultPath)) return tinyfd_selectFolderDialogW(aTitle, L"INVALID DEFAULT_PATH WITH QUOTES");*/ >+ >+- lHResult = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); >++ lHResult = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); >+ >+- bInfo.hwndOwner = GetForegroundWindow(); >+- bInfo.pidlRoot = NULL; >+- bInfo.pszDisplayName = lBuff; >+- bInfo.lpszTitle = aTitle && wcslen(aTitle) ? aTitle : NULL; >+- if (lHResult == S_OK || lHResult == S_FALSE) >+- { >+- bInfo.ulFlags = BIF_USENEWUI; >+- } >+- bInfo.lpfn = BrowseCallbackProcW; >+- bInfo.lParam = (LPARAM)aDefaultPath; >+- bInfo.iImage = -1; >++ bInfo.hwndOwner = GetForegroundWindow(); >++ bInfo.pidlRoot = NULL; >++ bInfo.pszDisplayName = lBuff; >++ bInfo.lpszTitle = aTitle && wcslen(aTitle) ? aTitle : NULL; >++ if (lHResult == S_OK || lHResult == S_FALSE) >++ { >++ bInfo.ulFlags = BIF_USENEWUI; >++ } >++ bInfo.lpfn = BrowseCallbackProcW; >++ bInfo.lParam = (LPARAM)aDefaultPath; >++ bInfo.iImage = -1; >+ >+- lpItem = SHBrowseForFolderW(&bInfo); >+- if (!lpItem) >++ lpItem = SHBrowseForFolderW(&bInfo); >++ if (!lpItem) >++ { >++ lRetval = NULL; >++ } >++ else >+ { >+- lRetval = NULL; >++ SHGetPathFromIDListW(lpItem, lBuff); >++ lRetval = lBuff ; >+ } >+- else >+- { >+- SHGetPathFromIDListW(lpItem, lBuff); >+- lRetval = lBuff ; >+- } >+ >+- if (lHResult == S_OK || lHResult == S_FALSE) >+- { >+- CoUninitialize(); >+- } >+- return lRetval; >++ if (lHResult == S_OK || lHResult == S_FALSE) >++ { >++ CoUninitialize(); >++ } >++ return lRetval; >+ } >+ >+ >+ wchar_t * tinyfd_colorChooserW( >+- wchar_t const * aTitle, /* NULL or "" */ >+- wchar_t const * aDefaultHexRGB, /* NULL or "#FF0000"*/ >+- unsigned char const aDefaultRGB[3], /* { 0 , 255 , 255 } */ >+- unsigned char aoResultRGB[3]) /* { 0 , 0 , 0 } */ >++ wchar_t const * aTitle, /* NULL or "" */ >++ wchar_t const * aDefaultHexRGB, /* NULL or "#FF0000"*/ >++ unsigned char const aDefaultRGB[3], /* { 0 , 255 , 255 } */ >++ unsigned char aoResultRGB[3]) /* { 0 , 0 , 0 } */ >+ { >+- static wchar_t lResultHexRGB[8]; >+- CHOOSECOLORW cc; >+- COLORREF crCustColors[16]; >+- unsigned char lDefaultRGB[3]; >+- int lRet; >++ static wchar_t lResultHexRGB[8]; >++ CHOOSECOLORW cc; >++ COLORREF crCustColors[16]; >++ unsigned char lDefaultRGB[3]; >++ int lRet; >+ >+- HRESULT lHResult; >++ HRESULT lHResult; >+ >+- if (aTitle&&!wcscmp(aTitle, L"tinyfd_query")){ strcpy(tinyfd_response, "windows_wchar"); return (wchar_t *)1; } >++ if (aTitle&&!wcscmp(aTitle, L"tinyfd_query")){ strcpy(tinyfd_response, "windows_wchar"); return (wchar_t *)1; } >+ >+- if (quoteDetectedW(aTitle)) return tinyfd_colorChooserW(L"INVALID TITLE WITH QUOTES", aDefaultHexRGB, aDefaultRGB, aoResultRGB); >+- if (quoteDetectedW(aDefaultHexRGB)) return tinyfd_colorChooserW(aTitle, L"INVALID DEFAULT_HEX_RGB WITH QUOTES", aDefaultRGB, aoResultRGB); >++ /*if (quoteDetectedW(aTitle)) return tinyfd_colorChooserW(L"INVALID TITLE WITH QUOTES", aDefaultHexRGB, aDefaultRGB, aoResultRGB); >++ if (quoteDetectedW(aDefaultHexRGB)) return tinyfd_colorChooserW(aTitle, L"INVALID DEFAULT_HEX_RGB WITH QUOTES: use the GRAVE ACCENT \\x60 instead.", aDefaultRGB, aoResultRGB);*/ >+ >+- lHResult = CoInitializeEx(NULL, 0); >++ lHResult = CoInitializeEx(NULL, 0); >+ >+- if ( aDefaultHexRGB ) >+- { >+- Hex2RGBW(aDefaultHexRGB, lDefaultRGB); >+- } >+- else >+- { >+- lDefaultRGB[0] = aDefaultRGB[0]; >+- lDefaultRGB[1] = aDefaultRGB[1]; >+- lDefaultRGB[2] = aDefaultRGB[2]; >+- } >++ if ( aDefaultHexRGB ) >++ { >++ Hex2RGBW(aDefaultHexRGB, lDefaultRGB); >++ } >++ else >++ { >++ lDefaultRGB[0] = aDefaultRGB[0]; >++ lDefaultRGB[1] = aDefaultRGB[1]; >++ lDefaultRGB[2] = aDefaultRGB[2]; >++ } >+ >+- /* we can't use aTitle */ >+- cc.lStructSize = sizeof(CHOOSECOLOR); >+- cc.hwndOwner = GetForegroundWindow(); >+- cc.hInstance = NULL; >+- cc.rgbResult = RGB(lDefaultRGB[0], lDefaultRGB[1], lDefaultRGB[2]); >+- cc.lpCustColors = crCustColors; >+- cc.Flags = CC_RGBINIT | CC_FULLOPEN | CC_ANYCOLOR ; >+- cc.lCustData = 0; >+- cc.lpfnHook = NULL; >+- cc.lpTemplateName = NULL; >++ /* we can't use aTitle */ >++ cc.lStructSize = sizeof(CHOOSECOLOR); >++ cc.hwndOwner = GetForegroundWindow(); >++ cc.hInstance = NULL; >++ cc.rgbResult = RGB(lDefaultRGB[0], lDefaultRGB[1], lDefaultRGB[2]); >++ cc.lpCustColors = crCustColors; >++ cc.Flags = CC_RGBINIT | CC_FULLOPEN | CC_ANYCOLOR ; >++ cc.lCustData = 0; >++ cc.lpfnHook = NULL; >++ cc.lpTemplateName = NULL; >+ >+- lRet = ChooseColorW(&cc); >++ lRet = ChooseColorW(&cc); >+ >+- if (!lRet) >+- { >+- return NULL; >+- } >++ if (!lRet) >++ { >++ return NULL; >++ } >+ >+- aoResultRGB[0] = GetRValue(cc.rgbResult); >+- aoResultRGB[1] = GetGValue(cc.rgbResult); >+- aoResultRGB[2] = GetBValue(cc.rgbResult); >++ aoResultRGB[0] = GetRValue(cc.rgbResult); >++ aoResultRGB[1] = GetGValue(cc.rgbResult); >++ aoResultRGB[2] = GetBValue(cc.rgbResult); >+ >+- RGB2HexW(aoResultRGB, lResultHexRGB); >++ RGB2HexW(aoResultRGB, lResultHexRGB); >+ >+- if (lHResult == S_OK || lHResult == S_FALSE) >+- { >+- CoUninitialize(); >+- } >++ if (lHResult == S_OK || lHResult == S_FALSE) >++ { >++ CoUninitialize(); >++ } >+ >+- return lResultHexRGB; >++ return lResultHexRGB; >+ } >+ >+ >+ static int messageBoxWinGui( >+- char const * aTitle, /* NULL or "" */ >+- char const * aMessage, /* NULL or "" may contain \n and \t */ >+- char const * aDialogType, /* "ok" "okcancel" "yesno" "yesnocancel" */ >+- char const * aIconType, /* "info" "warning" "error" "question" */ >+- int aDefaultButton) /* 0 for cancel/no , 1 for ok/yes , 2 for no in yesnocancel */ >++ char const * aTitle, /* NULL or "" */ >++ char const * aMessage, /* NULL or "" may contain \n and \t */ >++ char const * aDialogType, /* "ok" "okcancel" "yesno" "yesnocancel" */ >++ char const * aIconType, /* "info" "warning" "error" "question" */ >++ int aDefaultButton) /* 0 for cancel/no , 1 for ok/yes , 2 for no in yesnocancel */ >+ { >+- int lIntRetVal; >+- wchar_t lTitle[128] = L""; >+- wchar_t * lMessage = NULL; >+- wchar_t lDialogType[16] = L""; >+- wchar_t lIconType[16] = L""; >+- wchar_t * lTmpWChar; >++ int lIntRetVal; >++ wchar_t lTitle[128] = L""; >++ wchar_t * lMessage = NULL; >++ wchar_t lDialogType[16] = L""; >++ wchar_t lIconType[16] = L""; >++ wchar_t * lTmpWChar; >+ >+- if (aTitle) >+- { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aTitle); >+- else lTmpWChar = tinyfd_mbcsTo16(aTitle); >+- wcscpy(lTitle, lTmpWChar); >+- } >+- if (aMessage) >+- { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aMessage); >+- else lTmpWChar = tinyfd_mbcsTo16(aMessage); >+- lMessage = (wchar_t *) malloc((wcslen(lTmpWChar) + 1)* sizeof(wchar_t)); >+- if (lMessage) wcscpy(lMessage, lTmpWChar); >+- } >+- if (aDialogType) >+- { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aDialogType); >+- else lTmpWChar = tinyfd_mbcsTo16(aDialogType); >+- wcscpy(lDialogType, lTmpWChar); >+- } >+- if (aIconType) >+- { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aIconType); >+- else lTmpWChar = tinyfd_mbcsTo16(aIconType); >+- wcscpy(lIconType, lTmpWChar); >+- } >++ if (aTitle) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aTitle); >++ else lTmpWChar = tinyfd_mbcsTo16(aTitle); >++ wcscpy(lTitle, lTmpWChar); >++ } >++ if (aMessage) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aMessage); >++ else lTmpWChar = tinyfd_mbcsTo16(aMessage); >++ lMessage = (wchar_t *) malloc((wcslen(lTmpWChar) + 1)* sizeof(wchar_t)); >++ if (lMessage) wcscpy(lMessage, lTmpWChar); >++ } >++ if (aDialogType) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aDialogType); >++ else lTmpWChar = tinyfd_mbcsTo16(aDialogType); >++ wcscpy(lDialogType, lTmpWChar); >++ } >++ if (aIconType) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aIconType); >++ else lTmpWChar = tinyfd_mbcsTo16(aIconType); >++ wcscpy(lIconType, lTmpWChar); >++ } >+ >+- lIntRetVal = tinyfd_messageBoxW(lTitle, lMessage, lDialogType, lIconType, aDefaultButton); >++ lIntRetVal = tinyfd_messageBoxW(lTitle, lMessage, lDialogType, lIconType, aDefaultButton); >+ >+- free(lMessage); >++ free(lMessage); >+ >+- return lIntRetVal; >++ return lIntRetVal; >+ } >+ >+ >+ static int notifyWinGui( >+- char const * aTitle, /* NULL or "" */ >+- char const * aMessage, /* NULL or "" may NOT contain \n nor \t */ >+- char const * aIconType) >++ char const * aTitle, /* NULL or "" */ >++ char const * aMessage, /* NULL or "" may NOT contain \n nor \t */ >++ char const * aIconType) >+ { >+- wchar_t lTitle[128] = L""; >+- wchar_t * lMessage = NULL; >+- wchar_t lIconType[16] = L""; >+- wchar_t * lTmpWChar; >++ wchar_t lTitle[128] = L""; >++ wchar_t * lMessage = NULL; >++ wchar_t lIconType[16] = L""; >++ wchar_t * lTmpWChar; >+ >+- if (aTitle) >+- { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aTitle); >+- else lTmpWChar = tinyfd_mbcsTo16(aTitle); >+- wcscpy(lTitle, lTmpWChar); >+- } >+- if (aMessage) >+- { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aMessage); >+- else lTmpWChar = tinyfd_mbcsTo16(aMessage); >+- lMessage = (wchar_t *) malloc((wcslen(lTmpWChar) + 1)* sizeof(wchar_t)); >+- if (lMessage) wcscpy(lMessage, lTmpWChar); >+- } >+- if (aIconType) >+- { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aIconType); >+- else lTmpWChar = tinyfd_mbcsTo16(aIconType); >+- wcscpy(lIconType, lTmpWChar); >+- } >++ if (aTitle) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aTitle); >++ else lTmpWChar = tinyfd_mbcsTo16(aTitle); >++ wcscpy(lTitle, lTmpWChar); >++ } >++ if (aMessage) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aMessage); >++ else lTmpWChar = tinyfd_mbcsTo16(aMessage); >++ lMessage = (wchar_t *) malloc((wcslen(lTmpWChar) + 1)* sizeof(wchar_t)); >++ if (lMessage) wcscpy(lMessage, lTmpWChar); >++ } >++ if (aIconType) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aIconType); >++ else lTmpWChar = tinyfd_mbcsTo16(aIconType); >++ wcscpy(lIconType, lTmpWChar); >++ } >+ >+- tinyfd_notifyPopupW(lTitle, lMessage, lIconType); >++ tinyfd_notifyPopupW(lTitle, lMessage, lIconType); >+ >+- free(lMessage); >++ free(lMessage); >+ >+- return 1; >++ return 1; >+ } >+ >+ >+ static int inputBoxWinGui( >+- char * aoBuff, >+- char const * aTitle, /* NULL or "" */ >+- char const * aMessage, /* NULL or "" may NOT contain \n nor \t */ >+- char const * aDefaultInput) /* "" , if NULL it's a passwordBox */ >++ char * aoBuff, >++ char const * aTitle, /* NULL or "" */ >++ char const * aMessage, /* NULL or "" may NOT contain \n nor \t */ >++ char const * aDefaultInput) /* "" , if NULL it's a passwordBox */ >+ { >+- wchar_t lTitle[128] = L""; >+- wchar_t * lMessage = NULL; >+- wchar_t lDefaultInput[MAX_PATH_OR_CMD] = L""; >+- wchar_t * lTmpWChar; >+- char * lTmpChar; >++ wchar_t lTitle[128] = L""; >++ wchar_t * lMessage = NULL; >++ wchar_t lDefaultInput[MAX_PATH_OR_CMD] = L""; >++ wchar_t * lTmpWChar; >++ char * lTmpChar; >+ >+- if (aTitle) >+- { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aTitle); >+- else lTmpWChar = tinyfd_mbcsTo16(aTitle); >+- wcscpy(lTitle, lTmpWChar); >+- } >+- if (aMessage) >+- { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aMessage); >+- else lTmpWChar = tinyfd_mbcsTo16(aMessage); >+- lMessage = (wchar_t *) malloc((wcslen(lTmpWChar) + 1)* sizeof(wchar_t)); >+- if (lMessage) wcscpy(lMessage, lTmpWChar); >+- } >+- if (aDefaultInput) >+- { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aDefaultInput); >+- else lTmpWChar = tinyfd_mbcsTo16(aDefaultInput); >+- wcscpy(lDefaultInput, lTmpWChar); >+- lTmpWChar = tinyfd_inputBoxW(lTitle, lMessage, lDefaultInput); >+- } >+- else lTmpWChar = tinyfd_inputBoxW(lTitle, lMessage, NULL); >++ if (aTitle) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aTitle); >++ else lTmpWChar = tinyfd_mbcsTo16(aTitle); >++ wcscpy(lTitle, lTmpWChar); >++ } >++ if (aMessage) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aMessage); >++ else lTmpWChar = tinyfd_mbcsTo16(aMessage); >++ lMessage = (wchar_t *) malloc((wcslen(lTmpWChar) + 1)* sizeof(wchar_t)); >++ if (lMessage) wcscpy(lMessage, lTmpWChar); >++ } >++ if (aDefaultInput) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aDefaultInput); >++ else lTmpWChar = tinyfd_mbcsTo16(aDefaultInput); >++ wcscpy(lDefaultInput, lTmpWChar); >++ lTmpWChar = tinyfd_inputBoxW(lTitle, lMessage, lDefaultInput); >++ } >++ else lTmpWChar = tinyfd_inputBoxW(lTitle, lMessage, NULL); >+ >+- free(lMessage); >++ free(lMessage); >+ >+- if (!lTmpWChar) >+- { >+- aoBuff[0] = '\0'; >+- return 0; >+- } >++ if (!lTmpWChar) >++ { >++ aoBuff[0] = '\0'; >++ return 0; >++ } >+ >+- if (tinyfd_winUtf8) lTmpChar = tinyfd_utf16to8(lTmpWChar); >+- else lTmpChar = tinyfd_utf16toMbcs(lTmpWChar); >++ if (tinyfd_winUtf8) lTmpChar = tinyfd_utf16to8(lTmpWChar); >++ else lTmpChar = tinyfd_utf16toMbcs(lTmpWChar); >+ >+- strcpy(aoBuff, lTmpChar); >++ strcpy(aoBuff, lTmpChar); >+ >+- return 1; >++ return 1; >+ } >+ >+ >+ static char * saveFileDialogWinGui( >+- char * aoBuff, >+- char const * aTitle, /* NULL or "" */ >+- char const * aDefaultPathAndFile, /* NULL or "" */ >+- int aNumOfFilterPatterns, /* 0 */ >+- char const * const * aFilterPatterns, /* NULL or {"*.jpg","*.png"} */ >+- char const * aSingleFilterDescription) /* NULL or "image files" */ >++ char * aoBuff, >++ char const * aTitle, /* NULL or "" */ >++ char const * aDefaultPathAndOrFile, /* NULL or "" */ >++ int aNumOfFilterPatterns, /* 0 */ >++ char const * const * aFilterPatterns, /* NULL or {"*.jpg","*.png"} */ >++ char const * aSingleFilterDescription) /* NULL or "image files" */ >+ { >+- wchar_t lTitle[128] = L""; >+- wchar_t lDefaultPathAndFile[MAX_PATH_OR_CMD] = L""; >+- wchar_t lSingleFilterDescription[128] = L""; >+- wchar_t * * lFilterPatterns; >+- wchar_t * lTmpWChar; >+- char * lTmpChar; >+- int i; >++ wchar_t lTitle[128] = L""; >++ wchar_t lDefaultPathAndFile[MAX_PATH_OR_CMD] = L""; >++ wchar_t lSingleFilterDescription[128] = L""; >++ wchar_t * * lFilterPatterns; >++ wchar_t * lTmpWChar; >++ char * lTmpChar; >++ int i; >+ >+- lFilterPatterns = (wchar_t **)malloc(aNumOfFilterPatterns*sizeof(wchar_t *)); >+- for (i = 0; i < aNumOfFilterPatterns; i++) >+- { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aFilterPatterns[i]); >+- else lTmpWChar = tinyfd_mbcsTo16(aFilterPatterns[i]); >+- lFilterPatterns[i] = (wchar_t *)malloc((wcslen(lTmpWChar) + 1) * sizeof(wchar_t *)); >+- if (lFilterPatterns[i]) wcscpy(lFilterPatterns[i], lTmpWChar); >+- } >++ lFilterPatterns = (wchar_t **) malloc(aNumOfFilterPatterns*sizeof(wchar_t *)); >++ for (i = 0; i < aNumOfFilterPatterns; i++) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aFilterPatterns[i]); >++ else lTmpWChar = tinyfd_mbcsTo16(aFilterPatterns[i]); >++ lFilterPatterns[i] = (wchar_t *) malloc((wcslen(lTmpWChar) + 1) * sizeof(wchar_t *)); >++ if (lFilterPatterns[i]) wcscpy(lFilterPatterns[i], lTmpWChar); >++ } >+ >+- if (aTitle) >+- { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aTitle); >+- else lTmpWChar = tinyfd_mbcsTo16(aTitle); >+- wcscpy(lTitle, lTmpWChar); >+- } >+- if (aDefaultPathAndFile) >+- { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aDefaultPathAndFile); >+- else lTmpWChar = tinyfd_mbcsTo16(aDefaultPathAndFile); >+- wcscpy(lDefaultPathAndFile, lTmpWChar); >+- } >+- if (aSingleFilterDescription) >+- { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aSingleFilterDescription); >+- else lTmpWChar = tinyfd_mbcsTo16(aSingleFilterDescription); >+- wcscpy(lSingleFilterDescription, lTmpWChar); >+- } >++ if (aTitle) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aTitle); >++ else lTmpWChar = tinyfd_mbcsTo16(aTitle); >++ wcscpy(lTitle, lTmpWChar); >++ } >++ if (aDefaultPathAndOrFile) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aDefaultPathAndOrFile); >++ else lTmpWChar = tinyfd_mbcsTo16(aDefaultPathAndOrFile); >++ wcscpy(lDefaultPathAndFile, lTmpWChar); >++ } >++ if (aSingleFilterDescription) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aSingleFilterDescription); >++ else lTmpWChar = tinyfd_mbcsTo16(aSingleFilterDescription); >++ wcscpy(lSingleFilterDescription, lTmpWChar); >++ } >+ >+- lTmpWChar = tinyfd_saveFileDialogW( >+- lTitle, >+- lDefaultPathAndFile, >+- aNumOfFilterPatterns, >+- (wchar_t const**) lFilterPatterns, /*stupid cast for gcc*/ >+- lSingleFilterDescription); >++ lTmpWChar = tinyfd_saveFileDialogW( >++ lTitle, >++ lDefaultPathAndFile, >++ aNumOfFilterPatterns, >++ (wchar_t const**) lFilterPatterns, /*stupid cast for gcc*/ >++ lSingleFilterDescription); >+ >+- for (i = 0; i < aNumOfFilterPatterns; i++) >+- { >+- free(lFilterPatterns[i]); >+- } >+- free(lFilterPatterns); >++ for (i = 0; i < aNumOfFilterPatterns; i++) >++ { >++ free(lFilterPatterns[i]); >++ } >++ free(lFilterPatterns); >+ >+- if (!lTmpWChar) >+- { >+- return NULL; >+- } >++ if (!lTmpWChar) >++ { >++ return NULL; >++ } >+ >+- if (tinyfd_winUtf8) lTmpChar = tinyfd_utf16to8(lTmpWChar); >+- else lTmpChar = tinyfd_utf16toMbcs(lTmpWChar); >+- strcpy(aoBuff, lTmpChar); >+- if (tinyfd_winUtf8) (void)tinyfd_utf16to8(NULL); >+- else (void)tinyfd_utf16toMbcs(NULL); >++ if (tinyfd_winUtf8) lTmpChar = tinyfd_utf16to8(lTmpWChar); >++ else lTmpChar = tinyfd_utf16toMbcs(lTmpWChar); >++ strcpy(aoBuff, lTmpChar); >++ if (tinyfd_winUtf8) (void)tinyfd_utf16to8(NULL); >++ else (void)tinyfd_utf16toMbcs(NULL); >+ >+- return aoBuff; >++ return aoBuff; >+ } >+ >+ >+ static char * openFileDialogWinGui( >+- char const * aTitle, /* NULL or "" */ >+- char const * aDefaultPathAndFile, /* NULL or "" */ >+- int aNumOfFilterPatterns, /* 0 */ >+- char const * const * aFilterPatterns, /* NULL or {"*.jpg","*.png"} */ >+- char const * aSingleFilterDescription, /* NULL or "image files" */ >+- int aAllowMultipleSelects) /* 0 or 1 */ >++ char const * aTitle, /* NULL or "" */ >++ char const * aDefaultPathAndOrFile, /* NULL or "" */ >++ int aNumOfFilterPatterns, /* 0 */ >++ char const * const * aFilterPatterns, /* NULL or {"*.jpg","*.png"} */ >++ char const * aSingleFilterDescription, /* NULL or "image files" */ >++ int aAllowMultipleSelects) /* 0 or 1 */ >+ { >+- wchar_t lTitle[128] = L""; >+- wchar_t lDefaultPathAndFile[MAX_PATH_OR_CMD] = L""; >+- wchar_t lSingleFilterDescription[128] = L""; >+- wchar_t * * lFilterPatterns; >+- wchar_t * lTmpWChar; >+- char * lTmpChar; >+- int i; >++ wchar_t lTitle[128] = L""; >++ wchar_t lDefaultPathAndFile[MAX_PATH_OR_CMD] = L""; >++ wchar_t lSingleFilterDescription[128] = L""; >++ wchar_t * * lFilterPatterns; >++ wchar_t * lTmpWChar; >++ char * lTmpChar; >++ int i; >+ >+- lFilterPatterns = (wchar_t * *)malloc(aNumOfFilterPatterns*sizeof(wchar_t *)); >+- for (i = 0; i < aNumOfFilterPatterns; i++) >+- { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aFilterPatterns[i]); >+- else lTmpWChar = tinyfd_mbcsTo16(aFilterPatterns[i]); >+- lFilterPatterns[i] = (wchar_t *)malloc((wcslen(lTmpWChar) + 1)*sizeof(wchar_t *)); >+- if (lFilterPatterns[i]) wcscpy(lFilterPatterns[i], lTmpWChar); >+- } >++ lFilterPatterns = (wchar_t * *) malloc(aNumOfFilterPatterns*sizeof(wchar_t *)); >++ for (i = 0; i < aNumOfFilterPatterns; i++) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aFilterPatterns[i]); >++ else lTmpWChar = tinyfd_mbcsTo16(aFilterPatterns[i]); >++ lFilterPatterns[i] = (wchar_t *) malloc((wcslen(lTmpWChar) + 1)*sizeof(wchar_t *)); >++ if (lFilterPatterns[i]) wcscpy(lFilterPatterns[i], lTmpWChar); >++ } >+ >+- if (aTitle) >+- { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aTitle); >+- else lTmpWChar = tinyfd_mbcsTo16(aTitle); >+- wcscpy(lTitle, lTmpWChar); >+- } >+- if (aDefaultPathAndFile) >+- { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aDefaultPathAndFile); >+- else lTmpWChar = tinyfd_mbcsTo16(aDefaultPathAndFile); >+- wcscpy(lDefaultPathAndFile, lTmpWChar); >+- } >+- if (aSingleFilterDescription) >+- { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aSingleFilterDescription); >+- else lTmpWChar = tinyfd_mbcsTo16(aSingleFilterDescription); >+- wcscpy(lSingleFilterDescription, lTmpWChar); >+- } >++ if (aTitle) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aTitle); >++ else lTmpWChar = tinyfd_mbcsTo16(aTitle); >++ wcscpy(lTitle, lTmpWChar); >++ } >++ if (aDefaultPathAndOrFile) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aDefaultPathAndOrFile); >++ else lTmpWChar = tinyfd_mbcsTo16(aDefaultPathAndOrFile); >++ wcscpy(lDefaultPathAndFile, lTmpWChar); >++ } >++ if (aSingleFilterDescription) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aSingleFilterDescription); >++ else lTmpWChar = tinyfd_mbcsTo16(aSingleFilterDescription); >++ wcscpy(lSingleFilterDescription, lTmpWChar); >++ } >+ >+- lTmpWChar = tinyfd_openFileDialogW( >+- lTitle, >+- lDefaultPathAndFile, >+- aNumOfFilterPatterns, >+- (wchar_t const**) lFilterPatterns, /*stupid cast for gcc*/ >+- lSingleFilterDescription, >+- aAllowMultipleSelects); >++ lTmpWChar = tinyfd_openFileDialogW( >++ lTitle, >++ lDefaultPathAndFile, >++ aNumOfFilterPatterns, >++ (wchar_t const**) lFilterPatterns, /*stupid cast for gcc*/ >++ lSingleFilterDescription, >++ aAllowMultipleSelects); >+ >+- for (i = 0; i < aNumOfFilterPatterns; i++) >+- { >+- free(lFilterPatterns[i]); >+- } >+- free(lFilterPatterns); >++ for (i = 0; i < aNumOfFilterPatterns; i++) >++ { >++ free(lFilterPatterns[i]); >++ } >++ free(lFilterPatterns); >+ >+- if (!lTmpWChar) return NULL; >++ if (!lTmpWChar) return NULL; >+ >+- if (tinyfd_winUtf8) lTmpChar = tinyfd_utf16to8(lTmpWChar); >+- else lTmpChar = tinyfd_utf16toMbcs(lTmpWChar); >+- (void)tinyfd_openFileDialogW(NULL, NULL, 0, NULL, NULL, -1); >++ if (tinyfd_winUtf8) lTmpChar = tinyfd_utf16to8(lTmpWChar); >++ else lTmpChar = tinyfd_utf16toMbcs(lTmpWChar); >++ (void)tinyfd_openFileDialogW(NULL, NULL, 0, NULL, NULL, -1); >+ >+- return lTmpChar; >++ return lTmpChar; >+ } >+ >+ >+ static char * selectFolderDialogWinGui( >+- char * aoBuff, >+- char const * aTitle, /* NULL or "" */ >+- char const * aDefaultPath) /* NULL or "" */ >++ char * aoBuff, >++ char const * aTitle, /* NULL or "" */ >++ char const * aDefaultPath) /* NULL or "" */ >+ { >+- wchar_t lTitle[128] = L""; >+- wchar_t lDefaultPath[MAX_PATH_OR_CMD] = L""; >+- wchar_t * lTmpWChar; >+- char * lTmpChar; >++ wchar_t lTitle[128] = L""; >++ wchar_t lDefaultPath[MAX_PATH_OR_CMD] = L""; >++ wchar_t * lTmpWChar; >++ char * lTmpChar; >+ >+- if (aTitle) >+- { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aTitle); >+- else lTmpWChar = tinyfd_mbcsTo16(aTitle); >+- wcscpy(lTitle, lTmpWChar); >+- } >+- if (aDefaultPath) >+- { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aDefaultPath); >+- else lTmpWChar = tinyfd_mbcsTo16(aDefaultPath); >+- wcscpy(lDefaultPath, lTmpWChar); >+- } >++ if (aTitle) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aTitle); >++ else lTmpWChar = tinyfd_mbcsTo16(aTitle); >++ wcscpy(lTitle, lTmpWChar); >++ } >++ if (aDefaultPath) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aDefaultPath); >++ else lTmpWChar = tinyfd_mbcsTo16(aDefaultPath); >++ wcscpy(lDefaultPath, lTmpWChar); >++ } >+ >+- lTmpWChar = tinyfd_selectFolderDialogW( >+- lTitle, >+- lDefaultPath); >++ lTmpWChar = tinyfd_selectFolderDialogW( >++ lTitle, >++ lDefaultPath); >+ >+- if (!lTmpWChar) >+- { >+- return NULL; >+- } >++ if (!lTmpWChar) >++ { >++ return NULL; >++ } >+ >+- if (tinyfd_winUtf8) lTmpChar = tinyfd_utf16to8(lTmpWChar); >+- else lTmpChar = tinyfd_utf16toMbcs(lTmpWChar); >+- strcpy(aoBuff, lTmpChar); >++ if (tinyfd_winUtf8) lTmpChar = tinyfd_utf16to8(lTmpWChar); >++ else lTmpChar = tinyfd_utf16toMbcs(lTmpWChar); >++ strcpy(aoBuff, lTmpChar); >+ >+- return aoBuff; >++ return aoBuff; >+ } >+ >+ >+ static char * colorChooserWinGui( >+- char const * aTitle, /* NULL or "" */ >+- char const * aDefaultHexRGB, /* NULL or "#FF0000"*/ >+- unsigned char const aDefaultRGB[3], /* { 0 , 255 , 255 } */ >+- unsigned char aoResultRGB[3]) /* { 0 , 0 , 0 } */ >++ char const * aTitle, /* NULL or "" */ >++ char const * aDefaultHexRGB, /* NULL or "#FF0000"*/ >++ unsigned char const aDefaultRGB[3], /* { 0 , 255 , 255 } */ >++ unsigned char aoResultRGB[3]) /* { 0 , 0 , 0 } */ >+ { >+- static char lResultHexRGB[8]; >++ static char lResultHexRGB[8]; >+ >+- wchar_t lTitle[128]; >+- wchar_t lDefaultHexRGB[16]; >+- wchar_t * lTmpWChar; >+- char * lTmpChar; >++ wchar_t lTitle[128]; >++ wchar_t lDefaultHexRGB[16]; >++ wchar_t * lTmpWChar; >++ char * lTmpChar; >+ >+- if (aTitle) >++ if (aTitle) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aTitle); >++ else lTmpWChar = tinyfd_mbcsTo16(aTitle); >++ wcscpy(lTitle, lTmpWChar); >++ } >++ if (aDefaultHexRGB) >++ { >++ if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aDefaultHexRGB); >++ else lTmpWChar = tinyfd_mbcsTo16(aDefaultHexRGB); >++ wcscpy(lDefaultHexRGB, lTmpWChar); >++ } >++ >++ lTmpWChar = tinyfd_colorChooserW( >++ lTitle, >++ lDefaultHexRGB, >++ aDefaultRGB, >++ aoResultRGB ); >++ >++ if (!lTmpWChar) >+ { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aTitle); >+- else lTmpWChar = tinyfd_mbcsTo16(aTitle); >+- wcscpy(lTitle, lTmpWChar); >++ return NULL; >+ } >+- if (aDefaultHexRGB) >+- { >+- if (tinyfd_winUtf8) lTmpWChar = tinyfd_utf8to16(aDefaultHexRGB); >+- else lTmpWChar = tinyfd_mbcsTo16(aDefaultHexRGB); >+- wcscpy(lDefaultHexRGB, lTmpWChar); >+- } >+ >+- lTmpWChar = tinyfd_colorChooserW( >+- lTitle, >+- lDefaultHexRGB, >+- aDefaultRGB, >+- aoResultRGB ); >++ if (tinyfd_winUtf8) lTmpChar = tinyfd_utf16to8(lTmpWChar); >++ else lTmpChar = tinyfd_utf16toMbcs(lTmpWChar); >++ strcpy(lResultHexRGB, lTmpChar); >+ >+- if (!lTmpWChar) >+- { >+- return NULL; >+- } >+- >+- if (tinyfd_winUtf8) lTmpChar = tinyfd_utf16to8(lTmpWChar); >+- else lTmpChar = tinyfd_utf16toMbcs(lTmpWChar); >+- strcpy(lResultHexRGB, lTmpChar); >+- >+- return lResultHexRGB; >++ return lResultHexRGB; >+ } >+ >+ >+ static int dialogPresent(void) >+ { >+- static int lDialogPresent = -1 ; >+- char lBuff[MAX_PATH_OR_CMD] ; >+- FILE * lIn ; >+- char const * lString = "dialog.exe"; >+- if (!tinyfd_allowCursesDialogs) return 0; >+- if (lDialogPresent < 0) >+- { >+- if (!(lIn = _popen("where dialog.exe","r"))) >+- { >+- lDialogPresent = 0 ; >+- return 0 ; >+- } >+- while ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >+- {} >+- _pclose( lIn ) ; >+- if ( lBuff[strlen( lBuff ) -1] == '\n' ) >+- { >+- lBuff[strlen( lBuff ) -1] = '\0' ; >+- } >+- if ( strcmp(lBuff+strlen(lBuff)-strlen(lString),lString) ) >+- { >+- lDialogPresent = 0 ; >+- } >+- else >+- { >+- lDialogPresent = 1 ; >+- } >+- } >+- return lDialogPresent; >++ static int lDialogPresent = -1 ; >++ char lBuff[MAX_PATH_OR_CMD] ; >++ FILE * lIn ; >++ char const * lString = "dialog.exe"; >++ if (!tinyfd_allowCursesDialogs) return 0; >++ if (lDialogPresent < 0) >++ { >++ lIn = _popen("where dialog.exe", "r"); >++ if ( ! lIn ) >++ { >++ lDialogPresent = 0 ; >++ return 0 ; >++ } >++ while ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >++ {} >++ _pclose( lIn ) ; >++ if ( lBuff[strlen( lBuff ) -1] == '\n' ) >++ { >++ lBuff[strlen( lBuff ) -1] = '\0' ; >++ } >++ if ( strcmp(lBuff+strlen(lBuff)-strlen(lString),lString) ) >++ { >++ lDialogPresent = 0 ; >++ } >++ else >++ { >++ lDialogPresent = 1 ; >++ } >++ } >++ return lDialogPresent; >+ } >+ >+ >+ static int messageBoxWinConsole( >+- char const * aTitle , /* NULL or "" */ >+- char const * aMessage , /* NULL or "" may contain \n and \t */ >+- char const * aDialogType , /* "ok" "okcancel" "yesno" "yesnocancel" */ >+- char const * aIconType , /* "info" "warning" "error" "question" */ >+- int aDefaultButton ) /* 0 for cancel/no , 1 for ok/yes , 2 for no in yesnocancel */ >++ char const * aTitle , /* NULL or "" */ >++ char const * aMessage , /* NULL or "" may contain \n and \t */ >++ char const * aDialogType , /* "ok" "okcancel" "yesno" "yesnocancel" */ >++ char const * aIconType , /* "info" "warning" "error" "question" */ >++ int aDefaultButton ) /* 0 for cancel/no , 1 for ok/yes , 2 for no in yesnocancel */ >+ { >+- char lDialogString[MAX_PATH_OR_CMD]; >+- char lDialogFile[MAX_PATH_OR_CMD]; >+- FILE * lIn; >+- char lBuff[MAX_PATH_OR_CMD] = ""; >++ char lDialogString[MAX_PATH_OR_CMD]; >++ char lDialogFile[MAX_PATH_OR_CMD]; >++ FILE * lIn; >++ char lBuff[MAX_PATH_OR_CMD] = ""; >+ >+- strcpy(lDialogString, "dialog "); >+- if (aTitle && strlen(aTitle)) >+- { >+- strcat(lDialogString, "--title \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\" ") ; >+- } >++ strcpy(lDialogString, "dialog "); >++ if (aTitle && strlen(aTitle)) >++ { >++ strcat(lDialogString, "--title \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\" ") ; >++ } >+ >+- if ( aDialogType && ( !strcmp( "okcancel" , aDialogType ) >+- || !strcmp("yesno", aDialogType) || !strcmp("yesnocancel", aDialogType) ) ) >+- { >+- strcat(lDialogString, "--backtitle \"") ; >+- strcat(lDialogString, "tab: move focus") ; >+- strcat(lDialogString, "\" ") ; >+- } >++ if ( aDialogType && ( !strcmp( "okcancel" , aDialogType ) >++ || !strcmp("yesno", aDialogType) || !strcmp("yesnocancel", aDialogType) ) ) >++ { >++ strcat(lDialogString, "--backtitle \"") ; >++ strcat(lDialogString, "tab: move focus") ; >++ strcat(lDialogString, "\" ") ; >++ } >+ >+- if ( aDialogType && ! strcmp( "okcancel" , aDialogType ) ) >+- { >+- if ( ! aDefaultButton ) >+- { >+- strcat( lDialogString , "--defaultno " ) ; >+- } >+- strcat( lDialogString , >+- "--yes-label \"Ok\" --no-label \"Cancel\" --yesno " ) ; >+- } >+- else if ( aDialogType && ! strcmp( "yesno" , aDialogType ) ) >+- { >+- if ( ! aDefaultButton ) >+- { >+- strcat( lDialogString , "--defaultno " ) ; >+- } >+- strcat( lDialogString , "--yesno " ) ; >+- } >+- else if (aDialogType && !strcmp("yesnocancel", aDialogType)) >+- { >+- if (!aDefaultButton) >+- { >+- strcat(lDialogString, "--defaultno "); >+- } >+- strcat(lDialogString, "--menu "); >+- } >+- else >+- { >+- strcat( lDialogString , "--msgbox " ) ; >+- } >++ if ( aDialogType && ! strcmp( "okcancel" , aDialogType ) ) >++ { >++ if ( ! aDefaultButton ) >++ { >++ strcat( lDialogString , "--defaultno " ) ; >++ } >++ strcat( lDialogString , >++ "--yes-label \"Ok\" --no-label \"Cancel\" --yesno " ) ; >++ } >++ else if ( aDialogType && ! strcmp( "yesno" , aDialogType ) ) >++ { >++ if ( ! aDefaultButton ) >++ { >++ strcat( lDialogString , "--defaultno " ) ; >++ } >++ strcat( lDialogString , "--yesno " ) ; >++ } >++ else if (aDialogType && !strcmp("yesnocancel", aDialogType)) >++ { >++ if (!aDefaultButton) >++ { >++ strcat(lDialogString, "--defaultno "); >++ } >++ strcat(lDialogString, "--menu "); >++ } >++ else >++ { >++ strcat( lDialogString , "--msgbox " ) ; >++ } >+ >+- strcat( lDialogString , "\"" ) ; >+- if ( aMessage && strlen(aMessage) ) >+- { >+- tfd_replaceSubStr( aMessage , "\n" , "\\n" , lBuff ) ; >+- strcat(lDialogString, lBuff) ; >+- lBuff[0]='\0'; >+- } >+- strcat(lDialogString, "\" "); >++ strcat( lDialogString , "\"" ) ; >++ if ( aMessage && strlen(aMessage) ) >++ { >++ tfd_replaceSubStr( aMessage , "\n" , "\\n" , lBuff ) ; >++ strcat(lDialogString, lBuff) ; >++ lBuff[0]='\0'; >++ } >++ strcat(lDialogString, "\" "); >+ >+- if (aDialogType && !strcmp("yesnocancel", aDialogType)) >+- { >+- strcat(lDialogString, "0 60 0 Yes \"\" No \"\""); >+- strcat(lDialogString, "2>>"); >+- } >+- else >+- { >+- strcat(lDialogString, "10 60"); >+- strcat(lDialogString, " && echo 1 > "); >+- } >++ if (aDialogType && !strcmp("yesnocancel", aDialogType)) >++ { >++ strcat(lDialogString, "0 60 0 Yes \"\" No \"\""); >++ strcat(lDialogString, "2>>"); >++ } >++ else >++ { >++ strcat(lDialogString, "10 60"); >++ strcat(lDialogString, " && echo 1 > "); >++ } >+ >+- strcpy(lDialogFile, getenv("TEMP")); >+- strcat(lDialogFile, "\\tinyfd.txt"); >+- strcat(lDialogString, lDialogFile); >++ strcpy(lDialogFile, getenv("TEMP")); >++ strcat(lDialogFile, "\\tinyfd.txt"); >++ strcat(lDialogString, lDialogFile); >+ >+- /*if (tinyfd_verbose) printf( "lDialogString: %s\n" , lDialogString ) ;*/ >+- system( lDialogString ) ; >++ /*if (tinyfd_verbose) printf( "lDialogString: %s\n" , lDialogString ) ;*/ >++ system( lDialogString ) ; >+ >+- if (!(lIn = fopen(lDialogFile, "r"))) >+- { >+- remove(lDialogFile); >+- return 0 ; >+- } >+- while (fgets(lBuff, sizeof(lBuff), lIn) != NULL) >+- {} >+- fclose(lIn); >+- remove(lDialogFile); >+- if ( lBuff[strlen( lBuff ) -1] == '\n' ) >+- { >+- lBuff[strlen( lBuff ) -1] = '\0' ; >+- } >++ if (!(lIn = fopen(lDialogFile, "r"))) >++ { >++ remove(lDialogFile); >++ return 0 ; >++ } >++ while (fgets(lBuff, sizeof(lBuff), lIn) != NULL) >++ {} >++ fclose(lIn); >++ remove(lDialogFile); >++ if ( lBuff[strlen( lBuff ) -1] == '\n' ) >++ { >++ lBuff[strlen( lBuff ) -1] = '\0' ; >++ } >+ >+- /* if (tinyfd_verbose) printf("lBuff: %s\n", lBuff); */ >+- if ( ! strlen(lBuff) ) >+- { >+- return 0; >+- } >++ /* if (tinyfd_verbose) printf("lBuff: %s\n", lBuff); */ >++ if ( ! strlen(lBuff) ) >++ { >++ return 0; >++ } >+ >+- if (aDialogType && !strcmp("yesnocancel", aDialogType)) >+- { >+- if (lBuff[0] == 'Y') return 1; >+- else return 2; >+- } >++ if (aDialogType && !strcmp("yesnocancel", aDialogType)) >++ { >++ if (lBuff[0] == 'Y') return 1; >++ else return 2; >++ } >+ >+- return 1; >++ return 1; >+ } >+ >+ >+ static int inputBoxWinConsole( >+- char * aoBuff , >+- char const * aTitle , /* NULL or "" */ >+- char const * aMessage , /* NULL or "" may NOT contain \n nor \t */ >+- char const * aDefaultInput ) /* "" , if NULL it's a passwordBox */ >++ char * aoBuff , >++ char const * aTitle , /* NULL or "" */ >++ char const * aMessage , /* NULL or "" may NOT contain \n nor \t */ >++ char const * aDefaultInput ) /* "" , if NULL it's a passwordBox */ >+ { >+- char lDialogString[MAX_PATH_OR_CMD]; >+- char lDialogFile[MAX_PATH_OR_CMD]; >+- FILE * lIn; >+- int lResult; >++ char lDialogString[MAX_PATH_OR_CMD]; >++ char lDialogFile[MAX_PATH_OR_CMD]; >++ FILE * lIn; >++ int lResult; >+ >+- strcpy(lDialogFile, getenv("TEMP")); >+- strcat(lDialogFile, "\\tinyfd.txt"); >+- strcpy(lDialogString , "echo|set /p=1 >" ) ; >+- strcat(lDialogString, lDialogFile); >+- strcat( lDialogString , " & " ) ; >++ strcpy(lDialogFile, getenv("TEMP")); >++ strcat(lDialogFile, "\\tinyfd.txt"); >++ strcpy(lDialogString , "echo|set /p=1 >" ) ; >++ strcat(lDialogString, lDialogFile); >++ strcat( lDialogString , " & " ) ; >+ >+- strcat( lDialogString , "dialog " ) ; >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "--title \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\" ") ; >+- } >++ strcat( lDialogString , "dialog " ) ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "--title \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\" ") ; >++ } >+ >+- strcat(lDialogString, "--backtitle \"") ; >+- strcat(lDialogString, "tab: move focus") ; >+- if ( ! aDefaultInput ) >+- { >+- strcat(lDialogString, " (sometimes nothing, no blink nor star, is shown in text field)") ; >+- } >++ strcat(lDialogString, "--backtitle \"") ; >++ strcat(lDialogString, "tab: move focus") ; >++ if ( ! aDefaultInput ) >++ { >++ strcat(lDialogString, " (sometimes nothing, no blink nor star, is shown in text field)") ; >++ } >+ >+- strcat(lDialogString, "\" ") ; >++ strcat(lDialogString, "\" ") ; >+ >+- if ( ! aDefaultInput ) >+- { >+- strcat( lDialogString , "--insecure --passwordbox" ) ; >+- } >+- else >+- { >+- strcat( lDialogString , "--inputbox" ) ; >+- } >+- strcat( lDialogString , " \"" ) ; >+- if ( aMessage && strlen(aMessage) ) >+- { >+- strcat(lDialogString, aMessage) ; >+- } >+- strcat(lDialogString,"\" 10 60 ") ; >+- if ( aDefaultInput && strlen(aDefaultInput) ) >+- { >+- strcat(lDialogString, "\"") ; >+- strcat(lDialogString, aDefaultInput) ; >+- strcat(lDialogString, "\" ") ; >+- } >++ if ( ! aDefaultInput ) >++ { >++ strcat( lDialogString , "--insecure --passwordbox" ) ; >++ } >++ else >++ { >++ strcat( lDialogString , "--inputbox" ) ; >++ } >++ strcat( lDialogString , " \"" ) ; >++ if ( aMessage && strlen(aMessage) ) >++ { >++ strcat(lDialogString, aMessage) ; >++ } >++ strcat(lDialogString,"\" 10 60 ") ; >++ if ( aDefaultInput && strlen(aDefaultInput) ) >++ { >++ strcat(lDialogString, "\"") ; >++ strcat(lDialogString, aDefaultInput) ; >++ strcat(lDialogString, "\" ") ; >++ } >+ >+- strcat(lDialogString, "2>>"); >+- strcpy(lDialogFile, getenv("TEMP")); >+- strcat(lDialogFile, "\\tinyfd.txt"); >+- strcat(lDialogString, lDialogFile); >+- strcat(lDialogString, " || echo 0 > "); >+- strcat(lDialogString, lDialogFile); >++ strcat(lDialogString, "2>>"); >++ strcpy(lDialogFile, getenv("TEMP")); >++ strcat(lDialogFile, "\\tinyfd.txt"); >++ strcat(lDialogString, lDialogFile); >++ strcat(lDialogString, " || echo 0 > "); >++ strcat(lDialogString, lDialogFile); >+ >+- /* printf( "lDialogString: %s\n" , lDialogString ) ; */ >+- system( lDialogString ) ; >++ /* printf( "lDialogString: %s\n" , lDialogString ) ; */ >++ system( lDialogString ) ; >+ >+- if (!(lIn = fopen(lDialogFile, "r"))) >+- { >+- remove(lDialogFile); >+- aoBuff[0] = '\0'; >+- return 0; >+- } >+- while (fgets(aoBuff, MAX_PATH_OR_CMD, lIn) != NULL) >+- {} >+- fclose(lIn); >++ if (!(lIn = fopen(lDialogFile, "r"))) >++ { >++ remove(lDialogFile); >++ aoBuff[0] = '\0'; >++ return 0; >++ } >++ while (fgets(aoBuff, MAX_PATH_OR_CMD, lIn) != NULL) >++ {} >++ fclose(lIn); >+ >+- wipefile(lDialogFile); >+- remove(lDialogFile); >+- if ( aoBuff[strlen( aoBuff ) -1] == '\n' ) >+- { >+- aoBuff[strlen( aoBuff ) -1] = '\0' ; >+- } >+- /* printf( "aoBuff: %s\n" , aoBuff ) ; */ >+- >+- /* printf( "aoBuff: %s len: %lu \n" , aoBuff , strlen(aoBuff) ) ; */ >+- lResult = strncmp( aoBuff , "1" , 1) ? 0 : 1 ; >+- /* printf( "lResult: %d \n" , lResult ) ; */ >+- if ( ! lResult ) >++ wipefile(lDialogFile); >++ remove(lDialogFile); >++ if ( aoBuff[strlen( aoBuff ) -1] == '\n' ) >+ { >+- aoBuff[0] = '\0'; >+- return 0 ; >++ aoBuff[strlen( aoBuff ) -1] = '\0' ; >+ } >+- /* printf( "aoBuff+1: %s\n" , aoBuff+1 ) ; */ >+- strcpy(aoBuff, aoBuff+3); >+- return 1; >++ /* printf( "aoBuff: %s\n" , aoBuff ) ; */ >++ >++ /* printf( "aoBuff: %s len: %lu \n" , aoBuff , strlen(aoBuff) ) ; */ >++ lResult = strncmp( aoBuff , "1" , 1) ? 0 : 1 ; >++ /* printf( "lResult: %d \n" , lResult ) ; */ >++ if ( ! lResult ) >++ { >++ aoBuff[0] = '\0'; >++ return 0 ; >++ } >++ /* printf( "aoBuff+1: %s\n" , aoBuff+1 ) ; */ >++ strcpy(aoBuff, aoBuff+3); >++ return 1; >+ } >+ >+ >+ static char * saveFileDialogWinConsole( >+- char * aoBuff , >+- char const * aTitle , /* NULL or "" */ >+- char const * aDefaultPathAndFile ) /* NULL or "" */ >++ char * aoBuff , >++ char const * aTitle , /* NULL or "" */ >++ char const * aDefaultPathAndOrFile ) /* NULL or "" */ >+ { >+- char lDialogString[MAX_PATH_OR_CMD]; >+- char lPathAndFile[MAX_PATH_OR_CMD] = ""; >+- FILE * lIn; >++ char lDialogString[MAX_PATH_OR_CMD]; >++ char lPathAndFile[MAX_PATH_OR_CMD] = ""; >++ FILE * lIn; >+ >+- strcpy( lDialogString , "dialog " ) ; >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "--title \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\" ") ; >+- } >++ strcpy( lDialogString , "dialog " ) ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "--title \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\" ") ; >++ } >+ >+- strcat(lDialogString, "--backtitle \"") ; >+- strcat(lDialogString, >+- "tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY") ; >+- strcat(lDialogString, "\" ") ; >++ strcat(lDialogString, "--backtitle \"") ; >++ strcat(lDialogString, >++ "tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY") ; >++ strcat(lDialogString, "\" ") ; >+ >+- strcat( lDialogString , "--fselect \"" ) ; >+- if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) ) >+- { >+- /* dialog.exe uses unix separators even on windows */ >+- strcpy(lPathAndFile, aDefaultPathAndFile); >+- replaceChr( lPathAndFile , '\\' , '/' ) ; >+- } >++ strcat( lDialogString , "--fselect \"" ) ; >++ if ( aDefaultPathAndOrFile && strlen(aDefaultPathAndOrFile) ) >++ { >++ /* dialog.exe uses unix separators even on windows */ >++ strcpy(lPathAndFile, aDefaultPathAndOrFile); >++ replaceChr( lPathAndFile , '\\' , '/' ) ; >++ } >+ >+- /* dialog.exe needs at least one separator */ >+- if ( ! strchr(lPathAndFile, '/') ) >+- { >+- strcat(lDialogString, "./") ; >+- } >+- strcat(lDialogString, lPathAndFile) ; >+- strcat(lDialogString, "\" 0 60 2>"); >+- strcpy(lPathAndFile, getenv("TEMP")); >+- strcat(lPathAndFile, "\\tinyfd.txt"); >+- strcat(lDialogString, lPathAndFile); >++ /* dialog.exe needs at least one separator */ >++ if ( ! strchr(lPathAndFile, '/') ) >++ { >++ strcat(lDialogString, "./") ; >++ } >++ strcat(lDialogString, lPathAndFile) ; >++ strcat(lDialogString, "\" 0 60 2>"); >++ strcpy(lPathAndFile, getenv("TEMP")); >++ strcat(lPathAndFile, "\\tinyfd.txt"); >++ strcat(lDialogString, lPathAndFile); >+ >+- /* printf( "lDialogString: %s\n" , lDialogString ) ; */ >+- system( lDialogString ) ; >++ /* printf( "lDialogString: %s\n" , lDialogString ) ; */ >++ system( lDialogString ) ; >+ >+- if (!(lIn = fopen(lPathAndFile, "r"))) >+- { >+- remove(lPathAndFile); >+- return NULL; >+- } >+- while (fgets(aoBuff, MAX_PATH_OR_CMD, lIn) != NULL) >+- {} >+- fclose(lIn); >+- remove(lPathAndFile); >+- replaceChr( aoBuff , '/' , '\\' ) ; >+- /* printf( "aoBuff: %s\n" , aoBuff ) ; */ >+- getLastName(lDialogString,aoBuff); >+- if ( ! strlen(lDialogString) ) >+- { >+- return NULL; >+- } >+- return aoBuff; >++ if (!(lIn = fopen(lPathAndFile, "r"))) >++ { >++ remove(lPathAndFile); >++ return NULL; >++ } >++ while (fgets(aoBuff, MAX_PATH_OR_CMD, lIn) != NULL) >++ {} >++ fclose(lIn); >++ remove(lPathAndFile); >++ replaceChr( aoBuff , '/' , '\\' ) ; >++ /* printf( "aoBuff: %s\n" , aoBuff ) ; */ >++ getLastName(lDialogString,aoBuff); >++ if ( ! strlen(lDialogString) ) >++ { >++ return NULL; >++ } >++ return aoBuff; >+ } >+ >+ >+ static char * openFileDialogWinConsole( >+- char const * aTitle , /* NULL or "" */ >+- char const * aDefaultPathAndFile ) /* NULL or "" */ >++ char const * aTitle , /* NULL or "" */ >++ char const * aDefaultPathAndOrFile ) /* NULL or "" */ >+ { >+- char lFilterPatterns[MAX_PATH_OR_CMD] = ""; >+- char lDialogString[MAX_PATH_OR_CMD] ; >+- FILE * lIn; >++ char lFilterPatterns[MAX_PATH_OR_CMD] = ""; >++ char lDialogString[MAX_PATH_OR_CMD] ; >++ FILE * lIn; >+ >+- static char aoBuff[MAX_PATH_OR_CMD]; >++ static char aoBuff[MAX_PATH_OR_CMD]; >+ >+- strcpy( lDialogString , "dialog " ) ; >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "--title \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\" ") ; >+- } >++ strcpy( lDialogString , "dialog " ) ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "--title \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\" ") ; >++ } >+ >+- strcat(lDialogString, "--backtitle \"") ; >+- strcat(lDialogString, >+- "tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY") ; >+- strcat(lDialogString, "\" ") ; >++ strcat(lDialogString, "--backtitle \"") ; >++ strcat(lDialogString, >++ "tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY") ; >++ strcat(lDialogString, "\" ") ; >+ >+- strcat( lDialogString , "--fselect \"" ) ; >+- if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) ) >+- { >+- /* dialog.exe uses unix separators even on windows */ >+- strcpy(lFilterPatterns, aDefaultPathAndFile); >+- replaceChr( lFilterPatterns , '\\' , '/' ) ; >+- } >++ strcat( lDialogString , "--fselect \"" ) ; >++ if ( aDefaultPathAndOrFile && strlen(aDefaultPathAndOrFile) ) >++ { >++ /* dialog.exe uses unix separators even on windows */ >++ strcpy(lFilterPatterns, aDefaultPathAndOrFile); >++ replaceChr( lFilterPatterns , '\\' , '/' ) ; >++ } >+ >+- /* dialog.exe needs at least one separator */ >+- if ( ! strchr(lFilterPatterns, '/') ) >+- { >+- strcat(lDialogString, "./") ; >+- } >+- strcat(lDialogString, lFilterPatterns) ; >+- strcat(lDialogString, "\" 0 60 2>"); >+- strcpy(lFilterPatterns, getenv("TEMP")); >+- strcat(lFilterPatterns, "\\tinyfd.txt"); >+- strcat(lDialogString, lFilterPatterns); >++ /* dialog.exe needs at least one separator */ >++ if ( ! strchr(lFilterPatterns, '/') ) >++ { >++ strcat(lDialogString, "./") ; >++ } >++ strcat(lDialogString, lFilterPatterns) ; >++ strcat(lDialogString, "\" 0 60 2>"); >++ strcpy(lFilterPatterns, getenv("TEMP")); >++ strcat(lFilterPatterns, "\\tinyfd.txt"); >++ strcat(lDialogString, lFilterPatterns); >+ >+- /* printf( "lDialogString: %s\n" , lDialogString ) ; */ >+- system( lDialogString ) ; >++ /* printf( "lDialogString: %s\n" , lDialogString ) ; */ >++ system( lDialogString ) ; >+ >+- if (!(lIn = fopen(lFilterPatterns, "r"))) >+- { >+- remove(lFilterPatterns); >+- return NULL; >+- } >+- while (fgets(aoBuff, MAX_PATH_OR_CMD, lIn) != NULL) >+- {} >+- fclose(lIn); >+- remove(lFilterPatterns); >+- replaceChr( aoBuff , '/' , '\\' ) ; >+- /* printf( "aoBuff: %s\n" , aoBuff ) ; */ >+- return aoBuff; >++ if (!(lIn = fopen(lFilterPatterns, "r"))) >++ { >++ remove(lFilterPatterns); >++ return NULL; >++ } >++ while (fgets(aoBuff, MAX_PATH_OR_CMD, lIn) != NULL) >++ {} >++ fclose(lIn); >++ remove(lFilterPatterns); >++ replaceChr( aoBuff , '/' , '\\' ) ; >++ /* printf( "aoBuff: %s\n" , aoBuff ) ; */ >++ return aoBuff; >+ } >+ >+ >+ static char * selectFolderDialogWinConsole( >+- char * aoBuff , >+- char const * aTitle , /* NULL or "" */ >+- char const * aDefaultPath ) /* NULL or "" */ >++ char * aoBuff , >++ char const * aTitle , /* NULL or "" */ >++ char const * aDefaultPath ) /* NULL or "" */ >+ { >+- char lDialogString[MAX_PATH_OR_CMD] ; >+- char lString[MAX_PATH_OR_CMD] ; >+- FILE * lIn ; >++ char lDialogString[MAX_PATH_OR_CMD] ; >++ char lString[MAX_PATH_OR_CMD] ; >++ FILE * lIn ; >+ >+- strcpy( lDialogString , "dialog " ) ; >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "--title \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\" ") ; >+- } >++ strcpy( lDialogString , "dialog " ) ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "--title \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\" ") ; >++ } >+ >+- strcat(lDialogString, "--backtitle \"") ; >+- strcat(lDialogString, >+- "tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY") ; >+- strcat(lDialogString, "\" ") ; >++ strcat(lDialogString, "--backtitle \"") ; >++ strcat(lDialogString, >++ "tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY") ; >++ strcat(lDialogString, "\" ") ; >+ >+- strcat( lDialogString , "--dselect \"" ) ; >+- if ( aDefaultPath && strlen(aDefaultPath) ) >+- { >+- /* dialog.exe uses unix separators even on windows */ >+- strcpy(lString, aDefaultPath) ; >+- ensureFinalSlash(lString); >+- replaceChr( lString , '\\' , '/' ) ; >+- strcat(lDialogString, lString) ; >+- } >+- else >+- { >+- /* dialog.exe needs at least one separator */ >+- strcat(lDialogString, "./") ; >+- } >+- strcat(lDialogString, "\" 0 60 2>"); >+- strcpy(lString, getenv("TEMP")); >+- strcat(lString, "\\tinyfd.txt"); >+- strcat(lDialogString, lString); >++ strcat( lDialogString , "--dselect \"" ) ; >++ if ( aDefaultPath && strlen(aDefaultPath) ) >++ { >++ /* dialog.exe uses unix separators even on windows */ >++ strcpy(lString, aDefaultPath) ; >++ ensureFinalSlash(lString); >++ replaceChr( lString , '\\' , '/' ) ; >++ strcat(lDialogString, lString) ; >++ } >++ else >++ { >++ /* dialog.exe needs at least one separator */ >++ strcat(lDialogString, "./") ; >++ } >++ strcat(lDialogString, "\" 0 60 2>"); >++ strcpy(lString, getenv("TEMP")); >++ strcat(lString, "\\tinyfd.txt"); >++ strcat(lDialogString, lString); >+ >+- /* printf( "lDialogString: %s\n" , lDialogString ) ; */ >+- system( lDialogString ) ; >++ /* printf( "lDialogString: %s\n" , lDialogString ) ; */ >++ system( lDialogString ) ; >+ >+- if (!(lIn = fopen(lString, "r"))) >+- { >+- remove(lString); >+- return NULL; >+- } >+- while (fgets(aoBuff, MAX_PATH_OR_CMD, lIn) != NULL) >+- {} >+- fclose(lIn); >+- remove(lString); >+- replaceChr( aoBuff , '/' , '\\' ) ; >+- /* printf( "aoBuff: %s\n" , aoBuff ) ; */ >+- return aoBuff; >++ if (!(lIn = fopen(lString, "r"))) >++ { >++ remove(lString); >++ return NULL; >++ } >++ while (fgets(aoBuff, MAX_PATH_OR_CMD, lIn) != NULL) >++ {} >++ fclose(lIn); >++ remove(lString); >++ replaceChr( aoBuff , '/' , '\\' ) ; >++ /* printf( "aoBuff: %s\n" , aoBuff ) ; */ >++ return aoBuff; >+ } >+ >+ static void writeUtf8( char const * aUtf8String ) >+ { >+- unsigned long lNum; >+- void * lConsoleHandle; >+- wchar_t * lTmpWChar; >++ unsigned long lNum; >++ void * lConsoleHandle; >++ wchar_t * lTmpWChar; >+ >+- lConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); >+- lTmpWChar = tinyfd_utf8to16(aUtf8String); >+- (void)WriteConsoleW(lConsoleHandle, lTmpWChar, (DWORD) wcslen(lTmpWChar), &lNum, NULL); >++ lConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); >++ lTmpWChar = tinyfd_utf8to16(aUtf8String); >++ (void)WriteConsoleW(lConsoleHandle, lTmpWChar, (DWORD) wcslen(lTmpWChar), &lNum, NULL); >+ } >+ >+ >+ int tinyfd_messageBox( >+- char const * aTitle, /* NULL or "" */ >+- char const * aMessage, /* NULL or "" may contain \n and \t */ >+- char const * aDialogType, /* "ok" "okcancel" "yesno" "yesnocancel" */ >+- char const * aIconType, /* "info" "warning" "error" "question" */ >+- int aDefaultButton) /* 0 for cancel/no , 1 for ok/yes , 2 for no in yesnocancel */ >++ char const * aTitle, /* NULL or "" */ >++ char const * aMessage, /* NULL or "" may contain \n and \t */ >++ char const * aDialogType, /* "ok" "okcancel" "yesno" "yesnocancel" */ >++ char const * aIconType, /* "info" "warning" "error" "question" */ >++ int aDefaultButton) /* 0 for cancel/no , 1 for ok/yes , 2 for no in yesnocancel */ >+ { >+- char lChar; >+- UINT lOriginalCP = 0; >+- UINT lOriginalOutputCP = 0; >++ char lChar; >++ UINT lOriginalCP = 0; >++ UINT lOriginalOutputCP = 0; >+ >+- if (tfd_quoteDetected(aTitle)) return tinyfd_messageBox("INVALID TITLE WITH QUOTES", aMessage, aDialogType, aIconType, aDefaultButton); >+- if (tfd_quoteDetected(aMessage)) return tinyfd_messageBox(aTitle, "INVALID MESSAGE WITH QUOTES", aDialogType, aIconType, aDefaultButton); >++ if (tfd_quoteDetected(aTitle)) return tinyfd_messageBox("INVALID TITLE WITH QUOTES", aMessage, aDialogType, aIconType, aDefaultButton); >++ if (tfd_quoteDetected(aMessage)) return tinyfd_messageBox(aTitle, "INVALID MESSAGE WITH QUOTES", aDialogType, aIconType, aDefaultButton); >+ >+- if ((!tinyfd_forceConsole || !(GetConsoleWindow() || dialogPresent())) >+- && (!getenv("SSH_CLIENT") || getenvDISPLAY())) >+- { >+- if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "windows"); return 1; } >+- return messageBoxWinGui(aTitle, aMessage, aDialogType, aIconType, aDefaultButton); >+- } >+- else if (dialogPresent()) >+- { >+- if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "dialog"); return 0; } >+- return messageBoxWinConsole( >+- aTitle, aMessage, aDialogType, aIconType, aDefaultButton); >+- } >+- else >+- { >+- if (!tinyfd_winUtf8) >++ if ((!tinyfd_forceConsole || !(GetConsoleWindow() || dialogPresent())) >++ && (!getenv("SSH_CLIENT") || getenvDISPLAY())) >+ { >+- lOriginalCP = GetConsoleCP(); >+- lOriginalOutputCP = GetConsoleOutputCP(); >+- (void)SetConsoleCP(GetACP()); >+- (void)SetConsoleOutputCP(GetACP()); >++ if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "windows"); return 1; } >++ return messageBoxWinGui(aTitle, aMessage, aDialogType, aIconType, aDefaultButton); >+ } >+- >+- if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "basicinput"); return 0; } >+- if (!gWarningDisplayed && !tinyfd_forceConsole) >++ else if (dialogPresent()) >+ { >+- gWarningDisplayed = 1; >+- printf("\n\n%s\n", gTitle); >+- printf("%s\n\n", tinyfd_needs); >++ if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "dialog"); return 0; } >++ return messageBoxWinConsole( >++ aTitle, aMessage, aDialogType, aIconType, aDefaultButton); >+ } >+- >+- if (aTitle && strlen(aTitle)) >++ else >+ { >+- printf("\n"); >+- if (tinyfd_winUtf8) writeUtf8(aTitle); >+- else printf("%s", aTitle); >+- printf("\n\n"); >+- } >+- if (aDialogType && !strcmp("yesno", aDialogType)) >+- { >+- do >+- { >+- if (aMessage && strlen(aMessage)) >++ if (!tinyfd_winUtf8) >+ { >+- if (tinyfd_winUtf8) writeUtf8(aMessage); >+- else printf("%s", aMessage); >+- printf("\n"); >++ lOriginalCP = GetConsoleCP(); >++ lOriginalOutputCP = GetConsoleOutputCP(); >++ (void)SetConsoleCP(GetACP()); >++ (void)SetConsoleOutputCP(GetACP()); >+ } >+- printf("y/n: "); >+- lChar = (char)tolower(_getch()); >+- printf("\n\n"); >+- } while (lChar != 'y' && lChar != 'n'); >+- if (!tinyfd_winUtf8) { (void)SetConsoleCP(lOriginalCP); (void)SetConsoleOutputCP(lOriginalOutputCP); } >+- return lChar == 'y' ? 1 : 0; >+- } >+- else if (aDialogType && !strcmp("okcancel", aDialogType)) >+- { >+- do >+- { >+- if (aMessage && strlen(aMessage)) >++ >++ if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "basicinput"); return 0; } >++ if (!gWarningDisplayed && !tinyfd_forceConsole) >+ { >+- if (tinyfd_winUtf8) writeUtf8(aMessage); >+- else printf("%s", aMessage); >+- printf("\n"); >++ gWarningDisplayed = 1; >++ printf("\n\n%s\n", gTitle); >++ printf("%s\n\n", tinyfd_needs); >+ } >+- printf("[O]kay/[C]ancel: "); >+- lChar = (char)tolower(_getch()); >+- printf("\n\n"); >+- } while (lChar != 'o' && lChar != 'c'); >+- if (!tinyfd_winUtf8) { (void)SetConsoleCP(lOriginalCP); (void)SetConsoleOutputCP(lOriginalOutputCP); } >+- return lChar == 'o' ? 1 : 0; >+- } >+- else if (aDialogType && !strcmp("yesnocancel", aDialogType)) >+- { >+- do >+- { >+- if (aMessage && strlen(aMessage)) >++ >++ if (aTitle && strlen(aTitle)) >+ { >+- if (tinyfd_winUtf8) writeUtf8(aMessage); >+- else printf("%s", aMessage); >+- printf("\n"); >++ printf("\n"); >++ if (tinyfd_winUtf8) writeUtf8(aTitle); >++ else printf("%s", aTitle); >++ printf("\n\n"); >+ } >+- printf("[Y]es/[N]o/[C]ancel: "); >+- lChar = (char)tolower(_getch()); >+- printf("\n\n"); >+- } while (lChar != 'y' && lChar != 'n' && lChar != 'c'); >+- if (!tinyfd_winUtf8) { (void)SetConsoleCP(lOriginalCP); (void)SetConsoleOutputCP(lOriginalOutputCP); } >+- return (lChar == 'y') ? 1 : (lChar == 'n') ? 2 : 0; >++ if (aDialogType && !strcmp("yesno", aDialogType)) >++ { >++ do >++ { >++ if (aMessage && strlen(aMessage)) >++ { >++ if (tinyfd_winUtf8) writeUtf8(aMessage); >++ else printf("%s", aMessage); >++ printf("\n"); >++ } >++ printf("y/n: "); >++ lChar = (char)tolower(_getch()); >++ printf("\n\n"); >++ } while (lChar != 'y' && lChar != 'n'); >++ if (!tinyfd_winUtf8) { (void)SetConsoleCP(lOriginalCP); (void)SetConsoleOutputCP(lOriginalOutputCP); } >++ return lChar == 'y' ? 1 : 0; >++ } >++ else if (aDialogType && !strcmp("okcancel", aDialogType)) >++ { >++ do >++ { >++ if (aMessage && strlen(aMessage)) >++ { >++ if (tinyfd_winUtf8) writeUtf8(aMessage); >++ else printf("%s", aMessage); >++ printf("\n"); >++ } >++ printf("[O]kay/[C]ancel: "); >++ lChar = (char)tolower(_getch()); >++ printf("\n\n"); >++ } while (lChar != 'o' && lChar != 'c'); >++ if (!tinyfd_winUtf8) { (void)SetConsoleCP(lOriginalCP); (void)SetConsoleOutputCP(lOriginalOutputCP); } >++ return lChar == 'o' ? 1 : 0; >++ } >++ else if (aDialogType && !strcmp("yesnocancel", aDialogType)) >++ { >++ do >++ { >++ if (aMessage && strlen(aMessage)) >++ { >++ if (tinyfd_winUtf8) writeUtf8(aMessage); >++ else printf("%s", aMessage); >++ printf("\n"); >++ } >++ printf("[Y]es/[N]o/[C]ancel: "); >++ lChar = (char)tolower(_getch()); >++ printf("\n\n"); >++ } while (lChar != 'y' && lChar != 'n' && lChar != 'c'); >++ if (!tinyfd_winUtf8) { (void)SetConsoleCP(lOriginalCP); (void)SetConsoleOutputCP(lOriginalOutputCP); } >++ return (lChar == 'y') ? 1 : (lChar == 'n') ? 2 : 0; >++ } >++ else >++ { >++ if (aMessage && strlen(aMessage)) >++ { >++ if (tinyfd_winUtf8) writeUtf8(aMessage); >++ else printf("%s", aMessage); >++ printf("\n\n"); >++ } >++ printf("press enter to continue "); >++ lChar = (char)_getch(); >++ printf("\n\n"); >++ if (!tinyfd_winUtf8) { (void)SetConsoleCP(lOriginalCP); (void)SetConsoleOutputCP(lOriginalOutputCP); } >++ return 1; >++ } >+ } >+- else >+- { >+- if (aMessage && strlen(aMessage)) >+- { >+- if (tinyfd_winUtf8) writeUtf8(aMessage); >+- else printf("%s", aMessage); >+- printf("\n\n"); >+- } >+- printf("press enter to continue "); >+- lChar = (char)_getch(); >+- printf("\n\n"); >+- if (!tinyfd_winUtf8) { (void)SetConsoleCP(lOriginalCP); (void)SetConsoleOutputCP(lOriginalOutputCP); } >+- return 1; >+- } >+- } >+ } >+ >+ >+ /* return has only meaning for tinyfd_query */ >+ int tinyfd_notifyPopup( >+- char const * aTitle, /* NULL or "" */ >+- char const * aMessage , /* NULL or "" may contain \n \t */ >+- char const * aIconType ) /* "info" "warning" "error" */ >++ char const * aTitle, /* NULL or "" */ >++ char const * aMessage , /* NULL or "" may contain \n \t */ >++ char const * aIconType ) /* "info" "warning" "error" */ >+ { >+- if (tfd_quoteDetected(aTitle)) return tinyfd_notifyPopup("INVALID TITLE WITH QUOTES", aMessage, aIconType); >+- if (tfd_quoteDetected(aMessage)) return tinyfd_notifyPopup(aTitle, "INVALID MESSAGE WITH QUOTES", aIconType); >++ if (tfd_quoteDetected(aTitle)) return tinyfd_notifyPopup("INVALID TITLE WITH QUOTES", aMessage, aIconType); >++ if (tfd_quoteDetected(aMessage)) return tinyfd_notifyPopup(aTitle, "INVALID MESSAGE WITH QUOTES", aIconType); >+ >+- if ( powershellPresent() && (!tinyfd_forceConsole || !( >+- GetConsoleWindow() || >+- dialogPresent())) >+- && (!getenv("SSH_CLIENT") || getenvDISPLAY())) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"windows");return 1;} >+- return notifyWinGui(aTitle, aMessage, aIconType); >+- } >+- else >+- return tinyfd_messageBox(aTitle, aMessage, "ok" , aIconType, 0); >++ if ( powershellPresent() && (!tinyfd_forceConsole || !( >++ GetConsoleWindow() || >++ dialogPresent())) >++ && (!getenv("SSH_CLIENT") || getenvDISPLAY())) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"windows");return 1;} >++ return notifyWinGui(aTitle, aMessage, aIconType); >++ } >++ else >++ return tinyfd_messageBox(aTitle, aMessage, "ok" , aIconType, 0); >+ } >+ >+ >+ /* returns NULL on cancel */ >+ char * tinyfd_inputBox( >+- char const * aTitle , /* NULL or "" */ >+- char const * aMessage , /* NULL or "" (\n and \t have no effect) */ >+- char const * aDefaultInput ) /* "" , if NULL it's a passwordBox */ >++ char const * aTitle , /* NULL or "" */ >++ char const * aMessage , /* NULL or "" (\n and \t have no effect) */ >++ char const * aDefaultInput ) /* "" , if NULL it's a passwordBox */ >+ { >+- static char lBuff[MAX_PATH_OR_CMD] = ""; >+- char * lEOF; >++ static char lBuff[MAX_PATH_OR_CMD] = ""; >++ char * lEOF; >+ >+- DWORD mode = 0; >+- HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); >++ DWORD mode = 0; >++ HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); >+ >+- unsigned long lNum; >+- void * lConsoleHandle; >+- char * lTmpChar; >+- wchar_t lBuffW[1024]; >++ unsigned long lNum; >++ void * lConsoleHandle; >++ char * lTmpChar; >++ wchar_t lBuffW[1024]; >+ >+- UINT lOriginalCP = 0; >+- UINT lOriginalOutputCP = 0; >++ UINT lOriginalCP = 0; >++ UINT lOriginalOutputCP = 0; >+ >+- if (!aTitle && !aMessage && !aDefaultInput) return lBuff; /* now I can fill lBuff from outside */ >++ if (!aTitle && !aMessage && !aDefaultInput) return lBuff; /* now I can fill lBuff from outside */ >+ >+- if (tfd_quoteDetected(aTitle)) return tinyfd_inputBox("INVALID TITLE WITH QUOTES", aMessage, aDefaultInput); >+- if (tfd_quoteDetected(aMessage)) return tinyfd_inputBox(aTitle, "INVALID MESSAGE WITH QUOTES", aDefaultInput); >+- if (tfd_quoteDetected(aDefaultInput)) return tinyfd_inputBox(aTitle, aMessage, "INVALID DEFAULT_INPUT WITH QUOTES"); >++ if (tfd_quoteDetected(aTitle)) return tinyfd_inputBox("INVALID TITLE WITH QUOTES", aMessage, aDefaultInput); >++ if (tfd_quoteDetected(aMessage)) return tinyfd_inputBox(aTitle, "INVALID MESSAGE WITH QUOTES", aDefaultInput); >++ if (tfd_quoteDetected(aDefaultInput)) return tinyfd_inputBox(aTitle, aMessage, "INVALID DEFAULT_INPUT WITH QUOTES: use the GRAVE ACCENT \\x60 instead."); >+ >+- mode = 0; >+- hStdin = GetStdHandle(STD_INPUT_HANDLE); >++ mode = 0; >++ hStdin = GetStdHandle(STD_INPUT_HANDLE); >+ >+- if ((!tinyfd_forceConsole || !( >+- GetConsoleWindow() || >+- dialogPresent())) >+- && (!getenv("SSH_CLIENT") || getenvDISPLAY())) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"windows");return (char *)1;} >+- lBuff[0]='\0'; >+- if (inputBoxWinGui(lBuff, aTitle, aMessage, aDefaultInput)) return lBuff; >+- else return NULL; >+- } >+- else if ( dialogPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"dialog");return (char *)0;} >+- lBuff[0]='\0'; >+- if (inputBoxWinConsole(lBuff, aTitle, aMessage, aDefaultInput) ) return lBuff; >+- else return NULL; >+- } >+- else >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"basicinput");return (char *)0;} >+- lBuff[0]='\0'; >+- if (!gWarningDisplayed && !tinyfd_forceConsole) >+- { >+- gWarningDisplayed = 1 ; >+- printf("\n\n%s\n", gTitle); >+- printf("%s\n\n", tinyfd_needs); >+- } >++ if ((!tinyfd_forceConsole || !( >++ GetConsoleWindow() || >++ dialogPresent())) >++ && (!getenv("SSH_CLIENT") || getenvDISPLAY())) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"windows");return (char *)1;} >++ lBuff[0]='\0'; >++ if (inputBoxWinGui(lBuff, aTitle, aMessage, aDefaultInput)) return lBuff; >++ else return NULL; >++ } >++ else if ( dialogPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"dialog");return (char *)0;} >++ lBuff[0]='\0'; >++ if (inputBoxWinConsole(lBuff, aTitle, aMessage, aDefaultInput) ) return lBuff; >++ else return NULL; >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"basicinput");return (char *)0;} >++ lBuff[0]='\0'; >++ if (!gWarningDisplayed && !tinyfd_forceConsole) >++ { >++ gWarningDisplayed = 1 ; >++ printf("\n\n%s\n", gTitle); >++ printf("%s\n\n", tinyfd_needs); >++ } >+ >+ if (!tinyfd_winUtf8) >+ { >+- lOriginalCP = GetConsoleCP(); >+- lOriginalOutputCP = GetConsoleOutputCP(); >+- (void)SetConsoleCP(GetACP()); >+- (void)SetConsoleOutputCP(GetACP()); >++ lOriginalCP = GetConsoleCP(); >++ lOriginalOutputCP = GetConsoleOutputCP(); >++ (void)SetConsoleCP(GetACP()); >++ (void)SetConsoleOutputCP(GetACP()); >+ } >+ >+ if (aTitle && strlen(aTitle)) >+- { >+- printf("\n"); >+- if (tinyfd_winUtf8) writeUtf8(aTitle); >+- else printf("%s", aTitle); >+- printf("\n\n"); >+- } >+- if ( aMessage && strlen(aMessage) ) >+- { >+- if (tinyfd_winUtf8) writeUtf8(aMessage); >+- else printf("%s", aMessage); >+- printf("\n"); >+- } >+- printf("(ctrl-Z + enter to cancel): "); >+- if ( ! aDefaultInput ) >+- { >+- (void) GetConsoleMode(hStdin, &mode); >+- (void) SetConsoleMode(hStdin, mode & (~ENABLE_ECHO_INPUT)); >+- } >+- if (tinyfd_winUtf8) >+ { >+- lConsoleHandle = GetStdHandle(STD_INPUT_HANDLE); >+- (void) ReadConsoleW(lConsoleHandle, lBuffW, MAX_PATH_OR_CMD, &lNum, NULL); >+- if (!aDefaultInput) >+- { >+- (void)SetConsoleMode(hStdin, mode); >+- printf("\n"); >+- } >+- lBuffW[lNum] = '\0'; >+- if (lBuffW[wcslen(lBuffW) - 1] == '\n') lBuffW[wcslen(lBuffW) - 1] = '\0'; >+- if (lBuffW[wcslen(lBuffW) - 1] == '\r') lBuffW[wcslen(lBuffW) - 1] = '\0'; >+- lTmpChar = tinyfd_utf16to8(lBuffW); >+- if (lTmpChar) >+- { >+- strcpy(lBuff, lTmpChar); >+- return lBuff; >+- } >+- else >+- return NULL; >++ printf("\n"); >++ if (tinyfd_winUtf8) writeUtf8(aTitle); >++ else printf("%s", aTitle); >++ printf("\n\n"); >++ } >++ if ( aMessage && strlen(aMessage) ) >++ { >++ if (tinyfd_winUtf8) writeUtf8(aMessage); >++ else printf("%s", aMessage); >++ printf("\n"); >+ } >+- else >++ printf("(ctrl-Z + enter to cancel): "); >++ if ( ! aDefaultInput ) >+ { >+- lEOF = fgets(lBuff, MAX_PATH_OR_CMD, stdin); >+- if (!aDefaultInput) >++ (void) GetConsoleMode(hStdin, &mode); >++ (void) SetConsoleMode(hStdin, mode & (~ENABLE_ECHO_INPUT)); >++ } >++ if (tinyfd_winUtf8) >+ { >+- (void)SetConsoleMode(hStdin, mode); >+- printf("\n"); >++ lConsoleHandle = GetStdHandle(STD_INPUT_HANDLE); >++ (void) ReadConsoleW(lConsoleHandle, lBuffW, MAX_PATH_OR_CMD, &lNum, NULL); >++ if (!aDefaultInput) >++ { >++ (void)SetConsoleMode(hStdin, mode); >++ printf("\n"); >++ } >++ lBuffW[lNum] = '\0'; >++ if (lBuffW[wcslen(lBuffW) - 1] == '\n') lBuffW[wcslen(lBuffW) - 1] = '\0'; >++ if (lBuffW[wcslen(lBuffW) - 1] == '\r') lBuffW[wcslen(lBuffW) - 1] = '\0'; >++ lTmpChar = tinyfd_utf16to8(lBuffW); >++ if (lTmpChar) >++ { >++ strcpy(lBuff, lTmpChar); >++ return lBuff; >++ } >++ else >++ return NULL; >+ } >+- >+- if (!tinyfd_winUtf8) >++ else >+ { >+- (void)SetConsoleCP(lOriginalCP); >+- (void)SetConsoleOutputCP(lOriginalOutputCP); >+- } >++ lEOF = fgets(lBuff, MAX_PATH_OR_CMD, stdin); >++ if (!aDefaultInput) >++ { >++ (void)SetConsoleMode(hStdin, mode); >++ printf("\n"); >++ } >+ >+- if (!lEOF) >+- { >+- return NULL; >+- } >+- printf("\n"); >+- if (strchr(lBuff, 27)) >+- { >+- return NULL; >+- } >+- if (lBuff[strlen(lBuff) - 1] == '\n') >+- { >+- lBuff[strlen(lBuff) - 1] = '\0'; >+- } >+- return lBuff; >++ if (!tinyfd_winUtf8) >++ { >++ (void)SetConsoleCP(lOriginalCP); >++ (void)SetConsoleOutputCP(lOriginalOutputCP); >++ } >++ >++ if (!lEOF) >++ { >++ return NULL; >++ } >++ printf("\n"); >++ if (strchr(lBuff, 27)) >++ { >++ return NULL; >++ } >++ if (lBuff[strlen(lBuff) - 1] == '\n') >++ { >++ lBuff[strlen(lBuff) - 1] = '\0'; >++ } >++ return lBuff; >++ } >+ } >+- } >+ } >+ >+ >+ char * tinyfd_saveFileDialog( >+- char const * aTitle , /* NULL or "" */ >+- char const * aDefaultPathAndFile , /* NULL or "" */ >+- int aNumOfFilterPatterns , /* 0 */ >+- char const * const * aFilterPatterns , /* NULL or {"*.jpg","*.png"} */ >+- char const * aSingleFilterDescription ) /* NULL or "image files" */ >++ char const * aTitle , /* NULL or "" */ >++ char const * aDefaultPathAndOrFile , /* NULL or "" */ >++ int aNumOfFilterPatterns , /* 0 */ >++ char const * const * aFilterPatterns , /* NULL or {"*.jpg","*.png"} */ >++ char const * aSingleFilterDescription ) /* NULL or "image files" */ >+ { >+- static char lBuff[MAX_PATH_OR_CMD] ; >+- char lString[MAX_PATH_OR_CMD] ; >+- char * p ; >+- char * lPointerInputBox; >+- int i; >++ static char lBuff[MAX_PATH_OR_CMD] ; >++ char lString[MAX_PATH_OR_CMD] ; >++ char * p ; >++ char * lPointerInputBox; >++ int i; >+ >+- lBuff[0]='\0'; >++ lBuff[0]='\0'; >+ >+- if (tfd_quoteDetected(aTitle)) return tinyfd_saveFileDialog("INVALID TITLE WITH QUOTES", aDefaultPathAndFile, aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription); >+- if (tfd_quoteDetected(aDefaultPathAndFile)) return tinyfd_saveFileDialog(aTitle, "INVALID DEFAULT_PATH WITH QUOTES", aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription); >+- if (tfd_quoteDetected(aSingleFilterDescription)) return tinyfd_saveFileDialog(aTitle, aDefaultPathAndFile, aNumOfFilterPatterns, aFilterPatterns, "INVALID FILTER_DESCRIPTION WITH QUOTES"); >+- for (i = 0; i < aNumOfFilterPatterns; i++) >++ if ( ! aFilterPatterns ) aNumOfFilterPatterns = 0 ; >++ if (tfd_quoteDetected(aTitle)) return tinyfd_saveFileDialog("INVALID TITLE WITH QUOTES", aDefaultPathAndOrFile, aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription); >++ if (tfd_quoteDetected(aDefaultPathAndOrFile)) return tinyfd_saveFileDialog(aTitle, "INVALID DEFAULT_PATH WITH QUOTES", aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription); >++ if (tfd_quoteDetected(aSingleFilterDescription)) return tinyfd_saveFileDialog(aTitle, aDefaultPathAndOrFile, aNumOfFilterPatterns, aFilterPatterns, "INVALID FILTER_DESCRIPTION WITH QUOTES"); >++ for (i = 0; i < aNumOfFilterPatterns; i++) >++ { >++ if (tfd_quoteDetected(aFilterPatterns[i])) return tinyfd_saveFileDialog("INVALID FILTER_PATTERN WITH QUOTES: use the GRAVE ACCENT \\x60 instead.", aDefaultPathAndOrFile, 0, NULL, NULL); >++ } >++ >++ >++ if ( ( !tinyfd_forceConsole || !( GetConsoleWindow() || dialogPresent() ) ) >++ && (!getenv("SSH_CLIENT") || getenvDISPLAY())) >+ { >+- if (tfd_quoteDetected(aFilterPatterns[i])) return tinyfd_saveFileDialog("INVALID FILTER_PATTERN WITH QUOTES", aDefaultPathAndFile, 0, NULL, NULL); >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"windows");return (char *)1;} >++ p = saveFileDialogWinGui(lBuff, >++ aTitle, aDefaultPathAndOrFile, aNumOfFilterPatterns, (char const * const *)aFilterPatterns, aSingleFilterDescription); >+ } >++ else if (dialogPresent()) >++ { >++ if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "dialog"); return (char *)0; } >++ p = saveFileDialogWinConsole(lBuff, aTitle, aDefaultPathAndOrFile); >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "basicinput"); return (char *)0; } >++ strcpy(lBuff, "Save file in "); >++ strcat(lBuff, getCurDir()); >+ >++ lPointerInputBox = tinyfd_inputBox(NULL,NULL,NULL); /* obtain a pointer on the current content of tinyfd_inputBox */ >++ if (lPointerInputBox) strcpy(lString, lPointerInputBox); /* preserve the current content of tinyfd_inputBox */ >++ p = tinyfd_inputBox(aTitle, lBuff, ""); >++ if (p) strcpy(lBuff, p); else lBuff[0] = '\0'; >++ if (lPointerInputBox) strcpy(lPointerInputBox, lString); /* restore its previous content to tinyfd_inputBox */ >++ p = lBuff; >++ } >+ >+- if ( ( !tinyfd_forceConsole || !( GetConsoleWindow() || dialogPresent() ) ) >+- && (!getenv("SSH_CLIENT") || getenvDISPLAY())) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"windows");return (char *)1;} >+- p = saveFileDialogWinGui(lBuff, >+- aTitle, aDefaultPathAndFile, aNumOfFilterPatterns, (char const * const *)aFilterPatterns, aSingleFilterDescription); >+- } >+- else if (dialogPresent()) >++ if ( ! p || ! strlen( p ) ) >+ { >+- if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "dialog"); return (char *)0; } >+- p = saveFileDialogWinConsole(lBuff, aTitle, aDefaultPathAndFile); >++ return NULL; >+ } >+- else >++ getPathWithoutFinalSlash( lString , p ) ; >++ if ( strlen( lString ) && ! dirExists( lString ) ) >+ { >+- if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "basicinput"); return (char *)0; } >+- strcpy(lBuff, "Save file in "); >+- strcat(lBuff, getCurDir()); >+- >+- lPointerInputBox = tinyfd_inputBox(NULL,NULL,NULL); /* obtain a pointer on the current content of tinyfd_inputBox */ >+- if (lPointerInputBox) strcpy(lString, lPointerInputBox); /* preserve the current content of tinyfd_inputBox */ >+- p = tinyfd_inputBox(aTitle, lBuff, ""); >+- if (p) strcpy(lBuff, p); else lBuff[0] = '\0'; >+- if (lPointerInputBox) strcpy(lPointerInputBox, lString); /* restore its previous content to tinyfd_inputBox */ >+- p = lBuff; >++ return NULL ; >+ } >+- >+- if ( ! p || ! strlen( p ) ) >+- { >+- return NULL; >+- } >+- getPathWithoutFinalSlash( lString , p ) ; >+- if ( strlen( lString ) && ! dirExists( lString ) ) >+- { >+- return NULL ; >+- } >+- getLastName(lString,p); >+- if ( ! filenameValid(lString) ) >+- { >+- return NULL; >+- } >+- return p ; >++ getLastName(lString,p); >++ if ( ! filenameValid(lString) ) >++ { >++ return NULL; >++ } >++ return p ; >+ } >+ >+ >+ /* in case of multiple files, the separator is | */ >+ char * tinyfd_openFileDialog( >+- char const * aTitle , /* NULL or "" */ >+- char const * aDefaultPathAndFile, /* NULL or "" */ >+- int aNumOfFilterPatterns , /* 0 */ >+- char const * const * aFilterPatterns, /* NULL or {"*.jpg","*.png"} */ >+- char const * aSingleFilterDescription, /* NULL or "image files" */ >+- int aAllowMultipleSelects ) /* 0 or 1 */ >++ char const * aTitle , /* NULL or "" */ >++ char const * aDefaultPathAndOrFile, /* NULL or "" */ >++ int aNumOfFilterPatterns , /* 0 */ >++ char const * const * aFilterPatterns, /* NULL or {"*.jpg","*.png"} */ >++ char const * aSingleFilterDescription, /* NULL or "image files" */ >++ int aAllowMultipleSelects ) /* 0 or 1 */ >+ { >++ static char lBuff[MAX_PATH_OR_CMD]; >+ char lString[MAX_PATH_OR_CMD]; >+- char lBuff[MAX_PATH_OR_CMD]; >+- char * p; >+- char * lPointerInputBox; >+- int i; >++ char * p; >++ char * lPointerInputBox; >++ int i; >+ >+- if (tfd_quoteDetected(aTitle)) return tinyfd_openFileDialog("INVALID TITLE WITH QUOTES", aDefaultPathAndFile, aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription, aAllowMultipleSelects); >+- if (tfd_quoteDetected(aDefaultPathAndFile)) return tinyfd_openFileDialog(aTitle, "INVALID DEFAULT_PATH WITH QUOTES", aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription, aAllowMultipleSelects); >+- if (tfd_quoteDetected(aSingleFilterDescription)) return tinyfd_openFileDialog(aTitle, aDefaultPathAndFile, aNumOfFilterPatterns, aFilterPatterns, "INVALID FILTER_DESCRIPTION WITH QUOTES", aAllowMultipleSelects); >+- for (i = 0; i < aNumOfFilterPatterns; i++) >+- { >+- if (tfd_quoteDetected(aFilterPatterns[i])) return tinyfd_openFileDialog("INVALID FILTER_PATTERN WITH QUOTES", aDefaultPathAndFile, 0, NULL, NULL, aAllowMultipleSelects); >+- } >+- >+- if ( ( !tinyfd_forceConsole || !( GetConsoleWindow() || dialogPresent() ) ) >+- && (!getenv("SSH_CLIENT") || getenvDISPLAY())) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"windows");return (char *)1;} >+- p = openFileDialogWinGui( aTitle, aDefaultPathAndFile, aNumOfFilterPatterns, >+- (char const * const *)aFilterPatterns, aSingleFilterDescription, aAllowMultipleSelects); >+- } >+- else if (dialogPresent()) >++ if ( ! aFilterPatterns ) aNumOfFilterPatterns = 0 ; >++ if (tfd_quoteDetected(aTitle)) return tinyfd_openFileDialog("INVALID TITLE WITH QUOTES", aDefaultPathAndOrFile, aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription, aAllowMultipleSelects); >++ if (tfd_quoteDetected(aDefaultPathAndOrFile)) return tinyfd_openFileDialog(aTitle, "INVALID DEFAULT_PATH WITH QUOTES", aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription, aAllowMultipleSelects); >++ if (tfd_quoteDetected(aSingleFilterDescription)) return tinyfd_openFileDialog(aTitle, aDefaultPathAndOrFile, aNumOfFilterPatterns, aFilterPatterns, "INVALID FILTER_DESCRIPTION WITH QUOTES", aAllowMultipleSelects); >++ for (i = 0; i < aNumOfFilterPatterns; i++) >+ { >+- if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "dialog"); return (char *)0; } >+- p = openFileDialogWinConsole(aTitle, aDefaultPathAndFile); >++ if (tfd_quoteDetected(aFilterPatterns[i])) return tinyfd_openFileDialog("INVALID FILTER_PATTERN WITH QUOTES: use the GRAVE ACCENT \\x60 instead.", aDefaultPathAndOrFile, 0, NULL, NULL, aAllowMultipleSelects); >+ } >+- else >++ >++ if ( ( !tinyfd_forceConsole || !( GetConsoleWindow() || dialogPresent() ) ) >++ && (!getenv("SSH_CLIENT") || getenvDISPLAY())) >+ { >+- if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "basicinput"); return (char *)0; } >+- strcpy(lBuff, "Open file from "); >+- strcat(lBuff, getCurDir()); >+- lPointerInputBox = tinyfd_inputBox(NULL, NULL, NULL); /* obtain a pointer on the current content of tinyfd_inputBox */ >+- if (lPointerInputBox) strcpy(lString, lPointerInputBox); /* preserve the current content of tinyfd_inputBox */ >+- p = tinyfd_inputBox(aTitle, lBuff, ""); >+- if (p) strcpy(lBuff, p); else lBuff[0] = '\0'; >+- if (lPointerInputBox) strcpy(lPointerInputBox, lString); /* restore its previous content to tinyfd_inputBox */ >+- p = lBuff; >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"windows");return (char *)1;} >++ p = openFileDialogWinGui( aTitle, aDefaultPathAndOrFile, aNumOfFilterPatterns, >++ (char const * const *)aFilterPatterns, aSingleFilterDescription, aAllowMultipleSelects); >+ } >++ else if (dialogPresent()) >++ { >++ if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "dialog"); return (char *)0; } >++ p = openFileDialogWinConsole(aTitle, aDefaultPathAndOrFile); >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "basicinput"); return (char *)0; } >++ strcpy(lBuff, "Open file from "); >++ strcat(lBuff, getCurDir()); >++ lPointerInputBox = tinyfd_inputBox(NULL, NULL, NULL); /* obtain a pointer on the current content of tinyfd_inputBox */ >++ if (lPointerInputBox) strcpy(lString, lPointerInputBox); /* preserve the current content of tinyfd_inputBox */ >++ p = tinyfd_inputBox(aTitle, lBuff, ""); >++ if (p) strcpy(lBuff, p); else lBuff[0] = '\0'; >++ if (lPointerInputBox) strcpy(lPointerInputBox, lString); /* restore its previous content to tinyfd_inputBox */ >++ p = lBuff; >++ } >+ >+- if ( ! p || ! strlen( p ) ) >+- { >+- return NULL; >+- } >+- if ( aAllowMultipleSelects && strchr(p, '|') ) >+- { >+- p = ensureFilesExist( (char *) p , p ) ; >+- } >+- else if ( ! fileExists(p) ) >+- { >+- return NULL ; >+- } >+- /* printf( "lBuff3: %s\n" , p ) ; */ >+- return p ; >++ if ( ! p || ! strlen( p ) ) >++ { >++ return NULL; >++ } >++ if ( aAllowMultipleSelects && strchr(p, '|') ) >++ { >++ p = ensureFilesExist( (char *) p , p ) ; >++ } >++ else if ( ! fileExists(p) ) >++ { >++ return NULL ; >++ } >++ /* printf( "lBuff3: %s\n" , p ) ; */ >++ return p ; >+ } >+ >+ >+ char * tinyfd_selectFolderDialog( >+- char const * aTitle , /* NULL or "" */ >+- char const * aDefaultPath ) /* NULL or "" */ >++ char const * aTitle , /* NULL or "" */ >++ char const * aDefaultPath ) /* NULL or "" */ >+ { >+- static char lBuff[MAX_PATH_OR_CMD]; >+- char * p; >+- char * lPointerInputBox; >+- char lString[MAX_PATH_OR_CMD]; >++ static char lBuff[MAX_PATH_OR_CMD]; >++ char * p; >++ char * lPointerInputBox; >++ char lString[MAX_PATH_OR_CMD]; >+ >+- if (tfd_quoteDetected(aTitle)) return tinyfd_selectFolderDialog("INVALID TITLE WITH QUOTES", aDefaultPath); >+- if (tfd_quoteDetected(aDefaultPath)) return tinyfd_selectFolderDialog(aTitle, "INVALID DEFAULT_PATH WITH QUOTES"); >++ if (tfd_quoteDetected(aTitle)) return tinyfd_selectFolderDialog("INVALID TITLE WITH QUOTES", aDefaultPath); >++ if (tfd_quoteDetected(aDefaultPath)) return tinyfd_selectFolderDialog(aTitle, "INVALID DEFAULT_PATH WITH QUOTES"); >+ >+- if ( ( !tinyfd_forceConsole || !( GetConsoleWindow() || dialogPresent() ) ) >+- && (!getenv("SSH_CLIENT") || getenvDISPLAY())) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"windows");return (char *)1;} >+- p = selectFolderDialogWinGui(lBuff, aTitle, aDefaultPath); >+- } >+- else >+- if (dialogPresent()) >++ if ( ( !tinyfd_forceConsole || !( GetConsoleWindow() || dialogPresent() ) ) >++ && (!getenv("SSH_CLIENT") || getenvDISPLAY())) >+ { >+- if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "dialog"); return (char *)0; } >+- p = selectFolderDialogWinConsole(lBuff, aTitle, aDefaultPath); >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"windows");return (char *)1;} >++ p = selectFolderDialogWinGui(lBuff, aTitle, aDefaultPath); >+ } >+- else >++ else >++ if (dialogPresent()) >++ { >++ if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "dialog"); return (char *)0; } >++ p = selectFolderDialogWinConsole(lBuff, aTitle, aDefaultPath); >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "basicinput"); return (char *)0; } >++ strcpy(lBuff, "Select folder from "); >++ strcat(lBuff, getCurDir()); >++ lPointerInputBox = tinyfd_inputBox(NULL, NULL, NULL); /* obtain a pointer on the current content of tinyfd_inputBox */ >++ if (lPointerInputBox) strcpy(lString, lPointerInputBox); /* preserve the current content of tinyfd_inputBox */ >++ p = tinyfd_inputBox(aTitle, lBuff, ""); >++ if (p) strcpy(lBuff, p); else lBuff[0] = '\0'; >++ if (lPointerInputBox) strcpy(lPointerInputBox, lString); /* restore its previous content to tinyfd_inputBox */ >++ p = lBuff; >++ } >++ >++ if ( ! p || ! strlen( p ) || ! dirExists( p ) ) >+ { >+- if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "basicinput"); return (char *)0; } >+- strcpy(lBuff, "Select folder from "); >+- strcat(lBuff, getCurDir()); >+- lPointerInputBox = tinyfd_inputBox(NULL, NULL, NULL); /* obtain a pointer on the current content of tinyfd_inputBox */ >+- if (lPointerInputBox) strcpy(lString, lPointerInputBox); /* preserve the current content of tinyfd_inputBox */ >+- p = tinyfd_inputBox(aTitle, lBuff, ""); >+- if (p) strcpy(lBuff, p); else lBuff[0] = '\0'; >+- if (lPointerInputBox) strcpy(lPointerInputBox, lString); /* restore its previous content to tinyfd_inputBox */ >+- p = lBuff; >++ return NULL ; >+ } >+- >+- if ( ! p || ! strlen( p ) || ! dirExists( p ) ) >+- { >+- return NULL ; >+- } >+- return p ; >++ return p ; >+ } >+ >+ >++/* aDefaultRGB is used only if aDefaultHexRGB is absent */ >++/* aDefaultRGB and aoResultRGB can be the same array */ >++/* returns NULL on cancel */ >+ /* returns the hexcolor as a string "#FF0000" */ >+ /* aoResultRGB also contains the result */ >+-/* aDefaultRGB is used only if aDefaultHexRGB is NULL */ >+-/* aDefaultRGB and aoResultRGB can be the same array */ >+ char * tinyfd_colorChooser( >+- char const * aTitle, /* NULL or "" */ >+- char const * aDefaultHexRGB, /* NULL or "#FF0000"*/ >+- unsigned char const aDefaultRGB[3], /* { 0 , 255 , 255 } */ >+- unsigned char aoResultRGB[3]) /* { 0 , 0 , 0 } */ >++ char const * aTitle, /* NULL or "" */ >++ char const * aDefaultHexRGB, /* NULL or "" or "#FF0000"*/ >++ unsigned char const aDefaultRGB[3], /* { 0 , 255 , 255 } */ >++ unsigned char aoResultRGB[3]) /* { 0 , 0 , 0 } */ >+ { >+- static char lDefaultHexRGB[16]; >+- int i; >+- char * p ; >+- char * lPointerInputBox; >+- char lString[MAX_PATH_OR_CMD]; >++ static char lDefaultHexRGB[16]; >++ int i; >++ char * p ; >++ char * lPointerInputBox; >++ char lString[MAX_PATH_OR_CMD]; >+ >+- lDefaultHexRGB[0] = '\0'; >++ lDefaultHexRGB[0] = '\0'; >+ >+- if (tfd_quoteDetected(aTitle)) return tinyfd_colorChooser("INVALID TITLE WITH QUOTES", aDefaultHexRGB, aDefaultRGB, aoResultRGB); >+- if (tfd_quoteDetected(aDefaultHexRGB)) return tinyfd_colorChooser(aTitle, "INVALID DEFAULT_HEX_RGB WITH QUOTES", aDefaultRGB, aoResultRGB); >++ if (tfd_quoteDetected(aTitle)) return tinyfd_colorChooser("INVALID TITLE WITH QUOTES", aDefaultHexRGB, aDefaultRGB, aoResultRGB); >++ if (tfd_quoteDetected(aDefaultHexRGB)) return tinyfd_colorChooser(aTitle, "INVALID DEFAULT_HEX_RGB WITH QUOTES: use the GRAVE ACCENT \\x60 instead.", aDefaultRGB, aoResultRGB); >+ >+- if ( (!tinyfd_forceConsole || !( GetConsoleWindow() || dialogPresent()) ) >+- && (!getenv("SSH_CLIENT") || getenvDISPLAY())) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"windows");return (char *)1;} >+- p = colorChooserWinGui(aTitle, aDefaultHexRGB, aDefaultRGB, aoResultRGB); >+- if (p) >+- { >+- strcpy(lDefaultHexRGB, p); >+- return lDefaultHexRGB; >+- } >+- return NULL; >+- } >+- else if (dialogPresent()) >++ if ( (!tinyfd_forceConsole || !( GetConsoleWindow() || dialogPresent()) ) >++ && (!getenv("SSH_CLIENT") || getenvDISPLAY())) >+ { >+- if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "dialog"); return (char *)0; } >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"windows");return (char *)1;} >++ p = colorChooserWinGui(aTitle, aDefaultHexRGB, aDefaultRGB, aoResultRGB); >++ if (p) >++ { >++ strcpy(lDefaultHexRGB, p); >++ return lDefaultHexRGB; >++ } >++ return NULL; >+ } >+- else >+- { >+- if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "basicinput"); return (char *)0; } >+- } >++ else if (dialogPresent()) >++ { >++ if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "dialog"); return (char *)0; } >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle, "tinyfd_query")){ strcpy(tinyfd_response, "basicinput"); return (char *)0; } >++ } >+ >+- if (aDefaultHexRGB) >++ if (aDefaultHexRGB && (strlen(aDefaultHexRGB)==7) ) >++ { >++ strncpy(lDefaultHexRGB, aDefaultHexRGB,7); >++ lDefaultHexRGB[7]='\0'; >++ } >++ else >++ { >++ RGB2Hex(aDefaultRGB, lDefaultHexRGB); >++ } >++ >++ lPointerInputBox = tinyfd_inputBox(NULL, NULL, NULL); /* obtain a pointer on the current content of tinyfd_inputBox */ >++ if (lPointerInputBox) strcpy(lString, lPointerInputBox); /* preserve the current content of tinyfd_inputBox */ >++ p = tinyfd_inputBox(aTitle, "Enter hex rgb color (i.e. #f5ca20)", lDefaultHexRGB); >++ >++ if ( !p || (strlen(p) != 7) || (p[0] != '#') ) >+ { >+- strncpy(lDefaultHexRGB, aDefaultHexRGB,7); >+- lDefaultHexRGB[7]='\0'; >++ return NULL ; >+ } >+- else >++ for ( i = 1 ; i < 7 ; i ++ ) >+ { >+- RGB2Hex(aDefaultRGB, lDefaultHexRGB); >++ if ( ! isxdigit( (int) p[i] ) ) >++ { >++ return NULL ; >++ } >+ } >++ Hex2RGB(p,aoResultRGB); >+ >+- lPointerInputBox = tinyfd_inputBox(NULL, NULL, NULL); /* obtain a pointer on the current content of tinyfd_inputBox */ >+- if (lPointerInputBox) strcpy(lString, lPointerInputBox); /* preserve the current content of tinyfd_inputBox */ >+- p = tinyfd_inputBox(aTitle, "Enter hex rgb color (i.e. #f5ca20)", lDefaultHexRGB); >++ strcpy(lDefaultHexRGB, p); >+ >+- if ( !p || (strlen(p) != 7) || (p[0] != '#') ) >+- { >+- return NULL ; >+- } >+- for ( i = 1 ; i < 7 ; i ++ ) >+- { >+- if ( ! isxdigit( (int) p[i] ) ) >+- { >+- return NULL ; >+- } >+- } >+- Hex2RGB(p,aoResultRGB); >++ if (lPointerInputBox) strcpy(lPointerInputBox, lString); /* restore its previous content to tinyfd_inputBox */ >+ >+- strcpy(lDefaultHexRGB, p); >+- >+- if (lPointerInputBox) strcpy(lPointerInputBox, lString); /* restore its previous content to tinyfd_inputBox */ >+- >+- return lDefaultHexRGB; >++ return lDefaultHexRGB; >+ } >+ >+ >+@@ -3225,35 +3275,35 @@ >+ >+ int tfd_isDarwin(void) >+ { >+- static int lsIsDarwin = -1 ; >+- struct utsname lUtsname ; >+- if ( lsIsDarwin < 0 ) >+- { >+- lsIsDarwin = !uname(&lUtsname) && !strcmp(lUtsname.sysname,"Darwin") ; >+- } >+- return lsIsDarwin ; >++ static int lsIsDarwin = -1 ; >++ struct utsname lUtsname ; >++ if ( lsIsDarwin < 0 ) >++ { >++ lsIsDarwin = !uname(&lUtsname) && !strcmp(lUtsname.sysname,"Darwin") ; >++ } >++ return lsIsDarwin ; >+ } >+ >+ >+ static int dirExists( char const * aDirPath ) >+ { >+- DIR * lDir ; >+- if ( ! aDirPath || ! strlen( aDirPath ) ) >+- return 0 ; >+- lDir = opendir( aDirPath ) ; >+- if ( ! lDir ) >+- { >+- return 0 ; >+- } >+- closedir( lDir ) ; >+- return 1 ; >++ DIR * lDir ; >++ if ( ! aDirPath || ! strlen( aDirPath ) ) >++ return 0 ; >++ lDir = opendir( aDirPath ) ; >++ if ( ! lDir ) >++ { >++ return 0 ; >++ } >++ closedir( lDir ) ; >++ return 1 ; >+ } >+ >+ >+ static int detectPresence( char const * aExecutable ) >+ { >+ char lBuff[MAX_PATH_OR_CMD] ; >+- char lTestedString[MAX_PATH_OR_CMD] = "which " ; >++ char lTestedString[MAX_PATH_OR_CMD] = "command -v " ; >+ FILE * lIn ; >+ #ifdef _GNU_SOURCE >+ char* lAllocatedCharString; >+@@ -3264,439 +3314,493 @@ >+ strcat( lTestedString, " 2>/dev/null "); >+ lIn = popen( lTestedString , "r" ) ; >+ if ( ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >+- && ( ! strchr( lBuff , ':' ) ) && ( strncmp(lBuff, "no ", 3) ) ) >++ && ( ! strchr( lBuff , ':' ) ) && ( strncmp(lBuff, "no ", 3) ) ) >+ { /* present */ >+- pclose( lIn ) ; >++ pclose( lIn ) ; >+ >+ #ifdef _GNU_SOURCE /*to bypass this, just comment out "#define _GNU_SOURCE" at the top of the file*/ >+- if ( lBuff[strlen( lBuff ) -1] == '\n' ) lBuff[strlen( lBuff ) -1] = '\0' ; >+- lAllocatedCharString = realpath(lBuff,NULL); /*same as canonicalize_file_name*/ >+- lSubstringUndetected = ! strstr(lAllocatedCharString, aExecutable); >+- free(lAllocatedCharString); >+- if (lSubstringUndetected) >+- { >+- if (tinyfd_verbose) printf("detectPresence %s %d\n", aExecutable, 0); >+- return 0; >+- } >++ if ( lBuff[strlen( lBuff ) -1] == '\n' ) lBuff[strlen( lBuff ) -1] = '\0' ; >++ lAllocatedCharString = realpath(lBuff,NULL); /*same as canonicalize_file_name*/ >++ lSubstringUndetected = ! strstr(lAllocatedCharString, aExecutable); >++ free(lAllocatedCharString); >++ if (lSubstringUndetected) >++ { >++ if (tinyfd_verbose) printf("detectPresence %s %d\n", aExecutable, 0); >++ return 0; >++ } >+ #endif /*_GNU_SOURCE*/ >+ >+- if (tinyfd_verbose) printf("detectPresence %s %d\n", aExecutable, 1); >+- return 1 ; >++ if (tinyfd_verbose) printf("detectPresence %s %d\n", aExecutable, 1); >++ return 1 ; >+ } >+ else >+ { >+- pclose( lIn ) ; >+- if (tinyfd_verbose) printf("detectPresence %s %d\n", aExecutable, 0); >+- return 0 ; >++ pclose( lIn ) ; >++ if (tinyfd_verbose) printf("detectPresence %s %d\n", aExecutable, 0); >++ return 0 ; >+ } >+ } >+ >+ >+ static char * getVersion( char const * aExecutable ) /*version must be first numeral*/ >+ { >+- static char lBuff[MAX_PATH_OR_CMD] ; >+- char lTestedString[MAX_PATH_OR_CMD] ; >+- FILE * lIn ; >+- char * lTmp ; >++ static char lBuff[MAX_PATH_OR_CMD] ; >++ char lTestedString[MAX_PATH_OR_CMD] ; >++ FILE * lIn ; >++ char * lTmp ; >+ >+- strcpy( lTestedString , aExecutable ) ; >+- strcat( lTestedString , " --version" ) ; >++ strcpy( lTestedString , aExecutable ) ; >++ strcat( lTestedString , " --version" ) ; >+ >+- lIn = popen( lTestedString , "r" ) ; >+- lTmp = fgets( lBuff , sizeof( lBuff ) , lIn ) ; >+- pclose( lIn ) ; >++ lIn = popen( lTestedString , "r" ) ; >++ lTmp = fgets( lBuff , sizeof( lBuff ) , lIn ) ; >++ pclose( lIn ) ; >+ >+- lTmp += strcspn(lTmp,"0123456789"); >+- /* printf("lTmp:%s\n", lTmp); */ >+- return lTmp ; >++ lTmp += strcspn(lTmp,"0123456789"); >++ /* printf("lTmp:%s\n", lTmp); */ >++ return lTmp ; >+ } >+ >+ >+ static int * getMajorMinorPatch( char const * aExecutable ) >+ { >+- static int lArray[3] ; >+- char * lTmp ; >++ static int lArray[3] ; >++ char * lTmp ; >+ >+- lTmp = (char *) getVersion(aExecutable); >+- lArray[0] = atoi( strtok(lTmp," ,.-") ) ; >+- /* printf("lArray0 %d\n", lArray[0]); */ >+- lArray[1] = atoi( strtok(0," ,.-") ) ; >+- /* printf("lArray1 %d\n", lArray[1]); */ >+- lArray[2] = atoi( strtok(0," ,.-") ) ; >+- /* printf("lArray2 %d\n", lArray[2]); */ >++ lTmp = (char *) getVersion(aExecutable); >++ lArray[0] = atoi( strtok(lTmp," ,.-") ) ; >++ /* printf("lArray0 %d\n", lArray[0]); */ >++ lArray[1] = atoi( strtok(0," ,.-") ) ; >++ /* printf("lArray1 %d\n", lArray[1]); */ >++ lArray[2] = atoi( strtok(0," ,.-") ) ; >++ /* printf("lArray2 %d\n", lArray[2]); */ >+ >+- if ( !lArray[0] && !lArray[1] && !lArray[2] ) return NULL; >+- return lArray ; >++ if ( !lArray[0] && !lArray[1] && !lArray[2] ) return NULL; >++ return lArray ; >+ } >+ >+ >+ static int tryCommand( char const * aCommand ) >+ { >+- char lBuff[MAX_PATH_OR_CMD] ; >+- FILE * lIn ; >++ char lBuff[MAX_PATH_OR_CMD] ; >++ FILE * lIn ; >+ >+- lIn = popen( aCommand , "r" ) ; >+- if ( fgets( lBuff , sizeof( lBuff ) , lIn ) == NULL ) >+- { /* present */ >+- pclose( lIn ) ; >+- return 1 ; >+- } >+- else >+- { >+- pclose( lIn ) ; >+- return 0 ; >+- } >++ lIn = popen( aCommand , "r" ) ; >++ if ( fgets( lBuff , sizeof( lBuff ) , lIn ) == NULL ) >++ { /* present */ >++ pclose( lIn ) ; >++ return 1 ; >++ } >++ else >++ { >++ pclose( lIn ) ; >++ return 0 ; >++ } >+ >+ } >+ >+ >+ static int isTerminalRunning(void) >+ { >+- static int lIsTerminalRunning = -1 ; >+- if ( lIsTerminalRunning < 0 ) >+- { >+- lIsTerminalRunning = isatty(1); >+- if (tinyfd_verbose) printf("isTerminalRunning %d\n", lIsTerminalRunning ); >+- } >+- return lIsTerminalRunning; >++ static int lIsTerminalRunning = -1 ; >++ if ( lIsTerminalRunning < 0 ) >++ { >++ lIsTerminalRunning = isatty(1); >++ if (tinyfd_verbose) printf("isTerminalRunning %d\n", lIsTerminalRunning ); >++ } >++ return lIsTerminalRunning; >+ } >+ >+ >+ static char * dialogNameOnly(void) >+ { >+- static char lDialogName[128] = "*" ; >+- if ( lDialogName[0] == '*' ) >+- { >+- if (!tinyfd_allowCursesDialogs) >++ static char lDialogName[128] = "*" ; >++ if ( lDialogName[0] == '*' ) >+ { >+- strcpy(lDialogName , "" ); >++ if (!tinyfd_allowCursesDialogs) >++ { >++ strcpy(lDialogName , "" ); >++ } >++ else if ( tfd_isDarwin() && * strcpy(lDialogName , "/opt/local/bin/dialog" ) >++ && detectPresence( lDialogName ) ) >++ {} >++ else if ( * strcpy(lDialogName , "dialog" ) >++ && detectPresence( lDialogName ) ) >++ {} >++ else >++ { >++ strcpy(lDialogName , "" ); >++ } >+ } >+- else if ( tfd_isDarwin() && * strcpy(lDialogName , "/opt/local/bin/dialog" ) >+- && detectPresence( lDialogName ) ) >+- {} >+- else if ( * strcpy(lDialogName , "dialog" ) >+- && detectPresence( lDialogName ) ) >+- {} >+- else >+- { >+- strcpy(lDialogName , "" ); >+- } >+- } >+- return lDialogName ; >++ return lDialogName ; >+ } >+ >+ >+ int isDialogVersionBetter09b(void) >+ { >+- char const * lDialogName ; >+- char * lVersion ; >+- int lMajor ; >+- int lMinor ; >+- int lDate ; >+- int lResult ; >+- char * lMinorP ; >+- char * lLetter ; >+- char lBuff[128] ; >++ char const * lDialogName ; >++ char * lVersion ; >++ int lMajor ; >++ int lMinor ; >++ int lDate ; >++ int lResult ; >++ char * lMinorP ; >++ char * lLetter ; >++ char lBuff[128] ; >+ >+- /*char lTest[128] = " 0.9b-20031126" ;*/ >++ /*char lTest[128] = " 0.9b-20031126" ;*/ >+ >+- lDialogName = dialogNameOnly() ; >+- if ( ! strlen(lDialogName) || !(lVersion = (char *) getVersion(lDialogName)) ) return 0 ; >+- /*lVersion = lTest ;*/ >+- /*printf("lVersion %s\n", lVersion);*/ >+- strcpy(lBuff,lVersion); >+- lMajor = atoi( strtok(lVersion," ,.-") ) ; >+- /*printf("lMajor %d\n", lMajor);*/ >+- lMinorP = strtok(0," ,.-abcdefghijklmnopqrstuvxyz"); >+- lMinor = atoi( lMinorP ) ; >+- /*printf("lMinor %d\n", lMinor );*/ >+- lDate = atoi( strtok(0," ,.-") ) ; >+- if (lDate<0) lDate = - lDate; >+- /*printf("lDate %d\n", lDate);*/ >+- lLetter = lMinorP + strlen(lMinorP) ; >+- strcpy(lVersion,lBuff); >+- strtok(lLetter," ,.-"); >+- /*printf("lLetter %s\n", lLetter);*/ >+- lResult = (lMajor > 0) || ( ( lMinor == 9 ) && (*lLetter == 'b') && (lDate >= 20031126) ); >+- /*printf("lResult %d\n", lResult);*/ >+- return lResult; >++ lDialogName = dialogNameOnly() ; >++ if ( ! strlen(lDialogName) || !(lVersion = (char *) getVersion(lDialogName)) ) return 0 ; >++ /*lVersion = lTest ;*/ >++ /*printf("lVersion %s\n", lVersion);*/ >++ strcpy(lBuff,lVersion); >++ lMajor = atoi( strtok(lVersion," ,.-") ) ; >++ /*printf("lMajor %d\n", lMajor);*/ >++ lMinorP = strtok(0," ,.-abcdefghijklmnopqrstuvxyz"); >++ lMinor = atoi( lMinorP ) ; >++ /*printf("lMinor %d\n", lMinor );*/ >++ lDate = atoi( strtok(0," ,.-") ) ; >++ if (lDate<0) lDate = - lDate; >++ /*printf("lDate %d\n", lDate);*/ >++ lLetter = lMinorP + strlen(lMinorP) ; >++ strcpy(lVersion,lBuff); >++ strtok(lLetter," ,.-"); >++ /*printf("lLetter %s\n", lLetter);*/ >++ lResult = (lMajor > 0) || ( ( lMinor == 9 ) && (*lLetter == 'b') && (lDate >= 20031126) ); >++ /*printf("lResult %d\n", lResult);*/ >++ return lResult; >+ } >+ >+ >+ static int whiptailPresentOnly(void) >+ { >+- static int lWhiptailPresent = -1 ; >+- if (!tinyfd_allowCursesDialogs) return 0; >+- if ( lWhiptailPresent < 0 ) >+- { >+- lWhiptailPresent = detectPresence( "whiptail" ) ; >+- } >+- return lWhiptailPresent ; >++ static int lWhiptailPresent = -1 ; >++ if (!tinyfd_allowCursesDialogs) return 0; >++ if ( lWhiptailPresent < 0 ) >++ { >++ lWhiptailPresent = detectPresence( "whiptail" ) ; >++ } >++ return lWhiptailPresent ; >+ } >+ >+ >+ static char * terminalName(void) >+ { >+- static char lTerminalName[128] = "*" ; >+- char lShellName[64] = "*" ; >+- int * lArray; >++ static char lTerminalName[128] = "*" ; >++ char lShellName[64] = "*" ; >++ int * lArray; >+ >+- if ( lTerminalName[0] == '*' ) >+- { >+- if ( detectPresence( "bash" ) ) >+- { >+- strcpy(lShellName , "bash -c " ) ; /*good for basic input*/ >+- } >+- else if ( strlen(dialogNameOnly()) || whiptailPresentOnly() ) >++ if ( lTerminalName[0] == '*' ) >++ { >++ if ( detectPresence( "bash" ) ) >+ { >+- strcpy(lShellName , "sh -c " ) ; /*good enough for dialog & whiptail*/ >++ strcpy(lShellName , "bash -c " ) ; /*good for basic input*/ >+ } >++ else if ( strlen(dialogNameOnly()) || whiptailPresentOnly() ) >++ { >++ strcpy(lShellName , "sh -c " ) ; /*good enough for dialog & whiptail*/ >++ } >++ else >++ { >++ strcpy(lTerminalName , "" ) ; >++ return NULL ; >++ } >++ >++ if ( tfd_isDarwin() ) >++ { >++ if ( * strcpy(lTerminalName , "/opt/X11/bin/xterm" ) >++ && detectPresence( lTerminalName ) ) >++ { >++ strcat(lTerminalName , " -fa 'DejaVu Sans Mono' -fs 10 -title tinyfiledialogs -e " ) ; >++ strcat(lTerminalName , lShellName ) ; >++ } >++ else >++ { >++ strcpy(lTerminalName , "" ) ; >++ } >++ } >++ else if ( * strcpy(lTerminalName,"xterm") /*good (small without parameters)*/ >++ && detectPresence(lTerminalName) ) >++ { >++ strcat(lTerminalName , " -fa 'DejaVu Sans Mono' -fs 10 -title tinyfiledialogs -e " ) ; >++ strcat(lTerminalName , lShellName ) ; >++ } >++ else if ( * strcpy(lTerminalName,"terminator") /*good*/ >++ && detectPresence(lTerminalName) ) >++ { >++ strcat(lTerminalName , " -x " ) ; >++ strcat(lTerminalName , lShellName ) ; >++ } >++ else if ( * strcpy(lTerminalName,"lxterminal") /*good*/ >++ && detectPresence(lTerminalName) ) >++ { >++ strcat(lTerminalName , " -e " ) ; >++ strcat(lTerminalName , lShellName ) ; >++ } >++ else if ( * strcpy(lTerminalName,"konsole") /*good*/ >++ && detectPresence(lTerminalName) ) >++ { >++ strcat(lTerminalName , " -e " ) ; >++ strcat(lTerminalName , lShellName ) ; >++ } >++ else if ( * strcpy(lTerminalName,"kterm") /*good*/ >++ && detectPresence(lTerminalName) ) >++ { >++ strcat(lTerminalName , " -e " ) ; >++ strcat(lTerminalName , lShellName ) ; >++ } >++ else if ( * strcpy(lTerminalName,"tilix") /*good*/ >++ && detectPresence(lTerminalName) ) >++ { >++ strcat(lTerminalName , " -e " ) ; >++ strcat(lTerminalName , lShellName ) ; >++ } >++ else if ( * strcpy(lTerminalName,"xfce4-terminal") /*good*/ >++ && detectPresence(lTerminalName) ) >++ { >++ strcat(lTerminalName , " -x " ) ; >++ strcat(lTerminalName , lShellName ) ; >++ } >++ else if ( * strcpy(lTerminalName,"mate-terminal") /*good*/ >++ && detectPresence(lTerminalName) ) >++ { >++ strcat(lTerminalName , " -x " ) ; >++ strcat(lTerminalName , lShellName ) ; >++ } >++ else if ( * strcpy(lTerminalName,"Eterm") /*good*/ >++ && detectPresence(lTerminalName) ) >++ { >++ strcat(lTerminalName , " -e " ) ; >++ strcat(lTerminalName , lShellName ) ; >++ } >++ else if ( * strcpy(lTerminalName,"evilvte") /*good*/ >++ && detectPresence(lTerminalName) ) >++ { >++ strcat(lTerminalName , " -e " ) ; >++ strcat(lTerminalName , lShellName ) ; >++ } >++ else if ( * strcpy(lTerminalName,"pterm") /*good (only letters)*/ >++ && detectPresence(lTerminalName) ) >++ { >++ strcat(lTerminalName , " -e " ) ; >++ strcat(lTerminalName , lShellName ) ; >++ } >++ else if ( * strcpy(lTerminalName,"gnome-terminal") >++ && detectPresence(lTerminalName) && (lArray = getMajorMinorPatch(lTerminalName)) >++ && ((lArray[0]<3) || (lArray[0]==3 && lArray[1]<=6)) ) >++ { >++ strcat(lTerminalName , " --disable-factory -x " ) ; >++ strcat(lTerminalName , lShellName ) ; >++ } >+ else >+ { >+- strcpy(lTerminalName , "" ) ; >+- return NULL ; >++ strcpy(lTerminalName , "" ) ; >+ } >+- >+- if ( tfd_isDarwin() ) >+- { >+- if ( * strcpy(lTerminalName , "/opt/X11/bin/xterm" ) >+- && detectPresence( lTerminalName ) ) >+- { >+- strcat(lTerminalName , " -fa 'DejaVu Sans Mono' -fs 10 -title tinyfiledialogs -e " ) ; >+- strcat(lTerminalName , lShellName ) ; >+- } >+- else >+- { >+- strcpy(lTerminalName , "" ) ; >+- } >+- } >+- else if ( * strcpy(lTerminalName,"xterm") /*good (small without parameters)*/ >+- && detectPresence(lTerminalName) ) >+- { >+- strcat(lTerminalName , " -fa 'DejaVu Sans Mono' -fs 10 -title tinyfiledialogs -e " ) ; >+- strcat(lTerminalName , lShellName ) ; >+- } >+- else if ( * strcpy(lTerminalName,"terminator") /*good*/ >+- && detectPresence(lTerminalName) ) >+- { >+- strcat(lTerminalName , " -x " ) ; >+- strcat(lTerminalName , lShellName ) ; >+- } >+- else if ( * strcpy(lTerminalName,"lxterminal") /*good*/ >+- && detectPresence(lTerminalName) ) >+- { >+- strcat(lTerminalName , " -e " ) ; >+- strcat(lTerminalName , lShellName ) ; >+- } >+- else if ( * strcpy(lTerminalName,"konsole") /*good*/ >+- && detectPresence(lTerminalName) ) >+- { >+- strcat(lTerminalName , " -e " ) ; >+- strcat(lTerminalName , lShellName ) ; >+- } >+- else if ( * strcpy(lTerminalName,"kterm") /*good*/ >+- && detectPresence(lTerminalName) ) >+- { >+- strcat(lTerminalName , " -e " ) ; >+- strcat(lTerminalName , lShellName ) ; >+- } >+- else if ( * strcpy(lTerminalName,"tilix") /*good*/ >+- && detectPresence(lTerminalName) ) >+- { >+- strcat(lTerminalName , " -e " ) ; >+- strcat(lTerminalName , lShellName ) ; >+- } >+- else if ( * strcpy(lTerminalName,"xfce4-terminal") /*good*/ >+- && detectPresence(lTerminalName) ) >+- { >+- strcat(lTerminalName , " -x " ) ; >+- strcat(lTerminalName , lShellName ) ; >+- } >+- else if ( * strcpy(lTerminalName,"mate-terminal") /*good*/ >+- && detectPresence(lTerminalName) ) >+- { >+- strcat(lTerminalName , " -x " ) ; >+- strcat(lTerminalName , lShellName ) ; >+- } >+- else if ( * strcpy(lTerminalName,"Eterm") /*good*/ >+- && detectPresence(lTerminalName) ) >+- { >+- strcat(lTerminalName , " -e " ) ; >+- strcat(lTerminalName , lShellName ) ; >+- } >+- else if ( * strcpy(lTerminalName,"evilvte") /*good*/ >+- && detectPresence(lTerminalName) ) >+- { >+- strcat(lTerminalName , " -e " ) ; >+- strcat(lTerminalName , lShellName ) ; >+- } >+- else if ( * strcpy(lTerminalName,"pterm") /*good (only letters)*/ >+- && detectPresence(lTerminalName) ) >+- { >+- strcat(lTerminalName , " -e " ) ; >+- strcat(lTerminalName , lShellName ) ; >+- } >+- else if ( * strcpy(lTerminalName,"gnome-terminal") >+- && detectPresence(lTerminalName) && (lArray = getMajorMinorPatch(lTerminalName)) >+- && ((lArray[0]<3) || (lArray[0]==3 && lArray[1]<=6)) ) >+- { >+- strcat(lTerminalName , " --disable-factory -x " ) ; >+- strcat(lTerminalName , lShellName ) ; >+- } >+- else >+- { >+- strcpy(lTerminalName , "" ) ; >+- } >+- /* bad: koi rxterm guake tilda vala-terminal qterminal >+- aterm Terminal terminology sakura lilyterm weston-terminal >+- roxterm termit xvt rxvt mrxvt urxvt */ >+- } >+- if ( strlen(lTerminalName) ) >+- { >+- return lTerminalName ; >+- } >+- else >+- { >+- return NULL ; >+- } >++ /* bad: koi rxterm guake tilda vala-terminal qterminal kgx >++ aterm Terminal terminology sakura lilyterm weston-terminal >++ roxterm termit xvt rxvt mrxvt urxvt */ >++ } >++ if ( strlen(lTerminalName) ) >++ { >++ return lTerminalName ; >++ } >++ else >++ { >++ return NULL ; >++ } >+ } >+ >+ >+ static char * dialogName(void) >+ { >+- char * lDialogName ; >+- lDialogName = dialogNameOnly( ) ; >+- if ( strlen(lDialogName) && ( isTerminalRunning() || terminalName() ) ) >+- { >+- return lDialogName ; >+- } >+- else >+- { >+- return NULL ; >+- } >++ char * lDialogName ; >++ lDialogName = dialogNameOnly( ) ; >++ if ( strlen(lDialogName) && ( isTerminalRunning() || terminalName() ) ) >++ { >++ return lDialogName ; >++ } >++ else >++ { >++ return NULL ; >++ } >+ } >+ >+ >+ static int whiptailPresent(void) >+ { >+- int lWhiptailPresent ; >+- lWhiptailPresent = whiptailPresentOnly( ) ; >+- if ( lWhiptailPresent && ( isTerminalRunning() || terminalName() ) ) >+- { >+- return lWhiptailPresent ; >+- } >+- else >+- { >+- return 0 ; >+- } >++ int lWhiptailPresent ; >++ lWhiptailPresent = whiptailPresentOnly( ) ; >++ if ( lWhiptailPresent && ( isTerminalRunning() || terminalName() ) ) >++ { >++ return lWhiptailPresent ; >++ } >++ else >++ { >++ return 0 ; >++ } >+ } >+ >+ >+ >+ static int graphicMode(void) >+ { >+- return !( tinyfd_forceConsole && (isTerminalRunning() || terminalName()) ) >+- && ( getenvDISPLAY() >+- || (tfd_isDarwin() && (!getenv("SSH_TTY") || getenvDISPLAY() ) ) ) ; >++ return !( tinyfd_forceConsole && (isTerminalRunning() || terminalName()) ) >++ && ( getenvDISPLAY() >++ || (tfd_isDarwin() && (!getenv("SSH_TTY") || getenvDISPLAY() ) ) ) ; >+ } >+ >+ >+-static int pactlPresent(void) >++static int ffplayPresent(void) >+ { >+- static int lPactlPresent = -1 ; >+- if ( lPactlPresent < 0 ) >+- { >+- lPactlPresent = detectPresence("pactl") ; >+- } >+- return lPactlPresent ; >++ static int lFFplayPresent = -1; >++ if (lFFplayPresent < 0) >++ { >++ lFFplayPresent = detectPresence("ffplay"); >++ } >++ return lFFplayPresent; >+ } >+ >+ >++static int pactlPresent( void ) >++{ >++ static int lPactlPresent = -1 ; >++ char lBuff [256] ; >++ FILE * lIn ; >++ >++ if ( lPactlPresent < 0 ) >++ { >++ lPactlPresent = detectPresence("pactl") ; >++ if ( lPactlPresent ) >++ { >++ lIn = popen( "pactl info | grep -iF pulseaudio" , "r" ) ; >++ if ( ! (fgets( lBuff , sizeof( lBuff ) , lIn ) && ! strstr(lBuff, "PipeWire") ) ) >++ { >++ lPactlPresent = 0 ; >++ } >++ pclose( lIn ) ; >++ if (tinyfd_verbose) printf("is pactl valid ? %d\n", lPactlPresent); >++ } >++ } >++ return lPactlPresent ; >++} >++ >++ >+ static int speakertestPresent(void) >+ { >+- static int lSpeakertestPresent = -1 ; >+- if ( lSpeakertestPresent < 0 ) >+- { >+- lSpeakertestPresent = detectPresence("speaker-test") ; >+- } >+- return lSpeakertestPresent ; >++ static int lSpeakertestPresent = -1 ; >++ if ( lSpeakertestPresent < 0 ) >++ { >++ lSpeakertestPresent = detectPresence("speaker-test") ; >++ } >++ return lSpeakertestPresent ; >+ } >+ >+ >+-static int playPresent() >++static int playPresent(void) /* play is part of sox */ >+ { >+ static int lPlayPresent = -1; >+ if (lPlayPresent < 0) >+ { >+- lPlayPresent = detectPresence("sox"); /*if sox is present, play is ready*/ >++ lPlayPresent = detectPresence("sox"); /*if sox is present, play is ready*/ >+ } >+ return lPlayPresent; >+ } >+ >+ >+-static int beepexePresent() >++static int beepexePresent(void) >+ { >+ static int lBeepexePresent = -1; >+ if (lBeepexePresent < 0) >+ { >+- lBeepexePresent = detectPresence("beep.exe"); >++ lBeepexePresent = detectPresence("beep.exe"); >+ } >+ return lBeepexePresent; >+ } >+ >+ >+-static int beepPresent(void) >++/*static int beepPresent(void) >+ { >+- static int lBeepPresent = -1 ; >+- if ( lBeepPresent < 0 ) >++ static int lBeepPresent = -1 ; >++ if ( lBeepPresent < 0 ) >++ { >++ lBeepPresent = detectPresence("beep") ; >++ } >++ return lBeepPresent ; >++}*/ >++ >++ >++static int playsoundPresent(void) /* playsound is part of pipewire */ >++{ >++ static int lPlaysoundPresent = -1 ; >++ if (lPlaysoundPresent < 0) >++ { >++ lPlaysoundPresent = detectPresence("playsound_simple"); >++ if ( lPlaysoundPresent && ! fileExists("/usr/share/sounds/freedesktop/stereo/bell.oga") ) >+ { >+- lBeepPresent = detectPresence("beep") ; >++ lPlaysoundPresent = 0 ; >+ } >+- return lBeepPresent ; >++ } >++ return lPlaysoundPresent; >+ } >+ >+ >+-static int xmessagePresent(void) >++static int paplayPresent(void) /* playsound is part of pipewire */ >+ { >+- static int lXmessagePresent = -1 ; >+- if ( lXmessagePresent < 0 ) >++ static int lPaplayPresent = -1 ; >++ if (lPaplayPresent < 0) >++ { >++ lPaplayPresent = detectPresence("paplay"); >++ if ( lPaplayPresent && ! fileExists("/usr/share/sounds/freedesktop/stereo/bell.oga") ) >+ { >+- lXmessagePresent = detectPresence("xmessage");/*if not tty,not on osxpath*/ >++ lPaplayPresent = 0 ; >+ } >+- return lXmessagePresent && graphicMode( ) ; >++ } >++ return lPaplayPresent; >+ } >+ >+ >++static int xmessagePresent(void) >++{ >++ static int lXmessagePresent = -1 ; >++ if ( lXmessagePresent < 0 ) >++ { >++ lXmessagePresent = detectPresence("xmessage");/*if not tty,not on osxpath*/ >++ } >++ return lXmessagePresent && graphicMode( ) ; >++} >++ >++ >+ static int gxmessagePresent(void) >+ { >+- static int lGxmessagePresent = -1 ; >+- if ( lGxmessagePresent < 0 ) >+- { >+- lGxmessagePresent = detectPresence("gxmessage") ; >+- } >+- return lGxmessagePresent && graphicMode( ) ; >++ static int lGxmessagePresent = -1 ; >++ if ( lGxmessagePresent < 0 ) >++ { >++ lGxmessagePresent = detectPresence("gxmessage") ; >++ } >++ return lGxmessagePresent && graphicMode( ) ; >+ } >+ >+ >+ static int gmessagePresent(void) >+ { >+- static int lGmessagePresent = -1 ; >+- if ( lGmessagePresent < 0 ) >+- { >+- lGmessagePresent = detectPresence("gmessage") ; >+- } >+- return lGmessagePresent && graphicMode( ) ; >++ static int lGmessagePresent = -1 ; >++ if ( lGmessagePresent < 0 ) >++ { >++ lGmessagePresent = detectPresence("gmessage") ; >++ } >++ return lGmessagePresent && graphicMode( ) ; >+ } >+ >+ >+ static int notifysendPresent(void) >+ { >+- static int lNotifysendPresent = -1 ; >+- if ( lNotifysendPresent < 0 ) >+- { >+- lNotifysendPresent = detectPresence("notify-send") ; >+- } >+- return lNotifysendPresent && graphicMode( ) ; >++ static int lNotifysendPresent = -1 ; >++ if ( lNotifysendPresent < 0 ) >++ { >++ lNotifysendPresent = detectPresence("notify-send") ; >++ } >++ return lNotifysendPresent && graphicMode( ) ; >+ } >+ >+ >+@@ -3708,17 +3812,17 @@ >+ >+ if ( lPerlPresent < 0 ) >+ { >+- lPerlPresent = detectPresence("perl") ; >+- if (lPerlPresent) >+- { >+- lIn = popen("perl -MNet::DBus -e \"Net::DBus->session->get_service('org.freedesktop.Notifications')\" 2>&1", "r"); >+- if (fgets(lBuff, sizeof(lBuff), lIn) == NULL) >+- { >+- lPerlPresent = 2; >+- } >+- pclose(lIn); >+- if (tinyfd_verbose) printf("perl-dbus %d\n", lPerlPresent); >+- } >++ lPerlPresent = detectPresence("perl") ; >++ if (lPerlPresent) >++ { >++ lIn = popen("perl -MNet::DBus -e \"Net::DBus->session->get_service('org.freedesktop.Notifications')\" 2>&1", "r"); >++ if (fgets(lBuff, sizeof(lBuff), lIn) == NULL) >++ { >++ lPerlPresent = 2; >++ } >++ pclose(lIn); >++ if (tinyfd_verbose) printf("perl-dbus %d\n", lPerlPresent); >++ } >+ } >+ return graphicMode() ? lPerlPresent : 0 ; >+ } >+@@ -3726,114 +3830,181 @@ >+ >+ static int afplayPresent(void) >+ { >+- static int lAfplayPresent = -1 ; >+- char lBuff[MAX_PATH_OR_CMD] ; >+- FILE * lIn ; >++ static int lAfplayPresent = -1 ; >++ char lBuff[MAX_PATH_OR_CMD] ; >++ FILE * lIn ; >+ >+- if ( lAfplayPresent < 0 ) >+- { >+- lAfplayPresent = detectPresence("afplay") ; >+- if ( lAfplayPresent ) >+- { >+- lIn = popen( "test -e /System/Library/Sounds/Ping.aiff || echo Ping" , "r" ) ; >+- if ( fgets( lBuff , sizeof( lBuff ) , lIn ) == NULL ) >+- { >+- lAfplayPresent = 2 ; >+- } >+- pclose( lIn ) ; >+- if (tinyfd_verbose) printf("afplay %d\n", lAfplayPresent); >+- } >+- } >+- return graphicMode() ? lAfplayPresent : 0 ; >++ if ( lAfplayPresent < 0 ) >++ { >++ lAfplayPresent = detectPresence("afplay") ; >++ if ( lAfplayPresent ) >++ { >++ lIn = popen( "test -e /System/Library/Sounds/Ping.aiff || echo Ping" , "r" ) ; >++ if ( fgets( lBuff , sizeof( lBuff ) , lIn ) == NULL ) >++ { >++ lAfplayPresent = 2 ; >++ } >++ pclose( lIn ) ; >++ if (tinyfd_verbose) printf("afplay %d\n", lAfplayPresent); >++ } >++ } >++ return graphicMode() ? lAfplayPresent : 0 ; >+ } >+ >+ >+ static int xdialogPresent(void) >+ { >+- static int lXdialogPresent = -1 ; >+- if ( lXdialogPresent < 0 ) >+- { >+- lXdialogPresent = detectPresence("Xdialog") ; >+- } >+- return lXdialogPresent && graphicMode( ) ; >++ static int lXdialogPresent = -1 ; >++ if ( lXdialogPresent < 0 ) >++ { >++ lXdialogPresent = detectPresence("Xdialog") ; >++ } >++ return lXdialogPresent && graphicMode( ) ; >+ } >+ >+ >+ static int gdialogPresent(void) >+ { >+- static int lGdialoglPresent = -1 ; >+- if ( lGdialoglPresent < 0 ) >+- { >+- lGdialoglPresent = detectPresence( "gdialog" ) ; >+- } >+- return lGdialoglPresent && graphicMode( ) ; >++ static int lGdialoglPresent = -1 ; >++ if ( lGdialoglPresent < 0 ) >++ { >++ lGdialoglPresent = detectPresence( "gdialog" ) ; >++ } >++ return lGdialoglPresent && graphicMode( ) ; >+ } >+ >+ >+ static int osascriptPresent(void) >+ { >+- static int lOsascriptPresent = -1 ; >+- if ( lOsascriptPresent < 0 ) >+- { >+- gWarningDisplayed |= !!getenv("SSH_TTY"); >+- lOsascriptPresent = detectPresence( "osascript" ) ; >+- } >+- return lOsascriptPresent && graphicMode() && !getenv("SSH_TTY") ; >++ static int lOsascriptPresent = -1 ; >++ if ( lOsascriptPresent < 0 ) >++ { >++ gWarningDisplayed |= !!getenv("SSH_TTY"); >++ lOsascriptPresent = detectPresence( "osascript" ) ; >++ } >++ return lOsascriptPresent && graphicMode() && !getenv("SSH_TTY") ; >+ } >+ >+ >++static int dunstifyPresent(void) >++{ >++ static int lDunstifyPresent = -1 ; >++ static char lBuff[MAX_PATH_OR_CMD] ; >++ FILE * lIn ; >++ char * lTmp ; >++ >++ if ( lDunstifyPresent < 0 ) >++ { >++ lDunstifyPresent = detectPresence( "dunstify" ) ; >++ if ( lDunstifyPresent ) >++ { >++ lIn = popen( "dunstify -s" , "r" ) ; >++ lTmp = fgets( lBuff , sizeof( lBuff ) , lIn ) ; >++ pclose( lIn ) ; >++ /* printf("lTmp:%s\n", lTmp); */ >++ lDunstifyPresent = strstr(lTmp,"name:dunst\n") ? 1 : 0 ; >++ if (tinyfd_verbose) printf("lDunstifyPresent %d\n", lDunstifyPresent); >++ } >++ } >++ return lDunstifyPresent && graphicMode( ) ; >++} >++ >++ >++static int dunstPresent(void) >++{ >++ static int lDunstPresent = -1 ; >++ static char lBuff[MAX_PATH_OR_CMD] ; >++ FILE * lIn ; >++ char * lTmp ; >++ >++ if ( lDunstPresent < 0 ) >++ { >++ lDunstPresent = detectPresence( "dunst" ) ; >++ if ( lDunstPresent ) >++ { >++ lIn = popen( "ps -e | grep dunst | grep -v grep" , "r" ) ; /* add "| wc -l" to receive the number of lines */ >++ lTmp = fgets( lBuff , sizeof( lBuff ) , lIn ) ; >++ pclose( lIn ) ; >++ /* if ( lTmp ) printf("lTmp:%s\n", lTmp); */ >++ if ( lTmp ) lDunstPresent = 1 ; >++ else lDunstPresent = 0 ; >++ if (tinyfd_verbose) printf("lDunstPresent %d\n", lDunstPresent); >++ } >++ } >++ return lDunstPresent && graphicMode( ) ; >++} >++ >++ >+ int tfd_qarmaPresent(void) >+ { >+- static int lQarmaPresent = -1 ; >+- if ( lQarmaPresent < 0 ) >+- { >+- lQarmaPresent = detectPresence("qarma") ; >+- } >+- return lQarmaPresent && graphicMode( ) ; >++ static int lQarmaPresent = -1 ; >++ if ( lQarmaPresent < 0 ) >++ { >++ lQarmaPresent = detectPresence("qarma") ; >++ } >++ return lQarmaPresent && graphicMode( ) ; >+ } >+ >+ >+ int tfd_matedialogPresent(void) >+ { >+- static int lMatedialogPresent = -1 ; >+- if ( lMatedialogPresent < 0 ) >+- { >+- lMatedialogPresent = detectPresence("matedialog") ; >+- } >+- return lMatedialogPresent && graphicMode( ) ; >++ static int lMatedialogPresent = -1 ; >++ if ( lMatedialogPresent < 0 ) >++ { >++ lMatedialogPresent = detectPresence("matedialog") ; >++ } >++ return lMatedialogPresent && graphicMode( ) ; >+ } >+ >+ >+ int tfd_shellementaryPresent(void) >+ { >+- static int lShellementaryPresent = -1 ; >+- if ( lShellementaryPresent < 0 ) >+- { >+- lShellementaryPresent = 0 ; /*detectPresence("shellementary"); shellementary is not ready yet */ >+- } >+- return lShellementaryPresent && graphicMode( ) ; >++ static int lShellementaryPresent = -1 ; >++ if ( lShellementaryPresent < 0 ) >++ { >++ lShellementaryPresent = 0 ; /*detectPresence("shellementary"); shellementary is not ready yet */ >++ } >++ return lShellementaryPresent && graphicMode( ) ; >+ } >+ >+ >+ int tfd_xpropPresent(void) >+ { >+- static int lXpropPresent = -1 ; >+- if ( lXpropPresent < 0 ) >++ static int lXpropReady = 0 ; >++ static int lXpropDetected = -1 ; >++ char lBuff[MAX_PATH_OR_CMD] ; >++ FILE * lIn ; >++ >++ if ( lXpropDetected < 0 ) >+ { >+- lXpropPresent = detectPresence("xprop") ; >++ lXpropDetected = detectPresence("xprop") ; >+ } >+- return lXpropPresent && graphicMode( ) ; >++ >++ if ( !lXpropReady && lXpropDetected ) >++ { /* xwayland Debian issue reported by Kay F. Jahnke and solved with his help */ >++ lIn = popen( "xprop -root 32x ' $0' _NET_ACTIVE_WINDOW" , "r" ) ; >++ if ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >++ { >++ if ( ! strstr( lBuff , "not found" ) ) >++ { >++ if (tinyfd_verbose) printf("xprop is ready\n"); >++ lXpropReady = 1 ; >++ } >++ } >++ pclose( lIn ) ; >++ } >++ return graphicMode() ? lXpropReady : 0 ; >+ } >+ >+ >+ int tfd_zenityPresent(void) >+ { >+- static int lZenityPresent = -1 ; >+- if ( lZenityPresent < 0 ) >+- { >+- lZenityPresent = detectPresence("zenity") ; >+- } >+- return lZenityPresent && graphicMode( ) ; >++ static int lZenityPresent = -1 ; >++ if ( lZenityPresent < 0 ) >++ { >++ lZenityPresent = detectPresence("zenity") ; >++ } >++ return lZenityPresent && graphicMode( ) ; >+ } >+ >+ >+@@ -3842,7 +4013,7 @@ >+ static int lYadPresent = -1; >+ if (lYadPresent < 0) >+ { >+- lYadPresent = detectPresence("yad"); >++ lYadPresent = detectPresence("yad"); >+ } >+ return lYadPresent && graphicMode(); >+ } >+@@ -3850,1428 +4021,1422 @@ >+ >+ int tfd_zenity3Present(void) >+ { >+- static int lZenity3Present = -1 ; >+- char lBuff[MAX_PATH_OR_CMD] ; >+- FILE * lIn ; >+- int lIntTmp ; >++ static int lZenity3Present = -1 ; >++ char lBuff[MAX_PATH_OR_CMD] ; >++ FILE * lIn ; >++ int lIntTmp ; >+ >+- if ( lZenity3Present < 0 ) >+- { >+- lZenity3Present = 0 ; >+- if ( tfd_zenityPresent() ) >+- { >+- lIn = popen( "zenity --version" , "r" ) ; >+- if ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >+- { >+- if ( atoi(lBuff) >= 3 ) >+- { >+- lZenity3Present = 3 ; >+- lIntTmp = atoi(strtok(lBuff,".")+2 ) ; >+- if ( lIntTmp >= 18 ) >+- { >++ if ( lZenity3Present < 0 ) >++ { >++ lZenity3Present = 0 ; >++ if ( tfd_zenityPresent() ) >++ { >++ lIn = popen( "zenity --version" , "r" ) ; >++ if ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >++ { >++ if ( atoi(lBuff) >= 3 ) >++ { >++ lZenity3Present = 3 ; >++ lIntTmp = atoi(strtok(lBuff,".")+2 ) ; >++ if ( lIntTmp >= 18 ) >++ { >+ lZenity3Present = 5 ; >+- } >+- else if ( lIntTmp >= 10 ) >+- { >++ } >++ else if ( lIntTmp >= 10 ) >++ { >+ lZenity3Present = 4 ; >+- } >++ } >++ } >++ else if ( ( atoi(lBuff) == 2 ) && ( atoi(strtok(lBuff,".")+2 ) >= 32 ) ) >++ { >++ lZenity3Present = 2 ; >+ } >+- else if ( ( atoi(lBuff) == 2 ) && ( atoi(strtok(lBuff,".")+2 ) >= 32 ) ) >+- { >+- lZenity3Present = 2 ; >+- } >+- if (tinyfd_verbose) printf("zenity type %d\n", lZenity3Present); >+- } >+- pclose( lIn ) ; >+- } >+- } >+- return graphicMode() ? lZenity3Present : 0 ; >++ if (tinyfd_verbose) printf("zenity type %d\n", lZenity3Present); >++ } >++ pclose( lIn ) ; >++ } >++ } >++ return graphicMode() ? lZenity3Present : 0 ; >+ } >+ >+ >+ int tfd_kdialogPresent(void) >+ { >+- static int lKdialogPresent = -1 ; >+- char lBuff[MAX_PATH_OR_CMD] ; >+- FILE * lIn ; >+- char * lDesktop; >++ static int lKdialogPresent = -1 ; >++ char lBuff[MAX_PATH_OR_CMD] ; >++ FILE * lIn ; >++ char * lDesktop; >+ >+- if ( lKdialogPresent < 0 ) >+- { >+- if ( tfd_zenityPresent() ) >+- { >+- lDesktop = getenv("XDG_SESSION_DESKTOP"); >+- if ( !lDesktop || ( strcmp(lDesktop, "KDE") && strcmp(lDesktop, "lxqt") ) ) >+- { >+- lKdialogPresent = 0 ; >+- return lKdialogPresent ; >+- } >+- } >++ if ( lKdialogPresent < 0 ) >++ { >++ lDesktop = getenv("XDG_SESSION_DESKTOP"); >++ if ( !lDesktop || ( strcmp(lDesktop, "KDE") && strcmp(lDesktop, "lxqt") ) ) >++ { >++ if ( tfd_zenityPresent() ) >++ { >++ lKdialogPresent = 0 ; >++ return lKdialogPresent ; >++ } >++ } >+ >+- lKdialogPresent = detectPresence("kdialog") ; >+- if ( lKdialogPresent && !getenv("SSH_TTY") ) >+- { >+- lIn = popen( "kdialog --attach 2>&1" , "r" ) ; >+- if ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >+- { >+- if ( ! strstr( "Unknown" , lBuff ) ) >+- { >+- lKdialogPresent = 2 ; >+- if (tinyfd_verbose) printf("kdialog-attach %d\n", lKdialogPresent); >+- } >+- } >+- pclose( lIn ) ; >++ lKdialogPresent = detectPresence("kdialog") ; >++ if ( lKdialogPresent && !getenv("SSH_TTY") ) >++ { >++ lIn = popen( "kdialog --attach 2>&1" , "r" ) ; >++ if ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >++ { >++ if ( ! strstr( "Unknown" , lBuff ) ) >++ { >++ lKdialogPresent = 2 ; >++ if (tinyfd_verbose) printf("kdialog-attach %d\n", lKdialogPresent); >++ } >++ } >++ pclose( lIn ) ; >+ >+- if (lKdialogPresent == 2) >+- { >+- lKdialogPresent = 1 ; >+- lIn = popen( "kdialog --passivepopup 2>&1" , "r" ) ; >+- if ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >+- { >+- if ( ! strstr( "Unknown" , lBuff ) ) >+- { >+- lKdialogPresent = 2 ; >+- if (tinyfd_verbose) printf("kdialog-popup %d\n", lKdialogPresent); >+- } >+- } >+- pclose( lIn ) ; >+- } >+- } >+- } >+- return graphicMode() ? lKdialogPresent : 0 ; >++ if (lKdialogPresent == 2) >++ { >++ lKdialogPresent = 1 ; >++ lIn = popen( "kdialog --passivepopup 2>&1" , "r" ) ; >++ if ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >++ { >++ if ( ! strstr( "Unknown" , lBuff ) ) >++ { >++ lKdialogPresent = 2 ; >++ if (tinyfd_verbose) printf("kdialog-popup %d\n", lKdialogPresent); >++ } >++ } >++ pclose( lIn ) ; >++ } >++ } >++ } >++ return graphicMode() ? lKdialogPresent : 0 ; >+ } >+ >+ >+ static int osx9orBetter(void) >+ { >+- static int lOsx9orBetter = -1 ; >+- char lBuff[MAX_PATH_OR_CMD] ; >+- FILE * lIn ; >+- int V,v; >++ static int lOsx9orBetter = -1 ; >++ char lBuff[MAX_PATH_OR_CMD] ; >++ FILE * lIn ; >++ int V,v; >+ >+- if ( lOsx9orBetter < 0 ) >+- { >+- lOsx9orBetter = 0 ; >+- lIn = popen( "osascript -e 'set osver to system version of (system info)'" , "r" ) ; >+- if ( ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >+- && ( 2 == sscanf(lBuff, "%d.%d", &V, &v) ) ) >+- { >+- V = V * 100 + v; >+- if ( V >= 1009 ) >+- { >+- lOsx9orBetter = 1 ; >+- } >+- } >+- pclose( lIn ) ; >+- if (tinyfd_verbose) printf("Osx10 = %d, %d = %s\n", lOsx9orBetter, V, lBuff) ; >+- } >+- return lOsx9orBetter ; >++ if ( lOsx9orBetter < 0 ) >++ { >++ lOsx9orBetter = 0 ; >++ lIn = popen( "osascript -e 'set osver to system version of (system info)'" , "r" ) ; >++ V = 0 ; >++ if ( ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >++ && ( 2 == sscanf(lBuff, "%d.%d", &V, &v) ) ) >++ { >++ V = V * 100 + v; >++ if ( V >= 1009 ) >++ { >++ lOsx9orBetter = 1 ; >++ } >++ } >++ pclose( lIn ) ; >++ if (tinyfd_verbose) printf("Osx10 = %d, %d = %s\n", lOsx9orBetter, V, lBuff) ; >++ } >++ return lOsx9orBetter ; >+ } >+ >+ >+ static int python3Present(void) >+ { >+- static int lPython3Present = -1 ; >+- int i; >++ static int lPython3Present = -1 ; >+ >+- if ( lPython3Present < 0 ) >+- { >+- lPython3Present = 0 ; >+- strcpy(gPython3Name , "python3" ) ; >+- if ( detectPresence(gPython3Name) ) lPython3Present = 1; >+- else >+- { >+- for ( i = 9 ; i >= 0 ; i -- ) >+- { >+- sprintf( gPython3Name , "python3.%d" , i ) ; >+- if ( detectPresence(gPython3Name) ) >+- { >+- lPython3Present = 1; >+- break; >+- } >+- } >+- } >+- if (tinyfd_verbose) printf("lPython3Present %d\n", lPython3Present) ; >+- if (tinyfd_verbose) printf("gPython3Name %s\n", gPython3Name) ; >+- } >+- return lPython3Present ; >++ if ( lPython3Present < 0 ) >++ { >++ lPython3Present = 0 ; >++ strcpy(gPython3Name , "python3" ) ; >++ if ( detectPresence(gPython3Name) ) lPython3Present = 1; >++ if (tinyfd_verbose) printf("lPython3Present %d\n", lPython3Present) ; >++ if (tinyfd_verbose) printf("gPython3Name %s\n", gPython3Name) ; >++ } >++ return lPython3Present ; >+ } >+ >+ >+ static int python2Present(void) >+ { >+- static int lPython2Present = -1 ; >+- int i; >++ static int lPython2Present = -1 ; >+ >+- if ( lPython2Present < 0 ) >+- { >+- lPython2Present = 0 ; >+- strcpy(gPython2Name , "python2" ) ; >+- if ( detectPresence(gPython2Name) ) lPython2Present = 1; >+- else >++ if ( lPython2Present < 0 ) >+ { >+- for ( i = 9 ; i >= 0 ; i -- ) >+- { >+- sprintf( gPython2Name , "python2.%d" , i ) ; >+- if ( detectPresence(gPython2Name) ) >+- { >+- lPython2Present = 1; >+- break; >+- } >+- } >++ lPython2Present = 0 ; >++ strcpy(gPython2Name , "python2" ) ; >++ if ( detectPresence(gPython2Name) ) lPython2Present = 1; >++ if (tinyfd_verbose) printf("lPython2Present %d\n", lPython2Present) ; >++ if (tinyfd_verbose) printf("gPython2Name %s\n", gPython2Name) ; >+ } >+- if (tinyfd_verbose) printf("lPython2Present %d\n", lPython2Present) ; >+- if (tinyfd_verbose) printf("gPython2Name %s\n", gPython2Name) ; >+- } >+- return lPython2Present ; >++ return lPython2Present ; >+ } >+ >+ >+ static int tkinter3Present(void) >+ { >+- static int lTkinter3Present = -1 ; >+- char lPythonCommand[256]; >+- char lPythonParams[128] = >+- "-S -c \"try:\n\timport tkinter;\nexcept:\n\tprint(0);\""; >++ static int lTkinter3Present = -1 ; >++ char lPythonCommand[256]; >++ char lPythonParams[128] = >++ "-S -c \"try:\n\timport tkinter;\nexcept:\n\tprint(0);\""; >+ >+- if ( lTkinter3Present < 0 ) >+- { >+- lTkinter3Present = 0 ; >+- if ( python3Present() ) >+- { >+- sprintf( lPythonCommand , "%s %s" , gPython3Name , lPythonParams ) ; >+- lTkinter3Present = tryCommand(lPythonCommand) ; >+- } >+- if (tinyfd_verbose) printf("lTkinter3Present %d\n", lTkinter3Present) ; >+- } >+- return lTkinter3Present && graphicMode() && !(tfd_isDarwin() && getenv("SSH_TTY") ); >++ if ( lTkinter3Present < 0 ) >++ { >++ lTkinter3Present = 0 ; >++ if ( python3Present() ) >++ { >++ sprintf( lPythonCommand , "%s %s" , gPython3Name , lPythonParams ) ; >++ lTkinter3Present = tryCommand(lPythonCommand) ; >++ } >++ if (tinyfd_verbose) printf("lTkinter3Present %d\n", lTkinter3Present) ; >++ } >++ return lTkinter3Present && graphicMode() && !(tfd_isDarwin() && getenv("SSH_TTY") ); >+ } >+ >+ >+ static int tkinter2Present(void) >+ { >+- static int lTkinter2Present = -1 ; >+- char lPythonCommand[256]; >+- char lPythonParams[128] = >+- "-S -c \"try:\n\timport Tkinter;\nexcept:\n\tprint 0;\""; >++ static int lTkinter2Present = -1 ; >++ char lPythonCommand[256]; >++ char lPythonParams[128] = >++ "-S -c \"try:\n\timport Tkinter;\nexcept:\n\tprint 0;\""; >+ >+- if ( lTkinter2Present < 0 ) >+- { >+- lTkinter2Present = 0 ; >+- if ( python2Present() ) >++ if ( lTkinter2Present < 0 ) >+ { >+- sprintf( lPythonCommand , "%s %s" , gPython2Name , lPythonParams ) ; >+- lTkinter2Present = tryCommand(lPythonCommand) ; >++ lTkinter2Present = 0 ; >++ if ( python2Present() ) >++ { >++ sprintf( lPythonCommand , "%s %s" , gPython2Name , lPythonParams ) ; >++ lTkinter2Present = tryCommand(lPythonCommand) ; >++ } >++ if (tinyfd_verbose) printf("lTkinter2Present %d graphicMode %d \n", lTkinter2Present, graphicMode() ) ; >+ } >+- if (tinyfd_verbose) printf("lTkinter2Present %d\n", lTkinter2Present) ; >+- } >+- return lTkinter2Present && graphicMode() && !(tfd_isDarwin() && getenv("SSH_TTY") ); >++ return lTkinter2Present && graphicMode() && !(tfd_isDarwin() && getenv("SSH_TTY") ); >+ } >+ >+ >+ static int pythonDbusPresent(void) >+ { >+- static int lPythonDbusPresent = -1 ; >+- char lPythonCommand[384]; >+- char lPythonParams[256] = >++ static int lPythonDbusPresent = -1 ; >++ char lPythonCommand[384]; >++ char lPythonParams[256] = >+ "-c \"try:\n\timport dbus;bus=dbus.SessionBus();\ >+ notif=bus.get_object('org.freedesktop.Notifications','/org/freedesktop/Notifications');\ >+ notify=dbus.Interface(notif,'org.freedesktop.Notifications');\nexcept:\n\tprint(0);\""; >+ >+- if (lPythonDbusPresent < 0 ) >+- { >+- lPythonDbusPresent = 0 ; >+- if ( python2Present() ) >+- { >+- strcpy(gPythonName , gPython2Name ) ; >+- sprintf( lPythonCommand , "%s %s" , gPythonName , lPythonParams ) ; >+- lPythonDbusPresent = tryCommand(lPythonCommand) ; >+- } >++ if (lPythonDbusPresent < 0 ) >++ { >++ lPythonDbusPresent = 0 ; >++ if ( python2Present() ) >++ { >++ strcpy(gPythonName , gPython2Name ) ; >++ sprintf( lPythonCommand , "%s %s" , gPythonName , lPythonParams ) ; >++ lPythonDbusPresent = tryCommand(lPythonCommand) ; >++ } >+ >+- if ( !lPythonDbusPresent && python3Present() ) >+- { >+- strcpy(gPythonName , gPython3Name ) ; >+- sprintf( lPythonCommand , "%s %s" , gPythonName , lPythonParams ) ; >+- lPythonDbusPresent = tryCommand(lPythonCommand) ; >+- } >++ if ( !lPythonDbusPresent && python3Present() ) >++ { >++ strcpy(gPythonName , gPython3Name ) ; >++ sprintf( lPythonCommand , "%s %s" , gPythonName , lPythonParams ) ; >++ lPythonDbusPresent = tryCommand(lPythonCommand) ; >++ } >+ >+- if (tinyfd_verbose) printf("lPythonDbusPresent %d\n", lPythonDbusPresent) ; >+- if (tinyfd_verbose) printf("gPythonName %s\n", gPythonName) ; >+- } >+- return lPythonDbusPresent && graphicMode() && !(tfd_isDarwin() && getenv("SSH_TTY") ); >++ if (tinyfd_verbose) printf("lPythonDbusPresent %d\n", lPythonDbusPresent) ; >++ if (tinyfd_verbose) printf("gPythonName %s\n", gPythonName) ; >++ } >++ return lPythonDbusPresent && graphicMode() && !(tfd_isDarwin() && getenv("SSH_TTY") ); >+ } >+ >+ >+ static void sigHandler(int signum) >+ { >+- FILE * lIn ; >+- if ( ( lIn = popen( "pactl unload-module module-sine" , "r" ) ) ) >+- { >+- pclose( lIn ) ; >+- } >+- if (tinyfd_verbose) printf("tinyfiledialogs caught signal %d\n", signum); >++ FILE * lIn ; >++ if ( ( lIn = popen( "pactl unload-module module-sine" , "r" ) ) ) >++ { >++ pclose( lIn ) ; >++ } >++ if (tinyfd_verbose) printf("tinyfiledialogs caught signal %d\n", signum); >+ } >+ >++ >+ void tinyfd_beep(void) >+ { >+- char lDialogString[256] ; >+- FILE * lIn ; >++ char lDialogString[256] ; >++ FILE * lIn ; >+ >+- if ( osascriptPresent() ) >++ if ( pactlPresent() ) >++ { >++ signal(SIGINT, sigHandler); >++ strcpy( lDialogString , >++ "thnum=$(pactl load-module module-sine frequency=440);sleep .3;pactl unload-module $thnum" ) ; >++ } >++ else if ( osascriptPresent() ) >++ { >++ if ( afplayPresent() >= 2 ) >+ { >+- if ( afplayPresent() >= 2 ) >+- { >+- strcpy( lDialogString , "afplay /System/Library/Sounds/Ping.aiff") ; >+- } >+- else >+- { >+- strcpy( lDialogString , "osascript -e 'tell application \"System Events\" to beep'") ; >+- } >++ strcpy( lDialogString , "afplay /System/Library/Sounds/Ping.aiff") ; >+ } >+- else if ( pactlPresent() ) >+- { >+- signal(SIGINT, sigHandler); >+- /*strcpy( lDialogString , "pactl load-module module-sine frequency=440;sleep .3;pactl unload-module module-sine" ) ;*/ >+- strcpy( lDialogString , "thnum=$(pactl load-module module-sine frequency=440);sleep .3;pactl unload-module $thnum" ) ; >+- } >+- else if ( speakertestPresent() ) >+- { >+- /*strcpy( lDialogString , "timeout -k .3 .3 speaker-test --frequency 440 --test sine > /dev/tty" ) ;*/ >+- strcpy( lDialogString , "( speaker-test -t sine -f 440 > /dev/tty )& pid=$!;sleep .4; kill -9 $pid" ) ; /*.3 was too short for mac g3*/ >+- } >+- else if (beepexePresent()) >+- { >+- strcpy(lDialogString, "beep.exe 440 300"); >+- } >+- else if (playPresent()) /* play is part of sox */ >+- { >+- strcpy(lDialogString, "play -q -n synth .3 sine 440"); >+- } >+- else if ( beepPresent() ) >+- { >+- strcpy( lDialogString , "beep -f 440 -l 300" ) ; >+- } >+ else >+ { >+- strcpy( lDialogString , "printf '\a' > /dev/tty" ) ; >++ strcpy( lDialogString , "osascript -e 'tell application \"System Events\" to beep'") ; >+ } >++ } >++ else if ( speakertestPresent() ) >++ { >++ /*strcpy( lDialogString , "timeout -k .3 .3 speaker-test --frequency 440 --test sine > /dev/tty" ) ;*/ >++ strcpy( lDialogString , "( speaker-test -t sine -f 440 > /dev/tty )& pid=$!;sleep .5; kill -9 $pid" ) ; /*.3 was too short for mac g3*/ >++ } >++ else if ( ffplayPresent() ) >++ { >++ strcpy(lDialogString, "ffplay -f lavfi -i sine=f=440:d=0.15 -autoexit -nodisp" ); >++ } >++ else if (playPresent()) /* play is part of sox */ >++ { >++ strcpy(lDialogString, "play -q -n synth .3 sine 440"); >++ } >++ else if ( playsoundPresent() ) >++ { >++ strcpy( lDialogString , "playsound_simple /usr/share/sounds/freedesktop/stereo/bell.oga") ; >++ } >++ else if ( paplayPresent() ) >++ { >++ strcpy( lDialogString , "paplay /usr/share/sounds/freedesktop/stereo/bell.oga") ; >++ } >++ else if (beepexePresent()) >++ { >++ strcpy(lDialogString, "beep.exe 440 300"); >++ } >++ /*else if ( beepPresent() ) >++ { >++ strcpy( lDialogString , "beep -f 440 -l 300" ) ; >++ }*/ >++ else >++ { >++ strcpy( lDialogString , "printf '\\a' > /dev/tty" ) ; >++ } >+ >+- if (tinyfd_verbose) printf( "lDialogString: %s\n" , lDialogString ) ; >++ if (tinyfd_verbose) printf( "lDialogString: %s\n" , lDialogString ) ; >+ >+- if ( ( lIn = popen( lDialogString , "r" ) ) ) >+- { >+- pclose( lIn ) ; >+- } >++ if ( ( lIn = popen( lDialogString , "r" ) ) ) >++ { >++ pclose( lIn ) ; >++ } >+ >+- if ( pactlPresent() ) >+- { >+- signal(SIGINT, SIG_DFL); >+- } >++ if ( pactlPresent() ) >++ { >++ signal(SIGINT, SIG_DFL); >++ } >+ } >+ >+ >+ int tinyfd_messageBox( >+- char const * aTitle , /* NULL or "" */ >+- char const * aMessage , /* NULL or "" may contain \n and \t */ >+- char const * aDialogType , /* "ok" "okcancel" "yesno" "yesnocancel" */ >+- char const * aIconType , /* "info" "warning" "error" "question" */ >+- int aDefaultButton ) /* 0 for cancel/no , 1 for ok/yes , 2 for no in yesnocancel */ >++ char const * aTitle , /* NULL or "" */ >++ char const * aMessage , /* NULL or "" may contain \n and \t */ >++ char const * aDialogType , /* "ok" "okcancel" "yesno" "yesnocancel" */ >++ char const * aIconType , /* "info" "warning" "error" "question" */ >++ int aDefaultButton ) /* 0 for cancel/no , 1 for ok/yes , 2 for no in yesnocancel */ >+ { >+- char lBuff[MAX_PATH_OR_CMD] ; >+- char * lDialogString = NULL ; >+- char * lpDialogString; >+- FILE * lIn ; >+- int lWasGraphicDialog = 0 ; >+- int lWasXterm = 0 ; >+- int lResult ; >+- char lChar ; >+- struct termios infoOri; >+- struct termios info; >+- size_t lTitleLen ; >+- size_t lMessageLen ; >++ char lBuff[MAX_PATH_OR_CMD] ; >++ char * lDialogString = NULL ; >++ char * lpDialogString; >++ FILE * lIn ; >++ int lWasGraphicDialog = 0 ; >++ int lWasXterm = 0 ; >++ int lResult ; >++ char lChar ; >++ struct termios infoOri; >++ struct termios info; >++ size_t lTitleLen ; >++ size_t lMessageLen ; >+ >+- lBuff[0]='\0'; >++ lBuff[0]='\0'; >+ >+- if (tfd_quoteDetected(aTitle)) return tinyfd_messageBox("INVALID TITLE WITH QUOTES", aMessage, aDialogType, aIconType, aDefaultButton); >+- if (tfd_quoteDetected(aMessage)) return tinyfd_messageBox(aTitle, "INVALID MESSAGE WITH QUOTES", aDialogType, aIconType, aDefaultButton); >++ if (tfd_quoteDetected(aTitle)) return tinyfd_messageBox("INVALID TITLE WITH QUOTES", aMessage, aDialogType, aIconType, aDefaultButton); >++ if (tfd_quoteDetected(aMessage)) return tinyfd_messageBox(aTitle, "INVALID MESSAGE WITH QUOTES", aDialogType, aIconType, aDefaultButton); >+ >+- lTitleLen = aTitle ? strlen(aTitle) : 0 ; >+- lMessageLen = aMessage ? strlen(aMessage) : 0 ; >+- if ( !aTitle || strcmp(aTitle,"tinyfd_query") ) >+- { >+- lDialogString = (char *) malloc( MAX_PATH_OR_CMD + lTitleLen + lMessageLen ); >+- } >++ lTitleLen = aTitle ? strlen(aTitle) : 0 ; >++ lMessageLen = aMessage ? strlen(aMessage) : 0 ; >++ if ( !aTitle || strcmp(aTitle,"tinyfd_query") ) >++ { >++ lDialogString = (char *) malloc( MAX_PATH_OR_CMD + lTitleLen + lMessageLen ); >++ } >+ >+- if ( osascriptPresent( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"applescript");return 1;} >++ if ( osascriptPresent( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"applescript");return 1;} >+ >+- strcpy( lDialogString , "osascript "); >+- if ( ! osx9orBetter() ) strcat( lDialogString , " -e 'tell application \"System Events\"' -e 'Activate'"); >+- strcat( lDialogString , " -e 'try' -e 'set {vButton} to {button returned} of ( display dialog \"") ; >+- if ( aMessage && strlen(aMessage) ) >+- { >+- strcat(lDialogString, aMessage) ; >+- } >+- strcat(lDialogString, "\" ") ; >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "with title \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\" ") ; >+- } >+- strcat(lDialogString, "with icon ") ; >+- if ( aIconType && ! strcmp( "error" , aIconType ) ) >+- { >+- strcat(lDialogString, "stop " ) ; >+- } >+- else if ( aIconType && ! strcmp( "warning" , aIconType ) ) >+- { >+- strcat(lDialogString, "caution " ) ; >+- } >+- else /* question or info */ >+- { >+- strcat(lDialogString, "note " ) ; >+- } >+- if ( aDialogType && ! strcmp( "okcancel" , aDialogType ) ) >+- { >+- if ( ! aDefaultButton ) >+- { >+- strcat( lDialogString ,"default button \"Cancel\" " ) ; >+- } >+- } >+- else if ( aDialogType && ! strcmp( "yesno" , aDialogType ) ) >+- { >+- strcat( lDialogString ,"buttons {\"No\", \"Yes\"} " ) ; >+- if (aDefaultButton) >+- { >+- strcat( lDialogString ,"default button \"Yes\" " ) ; >+- } >+- else >+- { >+- strcat( lDialogString ,"default button \"No\" " ) ; >+- } >+- strcat( lDialogString ,"cancel button \"No\"" ) ; >+- } >+- else if ( aDialogType && ! strcmp( "yesnocancel" , aDialogType ) ) >+- { >+- strcat( lDialogString ,"buttons {\"No\", \"Yes\", \"Cancel\"} " ) ; >+- switch (aDefaultButton) >+- { >+- case 1: strcat( lDialogString ,"default button \"Yes\" " ) ; break; >+- case 2: strcat( lDialogString ,"default button \"No\" " ) ; break; >+- case 0: strcat( lDialogString ,"default button \"Cancel\" " ) ; break; >+- } >+- strcat( lDialogString ,"cancel button \"Cancel\"" ) ; >+- } >+- else >+- { >+- strcat( lDialogString ,"buttons {\"OK\"} " ) ; >+- strcat( lDialogString ,"default button \"OK\" " ) ; >+- } >+- strcat( lDialogString, ")' ") ; >++ strcpy( lDialogString , "osascript "); >++ if ( ! osx9orBetter() ) strcat( lDialogString , " -e 'tell application \"System Events\"' -e 'Activate'"); >++ strcat( lDialogString , " -e 'try' -e 'set {vButton} to {button returned} of ( display dialog \"") ; >++ if ( aMessage && strlen(aMessage) ) >++ { >++ strcat(lDialogString, aMessage) ; >++ } >++ strcat(lDialogString, "\" ") ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "with title \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\" ") ; >++ } >++ strcat(lDialogString, "with icon ") ; >++ if ( aIconType && ! strcmp( "error" , aIconType ) ) >++ { >++ strcat(lDialogString, "stop " ) ; >++ } >++ else if ( aIconType && ! strcmp( "warning" , aIconType ) ) >++ { >++ strcat(lDialogString, "caution " ) ; >++ } >++ else /* question or info */ >++ { >++ strcat(lDialogString, "note " ) ; >++ } >++ if ( aDialogType && ! strcmp( "okcancel" , aDialogType ) ) >++ { >++ if ( ! aDefaultButton ) >++ { >++ strcat( lDialogString ,"default button \"Cancel\" " ) ; >++ } >++ } >++ else if ( aDialogType && ! strcmp( "yesno" , aDialogType ) ) >++ { >++ strcat( lDialogString ,"buttons {\"No\", \"Yes\"} " ) ; >++ if (aDefaultButton) >++ { >++ strcat( lDialogString ,"default button \"Yes\" " ) ; >++ } >++ else >++ { >++ strcat( lDialogString ,"default button \"No\" " ) ; >++ } >++ strcat( lDialogString ,"cancel button \"No\"" ) ; >++ } >++ else if ( aDialogType && ! strcmp( "yesnocancel" , aDialogType ) ) >++ { >++ strcat( lDialogString ,"buttons {\"No\", \"Yes\", \"Cancel\"} " ) ; >++ switch (aDefaultButton) >++ { >++ case 1: strcat( lDialogString ,"default button \"Yes\" " ) ; break; >++ case 2: strcat( lDialogString ,"default button \"No\" " ) ; break; >++ case 0: strcat( lDialogString ,"default button \"Cancel\" " ) ; break; >++ } >++ strcat( lDialogString ,"cancel button \"Cancel\"" ) ; >++ } >++ else >++ { >++ strcat( lDialogString ,"buttons {\"OK\"} " ) ; >++ strcat( lDialogString ,"default button \"OK\" " ) ; >++ } >++ strcat( lDialogString, ")' ") ; >+ >+- strcat( lDialogString, >++ strcat( lDialogString, >+ "-e 'if vButton is \"Yes\" then' -e 'return 1'\ >+ -e 'else if vButton is \"OK\" then' -e 'return 1'\ >+ -e 'else if vButton is \"No\" then' -e 'return 2'\ >+ -e 'else' -e 'return 0' -e 'end if' " ); >+ >+- strcat( lDialogString, "-e 'on error number -128' " ) ; >+- strcat( lDialogString, "-e '0' " ); >++ strcat( lDialogString, "-e 'on error number -128' " ) ; >++ strcat( lDialogString, "-e '0' " ); >+ >+- strcat( lDialogString, "-e 'end try'") ; >+- if ( ! osx9orBetter() ) strcat( lDialogString, " -e 'end tell'") ; >+- } >+- else if ( tfd_kdialogPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"kdialog");return 1;} >++ strcat( lDialogString, "-e 'end try'") ; >++ if ( ! osx9orBetter() ) strcat( lDialogString, " -e 'end tell'") ; >++ } >++ else if ( tfd_kdialogPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"kdialog");return 1;} >+ >+- strcpy( lDialogString , "kdialog" ) ; >+- if ( (tfd_kdialogPresent() == 2) && tfd_xpropPresent() ) >+- { >+- strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >+- } >++ strcpy( lDialogString , "kdialog" ) ; >++ if ( (tfd_kdialogPresent() == 2) && tfd_xpropPresent() ) >++ { >++ strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >++ } >+ >+- strcat( lDialogString , " --" ) ; >+- if ( aDialogType && ( ! strcmp( "okcancel" , aDialogType ) >+- || ! strcmp( "yesno" , aDialogType ) || ! strcmp( "yesnocancel" , aDialogType ) ) ) >+- { >+- if ( aIconType && ( ! strcmp( "warning" , aIconType ) >+- || ! strcmp( "error" , aIconType ) ) ) >+- { >+- strcat( lDialogString , "warning" ) ; >+- } >+- if ( ! strcmp( "yesnocancel" , aDialogType ) ) >+- { >+- strcat( lDialogString , "yesnocancel" ) ; >+- } >+- else >+- { >+- strcat( lDialogString , "yesno" ) ; >+- } >+- } >+- else if ( aIconType && ! strcmp( "error" , aIconType ) ) >+- { >+- strcat( lDialogString , "error" ) ; >+- } >+- else if ( aIconType && ! strcmp( "warning" , aIconType ) ) >+- { >+- strcat( lDialogString , "sorry" ) ; >+- } >+- else >+- { >+- strcat( lDialogString , "msgbox" ) ; >+- } >+- strcat( lDialogString , " \"" ) ; >+- if ( aMessage ) >+- { >+- strcat( lDialogString , aMessage ) ; >+- } >+- strcat( lDialogString , "\"" ) ; >+- if ( aDialogType && ! strcmp( "okcancel" , aDialogType ) ) >+- { >+- strcat( lDialogString , >+- " --yes-label Ok --no-label Cancel" ) ; >+- } >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, " --title \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\"") ; >+- } >++ strcat( lDialogString , " --" ) ; >++ if ( aDialogType && ( ! strcmp( "okcancel" , aDialogType ) >++ || ! strcmp( "yesno" , aDialogType ) || ! strcmp( "yesnocancel" , aDialogType ) ) ) >++ { >++ if ( aIconType && ( ! strcmp( "warning" , aIconType ) >++ || ! strcmp( "error" , aIconType ) ) ) >++ { >++ strcat( lDialogString , "warning" ) ; >++ } >++ if ( ! strcmp( "yesnocancel" , aDialogType ) ) >++ { >++ strcat( lDialogString , "yesnocancel" ) ; >++ } >++ else >++ { >++ strcat( lDialogString , "yesno" ) ; >++ } >++ } >++ else if ( aIconType && ! strcmp( "error" , aIconType ) ) >++ { >++ strcat( lDialogString , "error" ) ; >++ } >++ else if ( aIconType && ! strcmp( "warning" , aIconType ) ) >++ { >++ strcat( lDialogString , "sorry" ) ; >++ } >++ else >++ { >++ strcat( lDialogString , "msgbox" ) ; >++ } >++ strcat( lDialogString , " \"" ) ; >++ if ( aMessage ) >++ { >++ strcat( lDialogString , aMessage ) ; >++ } >++ strcat( lDialogString , "\"" ) ; >++ if ( aDialogType && ! strcmp( "okcancel" , aDialogType ) ) >++ { >++ strcat( lDialogString , >++ " --yes-label Ok --no-label Cancel" ) ; >++ } >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, " --title \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\"") ; >++ } >+ >+- if ( ! strcmp( "yesnocancel" , aDialogType ) ) >+- { >+- strcat( lDialogString , "; x=$? ;if [ $x = 0 ] ;then echo 1;elif [ $x = 1 ] ;then echo 2;else echo 0;fi"); >+- } >+- else >+- { >+- strcat( lDialogString , ";if [ $? = 0 ];then echo 1;else echo 0;fi"); >+- } >+- } >+- else if ( tfd_zenityPresent() || tfd_matedialogPresent() || tfd_shellementaryPresent() || tfd_qarmaPresent() ) >+- { >+- if ( tfd_zenityPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"zenity");return 1;} >+- strcpy( lDialogString , "szAnswer=$(zenity" ) ; >+- if ( (tfd_zenity3Present() >= 4) && !getenv("SSH_TTY") && tfd_xpropPresent() ) >+- { >+- strcat(lDialogString, " --attach=$(sleep .01;xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >+- } >+- } >+- else if ( tfd_matedialogPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"matedialog");return 1;} >+- strcpy( lDialogString , "szAnswer=$(matedialog" ) ; >+- } >+- else if ( tfd_shellementaryPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"shellementary");return 1;} >+- strcpy( lDialogString , "szAnswer=$(shellementary" ) ; >+- } >+- else >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"qarma");return 1;} >+- strcpy( lDialogString , "szAnswer=$(qarma" ) ; >+- if ( !getenv("SSH_TTY") && tfd_xpropPresent() ) >+- { >+- strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >+- } >+- } >+- strcat(lDialogString, " --"); >+- >+- if ( aDialogType && ! strcmp( "okcancel" , aDialogType ) ) >+- { >+- strcat( lDialogString , >+- "question --ok-label=Ok --cancel-label=Cancel" ) ; >+- } >+- else if ( aDialogType && ! strcmp( "yesno" , aDialogType ) ) >+- { >+- strcat( lDialogString , "question" ) ; >+- } >+- else if ( aDialogType && ! strcmp( "yesnocancel" , aDialogType ) ) >+- { >+- strcat( lDialogString , "list --column \"\" --hide-header \"Yes\" \"No\"" ) ; >+- } >+- else if ( aIconType && ! strcmp( "error" , aIconType ) ) >+- { >+- strcat( lDialogString , "error" ) ; >+- } >+- else if ( aIconType && ! strcmp( "warning" , aIconType ) ) >+- { >+- strcat( lDialogString , "warning" ) ; >+- } >+- else >+- { >+- strcat( lDialogString , "info" ) ; >+- } >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, " --title=\"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\"") ; >+- } >+- if ( aMessage && strlen(aMessage) ) >+- { >+- if (strcmp("yesnocancel", aDialogType)) strcat(lDialogString, " --no-wrap"); >+- strcat(lDialogString, " --text=\"") ; >+- strcat(lDialogString, aMessage) ; >+- strcat(lDialogString, "\"") ; >+- } >+- if ( (tfd_zenity3Present() >= 3) || (!tfd_zenityPresent() && (tfd_shellementaryPresent() || tfd_qarmaPresent()) ) ) >+- { >+- strcat( lDialogString , " --icon-name=dialog-" ) ; >+- if ( aIconType && (! strcmp( "question" , aIconType ) >+- || ! strcmp( "error" , aIconType ) >+- || ! strcmp( "warning" , aIconType ) ) ) >+- { >+- strcat( lDialogString , aIconType ) ; >+- } >+- else >+- { >+- strcat( lDialogString , "information" ) ; >+- } >+- } >+- >+- if (tinyfd_silent) strcat( lDialogString , " 2>/dev/null "); >+- >+- if ( ! strcmp( "yesnocancel" , aDialogType ) ) >+- { >+- strcat( lDialogString , >+-");if [ $? = 1 ];then echo 0;elif [ $szAnswer = \"No\" ];then echo 2;else echo 1;fi"); >+- } >+- else >+- { >+- strcat( lDialogString , ");if [ $? = 0 ];then echo 1;else echo 0;fi"); >+- } >+- } >+- >+- else if (tfd_yadPresent()) >+- { >+- if (aTitle && !strcmp(aTitle, "tinyfd_query")) { strcpy(tinyfd_response, "yad"); return 1; } >+- strcpy(lDialogString, "szAnswer=$(yad --"); >+- if (aDialogType && !strcmp("ok", aDialogType)) >+- { >+- strcat(lDialogString,"button=Ok:1"); >+- } >+- else if (aDialogType && !strcmp("okcancel", aDialogType)) >+- { >+- strcat(lDialogString,"button=Ok:1 --button=Cancel:0"); >+- } >+- else if (aDialogType && !strcmp("yesno", aDialogType)) >+- { >+- strcat(lDialogString, "button=Yes:1 --button=No:0"); >+- } >+- else if (aDialogType && !strcmp("yesnocancel", aDialogType)) >+- { >+- strcat(lDialogString, "button=Yes:1 --button=No:2 --button=Cancel:0"); >+- } >+- else if (aIconType && !strcmp("error", aIconType)) >+- { >+- strcat(lDialogString, "error"); >+- } >+- else if (aIconType && !strcmp("warning", aIconType)) >+- { >+- strcat(lDialogString, "warning"); >+- } >+- else >+- { >+- strcat(lDialogString, "info"); >+- } >+- if (aTitle && strlen(aTitle)) >+- { >+- strcat(lDialogString, " --title=\""); >+- strcat(lDialogString, aTitle); >+- strcat(lDialogString, "\""); >+- } >+- if (aMessage && strlen(aMessage)) >+- { >+- strcat(lDialogString, " --text=\""); >+- strcat(lDialogString, aMessage); >+- strcat(lDialogString, "\""); >+- } >+- >+- strcat(lDialogString, " --icon-name=dialog-"); >+- if (aIconType && (!strcmp("question", aIconType) >+- || !strcmp("error", aIconType) >+- || !strcmp("warning", aIconType))) >+- { >+- strcat(lDialogString, aIconType); >+- } >+- else >+- { >+- strcat(lDialogString, "information"); >+- } >+- >+- if (tinyfd_silent) strcat(lDialogString, " 2>/dev/null "); >+- strcat(lDialogString,");echo $?"); >+- } >+- >+- else if ( !gxmessagePresent() && !gmessagePresent() && !gdialogPresent() && !xdialogPresent() && tkinter3Present() ) >++ if ( ! strcmp( "yesnocancel" , aDialogType ) ) >++ { >++ strcat( lDialogString , "; x=$? ;if [ $x = 0 ] ;then echo 1;elif [ $x = 1 ] ;then echo 2;else echo 0;fi"); >++ } >++ else >++ { >++ strcat( lDialogString , ";if [ $? = 0 ];then echo 1;else echo 0;fi"); >++ } >++ } >++ else if ( tfd_zenityPresent() || tfd_matedialogPresent() || tfd_shellementaryPresent() || tfd_qarmaPresent() ) >+ { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python3-tkinter");return 1;} >+- >+- strcpy( lDialogString , gPython3Name ) ; >+- strcat( lDialogString , >+- " -S -c \"import tkinter;from tkinter import messagebox;root=tkinter.Tk();root.withdraw();"); >+- >+- strcat( lDialogString ,"res=messagebox." ) ; >+- if ( aDialogType && ! strcmp( "okcancel" , aDialogType ) ) >+- { >+- strcat( lDialogString , "askokcancel(" ) ; >+- if ( aDefaultButton ) >++ if ( tfd_zenityPresent() ) >+ { >+- strcat( lDialogString , "default=messagebox.OK," ) ; >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"zenity");return 1;} >++ strcpy( lDialogString , "szAnswer=$(zenity" ) ; >++ if ( (tfd_zenity3Present() >= 4) && !getenv("SSH_TTY") && tfd_xpropPresent() ) >++ { >++ strcat(lDialogString, " --attach=$(sleep .01;xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >++ } >+ } >++ else if ( tfd_matedialogPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"matedialog");return 1;} >++ strcpy( lDialogString , "szAnswer=$(matedialog" ) ; >++ } >++ else if ( tfd_shellementaryPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"shellementary");return 1;} >++ strcpy( lDialogString , "szAnswer=$(shellementary" ) ; >++ } >+ else >+ { >+- strcat( lDialogString , "default=messagebox.CANCEL," ) ; >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"qarma");return 1;} >++ strcpy( lDialogString , "szAnswer=$(qarma" ) ; >++ if ( !getenv("SSH_TTY") && tfd_xpropPresent() ) >++ { >++ strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >++ } >+ } >+- } >+- else if ( aDialogType && ! strcmp( "yesno" , aDialogType ) ) >+- { >+- strcat( lDialogString , "askyesno(" ) ; >+- if ( aDefaultButton ) >++ strcat(lDialogString, " --"); >++ >++ if ( aDialogType && ! strcmp( "okcancel" , aDialogType ) ) >+ { >+- strcat( lDialogString , "default=messagebox.YES," ) ; >++ strcat( lDialogString , >++ "question --ok-label=Ok --cancel-label=Cancel" ) ; >+ } >++ else if ( aDialogType && ! strcmp( "yesno" , aDialogType ) ) >++ { >++ strcat( lDialogString , "question" ) ; >++ } >++ else if ( aDialogType && ! strcmp( "yesnocancel" , aDialogType ) ) >++ { >++ strcat( lDialogString , "list --column \"\" --hide-header \"Yes\" \"No\"" ) ; >++ } >++ else if ( aIconType && ! strcmp( "error" , aIconType ) ) >++ { >++ strcat( lDialogString , "error" ) ; >++ } >++ else if ( aIconType && ! strcmp( "warning" , aIconType ) ) >++ { >++ strcat( lDialogString , "warning" ) ; >++ } >+ else >+ { >+- strcat( lDialogString , "default=messagebox.NO," ) ; >++ strcat( lDialogString , "info" ) ; >+ } >+- } >+- else if ( aDialogType && ! strcmp( "yesnocancel" , aDialogType ) ) >+- { >+- strcat( lDialogString , "askyesnocancel(" ) ; >+- switch ( aDefaultButton ) >++ >++ strcat(lDialogString, " --title=\""); >++ if ( aTitle && strlen(aTitle) ) strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\""); >++ >++ if (strcmp("yesnocancel", aDialogType)) strcat(lDialogString, " --no-wrap"); >++ >++ strcat(lDialogString, " --text=\"") ; >++ if (aMessage && strlen(aMessage)) strcat(lDialogString, aMessage) ; >++ strcat(lDialogString, "\"") ; >++ >++ if ( (tfd_zenity3Present() >= 3) || (!tfd_zenityPresent() && (tfd_shellementaryPresent() || tfd_qarmaPresent()) ) ) >+ { >+- case 1: strcat( lDialogString , "default=messagebox.YES," ); break; >+- case 2: strcat( lDialogString , "default=messagebox.NO," ); break; >+- case 0: strcat( lDialogString , "default=messagebox.CANCEL," ); break; >++ strcat( lDialogString , " --icon-name=dialog-" ) ; >++ if ( aIconType && (! strcmp( "question" , aIconType ) >++ || ! strcmp( "error" , aIconType ) >++ || ! strcmp( "warning" , aIconType ) ) ) >++ { >++ strcat( lDialogString , aIconType ) ; >++ } >++ else >++ { >++ strcat( lDialogString , "information" ) ; >++ } >+ } >+- } >+- else >+- { >+- strcat( lDialogString , "showinfo(" ) ; >+- } >+ >+- strcat( lDialogString , "icon='" ) ; >+- if ( aIconType && (! strcmp( "question" , aIconType ) >+- || ! strcmp( "error" , aIconType ) >+- || ! strcmp( "warning" , aIconType ) ) ) >+- { >+- strcat( lDialogString , aIconType ) ; >+- } >+- else >+- { >+- strcat( lDialogString , "info" ) ; >+- } >++ if (tinyfd_silent) strcat( lDialogString , " 2>/dev/null "); >+ >+- strcat(lDialogString, "',") ; >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "title='") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "',") ; >+- } >+- if ( aMessage && strlen(aMessage) ) >+- { >+- strcat(lDialogString, "message='") ; >+- lpDialogString = lDialogString + strlen(lDialogString); >+- tfd_replaceSubStr( aMessage , "\n" , "\\n" , lpDialogString ) ; >+- strcat(lDialogString, "'") ; >+- } >++ if ( ! strcmp( "yesnocancel" , aDialogType ) ) >++ { >++ strcat( lDialogString , >++");if [ $? = 1 ];then echo 0;elif [ $szAnswer = \"No\" ];then echo 2;else echo 1;fi"); >++ } >++ else >++ { >++ strcat( lDialogString , ");if [ $? = 0 ];then echo 1;else echo 0;fi"); >++ } >++ } >+ >+- if ( aDialogType && ! strcmp( "yesnocancel" , aDialogType ) ) >+- { >+- strcat(lDialogString, ");\n\ >++ else if (tfd_yadPresent()) >++ { >++ if (aTitle && !strcmp(aTitle, "tinyfd_query")) { strcpy(tinyfd_response, "yad"); return 1; } >++ strcpy(lDialogString, "szAnswer=$(yad --"); >++ if (aDialogType && !strcmp("ok", aDialogType)) >++ { >++ strcat(lDialogString,"button=Ok:1"); >++ } >++ else if (aDialogType && !strcmp("okcancel", aDialogType)) >++ { >++ strcat(lDialogString,"button=Ok:1 --button=Cancel:0"); >++ } >++ else if (aDialogType && !strcmp("yesno", aDialogType)) >++ { >++ strcat(lDialogString, "button=Yes:1 --button=No:0"); >++ } >++ else if (aDialogType && !strcmp("yesnocancel", aDialogType)) >++ { >++ strcat(lDialogString, "button=Yes:1 --button=No:2 --button=Cancel:0"); >++ } >++ else if (aIconType && !strcmp("error", aIconType)) >++ { >++ strcat(lDialogString, "error"); >++ } >++ else if (aIconType && !strcmp("warning", aIconType)) >++ { >++ strcat(lDialogString, "warning"); >++ } >++ else >++ { >++ strcat(lDialogString, "info"); >++ } >++ if (aTitle && strlen(aTitle)) >++ { >++ strcat(lDialogString, " --title=\""); >++ strcat(lDialogString, aTitle); >++ strcat(lDialogString, "\""); >++ } >++ if (aMessage && strlen(aMessage)) >++ { >++ strcat(lDialogString, " --text=\""); >++ strcat(lDialogString, aMessage); >++ strcat(lDialogString, "\""); >++ } >++ >++ strcat(lDialogString, " --image=dialog-"); >++ if (aIconType && (!strcmp("question", aIconType) >++ || !strcmp("error", aIconType) >++ || !strcmp("warning", aIconType))) >++ { >++ strcat(lDialogString, aIconType); >++ } >++ else >++ { >++ strcat(lDialogString, "information"); >++ } >++ >++ if (tinyfd_silent) strcat(lDialogString, " 2>/dev/null "); >++ strcat(lDialogString,");echo $?"); >++ } >++ >++ else if ( !gxmessagePresent() && !gmessagePresent() && !gdialogPresent() && !xdialogPresent() && tkinter3Present() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python3-tkinter");return 1;} >++ >++ strcpy( lDialogString , gPython3Name ) ; >++ strcat( lDialogString , >++ " -S -c \"import tkinter;from tkinter import messagebox;root=tkinter.Tk();root.withdraw();"); >++ >++ strcat( lDialogString ,"res=messagebox." ) ; >++ if ( aDialogType && ! strcmp( "okcancel" , aDialogType ) ) >++ { >++ strcat( lDialogString , "askokcancel(" ) ; >++ if ( aDefaultButton ) >++ { >++ strcat( lDialogString , "default=messagebox.OK," ) ; >++ } >++ else >++ { >++ strcat( lDialogString , "default=messagebox.CANCEL," ) ; >++ } >++ } >++ else if ( aDialogType && ! strcmp( "yesno" , aDialogType ) ) >++ { >++ strcat( lDialogString , "askyesno(" ) ; >++ if ( aDefaultButton ) >++ { >++ strcat( lDialogString , "default=messagebox.YES," ) ; >++ } >++ else >++ { >++ strcat( lDialogString , "default=messagebox.NO," ) ; >++ } >++ } >++ else if ( aDialogType && ! strcmp( "yesnocancel" , aDialogType ) ) >++ { >++ strcat( lDialogString , "askyesnocancel(" ) ; >++ switch ( aDefaultButton ) >++ { >++ case 1: strcat( lDialogString , "default=messagebox.YES," ); break; >++ case 2: strcat( lDialogString , "default=messagebox.NO," ); break; >++ case 0: strcat( lDialogString , "default=messagebox.CANCEL," ); break; >++ } >++ } >++ else >++ { >++ strcat( lDialogString , "showinfo(" ) ; >++ } >++ >++ strcat( lDialogString , "icon='" ) ; >++ if ( aIconType && (! strcmp( "question" , aIconType ) >++ || ! strcmp( "error" , aIconType ) >++ || ! strcmp( "warning" , aIconType ) ) ) >++ { >++ strcat( lDialogString , aIconType ) ; >++ } >++ else >++ { >++ strcat( lDialogString , "info" ) ; >++ } >++ >++ strcat(lDialogString, "',") ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "title='") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "',") ; >++ } >++ if ( aMessage && strlen(aMessage) ) >++ { >++ strcat(lDialogString, "message='") ; >++ lpDialogString = lDialogString + strlen(lDialogString); >++ tfd_replaceSubStr( aMessage , "\n" , "\\n" , lpDialogString ) ; >++ strcat(lDialogString, "'") ; >++ } >++ >++ if ( aDialogType && ! strcmp( "yesnocancel" , aDialogType ) ) >++ { >++ strcat(lDialogString, ");\n\ >+ if res is None :\n\tprint(0)\n\ >+ elif res is False :\n\tprint(2)\n\ >+ else :\n\tprint (1)\n\"" ) ; >+- } >+- else >+- { >+- strcat(lDialogString, ");\n\ >++ } >++ else >++ { >++ strcat(lDialogString, ");\n\ >+ if res is False :\n\tprint(0)\n\ >+ else :\n\tprint(1)\n\"" ) ; >+- } >+- } >+- else if ( !gxmessagePresent() && !gmessagePresent() && !gdialogPresent() && !xdialogPresent() && tkinter2Present() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python2-tkinter");return 1;} >+- strcpy( lDialogString , "export PYTHONIOENCODING=utf-8;" ) ; >+- strcat( lDialogString , gPython2Name ) ; >+- if ( ! isTerminalRunning( ) && tfd_isDarwin( ) ) >+- { >+- strcat( lDialogString , " -i" ) ; /* for osx without console */ >+- } >++ } >++ } >++ else if ( !gxmessagePresent() && !gmessagePresent() && !gdialogPresent() && !xdialogPresent() && tkinter2Present() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python2-tkinter");return 1;} >++ strcpy( lDialogString , "export PYTHONIOENCODING=utf-8;" ) ; >++ strcat( lDialogString , gPython2Name ) ; >++ if ( ! isTerminalRunning( ) && tfd_isDarwin( ) ) >++ { >++ strcat( lDialogString , " -i" ) ; /* for osx without console */ >++ } >+ >+- strcat( lDialogString , >++ strcat( lDialogString , >+ " -S -c \"import Tkinter,tkMessageBox;root=Tkinter.Tk();root.withdraw();"); >+ >+- if ( tfd_isDarwin( ) ) >+- { >+- strcat( lDialogString , >++ if ( tfd_isDarwin( ) ) >++ { >++ strcat( lDialogString , >+ "import os;os.system('''/usr/bin/osascript -e 'tell app \\\"Finder\\\" to set \ >+ frontmost of process \\\"Python\\\" to true' ''');"); >+- } >++ } >+ >+- strcat( lDialogString ,"res=tkMessageBox." ) ; >+- if ( aDialogType && ! strcmp( "okcancel" , aDialogType ) ) >+- { >+- strcat( lDialogString , "askokcancel(" ) ; >+- if ( aDefaultButton ) >+- { >+- strcat( lDialogString , "default=tkMessageBox.OK," ) ; >+- } >+- else >+- { >+- strcat( lDialogString , "default=tkMessageBox.CANCEL," ) ; >+- } >+- } >+- else if ( aDialogType && ! strcmp( "yesno" , aDialogType ) ) >+- { >+- strcat( lDialogString , "askyesno(" ) ; >+- if ( aDefaultButton ) >+- { >+- strcat( lDialogString , "default=tkMessageBox.YES," ) ; >+- } >+- else >+- { >+- strcat( lDialogString , "default=tkMessageBox.NO," ) ; >+- } >+- } >+- else if ( aDialogType && ! strcmp( "yesnocancel" , aDialogType ) ) >+- { >+- strcat( lDialogString , "askyesnocancel(" ) ; >+- switch ( aDefaultButton ) >+- { >+- case 1: strcat( lDialogString , "default=tkMessageBox.YES," ); break; >+- case 2: strcat( lDialogString , "default=tkMessageBox.NO," ); break; >+- case 0: strcat( lDialogString , "default=tkMessageBox.CANCEL," ); break; >+- } >+- } >+- else >+- { >+- strcat( lDialogString , "showinfo(" ) ; >+- } >++ strcat( lDialogString ,"res=tkMessageBox." ) ; >++ if ( aDialogType && ! strcmp( "okcancel" , aDialogType ) ) >++ { >++ strcat( lDialogString , "askokcancel(" ) ; >++ if ( aDefaultButton ) >++ { >++ strcat( lDialogString , "default=tkMessageBox.OK," ) ; >++ } >++ else >++ { >++ strcat( lDialogString , "default=tkMessageBox.CANCEL," ) ; >++ } >++ } >++ else if ( aDialogType && ! strcmp( "yesno" , aDialogType ) ) >++ { >++ strcat( lDialogString , "askyesno(" ) ; >++ if ( aDefaultButton ) >++ { >++ strcat( lDialogString , "default=tkMessageBox.YES," ) ; >++ } >++ else >++ { >++ strcat( lDialogString , "default=tkMessageBox.NO," ) ; >++ } >++ } >++ else if ( aDialogType && ! strcmp( "yesnocancel" , aDialogType ) ) >++ { >++ strcat( lDialogString , "askyesnocancel(" ) ; >++ switch ( aDefaultButton ) >++ { >++ case 1: strcat( lDialogString , "default=tkMessageBox.YES," ); break; >++ case 2: strcat( lDialogString , "default=tkMessageBox.NO," ); break; >++ case 0: strcat( lDialogString , "default=tkMessageBox.CANCEL," ); break; >++ } >++ } >++ else >++ { >++ strcat( lDialogString , "showinfo(" ) ; >++ } >+ >+- strcat( lDialogString , "icon='" ) ; >+- if ( aIconType && (! strcmp( "question" , aIconType ) >+- || ! strcmp( "error" , aIconType ) >+- || ! strcmp( "warning" , aIconType ) ) ) >+- { >+- strcat( lDialogString , aIconType ) ; >+- } >+- else >+- { >+- strcat( lDialogString , "info" ) ; >+- } >++ strcat( lDialogString , "icon='" ) ; >++ if ( aIconType && (! strcmp( "question" , aIconType ) >++ || ! strcmp( "error" , aIconType ) >++ || ! strcmp( "warning" , aIconType ) ) ) >++ { >++ strcat( lDialogString , aIconType ) ; >++ } >++ else >++ { >++ strcat( lDialogString , "info" ) ; >++ } >+ >+- strcat(lDialogString, "',") ; >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "title='") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "',") ; >+- } >+- if ( aMessage && strlen(aMessage) ) >+- { >+- strcat(lDialogString, "message='") ; >+- lpDialogString = lDialogString + strlen(lDialogString); >+- tfd_replaceSubStr( aMessage , "\n" , "\\n" , lpDialogString ) ; >+- strcat(lDialogString, "'") ; >+- } >++ strcat(lDialogString, "',") ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "title='") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "',") ; >++ } >++ if ( aMessage && strlen(aMessage) ) >++ { >++ strcat(lDialogString, "message='") ; >++ lpDialogString = lDialogString + strlen(lDialogString); >++ tfd_replaceSubStr( aMessage , "\n" , "\\n" , lpDialogString ) ; >++ strcat(lDialogString, "'") ; >++ } >+ >+- if ( aDialogType && ! strcmp( "yesnocancel" , aDialogType ) ) >+- { >+- strcat(lDialogString, ");\n\ >++ if ( aDialogType && ! strcmp( "yesnocancel" , aDialogType ) ) >++ { >++ strcat(lDialogString, ");\n\ >+ if res is None :\n\tprint 0\n\ >+ elif res is False :\n\tprint 2\n\ >+ else :\n\tprint 1\n\"" ) ; >+- } >+- else >+- { >+- strcat(lDialogString, ");\n\ >++ } >++ else >++ { >++ strcat(lDialogString, ");\n\ >+ if res is False :\n\tprint 0\n\ >+ else :\n\tprint 1\n\"" ) ; >+- } >+- } >+- else if ( gxmessagePresent() || gmessagePresent() || (!gdialogPresent() && !xdialogPresent() && xmessagePresent()) ) >+- { >+- if ( gxmessagePresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"gxmessage");return 1;} >+- strcpy( lDialogString , "gxmessage"); >+- } >+- else if ( gmessagePresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"gmessage");return 1;} >+- strcpy( lDialogString , "gmessage"); >+- } >+- else >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"xmessage");return 1;} >+- strcpy( lDialogString , "xmessage"); >+- } >++ } >++ } >++ else if ( gxmessagePresent() || gmessagePresent() || (!gdialogPresent() && !xdialogPresent() && xmessagePresent()) ) >++ { >++ if ( gxmessagePresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"gxmessage");return 1;} >++ strcpy( lDialogString , "gxmessage"); >++ } >++ else if ( gmessagePresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"gmessage");return 1;} >++ strcpy( lDialogString , "gmessage"); >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"xmessage");return 1;} >++ strcpy( lDialogString , "xmessage"); >++ } >+ >+- if ( aDialogType && ! strcmp("okcancel" , aDialogType) ) >+- { >+- strcat( lDialogString , " -buttons Ok:1,Cancel:0"); >+- switch ( aDefaultButton ) >+- { >+- case 1: strcat( lDialogString , " -default Ok"); break; >+- case 0: strcat( lDialogString , " -default Cancel"); break; >+- } >+- } >+- else if ( aDialogType && ! strcmp("yesno" , aDialogType) ) >+- { >+- strcat( lDialogString , " -buttons Yes:1,No:0"); >+- switch ( aDefaultButton ) >+- { >+- case 1: strcat( lDialogString , " -default Yes"); break; >+- case 0: strcat( lDialogString , " -default No"); break; >+- } >+- } >+- else if ( aDialogType && ! strcmp("yesnocancel" , aDialogType) ) >+- { >+- strcat( lDialogString , " -buttons Yes:1,No:2,Cancel:0"); >+- switch ( aDefaultButton ) >+- { >+- case 1: strcat( lDialogString , " -default Yes"); break; >+- case 2: strcat( lDialogString , " -default No"); break; >+- case 0: strcat( lDialogString , " -default Cancel"); break; >+- } >+- } >+- else >+- { >+- strcat( lDialogString , " -buttons Ok:1"); >+- strcat( lDialogString , " -default Ok"); >+- } >++ if ( aDialogType && ! strcmp("okcancel" , aDialogType) ) >++ { >++ strcat( lDialogString , " -buttons Ok:1,Cancel:0"); >++ switch ( aDefaultButton ) >++ { >++ case 1: strcat( lDialogString , " -default Ok"); break; >++ case 0: strcat( lDialogString , " -default Cancel"); break; >++ } >++ } >++ else if ( aDialogType && ! strcmp("yesno" , aDialogType) ) >++ { >++ strcat( lDialogString , " -buttons Yes:1,No:0"); >++ switch ( aDefaultButton ) >++ { >++ case 1: strcat( lDialogString , " -default Yes"); break; >++ case 0: strcat( lDialogString , " -default No"); break; >++ } >++ } >++ else if ( aDialogType && ! strcmp("yesnocancel" , aDialogType) ) >++ { >++ strcat( lDialogString , " -buttons Yes:1,No:2,Cancel:0"); >++ switch ( aDefaultButton ) >++ { >++ case 1: strcat( lDialogString , " -default Yes"); break; >++ case 2: strcat( lDialogString , " -default No"); break; >++ case 0: strcat( lDialogString , " -default Cancel"); break; >++ } >++ } >++ else >++ { >++ strcat( lDialogString , " -buttons Ok:1"); >++ strcat( lDialogString , " -default Ok"); >++ } >+ >+- strcat( lDialogString , " -center \""); >+- if ( aMessage && strlen(aMessage) ) >+- { >+- strcat( lDialogString , aMessage ) ; >+- } >+- strcat(lDialogString, "\"" ) ; >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat( lDialogString , " -title \""); >+- strcat( lDialogString , aTitle ) ; >+- strcat( lDialogString, "\"" ) ; >+- } >+- strcat( lDialogString , " ; echo $? "); >+- } >+- else if ( xdialogPresent() || gdialogPresent() || dialogName() || whiptailPresent() ) >+- { >+- if ( gdialogPresent( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"gdialog");return 1;} >+- lWasGraphicDialog = 1 ; >+- strcpy( lDialogString , "(gdialog " ) ; >+- } >+- else if ( xdialogPresent( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"xdialog");return 1;} >+- lWasGraphicDialog = 1 ; >+- strcpy( lDialogString , "(Xdialog " ) ; >+- } >+- else if ( dialogName( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"dialog");return 0;} >+- if ( isTerminalRunning( ) ) >+- { >+- strcpy( lDialogString , "(dialog " ) ; >+- } >+- else >+- { >+- lWasXterm = 1 ; >+- strcpy( lDialogString , terminalName() ) ; >+- strcat( lDialogString , "'(" ) ; >+- strcat( lDialogString , dialogName() ) ; >+- strcat( lDialogString , " " ) ; >+- } >+- } >+- else if ( isTerminalRunning( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"whiptail");return 0;} >+- strcpy( lDialogString , "(whiptail " ) ; >+- } >+- else >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"whiptail");return 0;} >+- lWasXterm = 1 ; >+- strcpy( lDialogString , terminalName() ) ; >+- strcat( lDialogString , "'(whiptail " ) ; >+- } >++ strcat( lDialogString , " -center \""); >++ if ( aMessage && strlen(aMessage) ) >++ { >++ strcat( lDialogString , aMessage ) ; >++ } >++ strcat(lDialogString, "\"" ) ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat( lDialogString , " -title \""); >++ strcat( lDialogString , aTitle ) ; >++ strcat( lDialogString, "\"" ) ; >++ } >++ strcat( lDialogString , " ; echo $? "); >++ } >++ else if ( xdialogPresent() || gdialogPresent() || dialogName() || whiptailPresent() ) >++ { >++ if ( gdialogPresent( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"gdialog");return 1;} >++ lWasGraphicDialog = 1 ; >++ strcpy( lDialogString , "(gdialog " ) ; >++ } >++ else if ( xdialogPresent( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"xdialog");return 1;} >++ lWasGraphicDialog = 1 ; >++ strcpy( lDialogString , "(Xdialog " ) ; >++ } >++ else if ( dialogName( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"dialog");return 0;} >++ if ( isTerminalRunning( ) ) >++ { >++ strcpy( lDialogString , "(dialog " ) ; >++ } >++ else >++ { >++ lWasXterm = 1 ; >++ strcpy( lDialogString , terminalName() ) ; >++ strcat( lDialogString , "'(" ) ; >++ strcat( lDialogString , dialogName() ) ; >++ strcat( lDialogString , " " ) ; >++ } >++ } >++ else if ( isTerminalRunning( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"whiptail");return 0;} >++ strcpy( lDialogString , "(whiptail " ) ; >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"whiptail");return 0;} >++ lWasXterm = 1 ; >++ strcpy( lDialogString , terminalName() ) ; >++ strcat( lDialogString , "'(whiptail " ) ; >++ } >+ >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "--title \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\" ") ; >+- } >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "--title \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\" ") ; >++ } >+ >+- if ( !xdialogPresent() && !gdialogPresent() ) >+- { >+- if ( aDialogType && ( !strcmp( "okcancel" , aDialogType ) || !strcmp( "yesno" , aDialogType ) >+- || !strcmp( "yesnocancel" , aDialogType ) ) ) >+- { >+- strcat(lDialogString, "--backtitle \"") ; >+- strcat(lDialogString, "tab: move focus") ; >+- strcat(lDialogString, "\" ") ; >+- } >+- } >++ if ( !xdialogPresent() && !gdialogPresent() ) >++ { >++ if ( aDialogType && ( !strcmp( "okcancel" , aDialogType ) || !strcmp( "yesno" , aDialogType ) >++ || !strcmp( "yesnocancel" , aDialogType ) ) ) >++ { >++ strcat(lDialogString, "--backtitle \"") ; >++ strcat(lDialogString, "tab: move focus") ; >++ strcat(lDialogString, "\" ") ; >++ } >++ } >+ >+- if ( aDialogType && ! strcmp( "okcancel" , aDialogType ) ) >+- { >+- if ( ! aDefaultButton ) >+- { >+- strcat( lDialogString , "--defaultno " ) ; >+- } >+- strcat( lDialogString , >+- "--yes-label \"Ok\" --no-label \"Cancel\" --yesno " ) ; >+- } >+- else if ( aDialogType && ! strcmp( "yesno" , aDialogType ) ) >+- { >+- if ( ! aDefaultButton ) >+- { >+- strcat( lDialogString , "--defaultno " ) ; >+- } >+- strcat( lDialogString , "--yesno " ) ; >+- } >+- else if (aDialogType && !strcmp("yesnocancel", aDialogType)) >+- { >+- if (!aDefaultButton) >+- { >+- strcat(lDialogString, "--defaultno "); >+- } >+- strcat(lDialogString, "--menu "); >+- } >+- else >+- { >+- strcat( lDialogString , "--msgbox " ) ; >++ if ( aDialogType && ! strcmp( "okcancel" , aDialogType ) ) >++ { >++ if ( ! aDefaultButton ) >++ { >++ strcat( lDialogString , "--defaultno " ) ; >++ } >++ strcat( lDialogString , >++ "--yes-label \"Ok\" --no-label \"Cancel\" --yesno " ) ; >++ } >++ else if ( aDialogType && ! strcmp( "yesno" , aDialogType ) ) >++ { >++ if ( ! aDefaultButton ) >++ { >++ strcat( lDialogString , "--defaultno " ) ; >++ } >++ strcat( lDialogString , "--yesno " ) ; >++ } >++ else if (aDialogType && !strcmp("yesnocancel", aDialogType)) >++ { >++ if (!aDefaultButton) >++ { >++ strcat(lDialogString, "--defaultno "); >++ } >++ strcat(lDialogString, "--menu "); >++ } >++ else >++ { >++ strcat( lDialogString , "--msgbox " ) ; >+ >+- } >+- strcat( lDialogString , "\"" ) ; >+- if ( aMessage && strlen(aMessage) ) >+- { >+- strcat(lDialogString, aMessage) ; >+- } >+- strcat(lDialogString, "\" "); >++ } >++ strcat( lDialogString , "\"" ) ; >++ if ( aMessage && strlen(aMessage) ) >++ { >++ strcat(lDialogString, aMessage) ; >++ } >++ strcat(lDialogString, "\" "); >+ >+- if ( lWasGraphicDialog ) >+- { >+- if (aDialogType && !strcmp("yesnocancel", aDialogType)) >+- { >+- strcat(lDialogString,"0 60 0 Yes \"\" No \"\") 2>/tmp/tinyfd.txt;\ >++ if ( lWasGraphicDialog ) >++ { >++ if (aDialogType && !strcmp("yesnocancel", aDialogType)) >++ { >++ strcat(lDialogString,"0 60 0 Yes \"\" No \"\") 2>/tmp/tinyfd.txt;\ >+ if [ $? = 0 ];then tinyfdBool=1;else tinyfdBool=0;fi;\ >+ tinyfdRes=$(cat /tmp/tinyfd.txt);echo $tinyfdBool$tinyfdRes") ; >+- } >+- else >+- { >+- strcat(lDialogString, >+- "10 60 ) 2>&1;if [ $? = 0 ];then echo 1;else echo 0;fi"); >+- } >+- } >+- else >+- { >+- if (aDialogType && !strcmp("yesnocancel", aDialogType)) >+- { >+- strcat(lDialogString,"0 60 0 Yes \"\" No \"\" >/dev/tty ) 2>/tmp/tinyfd.txt;\ >+- if [ $? = 0 ];then tinyfdBool=1;else tinyfdBool=0;fi;\ >+- tinyfdRes=$(cat /tmp/tinyfd.txt);echo $tinyfdBool$tinyfdRes") ; >++ } >++ else >++ { >++ strcat(lDialogString, >++ "10 60 ) 2>&1;if [ $? = 0 ];then echo 1;else echo 0;fi"); >++ } >++ } >++ else >++ { >++ if (aDialogType && !strcmp("yesnocancel", aDialogType)) >++ { >++ strcat(lDialogString,"0 60 0 Yes \"\" No \"\" >/dev/tty ) 2>/tmp/tinyfd.txt;\ >++ if [ $? = 0 ];then tinyfdBool=1;else tinyfdBool=0;fi;\ >++ tinyfdRes=$(cat /tmp/tinyfd.txt);echo $tinyfdBool$tinyfdRes") ; >+ >+- if ( lWasXterm ) >+- { >+- strcat(lDialogString," >/tmp/tinyfd0.txt';cat /tmp/tinyfd0.txt"); >+- } >+- else >+- { >+- strcat(lDialogString, "; clear >/dev/tty") ; >+- } >+- } >+- else >+- { >+- strcat(lDialogString, "10 60 >/dev/tty) 2>&1;if [ $? = 0 ];"); >+- if ( lWasXterm ) >+- { >+- strcat( lDialogString , >++ if ( lWasXterm ) >++ { >++ strcat(lDialogString," >/tmp/tinyfd0.txt';cat /tmp/tinyfd0.txt"); >++ } >++ else >++ { >++ strcat(lDialogString, "; clear >/dev/tty") ; >++ } >++ } >++ else >++ { >++ strcat(lDialogString, "10 60 >/dev/tty) 2>&1;if [ $? = 0 ];"); >++ if ( lWasXterm ) >++ { >++ strcat( lDialogString , >+ "then\n\techo 1\nelse\n\techo 0\nfi >/tmp/tinyfd.txt';cat /tmp/tinyfd.txt;rm /tmp/tinyfd.txt"); >+- } >+- else >+- { >+- strcat(lDialogString, >+- "then echo 1;else echo 0;fi;clear >/dev/tty"); >+- } >+- } >+- } >+- } >+- else if ( !isTerminalRunning() && terminalName() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"basicinput");return 0;} >+- strcpy( lDialogString , terminalName() ) ; >+- strcat( lDialogString , "'" ) ; >+- if ( !gWarningDisplayed && !tinyfd_forceConsole) >+- { >+- gWarningDisplayed = 1 ; >+- strcat( lDialogString , "echo \"" ) ; >+- strcat( lDialogString, gTitle) ; >+- strcat( lDialogString , "\";" ) ; >+- strcat( lDialogString , "echo \"" ) ; >+- strcat( lDialogString, tinyfd_needs) ; >+- strcat( lDialogString , "\";echo;echo;" ) ; >+- } >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat( lDialogString , "echo \"" ) ; >+- strcat( lDialogString, aTitle) ; >+- strcat( lDialogString , "\";echo;" ) ; >+- } >+- if ( aMessage && strlen(aMessage) ) >+- { >+- strcat( lDialogString , "echo \"" ) ; >+- strcat( lDialogString, aMessage) ; >+- strcat( lDialogString , "\"; " ) ; >+- } >+- if ( aDialogType && !strcmp("yesno",aDialogType) ) >+- { >+- strcat( lDialogString , "echo -n \"y/n: \"; " ) ; >+- strcat( lDialogString , "stty sane -echo;" ) ; >+- strcat( lDialogString , >+- "answer=$( while ! head -c 1 | grep -i [ny];do true ;done);"); >+- strcat( lDialogString , >+- "if echo \"$answer\" | grep -iq \"^y\";then\n"); >+- strcat( lDialogString , "\techo 1\nelse\n\techo 0\nfi" ) ; >+- } >+- else if ( aDialogType && !strcmp("okcancel",aDialogType) ) >+- { >+- strcat( lDialogString , "echo -n \"[O]kay/[C]ancel: \"; " ) ; >+- strcat( lDialogString , "stty sane -echo;" ) ; >+- strcat( lDialogString , >+- "answer=$( while ! head -c 1 | grep -i [oc];do true ;done);"); >+- strcat( lDialogString , >+- "if echo \"$answer\" | grep -iq \"^o\";then\n"); >+- strcat( lDialogString , "\techo 1\nelse\n\techo 0\nfi" ) ; >+- } >+- else if ( aDialogType && !strcmp("yesnocancel",aDialogType) ) >+- { >+- strcat( lDialogString , "echo -n \"[Y]es/[N]o/[C]ancel: \"; " ) ; >+- strcat( lDialogString , "stty sane -echo;" ) ; >+- strcat( lDialogString , >+- "answer=$( while ! head -c 1 | grep -i [nyc];do true ;done);"); >+- strcat( lDialogString , >+- "if echo \"$answer\" | grep -iq \"^y\";then\n\techo 1\n"); >+- strcat( lDialogString , "elif echo \"$answer\" | grep -iq \"^n\";then\n\techo 2\n" ) ; >+- strcat( lDialogString , "else\n\techo 0\nfi" ) ; >+- } >+- else >+- { >+- strcat(lDialogString , "echo -n \"press enter to continue \"; "); >+- strcat( lDialogString , "stty sane -echo;" ) ; >+- strcat( lDialogString , >+- "answer=$( while ! head -c 1;do true ;done);echo 1"); >+- } >+- strcat( lDialogString , >+- " >/tmp/tinyfd.txt';cat /tmp/tinyfd.txt;rm /tmp/tinyfd.txt"); >+- } >+- else if ( !isTerminalRunning() && pythonDbusPresent() && !strcmp("ok" , aDialogType) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python-dbus");return 1;} >+- strcpy( lDialogString , gPythonName ) ; >+- strcat( lDialogString ," -c \"import dbus;bus=dbus.SessionBus();"); >+- strcat( lDialogString ,"notif=bus.get_object('org.freedesktop.Notifications','/org/freedesktop/Notifications');" ) ; >+- strcat( lDialogString ,"notify=dbus.Interface(notif,'org.freedesktop.Notifications');" ) ; >+- strcat( lDialogString ,"notify.Notify('',0,'" ) ; >+- if ( aIconType && strlen(aIconType) ) >+- { >+- strcat( lDialogString , aIconType ) ; >+- } >+- strcat(lDialogString, "','") ; >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, aTitle) ; >+- } >+- strcat(lDialogString, "','") ; >+- if ( aMessage && strlen(aMessage) ) >+- { >+- lpDialogString = lDialogString + strlen(lDialogString); >+- tfd_replaceSubStr( aMessage , "\n" , "\\n" , lpDialogString ) ; >+- } >+- strcat(lDialogString, "','','',5000)\"") ; >+- } >+- else if ( !isTerminalRunning() && (perlPresent() >= 2) && !strcmp("ok" , aDialogType) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"perl-dbus");return 1;} >++ } >++ else >++ { >++ strcat(lDialogString, >++ "then echo 1;else echo 0;fi;clear >/dev/tty"); >++ } >++ } >++ } >++ } >++ else if ( !isTerminalRunning() && terminalName() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"basicinput");return 0;} >++ strcpy( lDialogString , terminalName() ) ; >++ strcat( lDialogString , "'" ) ; >++ if ( !gWarningDisplayed && !tinyfd_forceConsole) >++ { >++ gWarningDisplayed = 1 ; >++ strcat( lDialogString , "echo \"" ) ; >++ strcat( lDialogString, gTitle) ; >++ strcat( lDialogString , "\";" ) ; >++ strcat( lDialogString , "echo \"" ) ; >++ strcat( lDialogString, tinyfd_needs) ; >++ strcat( lDialogString , "\";echo;echo;" ) ; >++ } >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat( lDialogString , "echo \"" ) ; >++ strcat( lDialogString, aTitle) ; >++ strcat( lDialogString , "\";echo;" ) ; >++ } >++ if ( aMessage && strlen(aMessage) ) >++ { >++ strcat( lDialogString , "echo \"" ) ; >++ strcat( lDialogString, aMessage) ; >++ strcat( lDialogString , "\"; " ) ; >++ } >++ if ( aDialogType && !strcmp("yesno",aDialogType) ) >++ { >++ strcat( lDialogString , "echo -n \"y/n: \"; " ) ; >++ strcat( lDialogString , "stty sane -echo;" ) ; >++ strcat( lDialogString , >++ "answer=$( while ! head -c 1 | grep -i [ny];do true ;done);"); >++ strcat( lDialogString , >++ "if echo \"$answer\" | grep -iq \"^y\";then\n"); >++ strcat( lDialogString , "\techo 1\nelse\n\techo 0\nfi" ) ; >++ } >++ else if ( aDialogType && !strcmp("okcancel",aDialogType) ) >++ { >++ strcat( lDialogString , "echo -n \"[O]kay/[C]ancel: \"; " ) ; >++ strcat( lDialogString , "stty sane -echo;" ) ; >++ strcat( lDialogString , >++ "answer=$( while ! head -c 1 | grep -i [oc];do true ;done);"); >++ strcat( lDialogString , >++ "if echo \"$answer\" | grep -iq \"^o\";then\n"); >++ strcat( lDialogString , "\techo 1\nelse\n\techo 0\nfi" ) ; >++ } >++ else if ( aDialogType && !strcmp("yesnocancel",aDialogType) ) >++ { >++ strcat( lDialogString , "echo -n \"[Y]es/[N]o/[C]ancel: \"; " ) ; >++ strcat( lDialogString , "stty sane -echo;" ) ; >++ strcat( lDialogString , >++ "answer=$( while ! head -c 1 | grep -i [nyc];do true ;done);"); >++ strcat( lDialogString , >++ "if echo \"$answer\" | grep -iq \"^y\";then\n\techo 1\n"); >++ strcat( lDialogString , "elif echo \"$answer\" | grep -iq \"^n\";then\n\techo 2\n" ) ; >++ strcat( lDialogString , "else\n\techo 0\nfi" ) ; >++ } >++ else >++ { >++ strcat(lDialogString , "echo -n \"press enter to continue \"; "); >++ strcat( lDialogString , "stty sane -echo;" ) ; >++ strcat( lDialogString , >++ "answer=$( while ! head -c 1;do true ;done);echo 1"); >++ } >++ strcat( lDialogString , >++ " >/tmp/tinyfd.txt';cat /tmp/tinyfd.txt;rm /tmp/tinyfd.txt"); >++ } >++ else if ( !isTerminalRunning() && pythonDbusPresent() && !strcmp("ok" , aDialogType) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python-dbus");return 1;} >++ strcpy( lDialogString , gPythonName ) ; >++ strcat( lDialogString ," -c \"import dbus;bus=dbus.SessionBus();"); >++ strcat( lDialogString ,"notif=bus.get_object('org.freedesktop.Notifications','/org/freedesktop/Notifications');" ) ; >++ strcat( lDialogString ,"notify=dbus.Interface(notif,'org.freedesktop.Notifications');" ) ; >++ strcat( lDialogString ,"notify.Notify('',0,'" ) ; >++ if ( aIconType && strlen(aIconType) ) >++ { >++ strcat( lDialogString , aIconType ) ; >++ } >++ strcat(lDialogString, "','") ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, aTitle) ; >++ } >++ strcat(lDialogString, "','") ; >++ if ( aMessage && strlen(aMessage) ) >++ { >++ lpDialogString = lDialogString + strlen(lDialogString); >++ tfd_replaceSubStr( aMessage , "\n" , "\\n" , lpDialogString ) ; >++ } >++ strcat(lDialogString, "','','',5000)\"") ; >++ } >++ else if ( !isTerminalRunning() && (perlPresent() >= 2) && !strcmp("ok" , aDialogType) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"perl-dbus");return 1;} >+ >+- strcpy( lDialogString , "perl -e \"use Net::DBus;\ >++ strcpy( lDialogString , "perl -e \"use Net::DBus;\ >+ my \\$sessionBus = Net::DBus->session;\ >+ my \\$notificationsService = \\$sessionBus->get_service('org.freedesktop.Notifications');\ >+ my \\$notificationsObject = \\$notificationsService->get_object('/org/freedesktop/Notifications',\ >+ 'org.freedesktop.Notifications');"); >+ >+- sprintf( lDialogString + strlen(lDialogString), >++ sprintf( lDialogString + strlen(lDialogString), >+ "my \\$notificationId;\\$notificationId = \\$notificationsObject->Notify(shift, 0, '%s', '%s', '%s', [], {}, -1);\" ", >+- aIconType?aIconType:"", aTitle?aTitle:"", aMessage?aMessage:"" ) ; >+- } >+- else if ( !isTerminalRunning() && notifysendPresent() && !strcmp("ok" , aDialogType) ) >+- { >++ aIconType?aIconType:"", aTitle?aTitle:"", aMessage?aMessage:"" ) ; >++ } >++ else if ( !isTerminalRunning() && notifysendPresent() && !strcmp("ok" , aDialogType) ) >++ { >+ >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"notifysend");return 1;} >+- strcpy( lDialogString , "notify-send" ) ; >+- if ( aIconType && strlen(aIconType) ) >+- { >+- strcat( lDialogString , " -i '" ) ; >+- strcat( lDialogString , aIconType ) ; >+- strcat( lDialogString , "'" ) ; >+- } >+- strcat( lDialogString , " \"" ) ; >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, aTitle) ; >+- strcat( lDialogString , " | " ) ; >+- } >+- if ( aMessage && strlen(aMessage) ) >+- { >+- tfd_replaceSubStr( aMessage , "\n\t" , " | " , lBuff ) ; >+- tfd_replaceSubStr( aMessage , "\n" , " | " , lBuff ) ; >+- tfd_replaceSubStr( aMessage , "\t" , " " , lBuff ) ; >+- strcat(lDialogString, lBuff) ; >+- } >+- strcat( lDialogString , "\"" ) ; >+- } >+- else >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"basicinput");return 0;} >+- if ( !gWarningDisplayed && !tinyfd_forceConsole) >+- { >+- gWarningDisplayed = 1 ; >+- printf("\n\n%s\n", gTitle); >+- printf("%s\n\n", tinyfd_needs); >+- } >+- if ( aTitle && strlen(aTitle) ) >+- { >+- printf("\n%s\n", aTitle); >+- } >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"notifysend");return 1;} >++ strcpy( lDialogString , "notify-send" ) ; >++ if ( aIconType && strlen(aIconType) ) >++ { >++ strcat( lDialogString , " -i '" ) ; >++ strcat( lDialogString , aIconType ) ; >++ strcat( lDialogString , "'" ) ; >++ } >++ strcat( lDialogString , " \"" ) ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, aTitle) ; >++ strcat( lDialogString , " | " ) ; >++ } >++ if ( aMessage && strlen(aMessage) ) >++ { >++ tfd_replaceSubStr( aMessage , "\n\t" , " | " , lBuff ) ; >++ tfd_replaceSubStr( aMessage , "\n" , " | " , lBuff ) ; >++ tfd_replaceSubStr( aMessage , "\t" , " " , lBuff ) ; >++ strcat(lDialogString, lBuff) ; >++ } >++ strcat( lDialogString , "\"" ) ; >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"basicinput");return 0;} >++ if ( !gWarningDisplayed && !tinyfd_forceConsole) >++ { >++ gWarningDisplayed = 1 ; >++ printf("\n\n%s\n", gTitle); >++ printf("%s\n\n", tinyfd_needs); >++ } >++ if ( aTitle && strlen(aTitle) ) >++ { >++ printf("\n%s\n", aTitle); >++ } >+ >+- tcgetattr(0, &infoOri); >+- tcgetattr(0, &info); >+- info.c_lflag &= ~ICANON; >+- info.c_cc[VMIN] = 1; >+- info.c_cc[VTIME] = 0; >+- tcsetattr(0, TCSANOW, &info); >+- if ( aDialogType && !strcmp("yesno",aDialogType) ) >+- { >+- do >+- { >+- if ( aMessage && strlen(aMessage) ) >+- { >+- printf("\n%s\n",aMessage); >+- } >+- printf("y/n: "); fflush(stdout); >+- lChar = tolower( getchar() ) ; >+- printf("\n\n"); >+- } >+- while ( lChar != 'y' && lChar != 'n' ); >+- lResult = lChar == 'y' ? 1 : 0 ; >+- } >+- else if ( aDialogType && !strcmp("okcancel",aDialogType) ) >+- { >+- do >+- { >+- if ( aMessage && strlen(aMessage) ) >+- { >+- printf("\n%s\n",aMessage); >+- } >+- printf("[O]kay/[C]ancel: "); fflush(stdout); >+- lChar = tolower( getchar() ) ; >+- printf("\n\n"); >+- } >+- while ( lChar != 'o' && lChar != 'c' ); >+- lResult = lChar == 'o' ? 1 : 0 ; >+- } >+- else if ( aDialogType && !strcmp("yesnocancel",aDialogType) ) >+- { >+- do >+- { >+- if ( aMessage && strlen(aMessage) ) >+- { >+- printf("\n%s\n",aMessage); >+- } >+- printf("[Y]es/[N]o/[C]ancel: "); fflush(stdout); >+- lChar = tolower( getchar() ) ; >+- printf("\n\n"); >+- } >+- while ( lChar != 'y' && lChar != 'n' && lChar != 'c' ); >+- lResult = (lChar == 'y') ? 1 : (lChar == 'n') ? 2 : 0 ; >+- } >+- else >+- { >+- if ( aMessage && strlen(aMessage) ) >+- { >+- printf("\n%s\n\n",aMessage); >+- } >+- printf("press enter to continue "); fflush(stdout); >+- getchar() ; >+- printf("\n\n"); >+- lResult = 1 ; >+- } >+- tcsetattr(0, TCSANOW, &infoOri); >+- free(lDialogString); >+- return lResult ; >+- } >++ tcgetattr(0, &infoOri); >++ tcgetattr(0, &info); >++ info.c_lflag &= ~ICANON; >++ info.c_cc[VMIN] = 1; >++ info.c_cc[VTIME] = 0; >++ tcsetattr(0, TCSANOW, &info); >++ if ( aDialogType && !strcmp("yesno",aDialogType) ) >++ { >++ do >++ { >++ if ( aMessage && strlen(aMessage) ) >++ { >++ printf("\n%s\n",aMessage); >++ } >++ printf("y/n: "); fflush(stdout); >++ lChar = (char) tolower( getchar() ) ; >++ printf("\n\n"); >++ } >++ while ( lChar != 'y' && lChar != 'n' ); >++ lResult = lChar == 'y' ? 1 : 0 ; >++ } >++ else if ( aDialogType && !strcmp("okcancel",aDialogType) ) >++ { >++ do >++ { >++ if ( aMessage && strlen(aMessage) ) >++ { >++ printf("\n%s\n",aMessage); >++ } >++ printf("[O]kay/[C]ancel: "); fflush(stdout); >++ lChar = (char) tolower( getchar() ) ; >++ printf("\n\n"); >++ } >++ while ( lChar != 'o' && lChar != 'c' ); >++ lResult = lChar == 'o' ? 1 : 0 ; >++ } >++ else if ( aDialogType && !strcmp("yesnocancel",aDialogType) ) >++ { >++ do >++ { >++ if ( aMessage && strlen(aMessage) ) >++ { >++ printf("\n%s\n",aMessage); >++ } >++ printf("[Y]es/[N]o/[C]ancel: "); fflush(stdout); >++ lChar = (char) tolower( getchar() ) ; >++ printf("\n\n"); >++ } >++ while ( lChar != 'y' && lChar != 'n' && lChar != 'c' ); >++ lResult = (lChar == 'y') ? 1 : (lChar == 'n') ? 2 : 0 ; >++ } >++ else >++ { >++ if ( aMessage && strlen(aMessage) ) >++ { >++ printf("\n%s\n\n",aMessage); >++ } >++ printf("press enter to continue "); fflush(stdout); >++ getchar() ; >++ printf("\n\n"); >++ lResult = 1 ; >++ } >++ tcsetattr(0, TCSANOW, &infoOri); >++ free(lDialogString); >++ return lResult ; >++ } >+ >+- if (tinyfd_verbose) printf( "lDialogString: %s\n" , lDialogString ) ; >++ if (tinyfd_verbose) printf( "lDialogString: %s\n" , lDialogString ) ; >+ >+- if ( ! ( lIn = popen( lDialogString , "r" ) ) ) >+- { >+- free(lDialogString); >+- return 0 ; >+- } >+- while ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >+- {} >++ if ( ! ( lIn = popen( lDialogString , "r" ) ) ) >++ { >++ free(lDialogString); >++ return 0 ; >++ } >++ while ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >++ {} >+ >+- pclose( lIn ) ; >++ pclose( lIn ) ; >+ >+- /* printf( "lBuff: %s len: %lu \n" , lBuff , strlen(lBuff) ) ; */ >+- if ( lBuff[strlen( lBuff ) -1] == '\n' ) >+- { >+- lBuff[strlen( lBuff ) -1] = '\0' ; >+- } >+- /* printf( "lBuff1: %s len: %lu \n" , lBuff , strlen(lBuff) ) ; */ >++ /* printf( "lBuff: %s len: %lu \n" , lBuff , strlen(lBuff) ) ; */ >++ if ( strlen( lBuff ) && lBuff[strlen( lBuff ) -1] == '\n' ) >++ { >++ lBuff[strlen( lBuff ) -1] = '\0' ; >++ } >++ /* printf( "lBuff1: %s len: %lu \n" , lBuff , strlen(lBuff) ) ; */ >+ >+- if (aDialogType && !strcmp("yesnocancel", aDialogType)) >+- { >+- if ( lBuff[0]=='1' ) >+- { >+- if ( !strcmp( lBuff+1 , "Yes" )) strcpy(lBuff,"1"); >+- else if ( !strcmp( lBuff+1 , "No" )) strcpy(lBuff,"2"); >+- } >+- } >+- /* printf( "lBuff2: %s len: %lu \n" , lBuff , strlen(lBuff) ) ; */ >++ if (aDialogType && !strcmp("yesnocancel", aDialogType)) >++ { >++ if ( lBuff[0]=='1' ) >++ { >++ if ( !strcmp( lBuff+1 , "Yes" )) strcpy(lBuff,"1"); >++ else if ( !strcmp( lBuff+1 , "No" )) strcpy(lBuff,"2"); >++ } >++ } >++ /* printf( "lBuff2: %s len: %lu \n" , lBuff , strlen(lBuff) ) ; */ >+ >+- lResult = !strcmp( lBuff , "2" ) ? 2 : !strcmp( lBuff , "1" ) ? 1 : 0; >++ lResult = !strcmp( lBuff , "2" ) ? 2 : !strcmp( lBuff , "1" ) ? 1 : 0; >+ >+- /* printf( "lResult: %d\n" , lResult ) ; */ >+- free(lDialogString); >+- return lResult ; >++ /* printf( "lResult: %d\n" , lResult ) ; */ >++ free(lDialogString); >++ return lResult ; >+ } >+ >+ >+ /* return has only meaning for tinyfd_query */ >+ int tinyfd_notifyPopup( >+- char const * aTitle , /* NULL or "" */ >+- char const * aMessage , /* NULL or "" may contain \n and \t */ >+- char const * aIconType ) /* "info" "warning" "error" */ >++ char const * aTitle , /* NULL or "" */ >++ char const * aMessage , /* NULL or "" may contain \n and \t */ >++ char const * aIconType ) /* "info" "warning" "error" */ >+ { >+- char lBuff[MAX_PATH_OR_CMD]; >+- char * lDialogString = NULL ; >+- char * lpDialogString ; >+- FILE * lIn ; >+- size_t lTitleLen ; >+- size_t lMessageLen ; >++ char lBuff[MAX_PATH_OR_CMD]; >++ char * lDialogString = NULL ; >++ char * lpDialogString ; >++ FILE * lIn ; >++ size_t lTitleLen ; >++ size_t lMessageLen ; >+ >+- if (tfd_quoteDetected(aTitle)) return tinyfd_notifyPopup("INVALID TITLE WITH QUOTES", aMessage, aIconType); >+- if (tfd_quoteDetected(aMessage)) return tinyfd_notifyPopup(aTitle, "INVALID MESSAGE WITH QUOTES", aIconType); >++ if (tfd_quoteDetected(aTitle)) return tinyfd_notifyPopup("INVALID TITLE WITH QUOTES", aMessage, aIconType); >++ if (tfd_quoteDetected(aMessage)) return tinyfd_notifyPopup(aTitle, "INVALID MESSAGE WITH QUOTES", aIconType); >+ >+- if ( getenv("SSH_TTY") ) >+- { >+- return tinyfd_messageBox(aTitle, aMessage, "ok", aIconType, 0); >+- } >++ if ( getenv("SSH_TTY") && !dunstifyPresent() && !dunstPresent() ) >++ { >++ return tinyfd_messageBox(aTitle, aMessage, "ok", aIconType, 0); >++ } >+ >+- lTitleLen = aTitle ? strlen(aTitle) : 0 ; >+- lMessageLen = aMessage ? strlen(aMessage) : 0 ; >+- if ( !aTitle || strcmp(aTitle,"tinyfd_query") ) >+- { >+- lDialogString = (char *) malloc( MAX_PATH_OR_CMD + lTitleLen + lMessageLen ); >+- } >++ lTitleLen = aTitle ? strlen(aTitle) : 0 ; >++ lMessageLen = aMessage ? strlen(aMessage) : 0 ; >++ if ( !aTitle || strcmp(aTitle,"tinyfd_query") ) >++ { >++ lDialogString = (char *) malloc( MAX_PATH_OR_CMD + lTitleLen + lMessageLen ); >++ } >+ >+- if ( osascriptPresent( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"applescript");return 1;} >++ if ( getenv("SSH_TTY") ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"dunst");return 1;} >++ strcpy( lDialogString , "notify-send \"" ) ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat( lDialogString , aTitle ) ; >++ strcat( lDialogString , "\" \"" ) ; >++ } >++ if ( aMessage && strlen(aMessage) ) >++ { >++ strcat(lDialogString, aMessage) ; >++ } >++ strcat( lDialogString , "\"" ) ; >++ } >++ else if ( osascriptPresent( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"applescript");return 1;} >+ >+- strcpy( lDialogString , "osascript "); >+- if ( ! osx9orBetter() ) strcat( lDialogString , " -e 'tell application \"System Events\"' -e 'Activate'"); >+- strcat( lDialogString , " -e 'try' -e 'display notification \"") ; >+- if ( aMessage && strlen(aMessage) ) >+- { >+- strcat(lDialogString, aMessage) ; >+- } >+- strcat(lDialogString, " \" ") ; >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "with title \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\" ") ; >+- } >++ strcpy( lDialogString , "osascript "); >++ if ( ! osx9orBetter() ) strcat( lDialogString , " -e 'tell application \"System Events\"' -e 'Activate'"); >++ strcat( lDialogString , " -e 'try' -e 'display notification \"") ; >++ if ( aMessage && strlen(aMessage) ) >++ { >++ strcat(lDialogString, aMessage) ; >++ } >++ strcat(lDialogString, " \" ") ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "with title \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\" ") ; >++ } >+ >+- strcat( lDialogString, "' -e 'end try'") ; >+- if ( ! osx9orBetter() ) strcat( lDialogString, " -e 'end tell'") ; >+- } >+- else if ( tfd_kdialogPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"kdialog");return 1;} >+- strcpy( lDialogString , "kdialog" ) ; >++ strcat( lDialogString, "' -e 'end try'") ; >++ if ( ! osx9orBetter() ) strcat( lDialogString, " -e 'end tell'") ; >++ } >++ else if ( tfd_kdialogPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"kdialog");return 1;} >++ strcpy( lDialogString , "kdialog" ) ; >+ >+- if ( aIconType && strlen(aIconType) ) >+- { >+- strcat( lDialogString , " --icon '" ) ; >+- strcat( lDialogString , aIconType ) ; >+- strcat( lDialogString , "'" ) ; >+- } >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat( lDialogString , " --title \"" ) ; >+- strcat( lDialogString , aTitle ) ; >+- strcat( lDialogString , "\"" ) ; >+- } >++ if ( aIconType && strlen(aIconType) ) >++ { >++ strcat( lDialogString , " --icon '" ) ; >++ strcat( lDialogString , aIconType ) ; >++ strcat( lDialogString , "'" ) ; >++ } >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat( lDialogString , " --title \"" ) ; >++ strcat( lDialogString , aTitle ) ; >++ strcat( lDialogString , "\"" ) ; >++ } >+ >+- strcat( lDialogString , " --passivepopup" ) ; >+- strcat( lDialogString , " \"" ) ; >+- if ( aMessage ) >+- { >+- strcat( lDialogString , aMessage ) ; >+- } >+- strcat( lDialogString , " \" 5" ) ; >+- } >+- else if ( (tfd_zenity3Present()>=5) ) >+- { >+- /* zenity 2.32 & 3.14 has the notification but with a bug: it doesnt return from it */ >+- /* zenity 3.8 show the notification as an alert ok cancel box */ >+- if ( tfd_zenity3Present()>=5 ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"zenity");return 1;} >+- strcpy( lDialogString , "zenity" ) ; >+- } >++ strcat( lDialogString , " --passivepopup" ) ; >++ strcat( lDialogString , " \"" ) ; >++ if ( aMessage ) >++ { >++ strcat( lDialogString , aMessage ) ; >++ } >++ strcat( lDialogString , " \" 5" ) ; >++ } >++ else if ( tfd_yadPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"yad");return 1;} >++ strcpy( lDialogString , "yad --notification"); >+ >+- strcat( lDialogString , " --notification"); >++ if ( aIconType && strlen( aIconType ) ) >++ { >++ strcat( lDialogString , " --image=\""); >++ strcat( lDialogString , aIconType ) ; >++ strcat( lDialogString , "\"" ) ; >++ } >+ >+- if ( aIconType && strlen( aIconType ) ) >+- { >+- strcat( lDialogString , " --window-icon '"); >+- strcat( lDialogString , aIconType ) ; >+- strcat( lDialogString , "'" ) ; >+- } >++ strcat( lDialogString , " --text=\"" ) ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\n") ; >++ } >++ if ( aMessage && strlen( aMessage ) ) >++ { >++ strcat( lDialogString , aMessage ) ; >++ } >++ strcat( lDialogString , " \"" ) ; >++ } >++ else if ( perlPresent() >= 2 ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"perl-dbus");return 1;} >+ >+- strcat( lDialogString , " --text \"" ) ; >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\n") ; >+- } >+- if ( aMessage && strlen( aMessage ) ) >+- { >+- strcat( lDialogString , aMessage ) ; >+- } >+- strcat( lDialogString , " \"" ) ; >+- } >+- else if ( perlPresent() >= 2 ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"perl-dbus");return 1;} >+- >+ strcpy( lDialogString , "perl -e \"use Net::DBus;\ >+ my \\$sessionBus = Net::DBus->session;\ >+ my \\$notificationsService = \\$sessionBus->get_service('org.freedesktop.Notifications');\ >+@@ -5281,2303 +5446,2445 @@ >+ sprintf( lDialogString + strlen(lDialogString) , >+ "my \\$notificationId;\\$notificationId = \\$notificationsObject->Notify(shift, 0, '%s', '%s', '%s', [], {}, -1);\" ", >+ aIconType?aIconType:"", aTitle?aTitle:"", aMessage?aMessage:"" ) ; >+- } >+- else if ( pythonDbusPresent( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python-dbus");return 1;} >+- strcpy( lDialogString , gPythonName ) ; >+- strcat( lDialogString ," -c \"import dbus;bus=dbus.SessionBus();"); >+- strcat( lDialogString ,"notif=bus.get_object('org.freedesktop.Notifications','/org/freedesktop/Notifications');" ) ; >+- strcat( lDialogString ,"notify=dbus.Interface(notif,'org.freedesktop.Notifications');" ) ; >+- strcat( lDialogString ,"notify.Notify('',0,'" ) ; >+- if ( aIconType && strlen(aIconType) ) >+- { >+- strcat( lDialogString , aIconType ) ; >+- } >+- strcat(lDialogString, "','") ; >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, aTitle) ; >+- } >+- strcat(lDialogString, "','") ; >+- if ( aMessage && strlen(aMessage) ) >+- { >+- lpDialogString = lDialogString + strlen(lDialogString); >+- tfd_replaceSubStr( aMessage , "\n" , "\\n" , lpDialogString ) ; >+- } >+- strcat(lDialogString, "','','',5000)\"") ; >+- } >+- else if ( notifysendPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"notifysend");return 1;} >+- strcpy( lDialogString , "notify-send" ) ; >+- if ( aIconType && strlen(aIconType) ) >+- { >+- strcat( lDialogString , " -i '" ) ; >+- strcat( lDialogString , aIconType ) ; >+- strcat( lDialogString , "'" ) ; >+- } >+- strcat( lDialogString , " \"" ) ; >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, aTitle) ; >+- strcat( lDialogString , " | " ) ; >+- } >+- if ( aMessage && strlen(aMessage) ) >+- { >+- tfd_replaceSubStr( aMessage , "\n\t" , " | " , lBuff ) ; >+- tfd_replaceSubStr( aMessage , "\n" , " | " , lBuff ) ; >+- tfd_replaceSubStr( aMessage , "\t" , " " , lBuff ) ; >+- strcat(lDialogString, lBuff) ; >+- } >+- strcat( lDialogString , "\"" ) ; >+- } >+- else >+- { >+- return tinyfd_messageBox(aTitle, aMessage, "ok", aIconType, 0); >+- } >++ } >++ else if ( pythonDbusPresent( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python-dbus");return 1;} >++ strcpy( lDialogString , gPythonName ) ; >++ strcat( lDialogString ," -c \"import dbus;bus=dbus.SessionBus();"); >++ strcat( lDialogString ,"notif=bus.get_object('org.freedesktop.Notifications','/org/freedesktop/Notifications');" ) ; >++ strcat( lDialogString ,"notify=dbus.Interface(notif,'org.freedesktop.Notifications');" ) ; >++ strcat( lDialogString ,"notify.Notify('',0,'" ) ; >++ if ( aIconType && strlen(aIconType) ) >++ { >++ strcat( lDialogString , aIconType ) ; >++ } >++ strcat(lDialogString, "','") ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, aTitle) ; >++ } >++ strcat(lDialogString, "','") ; >++ if ( aMessage && strlen(aMessage) ) >++ { >++ lpDialogString = lDialogString + strlen(lDialogString); >++ tfd_replaceSubStr( aMessage , "\n" , "\\n" , lpDialogString ) ; >++ } >++ strcat(lDialogString, "','','',5000)\"") ; >++ } >++ else if ( notifysendPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"notifysend");return 1;} >++ strcpy( lDialogString , "notify-send" ) ; >++ if ( aIconType && strlen(aIconType) ) >++ { >++ strcat( lDialogString , " -i '" ) ; >++ strcat( lDialogString , aIconType ) ; >++ strcat( lDialogString , "'" ) ; >++ } >++ strcat( lDialogString , " \"" ) ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, aTitle) ; >++ strcat( lDialogString , " | " ) ; >++ } >++ if ( aMessage && strlen(aMessage) ) >++ { >++ tfd_replaceSubStr( aMessage , "\n\t" , " | " , lBuff ) ; >++ tfd_replaceSubStr( aMessage , "\n" , " | " , lBuff ) ; >++ tfd_replaceSubStr( aMessage , "\t" , " " , lBuff ) ; >++ strcat(lDialogString, lBuff) ; >++ } >++ strcat( lDialogString , "\"" ) ; >++ } >++ else if ( (tfd_zenity3Present()>=5) ) >++ { >++ /* zenity 2.32 & 3.14 has the notification but with a bug: it doesnt return from it */ >++ /* zenity 3.8 show the notification as an alert ok cancel box */ >++ /* zenity 3.44 doesn't have the notification (3.42 has it) */ >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"zenity");return 1;} >++ strcpy( lDialogString , "zenity --notification"); >+ >+- if (tinyfd_verbose) printf( "lDialogString: %s\n" , lDialogString ) ; >++ if ( aIconType && strlen( aIconType ) ) >++ { >++ strcat( lDialogString , " --window-icon '"); >++ strcat( lDialogString , aIconType ) ; >++ strcat( lDialogString , "'" ) ; >++ } >+ >+- if ( ! ( lIn = popen( lDialogString , "r" ) ) ) >+- { >+- free(lDialogString); >+- return 0 ; >+- } >++ strcat( lDialogString , " --text \"" ) ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\n") ; >++ } >++ if ( aMessage && strlen( aMessage ) ) >++ { >++ strcat( lDialogString , aMessage ) ; >++ } >++ strcat( lDialogString , " \"" ) ; >++ } >++ else >++ { >++ if (lDialogString) free(lDialogString); >++ return tinyfd_messageBox(aTitle, aMessage, "ok", aIconType, 0); >++ } >+ >+- pclose( lIn ) ; >+- free(lDialogString); >+- return 1; >++ if (tinyfd_verbose) printf( "lDialogString: %s\n" , lDialogString ) ; >++ >++ if ( ! ( lIn = popen( lDialogString , "r" ) ) ) >++ { >++ free(lDialogString); >++ return 0 ; >++ } >++ >++ pclose( lIn ) ; >++ free(lDialogString); >++ return 1; >+ } >+ >+ >+ /* returns NULL on cancel */ >+ char * tinyfd_inputBox( >+- char const * aTitle , /* NULL or "" */ >+- char const * aMessage , /* NULL or "" (\n and \t have no effect) */ >+- char const * aDefaultInput ) /* "" , if NULL it's a passwordBox */ >++ char const * aTitle , /* NULL or "" */ >++ char const * aMessage , /* NULL or "" (\n and \t have no effect) */ >++ char const * aDefaultInput ) /* "" , if NULL it's a passwordBox */ >+ { >+- static char lBuff[MAX_PATH_OR_CMD]; >+- char * lDialogString = NULL; >+- char * lpDialogString; >+- FILE * lIn ; >+- int lResult ; >+- int lWasGdialog = 0 ; >+- int lWasGraphicDialog = 0 ; >+- int lWasXterm = 0 ; >+- int lWasBasicXterm = 0 ; >+- struct termios oldt ; >+- struct termios newt ; >+- char * lEOF; >+- size_t lTitleLen ; >+- size_t lMessageLen ; >++ static char lBuff[MAX_PATH_OR_CMD]; >++ char * lDialogString = NULL; >++ char * lpDialogString; >++ FILE * lIn ; >++ int lResult ; >++ int lWasGdialog = 0 ; >++ int lWasGraphicDialog = 0 ; >++ int lWasXterm = 0 ; >++ int lWasBasicXterm = 0 ; >++ struct termios oldt ; >++ struct termios newt ; >++ char * lEOF; >++ size_t lTitleLen ; >++ size_t lMessageLen ; >+ >+- if (!aTitle && !aMessage && !aDefaultInput) return lBuff; /* now I can fill lBuff from outside */ >++ if (!aTitle && !aMessage && !aDefaultInput) return lBuff; /* now I can fill lBuff from outside */ >+ >+- lBuff[0]='\0'; >++ lBuff[0]='\0'; >+ >+- if (tfd_quoteDetected(aTitle)) return tinyfd_inputBox("INVALID TITLE WITH QUOTES", aMessage, aDefaultInput); >+- if (tfd_quoteDetected(aMessage)) return tinyfd_inputBox(aTitle, "INVALID MESSAGE WITH QUOTES", aDefaultInput); >+- if (tfd_quoteDetected(aDefaultInput)) return tinyfd_inputBox(aTitle, aMessage, "INVALID DEFAULT_INPUT WITH QUOTES"); >++ if (tfd_quoteDetected(aTitle)) return tinyfd_inputBox("INVALID TITLE WITH QUOTES", aMessage, aDefaultInput); >++ if (tfd_quoteDetected(aMessage)) return tinyfd_inputBox(aTitle, "INVALID MESSAGE WITH QUOTES", aDefaultInput); >++ if (tfd_quoteDetected(aDefaultInput)) return tinyfd_inputBox(aTitle, aMessage, "INVALID DEFAULT_INPUT WITH QUOTES: use the GRAVE ACCENT \\x60 instead."); >+ >+- lTitleLen = aTitle ? strlen(aTitle) : 0 ; >+- lMessageLen = aMessage ? strlen(aMessage) : 0 ; >+- if ( !aTitle || strcmp(aTitle,"tinyfd_query") ) >+- { >+- lDialogString = (char *) malloc( MAX_PATH_OR_CMD + lTitleLen + lMessageLen ); >+- } >++ lTitleLen = aTitle ? strlen(aTitle) : 0 ; >++ lMessageLen = aMessage ? strlen(aMessage) : 0 ; >++ if ( !aTitle || strcmp(aTitle,"tinyfd_query") ) >++ { >++ lDialogString = (char *) malloc( MAX_PATH_OR_CMD + lTitleLen + lMessageLen ); >++ } >+ >+- if ( osascriptPresent( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"applescript");return (char *)1;} >+- strcpy( lDialogString , "osascript "); >+- if ( ! osx9orBetter() ) strcat( lDialogString , " -e 'tell application \"System Events\"' -e 'Activate'"); >+- strcat( lDialogString , " -e 'try' -e 'display dialog \"") ; >+- if ( aMessage && strlen(aMessage) ) >+- { >+- strcat(lDialogString, aMessage) ; >+- } >+- strcat(lDialogString, "\" ") ; >+- strcat(lDialogString, "default answer \"") ; >+- if ( aDefaultInput && strlen(aDefaultInput) ) >+- { >+- strcat(lDialogString, aDefaultInput) ; >+- } >+- strcat(lDialogString, "\" ") ; >+- if ( ! aDefaultInput ) >+- { >+- strcat(lDialogString, "hidden answer true ") ; >+- } >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "with title \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\" ") ; >+- } >+- strcat(lDialogString, "with icon note' ") ; >+- strcat(lDialogString, "-e '\"1\" & text returned of result' " ); >+- strcat(lDialogString, "-e 'on error number -128' " ) ; >+- strcat(lDialogString, "-e '0' " ); >+- strcat(lDialogString, "-e 'end try'") ; >+- if ( ! osx9orBetter() ) strcat(lDialogString, " -e 'end tell'") ; >+- } >+- else if ( tfd_kdialogPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"kdialog");return (char *)1;} >+- strcpy( lDialogString , "szAnswer=$(kdialog" ) ; >++ if ( osascriptPresent( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"applescript");return (char *)1;} >++ strcpy( lDialogString , "osascript "); >++ if ( ! osx9orBetter() ) strcat( lDialogString , " -e 'tell application \"System Events\"' -e 'Activate'"); >++ strcat( lDialogString , " -e 'try' -e 'display dialog \"") ; >++ if ( aMessage && strlen(aMessage) ) >++ { >++ strcat(lDialogString, aMessage) ; >++ } >++ strcat(lDialogString, "\" ") ; >++ strcat(lDialogString, "default answer \"") ; >++ if ( aDefaultInput && strlen(aDefaultInput) ) >++ { >++ strcat(lDialogString, aDefaultInput) ; >++ } >++ strcat(lDialogString, "\" ") ; >++ if ( ! aDefaultInput ) >++ { >++ strcat(lDialogString, "hidden answer true ") ; >++ } >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "with title \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\" ") ; >++ } >++ strcat(lDialogString, "with icon note' ") ; >++ strcat(lDialogString, "-e '\"1\" & text returned of result' " ); >++ strcat(lDialogString, "-e 'on error number -128' " ) ; >++ strcat(lDialogString, "-e '0' " ); >++ strcat(lDialogString, "-e 'end try'") ; >++ if ( ! osx9orBetter() ) strcat(lDialogString, " -e 'end tell'") ; >++ } >++ else if ( tfd_kdialogPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"kdialog");return (char *)1;} >++ strcpy( lDialogString , "szAnswer=$(kdialog" ) ; >+ >+- if ( (tfd_kdialogPresent() == 2) && tfd_xpropPresent() ) >+- { >+- strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >+- } >++ if ( (tfd_kdialogPresent() == 2) && tfd_xpropPresent() ) >++ { >++ strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >++ } >+ >+- if ( ! aDefaultInput ) >+- { >+- strcat(lDialogString, " --password ") ; >+- } >+- else >+- { >+- strcat(lDialogString, " --inputbox ") ; >++ if ( ! aDefaultInput ) >++ { >++ strcat(lDialogString, " --password ") ; >++ } >++ else >++ { >++ strcat(lDialogString, " --inputbox ") ; >+ >+- } >+- strcat(lDialogString, "\"") ; >+- if ( aMessage && strlen(aMessage) ) >+- { >+- strcat(lDialogString, aMessage ) ; >+- } >+- strcat(lDialogString , "\" \"" ) ; >+- if ( aDefaultInput && strlen(aDefaultInput) ) >+- { >+- strcat(lDialogString, aDefaultInput ) ; >+- } >+- strcat(lDialogString , "\"" ) ; >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, " --title \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\"") ; >+- } >+- strcat( lDialogString , >+- ");if [ $? = 0 ];then echo 1$szAnswer;else echo 0$szAnswer;fi"); >+- } >+- else if ( tfd_zenityPresent() || tfd_matedialogPresent() || tfd_shellementaryPresent() || tfd_qarmaPresent() ) >+- { >+- if ( tfd_zenityPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"zenity");return (char *)1;} >+- strcpy( lDialogString , "szAnswer=$(zenity" ) ; >+- if ( (tfd_zenity3Present() >= 4) && !getenv("SSH_TTY") && tfd_xpropPresent() ) >+- { >+- strcat( lDialogString, " --attach=$(sleep .01;xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >+- } >+- } >+- else if ( tfd_matedialogPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"matedialog");return (char *)1;} >+- strcpy( lDialogString , "szAnswer=$(matedialog" ) ; >+- } >+- else if ( tfd_shellementaryPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"shellementary");return (char *)1;} >+- strcpy( lDialogString , "szAnswer=$(shellementary" ) ; >+- } >+- else >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"qarma");return (char *)1;} >+- strcpy( lDialogString , "szAnswer=$(qarma" ) ; >+- if ( !getenv("SSH_TTY") && tfd_xpropPresent() ) >+- { >+- strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >+- } >+- } >+- strcat( lDialogString ," --entry" ) ; >++ } >++ strcat(lDialogString, "\"") ; >++ if ( aMessage && strlen(aMessage) ) >++ { >++ strcat(lDialogString, aMessage ) ; >++ } >++ strcat(lDialogString , "\" \"" ) ; >++ if ( aDefaultInput && strlen(aDefaultInput) ) >++ { >++ strcat(lDialogString, aDefaultInput ) ; >++ } >++ strcat(lDialogString , "\"" ) ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, " --title \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\"") ; >++ } >++ strcat( lDialogString , >++ ");if [ $? = 0 ];then echo 1$szAnswer;else echo 0$szAnswer;fi"); >++ } >++ else if ( tfd_zenityPresent() || tfd_matedialogPresent() || tfd_shellementaryPresent() || tfd_qarmaPresent() ) >++ { >++ if ( tfd_zenityPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"zenity");return (char *)1;} >++ strcpy( lDialogString , "szAnswer=$(zenity" ) ; >++ if ( (tfd_zenity3Present() >= 4) && !getenv("SSH_TTY") && tfd_xpropPresent() ) >++ { >++ strcat( lDialogString, " --attach=$(sleep .01;xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >++ } >++ } >++ else if ( tfd_matedialogPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"matedialog");return (char *)1;} >++ strcpy( lDialogString , "szAnswer=$(matedialog" ) ; >++ } >++ else if ( tfd_shellementaryPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"shellementary");return (char *)1;} >++ strcpy( lDialogString , "szAnswer=$(shellementary" ) ; >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"qarma");return (char *)1;} >++ strcpy( lDialogString , "szAnswer=$(qarma" ) ; >++ if ( !getenv("SSH_TTY") && tfd_xpropPresent() ) >++ { >++ strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >++ } >++ } >++ strcat( lDialogString ," --entry" ) ; >+ >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, " --title=\"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\"") ; >+- } >+- if ( aMessage && strlen(aMessage) ) >+- { >+- strcat(lDialogString, " --text=\"") ; >+- strcat(lDialogString, aMessage) ; >+- strcat(lDialogString, "\"") ; >+- } >+- if ( aDefaultInput && strlen(aDefaultInput) ) >+- { >+- strcat(lDialogString, " --entry-text=\"") ; >+- strcat(lDialogString, aDefaultInput) ; >+- strcat(lDialogString, "\"") ; >+- } >+- else >+- { >+- strcat(lDialogString, " --hide-text") ; >+- } >+- if (tinyfd_silent) strcat( lDialogString , " 2>/dev/null "); >+- strcat( lDialogString , >+- ");if [ $? = 0 ];then echo 1$szAnswer;else echo 0$szAnswer;fi"); >+- } >+- else if (tfd_yadPresent()) >+- { >+- if (aTitle && !strcmp(aTitle, "tinyfd_query")) { strcpy(tinyfd_response, "yad"); return (char*)1; } >+- strcpy(lDialogString, "szAnswer=$(yad --entry"); >+- if (aTitle && strlen(aTitle)) >+- { >+- strcat(lDialogString, " --title=\""); >+- strcat(lDialogString, aTitle); >+- strcat(lDialogString, "\""); >+- } >+- if (aMessage && strlen(aMessage)) >+- { >+- strcat(lDialogString, " --text=\""); >+- strcat(lDialogString, aMessage); >+- strcat(lDialogString, "\""); >+- } >+- if (aDefaultInput && strlen(aDefaultInput)) >+- { >+- strcat(lDialogString, " --entry-text=\""); >+- strcat(lDialogString, aDefaultInput); >+- strcat(lDialogString, "\""); >+- } >+- else >+- { >+- strcat(lDialogString, " --hide-text"); >+- } >+- if (tinyfd_silent) strcat(lDialogString, " 2>/dev/null "); >+- strcat(lDialogString, >+- ");if [ $? = 0 ];then echo 1$szAnswer;else echo 0$szAnswer;fi"); >+- } >+- else if ( gxmessagePresent() || gmessagePresent() ) >+- { >+- if ( gxmessagePresent() ) { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"gxmessage");return (char *)1;} >+- strcpy( lDialogString , "szAnswer=$(gxmessage -buttons Ok:1,Cancel:0 -center \""); >+- } >+- else >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"gmessage");return (char *)1;} >+- strcpy( lDialogString , "szAnswer=$(gmessage -buttons Ok:1,Cancel:0 -center \""); >+- } >++ strcat(lDialogString, " --title=\"") ; >++ if (aTitle && strlen(aTitle)) strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\"") ; >+ >+- if ( aMessage && strlen(aMessage) ) >+- { >+- strcat( lDialogString , aMessage ) ; >+- } >+- strcat(lDialogString, "\"" ) ; >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat( lDialogString , " -title \""); >+- strcat( lDialogString , aTitle ) ; >+- strcat(lDialogString, "\" " ) ; >+- } >+- strcat(lDialogString, " -entrytext \"" ) ; >+- if ( aDefaultInput && strlen(aDefaultInput) ) >+- { >+- strcat( lDialogString , aDefaultInput ) ; >+- } >+- strcat(lDialogString, "\"" ) ; >+- strcat( lDialogString , ");echo $?$szAnswer"); >+- } >+- else if ( !gdialogPresent() && !xdialogPresent() && tkinter3Present( ) ) >++ strcat(lDialogString, " --text=\"") ; >++ if (aMessage && strlen(aMessage)) strcat(lDialogString, aMessage) ; >++ strcat(lDialogString, "\"") ; >++ >++ if ( aDefaultInput ) >++ { >++ strcat(lDialogString, " --entry-text=\"") ; >++ strcat(lDialogString, aDefaultInput) ; >++ strcat(lDialogString, "\"") ; >++ } >++ else >++ { >++ strcat(lDialogString, " --hide-text") ; >++ } >++ if (tinyfd_silent) strcat( lDialogString , " 2>/dev/null "); >++ strcat( lDialogString , >++ ");if [ $? = 0 ];then echo 1$szAnswer;else echo 0$szAnswer;fi"); >++ } >++ else if (tfd_yadPresent()) >+ { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python3-tkinter");return (char *)1;} >+- strcpy( lDialogString , gPython3Name ) ; >+- strcat( lDialogString , >+- " -S -c \"import tkinter; from tkinter import simpledialog;root=tkinter.Tk();root.withdraw();"); >+- strcat( lDialogString ,"res=simpledialog.askstring(" ) ; >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "title='") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "',") ; >+- } >+- if ( aMessage && strlen(aMessage) ) >+- { >++ if (aTitle && !strcmp(aTitle, "tinyfd_query")) { strcpy(tinyfd_response, "yad"); return (char*)1; } >++ strcpy(lDialogString, "szAnswer=$(yad --entry"); >++ if (aTitle && strlen(aTitle)) >++ { >++ strcat(lDialogString, " --title=\""); >++ strcat(lDialogString, aTitle); >++ strcat(lDialogString, "\""); >++ } >++ if (aMessage && strlen(aMessage)) >++ { >++ strcat(lDialogString, " --text=\""); >++ strcat(lDialogString, aMessage); >++ strcat(lDialogString, "\""); >++ } >++ if (aDefaultInput && strlen(aDefaultInput)) >++ { >++ strcat(lDialogString, " --entry-text=\""); >++ strcat(lDialogString, aDefaultInput); >++ strcat(lDialogString, "\""); >++ } >++ else >++ { >++ strcat(lDialogString, " --hide-text"); >++ } >++ if (tinyfd_silent) strcat(lDialogString, " 2>/dev/null "); >++ strcat(lDialogString, >++ ");if [ $? = 0 ];then echo 1$szAnswer;else echo 0$szAnswer;fi"); >++ } >++ else if ( gxmessagePresent() || gmessagePresent() ) >++ { >++ if ( gxmessagePresent() ) { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"gxmessage");return (char *)1;} >++ strcpy( lDialogString , "szAnswer=$(gxmessage -buttons Ok:1,Cancel:0 -center \""); >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"gmessage");return (char *)1;} >++ strcpy( lDialogString , "szAnswer=$(gmessage -buttons Ok:1,Cancel:0 -center \""); >++ } >+ >+- strcat(lDialogString, "prompt='") ; >+- lpDialogString = lDialogString + strlen(lDialogString); >+- tfd_replaceSubStr( aMessage , "\n" , "\\n" , lpDialogString ) ; >+- strcat(lDialogString, "',") ; >+- } >+- if ( aDefaultInput ) >+- { >+- if ( strlen(aDefaultInput) ) >++ if ( aMessage && strlen(aMessage) ) >+ { >+- strcat(lDialogString, "initialvalue='") ; >+- strcat(lDialogString, aDefaultInput) ; >+- strcat(lDialogString, "',") ; >++ strcat( lDialogString , aMessage ) ; >+ } >+- } >+- else >+- { >+- strcat(lDialogString, "show='*'") ; >+- } >+- strcat(lDialogString, ");\nif res is None :\n\tprint(0)"); >+- strcat(lDialogString, "\nelse :\n\tprint('1'+res)\n\"" ) ; >++ strcat(lDialogString, "\"" ) ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat( lDialogString , " -title \""); >++ strcat( lDialogString , aTitle ) ; >++ strcat(lDialogString, "\" " ) ; >++ } >++ strcat(lDialogString, " -entrytext \"" ) ; >++ if ( aDefaultInput && strlen(aDefaultInput) ) >++ { >++ strcat( lDialogString , aDefaultInput ) ; >++ } >++ strcat(lDialogString, "\"" ) ; >++ strcat( lDialogString , ");echo $?$szAnswer"); >+ } >+- else if ( !gdialogPresent() && !xdialogPresent() && tkinter2Present( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python2-tkinter");return (char *)1;} >+- strcpy( lDialogString , "export PYTHONIOENCODING=utf-8;" ) ; >+- strcat( lDialogString , gPython2Name ) ; >+- if ( ! isTerminalRunning( ) && tfd_isDarwin( ) ) >+- { >+- strcat( lDialogString , " -i" ) ; /* for osx without console */ >+- } >++ else if ( !gdialogPresent() && !xdialogPresent() && tkinter3Present( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python3-tkinter");return (char *)1;} >++ strcpy( lDialogString , gPython3Name ) ; >++ strcat( lDialogString , >++ " -S -c \"import tkinter; from tkinter import simpledialog;root=tkinter.Tk();root.withdraw();"); >++ strcat( lDialogString ,"res=simpledialog.askstring(" ) ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "title='") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "',") ; >++ } >++ if ( aMessage && strlen(aMessage) ) >++ { >+ >+- strcat( lDialogString , >+- " -S -c \"import Tkinter,tkSimpleDialog;root=Tkinter.Tk();root.withdraw();"); >++ strcat(lDialogString, "prompt='") ; >++ lpDialogString = lDialogString + strlen(lDialogString); >++ tfd_replaceSubStr( aMessage , "\n" , "\\n" , lpDialogString ) ; >++ strcat(lDialogString, "',") ; >++ } >++ if ( aDefaultInput ) >++ { >++ if ( strlen(aDefaultInput) ) >++ { >++ strcat(lDialogString, "initialvalue='") ; >++ strcat(lDialogString, aDefaultInput) ; >++ strcat(lDialogString, "',") ; >++ } >++ } >++ else >++ { >++ strcat(lDialogString, "show='*'") ; >++ } >++ strcat(lDialogString, ");\nif res is None :\n\tprint(0)"); >++ strcat(lDialogString, "\nelse :\n\tprint('1'+res)\n\"" ) ; >++ } >++ else if ( !gdialogPresent() && !xdialogPresent() && tkinter2Present( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python2-tkinter");return (char *)1;} >++ strcpy( lDialogString , "export PYTHONIOENCODING=utf-8;" ) ; >++ strcat( lDialogString , gPython2Name ) ; >++ if ( ! isTerminalRunning( ) && tfd_isDarwin( ) ) >++ { >++ strcat( lDialogString , " -i" ) ; /* for osx without console */ >++ } >+ >+- if ( tfd_isDarwin( ) ) >+- { >+- strcat( lDialogString , >++ strcat( lDialogString , >++ " -S -c \"import Tkinter,tkSimpleDialog;root=Tkinter.Tk();root.withdraw();"); >++ >++ if ( tfd_isDarwin( ) ) >++ { >++ strcat( lDialogString , >+ "import os;os.system('''/usr/bin/osascript -e 'tell app \\\"Finder\\\" to set \ >+ frontmost of process \\\"Python\\\" to true' ''');"); >+- } >++ } >+ >+- strcat( lDialogString ,"res=tkSimpleDialog.askstring(" ) ; >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "title='") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "',") ; >+- } >+- if ( aMessage && strlen(aMessage) ) >+- { >++ strcat( lDialogString ,"res=tkSimpleDialog.askstring(" ) ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "title='") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "',") ; >++ } >++ if ( aMessage && strlen(aMessage) ) >++ { >+ >+- strcat(lDialogString, "prompt='") ; >+- lpDialogString = lDialogString + strlen(lDialogString); >+- tfd_replaceSubStr( aMessage , "\n" , "\\n" , lpDialogString ) ; >+- strcat(lDialogString, "',") ; >+- } >+- if ( aDefaultInput ) >+- { >+- if ( strlen(aDefaultInput) ) >+- { >+- strcat(lDialogString, "initialvalue='") ; >+- strcat(lDialogString, aDefaultInput) ; >+- strcat(lDialogString, "',") ; >+- } >+- } >+- else >+- { >+- strcat(lDialogString, "show='*'") ; >+- } >+- strcat(lDialogString, ");\nif res is None :\n\tprint 0"); >+- strcat(lDialogString, "\nelse :\n\tprint '1'+res\n\"" ) ; >+- } >+- else if ( gdialogPresent() || xdialogPresent() || dialogName() || whiptailPresent() ) >+- { >+- if ( gdialogPresent( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"gdialog");return (char *)1;} >+- lWasGraphicDialog = 1 ; >+- lWasGdialog = 1 ; >+- strcpy( lDialogString , "(gdialog " ) ; >+- } >+- else if ( xdialogPresent( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"xdialog");return (char *)1;} >+- lWasGraphicDialog = 1 ; >+- strcpy( lDialogString , "(Xdialog " ) ; >+- } >+- else if ( dialogName( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"dialog");return (char *)0;} >+- if ( isTerminalRunning( ) ) >+- { >+- strcpy( lDialogString , "(dialog " ) ; >+- } >+- else >+- { >+- lWasXterm = 1 ; >+- strcpy( lDialogString , terminalName() ) ; >+- strcat( lDialogString , "'(" ) ; >+- strcat( lDialogString , dialogName() ) ; >+- strcat( lDialogString , " " ) ; >+- } >+- } >+- else if ( isTerminalRunning( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"whiptail");return (char *)0;} >+- strcpy( lDialogString , "(whiptail " ) ; >+- } >+- else >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"whiptail");return (char *)0;} >+- lWasXterm = 1 ; >+- strcpy( lDialogString , terminalName() ) ; >+- strcat( lDialogString , "'(whiptail " ) ; >+- } >++ strcat(lDialogString, "prompt='") ; >++ lpDialogString = lDialogString + strlen(lDialogString); >++ tfd_replaceSubStr( aMessage , "\n" , "\\n" , lpDialogString ) ; >++ strcat(lDialogString, "',") ; >++ } >++ if ( aDefaultInput ) >++ { >++ if ( strlen(aDefaultInput) ) >++ { >++ strcat(lDialogString, "initialvalue='") ; >++ strcat(lDialogString, aDefaultInput) ; >++ strcat(lDialogString, "',") ; >++ } >++ } >++ else >++ { >++ strcat(lDialogString, "show='*'") ; >++ } >++ strcat(lDialogString, ");\nif res is None :\n\tprint 0"); >++ strcat(lDialogString, "\nelse :\n\tprint '1'+res\n\"" ) ; >++ } >++ else if ( gdialogPresent() || xdialogPresent() || dialogName() || whiptailPresent() ) >++ { >++ if ( gdialogPresent( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"gdialog");return (char *)1;} >++ lWasGraphicDialog = 1 ; >++ lWasGdialog = 1 ; >++ strcpy( lDialogString , "(gdialog " ) ; >++ } >++ else if ( xdialogPresent( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"xdialog");return (char *)1;} >++ lWasGraphicDialog = 1 ; >++ strcpy( lDialogString , "(Xdialog " ) ; >++ } >++ else if ( dialogName( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"dialog");return (char *)0;} >++ if ( isTerminalRunning( ) ) >++ { >++ strcpy( lDialogString , "(dialog " ) ; >++ } >++ else >++ { >++ lWasXterm = 1 ; >++ strcpy( lDialogString , terminalName() ) ; >++ strcat( lDialogString , "'(" ) ; >++ strcat( lDialogString , dialogName() ) ; >++ strcat( lDialogString , " " ) ; >++ } >++ } >++ else if ( isTerminalRunning( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"whiptail");return (char *)0;} >++ strcpy( lDialogString , "(whiptail " ) ; >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"whiptail");return (char *)0;} >++ lWasXterm = 1 ; >++ strcpy( lDialogString , terminalName() ) ; >++ strcat( lDialogString , "'(whiptail " ) ; >++ } >+ >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "--title \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\" ") ; >+- } >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "--title \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\" ") ; >++ } >+ >+- if ( !xdialogPresent() && !gdialogPresent() ) >+- { >+- strcat(lDialogString, "--backtitle \"") ; >+- strcat(lDialogString, "tab: move focus") ; >+- if ( ! aDefaultInput && !lWasGdialog ) >+- { >+- strcat(lDialogString, " (sometimes nothing, no blink nor star, is shown in text field)") ; >+- } >+- strcat(lDialogString, "\" ") ; >+- } >++ if ( !xdialogPresent() && !gdialogPresent() ) >++ { >++ strcat(lDialogString, "--backtitle \"") ; >++ strcat(lDialogString, "tab: move focus") ; >++ if ( ! aDefaultInput && !lWasGdialog ) >++ { >++ strcat(lDialogString, " (sometimes nothing, no blink nor star, is shown in text field)") ; >++ } >++ strcat(lDialogString, "\" ") ; >++ } >+ >+- if ( aDefaultInput || lWasGdialog ) >+- { >+- strcat( lDialogString , "--inputbox" ) ; >+- } >+- else >+- { >+- if ( !lWasGraphicDialog && dialogName() && isDialogVersionBetter09b() ) >+- { >+- strcat( lDialogString , "--insecure " ) ; >+- } >+- strcat( lDialogString , "--passwordbox" ) ; >+- } >+- strcat( lDialogString , " \"" ) ; >+- if ( aMessage && strlen(aMessage) ) >+- { >+- strcat(lDialogString, aMessage) ; >+- } >+- strcat(lDialogString,"\" 10 60 ") ; >+- if ( aDefaultInput && strlen(aDefaultInput) ) >+- { >+- strcat(lDialogString, "\"") ; >+- strcat(lDialogString, aDefaultInput) ; >+- strcat(lDialogString, "\" ") ; >+- } >+- if ( lWasGraphicDialog ) >+- { >+- strcat(lDialogString,") 2>/tmp/tinyfd.txt;\ >+- if [ $? = 0 ];then tinyfdBool=1;else tinyfdBool=0;fi;\ >+- tinyfdRes=$(cat /tmp/tinyfd.txt);echo $tinyfdBool$tinyfdRes") ; >+- } >+- else >+- { >+- strcat(lDialogString,">/dev/tty ) 2>/tmp/tinyfd.txt;\ >+- if [ $? = 0 ];then tinyfdBool=1;else tinyfdBool=0;fi;\ >+- tinyfdRes=$(cat /tmp/tinyfd.txt);echo $tinyfdBool$tinyfdRes") ; >++ if ( aDefaultInput || lWasGdialog ) >++ { >++ strcat( lDialogString , "--inputbox" ) ; >++ } >++ else >++ { >++ if ( !lWasGraphicDialog && dialogName() && isDialogVersionBetter09b() ) >++ { >++ strcat( lDialogString , "--insecure " ) ; >++ } >++ strcat( lDialogString , "--passwordbox" ) ; >++ } >++ strcat( lDialogString , " \"" ) ; >++ if ( aMessage && strlen(aMessage) ) >++ { >++ strcat(lDialogString, aMessage) ; >++ } >++ strcat(lDialogString,"\" 10 60 ") ; >++ if ( aDefaultInput && strlen(aDefaultInput) ) >++ { >++ strcat(lDialogString, "\"") ; >++ strcat(lDialogString, aDefaultInput) ; >++ strcat(lDialogString, "\" ") ; >++ } >++ if ( lWasGraphicDialog ) >++ { >++ strcat(lDialogString,") 2>/tmp/tinyfd.txt;\ >++ if [ $? = 0 ];then tinyfdBool=1;else tinyfdBool=0;fi;\ >++ tinyfdRes=$(cat /tmp/tinyfd.txt);echo $tinyfdBool$tinyfdRes") ; >++ } >++ else >++ { >++ strcat(lDialogString,">/dev/tty ) 2>/tmp/tinyfd.txt;\ >++ if [ $? = 0 ];then tinyfdBool=1;else tinyfdBool=0;fi;\ >++ tinyfdRes=$(cat /tmp/tinyfd.txt);echo $tinyfdBool$tinyfdRes") ; >+ >+- if ( lWasXterm ) >+- { >+- strcat(lDialogString," >/tmp/tinyfd0.txt';cat /tmp/tinyfd0.txt"); >+- } >+- else >+- { >+- strcat(lDialogString, "; clear >/dev/tty") ; >+- } >+- } >+- } >+- else if ( ! isTerminalRunning( ) && terminalName() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"basicinput");return (char *)0;} >+- lWasBasicXterm = 1 ; >+- strcpy( lDialogString , terminalName() ) ; >+- strcat( lDialogString , "'" ) ; >+- if ( !gWarningDisplayed && !tinyfd_forceConsole) >+- { >+- gWarningDisplayed = 1 ; >+- tinyfd_messageBox(gTitle,tinyfd_needs,"ok","warning",0); >+- } >+- if ( aTitle && strlen(aTitle) && !tinyfd_forceConsole) >+- { >+- strcat( lDialogString , "echo \"" ) ; >+- strcat( lDialogString, aTitle) ; >+- strcat( lDialogString , "\";echo;" ) ; >+- } >++ if ( lWasXterm ) >++ { >++ strcat(lDialogString," >/tmp/tinyfd0.txt';cat /tmp/tinyfd0.txt"); >++ } >++ else >++ { >++ strcat(lDialogString, "; clear >/dev/tty") ; >++ } >++ } >++ } >++ else if ( ! isTerminalRunning( ) && terminalName() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"basicinput");return (char *)0;} >++ lWasBasicXterm = 1 ; >++ strcpy( lDialogString , terminalName() ) ; >++ strcat( lDialogString , "'" ) ; >++ if ( !gWarningDisplayed && !tinyfd_forceConsole) >++ { >++ gWarningDisplayed = 1 ; >++ tinyfd_messageBox(gTitle,tinyfd_needs,"ok","warning",0); >++ } >++ if ( aTitle && strlen(aTitle) && !tinyfd_forceConsole) >++ { >++ strcat( lDialogString , "echo \"" ) ; >++ strcat( lDialogString, aTitle) ; >++ strcat( lDialogString , "\";echo;" ) ; >++ } >+ >+- strcat( lDialogString , "echo \"" ) ; >+- if ( aMessage && strlen(aMessage) ) >+- { >+- strcat( lDialogString, aMessage) ; >+- } >+- strcat( lDialogString , "\";read " ) ; >+- if ( ! aDefaultInput ) >+- { >+- strcat( lDialogString , "-s " ) ; >+- } >+- strcat( lDialogString , "-p \"" ) ; >+- strcat( lDialogString , "(esc+enter to cancel): \" ANSWER " ) ; >+- strcat( lDialogString , ";echo 1$ANSWER >/tmp/tinyfd.txt';" ) ; >+- strcat( lDialogString , "cat -v /tmp/tinyfd.txt"); >+- } >+- else if ( !gWarningDisplayed && ! isTerminalRunning( ) && ! terminalName() ) { >+- gWarningDisplayed = 1 ; >+- tinyfd_messageBox(gTitle,tinyfd_needs,"ok","warning",0); >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"no_solution");return (char *)0;} >+- free(lDialogString); >+- return NULL; >+- } >+- else >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"basicinput");return (char *)0;} >+- if ( !gWarningDisplayed && !tinyfd_forceConsole) >+- { >+- gWarningDisplayed = 1 ; >+- tinyfd_messageBox(gTitle,tinyfd_needs,"ok","warning",0); >+- } >+- if ( aTitle && strlen(aTitle) ) >+- { >+- printf("\n%s\n", aTitle); >+- } >+- if ( aMessage && strlen(aMessage) ) >+- { >+- printf("\n%s\n",aMessage); >+- } >+- printf("(esc+enter to cancel): "); fflush(stdout); >+- if ( ! aDefaultInput ) >+- { >+- tcgetattr(STDIN_FILENO, & oldt) ; >+- newt = oldt ; >+- newt.c_lflag &= ~ECHO ; >+- tcsetattr(STDIN_FILENO, TCSANOW, & newt); >+- } >++ strcat( lDialogString , "echo \"" ) ; >++ if ( aMessage && strlen(aMessage) ) >++ { >++ strcat( lDialogString, aMessage) ; >++ } >++ strcat( lDialogString , "\";read " ) ; >++ if ( ! aDefaultInput ) >++ { >++ strcat( lDialogString , "-s " ) ; >++ } >++ strcat( lDialogString , "-p \"" ) ; >++ strcat( lDialogString , "(esc+enter to cancel): \" ANSWER " ) ; >++ strcat( lDialogString , ";echo 1$ANSWER >/tmp/tinyfd.txt';" ) ; >++ strcat( lDialogString , "cat -v /tmp/tinyfd.txt"); >++ } >++ else if ( !gWarningDisplayed && ! isTerminalRunning( ) && ! terminalName() ) { >++ gWarningDisplayed = 1 ; >++ tinyfd_messageBox(gTitle,tinyfd_needs,"ok","warning",0); >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"no_solution");return (char *)0;} >++ free(lDialogString); >++ return NULL; >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"basicinput");return (char *)0;} >++ if ( !gWarningDisplayed && !tinyfd_forceConsole) >++ { >++ gWarningDisplayed = 1 ; >++ tinyfd_messageBox(gTitle,tinyfd_needs,"ok","warning",0); >++ } >++ if ( aTitle && strlen(aTitle) ) >++ { >++ printf("\n%s\n", aTitle); >++ } >++ if ( aMessage && strlen(aMessage) ) >++ { >++ printf("\n%s\n",aMessage); >++ } >++ printf("(esc+enter to cancel): "); fflush(stdout); >++ if ( ! aDefaultInput ) >++ { >++ tcgetattr(STDIN_FILENO, & oldt) ; >++ newt = oldt ; >++ newt.c_lflag &= ~ECHO ; >++ tcsetattr(STDIN_FILENO, TCSANOW, & newt); >++ } >+ >+- lEOF = fgets(lBuff, MAX_PATH_OR_CMD, stdin); >+- /* printf("lbuff<%c><%d>\n",lBuff[0],lBuff[0]); */ >+- if ( ! lEOF || (lBuff[0] == '\0') ) >+- { >+- free(lDialogString); >+- return NULL; >+- } >++ lEOF = fgets(lBuff, MAX_PATH_OR_CMD, stdin); >++ /* printf("lbuff<%c><%d>\n",lBuff[0],lBuff[0]); */ >++ if ( ! lEOF || (lBuff[0] == '\0') ) >++ { >++ free(lDialogString); >++ return NULL; >++ } >+ >+- if ( lBuff[0] == '\n' ) >+- { >+- lEOF = fgets(lBuff, MAX_PATH_OR_CMD, stdin); >+- /* printf("lbuff<%c><%d>\n",lBuff[0],lBuff[0]); */ >+- if ( ! lEOF || (lBuff[0] == '\0') ) >+- { >+- free(lDialogString); >+- return NULL; >+- } >+- } >++ if ( lBuff[0] == '\n' ) >++ { >++ lEOF = fgets(lBuff, MAX_PATH_OR_CMD, stdin); >++ /* printf("lbuff<%c><%d>\n",lBuff[0],lBuff[0]); */ >++ if ( ! lEOF || (lBuff[0] == '\0') ) >++ { >++ free(lDialogString); >++ return NULL; >++ } >++ } >+ >+- if ( ! aDefaultInput ) >+- { >+- tcsetattr(STDIN_FILENO, TCSANOW, & oldt); >+- printf("\n"); >+- } >+- printf("\n"); >+- if ( strchr(lBuff,27) ) >+- { >+- free(lDialogString); >+- return NULL ; >+- } >+- if ( lBuff[strlen( lBuff ) -1] == '\n' ) >+- { >+- lBuff[strlen( lBuff ) -1] = '\0' ; >+- } >+- free(lDialogString); >+- return lBuff ; >+- } >++ if ( ! aDefaultInput ) >++ { >++ tcsetattr(STDIN_FILENO, TCSANOW, & oldt); >++ printf("\n"); >++ } >++ printf("\n"); >++ if ( strchr(lBuff,27) ) >++ { >++ free(lDialogString); >++ return NULL ; >++ } >++ if ( lBuff[strlen( lBuff ) -1] == '\n' ) >++ { >++ lBuff[strlen( lBuff ) -1] = '\0' ; >++ } >++ free(lDialogString); >++ return lBuff ; >++ } >+ >+- if (tinyfd_verbose) printf( "lDialogString: %s\n" , lDialogString ) ; >+- lIn = popen( lDialogString , "r" ); >+- if ( ! lIn ) >+- { >+- if ( fileExists("/tmp/tinyfd.txt") ) >+- { >+- wipefile("/tmp/tinyfd.txt"); >+- remove("/tmp/tinyfd.txt"); >+- } >+- if ( fileExists("/tmp/tinyfd0.txt") ) >+- { >+- wipefile("/tmp/tinyfd0.txt"); >+- remove("/tmp/tinyfd0.txt"); >+- } >+- free(lDialogString); >+- return NULL ; >+- } >+- while ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >+- {} >++ if (tinyfd_verbose) printf( "lDialogString: %s\n" , lDialogString ) ; >++ lIn = popen( lDialogString , "r" ); >++ if ( ! lIn ) >++ { >++ if ( fileExists("/tmp/tinyfd.txt") ) >++ { >++ wipefile("/tmp/tinyfd.txt"); >++ remove("/tmp/tinyfd.txt"); >++ } >++ if ( fileExists("/tmp/tinyfd0.txt") ) >++ { >++ wipefile("/tmp/tinyfd0.txt"); >++ remove("/tmp/tinyfd0.txt"); >++ } >++ free(lDialogString); >++ return NULL ; >++ } >++ while ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >++ {} >+ >+- pclose( lIn ) ; >++ pclose( lIn ) ; >+ >+- if ( fileExists("/tmp/tinyfd.txt") ) >+- { >+- wipefile("/tmp/tinyfd.txt"); >+- remove("/tmp/tinyfd.txt"); >+- } >+- if ( fileExists("/tmp/tinyfd0.txt") ) >+- { >+- wipefile("/tmp/tinyfd0.txt"); >+- remove("/tmp/tinyfd0.txt"); >+- } >++ if ( fileExists("/tmp/tinyfd.txt") ) >++ { >++ wipefile("/tmp/tinyfd.txt"); >++ remove("/tmp/tinyfd.txt"); >++ } >++ if ( fileExists("/tmp/tinyfd0.txt") ) >++ { >++ wipefile("/tmp/tinyfd0.txt"); >++ remove("/tmp/tinyfd0.txt"); >++ } >+ >+- /* printf( "len Buff: %lu\n" , strlen(lBuff) ) ; */ >+- /* printf( "lBuff0: %s\n" , lBuff ) ; */ >+- if ( lBuff[strlen( lBuff ) -1] == '\n' ) >+- { >+- lBuff[strlen( lBuff ) -1] = '\0' ; >+- } >+- /* printf( "lBuff1: %s len: %lu \n" , lBuff , strlen(lBuff) ) ; */ >+- if ( lWasBasicXterm ) >+- { >+- if ( strstr(lBuff,"^[") ) /* esc was pressed */ >+- { >+- free(lDialogString); >+- return NULL ; >+- } >+- } >++ /* printf( "len Buff: %lu\n" , strlen(lBuff) ) ; */ >++ /* printf( "lBuff0: %s\n" , lBuff ) ; */ >++ if ( strlen( lBuff ) && lBuff[strlen( lBuff ) -1] == '\n' ) >++ { >++ lBuff[strlen( lBuff ) -1] = '\0' ; >++ } >++ /* printf( "lBuff1: %s len: %lu \n" , lBuff , strlen(lBuff) ) ; */ >++ if ( lWasBasicXterm ) >++ { >++ if ( strstr(lBuff,"^[") ) /* esc was pressed */ >++ { >++ free(lDialogString); >++ return NULL ; >++ } >++ } >+ >+- lResult = strncmp( lBuff , "1" , 1) ? 0 : 1 ; >+- /* printf( "lResult: %d \n" , lResult ) ; */ >+- if ( ! lResult ) >+- { >+- free(lDialogString); >+- return NULL ; >+- } >++ lResult = strncmp( lBuff , "1" , 1) ? 0 : 1 ; >++ /* printf( "lResult: %d \n" , lResult ) ; */ >++ if ( ! lResult ) >++ { >++ free(lDialogString); >++ return NULL ; >++ } >+ >+- /* printf( "lBuff+1: %s\n" , lBuff+1 ) ; */ >+- free(lDialogString); >+- return lBuff+1 ; >++ /* printf( "lBuff+1: %s\n" , lBuff+1 ) ; */ >++ free(lDialogString); >++ return lBuff+1 ; >+ } >+ >+ >+ char * tinyfd_saveFileDialog( >+- char const * aTitle , /* NULL or "" */ >+- char const * aDefaultPathAndFile , /* NULL or "" */ >+- int aNumOfFilterPatterns , /* 0 */ >+- char const * const * aFilterPatterns , /* NULL or {"*.jpg","*.png"} */ >+- char const * aSingleFilterDescription ) /* NULL or "image files" */ >++ char const * aTitle , /* NULL or "" */ >++ char const * aDefaultPathAndOrFile , /* NULL or "" , ends with / to set only a directory */ >++ int aNumOfFilterPatterns , /* 0 */ >++ char const * const * aFilterPatterns , /* NULL or {"*.txt","*.doc"} */ >++ char const * aSingleFilterDescription ) /* NULL or "text files" */ >+ { >+- static char lBuff[MAX_PATH_OR_CMD] ; >+- char lDialogString[MAX_PATH_OR_CMD] ; >+- char lString[MAX_PATH_OR_CMD] ; >+- int i ; >+- int lWasGraphicDialog = 0 ; >+- int lWasXterm = 0 ; >+- char * p ; >+- char * lPointerInputBox ; >+- FILE * lIn ; >+- lBuff[0]='\0'; >++ static char lBuff[MAX_PATH_OR_CMD] ; >++ static char lLastDirectory[MAX_PATH_OR_CMD] = "$PWD" ; >+ >+- if (tfd_quoteDetected(aTitle)) return tinyfd_saveFileDialog("INVALID TITLE WITH QUOTES", aDefaultPathAndFile, aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription); >+- if (tfd_quoteDetected(aDefaultPathAndFile)) return tinyfd_saveFileDialog(aTitle, "INVALID DEFAULT_PATH WITH QUOTES", aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription); >+- if (tfd_quoteDetected(aSingleFilterDescription)) return tinyfd_saveFileDialog(aTitle, aDefaultPathAndFile, aNumOfFilterPatterns, aFilterPatterns, "INVALID FILTER_DESCRIPTION WITH QUOTES"); >+- for (i = 0; i < aNumOfFilterPatterns; i++) >++ char lDialogString[MAX_PATH_OR_CMD] ; >++ char lString[MAX_PATH_OR_CMD] ; >++ int i ; >++ int lWasGraphicDialog = 0 ; >++ int lWasXterm = 0 ; >++ char * p ; >++ char * lPointerInputBox ; >++ FILE * lIn ; >++ lBuff[0]='\0'; >++ >++ if ( ! aFilterPatterns ) aNumOfFilterPatterns = 0 ; >++ if (tfd_quoteDetected(aTitle)) return tinyfd_saveFileDialog("INVALID TITLE WITH QUOTES", aDefaultPathAndOrFile, aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription); >++ if (tfd_quoteDetected(aDefaultPathAndOrFile)) return tinyfd_saveFileDialog(aTitle, "INVALID DEFAULT_PATH WITH QUOTES", aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription); >++ if (tfd_quoteDetected(aSingleFilterDescription)) return tinyfd_saveFileDialog(aTitle, aDefaultPathAndOrFile, aNumOfFilterPatterns, aFilterPatterns, "INVALID FILTER_DESCRIPTION WITH QUOTES"); >++ for (i = 0; i < aNumOfFilterPatterns; i++) >++ { >++ if (tfd_quoteDetected(aFilterPatterns[i])) return tinyfd_saveFileDialog("INVALID FILTER_PATTERN WITH QUOTES: use the GRAVE ACCENT \\x60 instead.", aDefaultPathAndOrFile, 0, NULL, NULL); >++ } >++ >++ if ( osascriptPresent( ) ) >+ { >+- if (tfd_quoteDetected(aFilterPatterns[i])) return tinyfd_saveFileDialog("INVALID FILTER_PATTERN WITH QUOTES", aDefaultPathAndFile, 0, NULL, NULL); >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"applescript");return (char *)1;} >++ strcpy( lDialogString , "osascript "); >++ if ( ! osx9orBetter() ) strcat( lDialogString , " -e 'tell application \"Finder\"' -e 'Activate'"); >++ strcat( lDialogString , " -e 'try' -e 'POSIX path of ( choose file name " ); >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "with prompt \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\" ") ; >++ } >++ getPathWithoutFinalSlash( lString , aDefaultPathAndOrFile ) ; >++ if ( strlen(lString) ) >++ { >++ strcat(lDialogString, "default location \"") ; >++ strcat(lDialogString, lString ) ; >++ strcat(lDialogString , "\" " ) ; >++ } >++ getLastName( lString , aDefaultPathAndOrFile ) ; >++ if ( strlen(lString) ) >++ { >++ strcat(lDialogString, "default name \"") ; >++ strcat(lDialogString, lString ) ; >++ strcat(lDialogString , "\" " ) ; >++ } >++ strcat( lDialogString , ")' " ) ; >++ strcat(lDialogString, "-e 'on error number -128' " ) ; >++ strcat(lDialogString, "-e 'end try'") ; >++ if ( ! osx9orBetter() ) strcat( lDialogString, " -e 'end tell'") ; >+ } >++ else if ( tfd_kdialogPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"kdialog");return (char *)1;} >+ >+- if ( osascriptPresent( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"applescript");return (char *)1;} >+- strcpy( lDialogString , "osascript "); >+- if ( ! osx9orBetter() ) strcat( lDialogString , " -e 'tell application \"Finder\"' -e 'Activate'"); >+- strcat( lDialogString , " -e 'try' -e 'POSIX path of ( choose file name " ); >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "with prompt \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\" ") ; >+- } >+- getPathWithoutFinalSlash( lString , aDefaultPathAndFile ) ; >+- if ( strlen(lString) ) >+- { >+- strcat(lDialogString, "default location \"") ; >+- strcat(lDialogString, lString ) ; >+- strcat(lDialogString , "\" " ) ; >+- } >+- getLastName( lString , aDefaultPathAndFile ) ; >+- if ( strlen(lString) ) >+- { >+- strcat(lDialogString, "default name \"") ; >+- strcat(lDialogString, lString ) ; >+- strcat(lDialogString , "\" " ) ; >+- } >+- strcat( lDialogString , ")' " ) ; >+- strcat(lDialogString, "-e 'on error number -128' " ) ; >+- strcat(lDialogString, "-e 'end try'") ; >+- if ( ! osx9orBetter() ) strcat( lDialogString, " -e 'end tell'") ; >+- } >+- else if ( tfd_kdialogPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"kdialog");return (char *)1;} >++ strcpy( lDialogString , "kdialog" ) ; >++ if ( (tfd_kdialogPresent() == 2) && tfd_xpropPresent() ) >++ { >++ strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >++ } >++ strcat( lDialogString , " --getsavefilename " ) ; >+ >+- strcpy( lDialogString , "kdialog" ) ; >+- if ( (tfd_kdialogPresent() == 2) && tfd_xpropPresent() ) >+- { >+- strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >+- } >+- strcat( lDialogString , " --getsavefilename " ) ; >++ if ( aDefaultPathAndOrFile && strlen(aDefaultPathAndOrFile) ) >++ { >++ if ( aDefaultPathAndOrFile[0] != '/' ) >++ { >++ strcat(lDialogString, lLastDirectory) ; >++ strcat(lDialogString , "/" ) ; >++ } >++ strcat(lDialogString, "\"") ; >++ strcat(lDialogString, aDefaultPathAndOrFile ) ; >++ strcat(lDialogString , "\"" ) ; >++ } >++ else >++ { >++ strcat(lDialogString, lLastDirectory) ; >++ strcat(lDialogString , "/" ) ; >++ } >+ >+- if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) ) >+- { >+- if ( aDefaultPathAndFile[0] != '/' ) >+- { >+- strcat(lDialogString, "$PWD/") ; >+- } >+- strcat(lDialogString, "\"") ; >+- strcat(lDialogString, aDefaultPathAndFile ) ; >+- strcat(lDialogString , "\"" ) ; >+- } >+- else >+- { >+- strcat(lDialogString, "$PWD/") ; >+- } >+- >+- if ( aNumOfFilterPatterns > 0 ) >+- { >+- strcat(lDialogString , " \"" ) ; >+- strcat( lDialogString , aFilterPatterns[0] ) ; >+- for ( i = 1 ; i < aNumOfFilterPatterns ; i ++ ) >+- { >+- strcat( lDialogString , " " ) ; >+- strcat( lDialogString , aFilterPatterns[i] ) ; >+- } >+- if ( aSingleFilterDescription && strlen(aSingleFilterDescription) ) >+- { >+- strcat( lDialogString , " | " ) ; >+- strcat( lDialogString , aSingleFilterDescription ) ; >+- } >+- strcat( lDialogString , "\"" ) ; >+- } >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, " --title \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\"") ; >+- } >+- } >+- else if ( tfd_zenityPresent() || tfd_matedialogPresent() || tfd_shellementaryPresent() || tfd_qarmaPresent() ) >+- { >+- if ( tfd_zenityPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"zenity");return (char *)1;} >+- strcpy( lDialogString , "zenity" ) ; >+- if ( (tfd_zenity3Present() >= 4) && !getenv("SSH_TTY") && tfd_xpropPresent() ) >+- { >+- strcat( lDialogString, " --attach=$(sleep .01;xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >+- } >+- } >+- else if ( tfd_matedialogPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"matedialog");return (char *)1;} >+- strcpy( lDialogString , "matedialog" ) ; >+- } >+- else if ( tfd_shellementaryPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"shellementary");return (char *)1;} >+- strcpy( lDialogString , "shellementary" ) ; >+- } >+- else >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"qarma");return (char *)1;} >+- strcpy( lDialogString , "qarma" ) ; >+- if ( !getenv("SSH_TTY") && tfd_xpropPresent() ) >+- { >+- strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >+- } >+- } >+- strcat(lDialogString, " --file-selection --save --confirm-overwrite" ) ; >+- >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, " --title=\"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\"") ; >+- } >+- if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) ) >+- { >+- strcat(lDialogString, " --filename=\"") ; >+- strcat(lDialogString, aDefaultPathAndFile) ; >+- strcat(lDialogString, "\"") ; >+- } >+- if ( aNumOfFilterPatterns > 0 ) >+- { >+- strcat( lDialogString , " --file-filter='" ) ; >+- if ( aSingleFilterDescription && strlen(aSingleFilterDescription) ) >+- { >+- strcat( lDialogString , aSingleFilterDescription ) ; >+- strcat( lDialogString , " |" ) ; >+- } >+- for ( i = 0 ; i < aNumOfFilterPatterns ; i ++ ) >+- { >+- strcat( lDialogString , " " ) ; >+- strcat( lDialogString , aFilterPatterns[i] ) ; >+- } >+- strcat( lDialogString , "' --file-filter='All files | *'" ) ; >+- } >+- if (tinyfd_silent) strcat( lDialogString , " 2>/dev/null "); >+- } >+- else if (tfd_yadPresent()) >+- { >+- if (aTitle && !strcmp(aTitle, "tinyfd_query")) { strcpy(tinyfd_response, "yad"); return (char*)1; } >+- strcpy(lDialogString, "yad --file-selection --save --confirm-overwrite"); >+- if (aTitle && strlen(aTitle)) >+- { >+- strcat(lDialogString, " --title=\""); >+- strcat(lDialogString, aTitle); >+- strcat(lDialogString, "\""); >+- } >+- if (aDefaultPathAndFile && strlen(aDefaultPathAndFile)) >+- { >+- strcat(lDialogString, " --filename=\""); >+- strcat(lDialogString, aDefaultPathAndFile); >+- strcat(lDialogString, "\""); >+- } >+- if (aNumOfFilterPatterns > 0) >+- { >+- strcat(lDialogString, " --file-filter='"); >+- if (aSingleFilterDescription && strlen(aSingleFilterDescription)) >+- { >+- strcat(lDialogString, aSingleFilterDescription); >+- strcat(lDialogString, " |"); >+- } >+- for (i = 0; i < aNumOfFilterPatterns; i++) >+- { >+- strcat(lDialogString, " "); >+- strcat(lDialogString, aFilterPatterns[i]); >+- } >+- strcat(lDialogString, "' --file-filter='All files | *'"); >+- } >+- if (tinyfd_silent) strcat(lDialogString, " 2>/dev/null "); >+- } >+- else if ( !xdialogPresent() && tkinter3Present( ) ) >++ if ( aNumOfFilterPatterns > 0 ) >++ { >++ strcat(lDialogString , " \"" ) ; >++ strcat( lDialogString , aFilterPatterns[0] ) ; >++ for ( i = 1 ; i < aNumOfFilterPatterns ; i ++ ) >++ { >++ strcat( lDialogString , " " ) ; >++ strcat( lDialogString , aFilterPatterns[i] ) ; >++ } >++ if ( aSingleFilterDescription && strlen(aSingleFilterDescription) ) >++ { >++ strcat( lDialogString , " | " ) ; >++ strcat( lDialogString , aSingleFilterDescription ) ; >++ } >++ strcat( lDialogString , "\"" ) ; >++ } >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, " --title \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\"") ; >++ } >++ } >++ else if ( tfd_zenityPresent() || tfd_matedialogPresent() || tfd_shellementaryPresent() || tfd_qarmaPresent() ) >+ { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python3-tkinter");return (char *)1;} >+- strcpy( lDialogString , gPython3Name ) ; >+- strcat( lDialogString , >+- " -S -c \"import tkinter;from tkinter import filedialog;root=tkinter.Tk();root.withdraw();"); >+- strcat( lDialogString , "res=filedialog.asksaveasfilename("); >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "title='") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "',") ; >+- } >+- if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) ) >+- { >+- getPathWithoutFinalSlash( lString , aDefaultPathAndFile ) ; >+- if ( strlen(lString) ) >++ if ( tfd_zenityPresent() ) >+ { >+- strcat(lDialogString, "initialdir='") ; >+- strcat(lDialogString, lString ) ; >+- strcat(lDialogString , "'," ) ; >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"zenity");return (char *)1;} >++ strcpy( lDialogString , "zenity" ) ; >++ if ( (tfd_zenity3Present() >= 4) && !getenv("SSH_TTY") && tfd_xpropPresent() ) >++ { >++ strcat( lDialogString, " --attach=$(sleep .01;xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >++ } >+ } >+- getLastName( lString , aDefaultPathAndFile ) ; >+- if ( strlen(lString) ) >++ else if ( tfd_matedialogPresent() ) >+ { >+- strcat(lDialogString, "initialfile='") ; >+- strcat(lDialogString, lString ) ; >+- strcat(lDialogString , "'," ) ; >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"matedialog");return (char *)1;} >++ strcpy( lDialogString , "matedialog" ) ; >+ } >+- } >+- if ( ( aNumOfFilterPatterns > 1 ) >+- || ( (aNumOfFilterPatterns == 1) /* test because poor osx behaviour */ >+- && ( aFilterPatterns[0][strlen(aFilterPatterns[0])-1] != '*' ) ) ) >+- { >+- strcat(lDialogString , "filetypes=(" ) ; >+- strcat( lDialogString , "('" ) ; >+- if ( aSingleFilterDescription && strlen(aSingleFilterDescription) ) >++ else if ( tfd_shellementaryPresent() ) >+ { >+- strcat( lDialogString , aSingleFilterDescription ) ; >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"shellementary");return (char *)1;} >++ strcpy( lDialogString , "shellementary" ) ; >+ } >+- strcat( lDialogString , "',(" ) ; >+- for ( i = 0 ; i < aNumOfFilterPatterns ; i ++ ) >++ else >+ { >+- strcat( lDialogString , "'" ) ; >+- strcat( lDialogString , aFilterPatterns[i] ) ; >+- strcat( lDialogString , "'," ) ; >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"qarma");return (char *)1;} >++ strcpy( lDialogString , "qarma" ) ; >++ if ( !getenv("SSH_TTY") && tfd_xpropPresent() ) >++ { >++ strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >++ } >+ } >+- strcat( lDialogString , "))," ) ; >+- strcat( lDialogString , "('All files','*'))" ) ; >+- } >+- strcat( lDialogString, ");\nif not isinstance(res, tuple):\n\tprint(res)\n\"" ) ; >++ strcat(lDialogString, " --file-selection --save --confirm-overwrite" ) ; >++ >++ strcat(lDialogString, " --title=\"") ; >++ if (aTitle && strlen(aTitle)) strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\"") ; >++ >++ if ( aDefaultPathAndOrFile && strlen(aDefaultPathAndOrFile) ) >++ { >++ strcat(lDialogString, " --filename=\"") ; >++ strcat(lDialogString, aDefaultPathAndOrFile) ; >++ strcat(lDialogString, "\"") ; >++ } >++ if ( aNumOfFilterPatterns > 0 ) >++ { >++ strcat( lDialogString , " --file-filter='" ) ; >++ if ( aSingleFilterDescription && strlen(aSingleFilterDescription) ) >++ { >++ strcat( lDialogString , aSingleFilterDescription ) ; >++ strcat( lDialogString , " |" ) ; >++ } >++ for ( i = 0 ; i < aNumOfFilterPatterns ; i ++ ) >++ { >++ strcat( lDialogString , " " ) ; >++ strcat( lDialogString , aFilterPatterns[i] ) ; >++ } >++ strcat( lDialogString , "' --file-filter='All files | *'" ) ; >++ } >++ if (tinyfd_silent) strcat( lDialogString , " 2>/dev/null "); >+ } >+- else if ( !xdialogPresent() && tkinter2Present( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python2-tkinter");return (char *)1;} >+- strcpy( lDialogString , "export PYTHONIOENCODING=utf-8;" ) ; >+- strcat( lDialogString , gPython2Name ) ; >+- if ( ! isTerminalRunning( ) && tfd_isDarwin( )) >+- { >+- strcat( lDialogString , " -i" ) ; /* for osx without console */ >+- } >+- strcat( lDialogString , >++ else if (tfd_yadPresent()) >++ { >++ if (aTitle && !strcmp(aTitle, "tinyfd_query")) { strcpy(tinyfd_response, "yad"); return (char*)1; } >++ strcpy(lDialogString, "yad --file --save --confirm-overwrite"); >++ if (aTitle && strlen(aTitle)) >++ { >++ strcat(lDialogString, " --title=\""); >++ strcat(lDialogString, aTitle); >++ strcat(lDialogString, "\""); >++ } >++ if (aDefaultPathAndOrFile && strlen(aDefaultPathAndOrFile)) >++ { >++ strcat(lDialogString, " --filename=\""); >++ strcat(lDialogString, aDefaultPathAndOrFile); >++ strcat(lDialogString, "\""); >++ } >++ if (aNumOfFilterPatterns > 0) >++ { >++ strcat(lDialogString, " --file-filter='"); >++ if (aSingleFilterDescription && strlen(aSingleFilterDescription)) >++ { >++ strcat(lDialogString, aSingleFilterDescription); >++ strcat(lDialogString, " |"); >++ } >++ for (i = 0; i < aNumOfFilterPatterns; i++) >++ { >++ strcat(lDialogString, " "); >++ strcat(lDialogString, aFilterPatterns[i]); >++ } >++ strcat(lDialogString, "' --file-filter='All files | *'"); >++ } >++ if (tinyfd_silent) strcat(lDialogString, " 2>/dev/null "); >++ } >++ else if ( !xdialogPresent() && tkinter3Present( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python3-tkinter");return (char *)1;} >++ strcpy( lDialogString , gPython3Name ) ; >++ strcat( lDialogString , >++ " -S -c \"import tkinter;from tkinter import filedialog;root=tkinter.Tk();root.withdraw();"); >++ strcat( lDialogString , "res=filedialog.asksaveasfilename("); >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "title='") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "',") ; >++ } >++ if ( aDefaultPathAndOrFile && strlen(aDefaultPathAndOrFile) ) >++ { >++ getPathWithoutFinalSlash( lString , aDefaultPathAndOrFile ) ; >++ if ( strlen(lString) ) >++ { >++ strcat(lDialogString, "initialdir='") ; >++ strcat(lDialogString, lString ) ; >++ strcat(lDialogString , "'," ) ; >++ } >++ getLastName( lString , aDefaultPathAndOrFile ) ; >++ if ( strlen(lString) ) >++ { >++ strcat(lDialogString, "initialfile='") ; >++ strcat(lDialogString, lString ) ; >++ strcat(lDialogString , "'," ) ; >++ } >++ } >++ if ( ( aNumOfFilterPatterns > 1 ) >++ || ( (aNumOfFilterPatterns == 1) /* test because poor osx behaviour */ >++ && ( aFilterPatterns[0][strlen(aFilterPatterns[0])-1] != '*' ) ) ) >++ { >++ strcat(lDialogString , "filetypes=(" ) ; >++ strcat( lDialogString , "('" ) ; >++ if ( aSingleFilterDescription && strlen(aSingleFilterDescription) ) >++ { >++ strcat( lDialogString , aSingleFilterDescription ) ; >++ } >++ strcat( lDialogString , "',(" ) ; >++ for ( i = 0 ; i < aNumOfFilterPatterns ; i ++ ) >++ { >++ strcat( lDialogString , "'" ) ; >++ strcat( lDialogString , aFilterPatterns[i] ) ; >++ strcat( lDialogString , "'," ) ; >++ } >++ strcat( lDialogString , "))," ) ; >++ strcat( lDialogString , "('All files','*'))" ) ; >++ } >++ strcat( lDialogString, ");\nif not isinstance(res, tuple):\n\tprint(res)\n\"" ) ; >++ } >++ else if ( !xdialogPresent() && tkinter2Present( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python2-tkinter");return (char *)1;} >++ strcpy( lDialogString , "export PYTHONIOENCODING=utf-8;" ) ; >++ strcat( lDialogString , gPython2Name ) ; >++ if ( ! isTerminalRunning( ) && tfd_isDarwin( )) >++ { >++ strcat( lDialogString , " -i" ) ; /* for osx without console */ >++ } >++ strcat( lDialogString , >+ " -S -c \"import Tkinter,tkFileDialog;root=Tkinter.Tk();root.withdraw();"); >+ >+- if ( tfd_isDarwin( ) ) >+- { >+- strcat( lDialogString , >++ if ( tfd_isDarwin( ) ) >++ { >++ strcat( lDialogString , >+ "import os;os.system('''/usr/bin/osascript -e 'tell app \\\"Finder\\\" to set\ >+ frontmost of process \\\"Python\\\" to true' ''');"); >+- } >++ } >+ >+- strcat( lDialogString , "res=tkFileDialog.asksaveasfilename("); >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "title='") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "',") ; >+- } >+- if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) ) >+- { >+- getPathWithoutFinalSlash( lString , aDefaultPathAndFile ) ; >+- if ( strlen(lString) ) >+- { >+- strcat(lDialogString, "initialdir='") ; >+- strcat(lDialogString, lString ) ; >+- strcat(lDialogString , "'," ) ; >+- } >+- getLastName( lString , aDefaultPathAndFile ) ; >+- if ( strlen(lString) ) >+- { >+- strcat(lDialogString, "initialfile='") ; >+- strcat(lDialogString, lString ) ; >+- strcat(lDialogString , "'," ) ; >+- } >+- } >+- if ( ( aNumOfFilterPatterns > 1 ) >+- || ( (aNumOfFilterPatterns == 1) /* test because poor osx behaviour */ >+- && ( aFilterPatterns[0][strlen(aFilterPatterns[0])-1] != '*' ) ) ) >+- { >+- strcat(lDialogString , "filetypes=(" ) ; >+- strcat( lDialogString , "('" ) ; >+- if ( aSingleFilterDescription && strlen(aSingleFilterDescription) ) >+- { >+- strcat( lDialogString , aSingleFilterDescription ) ; >+- } >+- strcat( lDialogString , "',(" ) ; >+- for ( i = 0 ; i < aNumOfFilterPatterns ; i ++ ) >+- { >+- strcat( lDialogString , "'" ) ; >+- strcat( lDialogString , aFilterPatterns[i] ) ; >+- strcat( lDialogString , "'," ) ; >+- } >+- strcat( lDialogString , "))," ) ; >+- strcat( lDialogString , "('All files','*'))" ) ; >+- } >+- strcat( lDialogString, ");\nif not isinstance(res, tuple):\n\tprint res \n\"" ) ; >+- } >+- else if ( xdialogPresent() || dialogName() ) >+- { >+- if ( xdialogPresent( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"xdialog");return (char *)1;} >+- lWasGraphicDialog = 1 ; >+- strcpy( lDialogString , "(Xdialog " ) ; >+- } >+- else if ( isTerminalRunning( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"dialog");return (char *)0;} >+- strcpy( lDialogString , "(dialog " ) ; >+- } >+- else >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"dialog");return (char *)0;} >+- lWasXterm = 1 ; >+- strcpy( lDialogString , terminalName() ) ; >+- strcat( lDialogString , "'(" ) ; >+- strcat( lDialogString , dialogName() ) ; >+- strcat( lDialogString , " " ) ; >+- } >++ strcat( lDialogString , "res=tkFileDialog.asksaveasfilename("); >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "title='") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "',") ; >++ } >++ if ( aDefaultPathAndOrFile && strlen(aDefaultPathAndOrFile) ) >++ { >++ getPathWithoutFinalSlash( lString , aDefaultPathAndOrFile ) ; >++ if ( strlen(lString) ) >++ { >++ strcat(lDialogString, "initialdir='") ; >++ strcat(lDialogString, lString ) ; >++ strcat(lDialogString , "'," ) ; >++ } >++ getLastName( lString , aDefaultPathAndOrFile ) ; >++ if ( strlen(lString) ) >++ { >++ strcat(lDialogString, "initialfile='") ; >++ strcat(lDialogString, lString ) ; >++ strcat(lDialogString , "'," ) ; >++ } >++ } >++ if ( ( aNumOfFilterPatterns > 1 ) >++ || ( (aNumOfFilterPatterns == 1) /* test because poor osx behaviour */ >++ && ( aFilterPatterns[0][strlen(aFilterPatterns[0])-1] != '*' ) ) ) >++ { >++ strcat(lDialogString , "filetypes=(" ) ; >++ strcat( lDialogString , "('" ) ; >++ if ( aSingleFilterDescription && strlen(aSingleFilterDescription) ) >++ { >++ strcat( lDialogString , aSingleFilterDescription ) ; >++ } >++ strcat( lDialogString , "',(" ) ; >++ for ( i = 0 ; i < aNumOfFilterPatterns ; i ++ ) >++ { >++ strcat( lDialogString , "'" ) ; >++ strcat( lDialogString , aFilterPatterns[i] ) ; >++ strcat( lDialogString , "'," ) ; >++ } >++ strcat( lDialogString , "))," ) ; >++ strcat( lDialogString , "('All files','*'))" ) ; >++ } >++ strcat( lDialogString, ");\nif not isinstance(res, tuple):\n\tprint res \n\"" ) ; >++ } >++ else if ( xdialogPresent() || dialogName() ) >++ { >++ if ( xdialogPresent( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"xdialog");return (char *)1;} >++ lWasGraphicDialog = 1 ; >++ strcpy( lDialogString , "(Xdialog " ) ; >++ } >++ else if ( isTerminalRunning( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"dialog");return (char *)0;} >++ strcpy( lDialogString , "(dialog " ) ; >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"dialog");return (char *)0;} >++ lWasXterm = 1 ; >++ strcpy( lDialogString , terminalName() ) ; >++ strcat( lDialogString , "'(" ) ; >++ strcat( lDialogString , dialogName() ) ; >++ strcat( lDialogString , " " ) ; >++ } >+ >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "--title \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\" ") ; >+- } >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "--title \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\" ") ; >++ } >+ >+- if ( !xdialogPresent() && !gdialogPresent() ) >+- { >+- strcat(lDialogString, "--backtitle \"") ; >+- strcat(lDialogString, >+- "tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY") ; >+- strcat(lDialogString, "\" ") ; >+- } >++ if ( !xdialogPresent() && !gdialogPresent() ) >++ { >++ strcat(lDialogString, "--backtitle \"") ; >++ strcat(lDialogString, >++ "tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY") ; >++ strcat(lDialogString, "\" ") ; >++ } >+ >+- strcat( lDialogString , "--fselect \"" ) ; >+- if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) ) >+- { >+- if ( ! strchr(aDefaultPathAndFile, '/') ) >+- { >+- strcat(lDialogString, "./") ; >+- } >+- strcat(lDialogString, aDefaultPathAndFile) ; >+- } >+- else if ( ! isTerminalRunning( ) && !lWasGraphicDialog ) >+- { >+- strcat(lDialogString, getenv("HOME")) ; >+- strcat(lDialogString, "/") ; >+- } >+- else >+- { >+- strcat(lDialogString, "./") ; >+- } >++ strcat( lDialogString , "--fselect \"" ) ; >++ if ( aDefaultPathAndOrFile && strlen(aDefaultPathAndOrFile) ) >++ { >++ if ( ! strchr(aDefaultPathAndOrFile, '/') ) >++ { >++ strcat(lDialogString, "./") ; >++ } >++ strcat(lDialogString, aDefaultPathAndOrFile) ; >++ } >++ else if ( ! isTerminalRunning( ) && !lWasGraphicDialog ) >++ { >++ strcat(lDialogString, getenv("HOME")) ; >++ strcat(lDialogString, "/") ; >++ } >++ else >++ { >++ strcat(lDialogString, "./") ; >++ } >+ >+- if ( lWasGraphicDialog ) >+- { >+- strcat(lDialogString, "\" 0 60 ) 2>&1 ") ; >+- } >+- else >+- { >+- strcat(lDialogString, "\" 0 60 >/dev/tty) ") ; >+- if ( lWasXterm ) >+- { >+- strcat( lDialogString , >+- "2>/tmp/tinyfd.txt';cat /tmp/tinyfd.txt;rm /tmp/tinyfd.txt"); >+- } >+- else >+- { >+- strcat(lDialogString, "2>&1 ; clear >/dev/tty") ; >+- } >+- } >+- } >+- else >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){return tinyfd_inputBox(aTitle,NULL,NULL);} >+- strcpy(lBuff, "Save file in "); >+- strcat(lBuff, getCurDir()); >+- lPointerInputBox = tinyfd_inputBox(NULL, NULL, NULL); /* obtain a pointer on the current content of tinyfd_inputBox */ >+- if (lPointerInputBox) strcpy(lString, lPointerInputBox); /* preserve the current content of tinyfd_inputBox */ >+- p = tinyfd_inputBox(aTitle, lBuff, ""); >+- if (p) strcpy(lBuff, p); else lBuff[0] = '\0'; >+- if (lPointerInputBox) strcpy(lPointerInputBox, lString); /* restore its previous content to tinyfd_inputBox */ >+- p = lBuff; >++ if ( lWasGraphicDialog ) >++ { >++ strcat(lDialogString, "\" 0 60 ) 2>&1 ") ; >++ } >++ else >++ { >++ strcat(lDialogString, "\" 0 60 >/dev/tty) ") ; >++ if ( lWasXterm ) >++ { >++ strcat( lDialogString , >++ "2>/tmp/tinyfd.txt';cat /tmp/tinyfd.txt;rm /tmp/tinyfd.txt"); >++ } >++ else >++ { >++ strcat(lDialogString, "2>&1 ; clear >/dev/tty") ; >++ } >++ } >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){return tinyfd_inputBox(aTitle,NULL,NULL);} >++ strcpy(lBuff, "Save file in "); >++ strcat(lBuff, getCurDir()); >++ lPointerInputBox = tinyfd_inputBox(NULL, NULL, NULL); /* obtain a pointer on the current content of tinyfd_inputBox */ >++ if (lPointerInputBox) strcpy(lString, lPointerInputBox); /* preserve the current content of tinyfd_inputBox */ >++ p = tinyfd_inputBox(aTitle, lBuff, ""); >++ if (p) strcpy(lBuff, p); else lBuff[0] = '\0'; >++ if (lPointerInputBox) strcpy(lPointerInputBox, lString); /* restore its previous content to tinyfd_inputBox */ >++ p = lBuff; >+ >+- getPathWithoutFinalSlash( lString , p ) ; >+- if ( strlen( lString ) && ! dirExists( lString ) ) >+- { >+- return NULL ; >+- } >+- getLastName(lString,p); >+- if ( ! strlen(lString) ) >+- { >+- return NULL; >+- } >+- return p ; >+- } >++ getPathWithoutFinalSlash( lString , p ) ; >++ if ( strlen( lString ) && ! dirExists( lString ) ) >++ { >++ return NULL ; >++ } >++ getLastName(lString,p); >++ if ( ! strlen(lString) ) >++ { >++ return NULL; >++ } >++ return p ; >++ } >+ >+- if (tinyfd_verbose) printf( "lDialogString: %s\n" , lDialogString ) ; >+- if ( ! ( lIn = popen( lDialogString , "r" ) ) ) >++ if (tinyfd_verbose) printf( "lDialogString: %s\n" , lDialogString ) ; >++ if ( ! ( lIn = popen( lDialogString , "r" ) ) ) >++ { >++ return NULL ; >++ } >++ while ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >++ {} >++ pclose( lIn ) ; >++ if ( strlen(lBuff) && lBuff[strlen( lBuff ) -1] == '\n' ) >++ { >++ lBuff[strlen( lBuff ) -1] = '\0' ; >++ } >++ /* printf( "lBuff: %s\n" , lBuff ) ; */ >++ if ( ! strlen(lBuff) ) >+ { >+- return NULL ; >++ return NULL; >+ } >+- while ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >+- {} >+- pclose( lIn ) ; >+- if ( lBuff[strlen( lBuff ) -1] == '\n' ) >++ >++ getPathWithoutFinalSlash( lString , lBuff ) ; >++ if ( strlen( lString ) && ! dirExists( lString ) ) >++ { >++ return NULL ; >++ } >++ strcpy(lLastDirectory, lString) ; >++ >++ getLastName(lString,lBuff); >++ if ( ! filenameValid(lString) ) >+ { >+- lBuff[strlen( lBuff ) -1] = '\0' ; >++ return NULL; >+ } >+- /* printf( "lBuff: %s\n" , lBuff ) ; */ >+- if ( ! strlen(lBuff) ) >+- { >+- return NULL; >+- } >+- getPathWithoutFinalSlash( lString , lBuff ) ; >+- if ( strlen( lString ) && ! dirExists( lString ) ) >+- { >+- return NULL ; >+- } >+- getLastName(lString,lBuff); >+- if ( ! filenameValid(lString) ) >+- { >+- return NULL; >+- } >+- return lBuff ; >++ return lBuff ; >+ } >+ >+ >+ /* in case of multiple files, the separator is | */ >+ char * tinyfd_openFileDialog( >+- char const * aTitle , /* NULL or "" */ >+- char const * aDefaultPathAndFile , /* NULL or "" */ >+- int aNumOfFilterPatterns , /* 0 */ >+- char const * const * aFilterPatterns , /* NULL or {"*.jpg","*.png"} */ >+- char const * aSingleFilterDescription , /* NULL or "image files" */ >+- int aAllowMultipleSelects ) /* 0 or 1 */ >++ char const * aTitle , /* NULL or "" */ >++ char const * aDefaultPathAndOrFile , /* NULL or "" , ends with / to set only a directory */ >++ int aNumOfFilterPatterns , /* 0 */ >++ char const * const * aFilterPatterns , /* NULL or {"*.jpg","*.png"} */ >++ char const * aSingleFilterDescription , /* NULL or "image files" */ >++ int aAllowMultipleSelects ) /* 0 or 1 */ >+ { >+- char lDialogString[MAX_PATH_OR_CMD] ; >+- char lString[MAX_PATH_OR_CMD] ; >+- int i ; >+- FILE * lIn ; >+- char * p ; >+- char * lPointerInputBox ; >+- int lWasKdialog = 0 ; >+- int lWasGraphicDialog = 0 ; >+- int lWasXterm = 0 ; >+- size_t lFullBuffLen ; >+- static char * lBuff = NULL; >++ static char * lBuff = NULL; >++ static char lLastDirectory[MAX_PATH_OR_CMD] = "$PWD" ; >+ >+- if (tfd_quoteDetected(aTitle)) return tinyfd_openFileDialog("INVALID TITLE WITH QUOTES", aDefaultPathAndFile, aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription, aAllowMultipleSelects); >+- if (tfd_quoteDetected(aDefaultPathAndFile)) return tinyfd_openFileDialog(aTitle, "INVALID DEFAULT_PATH WITH QUOTES", aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription, aAllowMultipleSelects); >+- if (tfd_quoteDetected(aSingleFilterDescription)) return tinyfd_openFileDialog(aTitle, aDefaultPathAndFile, aNumOfFilterPatterns, aFilterPatterns, "INVALID FILTER_DESCRIPTION WITH QUOTES", aAllowMultipleSelects); >+- for (i = 0; i < aNumOfFilterPatterns; i++) >+- { >+- if (tfd_quoteDetected(aFilterPatterns[i])) return tinyfd_openFileDialog("INVALID FILTER_PATTERN WITH QUOTES", aDefaultPathAndFile, 0, NULL, NULL, aAllowMultipleSelects); >+- } >++ char lDialogString[MAX_PATH_OR_CMD] ; >++ char lString[MAX_PATH_OR_CMD] ; >++ int i ; >++ FILE * lIn ; >++ char * p ; >++ char * lPointerInputBox ; >++ size_t lFullBuffLen ; >++ int lWasKdialog = 0 ; >++ int lWasGraphicDialog = 0 ; >++ int lWasXterm = 0 ; >+ >+- free(lBuff); >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")) >+- { >+- lBuff = NULL; >+- } >+- else >+- { >+- if (aAllowMultipleSelects) >+- { >+- lFullBuffLen = MAX_MULTIPLE_FILES * MAX_PATH_OR_CMD + 1; >+- lBuff = (char *)(malloc(lFullBuffLen * sizeof(char))); >+- if (!lBuff) >++ if ( ! aFilterPatterns ) aNumOfFilterPatterns = 0 ; >++ if (tfd_quoteDetected(aTitle)) return tinyfd_openFileDialog("INVALID TITLE WITH QUOTES", aDefaultPathAndOrFile, aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription, aAllowMultipleSelects); >++ if (tfd_quoteDetected(aDefaultPathAndOrFile)) return tinyfd_openFileDialog(aTitle, "INVALID DEFAULT_PATH WITH QUOTES", aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription, aAllowMultipleSelects); >++ if (tfd_quoteDetected(aSingleFilterDescription)) return tinyfd_openFileDialog(aTitle, aDefaultPathAndOrFile, aNumOfFilterPatterns, aFilterPatterns, "INVALID FILTER_DESCRIPTION WITH QUOTES", aAllowMultipleSelects); >++ for (i = 0; i < aNumOfFilterPatterns; i++) >+ { >+- lFullBuffLen = LOW_MULTIPLE_FILES * MAX_PATH_OR_CMD + 1; >+- lBuff = (char *)( malloc( lFullBuffLen * sizeof(char))); >++ if (tfd_quoteDetected(aFilterPatterns[i])) return tinyfd_openFileDialog("INVALID FILTER_PATTERN WITH QUOTES: use the GRAVE ACCENT \\x60 instead.", aDefaultPathAndOrFile, 0, NULL, NULL, aAllowMultipleSelects); >+ } >+- } >+- else >+- { >+- lFullBuffLen = MAX_PATH_OR_CMD + 1; >+- lBuff = (char *)(malloc(lFullBuffLen * sizeof(char))); >+- } >+- if (!lBuff) return NULL; >+- lBuff[0]='\0'; >+- } >+ >+- if ( osascriptPresent( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"applescript");return (char *)1;} >+- strcpy( lDialogString , "osascript "); >+- if ( ! osx9orBetter() ) strcat( lDialogString , " -e 'tell application \"System Events\"' -e 'Activate'"); >+- strcat( lDialogString , " -e 'try' -e '" ); >+- if ( ! aAllowMultipleSelects ) >+- { >++ free(lBuff); >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")) >++ { >++ lBuff = NULL; >++ } >++ else >++ { >++ if (aAllowMultipleSelects) >++ { >++ lFullBuffLen = MAX_MULTIPLE_FILES * MAX_PATH_OR_CMD + 1; >++ lBuff = (char *) malloc(lFullBuffLen * sizeof(char)); >++ if (!lBuff) >++ { >++ lFullBuffLen = LOW_MULTIPLE_FILES * MAX_PATH_OR_CMD + 1; >++ lBuff = (char *) malloc( lFullBuffLen * sizeof(char)); >++ } >++ } >++ else >++ { >++ lFullBuffLen = MAX_PATH_OR_CMD + 1; >++ lBuff = (char *) malloc(lFullBuffLen * sizeof(char)); >++ } >++ if (!lBuff) return NULL; >++ lBuff[0]='\0'; >++ } >+ >++ if ( osascriptPresent( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"applescript");return (char *)1;} >++ strcpy( lDialogString , "osascript "); >++ if ( ! osx9orBetter() ) strcat( lDialogString , " -e 'tell application \"System Events\"' -e 'Activate'"); >++ strcat( lDialogString , " -e 'try' -e '" ); >++ if ( ! aAllowMultipleSelects ) >++ { >+ >+- strcat( lDialogString , "POSIX path of ( " ); >+- } >+- else >+- { >+- strcat( lDialogString , "set mylist to " ); >+- } >+- strcat( lDialogString , "choose file " ); >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "with prompt \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\" ") ; >+- } >+- getPathWithoutFinalSlash( lString , aDefaultPathAndFile ) ; >+- if ( strlen(lString) ) >+- { >+- strcat(lDialogString, "default location \"") ; >+- strcat(lDialogString, lString ) ; >+- strcat(lDialogString , "\" " ) ; >+- } >+- if ( aNumOfFilterPatterns > 0 ) >+- { >+- strcat(lDialogString , "of type {\"" ); >+- strcat( lDialogString , aFilterPatterns[0] + 2 ) ; >+- strcat( lDialogString , "\"" ) ; >+- for ( i = 1 ; i < aNumOfFilterPatterns ; i ++ ) >+- { >+- strcat( lDialogString , ",\"" ) ; >+- strcat( lDialogString , aFilterPatterns[i] + 2) ; >+- strcat( lDialogString , "\"" ) ; >+- } >+- strcat( lDialogString , "} " ) ; >+- } >+- if ( aAllowMultipleSelects ) >+- { >+- strcat( lDialogString , "multiple selections allowed true ' " ) ; >+- strcat( lDialogString , >+- "-e 'set mystring to POSIX path of item 1 of mylist' " ); >+- strcat( lDialogString , >+- "-e 'repeat with i from 2 to the count of mylist' " ); >+- strcat( lDialogString , "-e 'set mystring to mystring & \"|\"' " ); >+- strcat( lDialogString , >+- "-e 'set mystring to mystring & POSIX path of item i of mylist' " ); >+- strcat( lDialogString , "-e 'end repeat' " ); >+- strcat( lDialogString , "-e 'mystring' " ); >+- } >+- else >+- { >+- strcat( lDialogString , ")' " ) ; >+- } >+- strcat(lDialogString, "-e 'on error number -128' " ) ; >+- strcat(lDialogString, "-e 'end try'") ; >+- if ( ! osx9orBetter() ) strcat( lDialogString, " -e 'end tell'") ; >+- } >+- else if ( tfd_kdialogPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"kdialog");return (char *)1;} >+- lWasKdialog = 1 ; >+ >+- strcpy( lDialogString , "kdialog" ) ; >+- if ( (tfd_kdialogPresent() == 2) && tfd_xpropPresent() ) >+- { >+- strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >+- } >+- strcat( lDialogString , " --getopenfilename " ) ; >+- >+- if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) ) >+- { >+- if ( aDefaultPathAndFile[0] != '/' ) >+- { >+- strcat(lDialogString, "$PWD/") ; >+- } >+- strcat(lDialogString, "\"") ; >+- strcat(lDialogString, aDefaultPathAndFile ) ; >+- strcat(lDialogString , "\"" ) ; >+- } >+- else >+- { >+- strcat(lDialogString, "$PWD/") ; >+- } >+- >+- if ( aNumOfFilterPatterns > 0 ) >+- { >+- strcat(lDialogString , " \"" ) ; >+- strcat( lDialogString , aFilterPatterns[0] ) ; >+- for ( i = 1 ; i < aNumOfFilterPatterns ; i ++ ) >+- { >+- strcat( lDialogString , " " ) ; >+- strcat( lDialogString , aFilterPatterns[i] ) ; >+- } >+- if ( aSingleFilterDescription && strlen(aSingleFilterDescription) ) >+- { >+- strcat( lDialogString , " | " ) ; >+- strcat( lDialogString , aSingleFilterDescription ) ; >+- } >+- strcat( lDialogString , "\"" ) ; >+- } >+- if ( aAllowMultipleSelects ) >+- { >+- strcat( lDialogString , " --multiple --separate-output" ) ; >+- } >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, " --title \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\"") ; >+- } >+- } >+- else if ( tfd_zenityPresent() || tfd_matedialogPresent() || tfd_shellementaryPresent() || tfd_qarmaPresent() ) >+- { >+- if ( tfd_zenityPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"zenity");return (char *)1;} >+- strcpy( lDialogString , "zenity" ) ; >+- if ( (tfd_zenity3Present() >= 4) && !getenv("SSH_TTY") && tfd_xpropPresent() ) >+- { >+- strcat( lDialogString, " --attach=$(sleep .01;xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >+- } >+- } >+- else if ( tfd_matedialogPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"matedialog");return (char *)1;} >+- strcpy( lDialogString , "matedialog" ) ; >+- } >+- else if ( tfd_shellementaryPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"shellementary");return (char *)1;} >+- strcpy( lDialogString , "shellementary" ) ; >+- } >+- else >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"qarma");return (char *)1;} >+- strcpy( lDialogString , "qarma" ) ; >+- if ( !getenv("SSH_TTY") && tfd_xpropPresent() ) >+- { >+- strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >+- } >+- } >+- strcat( lDialogString , " --file-selection" ) ; >+- >+- if ( aAllowMultipleSelects ) >+- { >+- strcat( lDialogString , " --multiple" ) ; >+- } >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, " --title=\"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\"") ; >+- } >+- if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) ) >+- { >+- strcat(lDialogString, " --filename=\"") ; >+- strcat(lDialogString, aDefaultPathAndFile) ; >+- strcat(lDialogString, "\"") ; >+- } >+- if ( aNumOfFilterPatterns > 0 ) >+- { >+- strcat( lDialogString , " --file-filter='" ) ; >+- if ( aSingleFilterDescription && strlen(aSingleFilterDescription) ) >+- { >+- strcat( lDialogString , aSingleFilterDescription ) ; >+- strcat( lDialogString , " |" ) ; >+- } >+- for ( i = 0 ; i < aNumOfFilterPatterns ; i ++ ) >+- { >+- strcat( lDialogString , " " ) ; >+- strcat( lDialogString , aFilterPatterns[i] ) ; >+- } >+- strcat( lDialogString , "' --file-filter='All files | *'" ) ; >+- } >+- if (tinyfd_silent) strcat( lDialogString , " 2>/dev/null "); >+- } >+- else if (tfd_yadPresent()) >+- { >+- if (aTitle && !strcmp(aTitle, "tinyfd_query")) { strcpy(tinyfd_response, "yad"); return (char*)1; } >+- strcpy(lDialogString, "yad --file-selection"); >+- if (aAllowMultipleSelects) >+- { >+- strcat(lDialogString, " --multiple"); >+- } >+- if (aTitle && strlen(aTitle)) >+- { >+- strcat(lDialogString, " --title=\""); >+- strcat(lDialogString, aTitle); >+- strcat(lDialogString, "\""); >+- } >+- if (aDefaultPathAndFile && strlen(aDefaultPathAndFile)) >+- { >+- strcat(lDialogString, " --filename=\""); >+- strcat(lDialogString, aDefaultPathAndFile); >+- strcat(lDialogString, "\""); >+- } >+- if (aNumOfFilterPatterns > 0) >+- { >+- strcat(lDialogString, " --file-filter='"); >+- if (aSingleFilterDescription && strlen(aSingleFilterDescription)) >+- { >+- strcat(lDialogString, aSingleFilterDescription); >+- strcat(lDialogString, " |"); >+- } >+- for (i = 0; i < aNumOfFilterPatterns; i++) >+- { >+- strcat(lDialogString, " "); >+- strcat(lDialogString, aFilterPatterns[i]); >+- } >+- strcat(lDialogString, "' --file-filter='All files | *'"); >+- } >+- if (tinyfd_silent) strcat(lDialogString, " 2>/dev/null "); >+- } >+- else if ( tkinter3Present( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python3-tkinter");return (char *)1;} >+- strcpy( lDialogString , gPython3Name ) ; >+- strcat( lDialogString , >+- " -S -c \"import tkinter;from tkinter import filedialog;root=tkinter.Tk();root.withdraw();"); >+- strcat( lDialogString , "lFiles=filedialog.askopenfilename("); >+- if ( aAllowMultipleSelects ) >+- { >+- strcat( lDialogString , "multiple=1," ) ; >+- } >++ strcat( lDialogString , "POSIX path of ( " ); >++ } >++ else >++ { >++ strcat( lDialogString , "set mylist to " ); >++ } >++ strcat( lDialogString , "choose file " ); >+ if ( aTitle && strlen(aTitle) ) >+ { >+- strcat(lDialogString, "title='") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "',") ; >++ strcat(lDialogString, "with prompt \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\" ") ; >+ } >+- if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) ) >+- { >+- getPathWithoutFinalSlash( lString , aDefaultPathAndFile ) ; >++ getPathWithoutFinalSlash( lString , aDefaultPathAndOrFile ) ; >+ if ( strlen(lString) ) >+ { >+- strcat(lDialogString, "initialdir='") ; >+- strcat(lDialogString, lString ) ; >+- strcat(lDialogString , "'," ) ; >++ strcat(lDialogString, "default location \"") ; >++ strcat(lDialogString, lString ) ; >++ strcat(lDialogString , "\" " ) ; >+ } >+- getLastName( lString , aDefaultPathAndFile ) ; >+- if ( strlen(lString) ) >++ if ( aNumOfFilterPatterns > 0 ) >+ { >+- strcat(lDialogString, "initialfile='") ; >+- strcat(lDialogString, lString ) ; >+- strcat(lDialogString , "'," ) ; >++ strcat(lDialogString , "of type {\"" ); >++ strcat( lDialogString , aFilterPatterns[0] + 2 ) ; >++ strcat( lDialogString , "\"" ) ; >++ for ( i = 1 ; i < aNumOfFilterPatterns ; i ++ ) >++ { >++ strcat( lDialogString , ",\"" ) ; >++ strcat( lDialogString , aFilterPatterns[i] + 2) ; >++ strcat( lDialogString , "\"" ) ; >++ } >++ strcat( lDialogString , "} " ) ; >+ } >+- } >+- if ( ( aNumOfFilterPatterns > 1 ) >+- || ( ( aNumOfFilterPatterns == 1 ) /*test because poor osx behaviour*/ >+- && ( aFilterPatterns[0][strlen(aFilterPatterns[0])-1] != '*' ) ) ) >+- { >+- strcat(lDialogString , "filetypes=(" ) ; >+- strcat( lDialogString , "('" ) ; >+- if ( aSingleFilterDescription && strlen(aSingleFilterDescription) ) >++ if ( aAllowMultipleSelects ) >+ { >+- strcat( lDialogString , aSingleFilterDescription ) ; >++ strcat( lDialogString , "multiple selections allowed true ' " ) ; >++ strcat( lDialogString , >++ "-e 'set mystring to POSIX path of item 1 of mylist' " ); >++ strcat( lDialogString , >++ "-e 'repeat with i from 2 to the count of mylist' " ); >++ strcat( lDialogString , "-e 'set mystring to mystring & \"|\"' " ); >++ strcat( lDialogString , >++ "-e 'set mystring to mystring & POSIX path of item i of mylist' " ); >++ strcat( lDialogString , "-e 'end repeat' " ); >++ strcat( lDialogString , "-e 'mystring' " ); >+ } >+- strcat( lDialogString , "',(" ) ; >+- for ( i = 0 ; i < aNumOfFilterPatterns ; i ++ ) >++ else >+ { >+- strcat( lDialogString , "'" ) ; >+- strcat( lDialogString , aFilterPatterns[i] ) ; >+- strcat( lDialogString , "'," ) ; >++ strcat( lDialogString , ")' " ) ; >+ } >+- strcat( lDialogString , "))," ) ; >+- strcat( lDialogString , "('All files','*'))" ) ; >+- } >+- strcat( lDialogString , ");\ >++ strcat(lDialogString, "-e 'on error number -128' " ) ; >++ strcat(lDialogString, "-e 'end try'") ; >++ if ( ! osx9orBetter() ) strcat( lDialogString, " -e 'end tell'") ; >++ } >++ else if ( tfd_kdialogPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"kdialog");return (char *)1;} >++ lWasKdialog = 1 ; >++ >++ strcpy( lDialogString , "kdialog" ) ; >++ if ( (tfd_kdialogPresent() == 2) && tfd_xpropPresent() ) >++ { >++ strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >++ } >++ strcat( lDialogString , " --getopenfilename " ) ; >++ >++ if ( aDefaultPathAndOrFile && strlen(aDefaultPathAndOrFile) ) >++ { >++ if ( aDefaultPathAndOrFile[0] != '/' ) >++ { >++ strcat(lDialogString, lLastDirectory) ; >++ strcat(lDialogString , "/" ) ; >++ } >++ strcat(lDialogString, "\"") ; >++ strcat(lDialogString, aDefaultPathAndOrFile ) ; >++ strcat(lDialogString , "\"" ) ; >++ } >++ else >++ { >++ strcat(lDialogString, lLastDirectory) ; >++ strcat(lDialogString , "/" ) ; >++ } >++ >++ if ( aNumOfFilterPatterns > 0 ) >++ { >++ strcat(lDialogString , " \"" ) ; >++ strcat( lDialogString , aFilterPatterns[0] ) ; >++ for ( i = 1 ; i < aNumOfFilterPatterns ; i ++ ) >++ { >++ strcat( lDialogString , " " ) ; >++ strcat( lDialogString , aFilterPatterns[i] ) ; >++ } >++ if ( aSingleFilterDescription && strlen(aSingleFilterDescription) ) >++ { >++ strcat( lDialogString , " | " ) ; >++ strcat( lDialogString , aSingleFilterDescription ) ; >++ } >++ strcat( lDialogString , "\"" ) ; >++ } >++ if ( aAllowMultipleSelects ) >++ { >++ strcat( lDialogString , " --multiple --separate-output" ) ; >++ } >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, " --title \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\"") ; >++ } >++ } >++ else if ( tfd_zenityPresent() || tfd_matedialogPresent() || tfd_shellementaryPresent() || tfd_qarmaPresent() ) >++ { >++ if ( tfd_zenityPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"zenity");return (char *)1;} >++ strcpy( lDialogString , "zenity" ) ; >++ if ( (tfd_zenity3Present() >= 4) && !getenv("SSH_TTY") && tfd_xpropPresent() ) >++ { >++ strcat( lDialogString, " --attach=$(sleep .01;xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >++ } >++ } >++ else if ( tfd_matedialogPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"matedialog");return (char *)1;} >++ strcpy( lDialogString , "matedialog" ) ; >++ } >++ else if ( tfd_shellementaryPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"shellementary");return (char *)1;} >++ strcpy( lDialogString , "shellementary" ) ; >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"qarma");return (char *)1;} >++ strcpy( lDialogString , "qarma" ) ; >++ if ( !getenv("SSH_TTY") && tfd_xpropPresent() ) >++ { >++ strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >++ } >++ } >++ strcat( lDialogString , " --file-selection" ) ; >++ >++ if ( aAllowMultipleSelects ) >++ { >++ strcat( lDialogString , " --multiple" ) ; >++ } >++ >++ strcat(lDialogString, " --title=\"") ; >++ if (aTitle && strlen(aTitle)) strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\"") ; >++ >++ if ( aDefaultPathAndOrFile && strlen(aDefaultPathAndOrFile) ) >++ { >++ strcat(lDialogString, " --filename=\"") ; >++ strcat(lDialogString, aDefaultPathAndOrFile) ; >++ strcat(lDialogString, "\"") ; >++ } >++ if ( aNumOfFilterPatterns > 0 ) >++ { >++ strcat( lDialogString , " --file-filter='" ) ; >++ if ( aSingleFilterDescription && strlen(aSingleFilterDescription) ) >++ { >++ strcat( lDialogString , aSingleFilterDescription ) ; >++ strcat( lDialogString , " |" ) ; >++ } >++ for ( i = 0 ; i < aNumOfFilterPatterns ; i ++ ) >++ { >++ strcat( lDialogString , " " ) ; >++ strcat( lDialogString , aFilterPatterns[i] ) ; >++ } >++ strcat( lDialogString , "' --file-filter='All files | *'" ) ; >++ } >++ if (tinyfd_silent) strcat( lDialogString , " 2>/dev/null "); >++ } >++ else if (tfd_yadPresent()) >++ { >++ if (aTitle && !strcmp(aTitle, "tinyfd_query")) { strcpy(tinyfd_response, "yad"); return (char*)1; } >++ strcpy(lDialogString, "yad --file"); >++ if (aAllowMultipleSelects) >++ { >++ strcat(lDialogString, " --multiple"); >++ } >++ if (aTitle && strlen(aTitle)) >++ { >++ strcat(lDialogString, " --title=\""); >++ strcat(lDialogString, aTitle); >++ strcat(lDialogString, "\""); >++ } >++ if (aDefaultPathAndOrFile && strlen(aDefaultPathAndOrFile)) >++ { >++ strcat(lDialogString, " --filename=\""); >++ strcat(lDialogString, aDefaultPathAndOrFile); >++ strcat(lDialogString, "\""); >++ } >++ if (aNumOfFilterPatterns > 0) >++ { >++ strcat(lDialogString, " --file-filter='"); >++ if (aSingleFilterDescription && strlen(aSingleFilterDescription)) >++ { >++ strcat(lDialogString, aSingleFilterDescription); >++ strcat(lDialogString, " |"); >++ } >++ for (i = 0; i < aNumOfFilterPatterns; i++) >++ { >++ strcat(lDialogString, " "); >++ strcat(lDialogString, aFilterPatterns[i]); >++ } >++ strcat(lDialogString, "' --file-filter='All files | *'"); >++ } >++ if (tinyfd_silent) strcat(lDialogString, " 2>/dev/null "); >++ } >++ else if ( tkinter3Present( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python3-tkinter");return (char *)1;} >++ strcpy( lDialogString , gPython3Name ) ; >++ strcat( lDialogString , >++ " -S -c \"import tkinter;from tkinter import filedialog;root=tkinter.Tk();root.withdraw();"); >++ strcat( lDialogString , "lFiles=filedialog.askopenfilename("); >++ if ( aAllowMultipleSelects ) >++ { >++ strcat( lDialogString , "multiple=1," ) ; >++ } >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "title='") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "',") ; >++ } >++ if ( aDefaultPathAndOrFile && strlen(aDefaultPathAndOrFile) ) >++ { >++ getPathWithoutFinalSlash( lString , aDefaultPathAndOrFile ) ; >++ if ( strlen(lString) ) >++ { >++ strcat(lDialogString, "initialdir='") ; >++ strcat(lDialogString, lString ) ; >++ strcat(lDialogString , "'," ) ; >++ } >++ getLastName( lString , aDefaultPathAndOrFile ) ; >++ if ( strlen(lString) ) >++ { >++ strcat(lDialogString, "initialfile='") ; >++ strcat(lDialogString, lString ) ; >++ strcat(lDialogString , "'," ) ; >++ } >++ } >++ if ( ( aNumOfFilterPatterns > 1 ) >++ || ( ( aNumOfFilterPatterns == 1 ) /*test because poor osx behaviour*/ >++ && ( aFilterPatterns[0][strlen(aFilterPatterns[0])-1] != '*' ) ) ) >++ { >++ strcat(lDialogString , "filetypes=(" ) ; >++ strcat( lDialogString , "('" ) ; >++ if ( aSingleFilterDescription && strlen(aSingleFilterDescription) ) >++ { >++ strcat( lDialogString , aSingleFilterDescription ) ; >++ } >++ strcat( lDialogString , "',(" ) ; >++ for ( i = 0 ; i < aNumOfFilterPatterns ; i ++ ) >++ { >++ strcat( lDialogString , "'" ) ; >++ strcat( lDialogString , aFilterPatterns[i] ) ; >++ strcat( lDialogString , "'," ) ; >++ } >++ strcat( lDialogString , "))," ) ; >++ strcat( lDialogString , "('All files','*'))" ) ; >++ } >++ strcat( lDialogString , ");\ >+ \nif not isinstance(lFiles, tuple):\n\tprint(lFiles)\nelse:\ >+ \n\tlFilesString=''\n\tfor lFile in lFiles:\n\t\tlFilesString+=str(lFile)+'|'\ >+ \n\tprint(lFilesString[:-1])\n\"" ) ; >+- } >+- else if ( tkinter2Present( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python2-tkinter");return (char *)1;} >+- strcpy( lDialogString , "export PYTHONIOENCODING=utf-8;" ) ; >+- strcat( lDialogString , gPython2Name ) ; >+- if ( ! isTerminalRunning( ) && tfd_isDarwin( ) ) >+- { >+- strcat( lDialogString , " -i" ) ; /* for osx without console */ >+- } >+- strcat( lDialogString , >++ } >++ else if ( tkinter2Present( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python2-tkinter");return (char *)1;} >++ strcpy( lDialogString , "export PYTHONIOENCODING=utf-8;" ) ; >++ strcat( lDialogString , gPython2Name ) ; >++ if ( ! isTerminalRunning( ) && tfd_isDarwin( ) ) >++ { >++ strcat( lDialogString , " -i" ) ; /* for osx without console */ >++ } >++ strcat( lDialogString , >+ " -S -c \"import Tkinter,tkFileDialog;root=Tkinter.Tk();root.withdraw();"); >+ >+- if ( tfd_isDarwin( ) ) >+- { >+- strcat( lDialogString , >++ if ( tfd_isDarwin( ) ) >++ { >++ strcat( lDialogString , >+ "import os;os.system('''/usr/bin/osascript -e 'tell app \\\"Finder\\\" to set \ >+ frontmost of process \\\"Python\\\" to true' ''');"); >+- } >+- strcat( lDialogString , "lFiles=tkFileDialog.askopenfilename("); >+- if ( aAllowMultipleSelects ) >+- { >+- strcat( lDialogString , "multiple=1," ) ; >+- } >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "title='") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "',") ; >+- } >+- if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) ) >+- { >+- getPathWithoutFinalSlash( lString , aDefaultPathAndFile ) ; >+- if ( strlen(lString) ) >+- { >+- strcat(lDialogString, "initialdir='") ; >+- strcat(lDialogString, lString ) ; >+- strcat(lDialogString , "'," ) ; >+- } >+- getLastName( lString , aDefaultPathAndFile ) ; >+- if ( strlen(lString) ) >+- { >+- strcat(lDialogString, "initialfile='") ; >+- strcat(lDialogString, lString ) ; >+- strcat(lDialogString , "'," ) ; >+- } >+- } >+- if ( ( aNumOfFilterPatterns > 1 ) >+- || ( ( aNumOfFilterPatterns == 1 ) /*test because poor osx behaviour*/ >+- && ( aFilterPatterns[0][strlen(aFilterPatterns[0])-1] != '*' ) ) ) >+- { >+- strcat(lDialogString , "filetypes=(" ) ; >+- strcat( lDialogString , "('" ) ; >+- if ( aSingleFilterDescription && strlen(aSingleFilterDescription) ) >+- { >+- strcat( lDialogString , aSingleFilterDescription ) ; >+- } >+- strcat( lDialogString , "',(" ) ; >+- for ( i = 0 ; i < aNumOfFilterPatterns ; i ++ ) >+- { >+- strcat( lDialogString , "'" ) ; >+- strcat( lDialogString , aFilterPatterns[i] ) ; >+- strcat( lDialogString , "'," ) ; >+- } >+- strcat( lDialogString , "))," ) ; >+- strcat( lDialogString , "('All files','*'))" ) ; >+- } >+- strcat( lDialogString , ");\ >++ } >++ strcat( lDialogString , "lFiles=tkFileDialog.askopenfilename("); >++ if ( aAllowMultipleSelects ) >++ { >++ strcat( lDialogString , "multiple=1," ) ; >++ } >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "title='") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "',") ; >++ } >++ if ( aDefaultPathAndOrFile && strlen(aDefaultPathAndOrFile) ) >++ { >++ getPathWithoutFinalSlash( lString , aDefaultPathAndOrFile ) ; >++ if ( strlen(lString) ) >++ { >++ strcat(lDialogString, "initialdir='") ; >++ strcat(lDialogString, lString ) ; >++ strcat(lDialogString , "'," ) ; >++ } >++ getLastName( lString , aDefaultPathAndOrFile ) ; >++ if ( strlen(lString) ) >++ { >++ strcat(lDialogString, "initialfile='") ; >++ strcat(lDialogString, lString ) ; >++ strcat(lDialogString , "'," ) ; >++ } >++ } >++ if ( ( aNumOfFilterPatterns > 1 ) >++ || ( ( aNumOfFilterPatterns == 1 ) /*test because poor osx behaviour*/ >++ && ( aFilterPatterns[0][strlen(aFilterPatterns[0])-1] != '*' ) ) ) >++ { >++ strcat(lDialogString , "filetypes=(" ) ; >++ strcat( lDialogString , "('" ) ; >++ if ( aSingleFilterDescription && strlen(aSingleFilterDescription) ) >++ { >++ strcat( lDialogString , aSingleFilterDescription ) ; >++ } >++ strcat( lDialogString , "',(" ) ; >++ for ( i = 0 ; i < aNumOfFilterPatterns ; i ++ ) >++ { >++ strcat( lDialogString , "'" ) ; >++ strcat( lDialogString , aFilterPatterns[i] ) ; >++ strcat( lDialogString , "'," ) ; >++ } >++ strcat( lDialogString , "))," ) ; >++ strcat( lDialogString , "('All files','*'))" ) ; >++ } >++ strcat( lDialogString , ");\ >+ \nif not isinstance(lFiles, tuple):\n\tprint lFiles\nelse:\ >+ \n\tlFilesString=''\n\tfor lFile in lFiles:\n\t\tlFilesString+=str(lFile)+'|'\ >+ \n\tprint lFilesString[:-1]\n\"" ) ; >+- } >+- else if ( xdialogPresent() || dialogName() ) >+- { >+- if ( xdialogPresent( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"xdialog");return (char *)1;} >+- lWasGraphicDialog = 1 ; >+- strcpy( lDialogString , "(Xdialog " ) ; >+- } >+- else if ( isTerminalRunning( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"dialog");return (char *)0;} >+- strcpy( lDialogString , "(dialog " ) ; >+- } >+- else >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"dialog");return (char *)0;} >+- lWasXterm = 1 ; >+- strcpy( lDialogString , terminalName() ) ; >+- strcat( lDialogString , "'(" ) ; >+- strcat( lDialogString , dialogName() ) ; >+- strcat( lDialogString , " " ) ; >+- } >++ } >++ else if ( xdialogPresent() || dialogName() ) >++ { >++ if ( xdialogPresent( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"xdialog");return (char *)1;} >++ lWasGraphicDialog = 1 ; >++ strcpy( lDialogString , "(Xdialog " ) ; >++ } >++ else if ( isTerminalRunning( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"dialog");return (char *)0;} >++ strcpy( lDialogString , "(dialog " ) ; >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"dialog");return (char *)0;} >++ lWasXterm = 1 ; >++ strcpy( lDialogString , terminalName() ) ; >++ strcat( lDialogString , "'(" ) ; >++ strcat( lDialogString , dialogName() ) ; >++ strcat( lDialogString , " " ) ; >++ } >+ >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "--title \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\" ") ; >+- } >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "--title \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\" ") ; >++ } >+ >+- if ( !xdialogPresent() && !gdialogPresent() ) >+- { >+- strcat(lDialogString, "--backtitle \"") ; >+- strcat(lDialogString, >+- "tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY") ; >+- strcat(lDialogString, "\" ") ; >+- } >++ if ( !xdialogPresent() && !gdialogPresent() ) >++ { >++ strcat(lDialogString, "--backtitle \"") ; >++ strcat(lDialogString, >++ "tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY") ; >++ strcat(lDialogString, "\" ") ; >++ } >+ >+- strcat( lDialogString , "--fselect \"" ) ; >+- if ( aDefaultPathAndFile && strlen(aDefaultPathAndFile) ) >+- { >+- if ( ! strchr(aDefaultPathAndFile, '/') ) >+- { >+- strcat(lDialogString, "./") ; >+- } >+- strcat(lDialogString, aDefaultPathAndFile) ; >+- } >+- else if ( ! isTerminalRunning( ) && !lWasGraphicDialog ) >+- { >+- strcat(lDialogString, getenv("HOME")) ; >+- strcat(lDialogString, "/"); >+- } >+- else >+- { >+- strcat(lDialogString, "./") ; >+- } >+- >+- if ( lWasGraphicDialog ) >+- { >+- strcat(lDialogString, "\" 0 60 ) 2>&1 ") ; >+- } >+- else >+- { >+- strcat(lDialogString, "\" 0 60 >/dev/tty) ") ; >+- if ( lWasXterm ) >+- { >+- strcat( lDialogString , >+- "2>/tmp/tinyfd.txt';cat /tmp/tinyfd.txt;rm /tmp/tinyfd.txt"); >+- } >+- else >+- { >+- strcat(lDialogString, "2>&1 ; clear >/dev/tty") ; >+- } >+- } >+- } >+- else >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){return tinyfd_inputBox(aTitle,NULL,NULL);} >+- strcpy(lBuff, "Open file from "); >+- strcat(lBuff, getCurDir()); >+- lPointerInputBox = tinyfd_inputBox(NULL, NULL, NULL); /* obtain a pointer on the current content of tinyfd_inputBox */ >+- if (lPointerInputBox) strcpy(lDialogString, lPointerInputBox); /* preserve the current content of tinyfd_inputBox */ >+- p = tinyfd_inputBox(aTitle, lBuff, ""); >+- if ( p ) strcpy(lBuff, p); else lBuff[0] = '\0'; >+- if (lPointerInputBox) strcpy(lPointerInputBox, lDialogString); /* restore its previous content to tinyfd_inputBox */ >+- if ( ! fileExists(lBuff) ) >+- { >+- free(lBuff); >+- lBuff = NULL; >+- } >++ strcat( lDialogString , "--fselect \"" ) ; >++ if ( aDefaultPathAndOrFile && strlen(aDefaultPathAndOrFile) ) >++ { >++ if ( ! strchr(aDefaultPathAndOrFile, '/') ) >++ { >++ strcat(lDialogString, "./") ; >++ } >++ strcat(lDialogString, aDefaultPathAndOrFile) ; >++ } >++ else if ( ! isTerminalRunning( ) && !lWasGraphicDialog ) >++ { >++ strcat(lDialogString, getenv("HOME")) ; >++ strcat(lDialogString, "/"); >++ } >+ else >+ { >+- lBuff = (char *)( realloc( lBuff, (strlen(lBuff)+1) * sizeof(char))); >++ strcat(lDialogString, "./") ; >+ } >+- return lBuff ; >+- } >+ >+- if (tinyfd_verbose) printf( "lDialogString: %s\n" , lDialogString ) ; >+- if ( ! ( lIn = popen( lDialogString , "r" ) ) ) >+- { >+- free(lBuff); >+- lBuff = NULL; >+- return NULL ; >+- } >+- lBuff[0]='\0'; >+- p = lBuff; >+- while ( fgets( p , sizeof( lBuff ) , lIn ) != NULL ) >+- { >+- p += strlen( p ); >+- } >+- pclose( lIn ) ; >+- if ( lBuff[strlen( lBuff ) -1] == '\n' ) >+- { >+- lBuff[strlen( lBuff ) -1] = '\0' ; >+- } >+- /* printf( "lBuff: %s\n" , lBuff ) ; */ >+- if ( lWasKdialog && aAllowMultipleSelects ) >+- { >+- p = lBuff ; >+- while ( ( p = strchr( p , '\n' ) ) ) >+- * p = '|' ; >+- } >+- /* printf( "lBuff2: %s\n" , lBuff ) ; */ >+- if ( ! strlen( lBuff ) ) >+- { >+- free(lBuff); >+- lBuff = NULL; >+- return NULL; >+- } >+- if ( aAllowMultipleSelects && strchr(lBuff, '|') ) >+- { >+- if( ! ensureFilesExist( lBuff , lBuff ) ) >++ if ( lWasGraphicDialog ) >++ { >++ strcat(lDialogString, "\" 0 60 ) 2>&1 ") ; >++ } >++ else >++ { >++ strcat(lDialogString, "\" 0 60 >/dev/tty) ") ; >++ if ( lWasXterm ) >++ { >++ strcat( lDialogString , >++ "2>/tmp/tinyfd.txt';cat /tmp/tinyfd.txt;rm /tmp/tinyfd.txt"); >++ } >++ else >++ { >++ strcat(lDialogString, "2>&1 ; clear >/dev/tty") ; >++ } >++ } >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){return tinyfd_inputBox(aTitle,NULL,NULL);} >++ strcpy(lBuff, "Open file from "); >++ strcat(lBuff, getCurDir()); >++ lPointerInputBox = tinyfd_inputBox(NULL, NULL, NULL); /* obtain a pointer on the current content of tinyfd_inputBox */ >++ if (lPointerInputBox) strcpy(lDialogString, lPointerInputBox); /* preserve the current content of tinyfd_inputBox */ >++ p = tinyfd_inputBox(aTitle, lBuff, ""); >++ if ( p ) strcpy(lBuff, p); else lBuff[0] = '\0'; >++ if (lPointerInputBox) strcpy(lPointerInputBox, lDialogString); /* restore its previous content to tinyfd_inputBox */ >++ if ( ! fileExists(lBuff) ) >+ { >++ free(lBuff); >++ lBuff = NULL; >++ } >++ else >++ { >++ lBuff = (char *)( realloc( lBuff, (strlen(lBuff)+1) * sizeof(char))); >++ } >++ return lBuff ; >++ } >++ >++ if (tinyfd_verbose) printf( "lDialogString: %s\n" , lDialogString ) ; >++ if ( ! ( lIn = popen( lDialogString , "r" ) ) ) >++ { >+ free(lBuff); >+ lBuff = NULL; >+- return NULL; >+- } >++ return NULL ; >++ } >++ lBuff[0]='\0'; >++ p = lBuff; >++ while ( fgets( p , sizeof( lBuff ) , lIn ) != NULL ) >++ { >++ p += strlen( p ); >++ } >++ pclose( lIn ) ; >++ >++ if ( strlen( lBuff ) && lBuff[strlen( lBuff ) -1] == '\n' ) >++ { >++ lBuff[strlen( lBuff ) -1] = '\0' ; >++ } >++ /* printf( "strlen lBuff: %d\n" , strlen( lBuff ) ) ; */ >++ if ( lWasKdialog && aAllowMultipleSelects ) >++ { >++ p = lBuff ; >++ while ( ( p = strchr( p , '\n' ) ) ) >++ * p = '|' ; >++ } >++ /* printf( "lBuff2: %s\n" , lBuff ) ; */ >++ if ( ! strlen( lBuff ) ) >++ { >++ free(lBuff); >++ lBuff = NULL; >++ return NULL; >++ } >++ if ( aAllowMultipleSelects && strchr(lBuff, '|') ) >++ { >++ if( ! ensureFilesExist( lBuff , lBuff ) ) >++ { >++ free(lBuff); >++ lBuff = NULL; >++ return NULL; >++ } >++ } >++ else if ( !fileExists(lBuff) ) >++ { >++ free(lBuff); >++ lBuff = NULL; >++ return NULL; >+ } >+- else if ( !fileExists(lBuff) ) >++ >++ p = strrchr(lBuff, '|'); >++ if ( !p ) p = lBuff ; >++ else p ++ ; >++ getPathWithoutFinalSlash( lString , p ) ; >++ /* printf( "lString [%lu]: %s\n" , strlen(lString) , lString ) ; */ >++ if ( strlen( lString ) && ! dirExists( lString ) ) >+ { >+- free(lBuff); >+- lBuff = NULL; >+- return NULL; >+- } >++ return NULL ; >++ } >++ strcpy(lLastDirectory, lString) ; >+ >+- lBuff = (char *)( realloc( lBuff, (strlen(lBuff)+1) * sizeof(char))); >++ lBuff = (char *)( realloc( lBuff, (strlen(lBuff)+1) * sizeof(char))); >+ >+- /*printf( "lBuff3: %s\n" , lBuff ) ; */ >+- return lBuff ; >++ /*printf( "lBuff3 [%lu]: %s\n" , strlen(lBuff) , lBuff ) ; */ >++ return lBuff ; >+ } >+ >+ >+ char * tinyfd_selectFolderDialog( >+- char const * aTitle , /* "" */ >+- char const * aDefaultPath ) /* "" */ >++ char const * aTitle , /* "" */ >++ char const * aDefaultPath ) /* "" */ >+ { >+- static char lBuff[MAX_PATH_OR_CMD] ; >+- char lDialogString[MAX_PATH_OR_CMD] ; >+- FILE * lIn ; >+- char * p ; >+- char * lPointerInputBox ; >+- int lWasGraphicDialog = 0 ; >+- int lWasXterm = 0 ; >+- lBuff[0]='\0'; >++ static char lBuff[MAX_PATH_OR_CMD] ; >++ static char lLastDirectory[MAX_PATH_OR_CMD] = "$PWD" ; >+ >+- if (tfd_quoteDetected(aTitle)) return tinyfd_selectFolderDialog("INVALID TITLE WITH QUOTES", aDefaultPath); >+- if (tfd_quoteDetected(aDefaultPath)) return tinyfd_selectFolderDialog(aTitle, "INVALID DEFAULT_PATH WITH QUOTES"); >++ char lDialogString[MAX_PATH_OR_CMD] ; >++ FILE * lIn ; >++ char * p ; >++ char * lPointerInputBox ; >++ int lWasGraphicDialog = 0 ; >++ int lWasXterm = 0 ; >++ lBuff[0]='\0'; >+ >+- if ( osascriptPresent( )) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"applescript");return (char *)1;} >+- strcpy( lDialogString , "osascript "); >+- if ( ! osx9orBetter() ) strcat( lDialogString , " -e 'tell application \"System Events\"' -e 'Activate'"); >+- strcat( lDialogString , " -e 'try' -e 'POSIX path of ( choose folder "); >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "with prompt \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\" ") ; >+- } >+- if ( aDefaultPath && strlen(aDefaultPath) ) >+- { >+- strcat(lDialogString, "default location \"") ; >+- strcat(lDialogString, aDefaultPath ) ; >+- strcat(lDialogString , "\" " ) ; >+- } >+- strcat( lDialogString , ")' " ) ; >+- strcat(lDialogString, "-e 'on error number -128' " ) ; >+- strcat(lDialogString, "-e 'end try'") ; >+- if ( ! osx9orBetter() ) strcat( lDialogString, " -e 'end tell'") ; >+- } >+- else if ( tfd_kdialogPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"kdialog");return (char *)1;} >+- strcpy( lDialogString , "kdialog" ) ; >+- if ( (tfd_kdialogPresent() == 2) && tfd_xpropPresent() ) >+- { >+- strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >+- } >+- strcat( lDialogString , " --getexistingdirectory " ) ; >++ if (tfd_quoteDetected(aTitle)) return tinyfd_selectFolderDialog("INVALID TITLE WITH QUOTES", aDefaultPath); >++ if (tfd_quoteDetected(aDefaultPath)) return tinyfd_selectFolderDialog(aTitle, "INVALID DEFAULT_PATH WITH QUOTES"); >+ >+- if ( aDefaultPath && strlen(aDefaultPath) ) >+- { >+- if ( aDefaultPath[0] != '/' ) >+- { >+- strcat(lDialogString, "$PWD/") ; >+- } >+- strcat(lDialogString, "\"") ; >+- strcat(lDialogString, aDefaultPath ) ; >+- strcat(lDialogString , "\"" ) ; >+- } >+- else >+- { >+- strcat(lDialogString, "$PWD/") ; >+- } >++ if ( osascriptPresent( )) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"applescript");return (char *)1;} >++ strcpy( lDialogString , "osascript "); >++ if ( ! osx9orBetter() ) strcat( lDialogString , " -e 'tell application \"System Events\"' -e 'Activate'"); >++ strcat( lDialogString , " -e 'try' -e 'POSIX path of ( choose folder "); >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "with prompt \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\" ") ; >++ } >++ if ( aDefaultPath && strlen(aDefaultPath) ) >++ { >++ strcat(lDialogString, "default location \"") ; >++ strcat(lDialogString, aDefaultPath ) ; >++ strcat(lDialogString , "\" " ) ; >++ } >++ strcat( lDialogString , ")' " ) ; >++ strcat(lDialogString, "-e 'on error number -128' " ) ; >++ strcat(lDialogString, "-e 'end try'") ; >++ if ( ! osx9orBetter() ) strcat( lDialogString, " -e 'end tell'") ; >++ } >++ else if ( tfd_kdialogPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"kdialog");return (char *)1;} >++ strcpy( lDialogString , "kdialog" ) ; >++ if ( (tfd_kdialogPresent() == 2) && tfd_xpropPresent() ) >++ { >++ strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >++ } >++ strcat( lDialogString , " --getexistingdirectory " ) ; >+ >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, " --title \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\"") ; >+- } >+- } >+- else if ( tfd_zenityPresent() || tfd_matedialogPresent() || tfd_shellementaryPresent() || tfd_qarmaPresent() ) >+- { >+- if ( tfd_zenityPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"zenity");return (char *)1;} >+- strcpy( lDialogString , "zenity" ) ; >+- if ( (tfd_zenity3Present() >= 4) && !getenv("SSH_TTY") && tfd_xpropPresent() ) >+- { >+- strcat( lDialogString, " --attach=$(sleep .01;xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >+- } >+- } >+- else if ( tfd_matedialogPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"matedialog");return (char *)1;} >+- strcpy( lDialogString , "matedialog" ) ; >+- } >+- else if ( tfd_shellementaryPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"shellementary");return (char *)1;} >+- strcpy( lDialogString , "shellementary" ) ; >+- } >+- else >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"qarma");return (char *)1;} >+- strcpy( lDialogString , "qarma" ) ; >+- if ( !getenv("SSH_TTY") && tfd_xpropPresent() ) >+- { >+- strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >+- } >+- } >+- strcat( lDialogString , " --file-selection --directory" ) ; >++ if ( aDefaultPath && strlen(aDefaultPath) ) >++ { >++ if ( aDefaultPath[0] != '/' ) >++ { >++ strcat(lDialogString, lLastDirectory) ; >++ strcat(lDialogString , "/" ) ; >++ } >++ strcat(lDialogString, "\"") ; >++ strcat(lDialogString, aDefaultPath ) ; >++ strcat(lDialogString , "\"" ) ; >++ } >++ else >++ { >++ strcat(lDialogString, lLastDirectory) ; >++ strcat(lDialogString , "/" ) ; >++ } >+ >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, " --title=\"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\"") ; >+- } >+- if ( aDefaultPath && strlen(aDefaultPath) ) >+- { >+- strcat(lDialogString, " --filename=\"") ; >+- strcat(lDialogString, aDefaultPath) ; >+- strcat(lDialogString, "\"") ; >+- } >+- if (tinyfd_silent) strcat( lDialogString , " 2>/dev/null "); >+- } >+- else if (tfd_yadPresent()) >+- { >+- if (aTitle && !strcmp(aTitle, "tinyfd_query")) { strcpy(tinyfd_response, "yad"); return (char*)1; } >+- strcpy(lDialogString, "yad --file-selection --directory"); >+- if (aTitle && strlen(aTitle)) >+- { >+- strcat(lDialogString, " --title=\""); >+- strcat(lDialogString, aTitle); >+- strcat(lDialogString, "\""); >+- } >+- if (aDefaultPath && strlen(aDefaultPath)) >+- { >+- strcat(lDialogString, " --filename=\""); >+- strcat(lDialogString, aDefaultPath); >+- strcat(lDialogString, "\""); >+- } >+- if (tinyfd_silent) strcat(lDialogString, " 2>/dev/null "); >+- } >+- else if ( !xdialogPresent() && tkinter3Present( ) ) >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, " --title \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\"") ; >++ } >++ } >++ else if ( tfd_zenityPresent() || tfd_matedialogPresent() || tfd_shellementaryPresent() || tfd_qarmaPresent() ) >+ { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python3-tkinter");return (char *)1;} >+- strcpy( lDialogString , gPython3Name ) ; >+- strcat( lDialogString , >+- " -S -c \"import tkinter;from tkinter import filedialog;root=tkinter.Tk();root.withdraw();"); >+- strcat( lDialogString , "res=filedialog.askdirectory("); >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "title='") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "',") ; >+- } >+- if ( aDefaultPath && strlen(aDefaultPath) ) >+- { >+- strcat(lDialogString, "initialdir='") ; >+- strcat(lDialogString, aDefaultPath ) ; >+- strcat(lDialogString , "'" ) ; >+- } >+- strcat( lDialogString, ");\nif not isinstance(res, tuple):\n\tprint(res)\n\"" ) ; >++ if ( tfd_zenityPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"zenity");return (char *)1;} >++ strcpy( lDialogString , "zenity" ) ; >++ if ( (tfd_zenity3Present() >= 4) && !getenv("SSH_TTY") && tfd_xpropPresent() ) >++ { >++ strcat( lDialogString, " --attach=$(sleep .01;xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >++ } >++ } >++ else if ( tfd_matedialogPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"matedialog");return (char *)1;} >++ strcpy( lDialogString , "matedialog" ) ; >++ } >++ else if ( tfd_shellementaryPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"shellementary");return (char *)1;} >++ strcpy( lDialogString , "shellementary" ) ; >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"qarma");return (char *)1;} >++ strcpy( lDialogString , "qarma" ) ; >++ if ( !getenv("SSH_TTY") && tfd_xpropPresent() ) >++ { >++ strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >++ } >++ } >++ strcat( lDialogString , " --file-selection --directory" ) ; >++ >++ strcat(lDialogString, " --title=\"") ; >++ if (aTitle && strlen(aTitle)) strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\"") ; >++ >++ if ( aDefaultPath && strlen(aDefaultPath) ) >++ { >++ strcat(lDialogString, " --filename=\"") ; >++ strcat(lDialogString, aDefaultPath) ; >++ strcat(lDialogString, "\"") ; >++ } >++ if (tinyfd_silent) strcat( lDialogString , " 2>/dev/null "); >+ } >+- else if ( !xdialogPresent() && tkinter2Present( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python2-tkinter");return (char *)1;} >+- strcpy( lDialogString , "export PYTHONIOENCODING=utf-8;" ) ; >+- strcat( lDialogString , gPython2Name ) ; >+- if ( ! isTerminalRunning( ) && tfd_isDarwin( ) ) >+- { >+- strcat( lDialogString , " -i" ) ; /* for osx without console */ >+- } >+- strcat( lDialogString , >++ else if (tfd_yadPresent()) >++ { >++ if (aTitle && !strcmp(aTitle, "tinyfd_query")) { strcpy(tinyfd_response, "yad"); return (char*)1; } >++ strcpy(lDialogString, "yad --file --directory"); >++ if (aTitle && strlen(aTitle)) >++ { >++ strcat(lDialogString, " --title=\""); >++ strcat(lDialogString, aTitle); >++ strcat(lDialogString, "\""); >++ } >++ if (aDefaultPath && strlen(aDefaultPath)) >++ { >++ strcat(lDialogString, " --filename=\""); >++ strcat(lDialogString, aDefaultPath); >++ strcat(lDialogString, "\""); >++ } >++ if (tinyfd_silent) strcat(lDialogString, " 2>/dev/null "); >++ } >++ else if ( !xdialogPresent() && tkinter3Present( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python3-tkinter");return (char *)1;} >++ strcpy( lDialogString , gPython3Name ) ; >++ strcat( lDialogString , >++ " -S -c \"import tkinter;from tkinter import filedialog;root=tkinter.Tk();root.withdraw();"); >++ strcat( lDialogString , "res=filedialog.askdirectory("); >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "title='") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "',") ; >++ } >++ if ( aDefaultPath && strlen(aDefaultPath) ) >++ { >++ strcat(lDialogString, "initialdir='") ; >++ strcat(lDialogString, aDefaultPath ) ; >++ strcat(lDialogString , "'" ) ; >++ } >++ strcat( lDialogString, ");\nif not isinstance(res, tuple):\n\tprint(res)\n\"" ) ; >++ } >++ else if ( !xdialogPresent() && tkinter2Present( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python2-tkinter");return (char *)1;} >++ strcpy( lDialogString , "export PYTHONIOENCODING=utf-8;" ) ; >++ strcat( lDialogString , gPython2Name ) ; >++ if ( ! isTerminalRunning( ) && tfd_isDarwin( ) ) >++ { >++ strcat( lDialogString , " -i" ) ; /* for osx without console */ >++ } >++ strcat( lDialogString , >+ " -S -c \"import Tkinter,tkFileDialog;root=Tkinter.Tk();root.withdraw();"); >+ >+- if ( tfd_isDarwin( ) ) >+- { >+- strcat( lDialogString , >++ if ( tfd_isDarwin( ) ) >++ { >++ strcat( lDialogString , >+ "import os;os.system('''/usr/bin/osascript -e 'tell app \\\"Finder\\\" to set \ >+ frontmost of process \\\"Python\\\" to true' ''');"); >+- } >++ } >+ >+- strcat( lDialogString , "print tkFileDialog.askdirectory("); >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "title='") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "',") ; >+- } >+- if ( aDefaultPath && strlen(aDefaultPath) ) >+- { >+- strcat(lDialogString, "initialdir='") ; >+- strcat(lDialogString, aDefaultPath ) ; >+- strcat(lDialogString , "'" ) ; >+- } >+- strcat( lDialogString , ")\"" ) ; >+- } >+- else if ( xdialogPresent() || dialogName() ) >+- { >+- if ( xdialogPresent( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"xdialog");return (char *)1;} >+- lWasGraphicDialog = 1 ; >+- strcpy( lDialogString , "(Xdialog " ) ; >+- } >+- else if ( isTerminalRunning( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"dialog");return (char *)0;} >+- strcpy( lDialogString , "(dialog " ) ; >+- } >+- else >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"dialog");return (char *)0;} >+- lWasXterm = 1 ; >+- strcpy( lDialogString , terminalName() ) ; >+- strcat( lDialogString , "'(" ) ; >+- strcat( lDialogString , dialogName() ) ; >+- strcat( lDialogString , " " ) ; >+- } >++ strcat( lDialogString , "print tkFileDialog.askdirectory("); >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "title='") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "',") ; >++ } >++ if ( aDefaultPath && strlen(aDefaultPath) ) >++ { >++ strcat(lDialogString, "initialdir='") ; >++ strcat(lDialogString, aDefaultPath ) ; >++ strcat(lDialogString , "'" ) ; >++ } >++ strcat( lDialogString , ")\"" ) ; >++ } >++ else if ( xdialogPresent() || dialogName() ) >++ { >++ if ( xdialogPresent( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"xdialog");return (char *)1;} >++ lWasGraphicDialog = 1 ; >++ strcpy( lDialogString , "(Xdialog " ) ; >++ } >++ else if ( isTerminalRunning( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"dialog");return (char *)0;} >++ strcpy( lDialogString , "(dialog " ) ; >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"dialog");return (char *)0;} >++ lWasXterm = 1 ; >++ strcpy( lDialogString , terminalName() ) ; >++ strcat( lDialogString , "'(" ) ; >++ strcat( lDialogString , dialogName() ) ; >++ strcat( lDialogString , " " ) ; >++ } >+ >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, "--title \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\" ") ; >+- } >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, "--title \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\" ") ; >++ } >+ >+- if ( !xdialogPresent() && !gdialogPresent() ) >+- { >+- strcat(lDialogString, "--backtitle \"") ; >+- strcat(lDialogString, >+- "tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY") ; >+- strcat(lDialogString, "\" ") ; >+- } >++ if ( !xdialogPresent() && !gdialogPresent() ) >++ { >++ strcat(lDialogString, "--backtitle \"") ; >++ strcat(lDialogString, >++ "tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY") ; >++ strcat(lDialogString, "\" ") ; >++ } >+ >+- strcat( lDialogString , "--dselect \"" ) ; >+- if ( aDefaultPath && strlen(aDefaultPath) ) >+- { >+- strcat(lDialogString, aDefaultPath) ; >+- ensureFinalSlash(lDialogString); >+- } >+- else if ( ! isTerminalRunning( ) && !lWasGraphicDialog ) >+- { >+- strcat(lDialogString, getenv("HOME")) ; >+- strcat(lDialogString, "/"); >+- } >+- else >+- { >+- strcat(lDialogString, "./") ; >+- } >++ strcat( lDialogString , "--dselect \"" ) ; >++ if ( aDefaultPath && strlen(aDefaultPath) ) >++ { >++ strcat(lDialogString, aDefaultPath) ; >++ ensureFinalSlash(lDialogString); >++ } >++ else if ( ! isTerminalRunning( ) && !lWasGraphicDialog ) >++ { >++ strcat(lDialogString, getenv("HOME")) ; >++ strcat(lDialogString, "/"); >++ } >++ else >++ { >++ strcat(lDialogString, "./") ; >++ } >+ >+- if ( lWasGraphicDialog ) >+- { >+- strcat(lDialogString, "\" 0 60 ) 2>&1 ") ; >+- } >+- else >+- { >+- strcat(lDialogString, "\" 0 60 >/dev/tty) ") ; >+- if ( lWasXterm ) >+- { >+- strcat( lDialogString , >+- "2>/tmp/tinyfd.txt';cat /tmp/tinyfd.txt;rm /tmp/tinyfd.txt"); >+- } >+- else >+- { >+- strcat(lDialogString, "2>&1 ; clear >/dev/tty") ; >+- } >+- } >+- } >+- else >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){return tinyfd_inputBox(aTitle,NULL,NULL);} >+- strcpy(lBuff, "Select folder from "); >+- strcat(lBuff, getCurDir()); >+- lPointerInputBox = tinyfd_inputBox(NULL, NULL, NULL); /* obtain a pointer on the current content of tinyfd_inputBox */ >+- if (lPointerInputBox) strcpy(lDialogString, lPointerInputBox); /* preserve the current content of tinyfd_inputBox */ >+- p = tinyfd_inputBox(aTitle, lBuff, ""); >+- if (p) strcpy(lBuff, p); else lBuff[0] = '\0'; >+- if (lPointerInputBox) strcpy(lPointerInputBox, lDialogString); /* restore its previous content to tinyfd_inputBox */ >+- p = lBuff; >++ if ( lWasGraphicDialog ) >++ { >++ strcat(lDialogString, "\" 0 60 ) 2>&1 ") ; >++ } >++ else >++ { >++ strcat(lDialogString, "\" 0 60 >/dev/tty) ") ; >++ if ( lWasXterm ) >++ { >++ strcat( lDialogString , >++ "2>/tmp/tinyfd.txt';cat /tmp/tinyfd.txt;rm /tmp/tinyfd.txt"); >++ } >++ else >++ { >++ strcat(lDialogString, "2>&1 ; clear >/dev/tty") ; >++ } >++ } >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){return tinyfd_inputBox(aTitle,NULL,NULL);} >++ strcpy(lBuff, "Select folder from "); >++ strcat(lBuff, getCurDir()); >++ lPointerInputBox = tinyfd_inputBox(NULL, NULL, NULL); /* obtain a pointer on the current content of tinyfd_inputBox */ >++ if (lPointerInputBox) strcpy(lDialogString, lPointerInputBox); /* preserve the current content of tinyfd_inputBox */ >++ p = tinyfd_inputBox(aTitle, lBuff, ""); >++ if (p) strcpy(lBuff, p); else lBuff[0] = '\0'; >++ if (lPointerInputBox) strcpy(lPointerInputBox, lDialogString); /* restore its previous content to tinyfd_inputBox */ >++ p = lBuff; >+ >+- if ( !p || ! strlen( p ) || ! dirExists( p ) ) >+- { >+- return NULL ; >+- } >+- return p ; >+- } >+- if (tinyfd_verbose) printf( "lDialogString: %s\n" , lDialogString ) ; >+- if ( ! ( lIn = popen( lDialogString , "r" ) ) ) >++ if ( !p || ! strlen( p ) || ! dirExists( p ) ) >++ { >++ return NULL ; >++ } >++ return p ; >++ } >++ if (tinyfd_verbose) printf( "lDialogString: %s\n" , lDialogString ) ; >++ if ( ! ( lIn = popen( lDialogString , "r" ) ) ) >++ { >++ return NULL ; >++ } >++ while ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >++ {} >++ pclose( lIn ) ; >++ if ( strlen( lBuff ) && lBuff[strlen( lBuff ) -1] == '\n' ) >++ { >++ lBuff[strlen( lBuff ) -1] = '\0' ; >++ } >++ /* printf( "lBuff: %s\n" , lBuff ) ; */ >++ if ( ! strlen( lBuff ) || ! dirExists( lBuff ) ) >+ { >+- return NULL ; >++ return NULL ; >+ } >+- while ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >+- {} >+- pclose( lIn ) ; >+- if ( lBuff[strlen( lBuff ) -1] == '\n' ) >+- { >+- lBuff[strlen( lBuff ) -1] = '\0' ; >+- } >+- /* printf( "lBuff: %s\n" , lBuff ) ; */ >+- if ( ! strlen( lBuff ) || ! dirExists( lBuff ) ) >+- { >+- return NULL ; >+- } >+- return lBuff ; >++ >++ getPathWithoutFinalSlash( lLastDirectory , lBuff ) ; >++ >++ return lBuff ; >+ } >+ >+ >++/* aDefaultRGB is used only if aDefaultHexRGB is absent */ >++/* aDefaultRGB and aoResultRGB can be the same array */ >++/* returns NULL on cancel */ >+ /* returns the hexcolor as a string "#FF0000" */ >+ /* aoResultRGB also contains the result */ >+-/* aDefaultRGB is used only if aDefaultHexRGB is NULL */ >+-/* aDefaultRGB and aoResultRGB can be the same array */ >+ char * tinyfd_colorChooser( >+- char const * aTitle , /* NULL or "" */ >+- char const * aDefaultHexRGB , /* NULL or "#FF0000"*/ >+- unsigned char const aDefaultRGB[3] , /* { 0 , 255 , 255 } */ >+- unsigned char aoResultRGB[3] ) /* { 0 , 0 , 0 } */ >++ char const * aTitle , /* NULL or "" */ >++ char const * aDefaultHexRGB , /* NULL or "#FF0000"*/ >++ unsigned char const aDefaultRGB[3] , /* { 0 , 255 , 255 } */ >++ unsigned char aoResultRGB[3] ) /* { 0 , 0 , 0 } */ >+ { >+- static char lDefaultHexRGB[16]; >+- char lBuff[128] ; >++ static char lDefaultHexRGB[16]; >++ char lBuff[128] ; >+ >+- char lTmp[128] ; >++ char lTmp[128] ; >+ #if !((defined(__cplusplus ) && __cplusplus >= 201103L) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__clang__)) >+- char * lTmp2 ; >++ char * lTmp2 ; >+ #endif >+- char lDialogString[MAX_PATH_OR_CMD] ; >+- unsigned char lDefaultRGB[3]; >+- char * p; >+- char * lPointerInputBox; >+- FILE * lIn ; >+- int i ; >+- int lWasZenity3 = 0 ; >+- int lWasOsascript = 0 ; >+- int lWasXdialog = 0 ; >+- lBuff[0]='\0'; >++ char lDialogString[MAX_PATH_OR_CMD] ; >++ unsigned char lDefaultRGB[3]; >++ char * p; >++ char * lPointerInputBox; >++ FILE * lIn ; >++ int i ; >++ int lWasZenity3 = 0 ; >++ int lWasOsascript = 0 ; >++ int lWasXdialog = 0 ; >++ lBuff[0]='\0'; >+ >+- if (tfd_quoteDetected(aTitle)) return tinyfd_colorChooser("INVALID TITLE WITH QUOTES", aDefaultHexRGB, aDefaultRGB, aoResultRGB); >+- if (tfd_quoteDetected(aDefaultHexRGB)) return tinyfd_colorChooser(aTitle, "INVALID DEFAULT_HEX_RGB WITH QUOTES", aDefaultRGB, aoResultRGB); >++ if (tfd_quoteDetected(aTitle)) return tinyfd_colorChooser("INVALID TITLE WITH QUOTES", aDefaultHexRGB, aDefaultRGB, aoResultRGB); >++ if (tfd_quoteDetected(aDefaultHexRGB)) return tinyfd_colorChooser(aTitle, "INVALID DEFAULT_HEX_RGB WITH QUOTES: use the GRAVE ACCENT \\x60 instead.", aDefaultRGB, aoResultRGB); >+ >+- if (aDefaultHexRGB) >++ if (aDefaultHexRGB && (strlen(aDefaultHexRGB)==7) ) >++ { >++ Hex2RGB(aDefaultHexRGB, lDefaultRGB); >++ strcpy(lDefaultHexRGB, aDefaultHexRGB); >++ } >++ else >++ { >++ lDefaultRGB[0] = aDefaultRGB[0]; >++ lDefaultRGB[1] = aDefaultRGB[1]; >++ lDefaultRGB[2] = aDefaultRGB[2]; >++ RGB2Hex(aDefaultRGB, lDefaultHexRGB); >++ } >++ >++ if ( osascriptPresent( ) ) >+ { >+- Hex2RGB(aDefaultHexRGB, lDefaultRGB); >+- strcpy(lDefaultHexRGB, aDefaultHexRGB); >+- } >+- else >+- { >+- lDefaultRGB[0] = aDefaultRGB[0]; >+- lDefaultRGB[1] = aDefaultRGB[1]; >+- lDefaultRGB[2] = aDefaultRGB[2]; >+- RGB2Hex(aDefaultRGB, lDefaultHexRGB); >+- } >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"applescript");return (char *)1;} >++ lWasOsascript = 1 ; >++ strcpy( lDialogString , "osascript"); >+ >+- if ( osascriptPresent( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"applescript");return (char *)1;} >+- lWasOsascript = 1 ; >+- strcpy( lDialogString , "osascript"); >+- >+- if ( ! osx9orBetter() ) >+- { >+- strcat( lDialogString , " -e 'tell application \"System Events\"' -e 'Activate'"); >+- strcat( lDialogString , " -e 'try' -e 'set mycolor to choose color default color {"); >+- } >+- else >+- { >+- strcat( lDialogString , >++ if ( ! osx9orBetter() ) >++ { >++ strcat( lDialogString , " -e 'tell application \"System Events\"' -e 'Activate'"); >++ strcat( lDialogString , " -e 'try' -e 'set mycolor to choose color default color {"); >++ } >++ else >++ { >++ strcat( lDialogString , >+ " -e 'try' -e 'tell app (path to frontmost application as Unicode text) \ >+ to set mycolor to choose color default color {"); >+- } >++ } >+ >+- sprintf(lTmp, "%d", 256 * lDefaultRGB[0] ) ; >+- strcat(lDialogString, lTmp ) ; >+- strcat(lDialogString, "," ) ; >+- sprintf(lTmp, "%d", 256 * lDefaultRGB[1] ) ; >+- strcat(lDialogString, lTmp ) ; >+- strcat(lDialogString, "," ) ; >+- sprintf(lTmp, "%d", 256 * lDefaultRGB[2] ) ; >+- strcat(lDialogString, lTmp ) ; >+- strcat(lDialogString, "}' " ) ; >+- strcat( lDialogString , >++ sprintf(lTmp, "%d", 256 * lDefaultRGB[0] ) ; >++ strcat(lDialogString, lTmp ) ; >++ strcat(lDialogString, "," ) ; >++ sprintf(lTmp, "%d", 256 * lDefaultRGB[1] ) ; >++ strcat(lDialogString, lTmp ) ; >++ strcat(lDialogString, "," ) ; >++ sprintf(lTmp, "%d", 256 * lDefaultRGB[2] ) ; >++ strcat(lDialogString, lTmp ) ; >++ strcat(lDialogString, "}' " ) ; >++ strcat( lDialogString , >+ "-e 'set mystring to ((item 1 of mycolor) div 256 as integer) as string' " ); >+- strcat( lDialogString , >++ strcat( lDialogString , >+ "-e 'repeat with i from 2 to the count of mycolor' " ); >+- strcat( lDialogString , >++ strcat( lDialogString , >+ "-e 'set mystring to mystring & \" \" & ((item i of mycolor) div 256 as integer) as string' " ); >+- strcat( lDialogString , "-e 'end repeat' " ); >+- strcat( lDialogString , "-e 'mystring' "); >+- strcat(lDialogString, "-e 'on error number -128' " ) ; >+- strcat(lDialogString, "-e 'end try'") ; >+- if ( ! osx9orBetter() ) strcat( lDialogString, " -e 'end tell'") ; >+- } >+- else if ( tfd_kdialogPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"kdialog");return (char *)1;} >+- strcpy( lDialogString , "kdialog" ) ; >+- if ( (tfd_kdialogPresent() == 2) && tfd_xpropPresent() ) >+- { >+- strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >+- } >+- sprintf( lDialogString + strlen(lDialogString) , " --getcolor --default '%s'" , lDefaultHexRGB ) ; >++ strcat( lDialogString , "-e 'end repeat' " ); >++ strcat( lDialogString , "-e 'mystring' "); >++ strcat(lDialogString, "-e 'on error number -128' " ) ; >++ strcat(lDialogString, "-e 'end try'") ; >++ if ( ! osx9orBetter() ) strcat( lDialogString, " -e 'end tell'") ; >++ } >++ else if ( tfd_kdialogPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"kdialog");return (char *)1;} >++ strcpy( lDialogString , "kdialog" ) ; >++ if ( (tfd_kdialogPresent() == 2) && tfd_xpropPresent() ) >++ { >++ strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >++ } >++ sprintf( lDialogString + strlen(lDialogString) , " --getcolor --default '%s'" , lDefaultHexRGB ) ; >+ >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, " --title \"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\"") ; >+- } >+- } >+- else if ( tfd_zenity3Present() || tfd_matedialogPresent() || tfd_shellementaryPresent() || tfd_qarmaPresent() ) >+- { >+- lWasZenity3 = 1 ; >+- if ( tfd_zenity3Present() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"zenity3");return (char *)1;} >+- strcpy( lDialogString , "zenity" ); >+- if ( (tfd_zenity3Present() >= 4) && !getenv("SSH_TTY") && tfd_xpropPresent() ) >+- { >+- strcat( lDialogString, " --attach=$(sleep .01;xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >+- } >+- } >+- else if ( tfd_matedialogPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"matedialog");return (char *)1;} >+- strcpy( lDialogString , "matedialog" ) ; >+- } >+- else if ( tfd_shellementaryPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"shellementary");return (char *)1;} >+- strcpy( lDialogString , "shellementary" ) ; >+- } >+- else >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"qarma");return (char *)1;} >+- strcpy( lDialogString , "qarma" ) ; >+- if ( !getenv("SSH_TTY") && tfd_xpropPresent() ) >+- { >+- strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >+- } >+- } >+- strcat( lDialogString , " --color-selection --show-palette" ) ; >+- sprintf( lDialogString + strlen(lDialogString), " --color=%s" , lDefaultHexRGB ) ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, " --title \"") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\"") ; >++ } >++ } >++ else if ( tfd_zenity3Present() || tfd_matedialogPresent() || tfd_shellementaryPresent() || tfd_qarmaPresent() ) >++ { >++ lWasZenity3 = 1 ; >++ if ( tfd_zenity3Present() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"zenity3");return (char *)1;} >++ strcpy( lDialogString , "zenity" ); >++ if ( (tfd_zenity3Present() >= 4) && !getenv("SSH_TTY") && tfd_xpropPresent() ) >++ { >++ strcat( lDialogString, " --attach=$(sleep .01;xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >++ } >++ } >++ else if ( tfd_matedialogPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"matedialog");return (char *)1;} >++ strcpy( lDialogString , "matedialog" ) ; >++ } >++ else if ( tfd_shellementaryPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"shellementary");return (char *)1;} >++ strcpy( lDialogString , "shellementary" ) ; >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"qarma");return (char *)1;} >++ strcpy( lDialogString , "qarma" ) ; >++ if ( !getenv("SSH_TTY") && tfd_xpropPresent() ) >++ { >++ strcat(lDialogString, " --attach=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2)"); /* contribution: Paul Rouget */ >++ } >++ } >++ strcat( lDialogString , " --color-selection --show-palette" ) ; >++ sprintf( lDialogString + strlen(lDialogString), " --color=%s" , lDefaultHexRGB ) ; >+ >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, " --title=\"") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "\"") ; >+- } >+- if (tinyfd_silent) strcat( lDialogString , " 2>/dev/null "); >+- } >+- else if (tfd_yadPresent()) >+- { >+- if (aTitle && !strcmp(aTitle, "tinyfd_query")) { strcpy(tinyfd_response, "yad"); return (char*)1; } >+- strcpy(lDialogString, "yad --color"); >+- sprintf(lDialogString + strlen(lDialogString), " --init-color=%s", lDefaultHexRGB); >+- if (aTitle && strlen(aTitle)) >+- { >+- strcat(lDialogString, " --title=\""); >+- strcat(lDialogString, aTitle); >+- strcat(lDialogString, "\""); >+- } >+- if (tinyfd_silent) strcat(lDialogString, " 2>/dev/null "); >+- } >+- else if ( xdialogPresent() ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"xdialog");return (char *)1;} >+- lWasXdialog = 1 ; >+- strcpy( lDialogString , "Xdialog --colorsel \"" ) ; >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, aTitle) ; >+- } >+- strcat(lDialogString, "\" 0 60 ") ; >++ strcat(lDialogString, " --title=\"") ; >++ if (aTitle && strlen(aTitle)) strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "\"") ; >++ >++ if (tinyfd_silent) strcat( lDialogString , " 2>/dev/null "); >++ } >++ else if (tfd_yadPresent()) >++ { >++ if (aTitle && !strcmp(aTitle, "tinyfd_query")) { strcpy(tinyfd_response, "yad"); return (char*)1; } >++ strcpy(lDialogString, "yad --color"); >++ sprintf(lDialogString + strlen(lDialogString), " --init-color=%s", lDefaultHexRGB); >++ if (aTitle && strlen(aTitle)) >++ { >++ strcat(lDialogString, " --title=\""); >++ strcat(lDialogString, aTitle); >++ strcat(lDialogString, "\""); >++ } >++ if (tinyfd_silent) strcat(lDialogString, " 2>/dev/null "); >++ } >++ else if ( xdialogPresent() ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"xdialog");return (char *)1;} >++ lWasXdialog = 1 ; >++ strcpy( lDialogString , "Xdialog --colorsel \"" ) ; >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, aTitle) ; >++ } >++ strcat(lDialogString, "\" 0 60 ") ; >+ #if (defined(__cplusplus ) && __cplusplus >= 201103L) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__clang__) >+- sprintf(lTmp,"%hhu %hhu %hhu",lDefaultRGB[0],lDefaultRGB[1],lDefaultRGB[2]); >++ sprintf(lTmp,"%hhu %hhu %hhu",lDefaultRGB[0],lDefaultRGB[1],lDefaultRGB[2]); >+ #else >+- sprintf(lTmp,"%hu %hu %hu",lDefaultRGB[0],lDefaultRGB[1],lDefaultRGB[2]); >++ sprintf(lTmp,"%hu %hu %hu",lDefaultRGB[0],lDefaultRGB[1],lDefaultRGB[2]); >+ #endif >+- strcat(lDialogString, lTmp) ; >+- strcat(lDialogString, " 2>&1"); >+- } >+- else if ( tkinter3Present( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python3-tkinter");return (char *)1;} >+- strcpy( lDialogString , gPython3Name ) ; >+- strcat( lDialogString , >+- " -S -c \"import tkinter;from tkinter import colorchooser;root=tkinter.Tk();root.withdraw();"); >+- strcat( lDialogString , "res=colorchooser.askcolor(color='" ) ; >+- strcat(lDialogString, lDefaultHexRGB ) ; >+- strcat(lDialogString, "'") ; >++ strcat(lDialogString, lTmp) ; >++ strcat(lDialogString, " 2>&1"); >++ } >++ else if ( tkinter3Present( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python3-tkinter");return (char *)1;} >++ strcpy( lDialogString , gPython3Name ) ; >++ strcat( lDialogString , >++ " -S -c \"import tkinter;from tkinter import colorchooser;root=tkinter.Tk();root.withdraw();"); >++ strcat( lDialogString , "res=colorchooser.askcolor(color='" ) ; >++ strcat(lDialogString, lDefaultHexRGB ) ; >++ strcat(lDialogString, "'") ; >+ >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, ",title='") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "'") ; >+- } >+- strcat( lDialogString , ");\ >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, ",title='") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "'") ; >++ } >++ strcat( lDialogString , ");\ >+ \nif res[1] is not None:\n\tprint(res[1])\"" ) ; >+- } >+- else if ( tkinter2Present( ) ) >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python2-tkinter");return (char *)1;} >+- strcpy( lDialogString , "export PYTHONIOENCODING=utf-8;" ) ; >+- strcat( lDialogString , gPython2Name ) ; >+- if ( ! isTerminalRunning( ) && tfd_isDarwin( ) ) >+- { >+- strcat( lDialogString , " -i" ) ; /* for osx without console */ >+- } >++ } >++ else if ( tkinter2Present( ) ) >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"python2-tkinter");return (char *)1;} >++ strcpy( lDialogString , "export PYTHONIOENCODING=utf-8;" ) ; >++ strcat( lDialogString , gPython2Name ) ; >++ if ( ! isTerminalRunning( ) && tfd_isDarwin( ) ) >++ { >++ strcat( lDialogString , " -i" ) ; /* for osx without console */ >++ } >+ >+- strcat( lDialogString , >++ strcat( lDialogString , >+ " -S -c \"import Tkinter,tkColorChooser;root=Tkinter.Tk();root.withdraw();"); >+ >+- if ( tfd_isDarwin( ) ) >+- { >+- strcat( lDialogString , >++ if ( tfd_isDarwin( ) ) >++ { >++ strcat( lDialogString , >+ "import os;os.system('''osascript -e 'tell app \\\"Finder\\\" to set \ >+ frontmost of process \\\"Python\\\" to true' ''');"); >+- } >++ } >+ >+- strcat( lDialogString , "res=tkColorChooser.askcolor(color='" ) ; >+- strcat(lDialogString, lDefaultHexRGB ) ; >+- strcat(lDialogString, "'") ; >++ strcat( lDialogString , "res=tkColorChooser.askcolor(color='" ) ; >++ strcat(lDialogString, lDefaultHexRGB ) ; >++ strcat(lDialogString, "'") ; >+ >+ >+- if ( aTitle && strlen(aTitle) ) >+- { >+- strcat(lDialogString, ",title='") ; >+- strcat(lDialogString, aTitle) ; >+- strcat(lDialogString, "'") ; >+- } >+- strcat( lDialogString , ");\ >++ if ( aTitle && strlen(aTitle) ) >++ { >++ strcat(lDialogString, ",title='") ; >++ strcat(lDialogString, aTitle) ; >++ strcat(lDialogString, "'") ; >++ } >++ strcat( lDialogString , ");\ >+ \nif res[1] is not None:\n\tprint res[1]\"" ) ; >+- } >+- else >+- { >+- if (aTitle&&!strcmp(aTitle,"tinyfd_query")){return tinyfd_inputBox(aTitle,NULL,NULL);} >+- lPointerInputBox = tinyfd_inputBox(NULL, NULL, NULL); /* obtain a pointer on the current content of tinyfd_inputBox */ >+- if (lPointerInputBox) strcpy(lDialogString, lPointerInputBox); /* preserve the current content of tinyfd_inputBox */ >+- p = tinyfd_inputBox(aTitle, "Enter hex rgb color (i.e. #f5ca20)", lDefaultHexRGB); >++ } >++ else >++ { >++ if (aTitle&&!strcmp(aTitle,"tinyfd_query")){return tinyfd_inputBox(aTitle,NULL,NULL);} >++ lPointerInputBox = tinyfd_inputBox(NULL, NULL, NULL); /* obtain a pointer on the current content of tinyfd_inputBox */ >++ if (lPointerInputBox) strcpy(lDialogString, lPointerInputBox); /* preserve the current content of tinyfd_inputBox */ >++ p = tinyfd_inputBox(aTitle, "Enter hex rgb color (i.e. #f5ca20)", lDefaultHexRGB); >+ >+- if ( !p || (strlen(p) != 7) || (p[0] != '#') ) >+- { >+- return NULL ; >+- } >+- for ( i = 1 ; i < 7 ; i ++ ) >+- { >+- if ( ! isxdigit( (int) p[i] ) ) >+- { >+- return NULL ; >+- } >+- } >+- Hex2RGB(p,aoResultRGB); >+- strcpy(lDefaultHexRGB, p); >+- if (lPointerInputBox) strcpy(lPointerInputBox, lDialogString); /* restore its previous content to tinyfd_inputBox */ >+- return lDefaultHexRGB; >+- } >++ if ( !p || (strlen(p) != 7) || (p[0] != '#') ) >++ { >++ return NULL ; >++ } >++ for ( i = 1 ; i < 7 ; i ++ ) >++ { >++ if ( ! isxdigit( (int) p[i] ) ) >++ { >++ return NULL ; >++ } >++ } >++ Hex2RGB(p,aoResultRGB); >++ strcpy(lDefaultHexRGB, p); >++ if (lPointerInputBox) strcpy(lPointerInputBox, lDialogString); /* restore its previous content to tinyfd_inputBox */ >++ return lDefaultHexRGB; >++ } >+ >+- if (tinyfd_verbose) printf( "lDialogString: %s\n" , lDialogString ) ; >+- if ( ! ( lIn = popen( lDialogString , "r" ) ) ) >+- { >+- return NULL ; >+- } >+- while ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >+- { >+- } >+- pclose( lIn ) ; >+- if ( ! strlen( lBuff ) ) >+- { >+- return NULL ; >+- } >+- /* printf( "len Buff: %lu\n" , strlen(lBuff) ) ; */ >+- /* printf( "lBuff0: %s\n" , lBuff ) ; */ >+- if ( lBuff[strlen( lBuff ) -1] == '\n' ) >+- { >+- lBuff[strlen( lBuff ) -1] = '\0' ; >+- } >++ if (tinyfd_verbose) printf( "lDialogString: %s\n" , lDialogString ) ; >++ if ( ! ( lIn = popen( lDialogString , "r" ) ) ) >++ { >++ return NULL ; >++ } >++ while ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) >++ { >++ } >++ pclose( lIn ) ; >++ if ( ! strlen( lBuff ) ) >++ { >++ return NULL ; >++ } >++ /* printf( "len Buff: %lu\n" , strlen(lBuff) ) ; */ >++ /* printf( "lBuff0: %s\n" , lBuff ) ; */ >++ if ( lBuff[strlen( lBuff ) -1] == '\n' ) >++ { >++ lBuff[strlen( lBuff ) -1] = '\0' ; >++ } >+ >+- if ( lWasZenity3 ) >+- { >+- if ( lBuff[0] == '#' ) >+- { >+- if ( strlen(lBuff)>7 ) >+- { >+- lBuff[3]=lBuff[5]; >+- lBuff[4]=lBuff[6]; >+- lBuff[5]=lBuff[9]; >+- lBuff[6]=lBuff[10]; >+- lBuff[7]='\0'; >+- } >+- Hex2RGB(lBuff,aoResultRGB); >+- } >+- else if ( lBuff[3] == '(' ) { >++ if ( lWasZenity3 ) >++ { >++ if ( lBuff[0] == '#' ) >++ { >++ if ( strlen(lBuff)>7 ) >++ { >++ lBuff[3]=lBuff[5]; >++ lBuff[4]=lBuff[6]; >++ lBuff[5]=lBuff[9]; >++ lBuff[6]=lBuff[10]; >++ lBuff[7]='\0'; >++ } >++ Hex2RGB(lBuff,aoResultRGB); >++ } >++ else if ( lBuff[3] == '(' ) { >+ #if (defined(__cplusplus ) && __cplusplus >= 201103L) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__clang__) >+- sscanf(lBuff,"rgb(%hhu,%hhu,%hhu", & aoResultRGB[0], & aoResultRGB[1],& aoResultRGB[2]); >++ sscanf(lBuff,"rgb(%hhu,%hhu,%hhu", & aoResultRGB[0], & aoResultRGB[1],& aoResultRGB[2]); >+ #else >+- aoResultRGB[0] = strtol(lBuff+4, & lTmp2, 10 ); >+- aoResultRGB[1] = strtol(lTmp2+1, & lTmp2, 10 ); >+- aoResultRGB[2] = strtol(lTmp2+1, NULL, 10 ); >++ aoResultRGB[0] = (unsigned char) strtol(lBuff+4, & lTmp2, 10 ); >++ aoResultRGB[1] = (unsigned char) strtol(lTmp2+1, & lTmp2, 10 ); >++ aoResultRGB[2] = (unsigned char) strtol(lTmp2+1, NULL, 10 ); >+ #endif >+- RGB2Hex(aoResultRGB,lBuff); >+- } >+- else if ( lBuff[4] == '(' ) { >++ RGB2Hex(aoResultRGB,lBuff); >++ } >++ else if ( lBuff[4] == '(' ) { >+ #if (defined(__cplusplus ) && __cplusplus >= 201103L) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__clang__) >+- sscanf(lBuff,"rgba(%hhu,%hhu,%hhu", & aoResultRGB[0], & aoResultRGB[1],& aoResultRGB[2]); >++ sscanf(lBuff,"rgba(%hhu,%hhu,%hhu", & aoResultRGB[0], & aoResultRGB[1],& aoResultRGB[2]); >+ #else >+- aoResultRGB[0] = strtol(lBuff+5, & lTmp2, 10 ); >+- aoResultRGB[1] = strtol(lTmp2+1, & lTmp2, 10 ); >+- aoResultRGB[2] = strtol(lTmp2+1, NULL, 10 ); >++ aoResultRGB[0] = (unsigned char) strtol(lBuff+5, & lTmp2, 10 ); >++ aoResultRGB[1] = (unsigned char) strtol(lTmp2+1, & lTmp2, 10 ); >++ aoResultRGB[2] = (unsigned char) strtol(lTmp2+1, NULL, 10 ); >+ #endif >+- RGB2Hex(aoResultRGB,lBuff); >+- } >+- } >+- else if ( lWasOsascript || lWasXdialog ) >+- { >+- /* printf( "lBuff: %s\n" , lBuff ) ; */ >++ RGB2Hex(aoResultRGB,lBuff); >++ } >++ } >++ else if ( lWasOsascript || lWasXdialog ) >++ { >++ /* printf( "lBuff: %s\n" , lBuff ) ; */ >+ #if (defined(__cplusplus ) && __cplusplus >= 201103L) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__clang__) >+- sscanf(lBuff,"%hhu %hhu %hhu", & aoResultRGB[0], & aoResultRGB[1],& aoResultRGB[2]); >++ sscanf(lBuff,"%hhu %hhu %hhu", & aoResultRGB[0], & aoResultRGB[1],& aoResultRGB[2]); >+ #else >+- aoResultRGB[0] = strtol(lBuff, & lTmp2, 10 ); >+- aoResultRGB[1] = strtol(lTmp2+1, & lTmp2, 10 ); >+- aoResultRGB[2] = strtol(lTmp2+1, NULL, 10 ); >++ aoResultRGB[0] = (unsigned char) strtol(lBuff, & lTmp2, 10 ); >++ aoResultRGB[1] = (unsigned char) strtol(lTmp2+1, & lTmp2, 10 ); >++ aoResultRGB[2] = (unsigned char) strtol(lTmp2+1, NULL, 10 ); >+ #endif >+- RGB2Hex(aoResultRGB,lBuff); >+- } >+- else >+- { >+- Hex2RGB(lBuff,aoResultRGB); >+- } >+- /* printf("%d %d %d\n", aoResultRGB[0],aoResultRGB[1],aoResultRGB[2]); */ >+- /* printf( "lBuff: %s\n" , lBuff ) ; */ >++ RGB2Hex(aoResultRGB,lBuff); >++ } >++ else >++ { >++ Hex2RGB(lBuff,aoResultRGB); >++ } >++ /* printf("%d %d %d\n", aoResultRGB[0],aoResultRGB[1],aoResultRGB[2]); */ >++ /* printf( "lBuff: %s\n" , lBuff ) ; */ >+ >+- strcpy(lDefaultHexRGB,lBuff); >+- return lDefaultHexRGB ; >++ strcpy(lDefaultHexRGB,lBuff); >++ return lDefaultHexRGB ; >+ } >+ >+ #endif /* _WIN32 */ >+ >+ >++/* Modified prototypes for R */ >++ >++void tfd_messageBox( >++ char const * aTitle , >++ char const * aMessage , >++ char const * aDialogType , >++ char const * aIconType , >++ int * aiDefaultButton ) >++{ >++ * aiDefaultButton = tinyfd_messageBox( aTitle , aMessage , aDialogType , aIconType , * aiDefaultButton ) ; >++} >++ >++ >++void tfd_inputBox( >++ char const * aTitle , >++ char const * aMessage , >++ char * * aiDefaultInput ) >++{ >++ char * lReturnedInput ; >++ if ( ! strcmp( * aiDefaultInput , "NULL") ) lReturnedInput = tinyfd_inputBox( aTitle , aMessage , NULL ) ; >++ else lReturnedInput = tinyfd_inputBox( aTitle , aMessage , * aiDefaultInput ) ; >++ >++ if ( lReturnedInput ) strcpy ( * aiDefaultInput , lReturnedInput ) ; >++ else strcpy ( * aiDefaultInput , "NULL" ) ; >++} >++ >++ >++void tfd_saveFileDialog( >++ char const * aTitle , >++ char * * aiDefaultPathAndFile , >++ int const * aNumOfFilterPatterns , >++ char const * const * aFilterPatterns , >++ char const * aSingleFilterDescription ) >++{ >++ char * lSavefile ; >++ >++ /* printf( "aFilterPatterns %s\n" , aFilterPatterns [0]); */ >++ >++ lSavefile = tinyfd_saveFileDialog( aTitle , * aiDefaultPathAndFile , * aNumOfFilterPatterns , >++ aFilterPatterns, aSingleFilterDescription ) ; >++ if ( lSavefile ) strcpy ( * aiDefaultPathAndFile , lSavefile ) ; >++ else strcpy ( * aiDefaultPathAndFile , "NULL" ) ; >++} >++ >++ >++void tfd_openFileDialog( >++ char const * aTitle , >++ char * * aiDefaultPathAndFile , >++ int const * aNumOfFilterPatterns , >++ char const * const * aFilterPatterns , >++ char const * aSingleFilterDescription , >++ int const * aAllowMultipleSelects ) >++{ >++ char * lOpenfile ; >++ >++ /* printf( "aFilterPatterns %s\n" , aFilterPatterns [0]); */ >++ >++ lOpenfile = tinyfd_openFileDialog( aTitle , * aiDefaultPathAndFile , * aNumOfFilterPatterns , >++ aFilterPatterns , aSingleFilterDescription , * aAllowMultipleSelects ) ; >++ >++ if ( lOpenfile ) strcpy ( * aiDefaultPathAndFile , lOpenfile ) ; >++ else strcpy ( * aiDefaultPathAndFile , "NULL" ) ; >++} >++ >++ >++void tfd_selectFolderDialog( >++ char const * aTitle , >++ char * * aiDefaultPath ) >++{ >++ char * lSelectedfolder ; >++ lSelectedfolder = tinyfd_selectFolderDialog( aTitle, * aiDefaultPath ) ; >++ if ( lSelectedfolder ) strcpy ( * aiDefaultPath , lSelectedfolder ) ; >++ else strcpy ( * aiDefaultPath , "NULL" ) ; >++} >++ >++ >++void tfd_colorChooser( >++ char const * aTitle , >++ char * * aiDefaultHexRGB ) >++{ >++ unsigned char const aDefaultRGB [ 3 ] = {128,128,128} ; >++ unsigned char aoResultRGB [ 3 ] = {128,128,128} ; >++ char * lChosenColor ; >++ lChosenColor = tinyfd_colorChooser( aTitle, * aiDefaultHexRGB, aDefaultRGB, aoResultRGB ) ; >++ if ( lChosenColor ) strcpy ( * aiDefaultHexRGB , lChosenColor ) ; >++ else strcpy ( * aiDefaultHexRGB , "NULL" ) ; >++} >++ >++/* end of Modified prototypes for R */ >++ >++ >++ >+ /* >+ int main( int argc , char * argv[] ) >+ { >+@@ -7602,11 +7909,11 @@ >+ strcat(lBuffer, tinyfd_version); >+ if (lWillBeGraphicMode) >+ { >+- strcat(lBuffer, "\ngraphic mode: "); >++ strcat(lBuffer, "\ngraphic mode: "); >+ } >+ else >+ { >+- strcat(lBuffer, "\nconsole mode: "); >++ strcat(lBuffer, "\nconsole mode: "); >+ } >+ strcat(lBuffer, tinyfd_response); >+ strcat(lBuffer, "\n"); >+@@ -7618,128 +7925,128 @@ >+ >+ if (lWillBeGraphicMode && !tinyfd_forceConsole) >+ { >+- tinyfd_forceConsole = ! tinyfd_messageBox("Hello World", >+- "graphic dialogs [yes] / console mode [no]?", >+- "yesno", "question", 1); >++ tinyfd_forceConsole = ! tinyfd_messageBox("Hello World", >++ "graphic dialogs [yes] / console mode [no]?", >++ "yesno", "question", 1); >+ } >+ >+ lTmp = tinyfd_inputBox( >+- "a password box", "your password will be revealed", NULL); >++ "a password box", "your password will be revealed", NULL); >+ >+ if (!lTmp) return 1; >+ >+ strcpy(lString, lTmp); >+ >+ lTheSaveFileName = tinyfd_saveFileDialog( >+- "let us save this password", >+- "passwordFile.txt", >+- 2, >+- lFilterPatterns, >+- NULL); >++ "let us save this password", >++ "passwordFile.txt", >++ 2, >++ lFilterPatterns, >++ NULL); >+ >+ if (!lTheSaveFileName) >+ { >+- tinyfd_messageBox( >+- "Error", >+- "Save file name is NULL", >+- "ok", >+- "error", >+- 1); >+- return 1; >++ tinyfd_messageBox( >++ "Error", >++ "Save file name is NULL", >++ "ok", >++ "error", >++ 1); >++ return 1; >+ } >+ >+ lIn = fopen(lTheSaveFileName, "w"); >+ if (!lIn) >+ { >+- tinyfd_messageBox( >+- "Error", >+- "Can not open this file in write mode", >+- "ok", >+- "error", >+- 1); >+- return 1; >++ tinyfd_messageBox( >++ "Error", >++ "Can not open this file in write mode", >++ "ok", >++ "error", >++ 1); >++ return 1; >+ } >+ fputs(lString, lIn); >+ fclose(lIn); >+ >+ lTheOpenFileName = tinyfd_openFileDialog( >+- "let us read the password back", >+- "", >+- 2, >+- lFilterPatterns, >+- NULL, >+- 0); >++ "let us read the password back", >++ "", >++ 2, >++ lFilterPatterns, >++ NULL, >++ 0); >+ >+ if (!lTheOpenFileName) >+ { >+- tinyfd_messageBox( >+- "Error", >+- "Open file name is NULL", >+- "ok", >+- "error", >+- 1); >+- return 1; >++ tinyfd_messageBox( >++ "Error", >++ "Open file name is NULL", >++ "ok", >++ "error", >++ 1); >++ return 1; >+ } >+ >+ lIn = fopen(lTheOpenFileName, "r"); >+ >+ if (!lIn) >+ { >+- tinyfd_messageBox( >+- "Error", >+- "Can not open this file in read mode", >+- "ok", >+- "error", >+- 1); >+- return(1); >++ tinyfd_messageBox( >++ "Error", >++ "Can not open this file in read mode", >++ "ok", >++ "error", >++ 1); >++ return(1); >+ } >+ lBuffer[0] = '\0'; >+ fgets(lBuffer, sizeof(lBuffer), lIn); >+ fclose(lIn); >+ >+ tinyfd_messageBox("your password is", >+- lBuffer, "ok", "info", 1); >++ lBuffer, "ok", "info", 1); >+ >+ lTheSelectFolderName = tinyfd_selectFolderDialog( >+- "let us just select a directory", NULL); >++ "let us just select a directory", NULL); >+ >+ if (!lTheSelectFolderName) >+ { >+- tinyfd_messageBox( >+- "Error", >+- "Select folder name is NULL", >+- "ok", >+- "error", >+- 1); >+- return 1; >++ tinyfd_messageBox( >++ "Error", >++ "Select folder name is NULL", >++ "ok", >++ "error", >++ 1); >++ return 1; >+ } >+ >+ tinyfd_messageBox("The selected folder is", >+- lTheSelectFolderName, "ok", "info", 1); >++ lTheSelectFolderName, "ok", "info", 1); >+ >+ lTheHexColor = tinyfd_colorChooser( >+- "choose a nice color", >+- "#FF0077", >+- lRgbColor, >+- lRgbColor); >++ "choose a nice color", >++ "#FF0077", >++ lRgbColor, >++ lRgbColor); >+ >+ if (!lTheHexColor) >+ { >+- tinyfd_messageBox( >+- "Error", >+- "hexcolor is NULL", >+- "ok", >+- "error", >+- 1); >+- return 1; >++ tinyfd_messageBox( >++ "Error", >++ "hexcolor is NULL", >++ "ok", >++ "error", >++ 1); >++ return 1; >+ } >+ >+ tinyfd_messageBox("The selected hexcolor is", >+- lTheHexColor, "ok", "info", 1); >++ lTheHexColor, "ok", "info", 1); >+ >+- tinyfd_beep(); >++ tinyfd_beep(); >+ >+- return 0; >++ return 0; >+ } >+ */ >+ >diff --git a/games/renpy/files/renpy.sh b/games/renpy/files/renpy.sh >new file mode 100755 >index 000000000000..27ff78e24e8d >--- /dev/null >+++ b/games/renpy/files/renpy.sh >@@ -0,0 +1,3 @@ >+#!/bin/sh >+ >+exec replace/renpy.py "$@" >-- >2.44.0 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 268946
: 249758