Updating branch refs/heads/master to ea7e627e3bb48eb0ebd1074196aaf0fbd6e95d92 (commit) from 6f6684855bcf9453f4834b15c25f2db53dfc99ee (commit)
commit ea7e627e3bb48eb0ebd1074196aaf0fbd6e95d92 Author: Tsahee Zidenberg <tsa...@yahoo.com> Date: Mon May 31 23:39:02 2010 +0200 Implement loading delayed pages at startup Each view has a meta value 'delay' which indicates whether it be loaded or needs to be loaded manually before it shows content. One way to trigger this is that Midori crashes and if it is configured to 'Show last open tabs', all tabs will now be delayed. To allow Midori to safely open without crashing again. The other way is to change the 'Load on Startup' preference to 'Show last tabs without loading'. This causes all tabs restored from the session to be delayed. One interesting aspect is that it is possible to have delayed tabs, use 'Show last open tabs' and tabs will remain as they are, so delayed tabs will be delayed over following sessions. midori/main.c | 47 ++++++++++++++++++++++++++++++++++-------- midori/midori-browser.c | 13 +++++++++-- midori/midori-view.c | 17 +++++++++++++++ midori/midori-websettings.c | 1 + midori/midori-websettings.h | 8 ++++-- 5 files changed, 71 insertions(+), 15 deletions(-) diff --git a/midori/main.c b/midori/main.c index 628665c..759dc81 100644 --- a/midori/main.c +++ b/midori/main.c @@ -431,6 +431,18 @@ midori_history_terminate (sqlite3* db, #endif static void +midori_session_add_delay (KatzeArray* session) +{ + KatzeItem* item; + gint i = 0; + while ((item = katze_array_get_nth_item (session, i++))) + { + if (katze_item_get_meta_integer (item, "delay") < 0) + katze_item_set_meta_integer (item, "delay", 1); + } +} + +static void settings_notify_cb (MidoriWebSettings* settings, GParamSpec* pspec, MidoriApp* app) @@ -1230,11 +1242,13 @@ midori_load_session (gpointer data) KatzeArray* _session = KATZE_ARRAY (data); MidoriBrowser* browser; MidoriApp* app = katze_item_get_parent (KATZE_ITEM (_session)); + MidoriWebSettings* settings = katze_object_get_object (app, "settings"); gchar* config_file; KatzeArray* session; KatzeItem* item; guint i; gint64 current; + MidoriStartup load_on_startup; gchar** command = g_object_get_data (G_OBJECT (app), "execute-command"); #ifdef G_ENABLE_DEBUG gboolean startup_timer = g_getenv ("MIDORI_STARTTIME") != NULL; @@ -1263,14 +1277,13 @@ midori_load_session (gpointer data) g_signal_connect_after (gtk_accel_map_get (), "changed", G_CALLBACK (accel_map_changed_cb), NULL); + g_object_get (settings, "load-on-startup", &load_on_startup, NULL); + if (katze_array_is_empty (_session)) { - MidoriWebSettings* settings = katze_object_get_object (app, "settings"); - MidoriStartup load_on_startup; gchar* homepage; item = katze_item_new (); - g_object_get (settings, "load-on-startup", &load_on_startup, NULL); if (load_on_startup == MIDORI_STARTUP_BLANK_PAGE) katze_item_set_uri (item, ""); else @@ -1279,11 +1292,13 @@ midori_load_session (gpointer data) katze_item_set_uri (item, homepage); g_free (homepage); } - g_object_unref (settings); katze_array_add_item (_session, item); g_object_unref (item); } + if (load_on_startup == MIDORI_STARTUP_DELAYED_PAGES) + midori_session_add_delay (_session); + session = midori_browser_get_proxy_array (browser); i = 0; while ((item = katze_array_get_nth_item (_session, i++))) @@ -1299,6 +1314,8 @@ midori_load_session (gpointer data) item = katze_array_get_nth_item (_session, 0); if (!strcmp (katze_item_get_uri (item), "")) midori_browser_activate_action (browser, "Location"); + + g_object_unref (settings); g_object_unref (_session); katze_assign (config_file, build_config_filename ("session.xbel")); @@ -1541,6 +1558,7 @@ main (int argc, gchar* webapp; gchar* config; gboolean diagnostic_dialog; + gboolean back_from_crash; gboolean run; gchar* snapshot; gboolean execute; @@ -1649,6 +1667,7 @@ main (int argc, /* Parse cli options */ webapp = NULL; config = NULL; + back_from_crash = FALSE; diagnostic_dialog = FALSE; run = FALSE; snapshot = NULL; @@ -1926,7 +1945,7 @@ main (int argc, _session = katze_array_new (KATZE_TYPE_ITEM); #if HAVE_LIBXML g_object_get (settings, "load-on-startup", &load_on_startup, NULL); - if (load_on_startup == MIDORI_STARTUP_LAST_OPEN_PAGES) + if (load_on_startup >= MIDORI_STARTUP_LAST_OPEN_PAGES) { katze_assign (config_file, build_config_filename ("session.xbel")); error = NULL; @@ -2026,6 +2045,7 @@ main (int argc, uri_ready = midori_prepare_uri (uri); katze_item_set_uri (item, uri_ready); g_free (uri_ready); + katze_item_set_meta_integer (item, "delay", 0); katze_array_add_item (_session, item); uri = strtok (NULL, "|"); } @@ -2075,12 +2095,21 @@ main (int argc, katze_assign (config_file, build_config_filename ("running")); if (g_access (config_file, F_OK) == 0) { - if (katze_object_get_boolean (settings, "show-crash-dialog")) - diagnostic_dialog = TRUE; + back_from_crash = TRUE; } else g_file_set_contents (config_file, "RUNNING", -1, NULL); + if (back_from_crash) + { + if (katze_object_get_int (settings, "load-on-startup") + >= MIDORI_STARTUP_LAST_OPEN_PAGES) + midori_session_add_delay (_session); + + if (katze_object_get_boolean (settings, "show-crash-dialog")) + diagnostic_dialog = TRUE; + } + if (diagnostic_dialog) { GtkWidget* dialog = midori_create_diagnostic_dialog (settings, _session); @@ -2156,8 +2185,8 @@ main (int argc, } } - if (katze_object_get_boolean (settings, "load-on-startup") - != MIDORI_STARTUP_LAST_OPEN_PAGES) + if (katze_object_get_int (settings, "load-on-startup") + < MIDORI_STARTUP_LAST_OPEN_PAGES) { katze_assign (config_file, build_config_filename ("session.xbel")); g_unlink (config_file); diff --git a/midori/midori-browser.c b/midori/midori-browser.c index 534a2a0..066fd13 100644 --- a/midori/midori-browser.c +++ b/midori/midori-browser.c @@ -7488,7 +7488,6 @@ gint midori_browser_add_item (MidoriBrowser* browser, KatzeItem* item) { - const gchar* uri; const gchar* title; GtkWidget* view; gint page; @@ -7498,13 +7497,21 @@ midori_browser_add_item (MidoriBrowser* browser, g_return_val_if_fail (MIDORI_IS_BROWSER (browser), -1); g_return_val_if_fail (KATZE_IS_ITEM (item), -1); - uri = katze_item_get_uri (item); title = katze_item_get_name (item); view = g_object_new (MIDORI_TYPE_VIEW, "title", title, "settings", browser->settings, NULL); - midori_view_set_uri (MIDORI_VIEW (view), uri); + if (katze_item_get_meta_integer (item, "delay") > 0) + { + gchar* new_uri; + new_uri = g_strdup_printf ("pause:%s", katze_item_get_uri (item)); + midori_view_set_uri (MIDORI_VIEW (view), new_uri); + g_free (new_uri); + } + else + midori_view_set_uri (MIDORI_VIEW (view), katze_item_get_uri (item)); + gtk_widget_show (view); /* FIXME: We should have public API for that */ diff --git a/midori/midori-view.c b/midori/midori-view.c index 655b1df..f99934d 100644 --- a/midori/midori-view.c +++ b/midori/midori-view.c @@ -3680,6 +3680,23 @@ midori_view_set_uri (MidoriView* view, katze_item_set_uri (view->item, uri); return; } + else if (g_str_has_prefix (uri, "pause:")) + { + gchar* title; + + title = g_strdup_printf ("%s", view->title); + katze_assign (view->uri, g_strdup (&uri[6])); + midori_view_display_error ( + view, view->uri, title, + _("Page loading delayed"), + _("Loading delayed either due to a recent crash or startup preferences."), + _("Load Page"), + NULL); + g_free (title); + g_object_notify (G_OBJECT (view), "uri"); + if (view->item) + katze_item_set_uri (view->item, uri); + } else if (g_str_has_prefix (uri, "javascript:")) { gboolean result; diff --git a/midori/midori-websettings.c b/midori/midori-websettings.c index b7e573a..4102bf2 100644 --- a/midori/midori-websettings.c +++ b/midori/midori-websettings.c @@ -204,6 +204,7 @@ midori_startup_get_type (void) { MIDORI_STARTUP_BLANK_PAGE, "MIDORI_STARTUP_BLANK_PAGE", N_("Show Blank page") }, { MIDORI_STARTUP_HOMEPAGE, "MIDORI_STARTUP_HOMEPAGE", N_("Show Homepage") }, { MIDORI_STARTUP_LAST_OPEN_PAGES, "MIDORI_STARTUP_LAST_OPEN_PAGES", N_("Show last open tabs") }, + { MIDORI_STARTUP_DELAYED_PAGES, "MIDORI_STARTUP_DELAYED_PAGES", N_("Show last tabs without loading") }, { 0, NULL, NULL } }; type = g_enum_register_static ("MidoriStartup", values); diff --git a/midori/midori-websettings.h b/midori/midori-websettings.h index 05ad0f7..2cedff1 100644 --- a/midori/midori-websettings.h +++ b/midori/midori-websettings.h @@ -60,11 +60,13 @@ midori_window_state_get_type (void) G_GNUC_CONST; #define MIDORI_TYPE_WINDOW_STATE \ (midori_window_state_get_type ()) +/* values >= MIDORI_STARTUP_LAST_OPEN_PAGES mean session is saved */ typedef enum { - MIDORI_STARTUP_BLANK_PAGE, - MIDORI_STARTUP_HOMEPAGE, - MIDORI_STARTUP_LAST_OPEN_PAGES + MIDORI_STARTUP_BLANK_PAGE, /* One blank tab or speed dial is opened */ + MIDORI_STARTUP_HOMEPAGE, /* One homepage tab is opened */ + MIDORI_STARTUP_LAST_OPEN_PAGES, /* The session is loaded and saved */ + MIDORI_STARTUP_DELAYED_PAGES /* The session is saved, loading pages is delayed */ } MidoriStartup; GType _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits