preliminary support for splitting of windows. Does not respect window sizes yet....
[rodin/chimara.git] / src / fileref.c
index b277bb33f974c34be360c306b77df057dc41289c..be4f23f816aa1783c82f6419cef3d2da3168d73b 100644 (file)
@@ -3,10 +3,9 @@
 #include <gtk/gtk.h>
 #include <glib/gstdio.h>
 #include "fileref.h"
-#include "error.h"
+#include "chimara-glk-private.h"
 
-/* List of streams currently in existence */
-static GList *fileref_list = NULL;
+extern ChimaraGlkPrivate *glk_data;
 
 /**
  * glk_fileref_iterate:
@@ -31,7 +30,7 @@ glk_fileref_iterate(frefid_t fref, glui32 *rockptr)
        GList *retnode;
        
        if(fref == NULL)
-               retnode = fileref_list;
+               retnode = glk_data->fileref_list;
        else
                retnode = fref->fileref_list->next;
        frefid_t retval = retnode? (frefid_t)retnode->data : NULL;
@@ -69,10 +68,10 @@ fileref_new(gchar *filename, glui32 rock, glui32 usage, glui32 orig_filemode)
        f->filename = g_strdup(filename);
        f->usage = usage;
        f->orig_filemode = orig_filemode;
-
+       
        /* Add it to the global fileref list */
-       fileref_list = g_list_prepend(fileref_list, f);
-       f->fileref_list = fileref_list;
+       glk_data->fileref_list = g_list_prepend(glk_data->fileref_list, f);
+       f->fileref_list = glk_data->fileref_list;
        
        return f;
 }
@@ -102,14 +101,14 @@ glk_fileref_create_temp(glui32 usage, glui32 rock)
        gint handle = g_file_open_tmp("glkXXXXXX", &filename, &error);
        if(handle == -1)
        {
-               error_dialog(NULL, error, "Error creating temporary file: ");
+               g_warning("Error creating temporary file: %s", error->message);
                if(filename)
                        g_free(filename);
                return NULL;
        }
        if(close(handle) == -1) /* There is no g_close()? */
        {
-               error_dialog(NULL, NULL, "Error closing temporary file.");
+               g_warning("Error closing temporary file.");
                if(filename)
                        g_free(filename);
                return NULL;
@@ -144,10 +143,13 @@ glk_fileref_create_by_prompt(glui32 usage, glui32 fmode, glui32 rock)
        /* TODO: Remember current working directory and last used filename
        for each usage */
        GtkWidget *chooser;
+
+       gdk_threads_enter();
+
        switch(fmode)
        {
                case filemode_Read:
-                       chooser = gtk_file_chooser_dialog_new("Select a file", NULL,
+                       chooser = gtk_file_chooser_dialog_new("Select a file to open", NULL,
                                GTK_FILE_CHOOSER_ACTION_OPEN,
                                GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                                GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
@@ -156,9 +158,7 @@ glk_fileref_create_by_prompt(glui32 usage, glui32 fmode, glui32 rock)
                                GTK_FILE_CHOOSER_ACTION_OPEN);
                        break;
                case filemode_Write:
-               case filemode_ReadWrite:
-               case filemode_WriteAppend:
-                       chooser = gtk_file_chooser_dialog_new("Select a file", NULL,
+                       chooser = gtk_file_chooser_dialog_new("Select a file to save to", NULL,
                                GTK_FILE_CHOOSER_ACTION_SAVE,
                                GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                                GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
@@ -168,14 +168,26 @@ glk_fileref_create_by_prompt(glui32 usage, glui32 fmode, glui32 rock)
                        gtk_file_chooser_set_do_overwrite_confirmation(
                                GTK_FILE_CHOOSER(chooser), TRUE);
                        break;
+               case filemode_ReadWrite:
+               case filemode_WriteAppend:
+                       chooser = gtk_file_chooser_dialog_new("Select a file to save to", NULL,
+                               GTK_FILE_CHOOSER_ACTION_SAVE,
+                               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                               GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+                               NULL);
+                       gtk_file_chooser_set_action(GTK_FILE_CHOOSER(chooser),
+                               GTK_FILE_CHOOSER_ACTION_SAVE);
+                       break;
                default:
                        g_warning("glk_fileref_create_by_prompt: Unsupported mode");
+                       gdk_threads_leave();
                        return NULL;
        }
        
        if(gtk_dialog_run( GTK_DIALOG(chooser) ) != GTK_RESPONSE_ACCEPT)
        {
                gtk_widget_destroy(chooser);
+               gdk_threads_leave();
                return NULL;
        }
        gchar *filename = 
@@ -183,6 +195,8 @@ glk_fileref_create_by_prompt(glui32 usage, glui32 fmode, glui32 rock)
        frefid_t f = fileref_new(filename, rock, usage, fmode);
        g_free(filename);
        gtk_widget_destroy(chooser);
+
+       gdk_threads_leave();
        return f;
 }
 
@@ -212,7 +226,7 @@ glk_fileref_create_by_name(glui32 usage, char *name, glui32 rock)
                &error);
        if(osname == NULL)
        {
-               error_dialog(NULL, error, "Error during latin1->filename conversion: ");
+               g_warning("Error during latin1->filename conversion: %s", error->message);
                return NULL;
        }
 
@@ -260,7 +274,7 @@ glk_fileref_create_from_fileref(glui32 usage, frefid_t fref, glui32 rock)
 void
 glk_fileref_destroy(frefid_t fref)
 {
-       fileref_list = g_list_delete_link(fileref_list, fref->fileref_list);
+       glk_data->fileref_list = g_list_delete_link(glk_data->fileref_list, fref->fileref_list);
        if(fref->filename)
                g_free(fref->filename);
        g_free(fref);
@@ -277,7 +291,7 @@ glk_fileref_delete_file(frefid_t fref)
 {
        if( glk_fileref_does_file_exist(fref) )
                if(g_unlink(fref->filename) == -1)
-                       error_dialog(NULL, NULL, "Error deleting file %s", fref->filename);
+                       g_warning("Error deleting file %s", fref->filename);
 }
 
 /**