]> spindle.queued.net Git - midori/commitdiff
Save the session whenever it changes, instead of on quit.
authorChristian Dywan <christian@twotoasts.de>
Wed, 23 Jul 2008 18:17:13 +0000 (20:17 +0200)
committerChristian Dywan <christian@twotoasts.de>
Wed, 23 Jul 2008 18:17:13 +0000 (20:17 +0200)
midori/main.c
midori/midori-browser.c
midori/midori-browser.h

index d672038cfadaa9591cad1080b31c2c5140d65f8b..e0138ac5f6fe61a87cab7bf78fe028da4a3d54fa 100644 (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
 main (int argc,
       char** argv)
@@ -555,7 +579,7 @@ main (int argc,
     midori_app_add_browser (app, 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);
     for (i = 0; i < n; i++)
     {
@@ -568,6 +592,13 @@ main (int argc,
         midori_browser_activate_action (browser, "Location");
     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 */
     JSGlobalContextRef js_context = gjs_global_context_new ();
     /* FIXME: We want to honor system installed addons as well */
@@ -626,19 +657,6 @@ main (int argc,
         g_error_free (error);
     }
     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));
     error = NULL;
     if (!settings_save_to_file (settings, config_file, &error))
index 1742f114f470ad0850b9770b35d6861e2abf173b..059d27c747022b2e712d4e92687d4b1b1a9092e8 100644 (file)
@@ -89,6 +89,7 @@ enum
 
     PROP_MENUBAR,
     PROP_NAVIGATIONBAR,
+    PROP_URI,
     PROP_TAB,
     PROP_STATUSBAR,
     PROP_SETTINGS,
@@ -105,7 +106,7 @@ enum
     NEW_WINDOW,
 
     ADD_TAB,
-    ADD_URI,
+    REMOVE_TAB,
     ACTIVATE_ACTION,
     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_bin_get_child (GTK_BIN (browser->location))),
                 GTK_ICON_ENTRY_SECONDARY, NULL);
+            g_object_notify (G_OBJECT (browser), "uri");
         }
 
         _midori_browser_update_interface (browser);
@@ -856,7 +858,7 @@ midori_browser_tab_close_clicked (GtkWidget* tab_close,
     gtk_widget_destroy (widget);
 }
 
-static gint
+static void
 _midori_browser_add_tab (MidoriBrowser* browser,
                          GtkWidget*     widget)
 {
@@ -1036,24 +1038,13 @@ _midori_browser_add_tab (MidoriBrowser* browser,
         G_CALLBACK (midori_browser_tab_destroy_cb), browser);
 
     _midori_browser_update_actions (browser);
-
-    n = gtk_notebook_page_num (GTK_NOTEBOOK (browser->notebook), scrolled);
-    return n;
 }
 
-static gint
-_midori_browser_add_uri (MidoriBrowser* browser,
-                         const gchar*   uri)
+static void
+_midori_browser_remove_tab (MidoriBrowser* browser,
+                            GtkWidget*     widget)
 {
-    GtkWidget* web_view;
-
-    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);
+    gtk_widget_destroy (widget);
 }
 
 static void
