Added TinyFileDialogs, removed file explorer and input box
This commit is contained in:
259
tinyfiledialogs/more_dialogs/tinyfd_moredialogs.c
Normal file
259
tinyfiledialogs/more_dialogs/tinyfd_moredialogs.c
Normal file
@ -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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#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 */
|
48
tinyfiledialogs/more_dialogs/tinyfd_moredialogs.h
Normal file
48
tinyfiledialogs/more_dialogs/tinyfd_moredialogs.h
Normal file
@ -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 */
|
Reference in New Issue
Block a user