|
|
@@ -13,8 +13,7 @@
|
|
|
|
|
|
|
|
|
const char INIT_FAIL_MSG[] = "gtk_init_check failed to initilaize GTK+";
|
|
|
-const char NOPATH_MSG[] = "The selected path is out of memory.";
|
|
|
-const char NOMEM_MSG[] = "Out of memory.";
|
|
|
+
|
|
|
|
|
|
static void AddTypeToFilterName( const char *typebuf, char *filterName, size_t bufsize )
|
|
|
{
|
|
|
@@ -26,7 +25,7 @@ static void AddTypeToFilterName( const char *typebuf, char *filterName, size_t b
|
|
|
strncat( filterName, SEP, bufsize - len - 1 );
|
|
|
len += strlen(SEP);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
strncat( filterName, typebuf, bufsize - len - 1 );
|
|
|
}
|
|
|
|
|
|
@@ -37,34 +36,34 @@ static void AddFiltersToDialog( GtkWidget *dialog, const char *filterList )
|
|
|
const char *p_filterList = filterList;
|
|
|
char *p_typebuf = typebuf;
|
|
|
char filterName[NFD_MAX_STRLEN] = {0};
|
|
|
-
|
|
|
+
|
|
|
if ( !filterList || strlen(filterList) == 0 )
|
|
|
return;
|
|
|
|
|
|
filter = gtk_file_filter_new();
|
|
|
while ( 1 )
|
|
|
{
|
|
|
-
|
|
|
+
|
|
|
if ( NFDi_IsFilterSegmentChar(*p_filterList) )
|
|
|
{
|
|
|
char typebufWildcard[NFD_MAX_STRLEN];
|
|
|
/* add another type to the filter */
|
|
|
assert( strlen(typebuf) > 0 );
|
|
|
assert( strlen(typebuf) < NFD_MAX_STRLEN-1 );
|
|
|
-
|
|
|
+
|
|
|
snprintf( typebufWildcard, NFD_MAX_STRLEN, "*.%s", typebuf );
|
|
|
AddTypeToFilterName( typebuf, filterName, NFD_MAX_STRLEN );
|
|
|
-
|
|
|
+
|
|
|
gtk_file_filter_add_pattern( filter, typebufWildcard );
|
|
|
-
|
|
|
+
|
|
|
p_typebuf = typebuf;
|
|
|
memset( typebuf, 0, sizeof(char) * NFD_MAX_STRLEN );
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
if ( *p_filterList == ';' || *p_filterList == '\0' )
|
|
|
{
|
|
|
/* end of filter -- add it to the dialog */
|
|
|
-
|
|
|
+
|
|
|
gtk_file_filter_set_name( filter, filterName );
|
|
|
gtk_file_chooser_add_filter( GTK_FILE_CHOOSER(dialog), filter );
|
|
|
|
|
|
@@ -73,7 +72,7 @@ static void AddFiltersToDialog( GtkWidget *dialog, const char *filterList )
|
|
|
if ( *p_filterList == '\0' )
|
|
|
break;
|
|
|
|
|
|
- filter = gtk_file_filter_new();
|
|
|
+ filter = gtk_file_filter_new();
|
|
|
}
|
|
|
|
|
|
if ( !NFDi_IsFilterSegmentChar( *p_filterList ) )
|
|
|
@@ -84,7 +83,7 @@ static void AddFiltersToDialog( GtkWidget *dialog, const char *filterList )
|
|
|
|
|
|
p_filterList++;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/* always append a wildcard option to the end*/
|
|
|
|
|
|
filter = gtk_file_filter_new();
|
|
|
@@ -112,7 +111,7 @@ static nfdresult_t AllocPathSet( GSList *fileList, nfdpathset_t *pathSet )
|
|
|
GSList *node;
|
|
|
nfdchar_t *p_buf;
|
|
|
size_t count = 0;
|
|
|
-
|
|
|
+
|
|
|
assert(fileList);
|
|
|
assert(pathSet);
|
|
|
|
|
|
@@ -122,7 +121,6 @@ static nfdresult_t AllocPathSet( GSList *fileList, nfdpathset_t *pathSet )
|
|
|
pathSet->indices = NFDi_Malloc( sizeof(size_t)*pathSet->count );
|
|
|
if ( !pathSet->indices )
|
|
|
{
|
|
|
- NFDi_SetError(NOMEM_MSG);
|
|
|
return NFD_ERROR;
|
|
|
}
|
|
|
|
|
|
@@ -142,7 +140,7 @@ static nfdresult_t AllocPathSet( GSList *fileList, nfdpathset_t *pathSet )
|
|
|
nfdchar_t *path = (nfdchar_t*)(node->data);
|
|
|
size_t byteLen = strlen(path)+1;
|
|
|
ptrdiff_t index;
|
|
|
-
|
|
|
+
|
|
|
memcpy( p_buf, path, byteLen );
|
|
|
g_free(node->data);
|
|
|
|
|
|
@@ -155,7 +153,7 @@ static nfdresult_t AllocPathSet( GSList *fileList, nfdpathset_t *pathSet )
|
|
|
}
|
|
|
|
|
|
g_slist_free( fileList );
|
|
|
-
|
|
|
+
|
|
|
return NFD_OKAY;
|
|
|
}
|
|
|
|
|
|
@@ -164,13 +162,13 @@ static void WaitForCleanup(void)
|
|
|
while (gtk_events_pending())
|
|
|
gtk_main_iteration();
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/* public */
|
|
|
|
|
|
nfdresult_t NFD_OpenDialog( const char *filterList,
|
|
|
const nfdchar_t *defaultPath,
|
|
|
nfdchar_t **outPath )
|
|
|
-{
|
|
|
+{
|
|
|
GtkWidget *dialog;
|
|
|
nfdresult_t result;
|
|
|
|
|
|
@@ -208,7 +206,6 @@ nfdresult_t NFD_OpenDialog( const char *filterList,
|
|
|
{
|
|
|
g_free( filename );
|
|
|
gtk_widget_destroy(dialog);
|
|
|
- NFDi_SetError(NOPATH_MSG);
|
|
|
return NFD_ERROR;
|
|
|
}
|
|
|
}
|
|
|
@@ -216,8 +213,8 @@ nfdresult_t NFD_OpenDialog( const char *filterList,
|
|
|
|
|
|
result = NFD_OKAY;
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+ WaitForCleanup();
|
|
|
gtk_widget_destroy(dialog);
|
|
|
WaitForCleanup();
|
|
|
|
|
|
@@ -259,13 +256,13 @@ nfdresult_t NFD_OpenDialogMultiple( const nfdchar_t *filterList,
|
|
|
if ( AllocPathSet( fileList, outPaths ) == NFD_ERROR )
|
|
|
{
|
|
|
gtk_widget_destroy(dialog);
|
|
|
- NFDi_SetError(NOPATH_MSG);
|
|
|
return NFD_ERROR;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
result = NFD_OKAY;
|
|
|
}
|
|
|
|
|
|
+ WaitForCleanup();
|
|
|
gtk_widget_destroy(dialog);
|
|
|
WaitForCleanup();
|
|
|
|
|
|
@@ -274,7 +271,6 @@ nfdresult_t NFD_OpenDialogMultiple( const nfdchar_t *filterList,
|
|
|
|
|
|
nfdresult_t NFD_SaveDialog( const nfdchar_t *filterList,
|
|
|
const nfdchar_t *defaultPath,
|
|
|
- const nfdchar_t *defaultFilename,
|
|
|
nfdchar_t **outPath )
|
|
|
{
|
|
|
GtkWidget *dialog;
|
|
|
@@ -291,19 +287,21 @@ nfdresult_t NFD_SaveDialog( const nfdchar_t *filterList,
|
|
|
GTK_FILE_CHOOSER_ACTION_SAVE,
|
|
|
"_Cancel", GTK_RESPONSE_CANCEL,
|
|
|
"_Save", GTK_RESPONSE_ACCEPT,
|
|
|
- NULL );
|
|
|
+ NULL );
|
|
|
gtk_file_chooser_set_do_overwrite_confirmation( GTK_FILE_CHOOSER(dialog), TRUE );
|
|
|
|
|
|
- /* Build the filter list */
|
|
|
+ /* Build the filter list */
|
|
|
AddFiltersToDialog(dialog, filterList);
|
|
|
- SetDefaultPath(dialog, defaultPath);
|
|
|
|
|
|
- result = NFD_CANCEL;
|
|
|
+ /* Set the default path */
|
|
|
+ SetDefaultPath(dialog, defaultPath);
|
|
|
+
|
|
|
+ result = NFD_CANCEL;
|
|
|
if ( gtk_dialog_run( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT )
|
|
|
{
|
|
|
char *filename;
|
|
|
filename = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER(dialog) );
|
|
|
-
|
|
|
+
|
|
|
{
|
|
|
size_t len = strlen(filename);
|
|
|
*outPath = NFDi_Malloc( len + 1 );
|
|
|
@@ -312,7 +310,6 @@ nfdresult_t NFD_SaveDialog( const nfdchar_t *filterList,
|
|
|
{
|
|
|
g_free( filename );
|
|
|
gtk_widget_destroy(dialog);
|
|
|
- NFDi_SetError(NOPATH_MSG);
|
|
|
return NFD_ERROR;
|
|
|
}
|
|
|
}
|
|
|
@@ -321,39 +318,43 @@ nfdresult_t NFD_SaveDialog( const nfdchar_t *filterList,
|
|
|
result = NFD_OKAY;
|
|
|
}
|
|
|
|
|
|
+ WaitForCleanup();
|
|
|
gtk_widget_destroy(dialog);
|
|
|
-
|
|
|
WaitForCleanup();
|
|
|
-
|
|
|
+
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
-nfdresult_t NFD_ChooseDirectory( const nfdchar_t *prompt,
|
|
|
- const nfdchar_t *defaultPath,
|
|
|
- nfdchar_t **outPath )
|
|
|
+nfdresult_t NFD_PickFolder(const nfdchar_t *defaultPath,
|
|
|
+ nfdchar_t **outPath)
|
|
|
{
|
|
|
- GtkWidget *dialog = NULL;
|
|
|
- nfdresult_t result = NFD_ERROR;
|
|
|
+ GtkWidget *dialog;
|
|
|
+ nfdresult_t result;
|
|
|
|
|
|
- if ( !gtk_init_check( NULL, NULL ) )
|
|
|
+ if (!gtk_init_check(NULL, NULL))
|
|
|
{
|
|
|
NFDi_SetError(INIT_FAIL_MSG);
|
|
|
return NFD_ERROR;
|
|
|
}
|
|
|
- dialog = gtk_file_chooser_dialog_new( prompt,
|
|
|
+
|
|
|
+ dialog = gtk_file_chooser_dialog_new( "Select folder",
|
|
|
NULL,
|
|
|
GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
|
|
|
"_Cancel", GTK_RESPONSE_CANCEL,
|
|
|
- "_Open", GTK_RESPONSE_ACCEPT,
|
|
|
- NULL );
|
|
|
+ "_Select", GTK_RESPONSE_ACCEPT,
|
|
|
+ NULL );
|
|
|
+ gtk_file_chooser_set_do_overwrite_confirmation( GTK_FILE_CHOOSER(dialog), TRUE );
|
|
|
|
|
|
- SetDefaultPath(dialog, defaultPath);
|
|
|
|
|
|
- result = NFD_CANCEL;
|
|
|
+ /* Set the default path */
|
|
|
+ SetDefaultPath(dialog, defaultPath);
|
|
|
+
|
|
|
+ result = NFD_CANCEL;
|
|
|
if ( gtk_dialog_run( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT )
|
|
|
{
|
|
|
- char *filename = NULL;
|
|
|
+ char *filename;
|
|
|
filename = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER(dialog) );
|
|
|
+
|
|
|
{
|
|
|
size_t len = strlen(filename);
|
|
|
*outPath = NFDi_Malloc( len + 1 );
|
|
|
@@ -362,17 +363,17 @@ nfdresult_t NFD_ChooseDirectory( const nfdchar_t *prompt,
|
|
|
{
|
|
|
g_free( filename );
|
|
|
gtk_widget_destroy(dialog);
|
|
|
- NFDi_SetError(NOPATH_MSG);
|
|
|
return NFD_ERROR;
|
|
|
}
|
|
|
}
|
|
|
g_free(filename);
|
|
|
+
|
|
|
result = NFD_OKAY;
|
|
|
}
|
|
|
|
|
|
+ WaitForCleanup();
|
|
|
gtk_widget_destroy(dialog);
|
|
|
-
|
|
|
WaitForCleanup();
|
|
|
-
|
|
|
- return result;
|
|
|
+
|
|
|
+ return result;
|
|
|
}
|