Re: GtkFileChooser problem
- From: tito-wolit <tito-wolit tiscali it>
- To: gtk-app-devel-list gnome org
- Subject: Re: GtkFileChooser problem
- Date: Wed, 25 Oct 2017 07:55:34 +0200
On 10/25/2017 12:43 AM, rbd wrote:
Hi all,
I have done some further experimentation with regard to my
GtkFileChooser problem and discovered that the piece of my code that
seems to be triggering this problem is the call to
gtk_file_chooser_set_current_name() -- if I remove that then I do not
get the error described in my last message.
Looking closer at the documentation I see a statement that says this
function should not be used when an existing file is being specified, so
I will take responsibility for ignoring that warning. I have to say,
however, that this seems to me to be an unacceptable restriction -- why
shouldn't I be able to initialize the text entry field at the top of the
dialog to a completely clear and unambiguous presentation of the default
name that will be returned by the dialog? And, why does a
GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER dialog which is supposedly
designed to work with either pre-existing or yet-to-be-created
filesystem objects (i) try to create something that already exists and
then (ii) complain when that creation attempt fails, whether or not I
call gtk_file_chooser_set_current_name() to set the text entry field?
I have noticed other inconsistent and weird behavior in the UI of this
widget through my further experimentation today:
(1) When I do use gtk_file_chooser_set_current_name() to initialize the
text entry field as shown in my original code, when I click the dialog's
OK response button I get the error I have described. But if instead of
clicking that button I activate the cursor in the text entry field and
hit RETURN (without making any change to that field), everything works
fine. Why is only clicking the OK button problematic?
(2) Independently of whether or not I use
gtk_file_chooser_set_current_name() to initialize the text entry field
to the name of a pre-existing current working directory (CWD), I have
noticed that the OK response button will often be grayed out (and hence
unclickable) even when the final path component of that CWD is selected
in the dialog's large directory contents subwindow when the dialog is
first mapped. Often I can fix this only by clicking on different
directory contents subwindow objects (i.e., other subdirectories),
perhaps several times, and then re-clicking on the subdirectory object
which corresponds to my CWD (and which was originally selected). Only
then does the OK response button get activated and become clickable.
I can appreciate that this widget may require a complicated
implementation, and that in particular it may be difficult to properly
correlate the text entry field with the directory contents subwindow. I
have to say, however, that I think it would be worthwhile to get rid of
the confusing limitations and behaviors noted above.
If there is further documentation on these issues somewhere that would
help me to understand and avoid them better I would very much like to
see it.
Thanks!
Roger Davis
Univ. of Hawaii
Hi,
i recall having struggled with a file chooser some years ago,
but after some iterations got something that worked for me
for simple file operations. It was however impossible at that
time to tell the file chooser to open a file OR a dir so i ended
reinventing the wheel and wrote my own file chooser widget
( if you are interested in that drop a mail, but it is a lot
of code, some 1000+ lines).
Nonetheless attached inline you will find a copy of what did
work for me in the hope that it helps you. This is for gtk 2.0 tough
and maybe needs some adaptations.
Ciao,
Tito
/*
*
* Gtk+2.x Utility routines: File selection widget.
* Copyright (C) 2002-2009 by <tito-wolit tiscali it>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* Please read the COPYING and README file!!!
*
* Report bugs to <tito-wolit tiscali it>
*
*/
/*#################################### File Selection Widget
#####################################################*/
#include <stdio.h>
#include <gtk/gtk.h>
#include "mylib.h"
#include "mygtk.h"
/*
GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_FILE_CHOOSER_ACTION_SAVE,
GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER
*/
char *file_chooser(const char *title, GtkFileChooserAction fs_action, gboolean local_only, gboolean
show_hidden,
const char *name, const char *folder, const 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,
NULL, /*parent_window*/
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));
}
if (G_IS_OBJECT (dialog)) {
gtk_widget_destroy (dialog);
}
return filename;
}
char *default_file_chooser(const char *title, GtkFileChooserAction fs_action)
{
return file_chooser(title, fs_action, FALSE, TRUE, NULL, NULL, NULL);
}
/*############################### End of File Selection Widget
#####################################################*/
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]