diff options
Diffstat (limited to 'mixgtk')
| -rw-r--r-- | mixgtk/mixgtk_gen_handlers.c | 77 | 
1 files changed, 46 insertions, 31 deletions
| diff --git a/mixgtk/mixgtk_gen_handlers.c b/mixgtk/mixgtk_gen_handlers.c index 7ebadfb..73978cb 100644 --- a/mixgtk/mixgtk_gen_handlers.c +++ b/mixgtk/mixgtk_gen_handlers.c @@ -27,56 +27,71 @@  /* grab a file with an externally provided callback */  typedef void (*file_callback_t)(const gchar *file); +static GtkFileChooser * +get_chooser_ (const gchar *title, gboolean src) +{ +  static GtkFileChooser *dialog = NULL; +  static GtkFileFilter *src_filter = NULL; +  static GtkFileFilter *code_filter = NULL; + +  if (dialog == NULL) +    { +      dialog = GTK_FILE_CHOOSER +        (gtk_file_chooser_dialog_new ("gmixvm", +                                      NULL, +                                      GTK_FILE_CHOOSER_ACTION_OPEN, +                                      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, +                                      GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, +                                      NULL)); +      src_filter = gtk_file_filter_new (); +      gtk_file_filter_add_pattern (src_filter, "*.mixal"); +      code_filter = gtk_file_filter_new (); +      gtk_file_filter_add_pattern (code_filter, "*.mix"); +      gtk_file_chooser_add_filter (dialog, src_filter); +      gtk_file_chooser_add_filter (dialog, code_filter); +    } + +  gtk_file_chooser_set_filter (dialog, src? src_filter : code_filter); +  gtk_window_set_title (GTK_WINDOW (dialog), title); + +  return dialog; +} +  static void  get_file_ (file_callback_t callback,             const gchar *title, -           const gchar *pattern, +           gboolean is_src,             const gchar *def_file)  {    static gchar *last_folder = NULL;    if (callback != NULL)      { -      GtkWidget *dialog; - -      dialog = -        gtk_file_chooser_dialog_new (title, -                                     NULL, -                                     GTK_FILE_CHOOSER_ACTION_OPEN, -                                     GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, -                                     GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, -                                     NULL); - -      if (pattern != NULL) -        { -          GtkFileFilter *filter = gtk_file_filter_new (); -          gtk_file_filter_add_pattern (filter, pattern); -          gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), filter); -        } +      GtkFileChooser *dialog = get_chooser_ (title, is_src);        if (def_file != NULL)          { -          gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (dialog), def_file); +          gtk_file_chooser_set_filename (dialog, def_file);          }        else if (last_folder != NULL)          { -          gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), -                                               last_folder); +          gtk_file_chooser_set_current_folder (dialog, last_folder);          } -      if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) +      gint result = gtk_dialog_run (GTK_DIALOG (dialog)); +      gtk_widget_hide (GTK_WIDGET (dialog)); + +      if (result == GTK_RESPONSE_ACCEPT)          { -          gchar *filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); -          callback (filename); +          gchar *filename = gtk_file_chooser_get_filename (dialog);            if (filename)              { +              callback (filename);                if (last_folder) g_free (last_folder);                last_folder = g_path_get_dirname (filename);                g_free (filename);              }          } - -      gtk_widget_destroy (dialog);      }  } @@ -99,20 +114,20 @@ exec_cmd_ (mix_vm_command_t cmd, const gchar *arg)  static void  open_cb_ (const gchar *file)  { -  if (file) exec_cmd_ (MIX_CMD_LOAD, file); +  exec_cmd_ (MIX_CMD_LOAD, file);  }  void  on_file_open_activate (GtkWidget *w, gpointer data)  { -  get_file_ (open_cb_, _("Load MIX program..."), "*.mix", NULL); +  get_file_ (open_cb_, _("Load MIX program..."), FALSE, NULL);  }  /* edit mixal source */  static void  edit_cb_ (const gchar *file)  { -  if (file) exec_cmd_ (MIX_CMD_EDIT, file); +  exec_cmd_ (MIX_CMD_EDIT, file);  }  void @@ -120,7 +135,7 @@ on_file_edit_activate (GtkWidget *w, gpointer data)  {    get_file_ (edit_cb_,               _("Edit MIXAL source file..."), -             "*.mixal", +             TRUE,               mixgtk_cmd_dispatcher_get_src_path ());  } @@ -128,7 +143,7 @@ on_file_edit_activate (GtkWidget *w, gpointer data)  static void  compile_cb_ (const gchar *file)  { -  if (file) exec_cmd_ (MIX_CMD_COMPILE, file); +  exec_cmd_ (MIX_CMD_COMPILE, file);  }  void @@ -136,7 +151,7 @@ on_file_compile_activate (GtkWidget *w, gpointer data)  {    get_file_ (compile_cb_,               _("Compile MIXAL source file..."), -             "*.mixal", +             TRUE,               mixgtk_cmd_dispatcher_get_src_path ());  } | 
