From a7e778640f72c2d3810b870181c72dff912c737f Mon Sep 17 00:00:00 2001 From: Kaehvaman Date: Fri, 20 Dec 2024 21:27:27 +0400 Subject: [PATCH] add tinyfiledialogs --- lab16 with raylib/include/tinyfiledialogs.h | 314 + .../lab16 with raylib.vcxproj | 2 + .../lab16 with raylib.vcxproj.filters | 6 + lab16 with raylib/resources/consola.ttf | Bin 0 -> 459180 bytes lab16 with raylib/resources/consolab.ttf | Bin 0 -> 397896 bytes lab16 with raylib/src/main with enemy.c | 672 ++ lab16 with raylib/src/main.c | 38 +- lab16 with raylib/src/tinyfiledialogs.c | 8171 +++++++++++++++++ lab16/lab16/lab16.cpp | 2 +- .../TextProcessingDict.vcxproj | 1 + ..._реализаций_Словаря.xlsx | Bin 24476 -> 25090 bytes tinyfiledialogs/README.txt | 232 + .../LUA_plugin.tinyfiledialogs.cpp | 287 + .../PascalABC/tinyfd.pas | 56 + .../fortran/tinyfd_main.f90 | 185 + .../fortran/tinyfd_module.f90 | 101 + .../freepascal/hello.pas | 91 + .../freepascal/tinyfd.pp | 138 + .../tinyfiledialogs.r | 157 + .../tinyfiledialogs32.dll | Bin 0 -> 161665 bytes .../tinyfiledialogs32.lib | Bin 0 -> 34048 bytes .../tinyfiledialogs64.dll | Bin 0 -> 159854 bytes .../tinyfiledialogs64.lib | Bin 0 -> 34152 bytes .../tinyfiledialogsAppleSilicon.dylib | Bin 0 -> 141216 bytes .../tinyfiledialogsIntel.dylib | Bin 0 -> 139984 bytes .../tinyfiledialogsLinux64.so | Bin 0 -> 134744 bytes .../tinyfiledialogsLinux86.so | Bin 0 -> 123764 bytes .../tinyfiledialogsTest.cs | 153 + .../tinyfiledialogs_dll_mingw-32.bat | 29 + .../tinyfiledialogs_dll_mingw-w64-720.bat | 29 + .../tinyfiledialogs_dll_mingw-w64-810.bat | 29 + .../tinyfiledialogs_dylib.sh | 18 + .../tinyfiledialogs_so.sh | 19 + tinyfiledialogs/hello.c | 307 + tinyfiledialogs/hello_wchar_t.c | 241 + .../more_dialogs/tinyfd_moredialogs.c | 259 + .../more_dialogs/tinyfd_moredialogs.h | 48 + tinyfiledialogs/tinyfiledialogs.c | 8171 +++++++++++++++++ tinyfiledialogs/tinyfiledialogs.h | 314 + 39 files changed, 20053 insertions(+), 17 deletions(-) create mode 100644 lab16 with raylib/include/tinyfiledialogs.h create mode 100644 lab16 with raylib/resources/consola.ttf create mode 100644 lab16 with raylib/resources/consolab.ttf create mode 100644 lab16 with raylib/src/main with enemy.c create mode 100644 lab16 with raylib/src/tinyfiledialogs.c create mode 100644 tinyfiledialogs/README.txt create mode 100644 tinyfiledialogs/dll_cs_lua_R_fortran_pascal/LUA_plugin.tinyfiledialogs.cpp create mode 100644 tinyfiledialogs/dll_cs_lua_R_fortran_pascal/PascalABC/tinyfd.pas create mode 100644 tinyfiledialogs/dll_cs_lua_R_fortran_pascal/fortran/tinyfd_main.f90 create mode 100644 tinyfiledialogs/dll_cs_lua_R_fortran_pascal/fortran/tinyfd_module.f90 create mode 100644 tinyfiledialogs/dll_cs_lua_R_fortran_pascal/freepascal/hello.pas create mode 100644 tinyfiledialogs/dll_cs_lua_R_fortran_pascal/freepascal/tinyfd.pp create mode 100644 tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogs.r create mode 100644 tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogs32.dll create mode 100644 tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogs32.lib create mode 100644 tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogs64.dll create mode 100644 tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogs64.lib create mode 100644 tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogsAppleSilicon.dylib create mode 100644 tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogsIntel.dylib create mode 100644 tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogsLinux64.so create mode 100644 tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogsLinux86.so create mode 100644 tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogsTest.cs create mode 100644 tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogs_dll_mingw-32.bat create mode 100644 tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogs_dll_mingw-w64-720.bat create mode 100644 tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogs_dll_mingw-w64-810.bat create mode 100644 tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogs_dylib.sh create mode 100644 tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogs_so.sh create mode 100644 tinyfiledialogs/hello.c create mode 100644 tinyfiledialogs/hello_wchar_t.c create mode 100644 tinyfiledialogs/more_dialogs/tinyfd_moredialogs.c create mode 100644 tinyfiledialogs/more_dialogs/tinyfd_moredialogs.h create mode 100644 tinyfiledialogs/tinyfiledialogs.c create mode 100644 tinyfiledialogs/tinyfiledialogs.h diff --git a/lab16 with raylib/include/tinyfiledialogs.h b/lab16 with raylib/include/tinyfiledialogs.h new file mode 100644 index 0000000..c195d9b --- /dev/null +++ b/lab16 with raylib/include/tinyfiledialogs.h @@ -0,0 +1,314 @@ +/* SPDX-License-Identifier: Zlib +Copyright (c) 2014 - 2024 Guillaume Vareille http://ysengrin.com + ____________________________________________________________________ + | | + | 100% compatible C C++ -> You can rename tinfiledialogs.c as .cpp | + |____________________________________________________________________| + +********* TINY FILE DIALOGS OFFICIAL WEBSITE IS ON SOURCEFORGE ********* + _________ + / \ tinyfiledialogs.h v3.18.2 [Jun 8, 2024] + |tiny file| Unique header file created [November 9, 2014] + | dialogs | + \____ ___/ http://tinyfiledialogs.sourceforge.net + \| git clone http://git.code.sf.net/p/tinyfiledialogs/code tinyfd + ____________________________________________ +| | +| email: tinyfiledialogs at ysengrin.com | +|____________________________________________| + ________________________________________________________________________________ +| ____________________________________________________________________________ | +| | | | +| | - in tinyfiledialogs, char is UTF-8 by default (since v3.6) | | +| | | | +| | on windows: | | +| | - for UTF-16, use the wchar_t functions at the bottom of the header file | | +| | | | +| | - _wfopen() requires wchar_t | | +| | - fopen() uses char but expects ASCII or MBCS (not UTF-8) | | +| | - if you want char to be MBCS: set tinyfd_winUtf8 to 0 | | +| | | | +| | - alternatively, tinyfiledialogs provides | | +| | functions to convert between UTF-8, UTF-16 and MBCS | | +| |____________________________________________________________________________| | +|________________________________________________________________________________| + +If you like tinyfiledialogs, please upvote my stackoverflow answer +https://stackoverflow.com/a/47651444 + +- License - +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: +1. The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + + __________________________________________ + | ______________________________________ | + | | | | + | | DO NOT USE USER INPUT IN THE DIALOGS | | + | |______________________________________| | + |__________________________________________| +*/ + +#ifndef TINYFILEDIALOGS_H +#define TINYFILEDIALOGS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************************************/ +/**************************************** UTF-8 on Windows ********************************************/ +/******************************************************************************************************/ +#ifdef _WIN32 +/* On windows, if you want to use UTF-8 ( instead of the UTF-16/wchar_t functions at the end of this file ) +Make sure your code is really prepared for UTF-8 (on windows, functions like fopen() expect MBCS and not UTF-8) */ +extern int tinyfd_winUtf8; /* on windows char strings can be 1:UTF-8(default) or 0:MBCS */ +/* for MBCS change this to 0, in tinyfiledialogs.c or in your code */ + +/* Here are some functions to help you convert between UTF-16 UTF-8 MBSC */ +char * tinyfd_utf8toMbcs(char const * aUtf8string); +char * tinyfd_utf16toMbcs(wchar_t const * aUtf16string); +wchar_t * tinyfd_mbcsTo16(char const * aMbcsString); +char * tinyfd_mbcsTo8(char const * aMbcsString); +wchar_t * tinyfd_utf8to16(char const * aUtf8string); +char * tinyfd_utf16to8(wchar_t const * aUtf16string); +#endif +/******************************************************************************************************/ +/******************************************************************************************************/ +/******************************************************************************************************/ + +/************* 3 funtions for C# (you don't need this in C or C++) : */ +char const * tinyfd_getGlobalChar(char const * aCharVariableName); /* returns NULL on error */ +int tinyfd_getGlobalInt(char const * aIntVariableName); /* returns -1 on error */ +int tinyfd_setGlobalInt(char const * aIntVariableName, int aValue); /* returns -1 on error */ +/* aCharVariableName: "tinyfd_version" "tinyfd_needs" "tinyfd_response" + aIntVariableName : "tinyfd_verbose" "tinyfd_silent" "tinyfd_allowCursesDialogs" + "tinyfd_forceConsole" "tinyfd_assumeGraphicDisplay" "tinyfd_winUtf8" +**************/ + +extern char tinyfd_version[8]; /* contains tinyfd current version number */ +extern char tinyfd_needs[]; /* info about requirements */ +extern int tinyfd_verbose; /* 0 (default) or 1 : on unix, prints the command line calls */ +extern int tinyfd_silent; /* 1 (default) or 0 : on unix, hide errors and warnings from called dialogs */ + +/** Curses dialogs are difficult to use and counter-intuitive. +On windows they are only ascii and still uses the unix backslash ! **/ +extern int tinyfd_allowCursesDialogs; /* 0 (default) or 1 */ + +extern int tinyfd_forceConsole; /* 0 (default) or 1 */ +/* for unix & windows: 0 (graphic mode) or 1 (console mode). +0: try to use a graphic solution, if it fails then it uses console mode. +1: forces all dialogs into console mode even when an X server is present. + if enabled, it can use the package Dialog or dialog.exe. + on windows it only make sense for console applications */ + +extern int tinyfd_assumeGraphicDisplay; /* 0 (default) or 1 */ +/* some systems don't set the environment variable DISPLAY even when a graphic display is present. +set this to 1 to tell tinyfiledialogs to assume the existence of a graphic display */ + +extern char tinyfd_response[1024]; +/* if you pass "tinyfd_query" as aTitle, +the functions will not display the dialogs +but will 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 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 */ + +void tinyfd_beep(void); + +int tinyfd_notifyPopup( + char const * aTitle, /* NULL or "" */ + char const * aMessage, /* NULL or "" may contain \n \t */ + char const * aIconType); /* "info" "warning" "error" */ + /* return has only meaning for tinyfd_query */ + +int tinyfd_messageBox( + char const * aTitle , /* NULL or "" */ + char const * aMessage , /* NULL or "" may contain \n \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 * tinyfd_inputBox( + char const * aTitle , /* NULL or "" */ + char const * aMessage , /* NULL or "" (\n and \t have no effect) */ + char const * aDefaultInput ) ; /* NULL = passwordBox, "" = inputbox */ + /* returns NULL on cancel */ + +char * tinyfd_saveFileDialog( + char const * aTitle , /* NULL or "" */ + char const * aDefaultPathAndOrFile , /* NULL or "" , ends with / to set only a directory */ + int aNumOfFilterPatterns , /* 0 (1 in the following example) */ + char const * const * aFilterPatterns , /* NULL or char const * lFilterPatterns[1]={"*.txt"} */ + char const * aSingleFilterDescription ) ; /* NULL or "text files" */ + /* returns NULL on cancel */ + +char * tinyfd_openFileDialog( + char const * aTitle, /* NULL or "" */ + char const * aDefaultPathAndOrFile, /* NULL or "" , ends with / to set only a directory */ + int aNumOfFilterPatterns , /* 0 (2 in the following example) */ + char const * const * aFilterPatterns, /* NULL or char const * lFilterPatterns[2]={"*.png","*.jpg"}; */ + char const * aSingleFilterDescription, /* NULL or "image files" */ + int aAllowMultipleSelects ) ; /* 0 or 1 */ + /* in case of multiple files, the separator is | */ + /* returns NULL on cancel */ + +char * tinyfd_selectFolderDialog( + char const * aTitle, /* NULL or "" */ + char const * aDefaultPath); /* NULL or "" */ + /* returns NULL on cancel */ + +char * tinyfd_colorChooser( + char const * aTitle, /* NULL or "" */ + char const * aDefaultHexRGB, /* NULL or "" or "#FF0000" */ + unsigned char const aDefaultRGB[3] , /* unsigned char lDefaultRGB[3] = { 0 , 128 , 255 }; */ + unsigned char aoResultRGB[3] ) ; /* unsigned char lResultRGB[3]; */ + /* 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 */ + + +/************ WINDOWS ONLY SECTION ************************/ +#ifdef _WIN32 + +/* windows only - utf-16 version */ +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" */ + +/* windows only - utf-16 version */ +int tinyfd_messageBoxW( + wchar_t const * aTitle, /* NULL or L"" */ + wchar_t const * aMessage, /* NULL or L"" may contain \n \t */ + wchar_t const * aDialogType, /* L"ok" L"okcancel" L"yesno" */ + wchar_t const * aIconType, /* L"info" L"warning" L"error" L"question" */ + int aDefaultButton ); /* 0 for cancel/no , 1 for ok/yes */ + /* returns 0 for cancel/no , 1 for ok/yes */ + +/* windows only - utf-16 version */ +wchar_t * tinyfd_inputBoxW( + wchar_t const * aTitle, /* NULL or L"" */ + wchar_t const * aMessage, /* NULL or L"" (\n nor \t not respected) */ + wchar_t const * aDefaultInput); /* NULL passwordBox, L"" inputbox */ + +/* windows only - utf-16 version */ +wchar_t * tinyfd_saveFileDialogW( + wchar_t const * aTitle, /* NULL or L"" */ + wchar_t const * aDefaultPathAndOrFile, /* NULL or L"" , ends with / to set only a directory */ + int aNumOfFilterPatterns, /* 0 (1 in the following example) */ + wchar_t const * const * aFilterPatterns, /* NULL or wchar_t const * lFilterPatterns[1]={L"*.txt"} */ + wchar_t const * aSingleFilterDescription); /* NULL or L"text files" */ + /* returns NULL on cancel */ + +/* windows only - utf-16 version */ +wchar_t * tinyfd_openFileDialogW( + wchar_t const * aTitle, /* NULL or L"" */ + wchar_t const * aDefaultPathAndOrFile, /* NULL or L"" , ends with / to set only a directory */ + int aNumOfFilterPatterns , /* 0 (2 in the following example) */ + wchar_t const * const * aFilterPatterns, /* NULL or wchar_t const * lFilterPatterns[2]={L"*.png","*.jpg"} */ + wchar_t const * aSingleFilterDescription, /* NULL or L"image files" */ + int aAllowMultipleSelects ) ; /* 0 or 1 */ + /* in case of multiple files, the separator is | */ + /* returns NULL on cancel */ + +/* windows only - utf-16 version */ +wchar_t * tinyfd_selectFolderDialogW( + wchar_t const * aTitle, /* NULL or L"" */ + wchar_t const * aDefaultPath); /* NULL or L"" */ + /* returns NULL on cancel */ + +/* windows only - utf-16 version */ +wchar_t * tinyfd_colorChooserW( + wchar_t const * aTitle, /* NULL or L"" */ + wchar_t const * aDefaultHexRGB, /* NULL or L"#FF0000" */ + unsigned char const aDefaultRGB[3], /* unsigned char lDefaultRGB[3] = { 0 , 128 , 255 }; */ + unsigned char aoResultRGB[3]); /* unsigned char lResultRGB[3]; */ + /* returns the hexcolor as a string L"#FF0000" */ + /* aoResultRGB also contains the result */ + /* aDefaultRGB is used only if aDefaultHexRGB is NULL */ + /* aDefaultRGB and aoResultRGB can be the same array */ + /* returns NULL on cancel */ + +#endif /*_WIN32 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* TINYFILEDIALOGS_H */ + +/* + ________________________________________________________________________________ +| ____________________________________________________________________________ | +| | | | +| | on windows: | | +| | - for UTF-16, use the wchar_t functions at the bottom of the header file | | +| | - _wfopen() requires wchar_t | | +| | | | +| | - in tinyfiledialogs, char is UTF-8 by default (since v3.6) | | +| | - but fopen() expects MBCS (not UTF-8) | | +| | - if you want char to be MBCS: set tinyfd_winUtf8 to 0 | | +| | | | +| | - alternatively, tinyfiledialogs provides | | +| | functions to convert between UTF-8, UTF-16 and MBCS | | +| |____________________________________________________________________________| | +|________________________________________________________________________________| + +- This is not for ios nor android (it works in termux though). +- The files can be renamed with extension ".cpp" as the code is 100% compatible C C++ + (just comment out << extern "C" >> in the header file) +- Windows is fully supported from XP to 10 (maybe even older versions) +- C# & LUA via dll, see files in the folder EXTRAS +- OSX supported from 10.4 to latest (maybe even older versions) +- Do not use " and ' as the dialogs will be displayed with a warning + instead of the title, message, etc... +- There's one file filter only, it may contain several patterns. +- If no filter description is provided, + the list of patterns will become the description. +- On windows link against Comdlg32.lib and Ole32.lib + (on windows the no linking claim is a lie) +- On unix: it tries command line calls, so no such need (NO LINKING). +- On unix you need one of the following: + applescript, kdialog, zenity, matedialog, shellementary, qarma, yad, + python (2 or 3)/tkinter/python-dbus (optional), Xdialog + or curses dialogs (opens terminal if running without console). +- One of those is already included on most (if not all) desktops. +- In the absence of those it will use gdialog, gxmessage or whiptail + with a textinputbox. If nothing is found, it switches to basic console input, + it opens a console if needed (requires xterm + bash). +- for curses dialogs you must set tinyfd_allowCursesDialogs=1 +- You can query the type of dialog that will be used (pass "tinyfd_query" as aTitle) +- String memory is preallocated statically for all the returned values. +- File and path names are tested before return, they should be valid. +- tinyfd_forceConsole=1; at run time, forces dialogs into console mode. +- On windows, console mode only make sense for console applications. +- On windows, console mode is not implemented for wchar_T UTF-16. +- Mutiple selects are not possible in console mode. +- The package dialog must be installed to run in curses dialogs in console mode. + It is already installed on most unix systems. +- On osx, the package dialog can be installed via + http://macappstore.org/dialog or http://macports.org +- On windows, for curses dialogs console mode, + dialog.exe should be copied somewhere on your executable path. + It can be found at the bottom of the following page: + http://andrear.altervista.org/home/cdialog.php +*/ diff --git a/lab16 with raylib/lab16 with raylib/lab16 with raylib.vcxproj b/lab16 with raylib/lab16 with raylib/lab16 with raylib.vcxproj index da6e839..60a341f 100644 --- a/lab16 with raylib/lab16 with raylib/lab16 with raylib.vcxproj +++ b/lab16 with raylib/lab16 with raylib/lab16 with raylib.vcxproj @@ -140,11 +140,13 @@ + + diff --git a/lab16 with raylib/lab16 with raylib/lab16 with raylib.vcxproj.filters b/lab16 with raylib/lab16 with raylib/lab16 with raylib.vcxproj.filters index cf60235..baa190f 100644 --- a/lab16 with raylib/lab16 with raylib/lab16 with raylib.vcxproj.filters +++ b/lab16 with raylib/lab16 with raylib/lab16 with raylib.vcxproj.filters @@ -39,11 +39,17 @@ Файлы заголовков + + Файлы заголовков + Исходные файлы + + Исходные файлы + diff --git a/lab16 with raylib/resources/consola.ttf b/lab16 with raylib/resources/consola.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e881ca4b59fee70c0b3c87b258a5ab09065eb5e5 GIT binary patch literal 459180 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%0Dq(i6 zKG|ITc+A0jWN^AqE36q|?e-}ojWvVPOsk4Df1{u&pTT308BojdT{oqHho&MC!zPZz$nCa}%BhwcASvZn;?R67-toZoh`f-0bw|dMIgQdRd z*+W*oFlYV?_Y9P@292=w!Hy};c$cB^nbxPCys~#fLK0h5GebJWNJjBl*GZW5CRs1A z$;XCgGFIx&Qz}Cb_9u+#6>N+Zg6&w&kHZ3 zKrc0QeAd(?rZ$OVI=0I(9UqIC=mQQpl+A&W)UZD67xYF+hbi9{Fyh;E&*}Ti1cC=9 z=i@&i=f@9QY$w?=4p=mL<2eO?7YUO%#>;&Cho=f)n<{BViNYtr6VwtsA@pqjN$4pp z-?*{exoH!gd*I4X^kzKQO@_1QK961U*?`{RGDSJhyDN=sqD|Hdnve=%`s3I~Yz-cC zJI^cbN)xMbP%&w&7Zg+qDGc^-duUrrFN%tSk|@F?(wpamX-4qf@7$)MLB zx^fx|LX>1#r>{iE`R-&ds3<6aA}{T2FYPVl6yy}J#qnA`UmIw2RdsAXk@|L~(-V^g zK2f*>DS1u@Jxxu*sS_RT;$0m}F;!2B*L6I|`u8l5@(CV48?B*rx&Xv9h>q#MAg z_`Bx*FO@^TaxGpkR_ z_9wo7sv1tp8M)@~H!eA{uwTQPqxik3?D^yo3r9EJF(NHx_<~W53u@EEjeD+;XX~%s z`O9Ow1bi6(T&pdQs+m`3(eRYp78XnA+W3nf0x^2mdj;~fTt_C+r)4;fZBr3Nna$w6~aq;b?)W)nf&U=e5 z<{8Bo@A*nWBLi!N9R_w#{+9|`^0}zUQB4`S7cD9bO$D>QwOm7$c+^=Ex=oI7V)~=g z^1~BTef!q&)?23JPROmTx_?OBitGCck9VIdlXcp&XID1~(qHSZeeQoZZT)fkBY;V3p9g1lVExBnEku(PatGG{dNEoc(NTH=>#Sv; z&yb*J6X-IeMrm98(f(*d{8?kAp+D>pz9BI?pfo4vJ7&qk6i}H1JyXCIcT|*L+oJGR z#`v>Jq#fI$*zBTVwyOMSFB+NQ5NABJP@QRIH&N2>l%}W9+@}lj^W9DCoQ~l;iSI3Z-4&I#NoBW6Nf)q^T@hTp)h&E{S$iW zOg8<_Sbt2>u)Lz7ee(*-M$Q`E|L&>f8ly$GHOez>RMD`0d4=WIAlsUZ!d%-h*IH7{ zW*Tq)VY|Furr0Jlm6R__?C{5aJjUiuFKDoP@N%{k)qS0!bHR?A@|xnRZXC9DWs~r_vU_3wz->=Yr8C=~7(RDI#?ybM z*RgqKhsDY0iB8o+fhbX;f{yq#IAv-?okT0~?HU9I4OBJTr`YZkox={01^ADR+}O1m z#;(?5eG_mn6r4^$njEbDAvoeq!B^KHVEM4~aQg$npdiv)Ss!|$52fgXgY0A6Xf{i* zr49*S?bli)n+M(My&s&h;kd$Am+cJ32VKQ}vY~56v<9S}X>sTmGH?>r@fG%c9k98CXM zkS2{0v|!w!U{B#=S{+P!X%}9dh2F6}AXLyZqh^Of4PHZ^^f@_1i?45pUa%qZk(WA;Hn4plTNzU4V&R#4L6Cb;ne3 zd;1;Y6CHEtbm@V1&$i|C;#1_x70#*gnuTH-TUB6F8Tq}^ir+1*>{7ZiLSbN+(oVWH zT}taBb%%5*y(>~WtV`)Tk=v4 z;~j}+i{E1P+iiY-QgT8fa~s8({26}R1Lh~pqSReCMdX*4>lmi{r%&;jhs2`iT^ zxl-7MsyFJpd{vipbw`~%R$x;dQ_y;BS`y5hyk9Z-@qKd%X30$qsurn>ChgY9nWJ$LN zpFDXoc&{vvukrLMEKgJYT5ac2N_wO_{h9E)y~15w;*}4vPRhVHE7tR)Toz3ZD%mAT z*4PDu<&ZExkZcnKS!Z?Hy>|Vp8sn>GhpmO0@vp#+tO&}sKv98LY%yT7hr7=99ezMm zKRDJ>n$yCZ2W*uy7O@qcVAtqhRm{d$6$iDoC|xKCmX@$XBSb7aKU?+K!M6a9UBtH` z*afL9XbkSSd5`E42L@jh3WCRlT9lj-qJ!tLft}3E zNZfcW;DjUG5^Fn~U^Wx`c~k$GvrH+g-mn7ZoH*Hnz3<1@pm>=uxns??vkI$hvY%H> z{YeahmfTOlPZsK0awfvL=&~^X9US9MW^aUic<$u;gmNKINRBC=vi{Y@!S?&^Yr6H+ zhk4T;ziGu6UvU53QPr0xj@#I=<8m8w=E08^(wp!wiW-s|)=P8`AFqy&H=;+cDvjvT zt4bq!^s3VSze_iwM^TsQQT1sNJ&IDMN7d4Z9z`jWQMDANGGz44;8OY(R(>*B715Um zol$XdrerJpE;IKWYUClFt$%7TE2=YnzoazNw|dLTj6qGQO#$SlgKQs^B!{#f+4~ z;#Q@BUgC6(DqZ{(A>&9a0gs)qnU^pwH+jr5c)CyHv~&Mo3=W6}oyKdcv>PmEwRlU? zSxM3unNxz9>dd_8_$WXByZn4+QXgyipatrbc?EeGfj5h?AcR1oB-dG`vuVgQ$v&2! zpN+PRx6G^uumFk*U=a*V0buKCEF@f=VG`CD5*QJEi+Dmu|Igr*t3Yv!s>| zi*WuhpCz?amF}I8Zsz|sfoH+tO9AnJ1Kq zHS~?`#}8Gp=0fe|4eZvl3YwTK-Q}6NM}I5La52LQfGG_MhQhJC2NE6tne zcigMmDa<07dF3LHPB}1~32c;bcIcc;mAZ&gc>18u<#AWK`s37LMKJfYt=hoMTXx1} z!UQeK+#6V@`&li*ss#)RvB{?uUKKLL0yIo`Qsb$5NK^f;>00LN`plNytCw^9)TW-} zR$e=`_Ha|v9<9}+RhG~l?SmRtPAZCJ2T>+F@B+`|vSSXf4U}#UPGeqJ$b*HKcCMpO zcwH+m$$g9~0fWgTAdf_# z2JDF24rr-GGRr3B!*Li5TBGJ0*@%Csu9BSNmNur3+c9te+P=dNW^==cInEUuV^}lV z8#w{D0s^w;8zn@6l5-&wTqTl?<_wI7Z2GlDC9o$`-LlXmrgx;i|9&%Gg7EOBP2#v2 zkKZIF2TKlYIe>A!0=)sBAsZKVO|7sPZ+6XOoMc{2&K)~GYJ|@9*0r>A-}r&AH?^+1 z-sXX0SQntImZ}_^7aY%5i<8Xc9MfAV4n{Q>kED@& z@(Sm4YG$vbI4LGQIw9U_@mYkdY?GOoeZ*{Y=sn0kwcuZebVPUszTy}-FXJ5rzMAa# ztOTi7($^-d5H0CFRhB{KLA@^Mt4R&kH#fvRrQg{xE0`0wVIY4wId&XrOYNm$L%gNM z26Mcn1*aJg_Zs-aWIah=D_sfedtFdCX{Ha@mgIp%gEre!Xq3b4;{N9}=mgl2AoOG+0oh2dUtFpH+S?syr+CV z!F|eE=|63$$~Y}m$DUS?I52l2G0`*J63@v|Bl-zG?1z3L+@=seqm1C%`cEe#AlIAlilf_=A@4!?WXWN&#{kyW@g zct9u$zAX$18Z6n-b+ZR2J+{e};ok*W|8UN@UBZ8!6M@&uG*H+&-@lRLjysC$8V^HtBj_+(c7+#$@ZFUP#v z>-x<%*KNJCE{N6sSjCh#AcJ7C1Ut&y4BhIwZfIX& zo?%WQN~NIM4&6#4TH&g?(5K92gEJlTEtin}jBm|Si9WUP1-O^(IM*qtK!qpw6QZ~4 zv*A?7xA>$mZ*ywM+nkzlKHE+cs*tV{1s@l-FVi=)S{%$4Y-x_|D!=oYV{ka-oH>bO z4m<2&!`YjfasaRZzw5jrQ2Y*>uP_==Gxi z5BId&rO}A<8aI_^j{omG)WaUr1WyTWLHpnOs7Fk=|3=KxOzcD8CT2;UkI*b(o^5=V zJbaeaoop0l)W&C2Ek#|h8$VeoEQ0IRJxh{wqSb0N!?4~Kuxmt<_MG0V`2tsEMSUgQ z!Q7h05t8K-F|P!C6Ub`dr$~oMuRRA(gysv}bO=@FvYdkhr0R}g=5rS-PF&L*Y!wX5 zK^|Nz7{!4dhsA+^7PfENgnS2eZ=!8{Bwjv}kiE=2=v_)9d(%~=ol@Aw_ivR#WN*5v zZe(vlDchUWx{ zC$STvL#=M~o>7d|G`sUy$l9U+xa`0B z>Uy+F4a`lWM$nkAlx-H+BN3KR*O)oU^o}C%?xPU_LBpg9kta-9VS z0#jLu>1xolsIa)8pa_w|B#pMH97hpsD|Te;upBWi4<$5JYWVAfQ44BQ&;0wn*|%Nu z%$UUbag+0}-7vLy_sPnM{o))MfnNO{8?~~&rpNH%UHwN5`W>4Z+k z& z(gU-{9=>*$Zs>E9N8LT9N0TRiL~&yE;QC$#GjjXgJTgzzEq?9Z!AYs|kl@0@Q%BY; zdwxOfJrj%EdG-B*(JoKg*az7<-hva@PTYcuQ+;ktR^nk_&!&logI6EWFSQC*$FIgZ z9FMdIXT=F|zBY;>v6Q~B+YvL#_8}{8U{I_^$FGX9E{?ZQ;;64pK?_VErcVunr?ROd zY6P@PN+0)M)1B214EsKKWyp%dvqr2cuUuKvf8Myly^jxCUY_cU7Q{>QURgafDtcQ| zLcyffqYv!&`!ORd`uH+t#03vOkDBad=|Ov%bTJU7eE~a3(wSv%o2|iEZy1^Ivs|b8 zq*>@XEQw6xI8n>yZBx{Ga>CCFYBI^=)4~pF&QKa6<|R2KfF-Km-OemC&CLVv+CMXQ zLeJfsHG_9tKWf?N9!)n*u6nROdwRjzCxkP1zJBi@lUdl-w(x}+(`uF-T6kdJ?Q?~H zLgblT-G)*8fHlVQN!9EllgSM(9@v-Q&O~O|!GPPHm2mt42_dPhl=ppg<_}HURvVuU z)%N6RmOmmvD|C7fc%_8naQ$TYQr^c}GMPVAOg3#R1{j_XoLjj)hD6dtHV}jq+~I|# z8lT$YUOZ()OMei>j*6X6^%&DI)IVt7q`MB!D=oWihjQanGfVeVfBz{}r4y^OWHCE6 zKkCtEv?ia%PMyv`>|(3JTQP$tpP$dMVWTysQNUce-OQ@yJ9m*SG2bIdG522oAK_52W^eHC zLVw|@=}Ru3lg`Gq?pfbaBEGqPo3P#+oWss)6NBR=7v`xi8Ac|NPgw7d5{s}J(>7e# zdoYg}d(gbTNE_Q5Fpo~j8=aXqdUReUP4pZQ-a$r4KjG~_TH>E<&fvhBfeml#QU>;* zx?(a=7^oYl`%`h>5Bk)Of4jJ@;{DiB+__!BhK$W|0{dlWZifP9rtsq%4qQ1nzp*6H zWB6>t?#XzOX&dMaDm4Rj4R0$dd6jmbz8@%kYKzCetrXYAR=ls^30$#Ounb6c5adtD zwuiz@QK1y^G>AIFOCC8MQ6{FC5S}kAE@8Q5#qQJzFMPIgR$ppMg15ijEkn5R2% z38Hgi6H2GAA6;>a-{~9NPtXlrdTl|UI}YEu;JI7!s|Wegyr!}&XPnzudc*oLsntF~ z>7WnYGxF8}@l$RHwk2kJ4MqMwwYi1$C2`^3bYk*^;t_X^FNkr)<|m}(iv}?%FtNP< z{A-KT2V7S=_?7}wN_MWNQpxr7DCnEUY8rHF+wFrY zh%ELyr7z4Lfo#Q8zYd+^Rr3h;THzer&HR(X?toP=Mca(>Wp|xrq_Lhb$^4Cmx7dts z`LYtJ0x=A0cVuO<4GTsJb8y(TY}<-*)7N*6u1_wj8d0!omnO5ewxP$yr^UPG&T;0{ z_3Oa*hy-uglGi`WagghZo#@^BSU-B`ZLTYh5-Yx{DH?H-y#b3JdG&gvhD-WZZ9S4$ zG6Dt{Hl`XE`I**2s6NkzzF;DBT(!E?Lz`aG>RT0Uy-RJOxM+ZqpB1!#koauxLVbs` zJ6R@iQKB<^h6`OH5L$yD3!ezt?Vkxl%Hr}<-R{)(|S~ot76Do1f-( zr{%}S<)z^uCX!|FF-^y4+*m?O)%BE$(ZD&5^+XJ=EPIv)?k4?ygY{RV3*DglG1JnE zLXJ&D$-9k{*7Te8muW-RlqL)sIxJ=O-9eXF(0#bywx=;~RE&3<&F9dsyPwvr6P^i= zIm`nlX9r*(rbEsQYOcidNO=BspI%Q4F9@F_Rfj_85PTPY4A=xDq1K89EtTYvQb_8U ze+@(CVXxCra(wxludc=n%1m3XKPYjT&gdo)>m&1uRrK6 z=7M1{_?#b0!I2Nn@NR+ z#Z@?NV8=rG?Te*#d7c?FnGOq{>_`pk8H_uWH@R0t-urI+pONVqlgBF(Prb3;c3E4; zB%QhN!j_~uJU9Yb1+DF}!mF_Dj@7}4oZ+ss0fiOL*2lCx8lYSrdt%p^(f+ck;kmo$ zw@(!g$g&?i)N!kL*X_5e3Wu%B@i_Sz(6=txs4#J{Wyiy+V%ey_TI-T8F%uVzS9c^P z114+quP|-pVZ@EXx>b2@UPbtKQ|7Rn`;VA8C^2)GQq6t~ z!P{QF5BY5`Exzq#{J!g@dnVjBA*XEG$|1;wW53bot?(YSq0cUos;;PgW`iHL#qK6U z8jLAegKnKU&E)H_)tPGb*Cd}%yARIVAqzeq;*upKrfJ!uMt1k(iqe2#L>Ab^t6-?><=x+VmmN9pa&Tfh> z7+weyH)Cq)gO3Vllvf@cWwWQZO&1n^{8r69hZZ!hn2^tmT&EXrzGe4ZBpn}zdgDQK z91-?nR61;1Hoem&!geFhdedc$Koxgp?uCv{>KLq{IpfH9ka%8=^lfoiH`}f%m#mR>SLQp($j8nVvokrxpANH>H#BN3mlQOBitLswDzT$q==K5>Q93iUR1+(5{RxSqxcGG> zrMzLnPHPyuU|6EyC~Bo94wnqD^D`K+KvtnEY11AQuri>~z+a7Z{UCB8yF+DOfy}r_cV;D~=a5j7seoYUV z#BFpN{J^^dQ3kD6=dtR%TH7xsgSnPm_P8#oheBjU9p{DxbAa1ImbqJNw*8`*0;uXC zmlY3nUFtj$7Wj^HtAd{i)7WK=L_6-?z%*CSRrJliODg|nScDcoB zer~U5+90@k24CC|6qTE-HrC&*n8VlcR{kh5g7;TMj_+=00yBDTF?dAct~J$K+rV^Y zvV~PCtOdR}ph?-^wbnK^E%mBgshTt~Ih|btLjT}qQm+OT(API>de+y~_k3*2u3i4J z{!pY`jUG58uIpHG9$K_a5dl z+m7i^Z4)1A$9tWj3GtE)^uQ5{ETzkmMq@G=wYa*0i!G91x7(;B!bNJcIf%u~vQRBN z36&+Fo@NQCEEzT6G1^R4yFt>L&04*#R->&Kg?b0?Gs}`?y+IOb=dBNZ+e5wV0mdP3 z5*c&h+aK&RFJyYjYxyI}>_$Z==|4(Ot=e#6eO%&w$Jg&@bYyQ>{CH362>NY1Zca>7 zf|J3DQJa=Sc=|72BkpE$0)MHL34R#KuUt-&b%(B82*f8Ri~eLJr6MI&Z(z4lYqeTU zEfVVLalZu;!{$Z(PrcrA45^m+LmS34^L$n-Ha`BrfS<_?f-QTcr3IO7x|Xq|H><@{ zUs)~wL64tT*J5>ejx4LgKj6-hHo1ZPh7wPwWwrPR1Abmzi?P(&z5C!~r2mi^n1Vti zZ8r0K@W5^#McxJ0-+$Xr{bZ*UTqW3QSO6fnD-UgCG? zg{Y`#pBs0g_T#+hsE5T(16G6iijXS_no&*{UVorUbwLF#N2y*wT#{0y+uH&Skk7^Y z0B_DLb{eq5VmDt=B!NUIaDgwtdSp=x_6vg$1imc8k&6=C+hy6xalsu$x31WFy)P>| zsxU5hJnzf6hqhlN2GzB+{C7(Ozgvn+$`QJYBXkFK zDIF0h9o(g~vkybNl%9;#9o|{0ITb2R<6ozNoCCuYQo2{ZmVK+V*;0ewcLt0)Q_Zz< z?$~`)9L36Y#v1l}zfM;(Y7`uCj_mBh!ff`FS)9ueRcOU7TucV2cg6Ra24v?R5>_>9 zG_GPq&-OHV2b3{?vn9bb(DP33-l@6Nm|gE@?q+jB?60YHRjt;Bf?aepH%htF8EOfN zi5aN4w$Z|FhvuAtHe##9(%bWn5+;(sskoGc)YxB@)H-WbD-0!CuuB0kevsilOqCk< znlVqAnuq&;d7~qdh^yVwYFL70>HeXAI+DBgWmiXam*m|)^jSxu72-d-IIk(9+}}$T z+{y`%p=1}6^JW@XF%Y+(mNsWrR3r~NB&=+L3kEC?B<3a$%N+P-z-lGK`hDnchG=bkz4nB#251q8U}LP5$vk4)>pHx*9F-|s`k-{6jV zUvbAcK2%~FG?niwn!4P)b|sheJfVOpn9ZEU>QBrR3$?M;4kwdpVj~u*`YVe|+)M*- z_VbzO8VqnIF}D@ViY^jZKp+vWOri1Gg}&sOgGbyvz%Poy>Iq8etSnEzs_KMSh7{a0 zZ2sc(`XyuL4`?i1TJ9~Y8dx-XL}6~$gc6}Jy)@m4FR3&q6wqMb^4^t!xqrF7xY+vS zb6)#>2D?eKt6}_x`-je}&u*N0OM3FdEPT-M_LPxBhg6T*Bkbr^dvitk&2_y(Yf`G< zYyDZi*40&=30vz7FI}#dX0p1hbZ3{+052`;R$9fg57oMBuqIUs4Vg@9Z$WID`S<ssPqm*r9IX-=JDUJNz@n z;r-|Ce@u>gzF=z#ZfB@vEURWvQo{kJa5z916Q|Nr;(U}61O-3~^Q?xV*-WD?=9q<| z)6|*ldflJTB0SULGe|n#wfA?T1Jx@mFcQ<#F2DVo2*Fc6FL-(7C&>P5JX37NKUhvs z^-oOWOo7e#z06_oUFC6>6oF;c7}IyM?Ut0O`)Oemeu94N`} zLw{LUvZv&wlJ`oak~(i{OLUf$@QqP8jxQaM2 z4jz*Up$l^pvU&a(|52g79wD5K!yUPZjHzMJ#1d>O{0RyERt1lU_Wh!8x;@R8l%5SB z$__waJTB8AbjrZ}8KD##H4Mg`vNSC%T`np~FYu(g@!kmda&gjNzFdB|5RYdC;u_}; z@@Ed7+IPSW)k#HLT)DpBg~M|`X%I5s89ZxPhCO4z4G&y5J-%yc=N{j+6eo)aUAD)obUXL> zA7r-2tEHWLd{+vcd;AYF(;RBu2J{c{D3&LSy`qFvk!RV;IFM~|W@b9$UJwqD-Xu?0 zg)n~)VQ0XA7X@I&_jXp{Zp*a5|Y;A1axalvc&kKnpwfWGD_M@F3T1 zOTIdXDzann2v=uz0F8vV=BQ}`QJIORXj9kVR+q3>>44fh>t|dF^CEV%yGgd=GRU3-f?kfXUADty3PjmsYV597 zv)_Xz{Zw4UMJhOSDzkEYc6bMI|D#pWQ*WzsRbwm)tP0i| z=`8$(E1{Q0uxxMy*TY&^gMe8oeRX$m;jX5pb6*s#sOYz<--2EI!rButjZKIZb+IF(;3{U(Dt4KywBmyaY#FLH8!iyA*hp!X36J=pUIG_~?ac$kYOX!PN;55-!x2a*Rj;F-B zIdhrYq+^pbXU+2EYgTg3@kkdtmAu7yA37OzD-CJQZl$4l>Q)*$8Szr4HC4JHt;tK7 z)>KPFTC*Dk%rxc%_Xs2n)~=rvs&CJDk)$DNmCK@5NX^v zcYQV|60KOXbFxJn&9);!^Jj(8qHz)R$oD#Sp^L}BVPAF0nhNEt!Pyo$p>&UQNt(`U z2=kCq%ENn+Q%SIAx2RW_lgWDVZ5Hs0s6EZY;hzvI}~T4a09DxCRrPb zGyN>WdB8XVeuTo6Oa+AFOd=wbsKJkCe;j8DMIYhzAu|wbY=>52_inOD1-X;0rst8i z6m0TF^*AE1v!_AW4NnZw!MDD9UsNCu#$aZ^-Zwp9^VFp4J+)EwM80f8c)sHp64pP@ z4%s3sYw$-NctQ`G^3r)Tn}T*~8yn)mXvI!9XyyyqAc(4Wy+DzcPO*w;C`b~Hx2Jad ze_>QqX<3KS-q*9Y+2Jxo@d&G)M`lCOSav96(#vnW z?o~sumT(BRGw#ZaekPH>4Y>X`zzV<3Z{n#Ty-H_t&HN764(f_OfUHo&RI!TJ@KQB{ zlt)_Wx1vTk%C&DMTh*FFsI``B--^sKrhP3T?Q5~9+V{$pD@gl5ZaCB4sLAh`pafcd zC!#X%^XIVg@EwzI^wh3eO#!1|5DdsHvYU0d7=ok_yb#9WG}%vB5#+-rNSpOKs>d}7 z8ZfcIy`ZtyOD8mVI)CE?yEY3GC-j5gF=jb0uh~wjx`C|*1KhGWIU5B%qlZi16fXi} z1T9L4phh~OfFxTdR~;49gSA|g%02J6eWHf;5u`mMB=Gf~fKNQ6FK*nhWxep)nxF>1 zJDymx1{|0L&RkSE(86z{h%u4dDA=#Sv2~m?o%*?JX~=%XJajEp^)rj(y-tG>3hEq! z7+!zxVWlp{afB%#n_D59sEa#wJa2ukoy94dEreKLLhTONC5xY2P8g-V993sGTWb+A z4j&^Rru_YTctrx^qay(UiiA;7+RI9$YUI?wWR<;+qH~9f#8+8Xj97H@yl_M{5@Thn zGx*cm`^DSBan;UX>oS%gz-$8+W#zm=ARJ?g`2MacjhqXvDh;T1L^led9gdf>9Zsbi zITwHe+u_vG&<@v)LgZY4_c*XwRO{9;_9H5sDH)_!Vb`USJaUZb&jTrOnYmI@FUIXe zM|4_xo)x!K#MBrc(%oGRUtVgO6qng*vWn4?!Bb~3 zkBw_JG_YKNiWUfe3rkyImsLWu#4?oBt15W^55F^RX_3|2D*S_h^MiV0C0-@%$!x`a zl?ZV|T&tpz_kwn|N}pX=VKZBRm+`3D7S~lu!Y&98Rnsk5N>e&BCs|%;lt=t*L&L30 zDi<})?wMV^zG3#A>|>9djiv`t_Awy;%Hp(}I?J2W#HGSn~D0 zJ6>HiMALqsDE7Ny)v#Gxdlre5eY$mPPiT}Ydl+vy$Io(EDBr_4o{rh6f_!Ho=d7A+ zVjOQqRG=Cjl|B2jQ?gTZ{f-DLaD*s=*Dgjkpx>ME@$Lbsttp9Z84Z=K?z-Gob6uZS z7NcX{I_|Ht!*~nD?72cSUp&!%Zw5Rk=yH7YMxRP>W22_b#uDQ0) z;#XEKc=g^PjpH&adwR;}@0yvKV|wyguYJ8MdbF_nh6l!FW{+PxW$N0onZofAw+!%a zf+-%#7l38$hBsoIY6~F8p*hNsXlDM1fX$F;$&Bf+*O^A@uSx057H}}B{IMl`N_`h>{S*F1ME2)>|3TPAlD6N<26zF9gm!pSNIa2jRw^CLA zzKPuuF?p;pbM>h0G>w{Q7=~gYDckgE`rBE2h}Xg zMh9NKwJ)I8OR2H=*T{qH4r2*!#t`*p41(;b8Ld4Xy2Luz&vL-}glV@)G+AZY`irhX zGloTQL#{|j?$yzD6fj>Tb4fz2^D8nWd_{)QP0VOjIAxY6EC*bQ6)RVCP)1#6{YByQ z*>RG&C%O3yiZEBWy~1u6a4+S57o#s2sq|@lxU6yg!2c>pUomMwwjp?0h!P$4|0+Zy7Hw=ldoHnRkM}L~J`G)+AAvad`Yb?*rDNai(FAvmR4}J-WSRESqL2#o` z)dL15pn_4*MADCs;dT(u$87iIOx4)dMPH9^TY6VA0=h ztXe1Eu|bRMy$z4I_oOf1zI$$|g=zdDxOW)GZOe_AHFke_2wzhbm{a6lU`|)qq3qoOJdHZu;B~`+${O2UzbLi<+H<3b#&*xzh@AdIxf@0B7!cS)cF|RIBX$u=Pe$rSVxl2yNu|K7C1#s0rR_L3^&ksWse)hN zKw6s16i@ujdlOHhFo997o@vzNPptRXx@)7`?6|3r8Sw~k4;|lc*jwj#Fp~?Rx3h^I zNnNZF&FpgY54B^m*(Fl>n?x48;Wj)`?UCbt_tcioLx1OMG=7`z((Z~J`1$D!E2@g` zA&+#O!EU9Iv%yt$Lo>+hvbjsju!UHLBXom9C*4mTbul)M_y#XIP{C{*37C%S3L?XpH*R?P!e-Z62W^ zF{xFrZSZmNYa9F~RBDpn1fPC{2Fb?AGH{P0qtPAptKyD!v?`#*oF)-tQzfPzU76B_ zQO<93s4<)H1r|PDHMZrE^8D5P12KIk4@eU}3})91&#LpMPADu_>T-gg2pu9F%2Mz#)69m1*9cA{ zm?`^NE0%4T5%4K$JAc3*|BK?UO?UmOqH9USVDdz3AI~-I$!QE#JM(BnIh(N z^VJD&r(RcBGkVtrrZ9GJt;|M`GogS3c$d@a z)umyre06DP?Q#BfQV45hRu?NWL^rIJSt+z~s5GpVucoW|WABBgy@+|qBIRnV`+3qw z=xEAy;YE0>_NAo6Fn8WTQ@q_CqBsmk5g7HlyPgS8YOqF~-|!Y)B7Bs#u~3 zw|y{K>O?WK5>};p%YAPVCz7P7R9yI;2BXXIi=t98BG6)Npy?5PoXyFxKrNrTtF3>mie=*jNVsp}?+?Ccg^i3y0C@LQ?RlN`)= zD*N7rz5AnVw!$Jmn`d_x^W0|nJeQ)Jt-d<#uNn$JgSryYWgB0NxHf=SpYoNsH;Xq* zP(tkjQJzamln-uqU!6vaizEihJPF~Yc#PkUQO^e9LX>m?5Z^y|GR5cE$zNW z)za>3R4whkM%B{pYg8@mzDCv3tJkQL3?T=Y?%bC&q}qA}VH25DV`H)PDJ&d1tnZ~h zC9UPvg}utTHuNqvJYm>vc+nsk%IiG6T)z$()Y_{dAq^>B$N837T7jSmQ>O@j;y0g3 z_~Ad|FS51v>3d1(Q(n@lFoLRn^($6Gj-kR(YmjV|6CDB#JEYg3Rt1CupzN*i9p}4g zX~nzj0LZ9^{MFrN5z4l6vGTn~O$lR5njLXE=RcIv{5z_+>)O3)b$1ntv45nbyDs5d z*^3>cBI{h}Dl5T_OmHGAn)yqoa4Utc7rd?6X7eZVHDV)%Zp#G2@8m7#Yjk8$@Y=s! z7o8mIwl81Jl|Nnue=PM_`!(?S&Vja1M&1sOh#n<{0urY1lSYiZCUeR9#Hz`Ge)9|R7gdknJUeh*TmidHR}g24%S++c>Ky9rvhD14 z8QjZrDz7b#=1L*unzb{iB;e{Dzg`znb`(Q=Q3h<8cEum zmdM@&k;I73aKqEa|Li1f*p%S5fOAx}tWbxIgPoX|35A4z=ydj~)l+>R9y0NvX~j)* z7sXW%sE$vJithENjngGfyXD@MTC>xH9yXva-)f$Qy^@5kAtM$^c!()^Lop?~+-w^4Kyadc+X;YCKB8D~aE0U^13zf-q63CO(f|M}kMd!EloI`?+fy;Y}9 zojUuGUsFI!(&S$ui%d}<)6Q*8P+-oSv>pCH^RAwwukFS>B(CDq1qE>4ZROsrEEv`;&qWq*F-~tZDes zC;S3AVncmjaZQMa-xKj` z3?IN(9VcYGyz)qK!j5_6u|n3&zGo?Ho2RclURoc7aWlHls(iR<+a^F(3wR#^WHVUi zxL$4CCy5Hf@GfWKe*RipBk1H1)9m>@ zMM5a<(#V2BE)BZY_-#CBvR#g9W`F`edljWtInP*rfZCX-5#qH?QMSv7XGKHO!b4OD z$2o*&fGimpl9nqSUs*#1= zDq_rKZ;1t?keRG&4f3S zzqoDK(A){*N7nkr7n3?*^e}_VWKFabPZ?2Z5i>@NnWdnSG}Bc$qC`GCZ-(nvIs;dV zfVX7gCefMS*iXuDC{WOfLzv*hAzacI!dKl@AUwSXmz1^yVakX21AK(%fSoH51_>V# zl#dA2>_E`rvKJL<)DCqW9A#9ss#=sMf+JLW&`|0qb>SyEO9h)oJ9=ibgTch;#=;E0 zq|s%i+Z}bPIIN<&;zHa=|3zJ^x&=}6(2;VH6>0rlPyT?^l1XL0*uqK( ze^jsN2k2bp2o|A2(GYg})aGKu=Nw4SOV3My#^qp#)eI%*yFqtCrBATi^C~Vl+=7r* zncJ0D(3Pd{B1PeMR9gq|2DEXc;Betfa2(1OtUx4ICy{p-0Ab|;dAVJoysUz*P?lTY z71j|_p&jKpI5Y4Zf^?6qd4O0Yl`7swij|t1`FmYl$+n*$2E=NDgRk-W#=#4RXCA0n za&+Z_J&UW-YA2M8pZfX9{3$twvkC&E2lz4@XH<$$rVPApVCmF`tgPXox*s2U(ck^( zq^Fh-u9*AKxVqb?)|t}QU-#RiYW1(xYER){e`RaGSc01XKcubTStWR+4OFljiA6eC z5U#%$f;RDG=>tiWR<2+h*>;8kEg+a*O!AzVg!pt1w`m@bRt6YlE_t--p&#Vy_k?>MVq3-ztat_+{zPMBVs!J|a?>Z&#Q06BczIuKaI;0>Yb5-yBM5^^E ziPxN;c;)=mJ`^`NEWf(<`|f)6njdI_fTP+gZMk}W=aly#W2Fd2#?>gT6hwZ&bEK8E4 z=Yub6KG2AomEsE3M%8weq>AEeS>*YAlIJ@VFZINJ4!35cY*Jjc4I1hB5L&B(Xh(1^ z3PTyh0)8n>T>4}Ch7Egul;My3!;&SvP(T)CJ{F!izg+`7+S#c>^x|Rm+n`fGtP{-K zu157rg#B0~Q7c6$YfXK{OAqI`6^Pody(O(t<R3H?72?0qycQ&gE0gf)yv`sqA0FhA#4=314R|c0LzQ69?>C0C$AJD zAVI(=-`EIbDGfxa**|{Vx8eRhKX$JH+5;p{hwZJMwz7NB> zRR#8}f~RAGc5#KY5&J#pa06NQiL7TsznPGOOZ7=Y|GWHsSBA{&DhY)sKyXQ!-OZb4E7~PR_z-2Zt1P^ft{p zK28p)pffVgV-77$Ef%w=HODI0d(}8S;c*`0<2)8p8cP^1$6l_R`M(*l`doO#t>I62 z5J?=eOV!J{Jt$Lw?aQct`!^_B)c9={94x6LAptU1(xDalje1d^sQ?*yyg+9al@lG6 zNu8kt(oZI#C~gpKID`Y7#$Kg!Oup)xv5Bs%L=$jfR$vLJ36hGSDqJn$$}z#kK81j-W}kMLY#3rfXPiEj)_`1}!*l4c(clvf zgyQr;d`F`XM_KiZmUB40gXfowjg85Ow_4*fV)Cl2aT)Brn9MkTCuFEuV#kKp?&lSX_Hi51>c&P@RM1hDuJZiFId=KCC~Fo-g#y!%Jd*!7m` zoi*~dFy$BliHlC=624FLc+^Y#7|MLogrO3sPzZ~p8D?$hx6qpLE8JBw295frOhUj-zs5h#&t0lFKqeu7q1X=Dw9n@P< zTJD{YI*6}0R=m&UKdxg0D-+-naWRu}GV8_%0^{p4@1`US-ILU7swVVLNa#PIDllL` zpy$M_(yZd+;FTJWfg@<(<7fy*(>PEO-J%w?YMZjh`i{d&p8ubx6)Vbpr;}bq~|5sv1+~^_GpPLUE&jyd}JU^y<&Cf6|aqlh+-_5LlUzjGSg= zL5o{>c%_3m;vUuu=}emr;7p$MMK@oFFnCN3;o*=&ANMf!4Zc?(bgg~k;=CZ&=TVs# zCI<3GRHUR-jL3_8I#a!tifsCA@uqekR)3yUHY_J+XjxKH+0dMvVP#44EZ#I{b_KqL z9@cA-m(UErWp!!Z!weD;4Z^7_&7cIy+03jYXm$yk9G*=AbaA3qp9HXeGIZd8~?&XAIXgpwgSIfF|Q6H5l? zWEK@=W)~E6|3>qkH_(usH7F1t9~hLC-4O83_Gi(zS$-M8zep{H-Tq?KHa>RR@6Rf@ znZ&-q_D^P8J5y3z>X%q4pGzsoatb2RqNB`>DZ>3XI#xO!a7YelsSes*jSkQKsF3^0 zp(tx3h(pp%5UxJS>HZ>TVfXvQP<}$;TZ%^>;w|tL8$HD#+#eDg7DtjpO5#rn>giDc z#{Hoyp9WD19(Vu;so4L|Kq0nGgg8^4kW}83=O12~m{d7DKc~1jCpQpaQ{*3h`*wGc z=J{BEZAN;X-{bbzWu({mJyUYi((?1u(sJ2|mtN{#uHYy6_2924Wt!=)NL zyN2p0?o(LmFM|#tD$KiUR)m>bE#J zFjdKX?DzcV`47ZLN<@saC(DpSS&ojz+o>s>5Y0xS} zeE|Bk5~JiSFe+IPiw`Dl5|I}g%_queupE6`g110h8W_OMn_n@wonIb!S^Tx!b?{`@ zDq@N`Tdc@6ht(T^O%9<-fs~qE!Wk&AjG(dCj_2Sop&bCq+)n341|531%{T8g5FSV# zSD5N>q!z}-7tm)x_uteToT&wIaRu0l;ZJ!=n1>KMG!*0G5Q>yh=-GKF7St@c!|Wgs zL|$!%Y?{0u91ZUFyt>yPkte%Uv;B^ge6Kg(XSe(4GsPhf(^x$DK8M4X?+JhY33Fuo z<`?@*@vM` zZN&0}zy0j#FptfuG%g-*T0vu`D!>0ZsMfoM=iHhjEEQF{(b&tR%h*|1lt80AbX1#1=OGPyInafRtIMWb)7Q9WXg&+;av$Id{X=eU$rZ~nv46_D#Sd96#u6EcC?0^d;sZA_ZRE6T$lZ%Z@+M&d2J%73t)Xu^ zLih?=Jw6gw4EL4|2k0wmA>Tg(QwQh9r^Z{713q6(VSLq+1Gk+JV{(F7+5K{hvYq+q zvGM)KSB-r1mIiPg7cq{{xkffm$v$;VNCc>}1cxYg2zuB#vk!QhuNoF|`C(uRU+SSI zP{?|kuQf=XXyBT|y!yPlc#UDR^2D-iw>!HmF{v~=Ha5HTzsy73)~8Jp^?~rS_Sh#kohzT|MKR4Sgn zj1>LCBr_s(ofxZP{qEgE>IkPArmRO z_Q6i*wwYFJ#S_knQ4IDUWNQ-H9<1kn&L6lUHQNRDC0?Op7dz}C^d9M*(X9e3c-7q? znaalM6ob+9&3>daz*l7D@DS~!;=8}Vye-}>3G=)KKBv=H;0+&l>NS@xsx+4tI#Ub1 zk*~aP4ge)&9iZJWU~fn`KY|MNmM|hguwz6zri`dr01fXuBGxk^`l@$C_JCcAxG98j zke%>sNxa_cr-RoY84~t61H$<+Mn57+z}6rj zAz!J(MwKw1g$gT){oI+IZ3j#6ey0(I*#V@WK27?-sL|NdT47*g?RLPDVk7>2JA{$8&u!Ol#r6IVppy9y9a)&-E8F3ufp_WJ+q#^Yg#aobws8g{`5WZjNzQT z3bW50yl_Mo&3?vQNqr4`5Z=A~uvEA(R`evu;!HZm48Z^8V)eitS4Myxj=&|17R&UdBTGFEvr=l8%&bj1@|k*zvt*##TUVq$dG2b|kWR|k zqNiwR-mt~Neb!2#Ptoq@jc27f;#T%DogSOTi_#K!JGg~>e(K>M18dZ^(Yu<%n?&G>4khuF{=$z z1aJXw4)RYhNo9`Fe1=(Ve1c){D=WaRwE}6^x+yl~v<0u6-_B6?f37iUX{YGOtjfsn zXBT8RvN6BXQOf+TeH+;O{~NxzT*mpxvN)Vu`92C<1!sU5pzdeR>L*w}K8`9}gxnm` zTqSPiAXYGnH;ScJZ(^$vzN@bV*#AptzacuZet}F2YFAzRHYi1sFddb+zl3Kkm*8H; z`8on9hHNb01XS!#9So)_Kj|dG3G>@=9qT7rp~FGVB$NCnmbO-YlwBv?A^%4H&2;uM zdx>b!I6S$b?~|2hD$nOnmef~18Q02_(-!7lmE1qT_->KI-A5MO_yurTH+Iu zgtsM=Y9Mkn%ok?kdK|7B`1K9KYz%&*aF6t^)PXq}BARv`l22+O9}g$<7p3_Yz`?b4 zhyqF@b^_(ptaZO&Q0p*P)Su+Dg#yO%1*CB0#N^+_(wCSylkAwfn*SEPfBfTmS!SYG z@wdONk-uYhX};Vc?`vS2*+awRBl6)!_5j;R`*thF^@l6RrHn`!9Um8Qf}I^qR3Bw6 zSOJN(>=z}S+7KBR1_fmg%6Tg= zNfe}!OdN-*Mb!bY!~rr09thv#$#@A!%*Uj+x?6XNd(~@x-l>@goHz}hbB$&;o|Q_^ zB0KZl`ArHSm+BjjzeMyy2NlbGeLG^@*9?38NW|NL31d6zb+Zcv_exl61>UwYOOf>`8P z{F*RdL~+xZ(rj=k2{g`5wHb$>|AZntbO>M}V*QFa{wjV!3{)=|Sx_)?L3Q|3n%(Du z-=ybnU>n8HMAC(awJs6aFz*1gW3EQL46!J^0%Bf!h+fGhm0!H^D)~_S+?zKb1@fWS zo7X=jWk4QP;Kdt%5!aqQtR88vPJcoK zu#;bh*HWMe-clC|soPxQ&vKw}e&@q0 zcT`;cj{W-$QKN+uk-F%ufHNMSAQsv>i#M8&3`W5 zaowwI=U>^M*)q&4SAI>Jt|`U5R&Yw9!gU3|UdiV<4*Yk6`WYxqxrU}AN`-l@59-wF zkED?1BSKrQI5_<|r}sul{ZU8?37U^WTsTtXTo$fHE;Yz@_MLo$4U%U^)!z5>C$yGH zc!R0W8$@-~VYWM{Q>i}Egrtv1g?7aoG^&q6nh=vd3UOUpa#am|I zr^!Z*TQ*L9PioLaV}`5w43lte;@5Za-TfrqzY6b9SNy%(Q;;s=?x4e#?l!7zNyZNi z2Ep@@JCq)oE99x~Pypfhn>fgnDrJr&gYm-<+POU+h1?+_y?63xoWqUqJS#eRw-fgZ zeHCXbNse$j9Z@k(q)QJ-tA@OKET(kAK$s^c_H$%TcyR8J%5P4d`fH^;`@mr~ws3fH z+`X}d!}@*Kwr)z`zSH0SnCR@5cb^4?I*U2H(L0Czo^*9W3ayjXW>6;?J~SF>4x=!K z5Qk=X4sRm!EY4%#Y0!~mG<+CBJ3fa|d=4RE{gj-6GzUAC-{G!5G;VOo+((G!1Hb*! zbWF+TJIkjqk)|*SQy9N#?vVappFDN8zxtU2hrjNbf&8R01vdW21XtJDvqYbs#Ja5F z>#~kh;j_4YgJ0jx*J-C%j68W{8N7wlKEYy@Oo!R%pvQnfwsX4jje4Qdg!BsFII zNJhxNJQo%`)Tp8|Po$2hmq37)uBhl^9-v{ns#g%*prXC1Ba!o{G`r8P&PYouRZ9UW z&83!Jt(U)cZH$pmSF?b8Vj%OzZgewm14iC>>kIO3Hu{CdzuvO=Me^N#dFdm-c45CD zOC6X+_*}*@4A+zAg4QUtN@X;mWB^m2HyA`MAG-g$qJSS6;W6eDk;wCCYGY8J2fo4d z5FV;OhZ@ot!?n6F*JPNYO14>1MdMAFr*2@>;#4JN_mjv zo7iyK1#kZck?Uow;#GG{C}jtr=!}5}q*027N2BD=h*l*Ak3wZKL}-H=-Ih2m|B}Dx zRE#jNDYaCi&20k?srN_QFK8z!9;a|{gqNM7%v16>@T8lxNu2)tOCf)5(Wy{x_h{;W zC={)=UkKq5*fHdWiwe&?Ygbw%TMp_|gexWW%h%B6@6DalTde|ln4`rEl9FdKglxWrh5h?X8HV>_>G3ONpoK@3C4$n5{78T*IQ6qpw z^8x>}z~%U`oEeXdw8#WwaHs_#!QhO&Xq^~$%D|OS-Q*?;1;cSTj1nZRyoD821g#Sd zai>CP#c2(1MtB_2t)RdKl~PO3D5VTTh!FCL8z1{{Wl7DN_wHlkD;I2^F=Nl*@x}KH zzG?L{VrAW;$Ht6#rJZ^eSi;H4=2FNl{Tcy+#tS-E0T3+v`N+vji7Oj_yS~Z5cVcohS<6 zf4pr!n$p&^9STJn6MIRn?M1|hBbPrz#!(U%*8hvGK<17-`Ca*)M`$FE?2b!?SU8P-tpoc)rZrYmyc;%+LD>kv}|v&r}+uSPuRqefaR$54+O4mk=rVwv0=A*Ij(cOyC z{+nN8+hBF};@4q}jx6m4f#-}3MnfAVXjKL+evnM;Ff#>pW-$?dgCf<0Gk0j~V8S)E zYk+KEr?43*6jX7jr|k0v@ z+xZ*AxDH6o;`@81YO%2r_SN)^+-3gM|n{~5%&g&%}R#QNV1KYgqrQ@wQ;8cP)qa@`da|OZ&TN(t~8+Xkw9(e1HiTLA&l7Y89F>&X>nYD=t zH8Th895|~sDWPUoWB1awMY{2ie}3<;Pd_@^xOkCn!qz|C`^f*o->N!8>#`l=XFRoZ zxWU-6eEaz6Pc0j6I0Og+$KZoP5cKl3uf}x-u+1yXQ(&j(utPxL6CE)YfNp!x0m#M0 zJ8PnAyy6*?#lo~TjPQ@v9e7a9xi2tZJpi%twifYBsHZjOYbcwD;-%oT0tR4e5QTu> zB{;P3H>5K0o;{(hvkLd#a{Hc}m+dXPe#*Upr0DqD*2>yXkR*7JFYccF8Q_o34*IT`h$i6Mzt zKU@?&mEOnNE=C1Zm2z|K_>x%P@Y~0>Eg6v>TQ;^vZthyTsO7#F=B|G6_KF3o`MXBb>OKBF2Bm*?YdKYo`^F5Km9SK)3WzY8GJT}OC-NiS%Y;>pV0 zM&5QeDAYpUmM9e3Qk96y1Mq~|{4VW9-2E{81oA1u6O_Bk6JT&qt);dM4i?n5mAKPp zJeO*SB!HeTQD_|sY=Jv9vQ@|h@6sDG@MA@B@XnxJC`!5HY1O-o)>F0?V^ba#b_1Q} zSt7!$hZ1GeQ@qyYNx2l_U2N7gL{2gKIBwO3EJf) znYk#cEN*l4!mX3bXO9lrQ@2hX-aL46mCsbP=l1CjPA%wIx};>{z>K8oiIr88gURgc zWpCa)B(eXPvQN9u8=u={*l2K+jx7(}I%LfYOAj3?nReH3+lV#OO8QM(Pmn;4QeTW^h4qakKXAdTT`E z(xFxU9R*ZU+{^cGyax&etCOvq`~ZSp-Z2jhI(4;_{~V&uY5)n{BQWuo=kWe?f`$3Y zNFK5TM73a#CP*xj%Cc8jk6^z_Uvulzvqmf_+#9&=u{jeqOf8HLG-OuIYRv4eFIzsa za%N*z;=l#XZ3D=8GrnX*QOW3vM7C$jlZ$K9JaRz&NXtVv)RazLIk?~SrsAlm{!^C8 zU!`Ox51c!+d}>4H=G3aze1A(ta$5cL{&db$1qc=3W`c`nwQ|lMfu44MXJus}_IrD$ zx6p*`-yXCV2GuDg(HFcXQ?B+x2{H@il7|F8<|$H$!|N3VTpU;~G&iBH9(5=|8K#o9 zTqF@fr^p%4>thgqo@ytsVGEv>mRxi!*mM?pzNeE&gJ zbJh=gC_2IN&?k4-1m~<9^w?&d?iO|7w1;M0|H=cSP&`B1@i;TTy)dnQT7Tb=`U+4< z$^!Sb^aHYo@v4tUgdBFbBOZQ|NTL`IcK{$4g}VFllFp?zNzq#8DDpN0jYowA&ae_{ zoi0+s)l8|VAky266ZdefkeC>Rm1P7RdO{RDmkVkn~W*T}1p-Cht55bZMXCORrq4FYd zp{H~T^4j*I4`>j3wYnm!^^T!S)<1l6W3@3h!@X|gv?`Y^XW;Dh;}$%%ptNH8ZHM|z zZ7WP4JhwhLtvbn^-&iJnR6eJ=psgY~esfA%qCGh|HD+<+jf)pF1QyMoGAw(@UHhiZ z*}bN1M0CmId!~+9HKC|*^upG>k>kb{&{?_)P&^HaT%^>@>M#k}N7)Bp@{>_0%VkS* zyVGnC%mSv=pRxlRGgwB3Gl0O{sG#*__Xlp#9rv@dS&)nT7bWa20%11_{D2(!Q6&H> zK}0F@JY=w+TX~9DlPM$hr%-l)p5x{ZvWMJG6wPur7YTBxNJ9K09)&$epzMjrBY;No zDi9|{4Aqs{i7sq`F`i<i&s|<>ghrxct-vqjSW~n=yaN6!0!^B~IXx zVnlcE0{4%d^*rvGk?`IY7w+^{VaG@~i3*i}t{6%a)dQ4&+6NFa1H~ zjU>Iq19=Vf*$L+p6SLjt&26dY!(ME(Vi-6wTzr0- zEA#A$$gGA|X7~A!xlNsl%6+}31lN8j5`6Cw5EEmIQnJlOfk^V4ASzY$ZO<XlqI2&iHe~m0=Wr|4=Whwn1TWtdZpn zMHUaDetX}>*h>6B=Z@n4y@0#)54o5ZaA!j8(qS+uGd&~8o@^0VYHC(? zadBH!Y&ZMAi5ZBks`3=ggzNkMikUT>{V-WT7JB@CMmfsDKKhCbsQULjBzJAbv8pu zc2;#D+p*1GEO))co>oovSEWW94G$TjZN<}@x~@yf^%%sBMpsdD8GB{J1}dfw=o1HC zjK9*AnRa@#R-~(W{-8E3B`wv5jRF)&%kX5RH>Hk}E+)2GKSY62g_dz@MkE1TLAeD2 zWVqa}#PHvqR(n4L-BJ}O5bg8ey&a>@u?5}^B#qRpaYYSA>&(XJ)OEeduMu$JRr2lZB%)0bZ`p1ua!&wN=qVRW!y_C8)^D`fxBVQ0F<9 z-%@5er>kOF2?2-77ah%fW2D-1tmha7?qE3IDeUU$6P(W=6eMx*dnNcSDc^&%Y%OKc zV9>655<`hjJS%dzDi6z1cv{$B6l)%WR;bA-8?icZSaC?oVriWEzBM`)}K?G>xwUK%u)UL;DaTtQ?kcRc`&_xLUD0(MYj2x z2XN!8JDUgGFt#dMlNTJ8kvG1j+D5YXL{NM^a*Sw%2O(ucGjjRgstT-nnu60WgBke< z#z6y2Ju!k8812?uWAyqMs}!5&j!pL(V$R1lSzFSS!n8Q1izu-S6nskZSa59$`)~0g zzs&g%wH4AL6>3Q%Lh5!k$6=|THJOA(f{u^iXL0cAG^MHvPq8O3ez@N#e`ZK1Ej(UX zmu!4RrFlzjP0fyr$+W4|QMSsJj}2l+=YMqalbde(!$%*@-?T}-JGgdIz7bkUMOx-r zQyhX%!RK~eJaHY+Z-AdSI}NE?o#$suvu;#!mvU;8oQJ7EL-jpBvn^Vk#RK^lP1MO< zkpr7_0<r&iug>+=b-qk~gtv!6>(ACpQpXrcaNz6J%^cNcbG<_`LzT+A*-9Wrgq}J zll;}!tsQjhtAvHbC%=ojp?*a^-*2<&)3RT}zK7zDv&dd{=#ai3O)%$-fm58Ko0B`T4#|z|X2|B|W_2=>#`CBb#l*;|lbU!& zWmoo;po`}DIr{8i$!#l{ShwKenYs0AU%7F_-2-aYHP$U3pPy7dZO*j2S`vGh<;`)0 z{usS&_{x2AZ+!Lcx)}Gal*GJAcQ+4T++1$66tzz5WtM5~lx6)x>_De5PLUC!vFl=W zdY#i`a>7s&<1$Op#Bw-o7dXT5CN>>sI28I7-fw86Fda_G){{IP`|TGD2W-SVg11z9 zCTB^_#l&ao(Wzlkc{N1JGb>ml)-!U%m4YlDQ1lmz=Q zG7uY5txevGz$WFK<4eFXPH%0}dM^^5g%32^H4!{REOtq8zl;F5yRiH<0J;w(**Ru1 zR^Re$=%wdWv3p}x$Qo5vHe+y((Iow2{vYPA{o|IAufEi^?Koe|^UbD;f>#9{E=7&^r$GsqC}CJ|Js7D;HBPpcu?{_<(gi0f-uDH$(( zrS&P6A!IG@~*l;iT}#^l8~ocYeYd}mCo%Wkt;+?K3tzrZpXvt+vSE$&2> zHb$F+;JW;#r1(n~=6AU>HOAED7-+iGmyAjcHkgg!+wf*Jv(|Dhm`% zNt^Hsm4c!b{SRHzKSHEfUhOb3{D#zcRA{^69Y)k_!&^A3%U=VQmtF&eQVO?4a%}mj zChXjiePta(6zYkFD5H?Ol_KWm9gNDbdFZK*1BH5FC8 z`kK6PLq<`&K`s4Ct&R;emHuu0?Q*sFPxesn-J<5wW6PJbrQIzA+0oc#Y1n1S0*?hg zf{X%p!;aouiwwq7qbcmMv8&1SXc;zdK%ye)G;FhEZ3_}#B2QminqcvKDg)=!B9IU=MY8YV5R zh{#4qauIBmCs0jP&=CJX1aWuJP*hZc;@_^g)TTVBY&zmvA$y6PwpM+F-RFf9tgr(j z-8!aCc0l?d0Y?|^8Ao0BhvHgo)Oml1_YU*^ygShmCD}qhs5D}1w41nqL%csX_Ll}U zN*XD0hJ%mmx|#tsL#m37WtHW%-O`xZSe~lVyIuhQo0mlB)ri+P6K zyL$Pv+dG&R?$H0)x1eKLt*c~Q&496G?y_57xbtbIpFUl__*~=dV~f1yV=CeAOqNyR zNw|fkom*%=CCd*gut6Wl??O6-(D12JOPn-6{4VTHJ$D6?tNGodeV(A)rEKiV-9h}h z%H1b>?*1`+m+F_1U5ofvye)E9I>n#+)-UeT6O_9>Pe5CGn{qeuw#eMxi#!38l=9eQ zsVQ$nI6nt@8h@!|(ph@|IkS}9IUe}r_NK}bBN4=kZ!TrXk+M3TT-Ci>y+!^HGs&%j zczM2R16kazeDd4MlLsqLhL6FYfAM4a?!7IqthY`Q4eiAIa z4@R;~MUzh%RsMo>5vlBt9U1ASqqtCmdtBO?o6yUXFFq;iE~2PGs2D&0 z{tLp^&J3PtCGj8S=@vEXOkZj_#=L7C%#eqTCUG1~!Ic zkm08~9_z@2GvYfU)lYCnJjE^S$NhrVX@D96(Fi;wx`VC|JVY?%l!a@G!>8AoA+v+= zy6TdY!bEe`O*^lX8d4ftrj(^rB$W(GD5y>z@!0*h5tk}_j^y~CuzL6zq$p>uz{YmE zO>Qj@PT+0;?YK}P6IcucA4QTc?uQJC_&)=&PNwX}lE8KT#Qa2aqP<^LZL%lLrIT3w zsO=A|ED7Ww4~V@e!R~bVlHE0<<`2SrukgqM#=>tyWrVHX0&6|bXw)u1XTEd4(QGy% z`25YF#cGTb{^D{OEoV$Mv1g3rsKHHKimDYvDlGrlUBX{NXlJs(Mqgu$JrhD(98HQV zE77LN3Gd@xhl~UuINBGLu;!Du9a>sFc+Js8^8J#ndxt2b4!dRKTPGfQ3<|oLYe!6a zcuuL>ySZB^MtLPUV>#y0>u>U3JjtM5;htpQUc-~@+YrA=w3Eiw$CGTurB!P0R=~w5 zpH&Uv9y9KU4KRxB>~L!lC$Xi|;V?s!v%N#>Wk=!I?}BxCd(dL`u&-S;(Ss4T4>;)t zlUBM2-U$RL+9H%=1oEz;_^`Ry*CC~~QA4modm0dR;G;@LVm4H#L-qwL+)KGi*JdkC zwn|$0%cyvNZ5}(rYE9d_J=;y@xN%^2triE1zZU88e=N05$WU zmzDx%SNNkL7U3M$elg}~6}BlDD6#FG8jUsjD0>127h{hf6ixUsz!~YS4wYa%%5DLo z7};Z;X0rvy+-t#D11i4Q>>8b5R%tCYrW!+?woX+if)?@rh}$9W7I?OR=YgnPMB%XT ze<8V_?$7~eyGD0@o4to}v$#7_CdVOA%8n7q@j!=l`A*mvpZYmtw!ozx;35R&v1O{zjRtogELFQqqhmUSmp%(JK|g zx##VmNmE#q7X25E-(X1e7anHTLxOb1Umy34m$Jv0ZH?a8(}}fYiOS)Eq!m0z*bs#| zauEx+!Zyt`L-b!l%A*8&R?r?2{L-0_zup`74dqNd9m2DSf4kZg6?VL&Jpw~aBm_8; zq@Cm-vW4;kK4bpS1Ir$LG^gd}M){vCx@u-)rhCBb5hM4E8S?B+fBtm#!s027*@M@; zy!dz9-c3xuYe`X4Y5YUplGd`!VHG}4++#8BecR@3Nz?m>T~{-C^Sp96Q8IzN-~I*M z&?)%?4~QB>9)b4nL_JuI2Ag1K&;kRAhG}&*QGCfItU2^|F-7pC<~B{! zl})*>kGJJJ5SC9`Tr0~G0P%I!o}EK`i+s4<<@gEW!5(Hq}YpTOqq<+V&m zU{_-_oee21fQ4`5K#PnqlINR76p5pPSL^_h_M-Gohy0~3qyLcM%|%&x+R~8&vJ;$I zafxcxWqGZ9{*hsc`bVM~H~t<;G7Eo8b11}U`}!D?mt2nrD8B#ietVTP8>&(m@!QkE zZ?D&Fk7l7nj2)7KeSG$MhE6oD$7yf*rPT^dd#NbA_VE6R*du4uInefL`1NRvx5rlw zSV7|ppsPC^1D#^f>UGiDD039jC0R^KZnsevWir~Lv_{kv7S6isz^a;2VY=RIsnOTy zI9Y&K6b=y5=0h1AOId|ImJ?72Qxe;-5JXhL9Da&hI2&@;x%h+hq24DEg$VHDh0_SW zVPLlfd2j_tvQZS?+mgyWnFFgU;^p)cOq?t>ymL&xHDTb`MMHhVbGB)U`ul&=5mJ4cOPGiQL7=?HhO_5xgi6Lc7G#i019zbt5hyL!0i zZpZco9-~USQD393F=)S*>KGlC-N(7n2@#*1l|)1_eJyFfhO;Lc(CLU4*o$fWOho(w z1U%I+)Ap_}JCG-2i#(Kh)!s`h$SIX**eqpt;dpLVR?mqOTyWszehO|WvCc&QeDIc?v)C~Cwc$69$aFiz#*1fZbZtO0WKaNnc<$Sm0h3!mZZ+&?F!>@7 z%OXgU(WDWN8|rj5NbjedsbLipsht&9QIp0X9uM`jp;3a10F>+$d87O!x9$A4bCHuhWKr>DhlJqC0$c7lYVAZMq_Vl}9=$IW%7 z!L%&oK2QI37jaDmSOoZyX?r4{)5*XyGcGJ&PyJ0>zEa59^b55 z{YZCLn!<)J#4hQd_v8fnJX4C#~#U5b=~^ma~_;mjuZFh zit*LSvU8REHTlN(kq&4kd=Iq?F-NhDDcRTC!DzG56B&D0FrcyX12rrZnEQ;lMZ;;}J4j_G!a3(~(J-j>8OvS|iH560No%9cdU}*j-ghyP#z43Wnp=JyFBczAx z@xrY}YSxv`*feA0V}qK0GxotxHx3%Q<+FPyJl;6y(Q)q{*L6QA{(JW0q0$WBj-=!< z&;0cGv+~6~Es06H)3d+%`(~_3Tli$6+$>>jt)6Y^@Ve3tv)eiahX=Z~+k$qNU-;7L zbj8-V>at%o*C)NI#%!@UI1Qtje*eZN$9vq(ox+!)aBFk+t08l}I_cFAdhk8MyYQJ& zYJNq|<$5I_xQc+4tRa2PK5UOFr*+w=S$8zVCO55`I(1oNJnPuCOWbBm3HB?fPO}(& z!Q!IoRFnA6hd#T1;P~C=x9+~Yd(`MBzJ8#4r`p?na@w75uN~O1?yXfT-&)r&c>Nos zqn?b7bqssT3v2ocg__5)H-g4k=JBeT9zR~V;_V8?*nHj$kGD>3Kh9#UDJd3fo$ri= z(*>X%SW{SY1B9VPSZ2r}C=~)i#Kn*p>Xu?Z9*T6d_|AmTm0+Osh4GfcNg(ud_b}+J zDe#ZxPU=-|ZpW48pU#|Izq4XuRbpWNb9bd$ z^+p-`k6lnXdgGkRi)Y37=(J#=yiVFyHFiKE`|P#|&-)p9KC?5#^RjCE4o6KPmt0RY zM--a}5J@=J^ct=7E%ASBDA8wroP`bT8tGde&4F)-94kAJL`yJ+Bkt{fy;Gc^amjN? z0LD91m%G6Kc%cMZM9^-hijlj5I*&0v-sq9MTs07F^(K1H#p;AuFNa}@P$1kJE($kM|#1%NaU z@7VqN^xbzfHm!QHEiiRRUi`otNABPMgZMZ3m^7kr#zQk#?7iMEZWCkc7LCgqJJ{dd z08;%3W;7mp$1|W4$x1c8Lr~(ob(UlVRv+)Mq~KVw2hB}x=8pTy2`!LlaMprOSU@NK zYCxQoVlu>}$or7*9)$1$D?ljP$;;3lw33(MS0NEZgZCyfftVGoLH*Ydo}iEkB7I7X zBI3um8Y0@t?GVA|JFNgTLwM8XTztz8r1yj&(=@a+BoQu@e?=9sxpZG z-u&&~GJH?gG(C0Usb`q5cWh$PGwIo7p~q)|7h8b2p5^gBF`SPF+DQAj2fgCOUv@t10FK8g9IiTK$V-Dwob!&l^-O{$7gkQt(&2{KMs+Rg?K% z&J^zB*p&hgzuUlZm|1;iOpG1$_J;iiz21({#wUUvb+$b#<+$K@%?{%WqT}p3!*NfI z@3=0ai=ucM3-FCu-sDOaB%XxVOvEq`1>5nE-SJw8cl8*Khdebp-|-N-bMnUZ5lZ!R zPTVxmPx-j0N0MHN&1Ubz5DXB-b2IK4oqnKQzPMcPOb#@RY|hY@4hGPWt}_uUMsE73 zI3Hmg00x|5kSFLMb5oaO&+$-lvRMPZ%xrQ;9fwSXj-Ui^P(ZYNn1|?L8wQBvjNA(k zPU!>EK3mR^a%F;Y?XJl)?jDogv0uJ;ao4VkY&AcVX-d-XyZ=tJf9YLudiOSv^iPPQ zfGYx%0d9P{LQycoT?edAtJ991vMXrS*j@IsPIlUCMzD_+dL*J?G_43BA$qOM$mVj| z&xXvPBfX7@sPXN^?Wug|81z-7jpy|-Kp{3G@HqV(5+KLdk z(HeULK9>YhI`TN_4I>0}Ajv(5QgV*d-aShWEgb+2?oD!sxPi2{J9a&~g($DQBBH@% zYr^VVkP0EJ>A;rk^^{G8x9;m5`ZQqt>&UFF&rbW&<54GmYp!)%73&H&*@)KJllEl@ zt;~tvQmm`ve-P`+piL`HPLS+$ZYSqUD*wn0h;Kc*w14Y{WB6QFC99ejH)pB4m#MNw zEN&ULaCojxT&c@%y73yZuHEArm+ziFch8bKmA2-lEn}x|olmh5v_4bSKGZYdp3Fga zw8flcvN;U~mCfe%*bGiM$kmvl>)_jM=@3YHcIrD)o+%1bw?Fnc=S)yef~(Jry*&i# z(ix&Yv80~jod|Q_0_#jq;p_lgw=t_~ zl-egr+eBkxAfrnKo_ZtCCbY%h(%(lE9hpF-SGngGgc_jta?WQziLAwy!hF7iosgsv zMpRUk5l@jG1|g%r`hwFC8=HbWoWg;;krqThL?kkBUc`10S+bm_sLr4vR(&DFn^WFS zA*c)GjZCpn$U}rK!yAdSDPaaPD&qIc!ZmBd_Dz0vl2HWy>Zo=qjnAlQ%l9`88{Ba*y%B=MrV7A zTPy8%KR-LGa@rj%G<{n2vIC26cwz0(p^ts{o3~l)k?UMhIw(MQz#~ngGS@GDns9js zv}Q8A2Vx+D_=OueY?3m``m2Q@t@D6Qi^3E@>fZ$&K5c<5>BJ6-a!|*eG&bj)RGi6Z zTQ20$3>-p;t_tI~!)Z+Q5V!l?tsEvoad zw1GFZgS<)dzo*QQlAvsJ#bOs85Se<6Q9qDelX)x_o^W{L?v01WTIBCZxn zY4&9GM7c3hEvhw9!X>FmB(Gxlee=j?Vzv>^e<{T8(+NbAAU@Q|p4=z?K^on)Tl&Xl z!a3JvK~<0EMnV4M{sSFm4*>amN30h1o%NkAm&HI?CbTe0+z~We*dY-r!0lN z#ReF*cc(tCk4~?zD9ni0iy>+Bo*#BjkCW#y;j+Ls$JX8YB8xuKwVU?RV(ca02)Lzn zbdFq>K^^8`URL2=g4Z$FTArh0hCLTFL}9j3I*UnX)V_rDKx#~F4VWw|Cg>7PCY#;T z5^WIGDmd5bTB4eyChkf_ho7rlIc7)~bLzC^IMvGpktb6N?Kj&sI?|!3^dur5AYB0n z2dD>@1HUzUSm6#RP7qVJ-;$kZ$AEJi|{AsYYl!L;Qwa?+a0zhYm=!-ZI)0GUZXJ>n?MsN z8iL0|aLy9@3-&F(#rW~;_7?>J;aJoYb^CLOTUNmB{_l^9fS$a-=vmlw$v%W1Ah9O> zLNa3)Oc$!+Jsv~lu@wiZwccI9ulM-<`@RwveYsUGV+Z&Cqk9WBVAHBqaOuSicYyM~ zg&Bsm$n9F#N#Me$<50JVYNMe^*DXnEO%uFW!?7KZ5;*LUj)}_$WxOpbLIB2sB?2B$wu$cEu@DX@ zW-H1z(H#nZL+__Uf!3bR1?9a`hSb)zNBRfeh{y_F<5MGS;<&gC(&!%PBIxTHj*HM1 zskDGflu)M7Ara@1L6Wq{J#k6XB=O@&@zvzmr(+t`CA=M95aMwOg1@;qS*4X%?~_+c zyZNy+dNbZ$DNj|!6Xpw#;cZuYlHR4f@fx0_ZpD){Ht(cKug^E8_)fV*F&~Mq$lDEk z5qF{te^5qZK+6s+lVr$K5rlM5pgRedW+;caO{GmY@beKa0a>3tx>#aEh059OcnbWC~pWt7xSGXB(&qUnaD{T(7VOmFl;3>-MtW?cGcV zvGfnH5@082r{Lt}JH;B#U28Qf{&`VA4U@`d`k67awZ+_|;bas54I?KH(Sqgp=TL70 zLQvWu9MW)RvMM2IpaC!fxj*>!kNc7aEogcXTV>7OUCiFqzcmoUPIftH91!?b#@-!E zGUOU=_n}mmB3l!&`$(q@E!rm3olwa7wd_6;QaDB0(2x|&?Q8cLzvEl{bd3NYej`od z{~Q>@Fsw)$#$Z-Bd2aW)o7;WXaJ$bMZueOeba1;*^h5$aYcfPdsZJ3Q!B~iT^>P~# z%a65BQ$ckqgvKOBDy;!50#MHnY(K;J@J8!F(t5`C8+jok-p_|Pv1p7j8afe0!qp^$ zwspqGCql#B8MF$Cw(~-~BzY3gCpYQOd#(^Ql(g##eS?Sl`4DfJoOnKz+~m=pM-B%X z8JBM(LI%Z9M}-+>E@5zQQHq)(#iKNF&AOaPnVI9W>t+v3k?S)j`~Uc5@V4L1o%HOG z57=^6KDJd9<>%FsHG3etUKF=&9kr}EU1yM5L84$2!fYIvjfAr(O_32Or#x|eD&!0I zdebxX5Zj+a8i@3mpH#l6sHD`U=%12WP-U2tZSH2R2vJwqg`80_KZU~WlcIkLg?kV> zaD}QeJ5nd`GObt6Frv%H6a&(nJ#x{EP<;QSq>A{eX1`NDoLZeSdBf!Vl9>J2B{vz*$MGe@Mv4fB;RDI4Mkr9YRh;oWTweKN@rJzuVeeFkPb0yH zuT?;*Ppl6OE4V2Tm{Lv=CbGp{)UP7to74aNet!F?y{tUDIwuBmXjiM9IrZ#1I7qSW zkM4X5YxNcO##Yjuf`?5J))OUfPl7e+y`Wi0CTr5~Hzu>>WTOunN=;CABN>!V#k4|y z#SX2|GOhZQ@fX}Gk&)xaKR*2`v10mU;rCF(8GU3^(opG=n0Vy1Yb9kd<2I#Jkn(7@ zy&ge)##h;tpn?Hj7AqQLn3Qs&N+;YoxMg$wknL@EzOlM?;QBXLjD56z(65`G+iU24 zMywxn`;erhq^%xz{py#Ot$K59O^o}Al*A_=TaPv47A4F$7ID2iuhkJDncdxK6JqU0 z+1+rZakG06*X7I+-ri?_#V*?I&X^`=OZxk!*0}eTlqrf?iEGA5`gr4%VnTP>g||cD z=BD)bL#9@B-249zZEphD)N$vJYu?i>%epODmTXJ1E!(m!+wy(jXB%T<4jW?#r?I(@ z7j8m<5Fmsm1PBn05Rwv-ury6l0_F}hge`&6mL}P7v`tA%n;!Xfp(LB6Ik5PDW}akZ zLfYWhlfUhwh_Goz>cbwuplL`8tP0$_9=7Qmkt|? ze(XLtVQG_#9NDvnd!cDuR&|!mmR+40=$C2Xa3Y@-s($F-*MvX0EfbdRn-i`COc^!w zodX$Tw%)&Z+sG8WQ|dC#RM zj-=F7y)$W;X;|84dMQi{Ozo*gDQf+7hRQbJ

7HK!t-(wY(?xxfC%DL|jaJPYv~@ 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 P<4;pFPG0tWlgIrZ;zT|- literal 0 HcmV?d00001 diff --git a/lab16 with raylib/resources/consolab.ttf b/lab16 with raylib/resources/consolab.ttf new file mode 100644 index 0000000000000000000000000000000000000000..77f5d6052e1b02a147403f73f384c9a95e64f2e8 GIT binary patch literal 397896 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

2hha`|Y_oyjQ6mj%@Kn|`vv@B&$byc`C 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%0D_-)9!vC!U?-FQ`3H5dQE9W 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 +#include +#include +#include "raylib.h" +#include "raymath.h" +#include "resource_dir.h" +#include "windows_functions.h" + +#define RAYGUI_IMPLEMENTATION +//#define RAYGUI_PANEL_BORDER_WIDTH 2 +#define RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT 32 +#define RAYGUI_MESSAGEBOX_BUTTON_HEIGHT 36 +#include "raygui.h" + +#define RAYLIB_NUKLEAR_IMPLEMENTATION +#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT +#pragma warning(disable: 4116) +#include "raylib-nuklear.h" + +#define M 10 +#define N 15 +#define HEIGHT 50 +#define WIDTH 50 +#define VOFFSET 50 + +#define FWIDTH (float)WIDTH +#define FHEIGHT (float)HEIGHT + +#define PUREBLUE (Color) { 0, 0, 255, 255 } +#define BLACKGRAY (Color) {30, 30, 30, 255} +#define VSGRAY (Color) {78, 201, 176, 255} + +// Коды ячеек: +// 0 - свободна +// 1 - +// 2 - препятствие +// 3 - золото +int map[M][N] = { + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0}, + {0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 3, 3, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 3, 0, 0, 0}, + + {0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 0, 0, 2, 0}, + {0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0}, + {0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} +}; + +int player_x = 1; +int player_y = 1; +bool player_turn = true; + +int enemy_x = 14; +int enemy_y = 1; +int target_gold_x = 0; +int target_gold_y = 0; +int min_dist_to_gold = INT_MAX; +int enemy_gold = 0; + +typedef enum { empty = 0, wall = 2, gold = 3 } obj_enum; +// TODO: do something with "empty" object +#define INVENTORY_SIZE 4 +int inventory[INVENTORY_SIZE] = { 0, 0, 15, 0 }; +obj_enum selected_element = gold; + +typedef enum { left, right, up, down } enum_ways; +void movePlayer(enum_ways move) { + switch (move) { + case left: + if ((player_x > 0) and map[player_y][player_x - 1] != wall) player_x -= 1; + break; + case right: + if ((player_x < N - 1) and map[player_y][player_x + 1] != wall) player_x += 1; + break; + case up: + if ((player_y > 0) and map[player_y - 1][player_x] != wall) player_y -= 1; + break; + case down: + if ((player_y < M - 1) and map[player_y + 1][player_x] != wall) player_y += 1; + break; + } + if (map[player_y][player_x] == gold) { + map[player_y][player_x] = empty; + inventory[gold]++; + } +} + +void moveEnemy() { + int dx = target_gold_x - enemy_x; + int dy = target_gold_y - enemy_y; + enum_ways move = -1; + if (dx) { + if (dx > 0) { + move = right; + } + else if (dx < 0) { + move = left; + } + } + else { + if (dy > 0) { + move = down; + } + else if (dy < 0) { + move = up; + } + } + + switch (move) { + case left: + if ((enemy_x > 0) and map[enemy_y][enemy_x - 1] != wall) enemy_x -= 1; + break; + case right: + if ((enemy_x < N - 1) and map[enemy_y][enemy_x + 1] != wall) enemy_x += 1; + break; + case up: + if ((enemy_y > 0) and map[enemy_y - 1][enemy_x] != wall) enemy_y -= 1; + break; + case down: + if ((enemy_y < M - 1) and map[enemy_y + 1][enemy_x] != wall) enemy_y += 1; + break; + } + if (map[enemy_y][enemy_x] == gold) { + map[enemy_y][enemy_x] = empty; + enemy_gold++; + min_dist_to_gold = INT_MAX; + } +} + + +void putElement(enum_ways way, obj_enum element) { + if (element != empty && inventory[element] == 0) return; + + switch (way) { + case left: + if ((player_x > 0) and map[player_y][player_x - 1] == 0) { + map[player_y][player_x - 1] = element; + inventory[element]--; + } + break; + case right: + if ((player_x < N - 1) and map[player_y][player_x + 1] == 0) { + map[player_y][player_x + 1] = element; + inventory[element]--; + } + break; + case up: + if ((player_y > 0) and map[player_y - 1][player_x] == 0) { + map[player_y - 1][player_x] = element; + inventory[element]--; + } + break; + case down: + if ((player_y < M - 1) and map[player_y + 1][player_x] == 0) { + map[player_y + 1][player_x] = element; + inventory[element]--; + } + break; + } +} + +void deathbeam(enum_ways way) { + for (int i = player_x + 1; i < N; i++) { + if (map[player_y][i] != empty) inventory[map[player_y][i]] += 1; + map[player_y][i] = 0; + } +} + +void stomp(int r) { + for (int i = 0; i < M; i++) { + for (int j = 0; j < N; j++) { + if ((player_y - r <= i) && (i <= player_y + r) && (player_x - r <= j) && (j <= player_x + r) && map[i][j] == wall) { + inventory[wall] += 1; + map[i][j] = empty; + } + } + } +} + +void midasHand(int m, int n) { + if (map[m][n] == wall) { + map[m][n] = gold; + if (m > 0) midasHand(m - 1, n); + if (n > 0) midasHand(m, n - 1); + if (m < M - 1) midasHand(m + 1, n); + if (n < N - 1) midasHand(m, n + 1); + } +} + +void doMidashand() { + if ((player_y < M - 1) and map[player_y + 1][player_x] == wall) midasHand(player_y + 1, player_x); + if ((player_x < N - 1) and map[player_y][player_x + 1] == wall) midasHand(player_y, player_x + 1); + if ((player_y > 0) and map[player_y - 1][player_x] == wall) midasHand(player_y - 1, player_x); + if ((player_x > 0) and map[player_y][player_x - 1] == wall) midasHand(player_y, player_x - 1); +} + +bool netToggle = false; +void drawNet() { + for (int i = 0; i <= N * WIDTH; i += WIDTH) { + DrawLine(i, 0, i, M * HEIGHT, BLACK); + } + + for (int i = 0; i <= M * HEIGHT; i += HEIGHT) { + DrawLine(0, i, N * WIDTH, i, BLACK); + } +} + +void drawMap() { + // Коды ячеек: + // 0 - свободна + // 1 - + // 2 - препятствие + // 3 - золото + Color colors[4] = { LIGHTGRAY, PUREBLUE, BLACK, YELLOW }; + + for (int i = 0; i < M; i++) { + for (int j = 0; j < N; j++) { + int x1 = j * WIDTH; + int y1 = i * HEIGHT; + int dist = abs(j - enemy_x) + abs(i - enemy_y); + if (map[i][j] == gold and dist < min_dist_to_gold) { + min_dist_to_gold = dist; + target_gold_x = j; + target_gold_y = i; + } + DrawRectangle(x1, y1, WIDTH, HEIGHT, colors[map[i][j]]); + } + } + if (map[target_gold_y][target_gold_x] != gold) { + min_dist_to_gold = INT_MAX; + } + DrawRectangle(target_gold_x * WIDTH, target_gold_y * HEIGHT, WIDTH, HEIGHT, ORANGE); +} + +void drawPlayer() { + int x1 = player_x * WIDTH; + int y1 = player_y * HEIGHT;; + DrawRectangle(x1, y1, WIDTH, HEIGHT, PUREBLUE); +} + +void drawEnemy(Font font) { + int x1 = enemy_x * WIDTH; + int y1 = enemy_y * HEIGHT;; + DrawRectangle(x1, y1, WIDTH, HEIGHT, RED); + DrawTextEx(font, TextFormat("%d", enemy_gold), (Vector2) { (float)x1, (float)y1 }, 24, 0, BLACK); +} + +void drawBottomBar(Font font, float fontSize) { + DrawRectangle(0, HEIGHT * M, WIDTH * N, VOFFSET, BLACKGRAY); + + static char gold_string[50]; + static char wall_string[50]; + + static char help_string[] = "wasd - move player G - change item F5 - save\narrows - place item M - Midas hand F9 - load"; + + sprintf(gold_string, " gold = %d", inventory[gold]); + sprintf(wall_string, " wall = %d", inventory[wall]); + + if (selected_element == gold) gold_string[0] = '>'; + else if (selected_element == wall) wall_string[0] = '>'; + + Vector2 goldpos = { WIDTH / 4, HEIGHT * M }; + Vector2 wallpos = { WIDTH / 4, HEIGHT * M + fontSize }; + Vector2 helppos = { WIDTH * N - 550 , HEIGHT * M }; + + DrawTextEx(font, gold_string, goldpos, fontSize, 0, VSGRAY); + DrawTextEx(font, wall_string, wallpos, fontSize, 0, VSGRAY); + DrawTextEx(font, help_string, helppos, fontSize, 0, VSGRAY); +} + +void save() { + FILE* fout = fopen("savefile.txt", "w"); + if (fout == NULL) { + printf("save error"); + return; + } + + fprintf(fout, "%d %d\n", M, N); + for (int i = 0; i < M; i++) { + for (int j = 0; j < N; j++) { + fprintf(fout, "%d ", map[i][j]); + } + fprintf(fout, "\n"); + } + + for (int i = 0; i < INVENTORY_SIZE; i++) { + fprintf(fout, "%d ", inventory[i]); + } + fprintf(fout, "\n"); + + fprintf(fout, "%d %d %d\n", player_x, player_y, selected_element); + + fclose(fout); +} + +typedef enum { OK = 0, saveError, loadError1, loadError2 } ErrorCodes; +ErrorCodes errorCode = OK; +void load() { + FILE* fin = fopen("savefile.txt", "r"); + if (fin == NULL) { + printf("1) load error\n"); + /*MessageBoxA( + GetActiveWindow(), + "Файл не найден\nПопробуйте сначала сохранить игру", + "Ошибка загрузки", + MB_ICONERROR + );*/ + errorCode = loadError1; + return; + } + int m, n; + fscanf_s(fin, "%d%d", &m, &n); + if (m != M || n != N) { + printf("2) load error\n"); + /*MessageBoxW( + NULL, + L"Неправильный размер карты!\nПроверьте целостность сохранения", + L"Ошибка загрузки", + MB_ICONERROR + );*/ + errorCode = loadError2; + return; + } + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + fscanf_s(fin, "%d", &map[i][j]); + } + } + + for (int i = 0; i < INVENTORY_SIZE; i++) { + fscanf_s(fin, "%d", &inventory[i]); + } + + fscanf_s(fin, "%d%d%d", &player_x, &player_y, &selected_element); + + fclose(fin); +} + +bool editMap = 0; +void handleKeys() { + + /*if (IsKeyPressedRepeat(KEY_W)) movePlayer(up); + if (IsKeyPressedRepeat(KEY_S)) movePlayer(down); + if (IsKeyPressedRepeat(KEY_D)) movePlayer(right); + if (IsKeyPressedRepeat(KEY_A)) movePlayer(left);*/ + + int key; + while (key = GetKeyPressed()) { + if (not editMap) { + switch (key) + { + case KEY_W: + movePlayer(up); + break; + case KEY_S: + movePlayer(down); + break; + case KEY_D: + movePlayer(right); + break; + case KEY_A: + movePlayer(left); + break; + case KEY_ONE: + stomp(1); + break; + case KEY_TWO: + stomp(2); + break; + case KEY_Z: + deathbeam(right); + break; + case KEY_M: + doMidashand(); + break; + case KEY_LEFT: + putElement(left, selected_element); + break; + case KEY_RIGHT: + putElement(right, selected_element); + break; + case KEY_UP: + putElement(up, selected_element); + break; + case KEY_DOWN: + putElement(down, selected_element); + break; + } + } + + switch (key) + { + case KEY_F5: + save(); + break; + case KEY_F9: + load(); + break; + case KEY_SPACE: + netToggle = !netToggle; + break; + case KEY_ENTER: + editMap = !editMap; + break; + case KEY_G: + if (selected_element == gold) selected_element = wall; + else selected_element = gold; + break; + default: + player_turn = false; + } + } +} + +void drawRayguiErrorBoxes() { + const Rectangle errorBoxRect = { N * WIDTH / 2 - 200, M * HEIGHT / 2 - 75, 400, 150 }; + int btn = -1; + + switch (errorCode) + { + case OK: + break; + case saveError: + btn = GuiMessageBox(errorBoxRect, + u8"Ошибка сохранения", + u8"Невозможно создать файл", + u8"Ок;Выйти"); + break; + case loadError1: + btn = GuiMessageBox(errorBoxRect, + u8"Ошибка загрузки", + u8"Файл не найден\nПопробуйте сначала сохранить игру", + u8"Игнорировать;Выйти из игры"); + break; + case loadError2: + btn = GuiMessageBox(errorBoxRect, + u8"Ошибка загрузки", + u8"Неправильный размер карты!\nПроверьте целостность сохранения", + u8"Игнорировать;Выйти из игры"); + break; + } + + switch (btn) + { + case 0: + errorCode = OK; + break; + case 1: + errorCode = OK; + break; + case 2: + exit(0); + break; + } +} + +int nk_error_box(struct nk_context* ctx, const char* title, const char* error, const char* description) +{ + int result = -1; + if (nk_begin(ctx, title, + nk_rect(N * WIDTH / 2 - 200, M * HEIGHT / 2 - 72, 400, 144), + NK_WINDOW_TITLE | NK_WINDOW_BORDER | NK_WINDOW_NO_SCROLLBAR)) + { + nk_layout_row_dynamic(ctx, 24, 1); + nk_label(ctx, error, NK_TEXT_CENTERED); + nk_layout_row_dynamic(ctx, 24, 1); + nk_label(ctx, description, NK_TEXT_CENTERED); + nk_layout_row_dynamic(ctx, 36, 2); + if (nk_button_label(ctx, u8"Игнорировать")) { + result = 1; + } + if (nk_button_label(ctx, u8"Выйти из игры")) { + result = 2; + } + } + else { + result = 0; + } + return result; +} + +void callNKErrorBoxes(struct nk_context* ctx) { + int btn = -1; + + switch (errorCode) + { + case OK: + break; + case saveError: + btn = nk_error_box(ctx, + u8"Ошибка сохранения", + u8"Невозможно создать файл", + u8"Проверьте целостность сохранения"); + break; + case loadError1: + btn = nk_error_box(ctx, + u8"Ошибка загрузки", + u8"Файл не найден", + u8"Проверьте целостность сохранения"); + break; + case loadError2: + btn = nk_error_box(ctx, + u8"Ошибка загрузки", + u8"Неправильный размер карты!", + u8"Проверьте целостность сохранения"); + break; + } + + switch (btn) + { + case 0: + errorCode = OK; + break; + case 1: + errorCode = OK; + break; + case 2: + exit(0); + break; + } +} + +#define CPSIZE 213 +int main() +{ + SetConfigFlags(FLAG_WINDOW_HIGHDPI); + //SetConfigFlags(FLAG_MSAA_4X_HINT); + + InitWindow(N * WIDTH, M * HEIGHT + VOFFSET, "lab16 with raylib"); + + SetTargetFPS(60); + + SearchAndSetResourceDir("resources"); + + int codepoints[CPSIZE] = { 0 }; + for (int i = 0; i < 127 - 32; i++) codepoints[i] = 32 + i; // Basic ASCII characters + for (int i = 0; i < 118; i++) codepoints[95 + i] = 1024 + i; // Cyrillic characters + + //Font InconsolataRegular = LoadFontEx("Inconsolata-Regular.ttf", 24, NULL, 0); + //Font InconsolataSemiBold = LoadFontEx("Inconsolata-SemiBold.ttf", 48, codepoints, 512); + Font InconsolataBold = LoadFontEx("Inconsolata-LGC-Bold.ttf", 36, codepoints, CPSIZE); + SetTextureFilter(InconsolataBold.texture, TEXTURE_FILTER_BILINEAR); + //Font Arial = LoadFontEx("arial.ttf", 36, codepoints, CPSIZE); + //SetTextureFilter(Arial.texture, TEXTURE_FILTER_BILINEAR); + + GuiSetFont(InconsolataBold); + GuiSetStyle(DEFAULT, TEXT_SIZE, 24); + GuiSetStyle(DEFAULT, TEXT_SPACING, 0); + GuiSetStyle(DEFAULT, TEXT_LINE_SPACING, 24); + GuiSetStyle(STATUSBAR, BORDER_WIDTH, 2); + + // Create the Nuklear Context + struct nk_context* ctx = InitNuklearEx(InconsolataBold, 24); + + Vector2 mousePos = { 0 }; + int mouseCellX = 0; + int mouseCellY = 0; + + // game loop + while (!WindowShouldClose()) // run the loop untill the user presses ESCAPE or presses the Close button on the window + { + //------------------------------------------------------------------ + // Update game logic + //------------------------------------------------------------------ + if (errorCode == OK) + { + if (player_turn) { + handleKeys(); + } + else { + player_turn = true; + moveEnemy(); + } + + if (editMap) { + mousePos = GetMousePosition(); + mouseCellX = (int)(Clamp(mousePos.x, 0, FWIDTH * N - 1) / WIDTH); + mouseCellY = (int)(Clamp(mousePos.y, 0, FHEIGHT * M - 1) / HEIGHT); + + if (IsMouseButtonDown(MOUSE_BUTTON_LEFT) and not(mouseCellX == player_x and mouseCellY == player_y)) { + map[mouseCellY][mouseCellX] = selected_element; + } + else if (IsMouseButtonDown(MOUSE_BUTTON_RIGHT)) { + map[mouseCellY][mouseCellX] = empty; + } + + } + } + else { + //------------------------------------------------------------------ + // Update Nuklear context + //------------------------------------------------------------------ + UpdateNuklear(ctx); + + callNKErrorBoxes(ctx); + + nk_end(ctx); + } + + //------------------------------------------------------------------ + // Draw + //------------------------------------------------------------------ + BeginDrawing(); + // Setup the back buffer for drawing (clear color and depth buffers) + ClearBackground(WHITE); + + drawMap(); + drawPlayer(); + drawEnemy(InconsolataBold); + drawBottomBar(InconsolataBold, 24); + + const Rectangle RoundRect = { 100, 250, 185, 36 }; + //DrawRectangleRoundedLinesEx(RoundRect, 0.3f, 20, 1, BLACK); + + if (editMap) { + Rectangle rec = { + mouseCellX * FWIDTH, + mouseCellY * FHEIGHT, + FWIDTH, FHEIGHT + }; + + Color color = { 0, 0, 0, 255 }; + if (mouseCellX == player_x and mouseCellY == player_y) { + color.r = 255; + } + else { + color.g = 255; + } + + DrawRectangleLinesEx(rec, 2, color); + } + + if (netToggle) { + drawNet(); + } + + if (errorCode > OK) { + // Render the Nuklear GUI + DrawNuklear(ctx); + + //drawRayguiErrorBoxes(); + } + + //DrawTextEx(InconsolataBold, u8"Файл не найден\nПопробуйте сначала сохранить игру", (Vector2) { 100, 100 }, 24, 0, BLACK); + + // show mouse position + //DrawText(TextFormat("%.1f %.1f", mousePos.x, mousePos.y), 5, M * HEIGHT - 30, 30, ORANGE); + + // show FPS and frametime + //DrawText(TextFormat("%2d FPS", GetFPS()), 0, 0, 34, ORANGE); + //DrawText(TextFormat("%4f ms", GetFrameTime()), 0, 34, 34, BEIGE); + + // end the frame and get ready for the next one (display frame, poll input, etc...) + EndDrawing(); + } + + //UnloadFont(InconsolataRegular); + UnloadFont(InconsolataBold); + //UnloadFont(Arial); + //UnloadFont(InconsolataBold); + + // De-initialize the Nuklear GUI + UnloadNuklear(ctx); + + // destroy the window and cleanup the OpenGL context + CloseWindow(); + return 0; +} \ No newline at end of file diff --git a/lab16 with raylib/src/main.c b/lab16 with raylib/src/main.c index 48daa98..920777c 100644 --- a/lab16 with raylib/src/main.c +++ b/lab16 with raylib/src/main.c @@ -6,6 +6,7 @@ #include "raymath.h" #include "resource_dir.h" #include "windows_functions.h" +#include "tinyfiledialogs.h" #define RAYGUI_IMPLEMENTATION //#define RAYGUI_PANEL_BORDER_WIDTH 2 @@ -15,6 +16,7 @@ #define RAYLIB_NUKLEAR_IMPLEMENTATION #define NK_INCLUDE_VERTEX_BUFFER_OUTPUT +//#define RAYLIB_NUKLEAR_DEFAULT_ARC_SEGMENTS 1 #pragma warning(disable: 4116) #include "raylib-nuklear.h" @@ -29,7 +31,7 @@ #define PUREBLUE (Color) { 0, 0, 255, 255 } #define BLACKGRAY (Color) {30, 30, 30, 255} -#define VSGRAY (Color) {78, 201, 176, 255} +#define VSGREEN (Color) {78, 201, 176, 255} // Коды ячеек: // 0 - свободна @@ -199,9 +201,9 @@ void drawBottomBar(Font font, float fontSize) { Vector2 wallpos = { WIDTH / 4, HEIGHT * M + fontSize }; Vector2 helppos = { WIDTH * N - 550 , HEIGHT * M }; - DrawTextEx(font, gold_string, goldpos, fontSize, 0, VSGRAY); - DrawTextEx(font, wall_string, wallpos, fontSize, 0, VSGRAY); - DrawTextEx(font, help_string, helppos, fontSize, 0, VSGRAY); + DrawTextEx(font, gold_string, goldpos, fontSize, 0, VSGREEN); + DrawTextEx(font, wall_string, wallpos, fontSize, 0, VSGREEN); + DrawTextEx(font, help_string, helppos, fontSize, 0, VSGREEN); } void save() { @@ -241,6 +243,11 @@ void load() { "Ошибка загрузки", MB_ICONERROR );*/ + tinyfd_messageBox( + u8"Ошибка сохранения", + u8"Невозможно создать файл\nПроверьте целостность сохранения", + u8"ok", + "error", 1); errorCode = loadError1; return; } @@ -430,12 +437,12 @@ void callNKErrorBoxes(struct nk_context* ctx) { btn = nk_error_box(ctx, u8"Ошибка загрузки", u8"Файл не найден", - u8"Проверьте целостность сохранения"); + u8"Попробуйте сначала сохранить игру"); break; case loadError2: btn = nk_error_box(ctx, u8"Ошибка загрузки", - u8"Неправильный размер карты!", + u8"Неправильный размер карты", u8"Проверьте целостность сохранения"); break; } @@ -457,12 +464,12 @@ void callNKErrorBoxes(struct nk_context* ctx) { #define CPSIZE 213 int main() { - SetConfigFlags(FLAG_WINDOW_HIGHDPI); + //SetConfigFlags(FLAG_WINDOW_HIGHDPI); //SetConfigFlags(FLAG_MSAA_4X_HINT); InitWindow(N * WIDTH, M * HEIGHT + VOFFSET, "lab16 with raylib"); - SetTargetFPS(20); + SetTargetFPS(60); SearchAndSetResourceDir("resources"); @@ -474,6 +481,8 @@ int main() //Font InconsolataSemiBold = LoadFontEx("Inconsolata-SemiBold.ttf", 48, codepoints, 512); Font InconsolataBold = LoadFontEx("Inconsolata-LGC-Bold.ttf", 36, codepoints, CPSIZE); SetTextureFilter(InconsolataBold.texture, TEXTURE_FILTER_BILINEAR); + Font Consolas = LoadFontEx("consola.ttf", 24, codepoints, CPSIZE); + SetTextureFilter(Consolas.texture, TEXTURE_FILTER_BILINEAR); //Font Arial = LoadFontEx("arial.ttf", 36, codepoints, CPSIZE); //SetTextureFilter(Arial.texture, TEXTURE_FILTER_BILINEAR); @@ -518,11 +527,11 @@ int main() //------------------------------------------------------------------ // Update Nuklear context //------------------------------------------------------------------ - UpdateNuklear(ctx); + /*UpdateNuklear(ctx); callNKErrorBoxes(ctx); - nk_end(ctx); + nk_end(ctx);*/ } //------------------------------------------------------------------ @@ -534,10 +543,7 @@ int main() drawMap(); drawPlayer(); - drawBottomBar(InconsolataBold, 24); - - const Rectangle RoundRect = { 100, 250, 185, 36 }; - DrawRectangleRoundedLinesEx(RoundRect, 0.3f, 20, 1, BLACK); + drawBottomBar(Consolas, 24); if (editMap) { Rectangle rec = { @@ -563,12 +569,12 @@ int main() if (errorCode > OK) { // Render the Nuklear GUI - DrawNuklear(ctx); + //DrawNuklear(ctx); //drawRayguiErrorBoxes(); } - //DrawTextEx(InconsolataBold, u8"Файл не найден\nПопробуйте сначала сохранить игру", (Vector2) { 100, 100 }, 24, 0, BLACK); + DrawTextEx(Consolas, u8"Файл не найден\nПопробуйте сначала сохранить игру", (Vector2) { 100, 100 }, 24, 0, BLACK); // show mouse position //DrawText(TextFormat("%.1f %.1f", mousePos.x, mousePos.y), 5, M * HEIGHT - 30, 30, ORANGE); diff --git a/lab16 with raylib/src/tinyfiledialogs.c b/lab16 with raylib/src/tinyfiledialogs.c new file mode 100644 index 0000000..5614241 --- /dev/null +++ b/lab16 with raylib/src/tinyfiledialogs.c @@ -0,0 +1,8171 @@ +/* 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 | + |________________________________________________________________| + +********* TINY FILE DIALOGS OFFICIAL WEBSITE IS ON SOURCEFORGE ********* + _________ + / \ tinyfiledialogs.c v3.18.2 [Jun 8, 2024] zlib licence + |tiny file| Unique code file created [November 9, 2014] + | dialogs | + \____ ___/ http://tinyfiledialogs.sourceforge.net + \| 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 | + |_________________________________________________________________________________| + _________________________________________________________ + | | + | on windows: - since v3.6 char is UTF-8 by default | + | - if you want MBCS set tinyfd_winUtf8 to 0 | + | - functions like fopen expect MBCS | + |_________________________________________________________| + +If you like tinyfiledialogs, please upvote my stackoverflow answer +https://stackoverflow.com/a/47651444 + +- License - +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: +1. The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + + __________________________________________ + | ______________________________________ | + | | | | + | | DO NOT USE USER INPUT IN THE DIALOGS | | + | |______________________________________| | + |__________________________________________| +*/ + + +#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 + +#include +#include +#include +#include +#include + +#ifdef _WIN32 + #ifdef __BORLANDC__ + #define _getch getch + #endif + #ifndef _WIN32_WINNT + #define _WIN32_WINNT 0x0500 + #endif + #include + #include + #include + #include + #include + #define TINYFD_NOCCSUNICODE + #define TINYFD_SLASH "\\" +#else + #include + #include + #include /* on old systems try instead */ + #include + #include + #include /* on old systems try instead */ + #define TINYFD_SLASH "/" +#endif /* _WIN32 */ + +#include "tinyfiledialogs.h" + +#define MAX_PATH_OR_CMD 1024 /* _MAX_PATH or MAX_PATH */ + +#ifndef MAX_MULTIPLE_FILES +#define MAX_MULTIPLE_FILES 1024 +#endif +#define LOW_MULTIPLE_FILES 32 + +char tinyfd_version[8] = "3.18.2"; + +/******************************************************************************************************/ +/**************************************** UTF-8 on Windows ********************************************/ +/******************************************************************************************************/ +#ifdef _WIN32 +/* if you want to use UTF-8 ( instead of the UTF-16/wchar_t functions at the end of tinyfiledialogs.h ) +Make sure your code is really prepared for UTF-8 (on windows, functions like fopen() expect MBCS and not UTF-8) */ +int tinyfd_winUtf8 = 1; /* on windows char strings can be 1:UTF-8(default) or 0:MBCS */ +/* for MBCS change this to 0, here or in your code */ +#endif +/******************************************************************************************************/ +/******************************************************************************************************/ +/******************************************************************************************************/ + +int tinyfd_verbose = 0 ; /* on unix: prints the command line calls */ +int tinyfd_silent = 1 ; /* 1 (default) or 0 : on unix, hide errors and warnings from called dialogs */ + +/* Curses dialogs are difficult to use, on windows they are only ascii and uses the unix backslah */ +int tinyfd_allowCursesDialogs = 0 ; /* 0 (default) or 1 */ +int tinyfd_forceConsole = 0 ; /* 0 (default) or 1 */ +/* for unix & windows: 0 (graphic mode) or 1 (console mode). +0: try to use a graphic solution, if it fails then it uses console mode. +1: forces all dialogs into console mode even when the X server is present. + it can use the package dialog or dialog.exe. + on windows it only make sense for console applications */ + +int tinyfd_assumeGraphicDisplay = 0; /* 0 (default) or 1 */ +/* some systems don't set the environment variable DISPLAY even when a graphic display is present. +set this to 1 to tell tinyfiledialogs to assume the existence of a graphic display */ + + +char tinyfd_response[1024]; +/* if you pass "tinyfd_query" as aTitle, +the functions will not display the dialogs +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 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 */ + +static int gWarningDisplayed = 0 ; +static char gTitle[]="missing software! (we will try basic console input)"; + +#ifdef _WIN32 +char tinyfd_needs[] = "\ + ___________\n\ +/ \\ \n\ +| tiny file |\n\ +| dialogs |\n\ +\\_____ ____/\n\ + \\|\ +\ntiny file dialogs on Windows needs:\ +\n a graphic display\ +\nor dialog.exe (curses console mode ** Disabled by default **)\ +\nor a console for basic input"; +#else +char tinyfd_needs[] = "\ + ___________\n\ +/ \\ \n\ +| tiny file |\n\ +| dialogs |\n\ +\\_____ ____/\n\ + \\|\ +\ntiny file dialogs on UNIX needs:\ +\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) ** Disabled by default **\ +\nor xterm + bash (opens console for basic input)\ +\nor existing console for basic input."; + +#endif + +#ifdef _MSC_VER +#pragma warning(disable:4996) /* allows usage of strncpy, strcpy, strcat, sprintf, fopen */ +#pragma warning(disable:4100) /* allows usage of strncpy, strcpy, strcat, sprintf, fopen */ +#pragma warning(disable:4706) /* allows usage of strncpy, strcpy, strcat, sprintf, fopen */ +#endif + +static int getenvDISPLAY(void) +{ + return tinyfd_assumeGraphicDisplay || getenv("DISPLAY"); +} + + +static char * getCurDir(void) +{ + 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 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) +{ + /* 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 , TINYFD_SLASH , 1 ) ) + { + strcat( lastcar , TINYFD_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); +/* printf("%d %d %d\n", aoResultRGB[0], aoResultRGB[1], aoResultRGB[2]); */ + } + 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 (defined(__cplusplus ) && __cplusplus >= 201103L) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__clang__) + sprintf(aoResultHexRGB, "#%02hhx%02hhx%02hhx", aRGB[0], aRGB[1], aRGB[2]); +#else + 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; + } + } +} + + +void tfd_replaceSubStr( char const * aSource, char const * aOldSubStr, + char const * aNewSubStr, char * aoDestination ) +{ + 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 ) ; +} + + +static int filenameValid( char const * aFileNameWithoutPath ) +{ + 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 ; +} + +#endif + + +static void wipefile(char const * aFilename) +{ + 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); + } + } +} + + +int tfd_quoteDetected(char const * aString) +{ + char const * p; + + if (!aString) return 0; + + p = aString; + if ( strchr(p, '\'')) + { + return 1; + } + + 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 ; +} + + +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 ; +#ifdef _WIN32 + else if ( !strcmp(aIntVariableName, "tinyfd_winUtf8") ) return tinyfd_winUtf8 ; +#endif + 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; } +#ifdef _WIN32 + else if (!strcmp(aIntVariableName, "tinyfd_winUtf8")) { tinyfd_winUtf8 = aValue; return tinyfd_winUtf8; } +#endif + 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"; + + 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 }; + + 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; +} + + +static void replaceChr(char * aString, char aOldChr, char aNewChr) +{ + char * p; + + if (!aString) return; + if (aOldChr == aNewChr) return; + + p = aString; + while ((p = strchr(p, aOldChr))) + { + *p = aNewChr; + p++; + } + return; +} + + +#if !defined(WC_ERR_INVALID_CHARS) +/* undefined prior to Vista, so not yet in MINGW header file */ +#define WC_ERR_INVALID_CHARS 0x00000000 /* 0x00000080 for MINGW maybe ? */ +#endif + +static int sizeUtf16From8(char const * aUtf8string) +{ + 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); +} + + +static int sizeUtf8(wchar_t const * aUtf16string) +{ + 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; +} + + +wchar_t* tinyfd_mbcsTo16(char const* aMbcsString) +{ + 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; +} + + +wchar_t * tinyfd_utf8to16(char const * aUtf8string) +{ + 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); + } +} + + +char * tinyfd_utf16toMbcs(wchar_t const * aUtf16string) +{ + 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; +} + + +char * tinyfd_utf8toMbcs(char const * aUtf8string) +{ + 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; + + 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); +} + + +void tinyfd_beep(void) +{ + 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)) || defined(__BORLANDC__) || defined(__WATCOMC__) + struct _stat st; + if (_wstat(aFilename, &st) == 0) +#else + 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); + } + } +} + + +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 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) +{ + /* 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; + } + } +} + + +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"; +#else + wchar_t const * const lPrintFormat = L"#%02hx%02hx%02hx"; +#endif + + 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]); +#else + swprintf(aoResultHexRGB, lPrintFormat, aRGB[0], aRGB[1], aRGB[2]); +#endif + + } + 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)) || defined(__BORLANDC__) || defined(__WATCOMC__) + struct _stat lInfo; +#else + struct __stat64 lInfo; +#endif + 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 (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); +#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)) || defined(__BORLANDC__) || defined(__WATCOMC__) + else if (_stat(aDirPath, &lInfo) != 0) +#else + else if (_stat64(aDirPath, &lInfo) != 0) +#endif + 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)) || defined(__BORLANDC__) || defined(__WATCOMC__) + struct _stat lInfo; +#else + struct __stat64 lInfo; +#endif + wchar_t * lTmpWChar; + int lStatRet; + FILE * lIn; + + if (!aFilePathAndName || !strlen(aFilePathAndName)) + { + return 0; + } + + 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); +#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; + } +} + +static void replaceWchar(wchar_t * aString, + wchar_t aOldChr, + wchar_t aNewChr) +{ + wchar_t * p; + + if (!aString) + { + return ; + } + + if (aOldChr == aNewChr) + { + return ; + } + + p = aString; + while ((p = wcsrchr(p, aOldChr))) + { + *p = aNewChr; +#ifdef TINYFD_NOCCSUNICODE + p++; +#endif + p++; + } + return ; +} + + +static int quoteDetectedW(wchar_t const * aString) +{ + wchar_t const * p; + + if (!aString) return 0; + + p = aString; + while ((p = wcsrchr(p, L'\''))) + { + return 1; + } + + p = aString; + while ((p = wcsrchr(p, L'\"'))) + { + return 1; + } + + return 0; +} + +#endif /* _WIN32 */ + +/* source and destination can be the same or ovelap*/ +static char * ensureFilesExist(char * aDestination, + char const * aSourcePathsAndNames) +{ + char * lDestination = aDestination; + char const * p; + char const * p2; + size_t lLen; + + 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; +} + +#ifdef _WIN32 + +static int __stdcall EnumThreadWndProc(HWND hwnd, LPARAM lParam) +{ + 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; + + if (!aString || !wcslen(aString) ) return; + + 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(); */ + } + + 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 */ +{ + int lBoxReturnValue; + UINT aCode; + + 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 (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 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; + + 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; + } +} + + +/* int tinyfd_notifyPopupW_ORIGINAL( + wchar_t const * aTitle, + wchar_t const * aMessage, + wchar_t const * aIconType) +{ + 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 (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; + + wcscpy(lDialogString, L"powershell.exe -executionpolicy bypass -command \"\ +function Show-BalloonTip {\ +[cmdletbinding()] \ +param( \ +[string]$Title = ' ', \ +[string]$Message = ' ', \ +[ValidateSet('info', 'warning', 'error')] \ +[string]$IconType = 'info');\ +[system.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') | Out-Null ; \ +$balloon = New-Object System.Windows.Forms.NotifyIcon ; \ +$path = Get-Process -id $pid | Select-Object -ExpandProperty Path ; \ +$icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path) ;"); + + wcscat(lDialogString, L"\ +$balloon.Icon = $icon ; \ +$balloon.BalloonTipIcon = $IconType ; \ +$balloon.BalloonTipText = $Message ; \ +$balloon.BalloonTipTitle = $Title ; \ +$balloon.Text = 'tinyfiledialogs' ; \ +$balloon.Visible = $true ; \ +$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"\""); + + hiddenConsoleW(lDialogString, aTitle, 0); + free(lDialogString); + return 1; +}*/ + + +/* 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* lDialogString; + size_t lTitleLen; + size_t lMessageLen; + size_t lDialogStringLen; + + FILE* lIn; + + 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(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; + + swprintf(lDialogString, +#if !defined(__BORLANDC__) && !defined(__TINYC__) && !(defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) + lDialogStringLen, +#endif + L"%ls\\tinyfd.hta", _wgetenv(L"TEMP")); + + lIn = _wfopen(lDialogString, L"w"); + if (!lIn) + { + free(lDialogString); + return 0; + } + + wcscpy(lDialogString, L"\n\ +\n\ +\n\ +"); + if ( aTitle && wcslen(aTitle) ) wcscat(lDialogString, aTitle); + wcscat(lDialogString, L"\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +
\n"); + + wcscat(lDialogString, aMessage ? aMessage : L""); + + wcscat(lDialogString, L"\n\ +\n\ +\n\ +"); + + fputws(lDialogString, lIn); + fclose(lIn); + + 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 ) ; */ + wcscpy(lDialogString, + L"cmd.exe /c mshta.exe \"%TEMP%\\tinyfd.hta\""); + + 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 */ +{ + 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 (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: 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); + + if (aDefaultInput) + { + swprintf(lDialogString, +#if !defined(__BORLANDC__) && !defined(__TINYC__) && !(defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) + lDialogStringLen, +#endif + L"%ls\\tinyfd.vbs", _wgetenv(L"TEMP")); + } + else + { + swprintf(lDialogString, +#if !defined(__BORLANDC__) && !defined(__TINYC__) && !(defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) + lDialogStringLen, +#endif + 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"\",\""); + 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\ +\n\ +\n\ +"); + if (aTitle) wcscat(lDialogString, aTitle); + wcscat(lDialogString, L"\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +
\n"); + + wcscat(lDialogString, aMessage ? aMessage : L""); + + wcscat(lDialogString, L"\n\ +\n\ +\n\ +\n\ +
\n\ +

\n\ +\n\ +
\n\ +
\n"); + + wcscat(lDialogString, L"\n\ +\n\ +\n\ +\n\ +
\n\ +
\n\ +
\n\ +\n\ +\n\ +" ) ; + } + fputws(lDialogString, lIn); + fclose(lIn); + + if (aDefaultInput) + { + swprintf(lDialogString, +#if !defined(__BORLANDC__) && !defined(__TINYC__) && !(defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) + lDialogStringLen, +#endif + L"%ls\\tinyfd.txt",_wgetenv(L"TEMP")); + +#ifdef TINYFD_NOCCSUNICODE + lFile = _wfopen(lDialogString, L"w"); + fputc(0xFF, lFile); + fputc(0xFE, lFile); +#else + lFile = _wfopen(lDialogString, L"wt, ccs=UNICODE"); /*or ccs=UTF-16LE*/ +#endif + 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\""); + } + + /* wprintf ( "lDialogString: %ls\n" , lDialogString ) ; */ + + hiddenConsoleW(lDialogString, aTitle, 1); + + swprintf(lDialogString, +#if !defined(__BORLANDC__) && !defined(__TINYC__) && !(defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) + lDialogStringLen, +#endif + L"%ls\\tinyfd.txt", _wgetenv(L"TEMP")); + /* wprintf(L"lDialogString: %ls\n", lDialogString); */ +#ifdef TINYFD_NOCCSUNICODE + if (!(lIn = _wfopen(lDialogString, L"r"))) +#else + if (!(lIn = _wfopen(lDialogString, L"rt, ccs=UNICODE"))) /*or ccs=UTF-16LE*/ +#endif + { + _wremove(lDialogString); + free(lDialogString); + return NULL; + } + + memset(lBuff, 0, MAX_PATH_OR_CMD * sizeof(wchar_t) ); + +#ifdef TINYFD_NOCCSUNICODE + fgets((char *)lBuff, 2*MAX_PATH_OR_CMD, lIn); +#else + fgetws(lBuff, MAX_PATH_OR_CMD, lIn); +#endif + fclose(lIn); + wipefileW(lDialogString); + _wremove(lDialogString); + + if (aDefaultInput) + { + swprintf(lDialogString, +#if !defined(__BORLANDC__) && !defined(__TINYC__) && !(defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) + lDialogStringLen, +#endif + L"%ls\\tinyfd.vbs", _wgetenv(L"TEMP")); + } + else + { + swprintf(lDialogString, +#if !defined(__BORLANDC__) && !defined(__TINYC__) && !(defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) + lDialogStringLen, +#endif + 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); +#else + lResult = !wcsncmp(lBuff, L"1", 1); +#endif + + /* printf( "lResult: %d \n" , lResult ) ; */ + if (!lResult) + { + return NULL ; + } + + /* 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; +#else + 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 * 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}; + + 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", 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: use the GRAVE ACCENT \\x60 instead.", aDefaultPathAndOrFile, 0, NULL, NULL); + }*/ + + lHResult = CoInitializeEx(NULL, 0); + + getPathWithoutFinalSlashW(lDirname, aDefaultPathAndOrFile); + getLastNameW(lBuff, aDefaultPathAndOrFile); + + 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++; + } + } + + 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; + + if (GetSaveFileNameW(&ofn) == 0) + { + lRetval = NULL; + } + else + { + lRetval = lBuff; + } + + if (lHResult == S_OK || lHResult == S_FALSE) + { + CoUninitialize(); + } + return lRetval; +} + + +wchar_t * tinyfd_openFileDialogW( + 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 */ +{ + 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 }; + static wchar_t * lBuff = NULL; + + free(lBuff); + lBuff = NULL; + if (aAllowMultipleSelects < 0) return (wchar_t *)0; + + 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", 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: 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)); + } + } + else + { + lFullBuffLen = MAX_PATH_OR_CMD + 1; + lBuff = (wchar_t*) malloc(lFullBuffLen * sizeof(wchar_t)); + } + if (!lBuff) return NULL; + + lHResult = CoInitializeEx(NULL, 0); + + 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++; + } + } + + 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; + + if (aAllowMultipleSelects) + { + ofn.Flags |= OFN_ALLOWMULTISELECT; + } + + if (GetOpenFileNameW(&ofn) == 0) + { + free(lBuff); + lBuff = NULL; + } + else + { + lBuffLen = wcslen(lBuff); + lPointers[0] = lBuff + lBuffLen + 1; + if (aAllowMultipleSelects && (lPointers[0][0] != L'\0')) + { + 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) + { + 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--; + *p = L'\\'; + p -= lBuffLen; + memmove(p, lBuff, lBuffLen*sizeof(wchar_t)); + p--; + *p = L'|'; + } + p++; + wcscpy(lBuff, p); + lBuffLen = wcslen(lBuff); + } + } + if (lBuff) lBuff = (wchar_t*)(realloc(lBuff, (lBuffLen + 1) * sizeof(wchar_t))); + } + + if (lHResult == S_OK || lHResult == S_FALSE) + { + CoUninitialize(); + } + + return lBuff; +} + + +BOOL CALLBACK BrowseCallbackProcW_enum(HWND hWndChild, LPARAM lParam) +{ + wchar_t buf[255]; + (void)lParam; + 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) +{ + (void)lp; + 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 "" */ +{ + static wchar_t lBuff[MAX_PATH_OR_CMD]; + wchar_t * lRetval; + + BROWSEINFOW bInfo; + LPITEMIDLIST lpItem; + HRESULT lHResult; + + 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");*/ + + 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; + + lpItem = SHBrowseForFolderW(&bInfo); + if (!lpItem) + { + lRetval = NULL; + } + else + { + SHGetPathFromIDListW(lpItem, lBuff); + lRetval = lBuff ; + } + + 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 } */ +{ + static wchar_t lResultHexRGB[8]; + CHOOSECOLORW cc; + COLORREF crCustColors[16]; + unsigned char lDefaultRGB[3]; + int lRet; + + HRESULT lHResult; + + 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: use the GRAVE ACCENT \\x60 instead.", aDefaultRGB, aoResultRGB);*/ + + lHResult = CoInitializeEx(NULL, 0); + + if ( aDefaultHexRGB && wcslen(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; + + lRet = ChooseColorW(&cc); + + if (!lRet) + { + return NULL; + } + + aoResultRGB[0] = GetRValue(cc.rgbResult); + aoResultRGB[1] = GetGValue(cc.rgbResult); + aoResultRGB[2] = GetBValue(cc.rgbResult); + + RGB2HexW(aoResultRGB, lResultHexRGB); + + if (lHResult == S_OK || lHResult == S_FALSE) + { + CoUninitialize(); + } + + 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 */ +{ + 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); + } + + lIntRetVal = tinyfd_messageBoxW(lTitle, lMessage, lDialogType, lIconType, aDefaultButton); + + free(lMessage); + + return lIntRetVal; +} + + +static int notifyWinGui( + 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; + + 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); + + free(lMessage); + + 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 */ +{ + 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); + + free(lMessage); + + if (!lTmpWChar) + { + aoBuff[0] = '\0'; + return 0; + } + + if (tinyfd_winUtf8) lTmpChar = tinyfd_utf16to8(lTmpWChar); + else lTmpChar = tinyfd_utf16toMbcs(lTmpWChar); + + strcpy(aoBuff, lTmpChar); + + return 1; +} + + +static char * saveFileDialogWinGui( + 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; + + 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 (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); + + for (i = 0; i < aNumOfFilterPatterns; i++) + { + free(lFilterPatterns[i]); + } + free(lFilterPatterns); + + 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); + + return aoBuff; +} + + +static char * openFileDialogWinGui( + 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; + + 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 (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); + + for (i = 0; i < aNumOfFilterPatterns; i++) + { + free(lFilterPatterns[i]); + } + free(lFilterPatterns); + + 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); + + return lTmpChar; +} + + +static char * selectFolderDialogWinGui( + 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; + + 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); + + if (!lTmpWChar) + { + return NULL; + } + + if (tinyfd_winUtf8) lTmpChar = tinyfd_utf16to8(lTmpWChar); + else lTmpChar = tinyfd_utf16toMbcs(lTmpWChar); + strcpy(aoBuff, lTmpChar); + + 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 } */ +{ + static char lResultHexRGB[8]; + + wchar_t lTitle[128]; + wchar_t * lTmpWChar; + char * lTmpChar; + wchar_t lDefaultHexRGB[16] = L""; + + 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) + { + return NULL; + } + + if (tinyfd_winUtf8) lTmpChar = tinyfd_utf16to8(lTmpWChar); + else lTmpChar = tinyfd_utf16toMbcs(lTmpWChar); + strcpy(lResultHexRGB, lTmpChar); + + 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) + { + 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 lDialogString[MAX_PATH_OR_CMD]; + char lDialogFile[MAX_PATH_OR_CMD]; + FILE * lIn; + char lBuff[MAX_PATH_OR_CMD] = ""; + (void)aIconType; + + 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 ) ) + { + 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, "\" "); + + 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); + + /*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 (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; + } + + 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 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 , " & " ) ; + + 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, "\" ") ; + + 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); + + /* 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); + + 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 ) + { + 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 * aDefaultPathAndOrFile ) /* NULL or "" */ +{ + 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, "\" ") ; + } + + strcat(lDialogString, "--backtitle \"") ; + strcat(lDialogString, + "tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY") ; + strcat(lDialogString, "\" ") ; + + 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); + + /* 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; +} + + +static char * openFileDialogWinConsole( + char const * aTitle , /* NULL or "" */ + char const * aDefaultPathAndOrFile ) /* NULL or "" */ +{ + char lFilterPatterns[MAX_PATH_OR_CMD] = ""; + char lDialogString[MAX_PATH_OR_CMD] ; + FILE * lIn; + + static char aoBuff[MAX_PATH_OR_CMD]; + + 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 , "--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); + + /* 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; +} + + +static char * selectFolderDialogWinConsole( + 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 ; + + 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 , "--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 ) ; + + 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; + + 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 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 ((!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) + { + lOriginalCP = GetConsoleCP(); + lOriginalOutputCP = GetConsoleOutputCP(); + (void)SetConsoleCP(GetACP()); + (void)SetConsoleOutputCP(GetACP()); + } + + 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"); + 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) 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 "); fflush(stdout); + 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" */ +{ + 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); +} + + +/* 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 */ +{ + static char lBuff[MAX_PATH_OR_CMD] = ""; + char * lEOF; + + DWORD mode = 0; + HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); + + unsigned long lNum; + void * lConsoleHandle; + char * lTmpChar; + wchar_t lBuffW[1024]; + + UINT lOriginalCP = 0; + UINT lOriginalOutputCP = 0; + + 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: use the GRAVE ACCENT \\x60 instead."); + + 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_winUtf8) + { + 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): "); fflush(stdout); + 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; + } + else + { + lEOF = fgets(lBuff, MAX_PATH_OR_CMD, stdin); + if (!aDefaultInput) + { + (void)SetConsoleMode(hStdin, mode); + printf("\n"); + } + + 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 * 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; + + 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 ( ( !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, 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 ( ! 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 ; +} + + +/* in case of multiple files, the separator is | */ +char * tinyfd_openFileDialog( + 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 * p; + char * lPointerInputBox; + int i; + + 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 (tfd_quoteDetected(aFilterPatterns[i])) return tinyfd_openFileDialog("INVALID FILTER_PATTERN WITH QUOTES: use the GRAVE ACCENT \\x60 instead.", aDefaultPathAndOrFile, 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, 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 ; +} + + +char * tinyfd_selectFolderDialog( + 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]; + + 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 (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 ) ) + { + return NULL ; + } + 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 */ +char * tinyfd_colorChooser( + 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]; + + 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: 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 (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 && (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] != '#') ) + { + 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, lString); /* restore its previous content to tinyfd_inputBox */ + + return lDefaultHexRGB; +} + + +#else /* unix */ + +static char gPython2Name[16]; +static char gPython3Name[16]; +static char gPythonName[16]; + +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 dirExists( char const * aDirPath ) +{ + 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] = "command -v " ; + FILE * lIn ; +#ifdef _GNU_SOURCE + char* lAllocatedCharString; + int lSubstringUndetected; +#endif + + strcat( lTestedString , aExecutable ) ; + strcat( lTestedString, " 2>/dev/null "); + lIn = popen( lTestedString , "r" ) ; + if ( ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) + && ( ! strchr( lBuff , ':' ) ) && ( strncmp(lBuff, "no ", 3) ) ) + { /* present */ + 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; + } +#endif /*_GNU_SOURCE*/ + + 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 ; + } +} + + +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 ; + + strcpy( lTestedString , aExecutable ) ; + strcat( lTestedString , " --version" ) ; + + lIn = popen( lTestedString , "r" ) ; + lTmp = fgets( lBuff , sizeof( lBuff ) , lIn ) ; + pclose( lIn ) ; + + lTmp += strcspn(lTmp,"0123456789"); + /* printf("lTmp:%s\n", lTmp); */ + return lTmp ; +} + + +static int * getMajorMinorPatch( char const * aExecutable ) +{ + 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]); */ + + 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 ; + + 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 char * dialogNameOnly(void) +{ + static char lDialogName[128] = "*" ; + if ( lDialogName[0] == '*' ) + { + 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 , "" ); + } + } + 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 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; +} + + +static int whiptailPresentOnly(void) +{ + 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; + + if ( lTerminalName[0] == '*' ) + { + if ( detectPresence( "bash" ) ) + { + 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 , "" ) ; + } + /* 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 ; + } +} + + +static int whiptailPresent(void) +{ + 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() ) ) ) ; +} + + +static int ffplayPresent(void) +{ + 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 playPresent(void) /* play is part of sox */ +{ + static int lPlayPresent = -1; + if (lPlayPresent < 0) + { + lPlayPresent = detectPresence("sox"); /*if sox is present, play is ready*/ + } + return lPlayPresent; +} + + +static int beepexePresent(void) +{ + static int lBeepexePresent = -1; + if (lBeepexePresent < 0) + { + lBeepexePresent = detectPresence("beep.exe"); + } + return lBeepexePresent; +} + + +/*static int beepPresent(void) +{ + 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") ) + { + lPlaysoundPresent = 0 ; + } + } + return lPlaysoundPresent; +} + + +static int paplayPresent(void) /* playsound is part of pipewire */ +{ + static int lPaplayPresent = -1 ; + if (lPaplayPresent < 0) + { + lPaplayPresent = detectPresence("paplay"); + if ( lPaplayPresent && ! fileExists("/usr/share/sounds/freedesktop/stereo/bell.oga") ) + { + lPaplayPresent = 0 ; + } + } + 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 gmessagePresent(void) +{ + 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 perlPresent(void) +{ + static int lPerlPresent = -1 ; + char lBuff[MAX_PATH_OR_CMD] ; + FILE * lIn ; + + 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); + } + } + return graphicMode() ? lPerlPresent : 0 ; +} + + +static int afplayPresent(void) +{ + 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 ; +} + + +static int xdialogPresent(void) +{ + 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 osascriptPresent(void) +{ + 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( ) ; +} + + +int tfd_matedialogPresent(void) +{ + 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( ) ; +} + + +int tfd_xpropPresent(void) +{ + static int lXpropReady = 0 ; + static int lXpropDetected = -1 ; + char lBuff[MAX_PATH_OR_CMD] ; + FILE * lIn ; + + if ( lXpropDetected < 0 ) + { + lXpropDetected = detectPresence("xprop") ; + } + + 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( ) ; +} + + +int tfd_yadPresent(void) +{ + static int lYadPresent = -1; + if (lYadPresent < 0) + { + lYadPresent = detectPresence("yad"); + } + return lYadPresent && graphicMode(); +} + + +int tfd_zenity3Present(void) +{ + 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 ) + { + lZenity3Present = 5 ; + } + else if ( lIntTmp >= 10 ) + { + lZenity3Present = 4 ; + } + } + 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 ; +} + + +int tfd_kdialogPresent(void) +{ + static int lKdialogPresent = -1 ; + char lBuff[MAX_PATH_OR_CMD] ; + FILE * lIn ; + char * lDesktop; + + 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 ) ; + + 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; + + 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 ; + + 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 ; + + if ( lPython2Present < 0 ) + { + 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) ; + } + 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);\""; + + 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;\""; + + if ( lTkinter2Present < 0 ) + { + lTkinter2Present = 0 ; + if ( python2Present() ) + { + sprintf( lPythonCommand , "%s %s" , gPython2Name , lPythonParams ) ; + lTkinter2Present = tryCommand(lPythonCommand) ; + } + if (tinyfd_verbose) printf("lTkinter2Present %d graphicMode %d \n", lTkinter2Present, graphicMode() ) ; + } + return lTkinter2Present && graphicMode() && !(tfd_isDarwin() && getenv("SSH_TTY") ); +} + + +static int pythonDbusPresent(void) +{ + 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 && 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") ); +} + + +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); +} + + +void tinyfd_beep(void) +{ + char lDialogString[256] ; + FILE * lIn ; + + 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 ) + { + strcpy( lDialogString , "afplay /System/Library/Sounds/Ping.aiff") ; + } + else + { + 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 ( ( lIn = popen( lDialogString , "r" ) ) ) + { + pclose( lIn ) ; + } + + 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 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'; + + 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 ); + } + + 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, ")' ") ; + + 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 '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 */ + } + + 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" ) ; + } + + 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()) ) ) + { + 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, " --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\ +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 */ + } + + strcat( lDialogString , +" -S -c \"import Tkinter,tkMessageBox;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=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, "',") ; + 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\ +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"); + } + + 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 " ) ; + } + + 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 ( 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, "\" "); + + 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") ; + + 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;} + + 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), +"my \\$notificationId;\\$notificationId = \\$notificationsObject->Notify(shift, 0, '%s', '%s', '%s', [], {}, -1);\" ", + 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); + } + + 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 ( ! ( lIn = popen( lDialogString , "r" ) ) ) + { + free(lDialogString); + return 0 ; + } + while ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) + {} + + pclose( lIn ) ; + + /* 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) ) ; */ + + lResult = !strcmp( lBuff , "2" ) ? 2 : !strcmp( lBuff , "1" ) ? 1 : 0; + + /* 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 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 ( 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 ); + } + + 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, "\" ") ; + } + + 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 , "\"" ) ; + } + + 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"); + + if ( aIconType && strlen( aIconType ) ) + { + strcat( lDialogString , " --image=\""); + 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;} + + 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) , +"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 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 ( 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 (lDialogString) free(lDialogString); + return tinyfd_messageBox(aTitle, aMessage, "ok", aIconType, 0); + } + + 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 */ +{ + 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 */ + + 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: 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 ); + } + + 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 ( ! 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, " --title=\"") ; + if (aTitle && strlen(aTitle)) strcat(lDialogString, aTitle) ; + strcat(lDialogString, "\"") ; + + 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, "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 \""); + } + + 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( ) ) + { + 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, "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 */ + } + + 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, "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 ( !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 ( 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); + } + + 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 (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 ) ; + + 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 ( 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 ; + } + + /* printf( "lBuff+1: %s\n" , lBuff+1 ) ; */ + free(lDialogString); + return lBuff+1 ; +} + + +char * tinyfd_saveFileDialog( + 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] ; + static char lLastDirectory[MAX_PATH_OR_CMD] = "$PWD" ; + + 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 (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;} + + 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 ( 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" ) ; + + 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 --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 , +"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 ( 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 ( !xdialogPresent() && !gdialogPresent() ) + { + strcat(lDialogString, "--backtitle \"") ; + strcat(lDialogString, + "tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY") ; + 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; + + 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" ) ) ) + { + 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; + } + + getPathWithoutFinalSlash( lString , lBuff ) ; + if ( strlen( lString ) && ! dirExists( lString ) ) + { + return NULL ; + } + strcpy(lLastDirectory, lString) ; + + getLastName(lString,lBuff); + if ( ! filenameValid(lString) ) + { + return NULL; + } + return lBuff ; +} + + +/* in case of multiple files, the separator is | */ +char * tinyfd_openFileDialog( + 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 */ +{ + static char * lBuff = NULL; + static char lLastDirectory[MAX_PATH_OR_CMD] = "$PWD" ; + + 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 ; + + 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 (tfd_quoteDetected(aFilterPatterns[i])) return tinyfd_openFileDialog("INVALID FILTER_PATTERN WITH QUOTES: use the GRAVE ACCENT \\x60 instead.", aDefaultPathAndOrFile, 0, NULL, NULL, 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 , aDefaultPathAndOrFile ) ; + 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 ( 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 , +" -S -c \"import Tkinter,tkFileDialog;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 , "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 , " " ) ; + } + + 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, "\" ") ; + } + + 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, "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 ; + } + 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; + } + + 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 ) ) + { + return NULL ; + } + strcpy(lLastDirectory, lString) ; + + lBuff = (char *)( realloc( lBuff, (strlen(lBuff)+1) * sizeof(char))); + + /*printf( "lBuff3 [%lu]: %s\n" , strlen(lBuff) , lBuff ) ; */ + return lBuff ; +} + + +char * tinyfd_selectFolderDialog( + char const * aTitle , /* "" */ + char const * aDefaultPath ) /* "" */ +{ + static char lBuff[MAX_PATH_OR_CMD] ; + static char lLastDirectory[MAX_PATH_OR_CMD] = "$PWD" ; + + char lDialogString[MAX_PATH_OR_CMD] ; + FILE * lIn ; + char * p ; + char * lPointerInputBox ; + int lWasGraphicDialog = 0 ; + int lWasXterm = 0 ; + lBuff[0]='\0'; + + 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 ( 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 ( 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, "\"") ; + } + } + 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" ) ; + + 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 (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 , +"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 , " " ) ; + } + + 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, "\" ") ; + } + + 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 ( !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 ; + } + + 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 */ +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 } */ +{ + static char lDefaultHexRGB[16]; + char lBuff[128] ; + + char lTmp[128] ; +#if !((defined(__cplusplus ) && __cplusplus >= 201103L) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__clang__)) + 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'; + + 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 && (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( ) ) + { + 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 , +" -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 , +"-e 'set mystring to ((item 1 of mycolor) div 256 as integer) as string' " ); + strcat( lDialogString , +"-e 'repeat with i from 2 to the count of mycolor' " ); + 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 ) ; + + 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 ) ; + + 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]); +#else + 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, "'") ; + + 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 */ + } + + strcat( lDialogString , +" -S -c \"import Tkinter,tkColorChooser;root=Tkinter.Tk();root.withdraw();"); + + 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, "'") ; + + + 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); + + 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 ( 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]); +#else + 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] == '(' ) { +#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]); +#else + 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 ) ; */ +#if (defined(__cplusplus ) && __cplusplus >= 201103L) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__clang__) + sscanf(lBuff,"%hhu %hhu %hhu", & aoResultRGB[0], & aoResultRGB[1],& aoResultRGB[2]); +#else + 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 ) ; */ + + 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[] ) +{ +char const * lTmp; +char const * lTheSaveFileName; +char const * lTheOpenFileName; +char const * lTheSelectFolderName; +char const * lTheHexColor; +char const * lWillBeGraphicMode; +unsigned char lRgbColor[3]; +FILE * lIn; +char lBuffer[1024]; +char lString[1024]; +char const * lFilterPatterns[2] = { "*.txt", "*.text" }; + +tinyfd_verbose = argc - 1; +tinyfd_silent = 1; + +lWillBeGraphicMode = tinyfd_inputBox("tinyfd_query", NULL, NULL); + +strcpy(lBuffer, "v"); +strcat(lBuffer, tinyfd_version); +if (lWillBeGraphicMode) +{ + strcat(lBuffer, "\ngraphic mode: "); +} +else +{ + strcat(lBuffer, "\nconsole mode: "); +} +strcat(lBuffer, tinyfd_response); +strcat(lBuffer, "\n"); +strcat(lBuffer, tinyfd_needs+78); +strcpy(lString, "tinyfiledialogs"); +tinyfd_messageBox(lString, lBuffer, "ok", "info", 0); + +tinyfd_notifyPopup("the title", "the message\n\tfrom outer-space", "info"); + +if (lWillBeGraphicMode && !tinyfd_forceConsole) +{ + 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); + +if (!lTmp) return 1; + +strcpy(lString, lTmp); + +lTheSaveFileName = tinyfd_saveFileDialog( + "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; +} + +lIn = fopen(lTheSaveFileName, "w"); +if (!lIn) +{ + 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); + +if (!lTheOpenFileName) +{ + 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); +} +lBuffer[0] = '\0'; +fgets(lBuffer, sizeof(lBuffer), lIn); +fclose(lIn); + +tinyfd_messageBox("your password is", + lBuffer, "ok", "info", 1); + +lTheSelectFolderName = tinyfd_selectFolderDialog( + "let us just select a directory", NULL); + +if (!lTheSelectFolderName) +{ + tinyfd_messageBox( + "Error", + "Select folder name is NULL", + "ok", + "error", + 1); + return 1; +} + +tinyfd_messageBox("The selected folder is", + lTheSelectFolderName, "ok", "info", 1); + +lTheHexColor = tinyfd_colorChooser( + "choose a nice color", + "#FF0077", + lRgbColor, + lRgbColor); + +if (!lTheHexColor) +{ + tinyfd_messageBox( + "Error", + "hexcolor is NULL", + "ok", + "error", + 1); + return 1; +} + +tinyfd_messageBox("The selected hexcolor is", + lTheHexColor, "ok", "info", 1); + + tinyfd_beep(); + + return 0; +} +*/ + +#ifdef _MSC_VER +#pragma warning(default:4996) +#pragma warning(default:4100) +#pragma warning(default:4706) +#endif diff --git a/lab16/lab16/lab16.cpp b/lab16/lab16/lab16.cpp index c884a92..1d9c8ee 100644 --- a/lab16/lab16/lab16.cpp +++ b/lab16/lab16/lab16.cpp @@ -322,7 +322,7 @@ void drawBottomBar(HDC hdc) { RECT helprect = { WIDTH * N - 550 , HEIGHT * M, WIDTH * N - WIDTH / 4, HEIGHT * M + VOFFSET }; HFONT hFont = CreateFontW(24, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS, - CLIP_DEFAULT_PRECIS, PROOF_QUALITY, VARIABLE_PITCH, TEXT("Consolas")); + CLIP_DEFAULT_PRECIS, PROOF_QUALITY, VARIABLE_PITCH, TEXT("consolas")); SelectObject(hdc, hFont); SetTextColor(hdc, RGB(78, 201, 176)); diff --git a/lab26/TextProcessingDict/TextProcessingDict.vcxproj b/lab26/TextProcessingDict/TextProcessingDict.vcxproj index 4d0a78b..f26ee0d 100644 --- a/lab26/TextProcessingDict/TextProcessingDict.vcxproj +++ b/lab26/TextProcessingDict/TextProcessingDict.vcxproj @@ -76,6 +76,7 @@ true WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + ..\..\hash functions Console diff --git a/lab26/ФИСТ2024_ЛР26_Время_работы_разных_реализаций_Словаря.xlsx b/lab26/ФИСТ2024_ЛР26_Время_работы_разных_реализаций_Словаря.xlsx index 369e6e296f5493841a8ba683c75ecf96116497cf..cba60fc1dd71717f091d63c1bcc93eb36a3e05c8 100644 GIT binary patch delta 5486 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 F@jtQIZ%hCH delta 4892 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 You can rename tinfiledialogs.c as .cpp | + |____________________________________________________________________| + +tiny file dialogs ( cross-platform C C++ ) v3.18.2 [Jun 16, 2024] + _________ +/ \ Tray-popup InputBox PasswordBox MessageBox Notification Beep +|tiny file| ColorPicker OpenFileDialog SaveFileDialog SelectFolderDialog +| dialogs | ASCII UTF-8 (and also MBCS & UTF-16 for windows) +\____ ___/ Native dialog library for WINDOWS MAC OSX GTK+ QT CONSOLE + \| SSH support via automatic switch to console mode or X forwarding + +C89/C18 & C++98/C++20 compliant: tested with C & C++ compilers +VisualStudio MinGW GCC Clang TinyCC OpenWatcom-v2 BorlandC SunCC ZapCC +on Windows Mac Linux Bsd Solaris Minix Raspbian Flatpak +using Gnome Kde Mate Enlightenment Cinnamon Budgie Unity Lxde Lxqt Xfce + WindowMaker IceWm Cde Jds OpenBox Awesome Jwm Xdm Cwm + +Bindings for LUA, C#, dll, Fortran, Pascal, R. +Included in LWJGL(java), Rust, Haskell, Allegrobasic. + ____________________________________________________________________________ +| ________________________________________________________________________ | +| | ____________________________________________________________________ | | +| | | If you like tinyfiledialogs, please upvote my stackoverflow answer | | | +| | | https://stackoverflow.com/a/47651444 | | | +| | |____________________________________________________________________| | | +| |________________________________________________________________________| | +|____________________________________________________________________________| + ___________________________________________________________ + | | + | v3.10: NEW FORTRAN module fully implemented with examples | + | v3.13: NEW PASCAL unit fully implemented with examples | + | v3.14: NEW R inteface fully implemented with examples | + |___________________________________________________________| + _____________________________________________________________________ + | | + | my email address is at the top of the header file tinyfiledialogs.h | + |_____________________________________________________________________| + ________________________________________________________________________________ +| ____________________________________________________________________________ | +| | | | +| | - in tinyfiledialogs, char is UTF-8 by default (since v3.6) | | +| | | | +| | on windows: | | +| | - for UTF-16, use the wchar_t functions at the bottom of the header file | | +| | - _wfopen() requires wchar_t | | +| | | | +| | - but fopen() expects MBCS (not UTF-8) | | +| | - if you want char to be MBCS: set tinyfd_winUtf8 = 0 | | +| | | | +| | - alternatively, tinyfiledialogs provides | | +| | functions to convert between UTF-8, UTF-16 and MBCS | | +| |____________________________________________________________________________| | +|________________________________________________________________________________| + + ___________________________________________________________________________________ +| _______________________________________________________________________________ | +| | | | +| | wchar_t UTF-16 (windows only) prototypes are at the bottom of the header file | | +| |_______________________________________________________________________________| | +|___________________________________________________________________________________| + + __________________________________________ + | ______________________________________ | + | | | | + | | DO NOT USE USER INPUT IN THE DIALOGS | | + | |______________________________________| | + |__________________________________________| + + +See compilation instructions at the end of this file + +void tinyfd_beep(); + +int tinyfd_notifyPopup( + char const * aTitle , // NULL or "" + char const * aMessage , // NULL or "" may contain \n \t + char const * aIconType ); // "info" "warning" "error" + +int tinyfd_messageBox( + char const * aTitle , // NULL or "" + char const * aMessage , // NULL or "" may contain \n \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 * tinyfd_inputBox( + char const * aTitle , // NULL or "" + char const * aMessage , // NULL or "" (\n and \t have no effect) + char const * aDefaultInput ); // NULL for a passwordBox, "" for an inputbox + // returns NULL on cancel + +char const * tinyfd_saveFileDialog( + char const * aTitle , // NULL or "" + char const * aDefaultPathAndOrFile , // NULL or "" , ends with / to set only a directory + int aNumOfFilterPatterns , // 0 (1 in the following example) + char const * const * aFilterPatterns , // NULL or char const * lFilterPatterns[1]={"*.txt"}; + char const * aSingleFilterDescription ); // NULL or "text files" + // returns NULL on cancel + +char const * tinyfd_openFileDialog( + char const * aTitle , // NULL or "" + char const * aDefaultPathAndOrFile , // NULL or "" , ends with / to set only a directory + int aNumOfFilterPatterns , // 0 (2 in the following example) + char const * const * aFilterPatterns , // NULL or char const * lFilterPatterns[2]={"*.png","*.jpg"}; + char const * aSingleFilterDescription , // NULL or "image files" + int aAllowMultipleSelects ); // 0 + // in case of multiple files, the separator is | + // returns NULL on cancel + +char const * tinyfd_selectFolderDialog( + char const * aTitle , // NULL or "" + char const * aDefaultPath ); // NULL or "" + // returns NULL on cancel + +char const * tinyfd_colorChooser( + char const * aTitle , // NULL or "" + char const * aDefaultHexRGB , // NULL or "#FF0000ǥ + unsigned char const aDefaultRGB[3] , // unsigned char lDefaultRGB[3] = { 0 , 128 , 255 }; + unsigned char aoResultRGB[3] ); // unsigned char lResultRGB[3]; + // 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 + // returns NULL on cancel + ___________________________________________________________________________________ +| _______________________________________________________________________________ | +| | | | +| | wchar_t UTF-16 (windows only) prototypes are at the bottom of the header file | | +| |_______________________________________________________________________________| | +|___________________________________________________________________________________| + +- This is not for ios nor android (it works in termux and iSH though). +- The files can be renamed with extension ".cpp" as the code is 100% compatible C C++ +- Windows is fully supported from XP to 11 (maybe even older versions) +- C# & LUA via dll, see files in the folder EXTRAS +- OSX supported from 10.4 to latest (maybe even older versions) +- Do not use " and ' as the dialogs will be display with a warning + instead of the title, message, etc... +- There's one file filter only, it may contain several patterns. +- If no filter description is provided, + the list of patterns will become the description. +- On windows link against Comdlg32.lib and Ole32.lib + (on windows the no linking claim is a lie) +- On unix / macos: it only tries command line calls, so no linking is need. +- On unix /macos you need one of the following: + applescript, kdialog, zenity, matedialog, shellementary, qarma, yad, + python (2 or 3)with tkinter/python-dbus, Xdialog + or curses dialogs (opens terminal if running without console). +- One of those is already included on most (if not all) desktops. +- In the absence of those it will use gdialog, gxmessage or whiptail + with a textinputbox. +- If nothing is found, it switches to basic console input, + it opens a console if needed (requires xterm + bash). +- for curses dialogs you must set tinyfd_allowCursesDialogs=1 +- You can query the type of dialog that will be used (pass "tinyfd_query" as aTitle) +- String memory is preallocated statically for all the returned values. +- File and path names are tested before return, they should be valid. +- tinyfd_forceConsole=1; at run time, forces dialogs into console mode. +- On windows, console mode only make sense for console applications. +- On windows, console mode is not implemented for wchar_T UTF-16. +- Mutiple selects are not possible in console mode. +- The package dialog must be installed to run in curses dialogs in console mode. + It is already installed on most unix systems. +- On osx, the package dialog can be installed via + http://macappstore.org/dialog or http://macports.org +- On windows, for curses dialogs console mode, + dialog.exe should be copied somewhere on your executable path. + It can be found at the bottom of the following page: + http://andrear.altervista.org/home/cdialog.php + _________________________________________________________________ + | The project provides an Hello World example: | + | if a console is missing, it will use graphic dialogs | + | if a graphical display is absent, it will use console dialogs | + |_________________________________________________________________| + + +UNIX (including MacOS) : +$ clang -o hello hello.c tinyfiledialogs.c +( or gcc tcc owcc icx suncc ) +( or g++ clang++ icpx sunCC ) +( some possible options : + -ansi -std=c89 -std=c++98 -pedantic -Wstrict-prototypes + -g3 -Wall -Wextra -Wdouble-promotion -Wconversion -Wno-sign-conversion + -Wno-unused-parameter -Wno-unused-function -fsanitize=undefined -fsanitize=thread + -Wno-deprecated -Wno-incompatible-compiler ) +( if using musl instead of glibc: clang -fuse-ld=lld --rtlib=compiler-rt ) + + _____________________________________________________________________________ +| Windows : | +| You'll probably need to install The Windows SDK (Software Development Kit) | +| http://developer.microsoft.com/en-us/windows/downloads/windows-sdk | +| The end user doesn't need to install anything | +|_____________________________________________________________________________| + + MinGW needs gcc >= v4.9 otherwise some headers are incomplete + > gcc -o hello.exe hello.c tinyfiledialogs.c -LC:/mingw/lib -lcomdlg32 -lole32 + + TinyCC needs >= v0.9.27 (+ tweaks - contact me) otherwise some headers are missing + > tcc -o hello.exe hello.c tinyfiledialogs.c ^ + -isystem C:\tcc\winapi-full-for-0.9.27\include\winapi ^ + -lcomdlg32 -lole32 -luser32 -lshell32 + + Borland C : + > bcc32c -o hello.exe hello.c tinyfiledialogs.c + + Open Watcom C v2 + > owcc -o hello.exe hello.c tinyfiledialogs.c + + Windows Intel C : + > icx-cc -o hello.exe hello.c tinyfiledialogs.c -lcomdlg32 -lole32 -luser32 -lshell32 + > icx-cl -o hello.exe hello.c tinyfiledialogs.c comdlg32.lib ole32.lib user32.lib shell32.lib + > icx -o hello.exe hello.c tinyfiledialogs.c comdlg32.lib ole32.lib user32.lib shell32.lib + > icpx -o hello.exe hello.c tinyfiledialogs.c -lcomdlg32 -lole32 -luser32 -lshell32 -Wno-deprecated + + VisualStudio command line : + > cl hello.c tinyfiledialogs.c comdlg32.lib ole32.lib user32.lib shell32.lib /W4 + + VisualStudio + In the properties of your project, in the linker input field, + you may need to add: comdlg32.lib ole32.lib user32.lib shell32.lib + or maybe simply add: %(AdditionalDependencies) diff --git a/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/LUA_plugin.tinyfiledialogs.cpp b/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/LUA_plugin.tinyfiledialogs.cpp new file mode 100644 index 0000000..036f0ca --- /dev/null +++ b/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/LUA_plugin.tinyfiledialogs.cpp @@ -0,0 +1,287 @@ +/* SPDX-License-Identifier: ZLIB +Copyright (c) 2014 - 2023 Guillaume Vareille http://ysengrin.com + _________ + / \ LUA_plugin.tinyfiledialogs.cpp v3.8.3 [Nov 1, 2020] + |tiny file| LUA bindings created [2016] Copyright (c) 2016 Steven Johnson + | dialogs | + \____ ___/ http://tinyfiledialogs.sourceforge.net + \| git clone http://git.code.sf.net/p/tinyfiledialogs/code tinyfd + ____________________________________________ + | | + | email: tinyfiledialogs at ysengrin.com | + |____________________________________________| + +If you like tinyfiledialogs, please upvote my stackoverflow answer +https://stackoverflow.com/a/47651444 + +- License - +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: +1. The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +----------- + +this file was contributed by Steven Johnson from the Corona SDK project +and is offered here under the same zlib license as tinyfiledialogs + +-#include "CoronaLua.h" will typically be something like +extern "C" { +#include "lua.h" +#include "lualib.h" +#include "lauxlib.h" +} + +in a normal(i.e.non - Corona) program. +- For that matter, CORONA_EXPORT just hides the library exporting code. +- The "_plugin_" stuff is part of a signature used by Corona to dynamically load the entry point function, but might be out +of place in a non - Corona program. +*/ + + +#include "CoronaLua.h" +#include "tinyfiledialogs.h" +#include + +#define STATIC_FILTER_COUNT 8 + +static int GetBool (lua_State * L, const char * key) +{ + lua_getfield(L, 1, key);// ..., bool + + int bval = lua_toboolean(L, -1); + + lua_pop(L, 1); // ... + + return bval; +} + +static const char * GetStrOrBlank (lua_State * L, const char * key, const char * blank = "") +{ + lua_getfield(L, 1, key);// ..., str? + + const char * str = blank; // might be NULL, thus not using luaL_optstring + + if (!lua_isnil(L, -1)) str = luaL_checkstring(L, -1); + + lua_pop(L, 1); + + return str; +} + +static int GetFilters (lua_State * L, const char *** filters) +{ + int nfilters = 0; + + lua_getfield(L, 1, "filter_patterns"); // ..., patts + + if (lua_istable(L, -1)) + { + int n = lua_objlen(L, -1); + + if (n > STATIC_FILTER_COUNT) *filters = (const char **)lua_newuserdata(L, sizeof(const char *) * n);// ..., patts, filters + + for (int i = 1; i <= n; ++i, lua_pop(L, 1)) + { + lua_rawgeti(L, -1, i); // ..., patts[, filters], patt + + (*filters)[nfilters++] = luaL_checkstring(L, -1); + } + } + + else if (!lua_isnil(L, -1)) (*filters)[nfilters++] = luaL_checkstring(L, -1); + + return nfilters; +} + +static int StringResponse (lua_State * L, const char * res) +{ + if (!res) lua_pushboolean(L, 0);// ..., false + + else lua_pushstring(L, res);// ..., res + + return 1; +} + +static luaL_Reg tfd_funcs[] = { + { + "notifyPopup", [](lua_State * L) + { + luaL_checktype(L, 1, LUA_TTABLE); + + const char * title = GetStrOrBlank(L, "title"); + const char * message = GetStrOrBlank(L, "message"); + const char * icon_types[] = { "info", "warning", "error" }; + + lua_getfield(L, 1, "icon_type"); // opts, icon_type + + const char * itype = icon_types[luaL_checkoption(L, -1, "info", icon_types)]; + + lua_pushboolean(L, tinyfd_notifyPopup(title, message, itype)); // opts, icon_type + + return 1; + } + }, { + "messageBox", [](lua_State * L) + { + luaL_checktype(L, 1, LUA_TTABLE); + + const char * title = GetStrOrBlank(L, "title"); + const char * message = GetStrOrBlank(L, "message"); + const char * dialog_types[] = { "ok", "okcancel", "yesno", "yesnocancel" }; + const char * icon_types[] = { "info", "warning", "error", "question" }; + + lua_getfield(L, 1, "dialog_type"); // opts, dialog_type + lua_getfield(L, 1, "icon_type");// opts, dialog_type, icon_type + + const char * dtype = dialog_types[luaL_checkoption(L, -2, "ok", dialog_types)]; + const char * itype = icon_types[luaL_checkoption(L, -1, "info", icon_types)]; + + lua_pushboolean(L, tinyfd_messageBox(title, message, dtype, itype, GetBool(L, "default_okyes"))); // opts, dialog_type, icon_type, ok / yes + + return 1; + } + }, { + "inputBox", [](lua_State * L) + { + luaL_checktype(L, 1, LUA_TTABLE); + + const char * title = GetStrOrBlank(L, "title"); + const char * message = GetStrOrBlank(L, "message"); + + // + lua_getfield(L, 1, "default_input");// opts, def_input + + const char * def_input; + + if (lua_type(L, -1) == LUA_TBOOLEAN && !lua_toboolean(L, -1)) def_input = NULL; + + else def_input = luaL_optstring(L, -1, ""); + + return StringResponse(L, tinyfd_inputBox(title, message, def_input)); // opts, def_input, input + } + }, { + "saveFileDialog", [](lua_State * L) + { + luaL_checktype(L, 1, LUA_TTABLE); + + const char * title = GetStrOrBlank(L, "title"); + const char * def_path_and_file = GetStrOrBlank(L, "default_path_and_file"); + const char * filter_description = GetStrOrBlank(L, "filter_description", NULL); + const char * filter_array[STATIC_FILTER_COUNT] = { 0 }, ** filters = filter_array; + int nfilters = GetFilters(L, &filters); // opts, patts[, filters] + + return StringResponse(L, tinyfd_saveFileDialog(title, def_path_and_file, nfilters, filters, filter_description)); // opts, patts[, filters], file + } + }, { + "openFileDialog", [](lua_State * L) + { + luaL_checktype(L, 1, LUA_TTABLE); + + // + const char * title = GetStrOrBlank(L, "title"); + const char * def_path_and_file = GetStrOrBlank(L, "default_path_and_file"); + const char * filter_description = GetStrOrBlank(L, "filter_description", NULL); + const char * filter_array[STATIC_FILTER_COUNT] = { 0 }, ** filters = filter_array; + int allow_multiple_selects = GetBool(L, "allow_multiple_selects"); + int nfilters = GetFilters(L, &filters); // opts, patts[, filters] + + // + const char * files = tinyfd_openFileDialog(title, def_path_and_file, nfilters, nfilters ? filters : NULL, filter_description, allow_multiple_selects); + + if (!allow_multiple_selects || !files) return StringResponse(L, files); // opts, patts[, filters], files? + + else + { + lua_newtable(L);// opts, patts[, filters], files + + char * from = (char *)files, * sep = from; // assign sep in order to pass first iteration + + for (int fi = 1; sep; ++fi) + { + sep = strchr(from, '|'); + + if (sep) + { + lua_pushlstring(L, from, sep - from); // opts, patts[, filters], files, file + + from = sep + 1; + } + + else lua_pushstring(L, from);// opts, patts[, filters], files, file + + lua_rawseti(L, -2, fi); // opts, patts[, filters], files = { ..., file } + } + } + + return 1; + } + }, { + "selectFolderDialog", [](lua_State * L) + { + luaL_checktype(L, 1, LUA_TTABLE); + + const char * title = GetStrOrBlank(L, "title"); + const char * def_path = GetStrOrBlank(L, "default_path"); + + return StringResponse(L, tinyfd_selectFolderDialog(title, def_path)); // opts, folder + } + }, { + "colorChooser", [](lua_State * L) + { + luaL_checktype(L, 1, LUA_TTABLE); + lua_settop(L, 1); // opts + lua_getfield(L, 1, "out_rgb"); // opts, out + + const char * title = GetStrOrBlank(L, "title"); + + // + unsigned char rgb[3]; + + lua_getfield(L, 1, "rgb"); // opts, out, rgb + + const char * def_hex_rgb = NULL; + + if (lua_istable(L, 3)) + { + lua_getfield(L, 3, "r");// opts, out, rgb, r + lua_getfield(L, 3, "g");// opts, out, rgb, r, g + lua_getfield(L, 3, "b");// opts, out, rgb, r, g, b + + for (int i = 1; i <= 3; ++i) rgb[i - 1] = (unsigned char)(luaL_checknumber(L, 3 + i) * 255.0); + } + + else def_hex_rgb = luaL_optstring(L, 3, "#000000"); + + const char * color = tinyfd_colorChooser(title, def_hex_rgb, rgb, rgb); + + if (color && lua_istable(L, 2)) + { + for (int i = 0; i < 3; ++i) lua_pushnumber(L, (double)rgb[i] / 255.0); // opts, out, rgb[, r, g, b], rout, gout, bout + + lua_setfield(L, 2, "b");// opts, out, rgb[, r, g, b], rout, gout + lua_setfield(L, 2, "g");// opts, out, rgb[, r, g, b], rout + lua_setfield(L, 2, "r");// opts, out, rgb[, r, g, b] + } + + return StringResponse(L, color);// opts, out, rgb[, r, g, b], color + } + }, + { NULL, NULL } +}; + +CORONA_EXPORT int luaopen_plugin_tinyfiledialogs(lua_State* L) +{ + lua_newtable(L);// t + luaL_register(L, NULL, tfd_funcs); + + return 1; +} diff --git a/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/PascalABC/tinyfd.pas b/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/PascalABC/tinyfd.pas new file mode 100644 index 0000000..3fdee61 --- /dev/null +++ b/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/PascalABC/tinyfd.pas @@ -0,0 +1,56 @@ +{ SPDX-License-Identifier: ZLIB +Copyright (c) 2014 - 2023 Guillaume Vareille http://ysengrin.com + +found on this page: + https://github.com/pascalabcnet/pascalabcnet/discussions/2782 +} + +unit tinyfd; + +uses System; + +procedure tinyfd_beep(); external 'tinyfiledialogs64.dll'; + +function tinyfd_notifyPopup(aTitle: string; + aMessage: string; + aIconType: string): integer; + external 'tinyfiledialogs64.dll'; + +function tinyfd_messageBox(aTitle: string; + aMessage: string; + aDialogTyle: string; + aIconType: string; + aDefaultButton: integer): integer; + external 'tinyfiledialogs64.dll'; + +function tinyfd_inputBox(aTitle: string; + aMessage: string; + aDefaultInput: string): IntPtr; + external 'tinyfiledialogs64.dll'; + +function tinyfd_saveFileDialog(aTitle: string; + aDefaultPathAndFile: string; + aNumOfFilterPatterns: integer; + aFilterPatterns: array of string; + aSingleFilterDescription: string): IntPtr; + external 'tinyfiledialogs64.dll'; + +function tinyfd_openFileDialog(aTitle: string; + aDefaultPathAndFile: string; + aNumOfFilterPatterns: integer; + aFilterPatterns: array of string; + aSingleFilterDescription: string; + aAllowMultipleSelects: integer): IntPtr; + external 'tinyfiledialogs64.dll'; + +function tinyfd_selectFolderDialog(aTitle: string; + aDefaultPathAndFile: string): IntPtr; + external 'tinyfiledialogs64.dll'; + +function tinyfd_colorChooser(aTitle: string; + aDefaultHexRGB: string; + aDefaultRGB: array of byte; + aoResultRGB: array of byte): IntPtr; + external 'tinyfiledialogs64.dll'; + +end. diff --git a/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/fortran/tinyfd_main.f90 b/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/fortran/tinyfd_main.f90 new file mode 100644 index 0000000..a4845ef --- /dev/null +++ b/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/fortran/tinyfd_main.f90 @@ -0,0 +1,185 @@ +! SPDX-License-Identifier: ZLIB +! Copyright (c) 2014 - 2023 Guillaume Vareille http://ysengrin.com +! _________ +! / \ tinyfiledialogs v3.18.1 [May 26, 2024] +! |tiny file| +! | dialogs | +! \____ ___/ http://tinyfiledialogs.sourceforge.net +! \| git clone http://git.code.sf.net/p/tinyfiledialogs/code tinyfd + +! - License - +! This software is provided 'as-is', without any express or implied +! warranty. In no event will the authors be held liable for any damages +! arising from the use of this software. +! Permission is granted to anyone to use this software for any purpose, +! including commercial applications, and to alter it and redistribute it +! freely, subject to the following restrictions: +! 1. The origin of this software must not be misrepresented; you must not +! claim that you wrote the original software. If you use this software +! in a product, an acknowledgment in the product documentation would be +! appreciated but is not required. +! 2. Altered source versions must be plainly marked as such, and must not be +! misrepresented as being the original software. +! 3. This notice may not be removed or altered from any source distribution. +! ___________________________________________________________ +! | | +! | If you like this new FORTRAN module please upvote | +! | my stackoverflow answer on the FORTRAN post | +! | https://stackoverflow.com/a/59657117 | +! |___________________________________________________________| + +! See compilation instructions at the end of this file + + program main + use tinyfd + use iso_c_binding, only: c_ptr, c_null_char, c_f_pointer, c_loc, c_null_ptr, c_associated, c_int, c_char + implicit none + type(c_ptr) :: cpointer + character(512), pointer :: fpointer + character(128), target :: aDefaultInput + character(512) :: string, aMessage, aDefaultPath, aDefaultPathAndFile + character(128) :: aTitle, aDialogType, aIconType + character(128) :: aSingleFilterDescription + integer :: i, aInteger, aButtonPressed, aDefaultButton, aNumOfFilterPatterns, aAllowMultipleSelects + character(8) :: aDefaultHexRGB + character(3) :: aDefaultRGB, aoResultRGB + type (c_ptr), dimension(:), allocatable :: aFilterPatterns + character(len=16,kind=c_char), allocatable, target :: lExtensions(:) + + ! calling subroutine tinyfd_beep (it doesn't return anything: it's a subroutine') + write(*,'(A)') "Enter tinyfd_beep()" + call tinyfd_beep() + + ! calling function tinyfd_notifyPopup (it returns one value: it's a function') + write(*,'(A)') "Enter tinyfd_notifyPopup()" + aTitle = "a Title" // char(0) + aMessage = "a Message" // char(0) + aIconType = "info" // char(0) + aInteger = tinyfd_notifyPopup(aTitle, aMessage, aIconType ) + + ! calling function tinyfd_messageBox + write(*,'(A)') "Enter tinyfd_messageBox()" + aTitle = "a Title" // char(0) + aMessage = "a Message" // char(0) + aIconType = "info" // char(0) + aDialogType = "ok" // char(0) + aDefaultButton = 1 + aButtonPressed = tinyfd_messageBox(aTitle, aMessage, aDialogType, aIconType, aDefaultButton ) + write (*,*) aButtonPressed + + ! calling function tinyfd_inputbox + write(*,'(A)') "Enter tinyfd_inputbox()" + aTitle = "a Title" // char(0) + aMessage = "a Message" // char(0) + aDefaultInput = "an Input" // char(0) + cpointer = tinyfd_inputBox(aTitle, aMessage, c_loc(aDefaultInput) ) + ! or for a password box: cpointer = tinyfd_inputbox(atitle, amessage, c_null_ptr ) + if ( c_associated(cpointer) ) then + call c_f_pointer(cpointer, fpointer) ! Convert C Pointer to Fortran pointer + string = fpointer(1:index(fpointer,c_null_char)-1) ! Remove NULL character at the end + write (*,'(A)') string + endif + + ! calling function tinyfd_saveFileDialog + write(*,'(A)') "Enter tinyfd_saveFileDialog()" + aTitle = "a Title" // char(0) + aDefaultPathAndFile = "" // char(0) + aSingleFilterDescription = "" // char(0) ! or "Text Files" // char(0) + aNumOfFilterPatterns = 2 + allocate (lExtensions( aNumOfFilterPatterns )) + allocate (aFilterPatterns( aNumOfFilterPatterns )) + lExtensions(1) = "*.txt" // char(0) + lExtensions(2) = "*.doc" // char(0) + do i = 1, aNumOfFilterPatterns, 1 + aFilterPatterns(i) = c_loc(lExtensions(i)) + write (*,'(A)') lExtensions(i) + !write (*,*) aFilterPatterns(i) + end do + cpointer = tinyfd_saveFileDialog(aTitle, aDefaultPathAndFile, aNumOfFilterPatterns, aFilterPatterns, aSingleFilterDescription) + ! or cpointer = tinyfd_saveFileDialog(aTitle, aDefaultPathAndFile, 0, c_null_ptr, aSingleFilterDescription) + deallocate (aFilterPatterns) + deallocate (lExtensions) + if ( c_associated(cpointer) ) then + call c_f_pointer(cpointer, fpointer) ! Convert C Pointer to Fortran pointer + string = fpointer(1:index(fpointer,c_null_char)-1) ! Remove NULL character at the end + write (*,'(A)') string + endif + + ! calling function tinyfd_openFileDialog + write(*,'(A)') "Enter tinyfd_openFileDialog()" + aTitle = "a Title" // char(0) + aDefaultPathAndFile = "" // char(0) + aAllowMultipleSelects = 1 + aSingleFilterDescription = "" // char(0) ! or "Text Files" // char(0) + aNumOfFilterPatterns = 2 + allocate (lExtensions( aNumOfFilterPatterns )) + allocate (aFilterPatterns( aNumOfFilterPatterns )) + lExtensions(1) = "*.txt" // char(0) + lExtensions(2) = "*.doc" // char(0) + do i = 1, aNumOfFilterPatterns, 1 + aFilterPatterns(i) = c_loc(lExtensions(i)) + write (*,'(A)') lExtensions(i) + !write (*,*) aFilterPatterns(i) + end do + cpointer = tinyfd_openFileDialog(aTitle, aDefaultPathAndFile, aNumOfFilterPatterns, aFilterPatterns, & + aSingleFilterDescription, aAllowMultipleSelects) + ! or cpointer = tinyfd_openFileDialog(aTitle, aDefaultPathAndFile, 0, c_null_ptr, aSingleFilterDescription, aAllowMultipleSelects) + deallocate (aFilterPatterns) + deallocate (lExtensions) + if ( c_associated(cpointer) ) then + call c_f_pointer(cpointer, fpointer) ! Convert C Pointer to Fortran pointer + string = fpointer(1:index(fpointer,c_null_char)-1) ! Remove NULL character at the end + write (*,'(A)') string + endif + + ! calling function tinyfd_selectFolderDialog + write(*,'(A)') "Enter tinyfd_selectFolderDialog()" + aTitle = "a Title" // char(0) + aDefaultPath = "" // char(0) + cpointer = tinyfd_selectFolderDialog(aTitle, aDefaultPath ) + if ( c_associated(cpointer) ) then + call c_f_pointer(cpointer, fpointer) ! Convert C Pointer to Fortran pointer + string = fpointer(1:index(fpointer,c_null_char)-1) ! Remove NULL character at the end + write (*,'(A)') string + endif + + ! calling function tinyfd_colorChooser + write(*,'(A)') "Enter tinyfd_colorChooser()" + aTitle = "a Title" // char(0) + aDefaultHexRGB = "" // char(0) ! or "#FF0000" // char(0) + aDefaultRGB = char(0) // char(0) // char(255) + print *, "aDefaultRGB", IACHAR(aDefaultRGB(1:1)), IACHAR(aDefaultRGB(2:2)), IACHAR(aDefaultRGB(3:3)) + cpointer = tinyfd_colorChooser(aTitle, aDefaultHexRGB, aDefaultRGB, aoResultRGB ) + print *, "aoResultRGB", IACHAR(aoResultRGB(1:1)), IACHAR(aoResultRGB(2:2)), IACHAR(aoResultRGB(3:3)) + if ( c_associated(cpointer) ) then + call c_f_pointer(cpointer, fpointer) ! Convert C Pointer to Fortran pointer + string = fpointer(1:index(fpointer,c_null_char)-1) ! Remove NULL character at the end + write (*,'(A)') string(1:10) + write (*,*) string + endif + + end program main + +! gcc -c ../../tinyfiledialogs.c +! gfortran -c tinyfd_module.f90 tinyfd_main.f90 +! gfortran -o tinyfd_exe tinyfd_module.o tinyfiledialogs.o tinyfd_main.o + +! or in one line : gfortran -o tinyfd_exe tinyfd_module.f90 ../../tinyfiledialogs.c tinyfd_main.f90 + +! This works on VisualStudio with Intel Fortran (make sure the C project has very similar settings as your fortran project): + ________________________________________________________________________ +! 1) | Install The Windows SDK | +! | http://developer.microsoft.com/en-us/windows/downloads/windows-sdk | +! | The end user doesn't need to install anythings | +! |________________________________________________________________________| +! 2) Create a new empty C/C++ project, verify the configuration is for X64. +! 3) Add existing files: tinyfiledialogs.c and tinyfiledialogs.h +! 4) Build this project. It will fail because there is no main(), +! but it will create tinyfiledialogs.obj +! 5) Create a new empty Fortran project, verify the configuration is for X64. +! 6) Add existing file: tinyfiledialogs.obj - the one that was created on 4) +! 7) Add existing files: tinyfd_module.f90 and tinyfd_main.f90 +! 8) In the properties of this fortran project, in the linker input field, +! add: comdlg32.lib ole32.lib user32.lib shell32.lib +! or maybe add: %(AdditionalDependencies) +! 9) Build and Run. Voila ! diff --git a/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/fortran/tinyfd_module.f90 b/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/fortran/tinyfd_module.f90 new file mode 100644 index 0000000..102f921 --- /dev/null +++ b/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/fortran/tinyfd_module.f90 @@ -0,0 +1,101 @@ +! SPDX-License-Identifier: ZLIB +! Copyright (c) 2014 - 2023 Guillaume Vareille http://ysengrin.com +! _________ +! / \ tinyfiledialogs v3.18.1 [Mar 26, 2024] +! |tiny file| +! | dialogs | +! \____ ___/ http://tinyfiledialogs.sourceforge.net +! \| git clone http://git.code.sf.net/p/tinyfiledialogs/code tinyfd + +! - License - +! This software is provided 'as-is', without any express or implied +! warranty. In no event will the authors be held liable for any damages +! arising from the use of this software. +! Permission is granted to anyone to use this software for any purpose, +! including commercial applications, and to alter it and redistribute it +! freely, subject to the following restrictions: +! 1. The origin of this software must not be misrepresented; you must not +! claim that you wrote the original software. If you use this software +! in a product, an acknowledgment in the product documentation would be +! appreciated but is not required. +! 2. Altered source versions must be plainly marked as such, and must not be +! misrepresented as being the original software. +! 3. This notice may not be removed or altered from any source distribution. +! ___________________________________________________________ +! | | +! | If you like this new FORTRAN module please upvote | +! | my stackoverflow answer on the FORTRAN post | +! | https://stackoverflow.com/a/59657117 | +! |___________________________________________________________| + +! See compilation instructions at the end of tinyfd_main.f90 + + module tinyfd + interface ! C interface + + ! it doesn't return anything -> it's a subroutine + subroutine tinyfd_beep() bind(C, name='tinyfd_beep') + implicit none + end subroutine tinyfd_beep + + ! it returns one value -> it's a function + integer function tinyfd_notifyPopup(aTitle, aMessage, aIconType) bind(c, NAME='tinyfd_notifyPopup') + use iso_c_binding, only: c_char + implicit none + character (kind=c_char, len=1) :: aTitle, aMessage, aIconType + end function tinyfd_notifyPopup + + ! it returns one value -> it's a function + integer function tinyfd_messageBox(aTitle, aMessage, aDialogType, aIconType, aDefaultButton) bind(c,NAME='tinyfd_messageBox') + use iso_c_binding, only: c_char, c_int + implicit none + character (kind=c_char, len=1) :: aTitle, aMessage, aDialogType, aIconType + integer(c_int), value :: aDefaultButton + end function tinyfd_messageBox + + ! it returns one value -> it's a function + type(c_ptr) function tinyfd_inputBox(aTitle, aMessage, aDefaultInput) bind(c,NAME='tinyfd_inputBox') + use iso_c_binding, only: c_ptr, c_char + implicit none + character (kind=c_char, len=1) :: aTitle, aMessage + ! aDefaultInput is a bit different because we need to be able + ! to pass c_null_ptr to obtain a password box instead of an input box + type(c_ptr), value :: aDefaultInput + end function tinyfd_inputBox + + ! it returns one value -> it's a function + type(c_ptr) function tinyfd_saveFileDialog(aTitle, aDefaultPathAndFile, aNumOfFilterPatterns, aFilterPatterns, & + aSingleFilterDescription) bind(c,NAME='tinyfd_saveFileDialog') + use iso_c_binding, only: c_ptr, c_char, c_int + implicit none + integer(c_int), value :: aNumOfFilterPatterns + character (kind=c_char, len=1) :: aTitle, aDefaultPathAndFile, aSingleFilterDescription + type (c_ptr), dimension(*) :: aFilterPatterns + end function tinyfd_saveFileDialog + + ! it returns one value -> it's a function + type(c_ptr) function tinyfd_openFileDialog(aTitle, aDefaultPathAndFile, aNumOfFilterPatterns, aFilterPatterns, & + aSingleFilterDescription, aAllowMultipleSelects) bind(c,NAME='tinyfd_openFileDialog') + use iso_c_binding, only: c_ptr, c_char, c_int + implicit none + integer(c_int), value :: aNumOfFilterPatterns, aAllowMultipleSelects + character (kind=c_char, len=1) :: aTitle, aDefaultPathAndFile, aSingleFilterDescription + type (c_ptr), dimension(*) :: aFilterPatterns + end function tinyfd_openFileDialog + + ! it returns one value -> it's a function + type(c_ptr) function tinyfd_selectFolderDialog(aTitle, aDefaultPath) bind(c,NAME='tinyfd_selectFolderDialog') + use iso_c_binding, only: c_ptr, c_char + implicit none + character (kind=c_char, len=1) :: aTitle, aDefaultPath + end function tinyfd_selectFolderDialog + + ! it returns one value -> it's a function + type(c_ptr) function tinyfd_colorChooser(aTitle, aDefaultHexRGB, aDefaultRGB, aoResultRGB) bind(c,NAME='tinyfd_colorChooser') + use iso_c_binding, only: c_ptr, c_char, c_int + implicit none + character (kind=c_char, len=1) :: aTitle, aDefaultHexRGB, aDefaultRGB, aoResultRGB + end function tinyfd_colorChooser + + end interface ! C interface + end module tinyfd diff --git a/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/freepascal/hello.pas b/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/freepascal/hello.pas new file mode 100644 index 0000000..a43c478 --- /dev/null +++ b/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/freepascal/hello.pas @@ -0,0 +1,91 @@ +{ SPDX-License-Identifier: ZLIB +Copyright (c) 2014 - 2023 Guillaume Vareille http://ysengrin.com + _________ + / \ tinyfiledialogs v3.13 [May 2, 2023] zlib licence + |tiny file| + | dialogs | + \____ ___/ http://tinyfiledialogs.sourceforge.net + \| git clone http://git.code.sf.net/p/tinyfiledialogs/code tinyfd + + - License - + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + ___________________________________________________________ + | | + | If you like this new PASCAL module please upvote | + | my stackoverflow answer on the PASCAL post | + | https://stackoverflow.com/a/59657117 | + |___________________________________________________________| + + See compilation instructions at the end of this file +} + +program Hello ; + +uses tinyfd ; + +var + lReturnedChar : Pchar; + lReturnedValue : Integer ; + lCReturnedString: String ; + lArrayOfChar: array[0..2] of byte = (0,0,255); + +begin + writeln ('Hello tinyfd'); + tinyfd_beep(); + + lReturnedChar := tinyfd_inputBox('tinyfd_query', '', ''); + writeln (tinyfd_response); + if lReturnedChar <> nil then + lReturnedValue := tinyfd_messageBox('Graphic Mode',tinyfd_response, 'okcancel', 'info', 1) + else + lReturnedValue := tinyfd_messageBox('Console Mode',tinyfd_response, 'okcancel', 'info', 1); + + if lReturnedValue = 0 then exit; + + lReturnedValue := tinyfd_messageBox('A tinyfd title','graphic dialogs [Yes] / console mode [No]', 'yesno', 'question', 1); + if lReturnedValue = 0 then tinyfd_forceConsole := 1 ; + + tinyfd_notifyPopup('A tinyfd title', 'This is a notification', 'warning'); + + lReturnedChar := tinyfd_inputBox('A tinyfd title','This is an input box', ''); + if lReturnedChar = nil then exit; { detect cancel was pressed - no input is allowed } + lCReturnedString := StrPas(lReturnedChar); + writeln (lCReturnedString); + + lCReturnedString := tinyfd_inputBox('A tinyfd title','This is a password box', nil); + writeln (lCReturnedString); + if Length(lCReturnedString) = 0 then exit; { detect no input } + + lCReturnedString := tinyfd_saveFileDialog('Choose a filename to save to','lala.txt', 0, nil,nil); + writeln (lCReturnedString); + if Length(lCReturnedString) = 0 then exit; + + lCReturnedString := tinyfd_openFileDialog('Choose a filename to read from','../lala.txt', 0, nil, nil, 0); + writeln (lCReturnedString); + if Length(lCReturnedString) = 0 then exit; + + lCReturnedString := tinyfd_selectFolderDialog('Select a folder','../..'); + writeln (lCReturnedString); + if Length(lCReturnedString) = 0 then exit; + + lCReturnedString := tinyfd_colorChooser('A tinyfd title','', lArrayOfChar, lArrayOfChar); + writeln (lCReturnedString); +end. + +{ +gcc -c ../../tinyfiledialogs.c +fpc tinyfd.pp +fpc hello.pas +} diff --git a/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/freepascal/tinyfd.pp b/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/freepascal/tinyfd.pp new file mode 100644 index 0000000..5d62985 --- /dev/null +++ b/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/freepascal/tinyfd.pp @@ -0,0 +1,138 @@ +{ SPDX-License-Identifier: ZLIB +Copyright (c) 2014 - 2023 Guillaume Vareille http://ysengrin.com + _________ + / \ tinyfiledialogs v3.13 [May 2, 2023] zlib licence + |tiny file| + | dialogs | + \____ ___/ http://tinyfiledialogs.sourceforge.net + \| git clone http://git.code.sf.net/p/tinyfiledialogs/code tinyfd + + - License - + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + ___________________________________________________________ + | | + | If you like this new PASCAL module please upvote | + | my stackoverflow answer on the PASCAL post | + | https://stackoverflow.com/a/59657117 | + |___________________________________________________________| +} + +unit tinyfd; +interface + +{$linklib c} + +{ Adapted from + Automatically converted by H2Pas 1.0.0 from ../../tinyfiledialogs.h + The following command line parameters were used: + ../../tinyfiledialogs.h + -o + tinyfd.pp +} + + Type + Pchar = ^char; + +{$ifdef _WIN32} + Pwchar_t = ^wchar_t; +{$ENDIF} + + +{$IFDEF FPC} +{$PACKRECORDS C} +{$ENDIF} + +{$ifdef _WIN32} + var + tinyfd_winUtf8 : longint;cvar;external; + + function tinyfd_utf8toMbcs(aUtf8string:Pchar):Pchar;cdecl; + function tinyfd_utf16toMbcs(aUtf16string:Pwchar_t):Pchar;cdecl; + function tinyfd_mbcsTo16(aMbcsString:Pchar):Pwchar_t;cdecl; + function tinyfd_mbcsTo8(aMbcsString:Pchar):Pchar;cdecl; + function tinyfd_utf8to16(aUtf8string:Pchar):Pwchar_t;cdecl; + function tinyfd_utf16to8(aUtf16string:Pwchar_t):Pchar;cdecl; +{$endif} + + function tinyfd_getGlobalChar(aCharVariableName:Pchar):Pchar;cdecl; + function tinyfd_getGlobalInt(aIntVariableName:Pchar):longint;cdecl; + function tinyfd_setGlobalInt(aIntVariableName:Pchar; aValue:longint):longint;cdecl; + + var + tinyfd_version : array[0..7] of char;cvar;external; + tinyfd_needs : Pchar;cvar;external; + tinyfd_verbose : longint;cvar;external; + tinyfd_silent : longint;cvar;external; + tinyfd_allowCursesDialogs : longint;cvar;external; + tinyfd_forceConsole : longint;cvar;external; + tinyfd_assumeGraphicDisplay : longint;cvar;external; + tinyfd_response : array[0..1023] of char;cvar;external; + + procedure tinyfd_beep;cdecl; + function tinyfd_notifyPopup(aTitle:Pchar; aMessage:Pchar; aIconType:Pchar):longint;cdecl; + function tinyfd_messageBox(aTitle:Pchar; aMessage:Pchar; aDialogType:Pchar; aIconType:Pchar; aDefaultButton:longint):longint;cdecl; + function tinyfd_inputBox(aTitle:Pchar; aMessage:Pchar; aDefaultInput:Pchar):Pchar;cdecl; + function tinyfd_saveFileDialog(aTitle:Pchar; aDefaultPathAndFile:Pchar; aNumOfFilterPatterns:longint; aFilterPatterns:PPchar; aSingleFilterDescription:Pchar):Pchar;cdecl; + function tinyfd_openFileDialog(aTitle:Pchar; aDefaultPathAndFile:Pchar; aNumOfFilterPatterns:longint; aFilterPatterns:PPchar; aSingleFilterDescription:Pchar;aAllowMultipleSelects:longint):Pchar;cdecl; + function tinyfd_selectFolderDialog(aTitle:Pchar; aDefaultPath:Pchar):Pchar;cdecl; + function tinyfd_colorChooser(aTitle:Pchar; aDefaultHexRGB:Pchar; aDefaultRGB:array of byte; aoResultRGB:array of byte):Pchar;cdecl; + +{$ifdef _WIN32} + function tinyfd_notifyPopupW(aTitle:Pwchar_t; aMessage:Pwchar_t; aIconType:Pwchar_t):longint;cdecl; + function tinyfd_messageBoxW(aTitle:Pwchar_t; aMessage:Pwchar_t; aDialogType:Pwchar_t; aIconType:Pwchar_t; aDefaultButton:longint):longint;cdecl; + function tinyfd_inputBoxW(aTitle:Pwchar_t; aMessage:Pwchar_t; aDefaultInput:Pwchar_t):Pwchar_t;cdecl; + function tinyfd_saveFileDialogW(aTitle:Pwchar_t; aDefaultPathAndFile:Pwchar_t; aNumOfFilterPatterns:longint; aFilterPatterns:PPwchar_t; aSingleFilterDescription:Pwchar_t):Pwchar_t;cdecl; + function tinyfd_openFileDialogW(aTitle:Pwchar_t; aDefaultPathAndFile:Pwchar_t; aNumOfFilterPatterns:longint; aFilterPatterns:PPwchar_t; aSingleFilterDescription:Pwchar_t;aAllowMultipleSelects:longint):Pwchar_t;cdecl; + function tinyfd_selectFolderDialogW(aTitle:Pwchar_t; aDefaultPath:Pwchar_t):Pwchar_t;cdecl; + function tinyfd_colorChooserW(aTitle:Pwchar_t; aDefaultHexRGB:Pwchar_t; aDefaultRGB:array of byte; aoResultRGB:array of byte):Pwchar_t;cdecl; +{$endif} + +implementation + +{$Link 'tinyfiledialogs.o'} + +{$ifdef _WIN32} + function tinyfd_utf8toMbcs(aUtf8string:Pchar):Pchar;cdecl;external; + function tinyfd_utf16toMbcs(aUtf16string:Pwchar_t):Pchar;cdecl;external; + function tinyfd_mbcsTo16(aMbcsString:Pchar):Pwchar_t;cdecl;external; + function tinyfd_mbcsTo8(aMbcsString:Pchar):Pchar;cdecl;external; + function tinyfd_utf8to16(aUtf8string:Pchar):Pwchar_t;cdecl;external; + function tinyfd_utf16to8(aUtf16string:Pwchar_t):Pchar;cdecl;external; +{$endif} + + function tinyfd_getGlobalChar(aCharVariableName:Pchar):Pchar;cdecl;external; + function tinyfd_getGlobalInt(aIntVariableName:Pchar):longint;cdecl;external; + function tinyfd_setGlobalInt(aIntVariableName:Pchar; aValue:longint):longint;cdecl;external; + + procedure tinyfd_beep;cdecl;external; + function tinyfd_notifyPopup(aTitle:Pchar; aMessage:Pchar; aIconType:Pchar):longint;cdecl;external; + function tinyfd_messageBox(aTitle:Pchar; aMessage:Pchar; aDialogType:Pchar; aIconType:Pchar; aDefaultButton:longint):longint;cdecl;external; + function tinyfd_inputBox(aTitle:Pchar; aMessage:Pchar; aDefaultInput:Pchar):Pchar;cdecl;external; + function tinyfd_saveFileDialog(aTitle:Pchar; aDefaultPathAndFile:Pchar; aNumOfFilterPatterns:longint; aFilterPatterns:PPchar; aSingleFilterDescription:Pchar):Pchar;cdecl;external; + function tinyfd_openFileDialog(aTitle:Pchar; aDefaultPathAndFile:Pchar; aNumOfFilterPatterns:longint; aFilterPatterns:PPchar; aSingleFilterDescription:Pchar;aAllowMultipleSelects:longint):Pchar;cdecl;external; + function tinyfd_selectFolderDialog(aTitle:Pchar; aDefaultPath:Pchar):Pchar;cdecl;external; + function tinyfd_colorChooser(aTitle:Pchar; aDefaultHexRGB:Pchar; aDefaultRGB:array of byte; aoResultRGB:array of byte):Pchar;cdecl;external; + +{$ifdef _WIN32} + function tinyfd_notifyPopupW(aTitle:Pwchar_t; aMessage:Pwchar_t; aIconType:Pwchar_t):longint;cdecl;external; + function tinyfd_messageBoxW(aTitle:Pwchar_t; aMessage:Pwchar_t; aDialogType:Pwchar_t; aIconType:Pwchar_t; aDefaultButton:longint):longint;cdecl;external; + function tinyfd_inputBoxW(aTitle:Pwchar_t; aMessage:Pwchar_t; aDefaultInput:Pwchar_t):Pwchar_t;cdecl;external; + function tinyfd_saveFileDialogW(aTitle:Pwchar_t; aDefaultPathAndFile:Pwchar_t; aNumOfFilterPatterns:longint; aFilterPatterns:PPwchar_t; aSingleFilterDescription:Pwchar_t):Pwchar_t;cdecl;external; + function tinyfd_openFileDialogW(aTitle:Pwchar_t; aDefaultPathAndFile:Pwchar_t; aNumOfFilterPatterns:longint; aFilterPatterns:PPwchar_t; aSingleFilterDescription:Pwchar_t;aAllowMultipleSelects:longint):Pwchar_t;cdecl;external; + function tinyfd_selectFolderDialogW(aTitle:Pwchar_t; aDefaultPath:Pwchar_t):Pwchar_t;cdecl;external; + function tinyfd_colorChooserW(aTitle:Pwchar_t; aDefaultHexRGB:Pwchar_t; aDefaultRGB:array of byte; aoResultRGB:array of byte):Pwchar_t;cdecl;external; +{$endif} + +end. diff --git a/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogs.r b/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogs.r new file mode 100644 index 0000000..b2ae3f3 --- /dev/null +++ b/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogs.r @@ -0,0 +1,157 @@ +# SPDX-License-Identifier: ZLIB +# Copyright (c) 2014 - 2023 Guillaume Vareille http://ysengrin.com +# _________ +# / \ tinyfiledialogs v3.14.0 [Sep 12, 2023] +# |tiny file| +# | dialogs | +# \____ ___/ http://tinyfiledialogs.sourceforge.net +# \| git clone http://git.code.sf.net/p/tinyfiledialogs/code tinyfd + +# - License - +# This software is provided 'as-is', without any express or implied +# warranty. In no event will the authors be held liable for any damages +# arising from the use of this software. +# Permission is granted to anyone to use this software for any purpose, +# including commercial applications, and to alter it and redistribute it +# freely, subject to the following restrictions: +# 1. The origin of this software must not be misrepresented; you must not +# claim that you wrote the original software. If you use this software +# in a product, an acknowledgment in the product documentation would be +# appreciated but is not required. +# 2. Altered source versions must be plainly marked as such, and must not be +# misrepresented as being the original software. +# 3. This notice may not be removed or altered from any source distribution. +# ___________________________________________________________ +# | | +# | If you like this new R interface please upvote | +# | my stackoverflow answer on the R post | +# | https://stackoverflow.com/a/77091332 | +# |___________________________________________________________| + + + + +# Load the appropriate tinyfd library + +# Macintosh +dyn.load("tinyfiledialogsAppleSilicon.dylib") +#dyn.load("tinyfiledialogsIntel.dylib") + +# Linux on Intel +#dyn.load("tinyfiledialogsLinux86.so") +#dyn.load("tinyfiledialogsLinux64.so") + +# Windows on Intel +#dyn.load("tinyfiledialogs32.dll") +#dyn.load("tinyfiledialogs64.dll") + + +# R interface to tinyfd C functions + +tinyfd_beep <- function() { + result <- .C("tinyfd_beep") + return(result) +} + + +tinyfd_notifyPopup <- function(aTitle, aMessage, aIconType) +{ + result <- .C("tinyfd_notifyPopup", + charToRaw(aTitle), + charToRaw(aMessage), + charToRaw(aIconType)) + + return(result) +} + + +tinyfd_messageBox <- function(aTitle , aMessage , aDialogType , aIconType , aDefaultButton) +{ + result <- .C("tfd_messageBox", + charToRaw(aTitle), + charToRaw(aMessage), + charToRaw(aDialogType), + charToRaw(aIconType), + lDefaultButton = as.integer(aDefaultButton) ) + + return(result$lDefaultButton) +} + + +tinyfd_inputBox <- function(aTitle , aMessage , aDefaultInput) # "NULL" for a password box +{ + result <- .C("tfd_inputBox", + charToRaw(aTitle), + charToRaw(aMessage), + lTextOutput = aDefaultInput ) + + if ( result$lTextOutput == "NULL" ) return() + else return(result$lTextOutput) +} + + +tinyfd_saveFileDialog <- function(aTitle, aDefaultPathAndFile, aNumOfFilterPatterns, + aFilterPatterns, aSingleFilterDescription ) +{ + result <- .C("tfd_saveFileDialog", + charToRaw(aTitle), + lSaveFile = aDefaultPathAndFile , + as.integer(aNumOfFilterPatterns) , + aFilterPatterns , + charToRaw(aSingleFilterDescription) ) + + if ( result$lSaveFile == "NULL" ) return() + else return(result$lSaveFile) +} + + +tinyfd_openFileDialog <- function(aTitle, aDefaultPathAndFile , aNumOfFilterPatterns, + aFilterPatterns, aSingleFilterDescription , aAllowMultipleSelects ) +{ + result <- .C("tfd_openFileDialog", + charToRaw(aTitle), + lOpenFile = aDefaultPathAndFile , + as.integer(aNumOfFilterPatterns) , + aFilterPatterns , + charToRaw(aSingleFilterDescription) , + as.integer(aAllowMultipleSelects) ) + + if ( result$lOpenFile == "NULL" ) return() + else return(result$lOpenFile) +} + + +tinyfd_selectFolderDialog <- function(aTitle, aDefaultPath) +{ + result <- .C("tfd_selectFolderDialog", + charToRaw(aTitle), + lSelectedFolder = aDefaultPath ) + + if ( result$lSelectedFolder == "NULL" ) return() + else return(result$lSelectedFolder) +} + + +tinyfd_colorChooser <- function(aTitle, aDefaultHexRGB) # "#FF0000" +{ + result <- .C("tfd_colorChooser", + charToRaw(aTitle), + lOutputHexRGB = aDefaultHexRGB ) + + if ( result$lOutputHexRGB == "NULL" ) return() + else return(result$lOutputHexRGB) +} + + +# example R calls to tinyfd functions + +tinyfd_beep() +tinyfd_notifyPopup( "a title" , "a message", "warning" ) +tinyfd_messageBox( "a title" , "a message" , "yesno" , "info" , 1 ) +tinyfd_inputBox( "a title" , "a message" , "NULL" ) # "NULL" for a password box +tinyfd_saveFileDialog( "a title" , "/Users/bardos/Documents/test.txt" , 0 , "" , "") +tinyfd_saveFileDialog( "a title" , "/Users/bardos/Documents/test.txt" , 1 , c ("*.txt","*.jpg") , "some files") +lFilename <- tinyfd_openFileDialog( "a title" , "/Users/bardos/Documents/" , 1 , c ("*.txt","*.jpg") , "some files" , 0 ) +lFilename +tinyfd_selectFolderDialog( "a title" , "/Users/bardos/Devs" ) +tinyfd_colorChooser( "a title" , "#FF0000" ) diff --git a/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogs32.dll b/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogs32.dll new file mode 100644 index 0000000000000000000000000000000000000000..ce7760557b189f35e0f8777b07863f7f7fff9c46 GIT binary patch literal 161665 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 literal 0 HcmV?d00001 diff --git a/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogs32.lib b/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogs32.lib new file mode 100644 index 0000000000000000000000000000000000000000..6435a7a24c273d3d012ac43a6a713cb34030d2bf GIT binary patch literal 34048 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

9<8vIkZ-U>jnOWNg63T~(z(ul9P&~2j?!e|TD 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 l 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 J_xdWv{u?^#nGFB{ literal 0 HcmV?d00001 diff --git a/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogsIntel.dylib b/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogsIntel.dylib new file mode 100644 index 0000000000000000000000000000000000000000..05d9eafbec5d7bb6464fdcad63e1628d61fa50cf GIT binary patch literal 139984 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 literal 0 HcmV?d00001 diff --git a/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogsLinux64.so b/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogsLinux64.so new file mode 100644 index 0000000000000000000000000000000000000000..c7f37576fd47167f08d111361412c1df7677c26a GIT binary patch literal 134744 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 z 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 E0l{Bfj{pDw literal 0 HcmV?d00001 diff --git a/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogsLinux86.so b/tinyfiledialogs/dll_cs_lua_R_fortran_pascal/tinyfiledialogsLinux86.so new file mode 100644 index 0000000000000000000000000000000000000000..1b0fc6770b0c2965a690210074861bae67bf55c0 GIT binary patch literal 123764 zcmeFa33yc1`3HQ1K?6o7Xw;}t#u!b|goH&!77apFTp-9I)&)Z{A%RIIW@dm`P}0d% z(lLq(6_;9E+S=BCYgKTiMPnHkTG482Ypt}!_Kv|8Ev?q2`F`*Fo_p`PcP1hD@Avn*OZ3ns+1h#s(Bnf9n8{{;d4jl%L@r!3TTB zCCGQt2T*?eQGHzanvd%N_&aarJfo$d@U~Bmn;(7aqo@AXyZeT#Kb&}1@kz)#9e+9M z&&V5bZl!U8ajUU*^)X*L#>kp>g7KBAyfp``%fB?Q*ceJ>&%ocA_|yMQLgH-vO~v0d zJp=dC@mGz%^VIY6alKI8U!<`e|z$&kGmIcsapQd@uyYS9~(X3y@?~AI;gSb zf%pGbyZxT+Qx`vf;M4ibR(H*tzvbB_cYYLVO1yE>+PYWYx%sGfKUs2TVC$2o-Cj`k z$jYv~p6;8g&a%j38tJE+6r%pYjEo08Y0{_l&ySnqJo#m0Z0aA?pG!(r|0w+%Px%s0 z`O7`!hk5erJo#Voz&qNLzuS|4fCpZPj8Od}`p&fyxEA5>EKmIdJ?Uv4e5O{P;JxC> zAL~i~#6yn;-teP-t@eQ69q%cBlqa3)GJoz_i^ua|LpL^hwkFfqx z{dHP-O8>{o#Ff$)Yxx9kya(Pz9(e!q)NkA9~VpPx^FE`YzxseKm`H+z8_+V<_zHfK^!r`Juy%T%!l&tIA<(xKesE=s9Di zVJuMj#d!Y1Qp0#%rLO~hZ*7BKMoal1@_&7bVeD4<6n-KVhLKR|`%(VQe;US`lcoF# z!2b&HH>muLz;_g!8Tn(vzZB&kddx5?AWTaC80E?|`u)g%`YOZt0M3o_JCI+j<-d${ z71G2o@%tpoUk#;|f=4Pp9?wsMQ3e%$@{v`~X0cx%VH|0^h4eh*UZQ=9zI6Vi+T&7bZUo`e;d-zooX20ROv9T=L0^#F#LSnoCSH@ zqVnr;^=tgx0Q|23Kg9)tcOJ^$3;g8IDg6QPPpHo_UM`UIdnkVg0zy5mlz$Db*J|{? zfb`9pet(1XUy*(UbTWLT?>pT|9|HJ$fh>tDTGHOR|FdX zpeHgGs@N6~9ZJ1$?XtkRXfq;c3mWN8drAt^Y$zNE!qCnQ1<|72_3A)W+qA|IOca!n zP8<%|Xe^Q_;YE!{9=u#C12U9!VOmIzrf%uNy2hmo8)}<^MzCp7-RN*=^y$WV7tJ_l z+QPA;&#>>tId{(On9qm>)EI*QS^P_P*8cRM|)h9lxsp$|Jp?pIN!OzRhpy)%cG7hQ`V@3M!7%pF6$72UbVWbn zW4g{ZjL+zben{?CNCNRIkFJPc`E&)11#}&Xu`XQ^=>2qs1d8d3m{>~JgV4XAD;TMy zD3XnXOr|SBUlm;;;pudphB!{wD#N&lu7_eAMpqxk9CU?J7SI(Ptt;p{ z8T}Bt&PQyfD+Y#*bVWZWNY}#+qm`~0h(_poiD9gu>k)>rlCDP@#%j7AWf+}woq~P` zT@m+hq$>t|Yw3!9$U3?ni{Ua|3k~CLx*msq4PB2nj0fmC5@Rd6`qAH_>sf~JFkOob z<1xBkY8X$@^+dyXhOQG0V=G;Y4dZ#bo@5v=(6t15rfVtmOxID+GhNXqe3P!|IQ^ck z=mYJfYZ>%R*UO-1x}smUo37|H?x8E%<6gRsfu8AlF7!;-u`o2)*Fl(9$foNBuyneP zhyLk$8uGvV_oW2Bl)#q~_)-F2O5jTgd?|r1CGe#LzLdb168KUAUrONrCldIF@AyyW z#CGSHb1=ct(esaQXBmmu&c43B_}0jfz8$gWb1v`ES?zli<&3`jX`Y7u_1%w&45N{5 zQ&g?*ewsaMr0moVPGbVXXrza!t(?XLgV9JosfRg@2?e9kPw9=ErrSo0{*BaHPGf?= zXv8SqNUi2HWi?KqbStMZ0bn#%QTl35Q_;rrDP6;94Csx<8cJ7jnyNM~pmZgtF_B_4 zUQKB~r>iL4Na;LIPp5P%r43FK=*AV4-t!+kxc?$bucq`)P7|ueHI&}LX-uRTjcX~r zmD7Z}aRa3v=JXYm-bm?nn-JWg3_&=4pMq6rLX2Rk=pnI zrE54Hq4W+)S87A7Jb9yzUO-ko+x|7m-C~a_h4W&P(^q$X&{~IZ7 zV7e@|lhbP{okQszoL)!iJW6ln^ae^7Q2Jp`-%V*hr8jbVBc)3zy_VAtP`Z-Rt2zB3 zr6*9jmD3MVx{A_QbNXRQpHJx;PCrKJ8cJ7j`Uy%epmZgtpP}^Cl=gFaE2SGLoyY0t zDcwqGgVQA1#ub#_^BM8Kozkl*y_3@<>c%yc-ofeDDZQ4`TRBalZ`?rXhdKRwN^hj} zMo#af^n;XM%jsQ|ewfm$IZdi*e1g)goZe08t(3l+)1<1#7bsoB>AjTRLFp<^lj<7Z zq;w^xKcngPRDbJyRwY#Z(zmJ=>8i0p7}!LxWw09Kvnpi!{>Fq8{3^fo7_*{i#^?u zlZ~}K-H&0W7IS=L4js>3i25isM~4yHojvM>uAXPjk!`9A_=&Ot%=zdN%Gz*+q?5oJV65;0;2G>wSu&h2~D4_?iq z@dR+pF}QAvQNb*MNpupt)TPKtc5DN&hvJT|2g(({E=oQI+>V|NSORBCuCOV2Mc}1Vve}gpISQ1- zwq}tIiHscB8R+ai8V?j@|NKNA^+Uljrr=1XAjgQz2Zg@PnD>rcL}~@d?+D25nm%M@ z?EpnUi6Xwux8*=ZzRg>Gn_nBX1Nu3JYwR_{QiG(hH)}^j(x@=jYFrnaLm20M8=&>- zoUZC!iR#?0>Yagm^PyM3AG0;KYNz4rydBBds$E8;ow?c7UA?=;JXzSmeQfJcC}2t6 z5~If4Ax{bA&e+x=Yx1^Le_(K#1MD&nxyocwnZHXJh)=;;qm@~c*INK^&>jQLvTlap zW-V9?oH~>Ujtn*1E(Islb}W0m6c2_zd%M!=<*`+e?3Bd3oY-?ie47vRZT=nKXYu_@ zxaXVKAig=XFX>)8oGc&OgY|yQ^!SO8T*jXZWm`8wh=VuZ{5~Y#(K7>xyJN=#N*AO= zTFf=y`L{CQJw#0O;6!ykz@%JN@X2hWEr zqu(T1LW(Dev^rml9E)n*Ye$N#av-Z4g++E0V2d0D`3p@k`6lVNqo>q@Hr%rI=t1mM zdM6Oj*eC$y=9Ch8tX8NB!7V_hd(F3m4>y*M-JL*cj$}kXTdz#KQ#Wp)sJ3Efl-^>3q(swh|9P|V`MmUnz|QdD7T1m z7khJKD)(y2onhxH-`yy{d(Vl%HHaUXTpB4?cMBsYnw!B_B2OOpe!4YlYt|0mGge9p`5%ClMCYE`gVzE`in zEK3F9K6SHI!4^QPUEzpCj0GSSlq_o9vN%UC&9acvN-X2tV#(J_vsk2be-g?!Kl~?I z!mYO`XJJxbAgWsAyG%R#@MFcQx~k#B_t*uVM*$9?yL;!bU*1gxc4zlR_w+^Ki{WoS zU~wkq!GFUS!|$`FFwMV6v_qppgWHo;jeK*Pu`*U|QrkqN;rNlWWF-KZt3=zDFI>kk zcANLvFvhAU5v!n^iYwEo=p6=pF;n81(=Y1SjfQHNZ-d*8o>dqgXudNMn|uIyf%a-3 z>yEdeBUfYICXnGpi&+y}$v~~lufqno`v@1WbsxJJkbpyw3Y>a`isj#(<#Ckrn2vwm zoMyf%8jNAKbIi9bwk4{0V#SXo*A*)+ozt<~p95AuL?-kP6yzS`yU<`Xo|Eyth^}>^ z=H_JlW8BrY)cce1&u~}1%x`qBr?Ch7yeB`0DRlkjA3uZ?`Zf`iZmwEm{!xU$G9zF$ z<|`tzuIHpk){dm%AA43svMReiund=+mS`~8kgUq}ldo4H(E>MCz;(q<;2=}mL^sm$ zj_<{7jrr}rE3x}Jr$X$2v1B5ubKW>hU%vQBoR_`ifbLjQv?fKWtTyE99KuC%1&8?? zofC#ORG`6*e49ImQuWEhqsIxWTws@~0z;F0rpBi8*t)6ql|>lech|yYSoZGiou~ z$z)_KW%CV@thcrY)wfk`ScKuS?`_zI-5vP&@`YD&Z?$80F~X|Z3L$p%s~VocnBEmiyW+cnfQ^Z6#F%2M zu~(_ayu>O(!)lfU6)|77sDOR`k%Q7EDqudkn;mJqlHV9sxiA2$FbGe@560`i!CwCe^_*()MBetr?=EEv{F;8 zQfp8u!4Toij!nd<7VbtQVw8hBt=0bLyRcib`;GqAX=vR$a-*(e364VkA6s#I4 z7Cqfq?HIQ;=5Kmg62MHO@;(u;(ubJlk}8ZOBX-ZjQnUR2tn6$$3EcZ^z?g7n`GFc03RmVXGhOefcI^VT@Cn?Pw~Zjs3}OW zCrRdR;~XRPLp(PtAPThFtCIY%BGej5#_CbA0$Vndu}0k01}hdNV?o?CwN%t6W36*6%!-iF=}9g^J6%zWz=sxZi#6cdZ{;_vK~3}^MX!Lh z+3nc<7}5V@h`ys|R+lSUn!91gUGW9fHRE3)&d(a7r{=#&@tE+4Ux8F?3;o(1i;3d5 z`!>hHRkt3=8nBfw%I3k0?0LH*fOiD2`Dw7gPuiQw2a?MsjhfE=fIxm#yrQW z&}db#n$m+B*g~t+Tq?DNevS46Kl&CY$u=3*zm!p|rxXUB@t}e!3@CDUrkHP?4Jv0& zQ24eG>BjX%u`NW>u&6)5a3H_Qi=u~jF!J@^9g}sPyHgQwMd^h6>K^KYxlF?uJNRp`dBeMX0w zZ@_L*^aw5*ZuFNUfMiq21C8Dhm{DapCgfU{AqV!@a( z$yg5EEoy2>#&YRyMI?X*n1|c8=54XVa76KaFeVm#akM!KTo<1$m-At~4)n$9-eapK-$2B$`K?qssXlrh2QFPP> z_d&-;GAe+n>vW9EL`NVK9m5nIDKIO#UW)f?gbsQqM>A?S{~7Tv9;48H0{1BFMw)`?T(W7e=$G4Dtigm!%D)g`gW&f5KMS`p8|{jQ zI;HLL<)n8qI;D5=FQoTFaqX9)K5GQzqG(bkiZa^Y2u0BcSX&Z7(0e-~2N2XI6u}T{ zAsnJ8*e@xOjHEm)2;9QSNXpm$B*JO1NvR%;DSR%YE|2A(nF(!13-l?pf45zJU|Ca8 zB(N;fzvag>;(b=2x!KK#_x3*uyUT67t%G6r(2Qs=7&KbHLQ5-#*j;cLzk9aTnW~O^*+} z{%XyYwhFy&ftJ@JF5<1UMTm>R0LAp&+PVk=VqRN2hxmN5up_w9jOxFS_eae$P)JRKq3$TFZd>NMyv&&gO?UJ>jM|CV4%Od_9A>@`F$3>Z z^K`BoonY=lK|Con?|FwQ!Nf8K663fJbvYh!c#aG+pW$)?EQ#I&4RrL-`>q&ILPU0V zauUN@rH0g;CnfCeWXJA&n3;J6L-=f^t4E0;DFgF$^;i~j4g)N+08+kPs`Fc13Tomt zmG0R2T=;{xnG*~=X`oFLNOZ$nB`~3Y+ZyvKDFS6+E(i6SsG^m5@9!;13{NsazyhzW^~u8};hzxcY}O=IDx1UP6BL1+dql_KuziS6{1F-@w%$wW?EI zBF4XZ_4Qo+G_Fpsr@;`;VWYa2t4FNrl$VG}iHM&|JjNxqN?3wbLfDi~|D>dg%`!%` z{aTXJ1|89#7|g*IBFeK$xDZ{cBcf7*h|B97^+3HHJ#~!eZb2j?r4%E&Pey=UG0IEu zFRUofY{dWrH?9$zi-DyK_h5#*QHT2>!@aWylmOgh{?#ZjM)?W;rI_mF|3=|o2pee9ZIKia{t2dse-V${y-_jY|2g6RH;R8uAPN6e zA|wAe$imeQ>fR#e4?q_u5qk`k?9lNGhJ2113v!-S0(O-rnEG#D2Q%CsE+e>4=y2a) zxbLZ959e7W0QZTH_t6d>g*|li%wf3C2;3^RP6?aEmNb3qxB52kz;q$D1`XSR8Ae>W z+}n(QiG`nFBw_+7aRiL69EVZNg`XD^>{U&R@e_#gGptOD@y#L$+P@XaO)>&>W{h6M zE+U5hxf>2W6^_qkbb;4dNETJ#nEHDIaGY(9g@twWycQ;oUto^a)ZGGxIKtwV@~jeo z`_4c20rz)MVn@%l40pQ@_bP__EmA2DvGXMMqwxn=8&cla z`AwwQV3pmsa@C*zO1K;#UW}C@AR5cUFrPc9BKnF57Byz{HD&ZsOsv|bei%3W`x(PD z(Rh-{B4eR8Br6?_l4XwH%c?>YA<{E>(Uvigr`}6B4u;s#v*j8xiZ^wMJil^p|)zF+eZn=dk#Wo&dxBy$<(DhWmg8m+}%ZDFL``1Ho1LB>&LSGaR5@QGX|6 z@pUbLY?3ib(LZw~1WRE~t?$}h{4Gq!p(6H-%X&&PUwu_+#@9)c$fOaKGe*QtgH5ct z5JpVBh;96mpj+j-MDf`1hsrhPCz4d5bqg(Kjkpd@fB;~o&giYfN-Z7^yY4IUkXY%R zsUdzs0sMGK^b9s77rJBI=n_`pk=Mby5E6>hnvubu(o+D!sAC6<)wBJN^48Tm0HaHW$igx`o@ z-3?7PkeKN|^})$l8YBWNHxI>9BD z?x;_24O;V~D)M;B9(WFFoj%*aJpsDl|N zIM+2{&~~aOH5&1s05j?6d3GuJ{@qGW)VWD=ir7!a=A!r6+8$|4#unf%)G|(*3_Y$f z|L~U5dIY2s1R`Cd6rP2iimg7)L1Es%?=> zTc@xy%rGB^5<7Y>UE(s%WIXa8?2ej)b+z~k+|~JuBFXql+_kk&9G;A?#@(={=GJ7q z6L+Du2=-I0!Cho2RtV!a(p{i!QZl|4cf$iK>XPwwxC^vKCMM$>=-IH=wq*Qn+~E+i z(qw!i?kY!3DoVy5z#Yk|d;NpB<0Z-`aoh~=%1Xrcf&&buu(g2h=%4x0=iDSGV|^VJ zpeNRUcWmg-#oFni`Jq@Ixl}bfmh%UeTo(g!+XaCZAsx^qlwmB z(jD`&8V-HIvUR2bYM?y`tcFLSA&(kbMQH=7;j@!nYM75EaW_Jm`2dLR=$XFQ(ZjAW zTf5iS!_vBAK@jugX)KVgZU6XA*PgCVe4BID4DVilrX{a6Lt@WmHFV*3$dkiu(S62b z`?`)nt4qcxMgPn#@R6W>9=jSPx_b5ptAye1I3b2%^HbZf>)Ei67Hea<%99H5B3+Cj z!M_l~RlLpA#-rMZ;5lLtczz<{)bJ!_4#~pf_)Nhm4XBzmH+P$*IeVPU+$x5y;6fEv zA(0c*n}tasR`2V{H1*zsN3foB_3m;uq8^96k==p4mtUoJ>fyC7^F{E{(bE*5jcQIu zV>)oxnBNi#tc8g~!7PpWzbmLT6FmZT@u~+j!u6t{AGFwS=v+#ML}#y>mov6capa{n z9DpI2zr*wo_?pBNB<}nVHuelLcM6d1_%7&`R(;k0_LDeB3k}a@XQ@}oM9=vf!SHor zE3#q6Y5M%*tm_cmsdmz+ZD_?#i0s;SKW#*v(;kjsr6|x`aS>LEnijQTcSU|%d&L~= zpa?}?fFBGl~172NQQ!C&_u!(|pWRzgRv??zc z^b@?+)*v7h)Ya1Fi^5QgzXAUyU6Z%W(Q3c4UN${J2zx{EJY1e4w?&Nd1R| zwL`>G>WE+$iQq7|2p-RA=o+5-1yz{y7nWnlqO!r}8oNPq8vH@fmAkB=30p++%A5S) zAit?4Fa=aLOc_5OR8~%`N6KG0ddz9y+FxFajV7g$P+$e9Yyy{{vL#ecdoRa_Tenr6 zZlvZB-UcD`Yzr?P&el3;msU5L;vr<0`>jp3ytjDn@6FqFAKCUxH#+)Y7J%+_U`H{0FL*RbaPC zReq$MRxGvF#horTWca)gBvNA@j`=sVFs;c-zWJVHbj5eV?qgf%*O1pKH_^TM9)?e- zXfEExrs4yHB?ekso77vIsD{6=UP61{@A4PijJLy0o9oavJ9@^~qBBan%csL*)B6JP zD!#$qzsY=)-xZ&L8?C7);}_up^kpRDHTK{jk&4UL5&>g#*sw!N^DgeE60bmQEHzNF6 zmXPv+KvE+d>~2JX*cL)!6=Q@id5T@l#ROU*tLq63C%yi|P8%UFO@Rv+QYpaViA+HkKPfDn@ zIf$FRh`XNcj=cbRK1GM_Cn~$fBqDjAbwx&e*4>^R`|D?;{ypl2te0Yc`s~^FhIDP~ zdi5XQu{2hkU|W^Vt4BeAVlRrpp`sQC@m_g=cR^WH{03?f#52TJ!dDaA3Irftjk09* zl(%NmSl&dAFq?Mgk*os#qHR^V;1V>DohTYQM28NfRxc#H1*>SVv0daX<6vv5!?t3) zgTYFTZJ}ml@Z6>}sqUB$ot_%=2U{%D8Reks5sI9!0cL`iybuijFe62W?b||p+%3d17UFSFD<%5kx4VQ`pN?@~LWB$< z(P{8NAdNgwu!v;pCz%e3G|;c_W)p6N&82g_+-3RVv~AfD)_bB?o!7xhJawZB&VBm_ z#}az)42P73`v<~f!)qNtN2UYnPk)eK9?6ePG6*#uY4k340R2Mrr3=TamRT2)ZLfmZ zZTq`Dz1Bb?opqtt{^q9x7*(QUIL%vt;>HA+*i%1&QU(<_Y-&?arM2I3#4Q**d;%ZHpadp&jK=$2{X(mBaS-me9FBJTH|| zPuCsO`!Fj|iu*9pWJdAZ|#un!NyLIBo7$hS8u#v*uC&dw9}9<%fOTAp~V#a5m# z{w}q76>G2Nf_ij3%PJV5o}oJq7g>2xydiCQ>ShRu`hr^QSYF#k1B#}W#X18*$R9Q- z2BPB~7^Bi*v-%8 zNCy}|yCHyWMsK?%G98+9C=Sj9ZGJkmaHtLMCsbv(8@;DGyqBjJYz{A8#C)uvH$j}D zL%c=N+oFyd_4uUIpVn)9MQC$i{8V)4h>dz|meEBbn&C*FW%Of~z7{w@+Py&7bZK}U z2$xf5yB32}@;9@VqB-Z4m$y)7yF5r+Vha#|;js&q$My$-T!tdc^zLetgYDpq*tl;N z36j^(AtCTPm#*IGuY`05&~qXTFYit}5)+;DsKqi)tFX-c>)yK5@+&cO^wg|Dw*1tB zYTf&t<^`BECN(vX_q*I*d^RyP#n0pQD<^@~yv9Ha^6~?9jSyvlf6OHAE`-Tl`sHD< zzj9Ioq*2;rq~4znSJ?wTFi09{{y=VyG(V7=L(Ec$lqRNL!jR3pi=X;BKjbzex*+f3 zcBv;lVoAksxm5c81=%T04jibw>eO=`uNuB~Dz)J-K0N_`rWBW63!9*CW}s4DJKhH; z1$}&g@1_9tx||KbUjaevy?yZuX&UVtKuy%1CB;-1aj%qev`HFSO&Wn?A5;KMy$=^_ z-pJ4+*IQ;dEsgb4eqynX)1ZFeM?+VB4*@Tc^DB;c>31<1pp0J6hMKL>YnlWQesk&5 zBM^YRR9Th3*hmG4j=74<8#FbXn?}n$4_maHV$nihErFPW_;3ltOy4end~@3sIS<1W z`XvYB++6zR3CN+(p1{E9%O^aXpb0EXB(ip{2iT)*G72p+uE94}$Qo)D;xh(9d=1F~ z-(;bgC{6QM+mfDVt^*2p^c^B5=+^ibjJ}%%lLN~WeWhn?M_6%&C;ZqFeyigdg6WX1 ziPE%PHs%;8cp<9ONMkAdALIqbE<~vY*oosYoM>y7oywqWL zRXXG#KGXzu!6(L7IiVnRGHGB%V?{i~#6o^keSp|)4AjE(3(@~Xo}Y$(G^LBdB@Cyu z$VffMM%Ujwz2uszp?c8bH@x6`3%y_w#VoRZP> zl6WC5w5^KXqO+n#O?n{+L=Rn4By_0|h$$fQzxouAHvKY0^x=U2Kpr@}OECB9amhnU zZV^7aL@Z>Jw=OpT^4FpA<>WzfYB8HmQPpB5mazsg6Ic#~7 zSYZx*gbEfqg+~N=7!j27+=1#7H*1#iGQvrXdCCth`H>^EtVrgj4z=_2{<2uuhd;3F zm1fJOo(f)Ph)Q}Z9I}hk$tHsW+3=H)at?jS%sS}^j`1|7YD%EFIPU+H6Kg~vy`76~ zBDLPm1}{L0t*=vToefbBW^kHXGFjKjd0v1?V-&hOV9t;34wyR|-5uzp(tqV7c#R0U zJMbFRvw_zLp}Rv~BN&F-{PM6kMBN>DjfSReRi_xKPw`b8a|E!EJ8&yU{h)xpC@x}`7Kk};TKHA zLew!v>T(CKuhSEE#YVsXJxiWi+}$f`%*^(HxWV?su@rs_ArZ7JKO};fTnvdIfR#cb zAPjML;AoU@6QxC?h3P~ME*fq7uEnAjjYgzH>n9rhRkWiE!;VJ#7+yV;UNv)!A{VAb zqlobD7(<;GkQ!P_L}=4jHv&$ra&Im6)}E+Bs0obnp8pnMIY3OI#bI9sLd#BH@aEeg zp&8%QgPlq&$dy=tE@{89;P~$-J@JN8cPtoU=cUJjzdT^+H!T*ND%|L?pdg*z!N!8O z1)3uYu-b1du;lY#dZkg50%#1`jUj(A{6o&!Mry<9aIufSD1rFlgOC^kZ%0x2eoB14 zT@v4<#0HhZ%OD>%PsT1L7K!IM`4?{tySe>&zkbp zZ=69P2Hu@F$|&1-Uj*&g#&*$)BM^#ZrJ(#Nd@yWKvCM(B+6ya*Pb7xnJF@BHg`g4E z1V@(}S~1%4;=az0xpx8!)+h3QeV^ji7k|^$dpRy0MQwN~bpw{#b77^tI7jO)*hy>Y zaF;Od@R>B6DQl3JBP8YuiFqJ#78IL*VHwSsr~c>~TW{EJSeVkupE`3|H9!_z1d#CS zH#woq*O_t)L1N0Q_u4{u(Itd}bo>y4Ofa?ZnqjG|JI&De7yH={{t+bdtLMPc@1h7~ z3-Yf021F}J`Ljfj8}w*)B?GoqFVXC+jW*XZ$7^Y@C>^oJH8cnVK%2}B1eyCGk;Sq? zbP{2q1;x(0Ns6lqutGG##nKC6ZC^w-8(fOHe!l@}vgw`W2>JB=29$1LYkRd7+;_#6 zbQZ&nq2*{d(X z?pOzWIW{46(nW2tDV6dLfTVEXmXzh9BQoR@_bhGnjBi=W(ndvJ^8%qrvW6l_4I0Uy zMn!WgbWbzJ3y?-d!)c`2;HUjxIbnYjP0{(!t)(eC%=S)%qv37YRRz2!8y)vi!)a86 zu@U0o-s%<~Y#3Zjt)I#8o43q@J^*WU;KBRZ?(Ex(-95O6~WA;Rq?X) zitet65SmM0v<87hC{#Rp7WGB2lZB4^ae(E1F<{fC&V;>8tESEf_Huqp?~KqPZfOJD z>37&-*x?dG;x5k6<*kKf6cUBoOFE z0%mOu3NU2b2E^Z;x4~w<+J*ThF^+zi&(J4nmOe>2LE%2h{Ul88lN{}WJU$)r{)y;L zmzLfY_34BT2AmR6FD7v;>%HrXL2?_Mt8X$R9pV6elVj6M54LZz`kP9P8Tuymc3yhl zHTeJA>5wCfACw=%ThK8*C}g^A^&&2sDdeMEdKS9P6z)VBh3@A>C2m?}cE8 zIt}sQ`X+aJAq?0z2}~N}TRUT9MSxAwx4?&@HskO-VzSWurU6Mu%Q4p+m2hR^4QY zxKKytF3@{r|KRVt)#Anm4`$NAZ-G>;C0|bgI|_Kl$~|RLO{}3Cek>< zg>YOZg#AcEoA>`r)a9nrT}`B++f8!cmE3mI8+0V|jZBr@l9{!X)HZPpZB%qB&dyZP zO{$o;mZE#_t6v1(cPD!kTdHgI-iiN$03X3-0~Ew^fK7G3P!EV|?b>+K+zuM#F2gIqJoXU7oJI@ZPSrwh)q^usg%un`eBXwN9#Gk6@thu$ zn-i9(?V!25k=~HZj?^{0KSXFNH{#(-idE8t+2AlQYXw_o@G&z#?S z;m4t*(+h;!E+hjD{@@YPf-jy$D*2~M?1fnEQ1n+y5C(k>3SIER>#Ua(1{yxbKrT0)RHy_#jwzxx{u z(am%_`AqD^B@4lhGq}#&qFGC^+ln@1(ei(Y^9m%du!y6$ADaPqLsoe?mRd@&o0{g$ z%h1+lK(RJoUw88*ou~sXzM@OKJYATHz=3%x$W%pmV*cTOHWL+Uqr~-TCbIknCFW?I zmz-zBdff6Fn4GRmRd^WD62*H<+A74tj3udyzIYMO#^v}m)s69%R?%2i%m>~>^-tl@ zv4dTr0f#TmBKfseU+2FxnWfKpPy4zhGi_XXlNTzDD|fw&aV0Gb4QgEZnyU{y#S1WL z;L8A~Lqe7QQ553Go^>*98IjG3UoIWEoSa4&+wWk)S(_*%>8v3T4e`n=?$Qqvnt5$bMcP1+LE2ZSsNPr zx1+EA7!5A$h583f$WGzn|0g+Yi2 z0)}F+VYOJj246}$-Lcv1CZJ1o;m152b5#`iCQw&%0cL4wpTnt0SRIn|-Q>Ujn$^tg z-Q@U62nFN1rWSgC6|W}pZgMb>x$q+axR0hvole5=PKMwxoRS9)!)W>?*eggUe-d>c zksR#xGjvs5ybAZ0g|CyC_(2xf+$MeqJc%A>}GB2=YSEJeDNw zh&9n$CIcEAKh?+UdAzQZ<3;n4Ja9NBENa6Fy&91NvVj$GQgzst>kFYv99n*q4k(Rf z*IMW*QJ(`Lm=3`q1^C68W3rQOWM{9o5IZ`(b_V=ZRrRbt@9;=`w-DqOg&&BitA#xQ zKj$WGcfBNBU%Hy1ka2v+)#UFxvl$@gW3V5E}iT)zmewhbEwq6&d*A2rp zkoAQ5HLif1Ng}%8jsJ?N()60OEn!-`54268?V+W9>htC{VYmsTC-@to<9ynRi56Su zAA^U5EB%Y9#RgjGVR4iHa*$cte&r;z-?ETDg1pLTz>g+AzCP4Kvn&%v!9pf#^xr3< z)g_5Ha)8MieHIlH8@cjAOJ0$GCGh4iZlhB+3b2TXml_KFMOT4g2#4OMFAlWm8>r7o zhd&I$1$;Q9;owpnQtog(1(z7{!nx-UZ$J#2%{y9^Mt|qlsLb8Pud_A!luM)AMb$c2 z9*tf;>q>C7w6+~CJ@4{qSEAFHPZMb1N~yU}SMyiX0S;2lQ`2ky@70XHd1>ALsQKyZ zSyH+{zKEKEH?x{APlrEPH80WM;lG6YO?JbTuF5?tZ8eW|^{d_${p(zL)qEMLIS{V6 z9BQ69&-LLnwno7z=2XI?lg|J-F1)-I{Evlp|gwm%YfrF30d_ zhN{e#?dn@;6AD)8$p_}q{3FQ4W@%7efXz}6eqmEf6nTC$1dK}2yR&1#{B+=hG@HWo zn)_uokXxachF?shSWKf7rU6>Zz#>gqR*uoAeekPkc9OYEj-EC|fgU*=bUu3IXhQ|) zk>gT`9y!@bLp}A{i&sP@L0YBFe(KSeNyolYI`-pHf;MJMh#0Bq2cvuUOU&_5Bt8wT z-z@lvbRtW6vBYlu@?ycp6?W^-VOJsZwpH9O(-*#$TLqodcI?fx^nDtfB@$MPQ8(ur zkOca5e9)T;$lq&cM2vh@KHP1b`hO0S(U@bOJdLhz>v@+zT{6q5)ulJo&(7j zhQoB|j=$v`DpFkPYN;oC;nN^sH4Oq5Q0H|p$LQF$_d6k8ZxcA4g?iWx?Nb!L7l#Yg~+ZggmrR?xodg|@ywXwsjZsrP5KgIlhWYJ*-4zfQ_KhIU*= zybw=zSxE^rlXF^SWhDu16he~ILmj_D0X+ACUj+# z#YUxvQNEJS*=bE^yj3u2uN}7r+GzA#4yy(QIaUk0co-~{4`CvseUprqzAQ8-qgBI$ zLq(ij@$pbeFHW*Pek*;_lu{OjISD4U_rUI_Dbq5NoCF^~hR2WcW4jf+zKj`Fns|;S zOze>x4%x~_u)H^Ru9|%oas||Lsa=3~d90y`Iilus^xXQ7ccST*g^`lEp zo<3V`Xw}-z6T*R0`+MHnJc4%eZ^)2u9lapUt6Fbf@}8j9yw39?JlzWrlRzuc?-G0P zb>2!|&lxhxr^#?)9~6kau2;Omms+~0Ew85uK)Xo26w!CZ9_A_1C`FcPQ2uVwiSxM` zmvRp`h$bC@ER%wcxM`ekq#|@gT)+14$7|B;VSuTRe__mH&0$2(cjhmmll8d^YeJ$s z)=Yeu-GT$nSxq5y$HJTuQ5lN5lXQI*pty|kyJIW3^tm>e?s$-dj?el&q6z0g_3R#b zmWV%w2eF->ck#`(_|K5c+7|yQE{Lw#-Ema`U@mWCDcA#a&pLq&&^Na#QK@wTt<-{=x?`)DkL%Y1z}IOQ)bfF^&r?M@ z@O3NS;B?YwaN|1Xbq5{*H+jLnO;p~zUZ)(or7C@!2!eHnD|$s_JgM79sCtxXo|mDX zeRL~Bo~`OFlzP_3Ew8gHPBEWcN1d$bc=P+~`G!t~T4D$h-7)TK2`!4)HkPD6l}jME z5Ekp0SH}2f0d1cK`#K85wh*~iF(&;PPq8<-m_VbQ!S=B~40QAor9Cqyw6^Qb#S2$Dux z-;g?aw4|>@f}R+WE^UsmiTL_9QFU{RFvKRn4<1tF;{Y>C)5)<#eu5^F!?1~N^kEaF z6||5S+Erd?(l2`DP#7$2c%x4BT^uDv;#FzVc&5>k#y$_qJpiXrTT;n9K&a{Wu;G;;P4*1{pq`v3RIqj=h78D<0tK9QZdD`YVFk#p*z3ES8|Q zxuikt^dDNQb#0p?-pqWI;#0Z?IAd`Uz*z>m)ZRb_Nt2&7A~+L(ZlrC=nE*`n(V3_& zrwJTPJMw-*HKY@F&2`=tavTA^zL@EASci~lHbmMTwn{llmc@AnbC0(c#%1mkd$g^N znvNU1=;wI>u_JKEJI$NVh%l3uU5j}#=yzFwUW&_YjkZd>V)FU~jf*L394c)=jsVnL z)b;?&!NL5r7X~mF`A?&hi&7=Dj{On}ke}MD>ECsXis&DGNzs3XV^o>|$5K2FSD|@A zIR!8WGhW~>ms&EcH!sve=k8ht0j)R&p=l*21IguV5OjV6;N+-tl*rj@MzKR^ba?-n z2*V{mwHb`%`)zN&t$zKCBQc@rx(S`(jWhGSsHb~D!yqt|Kd3O1;|2DSJaF+Lc95#4 z39*7MD2L|2WR6P+K07Ve)GV@exUV^`4LmtRGWr5@Tw_CTRFhpvoTBC!9>1DZ?5OCwqH{-t2o^kfE=B@qbffnIDXpSx zlNZ{8{-8-qz~njI2sD{IXO>TpYRa7Pn)~k=2mN|qbEo>|R4MOpu~P`~aMAzd`2-qA zt?LwbFLSxVuWK%s9+@XyWi^Vy%;h!#u;u^L`s=p4$6T(XBbm!(IUJqNhG#BUQ{`?U z%n`y{3zy5yV%$2$y&PqIvUNE^FJG%e6H=;9M^2wMhV~ z;Wbv~csy;LaKJ^*^%QZ><#Le|r3kqv8K+zPU+J;^9|%J(fnhH9SPWClnFQqHY~M{U zXq^Gqn+0qg2VG%Vhu?bhEz{|+w57o^3(BVvUOVmA!3TM0O)Xc})cErpi0b(*wy9jF zo60qgvi~N`IJ9%XmSaEa(SOQWUQVlY^w9+LlWEV9yNB>2A>0A@EiXWi^{n#d>pcYS zn>r)WfqMw!yr_%3p!cJP@R!RyN_|71JAwf)vGU&P*cNIC);D;#QEdK-Rezuvh&^1& zpZW$SQPQT|2#z)7c8~=QLwz;n#%SJ==lB#53gc5iL`D=dc2?W0kbIemlrL^j88dmg zMV>O^164s-rQw<``UUEGr;E0ukQsq=J9_f}jq>z;pz(cbx~P(GFkMuJ8`pGE6&|1_ zUe}mz-<@yYU1Z1EC_8b&L{_Hmk3gFVS3N9P zl6Mh=eVe%6^QzuPswYgT&kk|+wIX|aqG>LXCoHRCOy3+&u?1X=AQ*hOygdoTK!1Lz zB?U}05kyP{;#Z$&S|o&b#Yr*dyQ?K^E#W060b8Z_a2afi1=iUJ(cfo>9w{T|M6mn& z?9eaKtHy+#%%(6AAw?2qQz-p^^4TFq{4WRxCPB?R4e>y;DKxiIpk7$RW<@?lMX3&b z9MYTK$DuUV7x81pMUdQ7`9Z`>0UV4riNR%Ryk+z=$uKC)k)1ucbRaN$XK61HkV2-a zlOnBxp?)%-d3Q)j32lxr98y#R#QR!sFa*GBd;=o6JOpc#gQ819<YfWfXT6QN*#Zbc2GRMO|Ra~%%gWR4>QbP z5lsFtNjuY^4*z3O{B^EJ6f^?d{Q`EPOr-!hnC(-lrO2_u4D?nnQ10reDJpcau;;6u zUqF_w*RjgQv@4Il(%_d(?ZuO@2c7n}V#g}>Ez0K6%3_qkPB(Fk z6WS)xnah)n)KMp*JzR-}F2ux<=5)C^(oD$BA?93F^}aU;nn!&fHu)+ki!D-*>?6SekNCRmj>fozvK@zlzT zXjm5xvSG-lpPIlzWj z@p3WL-2=W8c$ZF{y3d9Z&QN`zla{&CS?QJj4?T9^IC$b-NQzv*ZeE5KV{$F;&?ED- z3#_)6VR`2U9AeOKbH`dPpOTLrWI4X2O7l2m>-bWn@_qe<%_32uqcPhAJuSc!Hs2Fc z9o7H#LZ;mTqzq217psnRBMnDZ9a%N^du!R~wH83AskUlnAusByyg*#GzEU68Xog?v zt+gM9zk7zq@ZS=eJlyMs|D?CX{u%zY8LIEo@T=1+{T~{B@E92Wr$I7&d^hBRW@!Og z=);@u@>5^uqgq6Ct(0+dIQcxQIoK;@X~%@g;a*D%2WT6M(Kh5rt~@#t3{6AM(JGL0 zv=n=UOD&C!Z|N zbX?d|$L@n*R6+>P1HB+4U%r`8fNv(?VIj`w!ciH1oco2LbFsWfRtkDCr&|Vk={*S< z+~b?cgX+*9CxUhwb1tUbTs<(=qQr4st4BecX<&ttUkezg5s-1bzQ!R1UMddqVh|zN?EY0M=3nQcLk)*VQX6mBLN&^L`RzIUCk$@Y+^kL zo{rPTS^-F-U++32Avb^PC3l4vnMN+#w+t|}XeabLlO3GA-RphyZ)b9IRWtrSQ>kIV65c$tfNotxGSP`Ec%;^x|nA z&gRA|-1);=#bhF-^paBHC{07t(gEUpOgPbOshcBpb6X;%n3BsIQ*tWJz6HX3hIawn z{r3(>oBU=Ix5@ZYOnaMSRN^X1T)JFZ>ue+}b4_opS3>9gwbslhb>E3oB&^Qff8(TX zZtbT}Wirgy<`U63se3&hpnokVb#sx!MaQ~D+b4B%fe!_SQ-B=AN^%f02I(Nok%Cnl z{(UPG(EUHDn+crlg=K#(B(ii4JWEb0dfHU0bRJp=^ z`=0lJ%oQQi56snk&ogIpX{S;A&|6(=%!BhiOC-lo!JO`JS(y``B#m zAh%p!Y37p`DR$Cmx|gD{LYqFX`PYdS&-T2gn%#GuyjTIuJO>I-h?5u5RInDA`Q*im zlx)mD(flSK4n)Px_k}^Hy=IQ}sS?)mt)D^{bN?kLHO)I(bn< zoj(5f$C(z-_V^>?$%_+t7rWwhfRh*d!;=^!p4YGkKN+{>_5+&Pb(r5I8gk^ePNd<; zjl`CI@}f}H-;~CzbRd~eUL-K8b9k(mlHpz;(4abbv9gw}FJ6VlVSZI5#v$SGv0cFF zeBf(*2sHg1ipW-UdwQk*4@H!fBVYV>ZUX4o;n<-#Z4q&ZI4>QZzch^fIrwlEpUj9c zCI*+e*ad|7w>*TtGDJeGW8z`Kq97f1R=AXxHT`XV3XjFLZDq(SZ3_F*gTg|^avB@^ zo9K+9@icFT^A-FJO^B|OgY|kZY>QZnBMw`b)@F@ic!8C8h{zGlERP$!wdh<%qADAU zTJ*8@oDe?NKHTWV1V3*PiB2__V(}a8c!D_*%;ToQ5yymn!G!~LI58ooE#TLrH!M@} zR#IU&yqq>Uwbd`8Q@V0jXq8@{klyZT%sT{bio^OoR@T;?!Sx-YV_tw{g<~o~h5z(Q zjEFJ95KD+OY90T` zf<+EyB{X$5_BuNNZ_EU6?yCTJ+aLkPwvf}o2bLV5XLx~P#^Aqn2B2(7w&p>8dAi36 z_I(Cm6@~GMm{mkri%+I`fa^g&#kdM>9w2=I>j3yL8Clp1SOdJ>J$)E?;~EHt;<{M~ z6q+|KIn85y2YUH{={QH+MbFk=4&~7*L(wEU?cX;)|#_V z<=Mg<%of6T=Z5@s@NaoCp_o4kCsQF1_@~aCgFtX;^(AQiI%-q6)762~0M*HASme$@ z#Y+Jd70&`xIYcvG4$&;YA)2EB6=!IcK&pOqfD2Q*HXW{eKHH_0{9ETymn$%nzHjyHXP}({SAyy$Kui6Jnqq?g!rLEHQRB3vD^{?>mHRd#V zl8Eg^F?DppLJMXYo}rg>2UJJmj|Y*aGa_yp%SaRapsV`9M7$L_UDXdI;t{@iI1yjL zH;*OaEBWS$MD^;f>Sq$won6&i6V+?Fs-I6(-`G|CLZW(YSM~Np^}4R=9f|4 zhtW)ASNv+^$F|U~5johmnX@~$s(0YI1>7S=#Uj?ipj9cntv)Xi>j!?<;NhR8!>{D{ z!lI3yNDNtG1y3j0`dKpET)>8aH~MptxX?=EEIC&8+18kkOKJ4F36IbUlw?E+X}rIrA4+U95?z}g)B9ymnv zBoT2^f6ckkvxJFfnz+d3UUjt@3CIgy5{0$(N^1@>F}W$(C1l%=a4E^E(nr z?3(hlLaQlHzG~N01Cl$1UXk042-k8B0@3F(t6QZU2KMiOkiJb+z&u10tWkEUhYsQ3 zd-7B(_YbY6POba;4STTuyy+_Y~NQ-{S<>u5Az zx(vI|&=H~+=p1a*2EgXtvR*R_owPYK765R5Yc0(P6!@|I7}!ev)T{G{LUeL>F$VaU zH^*kh7W5U%ngf2=B+Js*xtf(m32FafjgY5Cu~>Dst?k;Fwnq1;xz%2-rA`Gwu|#&A zs6>Mn^g?qc6sR&AyE-SOP8=j)eQMEly#}es3(31%J{Y1-F?yT)rQ$s5TjSkn>V6PF zI*tXD)|kI5Vg5A8F9_8R$NkedBb~+-8YIQP1IbHcOKmf++YxcRZs#FxN*Zye4nUl3 zst0-t;d6Ad1>NF$mjKo&Q@g?UYY(~wZhgPtyqn9PxK#S|%dja*lhoXF00ZtWKLgdx zzZZ*NptX2q%kD{RvPJU_l#>3vJ%g^Dt{~e`@L3q!A!wOqH`T>1^7-btlL%MjVvXjF zCwp4P7uox0NpOxA81FJ#j8RA+5{4b)gabYbAQ+(LnWB_h*rc#?GtYkjJ=EBx?uEzCzd0!x;*w2`SZXK|zh#l?Hiv#)`ce zsJb|`D-$S(V;PG+{h1ggEU3 z!tf)oQN+s-`=l)y+Y#*$y8sur806b7f} zQQn&5u&fs0>pYnESlQm)*ZB$dFlmV26o3w|YThtifC`ICrRYrH!|;f`dK8{sGu!ERhT!bE5{t_A20Z#7*8 zSoFz3A7=_g!ru{d`gkCv#=J6(hzq^Ygb4Qc7r<~e#C~s49WeYb`!#Atd4XeY zpY19e{8DQx=Z-$!Xl$DTn=6?bL`%$<-hTlW4p+kF{HM@zz@9$Yr|;`Dv1>^~u}#Qu z7=~o~*|VJbANsP-&ryLK_^Db?%(Y9NTet66t957CC7;5#d#rYCAA&?JBL|-`fi`o? z(QLpE64ZupwiRrupb5=}+7Oxz+R$<|8$2xz*ny*6Zv;V&#XlD^EiM+_M^|ZwB{At zZAs)t^wLpQBO2@m;+wG(k_Q01f!K1}9~OAkwc}_{lb{~W6PTcR>M|Nn4Cb|1Co06e z!0g?8%1hCX9<*xN#+Qd}d>Gc`FALOS;RT-+BS%)KM#p~I)JMDGWFFA}`^wAPD4n}e62?(d#%i^P>)V0IXYEIn7u zX*w?6S4m`mR2wFX!`CHg%FEvz7(^V%O~*G-9C&*K%UF~8%VHr8_m1b163~V7tI}*w@M0R~)!G&nwMUUT_X!gNXxY zDNg&31BG4$`-lU(g+zxx5VT)$;D$WrsZK8lMjh{xayIs1D zuHEh2lU|+6s)YZw7Y5RHx6i?Pa57G-y6At{fgpW%dj+!1aWbb?YoSb^wLHW|Y0p|_ z+S&d#*b)z#zM=i++5}oUf`<;acp4DFN+3w`5;d`9Zl|eGZEpP6LZ;>xA3KEMItD{# zTS|Qn^CxBQ%3W!dmuIN#xBK+{4$-T;)o2^B>#bC^`k?ph4^G4WZ+YS(U2O;-IgSk` zzKMjeL?s?10Xsd%r@YmPihg&5TXC<`TZ@9|6~Ee#*@1ivUnar!x#xarkQ2mk$S$s8rXdBQ;8U>r=sY`~VE4a(41sJrF8uJ^& z*;0D1H;XY*g~l}-2Ph)Ph@MXXW8Z@iYRm_ulx}phtw(lO^6U&)D~w*9u)+*Q6k&oj za<<0C-vouj2Fa0L7th9?Z1gyD=%d_-a=Bx$WfGrDd(}PV|KowG1B(8MaCB|kN0E{9 zJ`i8$8n;!|r-Q--8%^eVK5PEp{)Xaz+~cVKr@e21kE*!-zX?$T1)&xxRjOAE5FlCd z00aWcBLSiiA_<5B#!a#zE1PWG2PBG$4JbBJ_2;AdQ(J7+(rR1ZS{0?DK>gWjtx~L1 zQ4udQ@h9c8 zY<&G3RpL*3_vKG}50Ibs9!Q_|hRx;!L`>?}@$|sjEO&-q z$QB9vK7)9-3G$=TxR43B%;= z6)x@SwL8(-+BeZ(i;Rr$cux1c4y$y&U^KFq6Q7M!1f_k;HHykEL52QWF|ZFRbgxQ( zgwggN<68H4<;jw`Sf_(AIU{@&6IquUTOv4Z+=)3OKY-fYYq4~!bgtqh8|2uBt;(Jj zZKzn1M4nC|qR_7edWR@^-x|90zW(zyup;$`GPk?rDA6{Qz`jUjx-GCeT=7OIqZgbc#RwJF6+kH>0z2X=1&_V4ho#~R{LpHao!ah=4 zlw5NTX|l_3WMt!A39N&1V0(wNA{fApm`46qVnL)8!1fN?fbh5Ct@yTcW9h2|Ws3w4 zC72WG(=xP5ASc&5SgPfo6flK&Ig-}xjDa_niH?SprEX1K)Bk*7B2E&XPLXHGW(+r z$~ss#``g0Js|%q^vp=H3ZHx)a;^E-cDsEEKRcjNSJ0Ph@)>PXGEM4w zX!iGR;-Img`)lUftFgzUIDO6&v#u-d@0sZ6+YR(KP8K$xg}g5jRx=%}rLFeOnHWRv zo_SqL`DdF1seGx>P_(sQA00Vqkn>PpCT4olP^nrkx%fQ?&Fa6x3?)}TMeX&!W+iEC zuVrsblkHM;GiAVKpvQbd0-CVfoV6` zF65-c`8|aXLlgn z%>Wu)1V&IN8y~NyI@N`-|DDquBL$J$U^hYCGRPTZC#s`$4X`(0-^+9)yf47c@a0 zcncY0rwMN%L&rf?PnHgo6)WRAWks5ovY_F{({v;*2v|A>YF!O;W%;LP=GR;z!&1mNir4`tV&_ATGxCypd8k#eis0f4FcSNa4 z2DS6PFxrYXO%B&IE7K$<%q!TSHjHB>d?%Yu7y2d{)Y3!*rNsud1c-@I8Pv)M&!D!q zW>EWIEFW!nuKt@*9Vql9gW8%j2y#nH&WPZk(wUG#d3f54%Ai)~>hGTm9yG2#U~1m5 zX0Fm1)IO62RT1cI2S!omHBv}J<{SAX!dR7nywRFQv z7=0;anMIQIi46sc6$j-|Dq`nfOc`zEGLvM4hM}dpUZ?MxXrhZjjb&jE29C>RyMEh&jVh_pglRRh6{LVHoOO zFUXUjE>|_lP*+rS%mG!^o*3%da4)M=WEY0I7jm&M)a7E640T1ZkN;T}+e1U$do-iy zZVYv~%p^lyQD&)IW~YX_aH{0iFRh{O23K4QomWB6Fw~vK9VfZn4tF*o(O>sVumPGPs*H>p(q{Y`qtFqT+A;SQLZdi};#wEc@OBJ!iHHK`n z0P(=kzDZ1CWUuQ^U`h76`8zVHD)56y>5$%YPLa&-61P@ z*z0-g43D(%VepI5`tG ztp9|)?t97hx`R@S=+y4;M`W*iJTj1~94qW~x&IZVZ1L3mNhy{z_PYMT-tgA!buoBw zW*}Y{F$Yi!3(J$TXn%76Ni~O4L2oqZhP$KEQb{wcXqwjt(8pXGt?$0|k*J@?P|pU? zMl+kCFu?{)92qxm4CC&sb^^$@@N23SovQ$3Coly|J%b`TA0+ znATnTh)?V{#r6ko5U-{fY|6@4OqLNGZ48yMo_`sCrcTI90V=2~M z;&~BPzUsLVR=yX=ns#p8b-GzVH`ZOpn)qNyS$FYT0*fqfEy0T{eJ%0JeP$h>@|DhwqsK{CC{9ysCOijGv@>Iwd^BLqgZR`jikc%h7dj*Hgl2DNGMDiFr($Q^Gx| zZ0S?N8%*1)zRp&6Q^I%ln9{t)B$uS*Noxpt@gwb&aIuL^66wj5FfFCvG3iM4Y)Ux5#5^&iObM@~VjS9(aJ@-@)Y|M< zF(v$WPp5=q$(;9_FiC@Q?dL4Qfi^v)25GY~CSu8)msWU&vud%}eqgs~C}i#2ocBKL zjrZ7`x1M+2V9v`$rtWQ??iT6pZKgBl9gkAgWMulMejc*vynx@orRvmW0k6SYNHgdC z2W^;YTjx8}T$n7OELAFerXqe;xI zfyUTg~p}SWgJxKr`o+PZY>s={)(S=sPgy zT_E<1(wphKlxmps&P{{TxjFC2CU!UGygyC0McB<8dQ#A{%=iP;aHm%q6OUK7>STXd-oR^GDyI>9yP6$y)WiG+Rg zaDLn&tjM-m^RNh{QpM&#Htb>WdVXJ6Jm3?k=-3@MkgXZ@mif+koZBn!$n5#B zhnMVX#(w(}=&oHG>;CF>Q4$1c80+56EF>H24p#+&^8=jI@={Ass&ViL=}I|PSYtyK`vg?%J@FDTIvv$A8vU*n8|vA8a$7k3(M z$#SZvkwPUdR_teAxT?}=X4-f%o55Y&O+^!*>OREQs%SLC^7IAtLIE1q**xh%raE(D z(&ybq%PrB7sNP`f+v%!&EThQgJ*HjADg!xKPW%{C>HJ=HS8bz9x0l}UR!Z7S<4scc zz4dmBOc9)Q%%)-qm2TiJVvKpy zB9Vg?I5i0HW+%YVkMR+QY*MaiyREv5;3M9*DXhOrBgTMswr!dcQL z61t@fTM1xQBMn;x7a!~p^406#rC}>kQG?+p+%`Pn3Tn5T)V#IaCh8qvrh|s#S^}7v z%e3rE&Fnq3W|bXN+RP40;Va7|?C~Ym!h-p?IGZjC&%RAyY)ZvAO#3!LuDMfkrhVJ> zc*la4^6TA$PC+0)l|YyFZ54Fbx&0L$ck5{R$6ds56A9W*1X$hKw|$*`6ahWis;z9?Oyo|okI3NN$T5QaP zBW)NUgHe0gC#AKV9Ui`IQ}<^dLv)_cE;%BrnSkV^6xDY(5X4T3aq zqoUNXIwys4S=x-sz)k1s#FV_f)8vKOoze{@@P-2$X|L*|gnJx%N)bH2zy$R{fzx{Z zd|CH~sMX^7Ukhny^10k3MT5}V_cJ;`tO7PP^U2O6z8U0P!8iS!$58>=_n1j@+h`H1 zjI4-lE0(koK~c^lFNv~2(C%p8g-OTscF0CnOHoxdVHieMHxRFBjI6$RSyGnX5Jv+h z<~$=SA+;O9W>Qz6PJS3hR(XQF@P;U=nq*`ps`|pOR8@OoWVIZ!RyFRz$m%FAmb@W~ zVv~%lM6p$Fu{|`h`WPQ&Qzds}WW{AB8Ci)k-}kY9!NFP!eTo((IkH{fy@_AOUHzh4aeK0B;DwZMn zJVZvGX!)6uU^TY?$O6@d=q_$nul{0)NV5GM(s1=37=(^WbZ>!PWXRRe@kQUa|)lR0dJe7 z+52G1fsreWPx|JgAu;7(#v${5_bc{X7`^20N>ZBh2uUtxX?P7FB$=j#X)#VDR9g;x zQ824XWq?VlXKnd96EZkJ705KOo3^}zC8jaaVNy$J%P0CKwdHwchA!Ija%6Qb{6w_n z+AFb~agLJD6m8ntCdm#(H0;g4Pz{@UewyA6r5JN8J;}LtD59~Re!-Oa?JNLKc%(lL z!wyA|pJx(todsbV2|6O%^chEMoPoT?8H_a!Hn8y_PpQJmRUD|YDv(AbqLh7H36JH} z55VgE>$5?MOYmdj+OV68ZY+}Ydp_yas_B041#e10hUV%xAv*|<8 zt@=3~IJc%zaRwb`{y@YE-$ZB|<1kZb>^)o5@aX(7^IGA=hxW8EtGjE>PJ9!68=GtB zUgVod6q))Aagkf3`wWrpF!O6DRjq5&A7*w|z<{0=@HphQO>EFnwVVRl@a6MJ(T^uR zXExGcZnoq`;=|12>BL;i{0C-1)5vcyxuncq2k&&*a+jH{v%^fin}<_MUuu#;|B{E9 z?H`B^!-tu_l7M%ZDP(bynZ3KiOp(iBHoPj6vO0{zOhN26lbBlrO~@-uB;vCkMx=&s zB2c7Fd~Nc~^EP4S^ZBS}&Gw(k10F||4`O==N}N0n5ve4PLq#f|cn4eX{?^Y;Qom#* zPc*2FcSI>N{U{BJdqgQJaE4a%RVKE6#yApM*YG%W2d(409l9x9W$*NelDN=44hge^OSK1>q$5h9HGlH7Xi#(k?}$<)Jo1c4*tZ1Y z-6ppDtH?2b`yOom*U{&T+8x}5L-3(c!|BO>#tO2a=TT4CI!Wx|zWlYz zL{>_4ZcLwbefu65bkP|*A&rn(fBjWt-9-7U7&&=^O*$p7mYw1AW8z}3VeQ+9MP8A3 z6l*r2-YEj|D<)JoV>I7YVjt`ye}JIWLHX zUjMb!X4J3b9M-^<)OE2s#)y&oi|ml?$1Cc6TS7tjU>o2UUk@4BY!CgX&)`0MQq(bR z$;oGM;+5r?@IZl&EeQV`_}DP)dxzkwatLgERSq*y4yWZtZ2G`mUV}dl{tIGu9Z<%G z!ce5}>Trp*U*B|GW->twki6GmDTpK79vP4Ke^hh|d>r!UyR)H&p@6=J{5Y$qhlZ$h zUgHv|LvW0e{D(i23d(JZ-*KyZ62X+82VEfgSf>TVIxCJ&`WaB*U;PZ(AQ`qILY0KXw(9;V5-Fds>OMSUW<1hPZ`vPw ztV~pvbzxUYv)v8b$6V4t9E#yI|=zJ-=lxCXG0@GS&s!56-t*m|bW7*;CK^m4NCp%v}EN%ul(}k#DHr)n}X{UkQxolfY z3kI5_oCigY{%hU>pyt5TW(z%((rk24NV`OB#TK6;zN4K47^jGHiRCn>h>w6v(HrC` z;(I8Dcr;ECD_91e@ThGM;}mhPATL}sp!!xU=@e1S^=lqf_3X(h;zwv>ZYQ{_g2y^hnLa2&iqZaXSi5$)gX#ZIz<%4_H&Ev;VI$@t>kV_5xLByQ$$hbtq-WGc6y39 zKr1EfDdMLt-wU0QxHmQ`Z{}W;+-`?ECd*A?VgzAk$fB76iz9eb5$_%;7h!bzG%!C( zi;}@B^U1>=J{b@rmsvJG1m&%|KH^HG8|*<{UbCY;AAB|tqVEgQ<7s0+AVd?&Kv$=C(*yT26IyLw=a%=xqi<2s zLYUX7+ubGc%iii6WX_(C#rKuexN7meNQlo)U3`aA%3hjUw%icQDzx@(r5*HB-(lGn ziW5$1X}Ek6PkPG1Dx#c+?^Ckv=?Ui$F|5oJ&Rst?d(RWhv?m^#lWswMpTP5bj~-Su zSvQ%)+!IcIjLMFPXRE$=wxY9iyl9V;8Taukm)d;@+MV9fw)q`xxm=MCmi7b&=)Ka6}6T~m$Df8AkZ#l3X znvs$YBeP8m@tj0Gwx>^f&Nwbte`tS@dGpF8s#AXps^LQ)2LY3qI}T#YXUKVF1{xmz zYlV)B_{eiwbU6)x!59F!7zaFJY;y~cfqtHOWw2*7a4AG7*Dws{zQYg-solEz6?EvA7JQRF-Nvd4u+<84yGMlEY65lsKoPlrA*(0$&yOOCYX4l4-{>N2T_e&lorrzu z{%Z=+B3K=WOsB@B#hjoTm6<+2W<$(6ab}fUArHD zdDfveQgz+Lnq;4kOD2kwbK{k8^Fc_JnS6tNW7Lpd4inMszoFi!NPI5DWs?%&8ZwqM zgZ1dX-$1nBh4`DC+kfqI0J|Z-S0{gKC*=1q=lfT-ZxVa?@!mMLL>X3WZa3uRYKt3t zQYYlsO7i>=qKoXCtZcmcs*e5EU7{Z{m~@nJH@b*+lu?C|?OcVpqduMvVJsNjaU6*^ z5g$k&35fSi#Ivv7;(YXdB4;D{>dfmpmj3-0TNYgX9nTQ{#biTxO z+TUNqZnG*D%$c)wYL=DE&{_!biY>z=Lj&;k5OIZi3`U*MZQ|L^vx1Nf4pb=u2VY4* zDR(mqR0?7{E9GQS$}`ib+Cw_Bi6d21_St$_SKciom%gltJu2%Vkho$?l_-lD6}8xP zrx0&?%5SmkyR1cybFQHL*Qr#C?5oT6(5qHuyVWVxfx^uV+sgj9diB<_k5=REW4inE z>W;GA9oG5hdf*5Ey;bKn%gy zQ4aQ@EYYtzvU0XGTu1-@-2bF6s+>pBR#$9U2o^!m*@!xecmi${NhOr@T=wEEpm0dP z((yI{CRaLWVs;ken8X5!#E&jS#$P$0)13zK74;SYn1%@2AP`+13%88Hmm(s8@R-^_DC7$- z^Mfl(S47Bnw!4zFxhsVa@y%*)V%Q5jqj zXbHE(TR59c%jYP4bMtQjCCWPF9n~Qa^FOzW@u=5*i zP_a+9$JEnj;9_m|$l-QNuzpI;DT?yA5_@?t1VuQ}&Or**)lkRwp(*1~sTgThG5Siw zB+*05D;7?hQ(kIUmsigzv(G87o^7AKU|w}um8DYVV*E~Ms*ZJ3!RHT z<-=p_k`>eAu~@kIQW|HM)QWqkkXSs@9H_rk3^lu+XHkS={13GPkq9=xSNbC~Gg{&0 zb@VywkkuB5Hi!AIjG1TCch;fdSA^5x z7kTuP%7s=X9_ipX*Z}JRAtR~7(9e3RhoR}~;+T~h?4prGqr`5Vl5>V#f~qXGb6TN_ z3hbqJ300ftq{5Ow$V)6tPAozq52ai*U{ z=qjP2kx11d?A${7qPoGaRPA}O<#Tx%G+l8gQ##?!l64A4OTtkfPffWaMvM@nzBbrA zCV6gyu@hN3wb)CB&I~r=HU1^&v6$sB>@)Ng^)#ojjw?g*chMo(4i16{*J_4Jtjt<<`heMe3Ub$bsBVO?lhb_ zJsb{Ap?(c9YcbS;OBkLHzq&cOSm)UW(UB#hujhE#KLwim^cIyV6e5;DL7#>om`)buh>|p-D2X(g(m}ufH_h{M{f;$z9F69# z+e@0->?JvJ?T&>8gy^QZYkEc!jH#u26)*6CuIE0q#eW*I^Te`7P)%1H(^qSsZq_#4 zFJCNCdA*?W`jRC%$q}i{Fq8SGSBQtC+-PI4A(m$shcm&XDN!GA5eKM(G%5g z(Drn66|`I+q^zs)S4Q(ZQn9yMpoFR!e|V`nm^TGL8AkOF!VPR}}~(RWn8 zOxG>xUE7{_%G5sZ^-FrA@DO@s%wIbR&+v87v#abelWck-4#CGXUN z3$$W|5DbLskrrM)$*wM2RBg{JFPl?p&#Rbot~Gn!+%mZ)fWE>SiH0b(VlKHc4n*_p zSR6xUq`NHQXkHs3l0km#m@;BSpWfJDvqdBZJKscsmV`HYN;DQ>`Xfh=ScOdd*r(H4 zJSiUs)L3KidZkCa$>PK;`mbe8Qs!z3*1%b6|D9d7sAm4G>3YZPQKw6O#&XwscxJ_i z5V6ejmUvhK!qQ!Ad)fY|y`VW*N1FxI%p=u;5XQk||3x5u))dN^VeCP|=9~=9DfJQy z+aLI;r#iC8rDsRVmYa(&4&s}Rw4#*MM&eO!gx~u*sfsC@j{%e2~Cvrpd;d^42#lz5Sv(D#IVN3xb6O-`X0jg7Gzn3 zk)BLDCT(wg&mfV{5RD-zbvy5L@_g{`dMvQY#KhkiXtg8DYGohE4f+B;`_zVUb^fA) zkroniNtSu;ABysuaddEGSs5qxD!DGxvd)Ig3)US>+=u(hYYrw}M!0nS!NeYf-$$5@ z^W|3%<{@12t%He5gl{5@A)J5h!Ne^Hi?2JFcnaaY2zMjA{Q855tSrlV5n(REqW?OW zn1gT!!WM+j-f%E+Bf>>D9!xxraOzD56T1-B-h41&;mwxVw+|+A5GD}LMtJ@$2NNNL zZ~r&SL-@{ZC=cPr+fg3E>N`*#>{uQ`n2Ydx-$8i@t2dxLg!dr45#e?m$J0x>**G`c ziLeym=LjD~I0SD4e~NG_!c3f()+3yTa2>+c2=7Dq48oTY=Hfj40K)4L4u;v>K7^AI zPJ>a@1qg3NxCY_J2scs)Y=Sgyf!p%*p%Wq4_izCl?^R7GX8Q_Yt-tycK5jw_NB} zVKyuuZ^e5|c?fgxV%Z{u_u}=fH3&PNJ(zeH;Q@p@5k9#U_j1x*m73BTS{MgbaaXBf14R=RrpuXX5nnaBc+7Z0M~Hy)3HN zYOk!vf%8+~)aW==uX7kD7xBA*^8s+$5xV@$zN%MyRvz zp|alh=#c)efS!KP;JMciJXzA*u(%Ro-U5mA0L>}c zFdmqy(^$T{;Z=H0^p3pnrghs^JtIfYT(SmI_n|e>-r?~ zUQfoYz}e9SPA;RIitTy)}7m$bnvb3G2Pi#xK#F4V;0G9ZYP4zD=R|Sg$0Sgx?DMd$DHx zctINcw-=<~Zv=j5Kq4^)J}Fb^pL|>j{!ZX8ADT$~gEkh`8cfyk555%qY^+%)oDI9m z;c4(&ho|6A0RD9=u?EdggFiSw1-}va>+VVrb`8vG{* zC*j*b*$({g!wRqj_bz?RFH!Dt7U6sdoF{;Dy@8W?wbw5PU@bmkXQIn>*I3{LffF+6 z)O&Pjt^WXU=)-YPpb zyFIhwSi(K>J0gK25;!7(BN8|wfg=()B7y(31S*H2L|nA2UX2AyUt++> z#Sv@w(;3!@2x&b-OTj&W=~;>3PY))-7ZJ&J29t{u4c;`$8N z(K*PEYdEg)xMt!qfA-Ha%%~)|*jG5gSH%4*DM12FLD)y*xGoxQh{3EfaEhI~GGMP1 zhralT1zso!*5MdOyy$=fyOwxtWD*&>#{2adV|%|PcAr(k8jDVlaik1LnsG*LKubh6 zTVx;8hqEnN)rTw_I0K)EM{PLjSx`~F$QEyLOd?D=yo9*`+0ENHfmF8MxFuH!2&9>P zAKbDrx}A&LCY)?DQNkhL9-%-JOb%edPZ7c(ekA2-5oX(VZV^QnkF-a-285$!8owNn z8*U+UMt?};lB5wCXod-~k{CQc)2k2lBkfV6Y`hfWuf<`%UE2olU3`o>Y7~{(3Uiqz zlteFZfZHS*bQI3*!15>jKr4NB1ns5@GLYyAmd333B{i4{IL}O zcmC#7o>SVDe2%0Yk-!lN{NI(pk@5e3w{4Hq?1%)qlfaSj-<^bxq#u#M|6K{pnlWRN zox7km-W-eDg@wMczJmP1xBv?;D=P98j2$VXQ)Qs<3}jg!Cunb}MeZSFVy6k)I@bLf zj4cnb7exW3pGG&o&JcT38Q3YB0g(2d=$C<=q6-m<{VRloPtK%iuZn&d*ipJk-0>eO z{|C68`dWtAw<3B!1AM{HGpw-)Gps?@W`s+z7d8_i(fbv`?*k@#H-dK}T#fuhfbzc! z_!XpoQ>OnN;S!w1enY}!pY|qTvSFkAUjsaU1ne^^WS2$wOAwZVKiY32{(^w3HFyQ!dJX;t;K^H*JO)|U z0Vd-@!K9bD;GNu1M1DMRu z?*MOvu772xdYkcoupW&plXOJ4*yx6Dg#0DOy)PNM9uLw*tOhOTPy2J}vzYz#Fvm2LVr; z>E(YG@LgK^4#2l+=?>tHTKYl2A0r*Y6!Pnng}$Ptp8)vdSzbEXx81L$PonhMUisyK zAJ)>B04^{0(w75%TuZ+k@SR8}dnIbW>i|EcrQZ$sv@>BFCDR`Pyje^C1>gObbmDeJ%#iO?%`O*a+6Wy$B7px zJx3HT=I*JXGG_0jvFgnm>Evz~*Kbzpr&NV0C_yffJovz#EVb zb_M-209#}P&Q1Agh! z3^AV*{yZbyZ@?EBaJvED2)GyMk^L0W`@WI>Fksc+DSa#8uVQgwL!<=%*1&(?fd68^ z$Mx~X1LYqII0x-T`sT|RFOvc97zG_5`KbVW0OM~P^g7|62RK*5Zw9<54}C=9e*^Hv zb67tUKG~D0-%#8<1o*THFa3Efo#ed(aGpm06C=GB4kM>h{{q9r?^oz>QvN9a2*9tP z{4(5A`BRPbvkkb;fMbATSU+{h{8t$1*8x`JmFVB4rQ68!kOmV!TMT%I0lyD;Ds&6k z?i0N)06#mL=P!Z>^aT<5BYHy(xY&S84R`_IsaPLVxBoK6V?E#vfNw>41Ye}#)A{Wc zfR#R^^1luEi_0=BvXvuvqlQoXJPY_*tv!Ejq`wXL-dxOaGXI~A^rMXN`&GcR!5{a> zLDn$9ccOfBK~er>4WIa(3)t5B%MvY}_-iuY%MJK?1HKdR`=}4u>r#Cm27Efk=k>Du zpBwnU0Xz=;g=G3(BmFOczc=2aM_&8YkN7)TgKfYQHJH-rOVH{^@Dc-V0j%aH;+H-; zt$u`ms{!8&c<3B&{5@r)ziPl%T_gqt?|cOt-3J1-HyXjUqO0|ng+ZbS>umH{B1QjK!t;!h6wyw)zrtE zn%a;>gKFqK$|O|r?z;QNa}=yCJBQu*NSAqmdTUvAFa}R@cvUmdyh3>Z1O!)nrNM|5 z;?Os)fKV#&cI!EC*bC|3hCs5p6|Apbm++cG!f;!eUTA^tqa^Kj~EXaIDxT(nx?`tXk z0Zp_wzuX_Z?@5&P?MlPk#?p_^K0NncsyjL*fXV)ukvoNsIa z9I$D0izf=7g>YHu=9&)gTpsKzp5S@Ua&d@+aAK%9C_YVkEc8%>14B1`ycJp`T@1N# z<2@XF(F)B#f8!* zp_@8QxHxqAD6m?&x3~z>qC#O5O;j!nU5r_rLzU<&n&7$BbCKpLe}^ui(_Dv#E|THs z&{qV3ia}8{j**iwT~cEeTCo*6o4gykDMeOju50|^#ui$kD%}XgO+d$4M9vUPg}+Xy z!NQ3$W?YD0l z)8~|dQ=0HCcyqx2sk7#kPoGhPO=^m$YiiLVYRaqU)_98&kfkL_HJL{#S!vxvKMhuoLT85NyBXS6Td#al8W=!H*7PxH*c#X`GE1x|;l7h=YpPx_Sl8;O&I@gDu~(Bq zU$Mx*HhZeJ)N}kXw+>KOT!*yYmI=9~EfpC)sifEEI{3PS6Is2DL{q1k38=xb{?w?! z!7V&O*J&|LW&{xn$~B(_YssYUk*WhAi)BsWW*UHz7zR2*udbNvsYG($;ueW%A*D;H zUakwCDQ>gfrHO%ywXqf<#jia2N|1eQM`QKDG`Pk% zA`$6&5Hbix!*vrU)eSj~7? z>XL&=Paxm|Ig;ltbP+?7q5FyXNIp{V@}gj3t>uq}gIeiA1*@mRBn2#FmZYv>xC#ff zTIN_Cx{5iFxYHT@iSCL=A1yOsB*##_gaxi@YUl{^5nWSDlaZUXnEG&YvOcij_Oc1C ztPrAqi?C7MVG0TOmNmzHweeu6J|7Qv0&1iuL|=VdGjei>t|L-Zx7L9gq(uTD!snZo zP|Wg)dCrGh-?A`3a-C%P=)o8`;d+0}Z}|d^@=+MhL_LVJ@-s2#Q1>Xn-xRC^C-6Zk z3Sm06(WvFaQ#n~HtNnqVg!Ik;wurG;i*q{ciO_}ZW%oz>H1zY~`V98`gh%fZ(6tB` zwhhIP@aUR=i?+ZBkKQq$>wcUmP#VxhNN1l@aZz5vqjwVMqIVJ0k8tTX8yBoB4b=cn^W@>0Jc6R^whT7ob&-i?&P&kKSdVYaQ+tJ;DboRueA5n~sa# zeV~ipi6Fe=aVb1H&n8}R%z%w5zH;bZ{s@nL7vWNP1vbu{aM>ymX(ST@SK(54l^{eH z@uPlpPuE&p3XjeM=vuUxV)#e&=+}Wu;n6t(U9`8aep&K{_P+>^o)wrl0gtz^f3~T#OGeqA7D1L-T*DJUbo;c^Y zAEz=DA%6<*4ZsSI&RgsUP%benf3^(YMo8t0{zm)U!2L)iB3|9@#XZq0z$Jdb!?v;e zqcnAC; You can rename this .c file as .cpp | + |________________________________________________________________| + +********* TINY FILE DIALOGS OFFICIAL WEBSITE IS ON SOURCEFORGE ********* + _________ + / \ hello.c v3.18.2 [Jun 10, 2024] + |tiny file| Hello World file created [November 9, 2014] + | dialogs | + \____ ___/ http://tinyfiledialogs.sourceforge.net + \| 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 | + |_________________________________________________________________________________| + _________________________________________________________ + | | + | on windows: - since v3.6 char is UTF-8 by default | + | - if you want MBCS set tinyfd_winUtf8 to 0 | + | - functions like fopen expect MBCS | + |_________________________________________________________| + ___________________________________________________________ + | | + | v3.10: NEW FORTRAN module fully implemented with examples | + | https://stackoverflow.com/a/59657117 | + |___________________________________________________________| + +If you like tinyfiledialogs, please upvote my stackoverflow answer +https://stackoverflow.com/a/47651444 + +- License - + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +/* +- Here is the Hello World: + if a console is missing, it will use graphic dialogs + if a graphical display is absent, it will use console dialogs + (on windows the input box may take some time to open the first time) + + See compilation instructions at the end of this file + + __________________________________________ + | ______________________________________ | + | | | | + | | DO NOT USE USER INPUT IN THE DIALOGS | | + | |______________________________________| | + |__________________________________________| +*/ + +#include +#include +#include "tinyfiledialogs.h" + +#ifdef _MSC_VER +#pragma warning(disable:4996) /* silences warnings about strcpy strcat fopen*/ +#endif + +int main( int argc , char * argv[] ) +{ + int lIntValue; + char * lPassword; + char * lTheSaveFileName; + char * lTheOpenFileName; + char * lTheSelectFolderName; + char * lTheHexColor; + char * lWillBeGraphicMode; + unsigned char lRgbColor[3]; + FILE * lIn; + char lBuffer[1024]; + char const * lFilterPatterns[2] = { "*.txt", "*.text" }; + + (void)argv; /*to silence stupid visual studio warning*/ + + tinyfd_verbose = argc - 1; /* default is 0 */ + tinyfd_silent = 1; /* default is 1 */ + + tinyfd_forceConsole = 0; /* default is 0 */ + tinyfd_assumeGraphicDisplay = 0; /* default is 0 */ + +#ifdef _WIN32 + tinyfd_winUtf8 = 1; /* default is 1 */ +/* On windows, you decide if char holds 1:UTF-8(default) or 0:MBCS */ +/* Windows is not ready to handle UTF-8 as many char functions like fopen() expect MBCS filenames.*/ +/* This hello.c file has been prepared, on windows, to convert the filenames from UTF-8 to UTF-16 + and pass them passed to _wfopen() instead of fopen() */ +#endif + + tinyfd_beep(); + + lWillBeGraphicMode = tinyfd_inputBox("tinyfd_query", NULL, NULL); + + strcpy(lBuffer, "tinyfiledialogs\nv"); + strcat(lBuffer, tinyfd_version); + if (lWillBeGraphicMode) + { + strcat(lBuffer, "\ngraphic mode: "); + } + else + { + strcat(lBuffer, "\nconsole mode: "); + } + strcat(lBuffer, tinyfd_response); + tinyfd_messageBox("hello", lBuffer, "ok", "info", 0); + + tinyfd_notifyPopup("the title", "the message\n\tfrom outer-space", "info"); + + if ( lWillBeGraphicMode && ! tinyfd_forceConsole ) + { +#if 0 + lIntValue = tinyfd_messageBox("Hello World", "\ +graphic dialogs [Yes]\n\ +console mode [No]\n\ +quit [Cancel]", + "yesnocancel", "question", 1); + if (!lIntValue) return 1; + tinyfd_forceConsole = (lIntValue == 2); +#else + lIntValue = tinyfd_messageBox( + "Hello World", "graphic dialogs [Yes] / console mode [No]", + "yesno", "question", 1); + tinyfd_forceConsole = ! lIntValue; +#endif + } + + lPassword = tinyfd_inputBox( + "a password box", "your password will be revealed later", NULL); + + if (!lPassword) return 1; + + tinyfd_messageBox("your password as read", lPassword, "ok", "info", 1); + + lTheSaveFileName = tinyfd_saveFileDialog( + "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 ; + } + +#ifdef _WIN32 + if (tinyfd_winUtf8) + lIn = _wfopen(tinyfd_utf8to16(lTheSaveFileName), L"w"); /* the UTF-8 filename is converted to UTF-16 to open the file*/ + else +#endif + lIn = fopen(lTheSaveFileName, "w"); + + if (!lIn) + { + tinyfd_messageBox( + "Error", + "Can not open this file in write mode", + "ok", + "error", + 1); + return 1 ; + } + fputs(lPassword, lIn); + fclose(lIn); + + lTheOpenFileName = tinyfd_openFileDialog( + "let us read the password back", + "../", + 2, + lFilterPatterns, + "text files", + 1); + + if (! lTheOpenFileName) + { + tinyfd_messageBox( + "Error", + "Open file name is NULL", + "ok", + "error", + 0); + return 1 ; + } + +#ifdef _WIN32 + if (tinyfd_winUtf8) + lIn = _wfopen(tinyfd_utf8to16(lTheOpenFileName), L"r"); /* the UTF-8 filename is converted to UTF-16 */ + else +#endif + lIn = fopen(lTheOpenFileName, "r"); + + if (!lIn) + { + 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 as it was saved", lBuffer, "ok", "info", 1); + + lTheSelectFolderName = tinyfd_selectFolderDialog( + "let us just select a directory", "../../"); + + if (!lTheSelectFolderName) + { + tinyfd_messageBox( + "Error", + "Select folder name is NULL", + "ok", + "error", + 1); + return 1; + } + + tinyfd_messageBox("The selected folder is", lTheSelectFolderName, "ok", "info", 1); + + lTheHexColor = tinyfd_colorChooser( + "choose a nice color", + "#FF0077", + lRgbColor, + lRgbColor); + + if (!lTheHexColor) + { + tinyfd_messageBox( + "Error", + "hexcolor is NULL", + "ok", + "error", + 1); + return 1; + } + + tinyfd_messageBox("The selected hexcolor is", lTheHexColor, "ok", "info", 1); + + tinyfd_messageBox("your read password was", lPassword, "ok", "info", 1); + + return 0; +} + +#ifdef _MSC_VER +#pragma warning(default:4996) +#endif + +/* +OSX : +$ clang -o hello.app hello.c tinyfiledialogs.c +( or gcc ) + +UNIX : +$ gcc -o hello hello.c tinyfiledialogs.c +( or clang tcc owcc cc CC ) + +Windows : + MinGW needs gcc >= v4.9 otherwise some headers are incomplete + > gcc -o hello.exe hello.c tinyfiledialogs.c -LC:/mingw/lib -lcomdlg32 -lole32 + + TinyCC needs >= v0.9.27 (+ tweaks - contact me) otherwise some headers are missing + > tcc -o hello.exe hello.c tinyfiledialogs.c ^ + -isystem C:\tcc\winapi-full-for-0.9.27\include\winapi ^ + -lcomdlg32 -lole32 -luser32 -lshell32 + + Borland C: > bcc32c -o hello.exe hello.c tinyfiledialogs.c + OpenWatcom v2: create a character-mode executable project. + + VisualStudio : + Create a console application project, + it links against comdlg32.lib & ole32.lib. + + VisualStudio command line : + > cl hello.c tinyfiledialogs.c comdlg32.lib ole32.lib user32.lib shell32.lib /W4 +*/ diff --git a/tinyfiledialogs/hello_wchar_t.c b/tinyfiledialogs/hello_wchar_t.c new file mode 100644 index 0000000..b4b18fa --- /dev/null +++ b/tinyfiledialogs/hello_wchar_t.c @@ -0,0 +1,241 @@ +/* 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 | + |________________________________________________________________| + +********* TINY FILE DIALOGS OFFICIAL WEBSITE IS ON SOURCEFORGE ********* + _________ + / \ hello_wchar_t.c v3.18.2 [Jun 10, 2024] + |tiny file| Hello WCHAR_T windows only file created [November 9, 2014] + | dialogs | + \____ ___/ http://tinyfiledialogs.sourceforge.net + \| git clone http://git.code.sf.net/p/tinyfiledialogs/code tinyfd + ____________________________________________ + | | + | email: tinyfiledialogs at ysengrin.com | + |____________________________________________| + ________________________________________________________________ + | | + | this file is for windows only it uses wchar_t UTF-16 functions | + |________________________________________________________________| + +If you like tinyfiledialogs, please upvote my stackoverflow answer +https://stackoverflow.com/a/47651444 + +- License - +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: +1. The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + + See compilation instructions at the end of this file + + __________________________________________ + | ______________________________________ | + | | | | + | | DO NOT USE USER INPUT IN THE DIALOGS | | + | |______________________________________| | + |__________________________________________| +*/ + +#include +#include +#include + +#include "tinyfiledialogs.h" + +#ifdef _MSC_VER +#pragma warning(disable:4996) /* silences warning about wcscpy*/ +#endif + +int main(void) /* WINDOWS ONLY */ +{ + wchar_t * lPassword; + wchar_t * lTheSaveFileName; + wchar_t * lTheOpenFileName; + wchar_t * lTheSelectFolderName; + wchar_t * lTheHexColor; + wchar_t * lWillBeGraphicMode; + unsigned char lRgbColor[3]; + FILE * lIn; + wchar_t lWcharBuff[1024]; + wchar_t lBuffer[1024]; + wchar_t const * lFilterPatterns[2] = { L"*.txt", L"*.text" }; + + tinyfd_beep(); + + lWillBeGraphicMode = tinyfd_inputBoxW(L"tinyfd_query", NULL, NULL); + + wcscpy(lBuffer, L"v"); + mbstowcs(lWcharBuff, tinyfd_version, strlen(tinyfd_version) + 1); + wcscat(lBuffer, lWcharBuff); + if (lWillBeGraphicMode) + { + wcscat(lBuffer, L"\ngraphic mode: "); + } + else + { + wcscat(lBuffer, L"\nconsole mode: "); + } + mbstowcs(lWcharBuff, tinyfd_response, strlen(tinyfd_response)+1); + wcscat(lBuffer, lWcharBuff); + wcscat(lBuffer, L"\n"); + mbstowcs(lWcharBuff, tinyfd_needs + 78, strlen(tinyfd_needs + 78) + 1); + wcscat(lBuffer, lWcharBuff); + + tinyfd_messageBoxW(L"hello", lBuffer, L"ok", L"info", 0); + + tinyfd_notifyPopupW(L"the title", L"the message\n\tfrom outer-space", L"info"); + + lPassword = tinyfd_inputBoxW( + L"a password box", L"your password will be revealed later", NULL); + + if (!lPassword) return 1; + + lTheSaveFileName = tinyfd_saveFileDialogW( + L"let us save this password", + L"passwordFile.txt", + 2, + lFilterPatterns, + NULL); + + if (! lTheSaveFileName) + { + tinyfd_messageBoxW( + L"Error", + L"Save file name is NULL", + L"ok", + L"error", + 1); + return 1 ; + } + + lIn = _wfopen(lTheSaveFileName, L"wt, ccs=UNICODE"); + if (!lIn) + { + tinyfd_messageBoxW( + L"Error", + L"Can not open this file in write mode", + L"ok", + L"error", + 1); + return 1 ; + } + fputws(lPassword, lIn); + fclose(lIn); + + lTheOpenFileName = tinyfd_openFileDialogW( + L"let us read the password back", + L"", + 2, + lFilterPatterns, + NULL, + 0); + + if (! lTheOpenFileName) + { + tinyfd_messageBoxW( + L"Error", + L"Open file name is NULL", + L"ok", + L"error", + 1); + return 1 ; + } + + lIn = _wfopen(lTheOpenFileName, L"rt, ccs=UNICODE"); + + if (!lIn) + { + tinyfd_messageBoxW( + L"Error", + L"Can not open this file in read mode", + L"ok", + L"error", + 1); + return(1); + } + lBuffer[0] = '\0'; + fgetws(lBuffer, sizeof(lBuffer), lIn); + fclose(lIn); + + tinyfd_messageBoxW(L"your password is", + lBuffer, L"ok", L"info", 1); + + lTheSelectFolderName = tinyfd_selectFolderDialogW( + L"let us just select a directory", L"C:\\"); + + if (!lTheSelectFolderName) + { + tinyfd_messageBoxW( + L"Error", + L"Select folder name is NULL", + L"ok", + L"error", + 1); + return 1; + } + + tinyfd_messageBoxW(L"The selected folder is", + lTheSelectFolderName, L"ok", L"info", 1); + + lTheHexColor = tinyfd_colorChooserW( + L"choose a nice color", + L"#FF0077", + lRgbColor, + lRgbColor); + + if (!lTheHexColor) + { + tinyfd_messageBoxW( + L"Error", + L"hexcolor is NULL", + L"ok", + L"error", + 1); + return 1; + } + + tinyfd_messageBoxW(L"The selected hexcolor is", + lTheHexColor, L"ok", L"info", 1); + + tinyfd_messageBoxW(L"your password was", lPassword, L"ok", L"info", 1); + + return 0; +} + +#ifdef _MSC_VER +#pragma warning(default:4996) +#endif + + +/* +MinGW needs gcc >= v4.9 otherwise some headers are incomplete +> gcc -o hello.exe hello.c tinyfiledialogs.c -LC:/mingw/lib -lcomdlg32 -lole32 + +TinyCC needs >= v0.9.27 (+ tweaks - contact me) otherwise some headers are missing +> tcc -o hello.exe hello.c tinyfiledialogs.c ^ + -isystem C:\tcc\winapi-full-for-0.9.27\include\winapi ^ + -lcomdlg32 -lole32 -luser32 -lshell32 + +Borland C: > bcc32c -o hello.exe hello.c tinyfiledialogs.c +OpenWatcom v2: create a character-mode executable project. + +VisualStudio : + Create a console application project, + it links against comdlg32.lib & ole32.lib. + +VisualStudio command line : + > cl hello.c tinyfiledialogs.c comdlg32.lib ole32.lib user32.lib shell32.lib /W4 +*/ diff --git a/tinyfiledialogs/more_dialogs/tinyfd_moredialogs.c b/tinyfiledialogs/more_dialogs/tinyfd_moredialogs.c new file mode 100644 index 0000000..bc2960f --- /dev/null +++ b/tinyfiledialogs/more_dialogs/tinyfd_moredialogs.c @@ -0,0 +1,259 @@ +/* SPDX-License-Identifier: ZLIB +Copyright (c) 2014 - 2023 Guillaume Vareille http://ysengrin.com + _________ + / \ tinyfiledialogs v3.9.0 [Nov 3, 2022] zlib licence + |tiny file| + | dialogs | + \____ ___/ http://tinyfiledialogs.sourceforge.net + \| git clone http://git.code.sf.net/p/tinyfiledialogs/code tinyfd + +If you like tinyfiledialogs, please upvote my stackoverflow answer +https://stackoverflow.com/a/47651444 + +- License - + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef __sun +#ifndef _POSIX_C_SOURCE +#define _POSIX_C_SOURCE 2 /* to accept POSIX 2 in old ANSI C standards */ +#endif +#endif + +#include +#include +#include + +#include "../tinyfiledialogs.h" + +#define MAX_PATH_OR_CMD 1024 /* _MAX_PATH or MAX_PATH */ +int tfd_quoteDetected(char const * aString); +void tfd_replaceSubStr( char const * aSource ,char const * aOldSubStr , + char const * aNewSubStr ,char * aoDestination ); +#ifndef _WIN32 +int tfd_isDarwin(void); +int tfd_kdialogPresent(void); +int tfd_matedialogPresent(void); +int tfd_qarmaPresent(void); +int tfd_shellementaryPresent(void); +int tfd_xpropPresent(void); +int tfd_zenityPresent(void); +int tfd_zenity3Present(void); +#endif /*_WIN32 */ + + +/* not cross platform - unix zenity only */ +/* contributed by Attila Dusnoki */ +#ifndef _WIN32 +char * tinyfd_arrayDialog( + char const * aTitle , /* "" */ + int aNumOfColumns , /* 2 */ + char const * const * aColumns , /* {"Column 1","Column 2"} */ + int aNumOfRows , /* 2 */ + char const * const * aCells ) + /* {"Row1 Col1","Row1 Col2","Row2 Col1","Row2 Col2"} */ +{ + static char lBuff [MAX_PATH_OR_CMD] ; + char lDialogString [MAX_PATH_OR_CMD] ; + FILE * lIn ; + int i ; + + if (tfd_quoteDetected(aTitle)) return tinyfd_arrayDialog("INVALID TITLE WITH QUOTES", aNumOfColumns, aColumns, aNumOfRows, aCells); + for (i = 0; i < aNumOfColumns; i++) + { + if (tfd_quoteDetected(aColumns[i])) return tinyfd_arrayDialog("INVALID COLUMNS WITH QUOTES", 0, NULL, 0, NULL); + } + for (i = 0; i < aNumOfRows; i++) + { + if (tfd_quoteDetected(aCells[i])) return tinyfd_arrayDialog("INVALID ROWS WITH QUOTES", 0, NULL, 0, NULL); + } + + lBuff[0]='\0'; + + 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 , " --list --print-column=ALL" ) ; + + if ( aTitle && strlen(aTitle) ) + { + strcat(lDialogString, " --title=\"") ; + strcat(lDialogString, aTitle) ; + strcat(lDialogString, "\"") ; + } + + if ( aColumns && (aNumOfColumns > 0) ) + { + for ( i = 0 ; i < aNumOfColumns ; i ++ ) + { + strcat( lDialogString , " --column=\"" ) ; + strcat( lDialogString , aColumns [i] ) ; + strcat( lDialogString , "\"" ) ; + } + } + + if ( aCells && (aNumOfRows > 0) ) + { + strcat( lDialogString , " " ) ; + for ( i = 0 ; i < aNumOfRows*aNumOfColumns ; i ++ ) + { + strcat( lDialogString , "\"" ) ; + strcat( lDialogString , aCells [i] ) ; + strcat( lDialogString , "\" " ) ; + } + } + } + else + { + if (aTitle&&!strcmp(aTitle,"tinyfd_query")){strcpy(tinyfd_response,"");return (char *)0;} + return NULL ; + } + + 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 ( lBuff[strlen( lBuff ) -1] == '\n' ) + { + lBuff[strlen( lBuff ) -1] = '\0' ; + } + /* printf( "lBuff: %s\n" , lBuff ) ; */ + if ( ! strlen( lBuff ) ) + { + return NULL ; + } + return lBuff ; +} +#endif /*_WIN32 */ + + +/* not cross platform - UNIX and OSX only */ +/* contributed by srikanth http://sourceforge.net/u/cr1vct/profile */ +#ifndef _WIN32 +char *tinyfd_checklistDialog( + char const *aTitle, + int aNumOfOptions, + char const *const *aOptions) +{ + static char lBuff[MAX_PATH_OR_CMD]; + static char dest[MAX_PATH_OR_CMD]; + + char lDialogString[MAX_PATH_OR_CMD]; + FILE *lIn; + int i ; + char *target = lDialogString; + + if (tfd_quoteDetected(aTitle)) return tinyfd_checklistDialog("INVALID TITLE WITH QUOTES", aNumOfOptions, aOptions); + for (i = 0; i < aNumOfOptions; i++) + { + if (tfd_quoteDetected(aOptions[i])) return tinyfd_checklistDialog("INVALID COLUMNS WITH QUOTES", 0, NULL); + } + + lBuff[0] = '\0'; + if (tfd_isDarwin()) + { + target += sprintf(target, "osascript -e \'set Choices to {"); + for (i = 0; i < aNumOfOptions; i++) + { + if (i != aNumOfOptions - 1) + target += sprintf(target, "\"%s\", ", aOptions[i]); + else + target += sprintf(target, "\"%s\"", aOptions[i]); + } + target += sprintf(target, "}\' -e \'set Choice to choose from list Choices with prompt \"%s\" with multiple selections allowed\' -e \'Choice\'", aTitle); + } + + else if (tfd_kdialogPresent()) + { + target += sprintf(target, "kdialog --checklist \'%s\' ", aTitle); + for (i = 0; i < aNumOfOptions; i++) + { + target += sprintf(target, "\'%s\' \'%s\' OFF ", aOptions[i], aOptions[i]); + } + } + else if (tfd_zenityPresent()) + { + target += sprintf(target, "zenity --list --column= --column= --checklist --title=\'%s\' ", aTitle); + for (i = 0; i < aNumOfOptions; i++) + { + target += sprintf(target, "\'\' \'%s\' ", aOptions[i]); + } + } + 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 (lBuff[strlen(lBuff) - 1] == '\n') + { + lBuff[strlen(lBuff) - 1] = '\0'; + } + /* printf( "lBuff: %s\n" , lBuff ) ; */ + if (!strlen(lBuff)) + { + return NULL; + } + if (tfd_kdialogPresent()) + { + tfd_replaceSubStr(lBuff, "\" \"", "|", dest); + dest[strlen(dest) - 2] = '\0'; + return dest + 1; + } + if (tfd_isDarwin()) + { + tfd_replaceSubStr(lBuff, "\", \"", "|", dest); + dest[strlen(dest) - 2] = '\0'; + dest[strlen(dest) - 3] = '\0'; + return dest + 2; + } + return lBuff; +} +#endif /*_WIN32 */ diff --git a/tinyfiledialogs/more_dialogs/tinyfd_moredialogs.h b/tinyfiledialogs/more_dialogs/tinyfd_moredialogs.h new file mode 100644 index 0000000..07bfea8 --- /dev/null +++ b/tinyfiledialogs/more_dialogs/tinyfd_moredialogs.h @@ -0,0 +1,48 @@ +/* SPDX-License-Identifier: ZLIB +Copyright (c) 2014 - 2023 Guillaume Vareille http://ysengrin.com + _________ + / \ tinyfiledialogs v3.9.0 [Nov 3, 2022] + |tiny file| + | dialogs | + \____ ___/ http://tinyfiledialogs.sourceforge.net + \| git clone http://git.code.sf.net/p/tinyfiledialogs/code tinyfd + +If you like tinyfiledialogs, please upvote my stackoverflow answer +https://stackoverflow.com/a/47651444 + + - License - + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/* not cross platform - unix zenity only */ +/* contributed by Attila Dusnoki */ +#ifndef _WIN32 +char * tinyfd_arrayDialog( + char const * aTitle , /* NULL or "" */ + int aNumOfColumns , /* 2 */ + char const * const * aColumns, /* {"Column 1","Column 2"} */ + int aNumOfRows, /* 2 */ + char const * const * aCells); + /* {"Row1 Col1","Row1 Col2","Row2 Col1","Row2 Col2"} */ +#endif /*_WIN32 */ + +/* not cross platform - UNIX and OSX only */ +/* contributed by srikanth http://sourceforge.net/u/cr1vct/profile */ +#ifndef _WIN32 +char * tinyfd_checklistDialog( + char const * aTitle , + int aNumOfOptions , + char const * const * aOptions); +#endif /*_WIN32 */ diff --git a/tinyfiledialogs/tinyfiledialogs.c b/tinyfiledialogs/tinyfiledialogs.c new file mode 100644 index 0000000..5614241 --- /dev/null +++ b/tinyfiledialogs/tinyfiledialogs.c @@ -0,0 +1,8171 @@ +/* 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 | + |________________________________________________________________| + +********* TINY FILE DIALOGS OFFICIAL WEBSITE IS ON SOURCEFORGE ********* + _________ + / \ tinyfiledialogs.c v3.18.2 [Jun 8, 2024] zlib licence + |tiny file| Unique code file created [November 9, 2014] + | dialogs | + \____ ___/ http://tinyfiledialogs.sourceforge.net + \| 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 | + |_________________________________________________________________________________| + _________________________________________________________ + | | + | on windows: - since v3.6 char is UTF-8 by default | + | - if you want MBCS set tinyfd_winUtf8 to 0 | + | - functions like fopen expect MBCS | + |_________________________________________________________| + +If you like tinyfiledialogs, please upvote my stackoverflow answer +https://stackoverflow.com/a/47651444 + +- License - +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: +1. The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + + __________________________________________ + | ______________________________________ | + | | | | + | | DO NOT USE USER INPUT IN THE DIALOGS | | + | |______________________________________| | + |__________________________________________| +*/ + + +#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 + +#include +#include +#include +#include +#include + +#ifdef _WIN32 + #ifdef __BORLANDC__ + #define _getch getch + #endif + #ifndef _WIN32_WINNT + #define _WIN32_WINNT 0x0500 + #endif + #include + #include + #include + #include + #include + #define TINYFD_NOCCSUNICODE + #define TINYFD_SLASH "\\" +#else + #include + #include + #include /* on old systems try instead */ + #include + #include + #include /* on old systems try instead */ + #define TINYFD_SLASH "/" +#endif /* _WIN32 */ + +#include "tinyfiledialogs.h" + +#define MAX_PATH_OR_CMD 1024 /* _MAX_PATH or MAX_PATH */ + +#ifndef MAX_MULTIPLE_FILES +#define MAX_MULTIPLE_FILES 1024 +#endif +#define LOW_MULTIPLE_FILES 32 + +char tinyfd_version[8] = "3.18.2"; + +/******************************************************************************************************/ +/**************************************** UTF-8 on Windows ********************************************/ +/******************************************************************************************************/ +#ifdef _WIN32 +/* if you want to use UTF-8 ( instead of the UTF-16/wchar_t functions at the end of tinyfiledialogs.h ) +Make sure your code is really prepared for UTF-8 (on windows, functions like fopen() expect MBCS and not UTF-8) */ +int tinyfd_winUtf8 = 1; /* on windows char strings can be 1:UTF-8(default) or 0:MBCS */ +/* for MBCS change this to 0, here or in your code */ +#endif +/******************************************************************************************************/ +/******************************************************************************************************/ +/******************************************************************************************************/ + +int tinyfd_verbose = 0 ; /* on unix: prints the command line calls */ +int tinyfd_silent = 1 ; /* 1 (default) or 0 : on unix, hide errors and warnings from called dialogs */ + +/* Curses dialogs are difficult to use, on windows they are only ascii and uses the unix backslah */ +int tinyfd_allowCursesDialogs = 0 ; /* 0 (default) or 1 */ +int tinyfd_forceConsole = 0 ; /* 0 (default) or 1 */ +/* for unix & windows: 0 (graphic mode) or 1 (console mode). +0: try to use a graphic solution, if it fails then it uses console mode. +1: forces all dialogs into console mode even when the X server is present. + it can use the package dialog or dialog.exe. + on windows it only make sense for console applications */ + +int tinyfd_assumeGraphicDisplay = 0; /* 0 (default) or 1 */ +/* some systems don't set the environment variable DISPLAY even when a graphic display is present. +set this to 1 to tell tinyfiledialogs to assume the existence of a graphic display */ + + +char tinyfd_response[1024]; +/* if you pass "tinyfd_query" as aTitle, +the functions will not display the dialogs +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 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 */ + +static int gWarningDisplayed = 0 ; +static char gTitle[]="missing software! (we will try basic console input)"; + +#ifdef _WIN32 +char tinyfd_needs[] = "\ + ___________\n\ +/ \\ \n\ +| tiny file |\n\ +| dialogs |\n\ +\\_____ ____/\n\ + \\|\ +\ntiny file dialogs on Windows needs:\ +\n a graphic display\ +\nor dialog.exe (curses console mode ** Disabled by default **)\ +\nor a console for basic input"; +#else +char tinyfd_needs[] = "\ + ___________\n\ +/ \\ \n\ +| tiny file |\n\ +| dialogs |\n\ +\\_____ ____/\n\ + \\|\ +\ntiny file dialogs on UNIX needs:\ +\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) ** Disabled by default **\ +\nor xterm + bash (opens console for basic input)\ +\nor existing console for basic input."; + +#endif + +#ifdef _MSC_VER +#pragma warning(disable:4996) /* allows usage of strncpy, strcpy, strcat, sprintf, fopen */ +#pragma warning(disable:4100) /* allows usage of strncpy, strcpy, strcat, sprintf, fopen */ +#pragma warning(disable:4706) /* allows usage of strncpy, strcpy, strcat, sprintf, fopen */ +#endif + +static int getenvDISPLAY(void) +{ + return tinyfd_assumeGraphicDisplay || getenv("DISPLAY"); +} + + +static char * getCurDir(void) +{ + 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 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) +{ + /* 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 , TINYFD_SLASH , 1 ) ) + { + strcat( lastcar , TINYFD_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); +/* printf("%d %d %d\n", aoResultRGB[0], aoResultRGB[1], aoResultRGB[2]); */ + } + 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 (defined(__cplusplus ) && __cplusplus >= 201103L) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__clang__) + sprintf(aoResultHexRGB, "#%02hhx%02hhx%02hhx", aRGB[0], aRGB[1], aRGB[2]); +#else + 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; + } + } +} + + +void tfd_replaceSubStr( char const * aSource, char const * aOldSubStr, + char const * aNewSubStr, char * aoDestination ) +{ + 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 ) ; +} + + +static int filenameValid( char const * aFileNameWithoutPath ) +{ + 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 ; +} + +#endif + + +static void wipefile(char const * aFilename) +{ + 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); + } + } +} + + +int tfd_quoteDetected(char const * aString) +{ + char const * p; + + if (!aString) return 0; + + p = aString; + if ( strchr(p, '\'')) + { + return 1; + } + + 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 ; +} + + +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 ; +#ifdef _WIN32 + else if ( !strcmp(aIntVariableName, "tinyfd_winUtf8") ) return tinyfd_winUtf8 ; +#endif + 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; } +#ifdef _WIN32 + else if (!strcmp(aIntVariableName, "tinyfd_winUtf8")) { tinyfd_winUtf8 = aValue; return tinyfd_winUtf8; } +#endif + 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"; + + 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 }; + + 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; +} + + +static void replaceChr(char * aString, char aOldChr, char aNewChr) +{ + char * p; + + if (!aString) return; + if (aOldChr == aNewChr) return; + + p = aString; + while ((p = strchr(p, aOldChr))) + { + *p = aNewChr; + p++; + } + return; +} + + +#if !defined(WC_ERR_INVALID_CHARS) +/* undefined prior to Vista, so not yet in MINGW header file */ +#define WC_ERR_INVALID_CHARS 0x00000000 /* 0x00000080 for MINGW maybe ? */ +#endif + +static int sizeUtf16From8(char const * aUtf8string) +{ + 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); +} + + +static int sizeUtf8(wchar_t const * aUtf16string) +{ + 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; +} + + +wchar_t* tinyfd_mbcsTo16(char const* aMbcsString) +{ + 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; +} + + +wchar_t * tinyfd_utf8to16(char const * aUtf8string) +{ + 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); + } +} + + +char * tinyfd_utf16toMbcs(wchar_t const * aUtf16string) +{ + 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; +} + + +char * tinyfd_utf8toMbcs(char const * aUtf8string) +{ + 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; + + 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); +} + + +void tinyfd_beep(void) +{ + 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)) || defined(__BORLANDC__) || defined(__WATCOMC__) + struct _stat st; + if (_wstat(aFilename, &st) == 0) +#else + 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); + } + } +} + + +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 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) +{ + /* 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; + } + } +} + + +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"; +#else + wchar_t const * const lPrintFormat = L"#%02hx%02hx%02hx"; +#endif + + 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]); +#else + swprintf(aoResultHexRGB, lPrintFormat, aRGB[0], aRGB[1], aRGB[2]); +#endif + + } + 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)) || defined(__BORLANDC__) || defined(__WATCOMC__) + struct _stat lInfo; +#else + struct __stat64 lInfo; +#endif + 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 (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); +#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)) || defined(__BORLANDC__) || defined(__WATCOMC__) + else if (_stat(aDirPath, &lInfo) != 0) +#else + else if (_stat64(aDirPath, &lInfo) != 0) +#endif + 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)) || defined(__BORLANDC__) || defined(__WATCOMC__) + struct _stat lInfo; +#else + struct __stat64 lInfo; +#endif + wchar_t * lTmpWChar; + int lStatRet; + FILE * lIn; + + if (!aFilePathAndName || !strlen(aFilePathAndName)) + { + return 0; + } + + 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); +#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; + } +} + +static void replaceWchar(wchar_t * aString, + wchar_t aOldChr, + wchar_t aNewChr) +{ + wchar_t * p; + + if (!aString) + { + return ; + } + + if (aOldChr == aNewChr) + { + return ; + } + + p = aString; + while ((p = wcsrchr(p, aOldChr))) + { + *p = aNewChr; +#ifdef TINYFD_NOCCSUNICODE + p++; +#endif + p++; + } + return ; +} + + +static int quoteDetectedW(wchar_t const * aString) +{ + wchar_t const * p; + + if (!aString) return 0; + + p = aString; + while ((p = wcsrchr(p, L'\''))) + { + return 1; + } + + p = aString; + while ((p = wcsrchr(p, L'\"'))) + { + return 1; + } + + return 0; +} + +#endif /* _WIN32 */ + +/* source and destination can be the same or ovelap*/ +static char * ensureFilesExist(char * aDestination, + char const * aSourcePathsAndNames) +{ + char * lDestination = aDestination; + char const * p; + char const * p2; + size_t lLen; + + 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; +} + +#ifdef _WIN32 + +static int __stdcall EnumThreadWndProc(HWND hwnd, LPARAM lParam) +{ + 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; + + if (!aString || !wcslen(aString) ) return; + + 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(); */ + } + + 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 */ +{ + int lBoxReturnValue; + UINT aCode; + + 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 (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 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; + + 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; + } +} + + +/* int tinyfd_notifyPopupW_ORIGINAL( + wchar_t const * aTitle, + wchar_t const * aMessage, + wchar_t const * aIconType) +{ + 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 (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; + + wcscpy(lDialogString, L"powershell.exe -executionpolicy bypass -command \"\ +function Show-BalloonTip {\ +[cmdletbinding()] \ +param( \ +[string]$Title = ' ', \ +[string]$Message = ' ', \ +[ValidateSet('info', 'warning', 'error')] \ +[string]$IconType = 'info');\ +[system.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') | Out-Null ; \ +$balloon = New-Object System.Windows.Forms.NotifyIcon ; \ +$path = Get-Process -id $pid | Select-Object -ExpandProperty Path ; \ +$icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path) ;"); + + wcscat(lDialogString, L"\ +$balloon.Icon = $icon ; \ +$balloon.BalloonTipIcon = $IconType ; \ +$balloon.BalloonTipText = $Message ; \ +$balloon.BalloonTipTitle = $Title ; \ +$balloon.Text = 'tinyfiledialogs' ; \ +$balloon.Visible = $true ; \ +$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"\""); + + hiddenConsoleW(lDialogString, aTitle, 0); + free(lDialogString); + return 1; +}*/ + + +/* 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* lDialogString; + size_t lTitleLen; + size_t lMessageLen; + size_t lDialogStringLen; + + FILE* lIn; + + 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(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; + + swprintf(lDialogString, +#if !defined(__BORLANDC__) && !defined(__TINYC__) && !(defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) + lDialogStringLen, +#endif + L"%ls\\tinyfd.hta", _wgetenv(L"TEMP")); + + lIn = _wfopen(lDialogString, L"w"); + if (!lIn) + { + free(lDialogString); + return 0; + } + + wcscpy(lDialogString, L"\n\ +\n\ +\n\ +"); + if ( aTitle && wcslen(aTitle) ) wcscat(lDialogString, aTitle); + wcscat(lDialogString, L"\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +
\n"); + + wcscat(lDialogString, aMessage ? aMessage : L""); + + wcscat(lDialogString, L"\n\ +\n\ +\n\ +"); + + fputws(lDialogString, lIn); + fclose(lIn); + + 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 ) ; */ + wcscpy(lDialogString, + L"cmd.exe /c mshta.exe \"%TEMP%\\tinyfd.hta\""); + + 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 */ +{ + 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 (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: 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); + + if (aDefaultInput) + { + swprintf(lDialogString, +#if !defined(__BORLANDC__) && !defined(__TINYC__) && !(defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) + lDialogStringLen, +#endif + L"%ls\\tinyfd.vbs", _wgetenv(L"TEMP")); + } + else + { + swprintf(lDialogString, +#if !defined(__BORLANDC__) && !defined(__TINYC__) && !(defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) + lDialogStringLen, +#endif + 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"\",\""); + 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\ +\n\ +\n\ +"); + if (aTitle) wcscat(lDialogString, aTitle); + wcscat(lDialogString, L"\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +
\n"); + + wcscat(lDialogString, aMessage ? aMessage : L""); + + wcscat(lDialogString, L"\n\ +\n\ +\n\ +\n\ +
\n\ +

\n\ +\n\ +
\n\ +
\n"); + + wcscat(lDialogString, L"\n\ +\n\ +\n\ +\n\ +
\n\ +
\n\ +
\n\ +\n\ +\n\ +" ) ; + } + fputws(lDialogString, lIn); + fclose(lIn); + + if (aDefaultInput) + { + swprintf(lDialogString, +#if !defined(__BORLANDC__) && !defined(__TINYC__) && !(defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) + lDialogStringLen, +#endif + L"%ls\\tinyfd.txt",_wgetenv(L"TEMP")); + +#ifdef TINYFD_NOCCSUNICODE + lFile = _wfopen(lDialogString, L"w"); + fputc(0xFF, lFile); + fputc(0xFE, lFile); +#else + lFile = _wfopen(lDialogString, L"wt, ccs=UNICODE"); /*or ccs=UTF-16LE*/ +#endif + 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\""); + } + + /* wprintf ( "lDialogString: %ls\n" , lDialogString ) ; */ + + hiddenConsoleW(lDialogString, aTitle, 1); + + swprintf(lDialogString, +#if !defined(__BORLANDC__) && !defined(__TINYC__) && !(defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) + lDialogStringLen, +#endif + L"%ls\\tinyfd.txt", _wgetenv(L"TEMP")); + /* wprintf(L"lDialogString: %ls\n", lDialogString); */ +#ifdef TINYFD_NOCCSUNICODE + if (!(lIn = _wfopen(lDialogString, L"r"))) +#else + if (!(lIn = _wfopen(lDialogString, L"rt, ccs=UNICODE"))) /*or ccs=UTF-16LE*/ +#endif + { + _wremove(lDialogString); + free(lDialogString); + return NULL; + } + + memset(lBuff, 0, MAX_PATH_OR_CMD * sizeof(wchar_t) ); + +#ifdef TINYFD_NOCCSUNICODE + fgets((char *)lBuff, 2*MAX_PATH_OR_CMD, lIn); +#else + fgetws(lBuff, MAX_PATH_OR_CMD, lIn); +#endif + fclose(lIn); + wipefileW(lDialogString); + _wremove(lDialogString); + + if (aDefaultInput) + { + swprintf(lDialogString, +#if !defined(__BORLANDC__) && !defined(__TINYC__) && !(defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) + lDialogStringLen, +#endif + L"%ls\\tinyfd.vbs", _wgetenv(L"TEMP")); + } + else + { + swprintf(lDialogString, +#if !defined(__BORLANDC__) && !defined(__TINYC__) && !(defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) + lDialogStringLen, +#endif + 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); +#else + lResult = !wcsncmp(lBuff, L"1", 1); +#endif + + /* printf( "lResult: %d \n" , lResult ) ; */ + if (!lResult) + { + return NULL ; + } + + /* 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; +#else + 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 * 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}; + + 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", 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: use the GRAVE ACCENT \\x60 instead.", aDefaultPathAndOrFile, 0, NULL, NULL); + }*/ + + lHResult = CoInitializeEx(NULL, 0); + + getPathWithoutFinalSlashW(lDirname, aDefaultPathAndOrFile); + getLastNameW(lBuff, aDefaultPathAndOrFile); + + 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++; + } + } + + 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; + + if (GetSaveFileNameW(&ofn) == 0) + { + lRetval = NULL; + } + else + { + lRetval = lBuff; + } + + if (lHResult == S_OK || lHResult == S_FALSE) + { + CoUninitialize(); + } + return lRetval; +} + + +wchar_t * tinyfd_openFileDialogW( + 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 */ +{ + 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 }; + static wchar_t * lBuff = NULL; + + free(lBuff); + lBuff = NULL; + if (aAllowMultipleSelects < 0) return (wchar_t *)0; + + 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", 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: 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)); + } + } + else + { + lFullBuffLen = MAX_PATH_OR_CMD + 1; + lBuff = (wchar_t*) malloc(lFullBuffLen * sizeof(wchar_t)); + } + if (!lBuff) return NULL; + + lHResult = CoInitializeEx(NULL, 0); + + 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++; + } + } + + 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; + + if (aAllowMultipleSelects) + { + ofn.Flags |= OFN_ALLOWMULTISELECT; + } + + if (GetOpenFileNameW(&ofn) == 0) + { + free(lBuff); + lBuff = NULL; + } + else + { + lBuffLen = wcslen(lBuff); + lPointers[0] = lBuff + lBuffLen + 1; + if (aAllowMultipleSelects && (lPointers[0][0] != L'\0')) + { + 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) + { + 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--; + *p = L'\\'; + p -= lBuffLen; + memmove(p, lBuff, lBuffLen*sizeof(wchar_t)); + p--; + *p = L'|'; + } + p++; + wcscpy(lBuff, p); + lBuffLen = wcslen(lBuff); + } + } + if (lBuff) lBuff = (wchar_t*)(realloc(lBuff, (lBuffLen + 1) * sizeof(wchar_t))); + } + + if (lHResult == S_OK || lHResult == S_FALSE) + { + CoUninitialize(); + } + + return lBuff; +} + + +BOOL CALLBACK BrowseCallbackProcW_enum(HWND hWndChild, LPARAM lParam) +{ + wchar_t buf[255]; + (void)lParam; + 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) +{ + (void)lp; + 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 "" */ +{ + static wchar_t lBuff[MAX_PATH_OR_CMD]; + wchar_t * lRetval; + + BROWSEINFOW bInfo; + LPITEMIDLIST lpItem; + HRESULT lHResult; + + 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");*/ + + 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; + + lpItem = SHBrowseForFolderW(&bInfo); + if (!lpItem) + { + lRetval = NULL; + } + else + { + SHGetPathFromIDListW(lpItem, lBuff); + lRetval = lBuff ; + } + + 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 } */ +{ + static wchar_t lResultHexRGB[8]; + CHOOSECOLORW cc; + COLORREF crCustColors[16]; + unsigned char lDefaultRGB[3]; + int lRet; + + HRESULT lHResult; + + 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: use the GRAVE ACCENT \\x60 instead.", aDefaultRGB, aoResultRGB);*/ + + lHResult = CoInitializeEx(NULL, 0); + + if ( aDefaultHexRGB && wcslen(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; + + lRet = ChooseColorW(&cc); + + if (!lRet) + { + return NULL; + } + + aoResultRGB[0] = GetRValue(cc.rgbResult); + aoResultRGB[1] = GetGValue(cc.rgbResult); + aoResultRGB[2] = GetBValue(cc.rgbResult); + + RGB2HexW(aoResultRGB, lResultHexRGB); + + if (lHResult == S_OK || lHResult == S_FALSE) + { + CoUninitialize(); + } + + 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 */ +{ + 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); + } + + lIntRetVal = tinyfd_messageBoxW(lTitle, lMessage, lDialogType, lIconType, aDefaultButton); + + free(lMessage); + + return lIntRetVal; +} + + +static int notifyWinGui( + 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; + + 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); + + free(lMessage); + + 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 */ +{ + 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); + + free(lMessage); + + if (!lTmpWChar) + { + aoBuff[0] = '\0'; + return 0; + } + + if (tinyfd_winUtf8) lTmpChar = tinyfd_utf16to8(lTmpWChar); + else lTmpChar = tinyfd_utf16toMbcs(lTmpWChar); + + strcpy(aoBuff, lTmpChar); + + return 1; +} + + +static char * saveFileDialogWinGui( + 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; + + 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 (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); + + for (i = 0; i < aNumOfFilterPatterns; i++) + { + free(lFilterPatterns[i]); + } + free(lFilterPatterns); + + 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); + + return aoBuff; +} + + +static char * openFileDialogWinGui( + 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; + + 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 (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); + + for (i = 0; i < aNumOfFilterPatterns; i++) + { + free(lFilterPatterns[i]); + } + free(lFilterPatterns); + + 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); + + return lTmpChar; +} + + +static char * selectFolderDialogWinGui( + 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; + + 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); + + if (!lTmpWChar) + { + return NULL; + } + + if (tinyfd_winUtf8) lTmpChar = tinyfd_utf16to8(lTmpWChar); + else lTmpChar = tinyfd_utf16toMbcs(lTmpWChar); + strcpy(aoBuff, lTmpChar); + + 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 } */ +{ + static char lResultHexRGB[8]; + + wchar_t lTitle[128]; + wchar_t * lTmpWChar; + char * lTmpChar; + wchar_t lDefaultHexRGB[16] = L""; + + 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) + { + return NULL; + } + + if (tinyfd_winUtf8) lTmpChar = tinyfd_utf16to8(lTmpWChar); + else lTmpChar = tinyfd_utf16toMbcs(lTmpWChar); + strcpy(lResultHexRGB, lTmpChar); + + 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) + { + 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 lDialogString[MAX_PATH_OR_CMD]; + char lDialogFile[MAX_PATH_OR_CMD]; + FILE * lIn; + char lBuff[MAX_PATH_OR_CMD] = ""; + (void)aIconType; + + 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 ) ) + { + 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, "\" "); + + 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); + + /*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 (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; + } + + 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 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 , " & " ) ; + + 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, "\" ") ; + + 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); + + /* 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); + + 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 ) + { + 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 * aDefaultPathAndOrFile ) /* NULL or "" */ +{ + 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, "\" ") ; + } + + strcat(lDialogString, "--backtitle \"") ; + strcat(lDialogString, + "tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY") ; + strcat(lDialogString, "\" ") ; + + 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); + + /* 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; +} + + +static char * openFileDialogWinConsole( + char const * aTitle , /* NULL or "" */ + char const * aDefaultPathAndOrFile ) /* NULL or "" */ +{ + char lFilterPatterns[MAX_PATH_OR_CMD] = ""; + char lDialogString[MAX_PATH_OR_CMD] ; + FILE * lIn; + + static char aoBuff[MAX_PATH_OR_CMD]; + + 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 , "--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); + + /* 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; +} + + +static char * selectFolderDialogWinConsole( + 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 ; + + 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 , "--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 ) ; + + 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; + + 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 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 ((!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) + { + lOriginalCP = GetConsoleCP(); + lOriginalOutputCP = GetConsoleOutputCP(); + (void)SetConsoleCP(GetACP()); + (void)SetConsoleOutputCP(GetACP()); + } + + 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"); + 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) 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 "); fflush(stdout); + 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" */ +{ + 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); +} + + +/* 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 */ +{ + static char lBuff[MAX_PATH_OR_CMD] = ""; + char * lEOF; + + DWORD mode = 0; + HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); + + unsigned long lNum; + void * lConsoleHandle; + char * lTmpChar; + wchar_t lBuffW[1024]; + + UINT lOriginalCP = 0; + UINT lOriginalOutputCP = 0; + + 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: use the GRAVE ACCENT \\x60 instead."); + + 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_winUtf8) + { + 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): "); fflush(stdout); + 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; + } + else + { + lEOF = fgets(lBuff, MAX_PATH_OR_CMD, stdin); + if (!aDefaultInput) + { + (void)SetConsoleMode(hStdin, mode); + printf("\n"); + } + + 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 * 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; + + 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 ( ( !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, 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 ( ! 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 ; +} + + +/* in case of multiple files, the separator is | */ +char * tinyfd_openFileDialog( + 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 * p; + char * lPointerInputBox; + int i; + + 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 (tfd_quoteDetected(aFilterPatterns[i])) return tinyfd_openFileDialog("INVALID FILTER_PATTERN WITH QUOTES: use the GRAVE ACCENT \\x60 instead.", aDefaultPathAndOrFile, 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, 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 ; +} + + +char * tinyfd_selectFolderDialog( + 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]; + + 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 (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 ) ) + { + return NULL ; + } + 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 */ +char * tinyfd_colorChooser( + 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]; + + 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: 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 (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 && (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] != '#') ) + { + 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, lString); /* restore its previous content to tinyfd_inputBox */ + + return lDefaultHexRGB; +} + + +#else /* unix */ + +static char gPython2Name[16]; +static char gPython3Name[16]; +static char gPythonName[16]; + +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 dirExists( char const * aDirPath ) +{ + 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] = "command -v " ; + FILE * lIn ; +#ifdef _GNU_SOURCE + char* lAllocatedCharString; + int lSubstringUndetected; +#endif + + strcat( lTestedString , aExecutable ) ; + strcat( lTestedString, " 2>/dev/null "); + lIn = popen( lTestedString , "r" ) ; + if ( ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) + && ( ! strchr( lBuff , ':' ) ) && ( strncmp(lBuff, "no ", 3) ) ) + { /* present */ + 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; + } +#endif /*_GNU_SOURCE*/ + + 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 ; + } +} + + +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 ; + + strcpy( lTestedString , aExecutable ) ; + strcat( lTestedString , " --version" ) ; + + lIn = popen( lTestedString , "r" ) ; + lTmp = fgets( lBuff , sizeof( lBuff ) , lIn ) ; + pclose( lIn ) ; + + lTmp += strcspn(lTmp,"0123456789"); + /* printf("lTmp:%s\n", lTmp); */ + return lTmp ; +} + + +static int * getMajorMinorPatch( char const * aExecutable ) +{ + 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]); */ + + 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 ; + + 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 char * dialogNameOnly(void) +{ + static char lDialogName[128] = "*" ; + if ( lDialogName[0] == '*' ) + { + 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 , "" ); + } + } + 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 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; +} + + +static int whiptailPresentOnly(void) +{ + 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; + + if ( lTerminalName[0] == '*' ) + { + if ( detectPresence( "bash" ) ) + { + 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 , "" ) ; + } + /* 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 ; + } +} + + +static int whiptailPresent(void) +{ + 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() ) ) ) ; +} + + +static int ffplayPresent(void) +{ + 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 playPresent(void) /* play is part of sox */ +{ + static int lPlayPresent = -1; + if (lPlayPresent < 0) + { + lPlayPresent = detectPresence("sox"); /*if sox is present, play is ready*/ + } + return lPlayPresent; +} + + +static int beepexePresent(void) +{ + static int lBeepexePresent = -1; + if (lBeepexePresent < 0) + { + lBeepexePresent = detectPresence("beep.exe"); + } + return lBeepexePresent; +} + + +/*static int beepPresent(void) +{ + 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") ) + { + lPlaysoundPresent = 0 ; + } + } + return lPlaysoundPresent; +} + + +static int paplayPresent(void) /* playsound is part of pipewire */ +{ + static int lPaplayPresent = -1 ; + if (lPaplayPresent < 0) + { + lPaplayPresent = detectPresence("paplay"); + if ( lPaplayPresent && ! fileExists("/usr/share/sounds/freedesktop/stereo/bell.oga") ) + { + lPaplayPresent = 0 ; + } + } + 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 gmessagePresent(void) +{ + 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 perlPresent(void) +{ + static int lPerlPresent = -1 ; + char lBuff[MAX_PATH_OR_CMD] ; + FILE * lIn ; + + 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); + } + } + return graphicMode() ? lPerlPresent : 0 ; +} + + +static int afplayPresent(void) +{ + 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 ; +} + + +static int xdialogPresent(void) +{ + 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 osascriptPresent(void) +{ + 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( ) ; +} + + +int tfd_matedialogPresent(void) +{ + 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( ) ; +} + + +int tfd_xpropPresent(void) +{ + static int lXpropReady = 0 ; + static int lXpropDetected = -1 ; + char lBuff[MAX_PATH_OR_CMD] ; + FILE * lIn ; + + if ( lXpropDetected < 0 ) + { + lXpropDetected = detectPresence("xprop") ; + } + + 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( ) ; +} + + +int tfd_yadPresent(void) +{ + static int lYadPresent = -1; + if (lYadPresent < 0) + { + lYadPresent = detectPresence("yad"); + } + return lYadPresent && graphicMode(); +} + + +int tfd_zenity3Present(void) +{ + 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 ) + { + lZenity3Present = 5 ; + } + else if ( lIntTmp >= 10 ) + { + lZenity3Present = 4 ; + } + } + 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 ; +} + + +int tfd_kdialogPresent(void) +{ + static int lKdialogPresent = -1 ; + char lBuff[MAX_PATH_OR_CMD] ; + FILE * lIn ; + char * lDesktop; + + 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 ) ; + + 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; + + 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 ; + + 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 ; + + if ( lPython2Present < 0 ) + { + 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) ; + } + 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);\""; + + 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;\""; + + if ( lTkinter2Present < 0 ) + { + lTkinter2Present = 0 ; + if ( python2Present() ) + { + sprintf( lPythonCommand , "%s %s" , gPython2Name , lPythonParams ) ; + lTkinter2Present = tryCommand(lPythonCommand) ; + } + if (tinyfd_verbose) printf("lTkinter2Present %d graphicMode %d \n", lTkinter2Present, graphicMode() ) ; + } + return lTkinter2Present && graphicMode() && !(tfd_isDarwin() && getenv("SSH_TTY") ); +} + + +static int pythonDbusPresent(void) +{ + 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 && 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") ); +} + + +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); +} + + +void tinyfd_beep(void) +{ + char lDialogString[256] ; + FILE * lIn ; + + 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 ) + { + strcpy( lDialogString , "afplay /System/Library/Sounds/Ping.aiff") ; + } + else + { + 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 ( ( lIn = popen( lDialogString , "r" ) ) ) + { + pclose( lIn ) ; + } + + 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 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'; + + 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 ); + } + + 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, ")' ") ; + + 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 '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 */ + } + + 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" ) ; + } + + 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()) ) ) + { + 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, " --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\ +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 */ + } + + strcat( lDialogString , +" -S -c \"import Tkinter,tkMessageBox;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=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, "',") ; + 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\ +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"); + } + + 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 " ) ; + } + + 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 ( 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, "\" "); + + 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") ; + + 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;} + + 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), +"my \\$notificationId;\\$notificationId = \\$notificationsObject->Notify(shift, 0, '%s', '%s', '%s', [], {}, -1);\" ", + 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); + } + + 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 ( ! ( lIn = popen( lDialogString , "r" ) ) ) + { + free(lDialogString); + return 0 ; + } + while ( fgets( lBuff , sizeof( lBuff ) , lIn ) != NULL ) + {} + + pclose( lIn ) ; + + /* 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) ) ; */ + + lResult = !strcmp( lBuff , "2" ) ? 2 : !strcmp( lBuff , "1" ) ? 1 : 0; + + /* 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 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 ( 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 ); + } + + 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, "\" ") ; + } + + 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 , "\"" ) ; + } + + 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"); + + if ( aIconType && strlen( aIconType ) ) + { + strcat( lDialogString , " --image=\""); + 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;} + + 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) , +"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 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 ( 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 (lDialogString) free(lDialogString); + return tinyfd_messageBox(aTitle, aMessage, "ok", aIconType, 0); + } + + 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 */ +{ + 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 */ + + 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: 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 ); + } + + 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 ( ! 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, " --title=\"") ; + if (aTitle && strlen(aTitle)) strcat(lDialogString, aTitle) ; + strcat(lDialogString, "\"") ; + + 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, "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 \""); + } + + 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( ) ) + { + 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, "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 */ + } + + 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, "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 ( !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 ( 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); + } + + 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 (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 ) ; + + 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 ( 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 ; + } + + /* printf( "lBuff+1: %s\n" , lBuff+1 ) ; */ + free(lDialogString); + return lBuff+1 ; +} + + +char * tinyfd_saveFileDialog( + 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] ; + static char lLastDirectory[MAX_PATH_OR_CMD] = "$PWD" ; + + 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 (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;} + + 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 ( 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" ) ; + + 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 --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 , +"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 ( 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 ( !xdialogPresent() && !gdialogPresent() ) + { + strcat(lDialogString, "--backtitle \"") ; + strcat(lDialogString, + "tab: focus | /: populate | spacebar: fill text field | ok: TEXT FIELD ONLY") ; + 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; + + 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" ) ) ) + { + 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; + } + + getPathWithoutFinalSlash( lString , lBuff ) ; + if ( strlen( lString ) && ! dirExists( lString ) ) + { + return NULL ; + } + strcpy(lLastDirectory, lString) ; + + getLastName(lString,lBuff); + if ( ! filenameValid(lString) ) + { + return NULL; + } + return lBuff ; +} + + +/* in case of multiple files, the separator is | */ +char * tinyfd_openFileDialog( + 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 */ +{ + static char * lBuff = NULL; + static char lLastDirectory[MAX_PATH_OR_CMD] = "$PWD" ; + + 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 ; + + 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 (tfd_quoteDetected(aFilterPatterns[i])) return tinyfd_openFileDialog("INVALID FILTER_PATTERN WITH QUOTES: use the GRAVE ACCENT \\x60 instead.", aDefaultPathAndOrFile, 0, NULL, NULL, 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 , aDefaultPathAndOrFile ) ; + 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 ( 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 , +" -S -c \"import Tkinter,tkFileDialog;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 , "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 , " " ) ; + } + + 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, "\" ") ; + } + + 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, "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 ; + } + 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; + } + + 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 ) ) + { + return NULL ; + } + strcpy(lLastDirectory, lString) ; + + lBuff = (char *)( realloc( lBuff, (strlen(lBuff)+1) * sizeof(char))); + + /*printf( "lBuff3 [%lu]: %s\n" , strlen(lBuff) , lBuff ) ; */ + return lBuff ; +} + + +char * tinyfd_selectFolderDialog( + char const * aTitle , /* "" */ + char const * aDefaultPath ) /* "" */ +{ + static char lBuff[MAX_PATH_OR_CMD] ; + static char lLastDirectory[MAX_PATH_OR_CMD] = "$PWD" ; + + char lDialogString[MAX_PATH_OR_CMD] ; + FILE * lIn ; + char * p ; + char * lPointerInputBox ; + int lWasGraphicDialog = 0 ; + int lWasXterm = 0 ; + lBuff[0]='\0'; + + 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 ( 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 ( 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, "\"") ; + } + } + 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" ) ; + + 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 (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 , +"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 , " " ) ; + } + + 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, "\" ") ; + } + + 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 ( !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 ; + } + + 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 */ +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 } */ +{ + static char lDefaultHexRGB[16]; + char lBuff[128] ; + + char lTmp[128] ; +#if !((defined(__cplusplus ) && __cplusplus >= 201103L) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__clang__)) + 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'; + + 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 && (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( ) ) + { + 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 , +" -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 , +"-e 'set mystring to ((item 1 of mycolor) div 256 as integer) as string' " ); + strcat( lDialogString , +"-e 'repeat with i from 2 to the count of mycolor' " ); + 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 ) ; + + 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 ) ; + + 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]); +#else + 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, "'") ; + + 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 */ + } + + strcat( lDialogString , +" -S -c \"import Tkinter,tkColorChooser;root=Tkinter.Tk();root.withdraw();"); + + 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, "'") ; + + + 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); + + 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 ( 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]); +#else + 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] == '(' ) { +#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]); +#else + 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 ) ; */ +#if (defined(__cplusplus ) && __cplusplus >= 201103L) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__clang__) + sscanf(lBuff,"%hhu %hhu %hhu", & aoResultRGB[0], & aoResultRGB[1],& aoResultRGB[2]); +#else + 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 ) ; */ + + 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[] ) +{ +char const * lTmp; +char const * lTheSaveFileName; +char const * lTheOpenFileName; +char const * lTheSelectFolderName; +char const * lTheHexColor; +char const * lWillBeGraphicMode; +unsigned char lRgbColor[3]; +FILE * lIn; +char lBuffer[1024]; +char lString[1024]; +char const * lFilterPatterns[2] = { "*.txt", "*.text" }; + +tinyfd_verbose = argc - 1; +tinyfd_silent = 1; + +lWillBeGraphicMode = tinyfd_inputBox("tinyfd_query", NULL, NULL); + +strcpy(lBuffer, "v"); +strcat(lBuffer, tinyfd_version); +if (lWillBeGraphicMode) +{ + strcat(lBuffer, "\ngraphic mode: "); +} +else +{ + strcat(lBuffer, "\nconsole mode: "); +} +strcat(lBuffer, tinyfd_response); +strcat(lBuffer, "\n"); +strcat(lBuffer, tinyfd_needs+78); +strcpy(lString, "tinyfiledialogs"); +tinyfd_messageBox(lString, lBuffer, "ok", "info", 0); + +tinyfd_notifyPopup("the title", "the message\n\tfrom outer-space", "info"); + +if (lWillBeGraphicMode && !tinyfd_forceConsole) +{ + 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); + +if (!lTmp) return 1; + +strcpy(lString, lTmp); + +lTheSaveFileName = tinyfd_saveFileDialog( + "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; +} + +lIn = fopen(lTheSaveFileName, "w"); +if (!lIn) +{ + 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); + +if (!lTheOpenFileName) +{ + 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); +} +lBuffer[0] = '\0'; +fgets(lBuffer, sizeof(lBuffer), lIn); +fclose(lIn); + +tinyfd_messageBox("your password is", + lBuffer, "ok", "info", 1); + +lTheSelectFolderName = tinyfd_selectFolderDialog( + "let us just select a directory", NULL); + +if (!lTheSelectFolderName) +{ + tinyfd_messageBox( + "Error", + "Select folder name is NULL", + "ok", + "error", + 1); + return 1; +} + +tinyfd_messageBox("The selected folder is", + lTheSelectFolderName, "ok", "info", 1); + +lTheHexColor = tinyfd_colorChooser( + "choose a nice color", + "#FF0077", + lRgbColor, + lRgbColor); + +if (!lTheHexColor) +{ + tinyfd_messageBox( + "Error", + "hexcolor is NULL", + "ok", + "error", + 1); + return 1; +} + +tinyfd_messageBox("The selected hexcolor is", + lTheHexColor, "ok", "info", 1); + + tinyfd_beep(); + + return 0; +} +*/ + +#ifdef _MSC_VER +#pragma warning(default:4996) +#pragma warning(default:4100) +#pragma warning(default:4706) +#endif diff --git a/tinyfiledialogs/tinyfiledialogs.h b/tinyfiledialogs/tinyfiledialogs.h new file mode 100644 index 0000000..c195d9b --- /dev/null +++ b/tinyfiledialogs/tinyfiledialogs.h @@ -0,0 +1,314 @@ +/* SPDX-License-Identifier: Zlib +Copyright (c) 2014 - 2024 Guillaume Vareille http://ysengrin.com + ____________________________________________________________________ + | | + | 100% compatible C C++ -> You can rename tinfiledialogs.c as .cpp | + |____________________________________________________________________| + +********* TINY FILE DIALOGS OFFICIAL WEBSITE IS ON SOURCEFORGE ********* + _________ + / \ tinyfiledialogs.h v3.18.2 [Jun 8, 2024] + |tiny file| Unique header file created [November 9, 2014] + | dialogs | + \____ ___/ http://tinyfiledialogs.sourceforge.net + \| git clone http://git.code.sf.net/p/tinyfiledialogs/code tinyfd + ____________________________________________ +| | +| email: tinyfiledialogs at ysengrin.com | +|____________________________________________| + ________________________________________________________________________________ +| ____________________________________________________________________________ | +| | | | +| | - in tinyfiledialogs, char is UTF-8 by default (since v3.6) | | +| | | | +| | on windows: | | +| | - for UTF-16, use the wchar_t functions at the bottom of the header file | | +| | | | +| | - _wfopen() requires wchar_t | | +| | - fopen() uses char but expects ASCII or MBCS (not UTF-8) | | +| | - if you want char to be MBCS: set tinyfd_winUtf8 to 0 | | +| | | | +| | - alternatively, tinyfiledialogs provides | | +| | functions to convert between UTF-8, UTF-16 and MBCS | | +| |____________________________________________________________________________| | +|________________________________________________________________________________| + +If you like tinyfiledialogs, please upvote my stackoverflow answer +https://stackoverflow.com/a/47651444 + +- License - +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: +1. The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + + __________________________________________ + | ______________________________________ | + | | | | + | | DO NOT USE USER INPUT IN THE DIALOGS | | + | |______________________________________| | + |__________________________________________| +*/ + +#ifndef TINYFILEDIALOGS_H +#define TINYFILEDIALOGS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************************************/ +/**************************************** UTF-8 on Windows ********************************************/ +/******************************************************************************************************/ +#ifdef _WIN32 +/* On windows, if you want to use UTF-8 ( instead of the UTF-16/wchar_t functions at the end of this file ) +Make sure your code is really prepared for UTF-8 (on windows, functions like fopen() expect MBCS and not UTF-8) */ +extern int tinyfd_winUtf8; /* on windows char strings can be 1:UTF-8(default) or 0:MBCS */ +/* for MBCS change this to 0, in tinyfiledialogs.c or in your code */ + +/* Here are some functions to help you convert between UTF-16 UTF-8 MBSC */ +char * tinyfd_utf8toMbcs(char const * aUtf8string); +char * tinyfd_utf16toMbcs(wchar_t const * aUtf16string); +wchar_t * tinyfd_mbcsTo16(char const * aMbcsString); +char * tinyfd_mbcsTo8(char const * aMbcsString); +wchar_t * tinyfd_utf8to16(char const * aUtf8string); +char * tinyfd_utf16to8(wchar_t const * aUtf16string); +#endif +/******************************************************************************************************/ +/******************************************************************************************************/ +/******************************************************************************************************/ + +/************* 3 funtions for C# (you don't need this in C or C++) : */ +char const * tinyfd_getGlobalChar(char const * aCharVariableName); /* returns NULL on error */ +int tinyfd_getGlobalInt(char const * aIntVariableName); /* returns -1 on error */ +int tinyfd_setGlobalInt(char const * aIntVariableName, int aValue); /* returns -1 on error */ +/* aCharVariableName: "tinyfd_version" "tinyfd_needs" "tinyfd_response" + aIntVariableName : "tinyfd_verbose" "tinyfd_silent" "tinyfd_allowCursesDialogs" + "tinyfd_forceConsole" "tinyfd_assumeGraphicDisplay" "tinyfd_winUtf8" +**************/ + +extern char tinyfd_version[8]; /* contains tinyfd current version number */ +extern char tinyfd_needs[]; /* info about requirements */ +extern int tinyfd_verbose; /* 0 (default) or 1 : on unix, prints the command line calls */ +extern int tinyfd_silent; /* 1 (default) or 0 : on unix, hide errors and warnings from called dialogs */ + +/** Curses dialogs are difficult to use and counter-intuitive. +On windows they are only ascii and still uses the unix backslash ! **/ +extern int tinyfd_allowCursesDialogs; /* 0 (default) or 1 */ + +extern int tinyfd_forceConsole; /* 0 (default) or 1 */ +/* for unix & windows: 0 (graphic mode) or 1 (console mode). +0: try to use a graphic solution, if it fails then it uses console mode. +1: forces all dialogs into console mode even when an X server is present. + if enabled, it can use the package Dialog or dialog.exe. + on windows it only make sense for console applications */ + +extern int tinyfd_assumeGraphicDisplay; /* 0 (default) or 1 */ +/* some systems don't set the environment variable DISPLAY even when a graphic display is present. +set this to 1 to tell tinyfiledialogs to assume the existence of a graphic display */ + +extern char tinyfd_response[1024]; +/* if you pass "tinyfd_query" as aTitle, +the functions will not display the dialogs +but will 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 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 */ + +void tinyfd_beep(void); + +int tinyfd_notifyPopup( + char const * aTitle, /* NULL or "" */ + char const * aMessage, /* NULL or "" may contain \n \t */ + char const * aIconType); /* "info" "warning" "error" */ + /* return has only meaning for tinyfd_query */ + +int tinyfd_messageBox( + char const * aTitle , /* NULL or "" */ + char const * aMessage , /* NULL or "" may contain \n \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 * tinyfd_inputBox( + char const * aTitle , /* NULL or "" */ + char const * aMessage , /* NULL or "" (\n and \t have no effect) */ + char const * aDefaultInput ) ; /* NULL = passwordBox, "" = inputbox */ + /* returns NULL on cancel */ + +char * tinyfd_saveFileDialog( + char const * aTitle , /* NULL or "" */ + char const * aDefaultPathAndOrFile , /* NULL or "" , ends with / to set only a directory */ + int aNumOfFilterPatterns , /* 0 (1 in the following example) */ + char const * const * aFilterPatterns , /* NULL or char const * lFilterPatterns[1]={"*.txt"} */ + char const * aSingleFilterDescription ) ; /* NULL or "text files" */ + /* returns NULL on cancel */ + +char * tinyfd_openFileDialog( + char const * aTitle, /* NULL or "" */ + char const * aDefaultPathAndOrFile, /* NULL or "" , ends with / to set only a directory */ + int aNumOfFilterPatterns , /* 0 (2 in the following example) */ + char const * const * aFilterPatterns, /* NULL or char const * lFilterPatterns[2]={"*.png","*.jpg"}; */ + char const * aSingleFilterDescription, /* NULL or "image files" */ + int aAllowMultipleSelects ) ; /* 0 or 1 */ + /* in case of multiple files, the separator is | */ + /* returns NULL on cancel */ + +char * tinyfd_selectFolderDialog( + char const * aTitle, /* NULL or "" */ + char const * aDefaultPath); /* NULL or "" */ + /* returns NULL on cancel */ + +char * tinyfd_colorChooser( + char const * aTitle, /* NULL or "" */ + char const * aDefaultHexRGB, /* NULL or "" or "#FF0000" */ + unsigned char const aDefaultRGB[3] , /* unsigned char lDefaultRGB[3] = { 0 , 128 , 255 }; */ + unsigned char aoResultRGB[3] ) ; /* unsigned char lResultRGB[3]; */ + /* 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 */ + + +/************ WINDOWS ONLY SECTION ************************/ +#ifdef _WIN32 + +/* windows only - utf-16 version */ +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" */ + +/* windows only - utf-16 version */ +int tinyfd_messageBoxW( + wchar_t const * aTitle, /* NULL or L"" */ + wchar_t const * aMessage, /* NULL or L"" may contain \n \t */ + wchar_t const * aDialogType, /* L"ok" L"okcancel" L"yesno" */ + wchar_t const * aIconType, /* L"info" L"warning" L"error" L"question" */ + int aDefaultButton ); /* 0 for cancel/no , 1 for ok/yes */ + /* returns 0 for cancel/no , 1 for ok/yes */ + +/* windows only - utf-16 version */ +wchar_t * tinyfd_inputBoxW( + wchar_t const * aTitle, /* NULL or L"" */ + wchar_t const * aMessage, /* NULL or L"" (\n nor \t not respected) */ + wchar_t const * aDefaultInput); /* NULL passwordBox, L"" inputbox */ + +/* windows only - utf-16 version */ +wchar_t * tinyfd_saveFileDialogW( + wchar_t const * aTitle, /* NULL or L"" */ + wchar_t const * aDefaultPathAndOrFile, /* NULL or L"" , ends with / to set only a directory */ + int aNumOfFilterPatterns, /* 0 (1 in the following example) */ + wchar_t const * const * aFilterPatterns, /* NULL or wchar_t const * lFilterPatterns[1]={L"*.txt"} */ + wchar_t const * aSingleFilterDescription); /* NULL or L"text files" */ + /* returns NULL on cancel */ + +/* windows only - utf-16 version */ +wchar_t * tinyfd_openFileDialogW( + wchar_t const * aTitle, /* NULL or L"" */ + wchar_t const * aDefaultPathAndOrFile, /* NULL or L"" , ends with / to set only a directory */ + int aNumOfFilterPatterns , /* 0 (2 in the following example) */ + wchar_t const * const * aFilterPatterns, /* NULL or wchar_t const * lFilterPatterns[2]={L"*.png","*.jpg"} */ + wchar_t const * aSingleFilterDescription, /* NULL or L"image files" */ + int aAllowMultipleSelects ) ; /* 0 or 1 */ + /* in case of multiple files, the separator is | */ + /* returns NULL on cancel */ + +/* windows only - utf-16 version */ +wchar_t * tinyfd_selectFolderDialogW( + wchar_t const * aTitle, /* NULL or L"" */ + wchar_t const * aDefaultPath); /* NULL or L"" */ + /* returns NULL on cancel */ + +/* windows only - utf-16 version */ +wchar_t * tinyfd_colorChooserW( + wchar_t const * aTitle, /* NULL or L"" */ + wchar_t const * aDefaultHexRGB, /* NULL or L"#FF0000" */ + unsigned char const aDefaultRGB[3], /* unsigned char lDefaultRGB[3] = { 0 , 128 , 255 }; */ + unsigned char aoResultRGB[3]); /* unsigned char lResultRGB[3]; */ + /* returns the hexcolor as a string L"#FF0000" */ + /* aoResultRGB also contains the result */ + /* aDefaultRGB is used only if aDefaultHexRGB is NULL */ + /* aDefaultRGB and aoResultRGB can be the same array */ + /* returns NULL on cancel */ + +#endif /*_WIN32 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* TINYFILEDIALOGS_H */ + +/* + ________________________________________________________________________________ +| ____________________________________________________________________________ | +| | | | +| | on windows: | | +| | - for UTF-16, use the wchar_t functions at the bottom of the header file | | +| | - _wfopen() requires wchar_t | | +| | | | +| | - in tinyfiledialogs, char is UTF-8 by default (since v3.6) | | +| | - but fopen() expects MBCS (not UTF-8) | | +| | - if you want char to be MBCS: set tinyfd_winUtf8 to 0 | | +| | | | +| | - alternatively, tinyfiledialogs provides | | +| | functions to convert between UTF-8, UTF-16 and MBCS | | +| |____________________________________________________________________________| | +|________________________________________________________________________________| + +- This is not for ios nor android (it works in termux though). +- The files can be renamed with extension ".cpp" as the code is 100% compatible C C++ + (just comment out << extern "C" >> in the header file) +- Windows is fully supported from XP to 10 (maybe even older versions) +- C# & LUA via dll, see files in the folder EXTRAS +- OSX supported from 10.4 to latest (maybe even older versions) +- Do not use " and ' as the dialogs will be displayed with a warning + instead of the title, message, etc... +- There's one file filter only, it may contain several patterns. +- If no filter description is provided, + the list of patterns will become the description. +- On windows link against Comdlg32.lib and Ole32.lib + (on windows the no linking claim is a lie) +- On unix: it tries command line calls, so no such need (NO LINKING). +- On unix you need one of the following: + applescript, kdialog, zenity, matedialog, shellementary, qarma, yad, + python (2 or 3)/tkinter/python-dbus (optional), Xdialog + or curses dialogs (opens terminal if running without console). +- One of those is already included on most (if not all) desktops. +- In the absence of those it will use gdialog, gxmessage or whiptail + with a textinputbox. If nothing is found, it switches to basic console input, + it opens a console if needed (requires xterm + bash). +- for curses dialogs you must set tinyfd_allowCursesDialogs=1 +- You can query the type of dialog that will be used (pass "tinyfd_query" as aTitle) +- String memory is preallocated statically for all the returned values. +- File and path names are tested before return, they should be valid. +- tinyfd_forceConsole=1; at run time, forces dialogs into console mode. +- On windows, console mode only make sense for console applications. +- On windows, console mode is not implemented for wchar_T UTF-16. +- Mutiple selects are not possible in console mode. +- The package dialog must be installed to run in curses dialogs in console mode. + It is already installed on most unix systems. +- On osx, the package dialog can be installed via + http://macappstore.org/dialog or http://macports.org +- On windows, for curses dialogs console mode, + dialog.exe should be copied somewhere on your executable path. + It can be found at the bottom of the following page: + http://andrear.altervista.org/home/cdialog.php +*/