@@ -1112,80 +1103,6 @@ midori_cclosure_marshal_VOID__OBJECT_POINTER_POINTER (GClosure*     closure,
               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
 midori_browser_class_init (MidoriBrowserClass* class)
 {
@@ -1231,20 +1148,20 @@ midori_browser_class_init (MidoriBrowserClass* class)
         G_STRUCT_OFFSET (MidoriBrowserClass, add_tab),
         0,
         NULL,
-        midori_cclosure_marshal_INT__OBJECT,
-        G_TYPE_INT, 1,
+        g_cclosure_marshal_VOID__OBJECT,
+        G_TYPE_NONE, 1,
         GTK_TYPE_WIDGET);
 
-    signals[ADD_URI] = g_signal_new (
-        "add-uri",
+    signals[REMOVE_TAB] = g_signal_new (
+        "remove-tab",
         G_TYPE_FROM_CLASS (class),
         (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
-        G_STRUCT_OFFSET (MidoriBrowserClass, add_uri),
+        G_STRUCT_OFFSET (MidoriBrowserClass, remove_tab),
         0,
         NULL,
-        midori_cclosure_marshal_INT__STRING,
-        G_TYPE_INT, 1,
-        G_TYPE_STRING);
+        g_cclosure_marshal_VOID__OBJECT,
+        G_TYPE_NONE, 1,
+        GTK_TYPE_WIDGET);
 
     signals[ACTIVATE_ACTION] = g_signal_new (
         "activate-action",
@@ -1268,7 +1185,7 @@ midori_browser_class_init (MidoriBrowserClass* class)
         G_TYPE_NONE, 0);
 
     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->quit = _midori_browser_quit;
 
@@ -1297,6 +1214,15 @@ midori_browser_class_init (MidoriBrowserClass* class)
                                      GTK_TYPE_TOOLBAR,
                                      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,
                                      PROP_TAB,
                                      g_param_spec_object (
@@ -2572,6 +2498,9 @@ gtk_notebook_switch_page_cb (GtkWidget*       notebook,
                                 g_get_application_name (), NULL);
     gtk_window_set_title (GTK_WINDOW (browser), window_title);
     g_free (window_title);
+
+    g_object_notify (G_OBJECT (browser), "uri");
+
     _midori_browser_set_statusbar_text (browser, NULL);
     _midori_browser_update_interface (browser);
     if (MIDORI_IS_WEB_VIEW (widget))
@@ -3844,6 +3773,9 @@ midori_browser_set_property (GObject*      object,
 
     switch (prop_id)
     {
+    case PROP_URI:
+        _midori_browser_open_uri (browser, g_value_get_string (value));
+        break;
     case PROP_TAB:
         midori_browser_set_current_tab (browser, g_value_get_object (value));
         break;
@@ -3912,6 +3844,9 @@ midori_browser_get_property (GObject*    object,
     case PROP_NAVIGATIONBAR:
         g_value_set_object (value, browser->navigationbar);
         break;
+    case PROP_URI:
+        g_value_set_string (value, midori_browser_get_current_uri (browser));
+        break;
     case PROP_TAB:
         g_value_set_object (value, midori_browser_get_current_tab (browser));
         break;
@@ -3969,10 +3904,11 @@ gint
 midori_browser_add_tab (MidoriBrowser* browser,
                         GtkWidget*     widget)
 {
-    gint index;
+    GtkWidget* scrolled;
 
-    g_signal_emit (browser, signals[ADD_TAB], 0, widget, &index);
-    return index;
+    g_signal_emit (browser, signals[ADD_TAB], 0, widget);
+    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,
                            GtkWidget*     widget)
 {
-    GtkWidget* scrolled = _midori_browser_scrolled_for_child (browser, widget);
-    gtk_container_remove (GTK_CONTAINER (browser->notebook), scrolled);
-
-    /* FIXME: Remove the menuitem if this is a web view */
+    g_signal_emit (browser, signals[REMOVE_TAB], 0, widget);
 }
 
 /**
@@ -4032,10 +3965,15 @@ gint
 midori_browser_add_uri (MidoriBrowser* browser,
                         const gchar*   uri)
 {
-    gint index;
+    GtkWidget* web_view;
 
-    g_signal_emit (browser, signals[ADD_URI], 0, uri, &index);
-    return index;
+    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);
 }
 
 /**
@@ -4052,6 +3990,27 @@ midori_browser_activate_action (MidoriBrowser* browser,
     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:
  * @browser: a #MidoriBrowser
index 83876435244c6136599d0affcd205c75255648a1..5c125d3fe0d15a19b807799bd666a4efb296f783 100644 (file)
@@ -54,12 +54,12 @@ struct _MidoriBrowserClass
     (*new_window)              (MidoriBrowser*       browser,
                                 const gchar*         uri);
 
-    gint
+    void
     (*add_tab)                 (MidoriBrowser*       browser,
                                 GtkWidget*           widget);
-    gint
-    (*add_uri)                 (MidoriBrowser*       browser,
-                                const gchar*         uri);
+    void
+    (*remove_tab)              (MidoriBrowser*       browser,
+                                GtkWidget*           widget);
     void
     (*activate_action)         (MidoriBrowser*       browser,
                                 const gchar*         name);
@@ -93,6 +93,9 @@ void
 midori_browser_activate_action        (MidoriBrowser*     browser,
                                        const gchar*       name);
 
+const gchar*
+midori_browser_get_current_uri        (MidoriBrowser*     browser);
+
 void
 midori_browser_set_current_page       (MidoriBrowser*     browser,
                                        gint               n);