/* Glimmer - session.c
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "declarations.h"
#include "session.h"
#include "dialogs.h"
#include "file-io.h"
#include "main.h"
#include "misc.h"
#include "settings.h"
#include "getprefs.h"
gchar *session_file = NULL;
static GList *session_directories = NULL;
guint
get_last_session (void)
{
guint files;
gchar buffer[256];
if (!general_preferences.open_session)
return (0);
g_snprintf (buffer, sizeof (buffer), "%s/." PACKAGE "/session.last",
getenv ("HOME"));
files = open_session_from_file (session_file ? session_file : buffer);
return (files);
}
void
save_session_cb (GtkWidget * widget, gpointer data)
{
gint success;
gchar buffer[256];
g_snprintf (buffer, sizeof (buffer), "%s/." PACKAGE "/session.last",
getenv ("HOME"));
success = save_session_to_file (session_file ? session_file : buffer);
if (!success)
generic_dialog_with_text (_
("Session file could not be written.\nMake sure that you have write access to $HOME."));
else
display_message ("Session Saved.", FLASH);
}
void
open_session_cb (GtkWidget * widget, gpointer data)
{
static GtkWidget *file_selector = NULL;
gchar *path;
if (!file_selector) {
path = get_path_from_filename (session_file);
widget =
gnome_file_selector_new_with_path (path, GNOME_FILE_SELECTOR_SINGLE,
general_preferences.show_dots,
general_preferences.show_details,
&session_directories);
g_free (path);
gnome_file_selector_set_title (GNOME_FILE_SELECTOR (widget),
_("Open Session..."));
gtk_signal_connect (GTK_OBJECT
(GNOME_FILE_SELECTOR (widget)->ok_button),
"clicked", GTK_SIGNAL_FUNC (open_session_continue),
(gpointer) widget);
gtk_signal_connect_object (GTK_OBJECT
(GNOME_FILE_SELECTOR (widget)->
cancel_button), "clicked",
GTK_SIGNAL_FUNC (gtk_widget_hide),
GTK_OBJECT (widget));
gtk_window_set_transient_for (GTK_WINDOW (widget), GTK_WINDOW (window));
gtk_widget_show (widget);
gtk_widget_grab_focus (GNOME_FILE_SELECTOR (widget)->selection_entry);
} else {
gtk_entry_set_text (GTK_ENTRY
(GNOME_FILE_SELECTOR (file_selector)->
selection_entry), "");
gnome_file_selector_set_history (GNOME_FILE_SELECTOR (file_selector),
&session_directories);
gtk_widget_show (file_selector);
}
}
void
open_session_continue (GtkWidget * widget, GnomeFileSelector * file_list)
{
gchar *string;
gchar *temp;
gint files;
gboolean autosave;
temp = gnome_file_selector_get_filename (GNOME_FILE_SELECTOR (file_list));
string = localize_uri_string (temp);
g_free (temp);
if (check_if_file_exists (string)) {
gtk_widget_hide (GTK_WIDGET (file_list));
if (general_preferences.close_all)
close_all_files_cb (NULL, NULL);
autosave = general_preferences.auto_save;
general_preferences.auto_save = FALSE;
files = open_session_from_file (string);
if (!files) {
generic_dialog_with_text (_("File contained no session data."));
gtk_widget_show (GTK_WIDGET (file_list));
} else {
g_free (session_file);
session_file = g_strdup (string);
set_window_title ();
}
general_preferences.auto_save = autosave;
} else {
gtk_widget_hide (GTK_WIDGET (file_list));
read_error (string);
gtk_widget_show (GTK_WIDGET (file_list));
}
g_free (string);
}
void
save_session_as_cb (GtkWidget * widget, gpointer data)
{
static GtkWidget *file_selector = NULL;
gchar *string;
if (!file_selector) {
string =
session_file ? g_strconcat (g_get_home_dir (), "/." PACKAGE,
NULL) :
get_path_from_filename (session_file);
file_selector =
gnome_file_selector_new_with_path (string,
GNOME_FILE_SELECTOR_SINGLE,
general_preferences.show_dots,
general_preferences.show_details,
&session_directories);
g_free (string);
gnome_file_selector_set_title (GNOME_FILE_SELECTOR (file_selector),
_("Save session file..."));
gtk_signal_connect (GTK_OBJECT
(GNOME_FILE_SELECTOR (file_selector)->ok_button),
"clicked",
GTK_SIGNAL_FUNC (save_session_as_continue),
file_selector);
gtk_signal_connect_object (GTK_OBJECT
(GNOME_FILE_SELECTOR (file_selector)->
cancel_button), "clicked",
GTK_SIGNAL_FUNC (gtk_widget_hide),
GTK_OBJECT (file_selector));
gtk_window_set_transient_for (GTK_WINDOW (file_selector),
GTK_WINDOW (window));
gtk_widget_show (file_selector);
} else {
if (gnome_file_selector_show_dots (GNOME_FILE_SELECTOR (file_selector))
!= general_preferences.show_dots)
gnome_file_selector_set_show_dots (GNOME_FILE_SELECTOR
(file_selector),
general_preferences.show_dots);
gnome_file_selector_set_history (GNOME_FILE_SELECTOR (file_selector),
&session_directories);
gtk_widget_show (file_selector);
}
if (session_file) {
string = get_file_from_filename (session_file);
gtk_entry_set_text (GTK_ENTRY
(GNOME_FILE_SELECTOR (file_selector)->
selection_entry), string);
g_free (string);
} else {
gtk_entry_set_text (GTK_ENTRY
(GNOME_FILE_SELECTOR (file_selector)->
selection_entry), "");
}
gtk_widget_grab_focus (GNOME_FILE_SELECTOR (file_selector)->
selection_entry);
}
void
save_session_as_continue (GtkWidget * widget, GnomeFileSelector * file_list)
{
gchar *string;
gchar *temp;
gint result;
temp = gnome_file_selector_get_filename (GNOME_FILE_SELECTOR (file_list));
string = localize_uri_string (temp);
g_free (temp);
if (check_if_file_exists (string)) {
gtk_widget_hide (GTK_WIDGET (file_list));
result =
file_exists_error (string,
GTK_SIGNAL_FUNC
(save_session_as_error_continue));
if (result)
gtk_widget_show (GTK_WIDGET (file_list));
} else {
if (save_session_to_file (string)) {
gtk_widget_hide (GTK_WIDGET (file_list));
g_free (session_file);
session_file = g_new (char, strlen (string) + 1);
strcpy (session_file, string);
set_window_title ();
} else {
save_error (string);
gtk_widget_show (GTK_WIDGET (file_list));
}
}
g_free (string);
}
void
save_session_as_error_continue (GtkWidget * widget, gchar * filename)
{
gboolean success;
success = save_session_to_file (filename);
if (!success)
generic_dialog_with_text (_("Session save failed."));
else {
g_free (session_file);
session_file = g_new (char, strlen (filename) + 1);
strcpy (session_file, filename);
set_window_title ();
}
}
gboolean
save_session_to_file (gchar * filename)
{
FILE *file;
GList *temp = NULL;
GdsFile *current;
if ((file = fopen (filename, "w"))) {
temp = g_list_first (files_list);
while (temp) {
current = (GdsFile *) temp->data;
fprintf (file, "\n");
fprintf (file, "filename=%s\n", current->filename);
fprintf (file, "over_ride=%d\n", current->props.over_ride);
fprintf (file, "bracketmatch=%d\n", current->props.bracketmatch);
fprintf (file, "highlight=%d\n", current->props.syntax);
fprintf (file, "use_spaces=%d\n", current->props.use_spaces);
fprintf (file, "tab_stop=%d\n", current->props.spaces);
fprintf (file, "line=%d\n",
gtk_extext_get_line (GTK_EXTEXT (current->text)));
if (current->props.dir)
fprintf (file, "directory=%s\n", current->props.dir);
if (current->props.compiler)
fprintf (file, "compiler=%s\n", current->props.compiler);
if (current->props.debugger)
fprintf (file, "debugger=%s\n", current->props.debugger);
if (current->props.execution)
fprintf (file, "execution=%s\n", current->props.execution);
fprintf (file, "\n");
temp = temp->next;
}
fclose (file);
} else {
return (FALSE);
}
return (TRUE);
}
guint
open_session_from_file (gchar * filename)
{
FILE *file;
gint success = 0;
gchar *text;
gchar buffer[1024];
gchar file_string[] = "filename=";
gchar directory_string[] = "directory=";
gchar compiler_string[] = "compiler=";
gchar debugger_string[] = "debugger=";
gchar execution_string[] = "execution=";
gchar *newfile = NULL;
GdsFileProperties props;
gint line;
props.bracketmatch = general_preferences.bracketmatch;
props.dir = NULL;
props.compiler = NULL;
props.debugger = NULL;
props.execution = NULL;
if (!(file = fopen (filename, "r")))
return (0);
if (app->window != NULL)
gdk_window_set_cursor (app->window, gdk_cursor_new (GDK_WATCH));
while (fgets (buffer, sizeof (buffer), file)) {
while (gtk_events_pending ())
gtk_main_iteration ();
if (strstr (buffer, "")) {
props.bracketmatch = general_preferences.bracketmatch;
while (fgets (buffer, sizeof (buffer), file) != NULL) {
if (strstr (buffer, ""))
break;
if ((text = strrchr (buffer, '\n')))
*text = '\0';
if ((text = strstr (buffer, file_string))) {
g_free (newfile);
newfile = g_strdup (text + strlen (file_string));
continue;
} else if (sscanf (buffer, "over_ride=%d", &props.over_ride)) {
continue;
} else
if (sscanf (buffer, "bracketmatch=%d", &props.bracketmatch))
{
continue;
} else if (sscanf (buffer, "highlight=%d", &props.syntax)) {
continue;
} else
if (sscanf (buffer, "auto_indent=%d", &props.auto_indent)) {
continue;
} else if (sscanf (buffer, "use_spaces=%d", &props.use_spaces)) {
continue;
} else if (sscanf (buffer, "tab_stop=%d", &props.spaces)) {
continue;
} else if (sscanf (buffer, "line=%d", &line)) {
continue;
} else if ((text = strstr (buffer, directory_string))) {
g_free (props.dir);
props.dir = g_strdup (text + strlen (directory_string));
continue;
} else if ((text = strstr (buffer, compiler_string))) {
g_free (props.compiler);
props.compiler = g_strdup (text + strlen (compiler_string));
continue;
} else if ((text = strstr (buffer, debugger_string))) {
g_free (props.debugger);
props.debugger = g_strdup (text + strlen (debugger_string));
continue;
} else if ((text = strstr (buffer, execution_string))) {
g_free (props.execution);
props.execution =
g_strdup (text + strlen (execution_string));
continue;
}
}
if (newfile && check_if_file_exists (newfile)) {
open_file_real (newfile);
success++;
while (gtk_events_pending ())
gtk_main_iteration ();
if (GTK_EXTEXT (cur_file->text)->scroll_line_count < 1)
GTK_EXTEXT (cur_file->text)->scroll_line_count = 10;
gtk_extext_set_line (GTK_EXTEXT (cur_file->text), line);
cur_file->props.over_ride = props.over_ride;
cur_file->props.bracketmatch = props.bracketmatch;
cur_file->props.syntax = props.syntax;
cur_file->props.auto_indent = props.auto_indent;
cur_file->props.use_spaces = props.use_spaces;
cur_file->props.spaces = props.spaces;
if (props.over_ride) {
gtk_extext_set_highlight (GTK_EXTEXT (cur_file->text),
props.syntax);
GTK_EXTEXT (cur_file->text)->default_tab_width =
props.spaces;
}
if (props.dir) {
g_free (cur_file->props.dir);
cur_file->props.dir = g_strdup (props.dir);
}
if (props.compiler) {
g_free (cur_file->props.compiler);
cur_file->props.compiler = g_strdup (props.compiler);
}
if (props.debugger) {
g_free (cur_file->props.debugger);
cur_file->props.debugger = g_strdup (props.debugger);
}
if (props.execution) {
g_free (cur_file->props.execution);
cur_file->props.execution = g_strdup (props.execution);
}
}
}
}
fclose (file);
g_free (newfile);
g_free (props.dir);
g_free (props.compiler);
g_free (props.debugger);
g_free (props.execution);
if (app->window)
gdk_window_set_cursor (app->window, gdk_cursor_new (GDK_LEFT_PTR));
return (success);
}
void
save_session_directory_history (void)
{
save_directory_history (session_directories, "session");
}
void
load_session_directory_history (void)
{
get_directory_history (&session_directories, "session");
}