diff --git a/midori/main.c b/midori/main.c index e69670a3..4338d817 100644 --- a/midori/main.c +++ b/midori/main.c @@ -2508,7 +2508,7 @@ main (int argc, "trash", trash, "search-engines", search_engines, "history", history, - "speed-dial", dial->keyfile, + "speed-dial", dial, NULL); g_object_unref (history); g_object_unref (search_engines); diff --git a/midori/midori-browser.c b/midori/midori-browser.c index 7127d241..3a0ffbc6 100644 --- a/midori/midori-browser.c +++ b/midori/midori-browser.c @@ -100,7 +100,7 @@ struct _MidoriBrowser KatzeArray* trash; KatzeArray* search_engines; KatzeArray* history; - GKeyFile* speeddial; + MidoriSpeedDial* dial; gboolean show_tabs; gboolean show_navigationbar; @@ -1239,26 +1239,19 @@ midori_browser_add_speed_dial (MidoriBrowser* browser) { GdkPixbuf* img; GtkWidget* view = midori_browser_get_current_tab (browser); - gchar* slot_id = midori_speed_dial_get_next_free_slot_fk (browser->speeddial); - gchar* uri; - gchar* title; - if (slot_id == NULL) - return; - - uri = g_strdup (midori_view_get_display_uri (MIDORI_VIEW (view))); - title = g_strdup (midori_view_get_display_title (MIDORI_VIEW (view))); if ((img = midori_view_get_snapshot (MIDORI_VIEW (view), 240, 160))) { + gchar* slot_id = midori_speed_dial_get_next_free_slot (browser->dial); gchar* dial_id = g_strdup_printf ("Dial %s", slot_id + 1); - midori_speed_dial_add_fk (dial_id, uri, title, img, browser->speeddial); + midori_speed_dial_add (browser->dial, dial_id, + midori_view_get_display_uri (MIDORI_VIEW (view)), + midori_view_get_display_title (MIDORI_VIEW (view)), img); g_free (dial_id); - midori_view_save_speed_dial_config (MIDORI_VIEW (view), browser->speeddial); + midori_view_save_speed_dial_config (MIDORI_VIEW (view)); g_object_unref (img); + g_free (slot_id); } - g_free (uri); - g_free (title); - g_free (slot_id); } @@ -2408,16 +2401,16 @@ midori_browser_class_init (MidoriBrowserClass* class) * The speed dial configuration file. * * Since: 0.3.4 + * Since 0.4.7 this is a Midori.SpeedDial instance. */ g_object_class_install_property (gobject_class, PROP_SPEED_DIAL, g_param_spec_pointer ( "speed-dial", "Speeddial", - "Pointer to key-value object with speed dial items", + "Speed dial", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - /** * MidoriBrowser:show-tabs: * @@ -6270,7 +6263,7 @@ midori_browser_init (MidoriBrowser* browser) browser->bookmarks = NULL; browser->trash = NULL; browser->search_engines = NULL; - browser->speeddial = NULL; + browser->dial = NULL; /* Setup the window metrics */ g_signal_connect (browser, "realize", @@ -6761,7 +6754,7 @@ midori_browser_finalize (GObject* object) katze_object_assign (browser->trash, NULL); katze_object_assign (browser->search_engines, NULL); katze_object_assign (browser->history, NULL); - browser->speeddial = NULL; + browser->dial = NULL; katze_assign (browser->news_aggregator, NULL); @@ -7535,7 +7528,7 @@ midori_browser_set_property (GObject* object, midori_browser_set_history (browser, g_value_get_object (value)); break; case PROP_SPEED_DIAL: - browser->speeddial = g_value_get_pointer (value); + browser->dial = g_value_get_pointer (value); break; case PROP_SHOW_TABS: browser->show_tabs = g_value_get_boolean (value); @@ -7607,7 +7600,7 @@ midori_browser_get_property (GObject* object, g_value_set_object (value, browser->history); break; case PROP_SPEED_DIAL: - g_value_set_pointer (value, browser->speeddial); + g_value_set_pointer (value, browser->dial); break; case PROP_SHOW_TABS: g_value_set_boolean (value, browser->show_tabs); diff --git a/midori/midori-speeddial.vala b/midori/midori-speeddial.vala index 1538981d..f8baf199 100644 --- a/midori/midori-speeddial.vala +++ b/midori/midori-speeddial.vala @@ -20,9 +20,12 @@ namespace Sokoke { namespace Midori { public class SpeedDial : GLib.Object { + string filename; public GLib.KeyFile keyfile; + string? html = null; - public SpeedDial (string filename, string? fallback = null) { + public SpeedDial (string new_filename, string? fallback = null) { + filename = new_filename; keyfile = new GLib.KeyFile (); try { keyfile.load_from_file (filename, GLib.KeyFileFlags.NONE); @@ -91,7 +94,7 @@ namespace Midori { } } - public static string get_next_free_slot_fk (KeyFile keyfile) { + public string get_next_free_slot () { uint slot_count = 0; foreach (string tile in keyfile.get_groups ()) { try { @@ -111,7 +114,7 @@ namespace Midori { return "s%u".printf (slot_count + 1); } - public static void add_fk (string id, string uri, string title, Gdk.Pixbuf img, KeyFile keyfile) { + public void add (string id, string uri, string title, Gdk.Pixbuf img) { keyfile.set_string (id, "uri", uri); keyfile.set_string (id, "title", title); @@ -126,8 +129,11 @@ namespace Midori { } } - public static string? get_html_fk (KeyFile? keyfile, - bool close_buttons_left, GLib.Object view, bool load_missing) throws Error { + public unowned string get_html (bool close_buttons_left, GLib.Object view) throws Error { + bool load_missing = true; + + if (html != null) + return html; string? head = null; string filename = Paths.get_res_filename ("speeddial-head.html"); @@ -222,10 +228,61 @@ namespace Midori { """, slot_count + 1, slot_count + 1, _("Click to add a shortcut")); markup.append_printf ("\n\n\n"); - return markup.str; + html = markup.str; + } + else + html = ""; + + return html; + } + + public void save_message (string message) throws Error { + string msg = message.substring (16, -1); + string[] parts = msg.split (" ", 4); + string action = parts[0]; + + if (action == "add" || action == "rename" + || action == "delete" || action == "swap") { + uint slot_id = parts[1].to_int () + 1; + string dial_id = "Dial %u".printf (slot_id); + + if (action == "delete") { + string uri = keyfile.get_string (dial_id, "uri"); + string file_path = Sokoke.build_thumbnail_path (uri); + keyfile.remove_group (dial_id); + FileUtils.unlink (file_path); + } + else if (action == "add") { + keyfile.set_string (dial_id, "uri", parts[2]); + /* FIXME midori_view_speed_dial_get_thumb (view, dial_id, parts[2]); */ + } + else if (action == "rename") { + uint offset = parts[0].length + parts[1].length + 2; + string title = msg.substring (offset, -1); + keyfile.set_string (dial_id, "title", title); + } + else if (action == "swap") { + uint slot2_id = parts[2].to_int () + 1; + string dial2_id = "Dial %u".printf (slot2_id); + + string uri = keyfile.get_string (dial_id, "uri"); + string title = keyfile.get_string (dial_id, "title"); + string uri2 = keyfile.get_string (dial2_id, "uri"); + string title2 = keyfile.get_string (dial2_id, "title"); + + keyfile.set_string (dial_id, "uri", uri2); + keyfile.set_string (dial2_id, "uri", uri); + keyfile.set_string (dial_id, "title", title2); + keyfile.set_string (dial2_id, "title", title); + } } - return null; + } + + public void save () throws Error { + html = null; + + FileUtils.set_contents (filename, keyfile.to_data ()); } } } diff --git a/midori/midori-view.c b/midori/midori-view.c index 9df799ee..0f01c4f6 100644 --- a/midori/midori-view.c +++ b/midori/midori-view.c @@ -225,7 +225,6 @@ enum { static guint signals[LAST_SIGNAL]; -static gchar* speeddial_markup = NULL; static GtkWidget* thumb_view = NULL; static GList* thumb_queue = NULL; @@ -253,10 +252,6 @@ midori_view_settings_notify_cb (MidoriWebSettings* settings, GParamSpec* pspec, MidoriView* view); -static void -midori_view_speed_dial_save (MidoriView* view, - const gchar* message); - static void midori_view_class_init (MidoriViewClass* class) { @@ -3314,7 +3309,13 @@ webkit_web_view_console_message_cb (GtkWidget* web_view, return FALSE; if (!strncmp (message, "speed_dial-save", 13)) - midori_view_speed_dial_save (view, message); + { + MidoriBrowser* browser = midori_browser_get_for_widget (GTK_WIDGET (view)); + MidoriSpeedDial* dial = katze_object_get_object (browser, "speed-dial"); + + midori_speed_dial_save_message (dial, message, NULL); + midori_view_save_speed_dial_config (view); + } else g_signal_emit (view, signals[CONSOLE_MESSAGE], 0, message, line, source_id); return TRUE; @@ -4225,17 +4226,6 @@ list_about_uris (GString* markup) valid_about_uris[i], valid_about_uris[i]); } -static gchar* -prepare_speed_dial_html (MidoriView* view, - gboolean load_missing) -{ - MidoriBrowser* browser = midori_browser_get_for_widget (GTK_WIDGET (view)); - GKeyFile* key_file = katze_object_get_object (browser, "speed-dial"); - return midori_speed_dial_get_html_fk (key_file, - katze_object_get_boolean (view->settings, "close-buttons-left"), - G_OBJECT (view), load_missing, NULL); -} - /** * midori_view_set_uri: @@ -4263,6 +4253,9 @@ midori_view_set_uri (MidoriView* view, { if (!uri || !strcmp (uri, "") || !strcmp (uri, "about:blank")) { + MidoriBrowser* browser = midori_browser_get_for_widget (GTK_WIDGET (view)); + MidoriSpeedDial* dial = katze_object_get_object (browser, "speed-dial"); + const gchar* html; #ifdef G_ENABLE_DEBUG GTimer* timer = NULL; @@ -4275,11 +4268,10 @@ midori_view_set_uri (MidoriView* view, katze_item_set_meta_string (view->item, "mime-type", NULL); katze_item_set_meta_integer (view->item, "delay", -1); - if (speeddial_markup == NULL) - speeddial_markup = prepare_speed_dial_html (view, TRUE); - - midori_view_load_alternate_string (view, - speeddial_markup ? speeddial_markup : "", "about:blank", NULL); + html = midori_speed_dial_get_html (dial, + katze_object_get_boolean (view->settings, "close-buttons-left"), + G_OBJECT (view), NULL); + midori_view_load_alternate_string (view, html, "about:blank", NULL); #ifdef G_ENABLE_DEBUG if (midori_debug ("startup")) @@ -6180,18 +6172,19 @@ thumb_view_load_status_cb (WebKitWebView* thumb_view_, #if HAVE_OFFSCREEN GdkPixbuf* pixbuf_scaled; #endif - gchar* file_path; - gchar* thumb_dir; gchar* spec; gchar* url; gchar* dial_id; MidoriBrowser* browser; - GKeyFile* key_file; + MidoriSpeedDial* dial; const gchar* title; if (webkit_web_view_get_load_status (thumb_view_) != WEBKIT_LOAD_FINISHED) return; + browser = midori_browser_get_for_widget (GTK_WIDGET (view)); + dial = katze_object_get_object (browser, "speed-dial"); + spec = g_object_get_data (G_OBJECT (thumb_view), "spec"); url = strstr (spec, "|") + 1; dial_id = g_strndup (spec, url - spec - 1); @@ -6205,24 +6198,11 @@ thumb_view_load_status_cb (WebKitWebView* thumb_view_, gtk_widget_realize (thumb_view); img = midori_view_web_view_get_snapshot (thumb_view, 240, 160); #endif - file_path = sokoke_build_thumbnail_path (url); - thumb_dir = g_build_path (G_DIR_SEPARATOR_S, midori_paths_get_cache_dir (), "thumbnails", NULL); - if (!g_file_test (thumb_dir, G_FILE_TEST_EXISTS)) - katze_mkdir_with_parents (thumb_dir, 0700); - - gdk_pixbuf_save (img, file_path, "png", NULL, "compression", "7", NULL); - - g_object_unref (img); - - g_free (file_path); - g_free (thumb_dir); - - browser = midori_browser_get_for_widget (GTK_WIDGET (view)); - g_object_get (browser, "speed-dial", &key_file, NULL); title = webkit_web_view_get_title (WEBKIT_WEB_VIEW (thumb_view)); - g_key_file_set_string (key_file, dial_id, "title", title ? title : url); - midori_view_save_speed_dial_config (view, key_file); + midori_speed_dial_add (dial, dial_id, url, title ? title : url, img); + g_object_unref (img); + midori_view_save_speed_dial_config (view); thumb_queue = g_list_remove (thumb_queue, spec); if (thumb_queue != NULL) @@ -6310,110 +6290,16 @@ midori_view_speed_dial_get_thumb (MidoriView* view, webkit_web_view_load_uri (WEBKIT_WEB_VIEW (thumb_view), url); } -/** - * midori_view_speed_dial_save - * @view: a #MidoriView - * @message: message from JavaScript - * - * Save speed_dial settings - * - **/ -static void -midori_view_speed_dial_save (MidoriView* view, - const gchar* message) -{ - gchar* action; - GKeyFile* key_file; - MidoriBrowser* browser = midori_browser_get_for_widget (GTK_WIDGET (view)); - gchar* msg = g_strdup (message + 16); - gchar** parts = g_strsplit (msg, " ", 4); - - g_object_get (browser, "speed-dial", &key_file, NULL); - action = parts[0]; - - if (g_str_equal (action, "add") || g_str_equal (action, "rename") - || g_str_equal (action, "delete") || g_str_equal (action, "swap")) - { - gchar* tmp = g_strdup (parts[1] + 1); - guint slot_id = atoi (tmp); - gchar* dial_id = g_strdup_printf ("Dial %d", slot_id); - g_free (tmp); - - - if (g_str_equal (action, "delete")) - { - gchar* uri = g_key_file_get_string (key_file, dial_id, "uri", NULL); - gchar* file_path = sokoke_build_thumbnail_path (uri); - - g_key_file_remove_group (key_file, dial_id, NULL); - g_unlink (file_path); - - g_free (uri); - g_free (file_path); - } - else if (g_str_equal (action, "add")) - { - g_key_file_set_string (key_file, dial_id, "uri", parts[2]); - midori_view_speed_dial_get_thumb (view, dial_id, parts[2]); - } - else if (g_str_equal (action, "rename")) - { - guint offset = strlen (parts[0]) + strlen (parts[1]) + 2; - gchar* title = g_strdup (msg + offset); - g_key_file_set_string (key_file, dial_id, "title", title); - g_free (title); - } - else if (g_str_equal (action, "swap")) - { - gchar* tmp1 = g_strdup (parts[2] + 1); - guint slot2_id = atoi (tmp1); - gchar* dial2_id = g_strdup_printf ("Dial %d", slot2_id); - gchar* uri, *uri2, *title, *title2; - g_free (tmp1); - - uri = g_key_file_get_string (key_file, dial_id, "uri", NULL); - title = g_key_file_get_string (key_file, dial_id, "title", NULL); - uri2 = g_key_file_get_string (key_file, dial2_id, "uri", NULL); - title2 = g_key_file_get_string (key_file, dial2_id, "title", NULL); - - g_key_file_set_string (key_file, dial_id, "uri", uri2); - g_key_file_set_string (key_file, dial2_id, "uri", uri); - g_key_file_set_string (key_file, dial_id, "title", title2); - g_key_file_set_string (key_file, dial2_id, "title", title); - - g_free (uri); - g_free (uri2); - g_free (title); - g_free (title2); - g_free (dial2_id); - } - - g_free (dial_id); - } - - midori_view_save_speed_dial_config (view, key_file); - - g_free (msg); - g_free (action); -} - void -midori_view_save_speed_dial_config (MidoriView* view, - GKeyFile* key_file) +midori_view_save_speed_dial_config (MidoriView* view) { - gchar* config_file; guint i = 0; MidoriBrowser* browser = midori_browser_get_for_widget (GTK_WIDGET (view)); + MidoriSpeedDial* dial = katze_object_get_object (browser, "speed-dial"); GtkWidget* tab; - config_file = g_build_filename (midori_paths_get_config_dir (), "speeddial", NULL); - sokoke_key_file_save_to_file (key_file, config_file, NULL); - g_free (config_file); - - katze_assign (speeddial_markup, prepare_speed_dial_html (view, FALSE)); - + midori_speed_dial_save (dial, NULL); while ((tab = midori_browser_get_nth_tab (browser, i++))) if (midori_view_is_blank (MIDORI_VIEW (tab))) midori_view_reload (MIDORI_VIEW (tab), FALSE); - } diff --git a/midori/midori-view.h b/midori/midori-view.h index e1811f9d..60fa0b77 100644 --- a/midori/midori-view.h +++ b/midori/midori-view.h @@ -291,8 +291,7 @@ midori_view_add_info_bar (MidoriView* view, ...); void -midori_view_save_speed_dial_config (MidoriView* view, - GKeyFile* key_file); +midori_view_save_speed_dial_config (MidoriView* view); const gchar* midori_view_fallback_extension (MidoriView* view, diff --git a/po/POTFILES.in b/po/POTFILES.in index c7f98f56..95375830 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -9,8 +9,10 @@ midori/midori-browser.c midori/midori-extension.c midori/midori-locationaction.c midori/midori-panel.c +midori/midori-settings.vala midori/midori-websettings.c midori/midori-view.c +midori/midori-speeddial.vala midori/midori-preferences.c midori/midori-searchaction.c midori/sokoke.c @@ -27,6 +29,8 @@ katze/katze-item.c katze/katze-array.c katze/katze-arrayaction.c katze/katze-preferences.c +katze/midori-uri.vala +katze/midori-paths.vala extensions/adblock.c extensions/addons.c extensions/colorful-tabs.c