Re: problem with FileChooserButton in save mode



On 13.07.2008 at 09:49, Murray Cumming <murrayc murrayc com> wrote:

On Thu, 2008-07-10 at 11:08 +0200, squall23 gmx at wrote:
Hy guys!

I am interested in using a Gtk::FileChooserButton with Gtk::FILE_CHOOSER_ACTION_SAVE or FILE_CHOOSER_ACTION_CREATE_FOLDER action. But when try to switch the button in one of these modes I get one of the following errors.

Gtk-WARNING **: gtk_file_chooser_button_set_property: Choosers of type `gtkmm__GtkFileChooserButton' do not support `GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER'.

Gtk-WARNING **: gtk_file_chooser_button_set_property: Choosers of type `gtkmm__GtkFileChooserButton' do not support `GTK_FILE_CHOOSER_ACTION_SAVE'.

Because I get these errors during execution I blame my runtime files for the problem. Currently I am using gtkmm and gtk in version 2.10.11-1 under windows xp. Shouldn't this feature be supported by this runtime versions or what are the minimum requirements for this purposes?

This seems rather odd. I haven't heard of this error before. Could you
submit a small-as-possible compileable test case to our bugzilla,
please?


You can reproduce this behaviour with the following code:

------------------------------------------------------------------------------------------
#include<gtkmm.h>

int main(int argc, char **argv)
{
    Gtk::Main Kit(argc,argv);
    Gtk::Window Window;
    Gtk::FileChooserButton Button("Test",Gtk::FILE_CHOOSER_ACTION_SAVE);

    Window.add(Button);
    Window.show_all();

    Kit.run(Window);
}
------------------------------------------------------------------------------------------

However I could already figure out that this is a problem of GTK and not GTKmm.
I have tested it with the following modified example program:

------------------------------------------------------------------------------------------
#include <gtk/gtk.h>

/* This is a callback function. The data arguments are ignored
 * in this example. More on callbacks below. */
static void hello( GtkWidget *widget,
                   gpointer   data )
{
    g_print ("Hello World\n");
}

static gboolean delete_event( GtkWidget *widget,
                              GdkEvent  *event,
                              gpointer   data )
{
    /* If you return FALSE in the "delete_event" signal handler,
     * GTK will emit the "destroy" signal. Returning TRUE means
     * you don't want the window to be destroyed.
     * This is useful for popping up 'are you sure you want to quit?'
     * type dialogs. */

    g_print ("delete event occurred\n");

    /* Change TRUE to FALSE and the main window will be destroyed with
     * a "delete_event". */

    return FALSE;
}

/* Another callback */
static void destroy( GtkWidget *widget,
                     gpointer   data )
{
    gtk_main_quit ();
}

int main( int   argc,
          char *argv[] )
{
    /* GtkWidget is the storage type for widgets */
    GtkWidget *window;
    GtkWidget *button;

    /* This is called in all GTK applications. Arguments are parsed
     * from the command line and are returned to the application. */
    gtk_init (&argc, &argv);

    /* create a new window */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    /* When the window is given the "delete_event" signal (this is given
     * by the window manager, usually by the "close" option, or on the
     * titlebar), we ask it to call the delete_event () function
     * as defined above. The data passed to the callback
     * function is NULL and is ignored in the callback function. */
    g_signal_connect (G_OBJECT (window), "delete_event",
		      G_CALLBACK (delete_event), NULL);

    /* Here we connect the "destroy" event to a signal handler.
     * This event occurs when we call gtk_widget_destroy() on the window,
     * or if we return FALSE in the "delete_event" callback. */
    g_signal_connect (G_OBJECT (window), "destroy",
		      G_CALLBACK (destroy), NULL);

    /* Sets the border width of the window. */
    gtk_container_set_border_width (GTK_CONTAINER (window), 10);

    /* Creates a new button with the label "Hello World". */
    button = gtk_file_chooser_widget_new(GTK_FILE_CHOOSER_ACTION_SAVE);


    /* This packs the button into the window (a gtk container). */
    gtk_container_add (GTK_CONTAINER (window), button);

    /* The final step is to display this newly created widget. */
    gtk_widget_show (button);

    /* and the window */
    gtk_widget_show (window);

    /* All GTK applications must have a gtk_main(). Control ends here
     * and waits for an event to occur (like a key press or
     * mouse event). */
    gtk_main ();

    return 0;
}
------------------------------------------------------------------------------------------

After looking at the source of gtk i was even able find that only the modes OPEN and SELECT_DIRECTORY are explicit valid. You can see in the implementation of the
gtk_file_chooser_button_new method:

------------------------------------------------------------------------------------------
GtkWidget *
gtk_file_chooser_button_new (const gchar          *title,
			     GtkFileChooserAction  action)
{
  g_return_val_if_fail (action == GTK_FILE_CHOOSER_ACTION_OPEN ||
			action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, NULL);

  return g_object_new (GTK_TYPE_FILE_CHOOSER_BUTTON,
		       "action", action,
		       "title", (title ? title : _(DEFAULT_TITLE)),
		       NULL);
}
------------------------------------------------------------------------------------------

So this problem has nothing to do with gtkmm at all. I think I will move on to the GTK mailing list. Maybe they could explain me why GTK_FILE_CHOOSER_ACTION_SAVE is an invalid action for a FileChooserButton. If anyone who is related to GTK development is here I would
be grateful for any kind of support.


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]