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.
This commit is contained in:
parent
6f6684855b
commit
ea7e627e3b
5 changed files with 71 additions and 15 deletions
|
@ -430,6 +430,18 @@ midori_history_terminate (sqlite3* db,
|
||||||
}
|
}
|
||||||
#endif
|
#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
|
static void
|
||||||
settings_notify_cb (MidoriWebSettings* settings,
|
settings_notify_cb (MidoriWebSettings* settings,
|
||||||
GParamSpec* pspec,
|
GParamSpec* pspec,
|
||||||
|
@ -1230,11 +1242,13 @@ midori_load_session (gpointer data)
|
||||||
KatzeArray* _session = KATZE_ARRAY (data);
|
KatzeArray* _session = KATZE_ARRAY (data);
|
||||||
MidoriBrowser* browser;
|
MidoriBrowser* browser;
|
||||||
MidoriApp* app = katze_item_get_parent (KATZE_ITEM (_session));
|
MidoriApp* app = katze_item_get_parent (KATZE_ITEM (_session));
|
||||||
|
MidoriWebSettings* settings = katze_object_get_object (app, "settings");
|
||||||
gchar* config_file;
|
gchar* config_file;
|
||||||
KatzeArray* session;
|
KatzeArray* session;
|
||||||
KatzeItem* item;
|
KatzeItem* item;
|
||||||
guint i;
|
guint i;
|
||||||
gint64 current;
|
gint64 current;
|
||||||
|
MidoriStartup load_on_startup;
|
||||||
gchar** command = g_object_get_data (G_OBJECT (app), "execute-command");
|
gchar** command = g_object_get_data (G_OBJECT (app), "execute-command");
|
||||||
#ifdef G_ENABLE_DEBUG
|
#ifdef G_ENABLE_DEBUG
|
||||||
gboolean startup_timer = g_getenv ("MIDORI_STARTTIME") != NULL;
|
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_signal_connect_after (gtk_accel_map_get (), "changed",
|
||||||
G_CALLBACK (accel_map_changed_cb), NULL);
|
G_CALLBACK (accel_map_changed_cb), NULL);
|
||||||
|
|
||||||
|
g_object_get (settings, "load-on-startup", &load_on_startup, NULL);
|
||||||
|
|
||||||
if (katze_array_is_empty (_session))
|
if (katze_array_is_empty (_session))
|
||||||
{
|
{
|
||||||
MidoriWebSettings* settings = katze_object_get_object (app, "settings");
|
|
||||||
MidoriStartup load_on_startup;
|
|
||||||
gchar* homepage;
|
gchar* homepage;
|
||||||
item = katze_item_new ();
|
item = katze_item_new ();
|
||||||
|
|
||||||
g_object_get (settings, "load-on-startup", &load_on_startup, NULL);
|
|
||||||
if (load_on_startup == MIDORI_STARTUP_BLANK_PAGE)
|
if (load_on_startup == MIDORI_STARTUP_BLANK_PAGE)
|
||||||
katze_item_set_uri (item, "");
|
katze_item_set_uri (item, "");
|
||||||
else
|
else
|
||||||
|
@ -1279,11 +1292,13 @@ midori_load_session (gpointer data)
|
||||||
katze_item_set_uri (item, homepage);
|
katze_item_set_uri (item, homepage);
|
||||||
g_free (homepage);
|
g_free (homepage);
|
||||||
}
|
}
|
||||||
g_object_unref (settings);
|
|
||||||
katze_array_add_item (_session, item);
|
katze_array_add_item (_session, item);
|
||||||
g_object_unref (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);
|
session = midori_browser_get_proxy_array (browser);
|
||||||
i = 0;
|
i = 0;
|
||||||
while ((item = katze_array_get_nth_item (_session, i++)))
|
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);
|
item = katze_array_get_nth_item (_session, 0);
|
||||||
if (!strcmp (katze_item_get_uri (item), ""))
|
if (!strcmp (katze_item_get_uri (item), ""))
|
||||||
midori_browser_activate_action (browser, "Location");
|
midori_browser_activate_action (browser, "Location");
|
||||||
|
|
||||||
|
g_object_unref (settings);
|
||||||
g_object_unref (_session);
|
g_object_unref (_session);
|
||||||
|
|
||||||
katze_assign (config_file, build_config_filename ("session.xbel"));
|
katze_assign (config_file, build_config_filename ("session.xbel"));
|
||||||
|
@ -1541,6 +1558,7 @@ main (int argc,
|
||||||
gchar* webapp;
|
gchar* webapp;
|
||||||
gchar* config;
|
gchar* config;
|
||||||
gboolean diagnostic_dialog;
|
gboolean diagnostic_dialog;
|
||||||
|
gboolean back_from_crash;
|
||||||
gboolean run;
|
gboolean run;
|
||||||
gchar* snapshot;
|
gchar* snapshot;
|
||||||
gboolean execute;
|
gboolean execute;
|
||||||
|
@ -1649,6 +1667,7 @@ main (int argc,
|
||||||
/* Parse cli options */
|
/* Parse cli options */
|
||||||
webapp = NULL;
|
webapp = NULL;
|
||||||
config = NULL;
|
config = NULL;
|
||||||
|
back_from_crash = FALSE;
|
||||||
diagnostic_dialog = FALSE;
|
diagnostic_dialog = FALSE;
|
||||||
run = FALSE;
|
run = FALSE;
|
||||||
snapshot = NULL;
|
snapshot = NULL;
|
||||||
|
@ -1926,7 +1945,7 @@ main (int argc,
|
||||||
_session = katze_array_new (KATZE_TYPE_ITEM);
|
_session = katze_array_new (KATZE_TYPE_ITEM);
|
||||||
#if HAVE_LIBXML
|
#if HAVE_LIBXML
|
||||||
g_object_get (settings, "load-on-startup", &load_on_startup, NULL);
|
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"));
|
katze_assign (config_file, build_config_filename ("session.xbel"));
|
||||||
error = NULL;
|
error = NULL;
|
||||||
|
@ -2026,6 +2045,7 @@ main (int argc,
|
||||||
uri_ready = midori_prepare_uri (uri);
|
uri_ready = midori_prepare_uri (uri);
|
||||||
katze_item_set_uri (item, uri_ready);
|
katze_item_set_uri (item, uri_ready);
|
||||||
g_free (uri_ready);
|
g_free (uri_ready);
|
||||||
|
katze_item_set_meta_integer (item, "delay", 0);
|
||||||
katze_array_add_item (_session, item);
|
katze_array_add_item (_session, item);
|
||||||
uri = strtok (NULL, "|");
|
uri = strtok (NULL, "|");
|
||||||
}
|
}
|
||||||
|
@ -2075,12 +2095,21 @@ main (int argc,
|
||||||
katze_assign (config_file, build_config_filename ("running"));
|
katze_assign (config_file, build_config_filename ("running"));
|
||||||
if (g_access (config_file, F_OK) == 0)
|
if (g_access (config_file, F_OK) == 0)
|
||||||
{
|
{
|
||||||
if (katze_object_get_boolean (settings, "show-crash-dialog"))
|
back_from_crash = TRUE;
|
||||||
diagnostic_dialog = TRUE;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
g_file_set_contents (config_file, "RUNNING", -1, NULL);
|
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)
|
if (diagnostic_dialog)
|
||||||
{
|
{
|
||||||
GtkWidget* dialog = midori_create_diagnostic_dialog (settings, _session);
|
GtkWidget* dialog = midori_create_diagnostic_dialog (settings, _session);
|
||||||
|
@ -2156,8 +2185,8 @@ main (int argc,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (katze_object_get_boolean (settings, "load-on-startup")
|
if (katze_object_get_int (settings, "load-on-startup")
|
||||||
!= MIDORI_STARTUP_LAST_OPEN_PAGES)
|
< MIDORI_STARTUP_LAST_OPEN_PAGES)
|
||||||
{
|
{
|
||||||
katze_assign (config_file, build_config_filename ("session.xbel"));
|
katze_assign (config_file, build_config_filename ("session.xbel"));
|
||||||
g_unlink (config_file);
|
g_unlink (config_file);
|
||||||
|
|
|
@ -7488,7 +7488,6 @@ gint
|
||||||
midori_browser_add_item (MidoriBrowser* browser,
|
midori_browser_add_item (MidoriBrowser* browser,
|
||||||
KatzeItem* item)
|
KatzeItem* item)
|
||||||
{
|
{
|
||||||
const gchar* uri;
|
|
||||||
const gchar* title;
|
const gchar* title;
|
||||||
GtkWidget* view;
|
GtkWidget* view;
|
||||||
gint page;
|
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 (MIDORI_IS_BROWSER (browser), -1);
|
||||||
g_return_val_if_fail (KATZE_IS_ITEM (item), -1);
|
g_return_val_if_fail (KATZE_IS_ITEM (item), -1);
|
||||||
|
|
||||||
uri = katze_item_get_uri (item);
|
|
||||||
title = katze_item_get_name (item);
|
title = katze_item_get_name (item);
|
||||||
view = g_object_new (MIDORI_TYPE_VIEW,
|
view = g_object_new (MIDORI_TYPE_VIEW,
|
||||||
"title", title,
|
"title", title,
|
||||||
"settings", browser->settings,
|
"settings", browser->settings,
|
||||||
NULL);
|
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);
|
gtk_widget_show (view);
|
||||||
|
|
||||||
/* FIXME: We should have public API for that */
|
/* FIXME: We should have public API for that */
|
||||||
|
|
|
@ -3680,6 +3680,23 @@ midori_view_set_uri (MidoriView* view,
|
||||||
katze_item_set_uri (view->item, uri);
|
katze_item_set_uri (view->item, uri);
|
||||||
return;
|
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:"))
|
else if (g_str_has_prefix (uri, "javascript:"))
|
||||||
{
|
{
|
||||||
gboolean result;
|
gboolean result;
|
||||||
|
|
|
@ -204,6 +204,7 @@ midori_startup_get_type (void)
|
||||||
{ MIDORI_STARTUP_BLANK_PAGE, "MIDORI_STARTUP_BLANK_PAGE", N_("Show Blank page") },
|
{ MIDORI_STARTUP_BLANK_PAGE, "MIDORI_STARTUP_BLANK_PAGE", N_("Show Blank page") },
|
||||||
{ MIDORI_STARTUP_HOMEPAGE, "MIDORI_STARTUP_HOMEPAGE", N_("Show Homepage") },
|
{ 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_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 }
|
{ 0, NULL, NULL }
|
||||||
};
|
};
|
||||||
type = g_enum_register_static ("MidoriStartup", values);
|
type = g_enum_register_static ("MidoriStartup", values);
|
||||||
|
|
|
@ -60,11 +60,13 @@ midori_window_state_get_type (void) G_GNUC_CONST;
|
||||||
#define MIDORI_TYPE_WINDOW_STATE \
|
#define MIDORI_TYPE_WINDOW_STATE \
|
||||||
(midori_window_state_get_type ())
|
(midori_window_state_get_type ())
|
||||||
|
|
||||||
|
/* values >= MIDORI_STARTUP_LAST_OPEN_PAGES mean session is saved */
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
MIDORI_STARTUP_BLANK_PAGE,
|
MIDORI_STARTUP_BLANK_PAGE, /* One blank tab or speed dial is opened */
|
||||||
MIDORI_STARTUP_HOMEPAGE,
|
MIDORI_STARTUP_HOMEPAGE, /* One homepage tab is opened */
|
||||||
MIDORI_STARTUP_LAST_OPEN_PAGES
|
MIDORI_STARTUP_LAST_OPEN_PAGES, /* The session is loaded and saved */
|
||||||
|
MIDORI_STARTUP_DELAYED_PAGES /* The session is saved, loading pages is delayed */
|
||||||
} MidoriStartup;
|
} MidoriStartup;
|
||||||
|
|
||||||
GType
|
GType
|
||||||
|
|
Loading…
Reference in a new issue