Save the session whenever it changes, instead of on quit.

This commit is contained in:
Christian Dywan 2008-07-23 20:17:13 +02:00
parent 5e66e09c00
commit 3301b37803
3 changed files with 108 additions and 128 deletions

View file

@ -334,6 +334,30 @@ midori_web_list_add_item_cb (MidoriWebList* trash,
} }
} }
void
midori_browser_session_cb (MidoriBrowser* browser,
gpointer arg1,
KatzeXbelItem* session)
{
gchar* config_path;
gchar* config_file;
GError* error;
config_path = g_build_filename (g_get_user_config_dir (),
PACKAGE_NAME, NULL);
g_mkdir_with_parents (config_path, 0755);
config_file = g_build_filename (config_path, "session.xbel", NULL);
error = NULL;
if (!katze_xbel_folder_to_file (session, config_file, &error))
{
g_warning (_("The session couldn't be saved. %s"), error->message);
g_error_free (error);
}
g_free (config_file);
g_free (config_path);
}
int int
main (int argc, main (int argc,
char** argv) char** argv)
@ -555,7 +579,7 @@ main (int argc,
midori_app_add_browser (app, browser); midori_app_add_browser (app, browser);
gtk_widget_show (GTK_WIDGET (browser)); gtk_widget_show (GTK_WIDGET (browser));
KatzeXbelItem* session = katze_xbel_folder_new (); KatzeXbelItem* session = midori_browser_get_proxy_xbel_folder (browser);
n = katze_xbel_folder_get_n_items (_session); n = katze_xbel_folder_get_n_items (_session);
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
{ {
@ -568,6 +592,13 @@ main (int argc,
midori_browser_activate_action (browser, "Location"); midori_browser_activate_action (browser, "Location");
katze_xbel_item_unref (_session); katze_xbel_item_unref (_session);
g_signal_connect_after (browser, "notify::uri",
G_CALLBACK (midori_browser_session_cb), session);
g_signal_connect_after (browser, "add-tab",
G_CALLBACK (midori_browser_session_cb), session);
g_signal_connect_after (browser, "remove-tab",
G_CALLBACK (midori_browser_session_cb), session);
/* Load extensions */ /* Load extensions */
JSGlobalContextRef js_context = gjs_global_context_new (); JSGlobalContextRef js_context = gjs_global_context_new ();
/* FIXME: We want to honor system installed addons as well */ /* FIXME: We want to honor system installed addons as well */
@ -626,19 +657,6 @@ main (int argc,
g_error_free (error); g_error_free (error);
} }
katze_xbel_item_unref (xbel_trash); katze_xbel_item_unref (xbel_trash);
g_object_get (settings, "load-on-startup", &load_on_startup, NULL);
if (load_on_startup == MIDORI_STARTUP_LAST_OPEN_PAGES)
{
katze_assign (config_file, g_build_filename (config_path,
"session.xbel", NULL));
error = NULL;
if (!katze_xbel_folder_to_file (session, config_file, &error))
{
g_warning (_("The session couldn't be saved. %s"), error->message);
g_error_free (error);
}
}
katze_xbel_item_unref (session);
katze_assign (config_file, g_build_filename (config_path, "config", NULL)); katze_assign (config_file, g_build_filename (config_path, "config", NULL));
error = NULL; error = NULL;
if (!settings_save_to_file (settings, config_file, &error)) if (!settings_save_to_file (settings, config_file, &error))

View file

@ -89,6 +89,7 @@ enum
PROP_MENUBAR, PROP_MENUBAR,
PROP_NAVIGATIONBAR, PROP_NAVIGATIONBAR,
PROP_URI,
PROP_TAB, PROP_TAB,
PROP_STATUSBAR, PROP_STATUSBAR,
PROP_SETTINGS, PROP_SETTINGS,
@ -105,7 +106,7 @@ enum
NEW_WINDOW, NEW_WINDOW,
ADD_TAB, ADD_TAB,
ADD_URI, REMOVE_TAB,
ACTIVATE_ACTION, ACTIVATE_ACTION,
QUIT, QUIT,
@ -382,6 +383,7 @@ midori_web_view_notify_load_status_cb (GtkWidget* web_view,
gtk_icon_entry_set_icon_from_pixbuf (GTK_ICON_ENTRY ( gtk_icon_entry_set_icon_from_pixbuf (GTK_ICON_ENTRY (
gtk_bin_get_child (GTK_BIN (browser->location))), gtk_bin_get_child (GTK_BIN (browser->location))),
GTK_ICON_ENTRY_SECONDARY, NULL); GTK_ICON_ENTRY_SECONDARY, NULL);
g_object_notify (G_OBJECT (browser), "uri");
} }
_midori_browser_update_interface (browser); _midori_browser_update_interface (browser);
@ -856,7 +858,7 @@ midori_browser_tab_close_clicked (GtkWidget* tab_close,
gtk_widget_destroy (widget); gtk_widget_destroy (widget);
} }
static gint static void
_midori_browser_add_tab (MidoriBrowser* browser, _midori_browser_add_tab (MidoriBrowser* browser,
GtkWidget* widget) GtkWidget* widget)
{ {
@ -1036,24 +1038,13 @@ _midori_browser_add_tab (MidoriBrowser* browser,
G_CALLBACK (midori_browser_tab_destroy_cb), browser); G_CALLBACK (midori_browser_tab_destroy_cb), browser);
_midori_browser_update_actions (browser); _midori_browser_update_actions (browser);
n = gtk_notebook_page_num (GTK_NOTEBOOK (browser->notebook), scrolled);
return n;
} }
static gint static void
_midori_browser_add_uri (MidoriBrowser* browser, _midori_browser_remove_tab (MidoriBrowser* browser,
const gchar* uri) GtkWidget* widget)
{ {
GtkWidget* web_view; gtk_widget_destroy (widget);
web_view = g_object_new (MIDORI_TYPE_WEB_VIEW,
"uri", uri,
"settings", browser->settings,
NULL);
gtk_widget_show (web_view);
return midori_browser_add_tab (browser, web_view);
} }
static void static void
@ -1112,80 +1103,6 @@ midori_cclosure_marshal_VOID__OBJECT_POINTER_POINTER (GClosure* closure,
data2); data2);
} }
static void
midori_cclosure_marshal_INT__OBJECT (GClosure* closure,
GValue* return_value,
guint n_param_values,
const GValue* param_values,
gpointer invocation_hint,
gpointer marshal_data)
{
typedef gint(*GMarshalFunc_INT__OBJECT) (gpointer data1,
gpointer arg_1,
gpointer data2);
register GMarshalFunc_INT__OBJECT callback;
register GCClosure* cc = (GCClosure*) closure;
register gpointer data1, data2;
gint v_return;
g_return_if_fail (return_value != NULL);
g_return_if_fail (n_param_values == 2);
if (G_CCLOSURE_SWAP_DATA (closure))
{
data1 = closure->data;
data2 = g_value_peek_pointer (param_values + 0);
}
else
{
data1 = g_value_peek_pointer (param_values + 0);
data2 = closure->data;
}
callback = (GMarshalFunc_INT__OBJECT) (marshal_data
? marshal_data : cc->callback);
v_return = callback (data1,
g_value_get_object (param_values + 1),
data2);
g_value_set_int (return_value, v_return);
}
static void
midori_cclosure_marshal_INT__STRING (GClosure* closure,
GValue* return_value,
guint n_param_values,
const GValue* param_values,
gpointer invocation_hint,
gpointer marshal_data)
{
typedef gint(*GMarshalFunc_INT__STRING) (gpointer data1,
const gchar* arg_1,
gpointer data2);
register GMarshalFunc_INT__STRING callback;
register GCClosure* cc = (GCClosure*) closure;
register gpointer data1, data2;
gint v_return;
g_return_if_fail (return_value != NULL);
g_return_if_fail (n_param_values == 2);
if (G_CCLOSURE_SWAP_DATA (closure))
{
data1 = closure->data;
data2 = g_value_peek_pointer (param_values + 0);
}
else
{
data1 = g_value_peek_pointer (param_values + 0);
data2 = closure->data;
}
callback = (GMarshalFunc_INT__STRING) (marshal_data
? marshal_data : cc->callback);
v_return = callback (data1,
g_value_get_string (param_values + 1),
data2);
g_value_set_int (return_value, v_return);
}
static void static void
midori_browser_class_init (MidoriBrowserClass* class) midori_browser_class_init (MidoriBrowserClass* class)
{ {
@ -1231,20 +1148,20 @@ midori_browser_class_init (MidoriBrowserClass* class)
G_STRUCT_OFFSET (MidoriBrowserClass, add_tab), G_STRUCT_OFFSET (MidoriBrowserClass, add_tab),
0, 0,
NULL, NULL,
midori_cclosure_marshal_INT__OBJECT, g_cclosure_marshal_VOID__OBJECT,
G_TYPE_INT, 1, G_TYPE_NONE, 1,
GTK_TYPE_WIDGET); GTK_TYPE_WIDGET);
signals[ADD_URI] = g_signal_new ( signals[REMOVE_TAB] = g_signal_new (
"add-uri", "remove-tab",
G_TYPE_FROM_CLASS (class), G_TYPE_FROM_CLASS (class),
(GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
G_STRUCT_OFFSET (MidoriBrowserClass, add_uri), G_STRUCT_OFFSET (MidoriBrowserClass, remove_tab),
0, 0,
NULL, NULL,
midori_cclosure_marshal_INT__STRING, g_cclosure_marshal_VOID__OBJECT,
G_TYPE_INT, 1, G_TYPE_NONE, 1,
G_TYPE_STRING); GTK_TYPE_WIDGET);
signals[ACTIVATE_ACTION] = g_signal_new ( signals[ACTIVATE_ACTION] = g_signal_new (
"activate-action", "activate-action",
@ -1268,7 +1185,7 @@ midori_browser_class_init (MidoriBrowserClass* class)
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
class->add_tab = _midori_browser_add_tab; class->add_tab = _midori_browser_add_tab;
class->add_uri = _midori_browser_add_uri; class->remove_tab = _midori_browser_remove_tab;
class->activate_action = _midori_browser_activate_action; class->activate_action = _midori_browser_activate_action;
class->quit = _midori_browser_quit; class->quit = _midori_browser_quit;
@ -1297,6 +1214,15 @@ midori_browser_class_init (MidoriBrowserClass* class)
GTK_TYPE_TOOLBAR, GTK_TYPE_TOOLBAR,
G_PARAM_READABLE)); G_PARAM_READABLE));
g_object_class_install_property (gobject_class,
PROP_URI,
g_param_spec_string (
"uri",
_("URI"),
_("The current URI"),
"about:blank",
G_PARAM_READWRITE));
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_TAB, PROP_TAB,
g_param_spec_object ( g_param_spec_object (
@ -2572,6 +2498,9 @@ gtk_notebook_switch_page_cb (GtkWidget* notebook,
g_get_application_name (), NULL); g_get_application_name (), NULL);
gtk_window_set_title (GTK_WINDOW (browser), window_title); gtk_window_set_title (GTK_WINDOW (browser), window_title);
g_free (window_title); g_free (window_title);
g_object_notify (G_OBJECT (browser), "uri");
_midori_browser_set_statusbar_text (browser, NULL); _midori_browser_set_statusbar_text (browser, NULL);
_midori_browser_update_interface (browser); _midori_browser_update_interface (browser);
if (MIDORI_IS_WEB_VIEW (widget)) if (MIDORI_IS_WEB_VIEW (widget))
@ -3844,6 +3773,9 @@ midori_browser_set_property (GObject* object,
switch (prop_id) switch (prop_id)
{ {
case PROP_URI:
_midori_browser_open_uri (browser, g_value_get_string (value));
break;
case PROP_TAB: case PROP_TAB:
midori_browser_set_current_tab (browser, g_value_get_object (value)); midori_browser_set_current_tab (browser, g_value_get_object (value));
break; break;
@ -3912,6 +3844,9 @@ midori_browser_get_property (GObject* object,
case PROP_NAVIGATIONBAR: case PROP_NAVIGATIONBAR:
g_value_set_object (value, browser->navigationbar); g_value_set_object (value, browser->navigationbar);
break; break;
case PROP_URI:
g_value_set_string (value, midori_browser_get_current_uri (browser));
break;
case PROP_TAB: case PROP_TAB:
g_value_set_object (value, midori_browser_get_current_tab (browser)); g_value_set_object (value, midori_browser_get_current_tab (browser));
break; break;
@ -3969,10 +3904,11 @@ gint
midori_browser_add_tab (MidoriBrowser* browser, midori_browser_add_tab (MidoriBrowser* browser,
GtkWidget* widget) GtkWidget* widget)
{ {
gint index; GtkWidget* scrolled;
g_signal_emit (browser, signals[ADD_TAB], 0, widget, &index); g_signal_emit (browser, signals[ADD_TAB], 0, widget);
return index; scrolled = _midori_browser_scrolled_for_child (browser, widget);
return gtk_notebook_page_num (GTK_NOTEBOOK (browser->notebook), scrolled);
} }
/** /**
@ -3986,10 +3922,7 @@ void
midori_browser_remove_tab (MidoriBrowser* browser, midori_browser_remove_tab (MidoriBrowser* browser,
GtkWidget* widget) GtkWidget* widget)
{ {
GtkWidget* scrolled = _midori_browser_scrolled_for_child (browser, widget); g_signal_emit (browser, signals[REMOVE_TAB], 0, widget);
gtk_container_remove (GTK_CONTAINER (browser->notebook), scrolled);
/* FIXME: Remove the menuitem if this is a web view */
} }
/** /**
@ -4032,10 +3965,15 @@ gint
midori_browser_add_uri (MidoriBrowser* browser, midori_browser_add_uri (MidoriBrowser* browser,
const gchar* uri) const gchar* uri)
{ {
gint index; GtkWidget* web_view;
g_signal_emit (browser, signals[ADD_URI], 0, uri, &index); web_view = g_object_new (MIDORI_TYPE_WEB_VIEW,
return index; "uri", uri,
"settings", browser->settings,
NULL);
gtk_widget_show (web_view);
return midori_browser_add_tab (browser, web_view);
} }
/** /**
@ -4052,6 +3990,27 @@ midori_browser_activate_action (MidoriBrowser* browser,
g_signal_emit (browser, signals[ACTIVATE_ACTION], 0, name); g_signal_emit (browser, signals[ACTIVATE_ACTION], 0, name);
} }
/**
* midori_browser_get_current_uri:
* @browser: a #MidoriBrowser
*
* Determines the URI loaded in the current page.
*
* If there is no page present at all, %NULL is returned.
*
* Return value: the current URI, or %NULL
**/
const gchar*
midori_browser_get_current_uri (MidoriBrowser* browser)
{
GtkWidget* widget;
g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL);
widget = midori_browser_get_current_web_view (browser);
return _midori_browser_get_tab_uri (browser, widget);
}
/** /**
* midori_browser_set_current_page: * midori_browser_set_current_page:
* @browser: a #MidoriBrowser * @browser: a #MidoriBrowser

View file

@ -54,12 +54,12 @@ struct _MidoriBrowserClass
(*new_window) (MidoriBrowser* browser, (*new_window) (MidoriBrowser* browser,
const gchar* uri); const gchar* uri);
gint void
(*add_tab) (MidoriBrowser* browser, (*add_tab) (MidoriBrowser* browser,
GtkWidget* widget); GtkWidget* widget);
gint void
(*add_uri) (MidoriBrowser* browser, (*remove_tab) (MidoriBrowser* browser,
const gchar* uri); GtkWidget* widget);
void void
(*activate_action) (MidoriBrowser* browser, (*activate_action) (MidoriBrowser* browser,
const gchar* name); const gchar* name);
@ -93,6 +93,9 @@ void
midori_browser_activate_action (MidoriBrowser* browser, midori_browser_activate_action (MidoriBrowser* browser,
const gchar* name); const gchar* name);
const gchar*
midori_browser_get_current_uri (MidoriBrowser* browser);
void void
midori_browser_set_current_page (MidoriBrowser* browser, midori_browser_set_current_page (MidoriBrowser* browser,
gint n); gint n);