On Thursday 11 September 2014 07:14:54 Emmanuel Thomas-Maurin wrote:
> I've had a similar problem previously, with non-ascii (for instance 
> cyrillic) user names in app data dir on windows. The trick was to use 
> 'wide char' win32 API functions which all return UTF-16 encoded strings, 
> then convert to UTF-8 (with g_utf16_to_utf8()).
> 
> 
> On 09/11/2014 03:25 AM, Fernando Rodriguez wrote:
> > On Wednesday 10 September 2014 5:07:03 PM Fernando Rodriguez wrote:
> >> On Wednesday 10 September 2014 7:37:28 PM Geert Janssens wrote:
> >>> Hi,
> >>>
> >>> I'm stuck on the following issue. Program is GnuCash on Windows.
> >>>
> >>> Consider the following code snippet:
> >>>
> >>> struct stat statbuf;
> >>> gchar* dirname = g_strdup(g_getenv("GNC_DOTGNUCASH_DIR");
> >>> gint rc = g_stat (dirname, &statbuf);
> >>>
> >>> switch (errno)
> >>> {
> >>>
> >>>    case ENOENT:
> >>>      // Directory doesn't exist
> >>>      // Here is code to create it which I cut for brevity
> >>>      break;
> >>>
> >>>    case EACCES:
> >>>      // Directory can't be accessed
> >>>      exit(1);
> >>>
> >>>    case ENOTDIR:
> >>>      // Not a directory
> >>>      exit(1);
> >>>
> >>>    default:
> >>>      // Unknown error
> >>>      exit(1);
> >>>
> >>> }
> >>>
> >>> // Continue code with valid, existing directory
> >>> ...
> >>>
> >>> So this snippet reads the value of environment variable GNC_DOTGNUCASH_DIR
> >>> and tests whether this is a valid directory.
> >>>
> >>> This works fine when GNC_DOTGNUCASH_DIR uses a limited character set like
> >>> ascii. For example when set to "c:\gcdev\geert" this works well and the
> >>> code continues.
> >>>
> >>> However if set to for example:
> >>> c:\gcdev\Łukasz
> >>> Things go wrong (note the unusual Ł).
> >>>
> >>> In this case the code branches into case ENOENT and creates a directory
> >>> named c:\gcdev\Lukasz (note the plain L now)
> >>> Before it continues.
> >>>
> >>> Setting a breakpoint at rc=g_stat... and examining the value of dirname at
> >>> that point also shows it to have a value of c:\gcdev\Lukasz (with plain
> >>> L).
> >>>
> >>> So it seems I'm losing diacritical information here and I can't pass the
> >>> right directory to my code to use.
> >>>
> >>> What should I do to get the real value from the environment to be able to
> >>> access the true directory ?
> >>>
> >>> Thanks,
> >>>
> >>> Geert
> >>>
> >>> P.S. my locale settings are all "Dutch_Belgium.1252" except for LC_ALL
> >>> which is empty. _______________________________________________
> >>> gtk-app-devel-list mailing list
> >>> gtk-app-devel-list@gnome.org
> >>> https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
> >>
> >> Well gchar is a typedef for char so it only supports ascii. I think you'll
> >> probably have to use Win32 API calls on Windows to access multibyte file
> >> names.
> >>
> >> Also according to the documentation you should use GStatBuf instead of
> >> struct stat on Windows to get consistent behaviour on different compilers.
> >>
> >>
> >>
> >> _______________________________________________
> >> gtk-app-devel-list mailing list
> >> gtk-app-devel-list@gnome.org
> >> https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
> >
> > Actually try using g_utf8_strncpy() instead of g_strdup(). I'm not sure if
> > that'll get you all the way as the docs say g_stat calls the standard 
> > library
> > functions and AFAIK those dont support unicode/multibyte filenames.
> >
> >
> >
> > _______________________________________________
> > gtk-app-devel-list mailing list
> > gtk-app-devel-list@gnome.org
> > https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
> >
> 
> 
> 
Hi,
take a look at this code, maybe it helps:

ZZ

char *file_selector(char *title, GtkFileChooserAction fs_action, gboolean 
local_only, gboolean show_hidden, 
                                        char *name, char *folder, char 
*shortcut_folder)
{
        GtkWidget *dialog;
        char *tmp;
        char *filename = NULL;;

        
        tmp = g_locale_to_utf8((title) ? title : "", -1,NULL,NULL,NULL);        
        dialog = gtk_file_chooser_dialog_new (tmp,
                                                /*parent_window*/ NULL,
                                                fs_action,
                                                GTK_STOCK_CANCEL, 
GTK_RESPONSE_CANCEL,
                                                GTK_STOCK_OPEN, 
GTK_RESPONSE_ACCEPT,
                                                NULL);
        xfree(&tmp);

        gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(dialog), local_only);
        gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(dialog), show_hidden);

        /* Returns a GsList *, not a char * */
        /*gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), 
select_multiple);*/

        if (name) {
                tmp = g_locale_to_utf8((name) , -1,NULL,NULL,NULL);     
                gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), 
tmp);
                xfree(&tmp);    
        }
        
        if (folder) {
                tmp = g_locale_to_utf8((folder) , -1,NULL,NULL,NULL);   
                gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), 
tmp);
                xfree(&tmp);
        }

        if (shortcut_folder) {
                tmp = g_locale_to_utf8((shortcut_folder) , -1,NULL,NULL,NULL);  
                gtk_file_chooser_add_shortcut_folder(GTK_FILE_CHOOSER(dialog), 
tmp, NULL);
                xfree(&tmp);
        }

        if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
                filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER 
(dialog));
        }

        gtk_widget_destroy (dialog);
        return filename;
}
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to