Merge branch 'upstream-unstable'

This commit is contained in:
Yves-Alexis Perez 2011-01-31 08:08:02 +01:00
commit e51eca351f
68 changed files with 22313 additions and 16428 deletions

View file

@ -1,5 +1,22 @@
This file is licensed under the terms of the expat license, see the file EXPAT. This file is licensed under the terms of the expat license, see the file EXPAT.
v0.3.0
+ Support libnotify 0.7
+ Copy-friendly URIs with %20
+ No blocking of typed URLs with adblock
+ Import from Netscape HTML
+ Bookmark im- and export fixes
+ Unit tests cleaned up and updated
+ Correct bookmark and search icon names
+ Better link menu handling
+ Certificate location on FreeBSD
+ Fix Russian keyboard issues
+ Stylesheet parsing improvements
+ Simplify language and panel options
+ Default to DuckDuckGo search
+ No Netscape plugins in extension panel
+ Easy user addon install infobar
v0.2.9 v0.2.9
+ Add 'Identify As' to Statusbar Features + Add 'Identify As' to Statusbar Features
+ Don't restrict length of HTTP login passwords + Don't restrict length of HTTP login passwords

View file

@ -13,7 +13,7 @@ There are several ways to contribute to the project:
For translating, have a look at the file TRANSLATE. For translating, have a look at the file TRANSLATE.
For helping with testing and triaging bug reports, you should registers with the bug tracker at http://www.twotoasts.de/bugs and join #midori on irc.freenode.net where a lot of problems are discussed. You can start right away by trying to reproduce bug reports and comment with your findings. For helping with testing and triaging bug reports, you should register with the bug tracker at https://bugs.launchpad.net/midori and join #midori on irc.freenode.net where a lot of problems are discussed. You can start right away by trying to reproduce bug reports and comment with your findings.
If you are interested in contributing code, there are a few options. You can join #midori to discuss a particular problem you would like to look into, or a feature you would want to implement. Opening a bug report or feature request if there isn't already one is the next step. To attract some attention, if you attached a patch or have questions, ask in #midori. If you are interested in contributing code, there are a few options. You can join #midori to discuss a particular problem you would like to look into, or a feature you would want to implement. Opening a bug report or feature request if there isn't already one is the next step. To attract some attention, if you attached a patch or have questions, ask in #midori.

2
README
View file

@ -18,7 +18,7 @@ Optional: Unique 0.9, libidn, docutils, libnotify, Vala
For installation instructions read INSTALL. For installation instructions read INSTALL.
Please report comments, suggestions and bugs to: Please report comments, suggestions and bugs to:
http://www.twotoasts.de/bugs https://bugs.launchpad.net/midori
And join the IRC channel #midori on irc.freenode.net And join the IRC channel #midori on irc.freenode.net

View file

@ -1,30 +1,31 @@
[Duck Duck Go]
name=Duck Duck Go
text=Privacy-aware Web Search
uri=https://duckduckgo.com/?q=%s
token=dd
[Yahoo] [Yahoo]
name=Yahoo name=Yahoo
text=Yahoo Web Search text=Yahoo Web Search
uri=http://search.yahoo.com/search?p= uri=http://search.yahoo.com/search?p=
icon=
token=y token=y
[Google] [Google]
name=Google name=Google
text=Web Search text=Web Search
uri=http://www.google.com/search?q=%s uri=http://www.google.com/search?q=%s
icon=
token=g token=g
[Wikipedia] [Wikipedia]
name=Wikipedia name=Wikipedia
text=The free encyclopedia text=The free encyclopedia
uri=http://en.wikipedia.org/wiki/Special:Search/%s uri=http://en.wikipedia.org/wiki/Special:Search/%s
icon=
token=wp token=wp
[TheFreeDictionary] [TheFreeDictionary]
name=The Free Dictionary name=The Free Dictionary
text=Dictionary, Encyclopedia and Thesaurus text=Dictionary, Encyclopedia and Thesaurus
uri=http://www.thefreedictionary.com/%s uri=http://www.thefreedictionary.com/%s
icon=
token=fd token=fd
[Debian Packages] [Debian Packages]

View file

@ -366,6 +366,8 @@
var setSize = function () var setSize = function ()
{ {
if (typeof sc.width == 'undefined')
sc.width = 3;
var rows = Math.ceil (sc.shortcuts.length / sc.width); var rows = Math.ceil (sc.shortcuts.length / sc.width);
var size = prompt ("{enter_dial_size}", sc.width + 'x' + rows); var size = prompt ("{enter_dial_size}", sc.width + 'x' + rows);

View file

@ -752,6 +752,10 @@ adblock_resource_request_starting_cb (WebKitWebView* web_view,
const gchar* req_uri; const gchar* req_uri;
const char *page_uri; const char *page_uri;
/* Never filter the main page itself */
if (web_frame == webkit_web_view_get_main_frame (web_view))
return;
req_uri = webkit_network_request_get_uri (request); req_uri = webkit_network_request_get_uri (request);
if (!req_uri) if (!req_uri)

View file

@ -1,6 +1,7 @@
/* /*
Copyright (C) 2008 Christian Dywan <christian@twotoasts.de> Copyright (C) 2008 Christian Dywan <christian@twotoasts.de>
Copyright (C) 2008-2010 Arno Renevier <arno@renevier.net> Copyright (C) 2008-2010 Arno Renevier <arno@renevier.net>
Copyright (C) 2010 Paweł Forysiuk <tuxator@o2.pl>
This library is free software; you can redistribute it and/or This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public modify it under the terms of the GNU Lesser General Public
@ -92,6 +93,199 @@ struct AddonsList
GSList* elements; GSList* elements;
}; };
static void
addons_install_response (GtkWidget* infobar,
gint response_id,
MidoriView* view)
{
if (response_id == GTK_RESPONSE_ACCEPT)
{
MidoriBrowser* browser;
const gchar* uri;
browser = midori_browser_get_for_widget (GTK_WIDGET (infobar));
uri = midori_view_get_display_uri (view);
if (uri && *uri)
{
gchar** split_uri;
gchar* path, *filename, *hostname, *dest_path, *temp_uri;
const gchar* folder;
WebKitNetworkRequest* request;
WebKitDownload* download;
split_uri = g_strsplit (uri, "/", -1);
hostname = split_uri[2];
temp_uri = NULL;
filename = NULL;
folder = NULL;
if (!g_strcmp0 (hostname, "userscripts.org"))
{
gchar* script_id;
const gchar* js_script;
WebKitWebView* web_view;
WebKitWebFrame* web_frame;
web_view = WEBKIT_WEB_VIEW (midori_view_get_web_view (view));
web_frame = webkit_web_view_get_main_frame (web_view);
js_script = "document.getElementById('heading').childNodes[3].childNodes[1].innerHTML";
if (WEBKIT_IS_WEB_FRAME (web_frame))
{
JSContextRef js_context = webkit_web_frame_get_global_context (web_frame);
gchar* value = sokoke_js_script_eval (js_context, js_script, NULL);
if (value && *value)
filename = g_strdup_printf ("%s.user.js", value);
g_free (value);
}
folder = "scripts";
script_id = split_uri[5];
/* rewrite uri to get source js */
temp_uri = g_strdup_printf ("http://%s/scripts/source/%s.user.js",
hostname, script_id);
uri = temp_uri;
}
else if (!g_strcmp0 (hostname, "userstyles.org"))
{
gchar* subpage;
folder = "styles";
if (g_str_has_suffix (uri, "/"))
subpage = split_uri[6];
else
subpage = split_uri[5];
if (!subpage)
{
gchar* style_id;
const gchar* js_script;
WebKitWebView* web_view;
WebKitWebFrame* web_frame;
web_view = WEBKIT_WEB_VIEW (midori_view_get_web_view (view));
web_frame = webkit_web_view_get_main_frame (web_view);
js_script = "document.getElementById('stylish-description').innerHTML;";
if (WEBKIT_IS_WEB_FRAME (web_frame))
{
JSContextRef js_context = webkit_web_frame_get_global_context (web_frame);
gchar* value = sokoke_js_script_eval (js_context, js_script, NULL);
if (value && *value)
filename = g_strdup_printf ("%s.css", value);
g_free (value);
}
/* rewrite uri to get css */
style_id = split_uri[4];
temp_uri = g_strdup_printf ("http://%s/styles/%s.css", hostname, style_id);
uri = temp_uri;
}
}
if (g_str_has_suffix (uri, ".user.js"))
folder = "scripts";
else if (g_str_has_suffix (uri, ".user.css"))
folder = "styles";
if (!filename)
filename = g_path_get_basename (uri);
path = g_build_path (G_DIR_SEPARATOR_S, g_get_user_data_dir (),
PACKAGE_NAME, folder, filename, NULL);
request = webkit_network_request_new (uri);
download = webkit_download_new (request);
g_object_unref (request);
dest_path = g_filename_to_uri (path, NULL, NULL);
webkit_download_set_destination_uri (download, dest_path);
webkit_download_start (download);
g_free (filename);
g_free (path);
g_free (temp_uri);
g_free (dest_path);
g_strfreev (split_uri);
}
}
gtk_widget_destroy (GTK_WIDGET (infobar));
}
static void
addons_uri_install (MidoriBrowser* browser,
MidoriView* view,
AddonsKind kind)
{
const gchar* message;
const gchar* button_text;
if (kind == ADDONS_USER_SCRIPTS)
{
/* i18n: An infobar shows up when viewing a script on userscripts.org */
message = _("This page appears to contain a user script. Do you wish to install it?");
button_text = _("_Install user script");
}
else if (kind == ADDONS_USER_STYLES)
{
/* i18n: An infobar shows up when viewing a style on userstyles.org */
message = _("This page appears to contain a user style. Do you wish to install it?");
button_text = _("_Install user style");
}
else
g_assert_not_reached ();
midori_view_add_info_bar (view, GTK_MESSAGE_QUESTION, message,
G_CALLBACK (addons_install_response), view,
button_text, GTK_RESPONSE_ACCEPT,
_("Don't install"), GTK_RESPONSE_CANCEL, NULL);
}
static void
addons_notify_load_status_cb (MidoriBrowser* browser,
GParamSpec* pspec,
MidoriExtension* extension)
{
const gchar* uri = midori_browser_get_current_uri (browser);
if (uri && *uri)
{
/* FIXME: addons_notify_load_status_cb should pass MidoriView* pointer */
GtkWidget* view = midori_browser_get_current_tab (browser);
if (midori_view_get_load_status (MIDORI_VIEW (view)) == MIDORI_LOAD_FINISHED)
{
/* casual sites goes by uri suffix */
if (g_str_has_suffix (uri, ".user.js"))
addons_uri_install (browser, MIDORI_VIEW (view), ADDONS_USER_SCRIPTS);
else if (g_str_has_suffix (uri, ".user.css"))
addons_uri_install (browser, MIDORI_VIEW (view), ADDONS_USER_STYLES);
else if (g_str_has_prefix (uri, "http://userscripts.org/scripts/"))
{
gchar** split_uri = g_strsplit (uri, "/", -1);
gchar* subpage = split_uri[4];
/* userscripts.org script main (with desc) and "source view" pages */
if (!g_strcmp0 (subpage, "show") /* || !g_strcmp0 (subpage, "review") */)
addons_uri_install (browser, MIDORI_VIEW (view), ADDONS_USER_SCRIPTS);
g_strfreev (split_uri);
}
else if (g_str_has_prefix (uri, "http://userstyles.org/styles/"))
{
gchar** split_uri = g_strsplit (uri, "/", -1);
gchar* subpage;
if (g_str_has_suffix (uri, "/"))
subpage = split_uri[6];
else
subpage = split_uri[5];
/* userstyles.org style main page with style description */
if (!subpage)
addons_uri_install (browser, MIDORI_VIEW (view), ADDONS_USER_STYLES);
g_strfreev (split_uri);
}
}
}
}
static void static void
midori_addons_button_add_clicked_cb (GtkToolItem* toolitem, midori_addons_button_add_clicked_cb (GtkToolItem* toolitem,
Addons* addons) Addons* addons)
@ -293,7 +487,7 @@ midori_addons_open_in_editor_clicked_cb (GtkWidget* toolitem,
gchar* text_editor; gchar* text_editor;
browser = midori_browser_get_for_widget (GTK_WIDGET (addons->treeview)); browser = midori_browser_get_for_widget (GTK_WIDGET (addons->treeview));
settings = katze_object_get_object (browser, "settings"); settings = midori_browser_get_settings (browser);
gtk_tree_model_get (model, &iter, 0, &element, -1); gtk_tree_model_get (model, &iter, 0, &element, -1);
@ -794,6 +988,7 @@ css_metadata_from_file (const gchar* filename,
GIOChannel* channel; GIOChannel* channel;
gchar* line; gchar* line;
gchar* rest_of_line; gchar* rest_of_line;
gboolean line_has_meta;
if (!g_file_test (filename, G_FILE_TEST_IS_REGULAR | G_FILE_TEST_IS_SYMLINK)) if (!g_file_test (filename, G_FILE_TEST_IS_REGULAR | G_FILE_TEST_IS_SYMLINK))
return FALSE; return FALSE;
@ -802,60 +997,61 @@ css_metadata_from_file (const gchar* filename,
if (!channel) if (!channel)
return FALSE; return FALSE;
line_has_meta = FALSE;
while (g_io_channel_read_line (channel, &line, NULL, NULL, NULL) while (g_io_channel_read_line (channel, &line, NULL, NULL, NULL)
== G_IO_STATUS_NORMAL) == G_IO_STATUS_NORMAL)
{ {
if (g_str_has_prefix (line, "@-moz-document")) if (g_str_has_prefix (line, "@-moz-document") || line_has_meta)
{ /* FIXME: We merely look for includes. We should honor blocks. */ { /* FIXME: We merely look for includes. We should honor blocks. */
if (includes) if (includes)
{ {
gchar** parts; gchar** parts;
guint i; guint i;
if (g_str_has_prefix (line, "@-moz-document"))
rest_of_line = g_strdup (line + strlen ("@-moz-document")); rest_of_line = g_strdup (line + strlen ("@-moz-document"));
else
rest_of_line = g_strdup (line);
rest_of_line = g_strstrip (rest_of_line); rest_of_line = g_strstrip (rest_of_line);
parts = g_strsplit (rest_of_line, " ", 0); parts = g_strsplit (rest_of_line, " ", 0);
i = 0; i = 0;
while (parts[i]) while (parts[i] && (*parts[i] != '\0' && *parts[i] != '{'))
{ {
gchar* value = NULL; gchar* value = NULL;
if (g_str_has_prefix (parts[i], "url-prefix(")) if (g_str_has_prefix (parts[i], "url-prefix("))
value = g_strdup (parts[i] + strlen ("url-prefix(")); value = g_strdup (parts[i] + strlen ("url-prefix("));
else if (g_str_has_prefix (parts[i], "domain("))
value = g_strdup (parts[i] + strlen ("domain("));
else if (g_str_has_prefix (parts[i], "url(")) else if (g_str_has_prefix (parts[i], "url("))
value = g_strdup (parts[i] + strlen ("url(")); value = g_strdup (parts[i] + strlen ("url("));
if (value) if (value)
{ {
guint j; guint begin, end;
gchar* domain;
if (value[0] != '\'' && value[0] != '"') line_has_meta = TRUE;
begin = value[0] == '"' || value[0] == '\'' ? 1 : 0;
end = 1;
while (value[end] != '\0' && value[end] != ')')
++end;
domain = g_strndup (value + begin, end - begin * 2);
if (!strncmp ("http", domain, 4))
*includes = g_slist_prepend (*includes, domain);
else
{ {
/* Wrong syntax, abort */ *includes = g_slist_prepend (*includes,
g_free (value); g_strdup_printf ("http://*%s/*", domain));
g_strfreev (parts); g_free (domain);
g_free (line);
g_io_channel_shutdown (channel, false, 0);
g_slist_free (*includes);
g_slist_free (*excludes);
*includes = NULL;
*excludes = NULL;
return FALSE;
} }
j = 1;
while (value[j] != '\0')
{
if (value[j] == value[0])
break;
j++;
}
*includes = g_slist_prepend (*includes, g_strndup (value + 1, j - 1));
g_free (value); g_free (value);
} }
/* FIXME: Recognize "domain" */
i++; i++;
} }
g_strfreev (parts); g_strfreev (parts);
} }
line_has_meta = g_str_has_suffix (rest_of_line, "{") ? FALSE : TRUE;
} }
g_free (line); g_free (line);
} }
@ -871,7 +1067,8 @@ addons_get_element_content (gchar* file_path,
gchar** content) gchar** content)
{ {
gchar* file_content; gchar* file_content;
guint meta; GString* content_chunks;
guint meta, comment;
guint i, n; guint i, n;
g_assert (kind == ADDONS_USER_SCRIPTS || kind == ADDONS_USER_STYLES); g_assert (kind == ADDONS_USER_SCRIPTS || kind == ADDONS_USER_STYLES);
@ -887,7 +1084,9 @@ addons_get_element_content (gchar* file_path,
else if (kind == ADDONS_USER_STYLES) else if (kind == ADDONS_USER_STYLES)
{ {
meta = 0; meta = 0;
comment = 0;
n = strlen (file_content); n = strlen (file_content);
content_chunks = g_string_new_len (NULL, n);
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
{ {
/* Replace line breaks with spaces */ /* Replace line breaks with spaces */
@ -896,23 +1095,19 @@ addons_get_element_content (gchar* file_path,
/* Change all single quotes to double quotes */ /* Change all single quotes to double quotes */
if (file_content[i] == '\'') if (file_content[i] == '\'')
file_content[i] = '\"'; file_content[i] = '\"';
/* Turn metadata we inspected earlier into comments */
if (!meta && file_content[i] == '@') if (!meta && file_content[i] == '@')
{ {
file_content[i] = '/';
meta++; meta++;
} }
else if (meta == 1 else if (meta == 1
&& (file_content[i] == '-' || file_content[i] == 'n')) && (file_content[i] == '-' || file_content[i] == 'n'))
{ {
file_content[i] = '*';
meta++; meta++;
} }
else if (meta == 2 && file_content[i] == '{') else if (meta == 2 && file_content[i] == '{')
{ {
file_content[i - 1] = '*';
file_content[i] = '/';
meta++; meta++;
continue;
} }
else if (meta == 3 && file_content[i] == '{') else if (meta == 3 && file_content[i] == '{')
meta++; meta++;
@ -920,9 +1115,33 @@ addons_get_element_content (gchar* file_path,
meta--; meta--;
else if (meta == 3 && file_content[i] == '}') else if (meta == 3 && file_content[i] == '}')
{ {
file_content[i] = ' ';
meta = 0; meta = 0;
continue;
} }
if (file_content[i] == '/' && file_content[i+1] == '*')
comment++;
/* Check whether we have comment ending, merely '*' or '/' */
else if (comment == 2
&& file_content[i] == '*' && file_content[i+1] == '/')
{
comment--;
}
else if (comment == 1
&& file_content[i-1] == '*' && file_content[i] == '/')
{
comment--;
continue;
}
/* Skip consecutive spaces */
if (file_content[i] == ' '
&& i > 0 && file_content[i - 1] == ' ')
continue;
/* Append actual data to string */
if ((meta == 0 || meta >= 3) && !comment)
g_string_append_c (content_chunks, file_content[i]);
} }
*content = g_strdup_printf ( *content = g_strdup_printf (
@ -936,8 +1155,8 @@ addons_get_element_content (gchar* file_path,
"else document.documentElement.insertBefore" "else document.documentElement.insertBefore"
"(mystyle, document.documentElement.firstChild);" "(mystyle, document.documentElement.firstChild);"
"}, true);", "}, true);",
file_content); content_chunks->str);
g_string_free (content_chunks, TRUE);
} }
g_free (file_content); g_free (file_content);
if (*content) if (*content)
@ -1356,6 +1575,8 @@ addons_app_add_browser_cb (MidoriApp* app,
(GtkCallback)addons_add_tab_foreach_cb, extension); (GtkCallback)addons_add_tab_foreach_cb, extension);
g_signal_connect (browser, "add-tab", g_signal_connect (browser, "add-tab",
G_CALLBACK (addons_add_tab_cb), extension); G_CALLBACK (addons_add_tab_cb), extension);
g_signal_connect (browser, "notify::load-status",
G_CALLBACK (addons_notify_load_status_cb), extension);
panel = katze_object_get_object (browser, "panel"); panel = katze_object_get_object (browser, "panel");
scripts = addons_new (ADDONS_USER_SCRIPTS, extension); scripts = addons_new (ADDONS_USER_SCRIPTS, extension);
@ -1411,7 +1632,8 @@ addons_save_settings (MidoriApp* app,
config_file = g_build_filename (config_dir, "addons", NULL); config_file = g_build_filename (config_dir, "addons", NULL);
katze_mkdir_with_parents (config_dir, 0700); katze_mkdir_with_parents (config_dir, 0700);
sokoke_key_file_save_to_file (keyfile, config_file, &error); sokoke_key_file_save_to_file (keyfile, config_file, &error);
if (error) /* If the folder is /, this is a test run, thus no error */
if (error && !g_str_equal (config_dir, "/"))
{ {
g_warning (_("The configuration of the extension '%s' couldn't be saved: %s\n"), g_warning (_("The configuration of the extension '%s' couldn't be saved: %s\n"),
_("User addons"), error->message); _("User addons"), error->message);

View file

@ -334,15 +334,11 @@ feed_panel_row_activated_cb (GtkTreeView* treeview,
MidoriWebSettings* settings; MidoriWebSettings* settings;
MidoriBrowser* browser; MidoriBrowser* browser;
gint n; gint n;
browser = midori_browser_get_for_widget (GTK_WIDGET (panel)); browser = midori_browser_get_for_widget (GTK_WIDGET (panel));
n = midori_browser_add_item (browser, item); n = midori_browser_add_item (browser, item);
settings = midori_browser_get_settings (browser);
settings = katze_object_get_object (browser, "settings");
if (!katze_object_get_boolean (settings, "open-tabs-in-the-background")) if (!katze_object_get_boolean (settings, "open-tabs-in-the-background"))
midori_browser_set_current_page (browser, n); midori_browser_set_current_page (browser, n);
g_object_unref (settings);
} }
g_object_unref (item); g_object_unref (item);
} }
@ -485,11 +481,9 @@ feed_panel_open_in_tab_activate_cb (GtkWidget* menuitem,
browser = midori_browser_get_for_widget (GTK_WIDGET (panel)); browser = midori_browser_get_for_widget (GTK_WIDGET (panel));
n = midori_browser_add_item (browser, item); n = midori_browser_add_item (browser, item);
settings = midori_browser_get_settings (browser);
settings = katze_object_get_object (browser, "settings");
if (!katze_object_get_boolean (settings, "open-tabs-in-the-background")) if (!katze_object_get_boolean (settings, "open-tabs-in-the-background"))
midori_browser_set_current_page (browser, n); midori_browser_set_current_page (browser, n);
g_object_unref (settings);
} }
} }
@ -584,10 +578,9 @@ feed_panel_button_release_event_cb (GtkWidget* widget,
browser = midori_browser_get_for_widget (GTK_WIDGET (panel)); browser = midori_browser_get_for_widget (GTK_WIDGET (panel));
n = midori_browser_add_item (browser, item); n = midori_browser_add_item (browser, item);
settings = katze_object_get_object (browser, "settings"); settings = midori_browser_get_settings (browser);
if (!katze_object_get_boolean (settings, "open-tabs-in-the-background")) if (!katze_object_get_boolean (settings, "open-tabs-in-the-background"))
midori_browser_set_current_page (browser, n); midori_browser_set_current_page (browser, n);
g_object_unref (settings);
} }
} }
else else

View file

@ -1,5 +1,5 @@
/* /*
Copyright (C) 2010 André Stösel <Midori-Plugin@PyIT.de> Copyright (C) 2010 André Stösel <andre@stoesel.de>
This library is free software; you can redistribute it and/or This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public modify it under the terms of the GNU Lesser General Public
@ -29,7 +29,7 @@ private abstract class HistoryWindow : Gtk.Window {
window_position: Gtk.WindowPosition.CENTER, window_position: Gtk.WindowPosition.CENTER,
browser: browser); browser: browser);
} }
public void walk (int step) { public virtual void walk (int step) {
Gtk.TreePath? path; Gtk.TreePath? path;
Gtk.TreeViewColumn? column; Gtk.TreeViewColumn? column;
@ -50,23 +50,9 @@ private abstract class HistoryWindow : Gtk.Window {
} }
private class TabWindow : HistoryWindow { private class TabWindow : HistoryWindow {
public TabWindow (Midori.Browser browser) { protected Gtk.HBox? hbox;
base (browser); protected Gtk.VBox? vbox;
protected void store_append_row (GLib.PtrArray list, Gtk.ListStore store, out Gtk.TreeIter iter) {
var hbox = new Gtk.HBox (false, 1);
this.add (hbox);
var sw = new Gtk.ScrolledWindow (null, null);
sw.set_size_request (320, 20);
sw.set_policy (PolicyType.NEVER , PolicyType.AUTOMATIC);
sw.set_shadow_type (ShadowType.ETCHED_IN);
hbox.pack_start (sw, true, true, 0);
var store = new Gtk.ListStore (TabTreeCells.TREE_CELL_COUNT,
typeof (Gdk.Pixbuf), typeof (string), typeof (void*));
Gtk.TreeIter iter;
unowned GLib.PtrArray list = this.browser.get_data<GLib.PtrArray> ("history-list-tab-history");
for (var i = list.len; i > 0; i--) { for (var i = list.len; i > 0; i--) {
Midori.View view = list.index (i - 1) as Midori.View; Midori.View view = list.index (i - 1) as Midori.View;
@ -80,8 +66,34 @@ private class TabWindow : HistoryWindow {
TabTreeCells.TREE_CELL_STRING, title, TabTreeCells.TREE_CELL_STRING, title,
TabTreeCells.TREE_CELL_POINTER, view); TabTreeCells.TREE_CELL_POINTER, view);
} }
}
protected virtual void insert_rows (Gtk.ListStore store) {
Gtk.TreeIter iter;
unowned GLib.PtrArray list = this.browser.get_data<GLib.PtrArray> ("history-list-tab-history");
unowned GLib.PtrArray list_new = this.browser.get_data<GLib.PtrArray> ("history-list-tab-history-new");
store_append_row (list, store, out iter);
store_append_row (list_new, store, out iter);
}
public TabWindow (Midori.Browser browser) {
base (browser);
this.vbox = new Gtk.VBox (false, 1);
this.add (this.vbox);
this.hbox = new Gtk.HBox (false, 1);
var sw = new Gtk.ScrolledWindow (null, null);
sw.set_policy (PolicyType.NEVER , PolicyType.AUTOMATIC);
sw.set_shadow_type (ShadowType.ETCHED_IN);
this.hbox.pack_start (sw, true, true, 0);
var store = new Gtk.ListStore (TabTreeCells.TREE_CELL_COUNT,
typeof (Gdk.Pixbuf), typeof (string), typeof (void*));
this.insert_rows (store);
this.vbox.pack_start (this.hbox, true, true, 0);
this.set_default_size (320, list.len > 10 ? 232 : (int) list.len * 23 + 2);
this.treeview = new Gtk.TreeView.with_model (store); this.treeview = new Gtk.TreeView.with_model (store);
this.treeview.set_fixed_height_mode (true); this.treeview.set_fixed_height_mode (true);
sw.add (treeview); sw.add (treeview);
@ -96,6 +108,17 @@ private class TabWindow : HistoryWindow {
TabTreeCells.TREE_CELL_STRING, "Title", TabTreeCells.TREE_CELL_STRING, "Title",
new CellRendererText (), "text", 1); new CellRendererText (), "text", 1);
Requisition requisition;
int height;
int max_lines = 10;
this.treeview.size_request (out requisition);
if (store.length > max_lines) {
height = requisition.height / store.length * max_lines + 2;
} else {
height = requisition.height + 2;
}
sw.set_size_request (320, height);
this.show_all (); this.show_all ();
} }
public override void make_update () { public override void make_update () {
@ -115,6 +138,31 @@ private class TabWindow : HistoryWindow {
} }
} }
private class NewTabWindow : TabWindow {
protected bool first_step = true;
protected override void insert_rows (Gtk.ListStore store) {
Gtk.TreeIter iter;
unowned GLib.PtrArray list = this.browser.get_data<GLib.PtrArray> ("history-list-tab-history-new");
store_append_row (list, store, out iter);
if ((int)list.len == 0) {
var label = new Gtk.Label (_("There are no unvisited tabs"));
this.vbox.pack_start (label, true, true, 0);
unowned GLib.PtrArray list_old = this.browser.get_data<GLib.PtrArray> ("history-list-tab-history");
store_append_row (list_old, store, out iter);
}
}
public override void walk (int step) {
if (this.first_step == false || step != 1) {
base.walk (step);
}
this.first_step = false;
}
public NewTabWindow (Midori.Browser browser) {
base (browser);
}
}
private class HistoryList : Midori.Extension { private class HistoryList : Midori.Extension {
protected uint modifier_count; protected uint modifier_count;
protected HistoryWindow? history_window; protected HistoryWindow? history_window;
@ -139,6 +187,13 @@ private class HistoryList : Midori.Extension {
return false; return false;
} }
public void walk (Gtk.Action action, Browser browser, Type type, int step) { public void walk (Gtk.Action action, Browser browser, Type type, int step) {
Midori.View? view = null;
view = browser.get_data<Midori.View?> ("history-list-last-change");
if (view != null) {
this.tab_list_resort (browser, view);
browser.set_data<Midori.View?> ("history-list-last-change", null);
}
if (this.history_window == null || this.history_window.get_type () != type) { if (this.history_window == null || this.history_window.get_type () != type) {
if (this.history_window == null) { if (this.history_window == null) {
this.modifier_count = Midori.Sokoke.gtk_action_count_modifiers (action); this.modifier_count = Midori.Sokoke.gtk_action_count_modifiers (action);
@ -158,6 +213,8 @@ private class HistoryList : Midori.Extension {
*/ */
if (type == typeof (TabWindow)) { if (type == typeof (TabWindow)) {
this.history_window = new TabWindow (browser); this.history_window = new TabWindow (browser);
} else if (type == typeof (NewTabWindow)) {
this.history_window = new NewTabWindow (browser);
} }
} }
var hw = this.history_window as HistoryWindow; var hw = this.history_window as HistoryWindow;
@ -190,8 +247,32 @@ private class HistoryList : Midori.Extension {
action.set_accel_group (acg); action.set_accel_group (acg);
action.connect_accelerator (); action.connect_accelerator ();
action = new Gtk.Action ("HistoryListNextNewTab",
_("Next new Tab (History List)"),
_("Next new tab from history"), null);
action.activate.connect ((a) => {
this.walk (a, browser, typeof (NewTabWindow), 1);
});
action_group.add_action_with_accel (action, "<Ctrl>1");
action.set_accel_group (acg);
action.connect_accelerator ();
action = new Gtk.Action ("HistoryListPreviousNewTab",
_("Previous new Tab (History List)"),
_("Previous new tab from history"), null);
action.activate.connect ((a) => {
this.walk (a, browser, typeof (NewTabWindow), -1);
});
action_group.add_action_with_accel (action, "<Ctrl>2");
action.set_accel_group (acg);
action.connect_accelerator ();
browser.set_data<GLib.PtrArray*> ("history-list-tab-history", browser.set_data<GLib.PtrArray*> ("history-list-tab-history",
new GLib.PtrArray ()); new GLib.PtrArray ());
browser.set_data<GLib.PtrArray*> ("history-list-tab-history-new",
new GLib.PtrArray ());
browser.set_data<Midori.View?> ("history-list-last-change", null);
foreach (var tab in browser.get_tabs ()) foreach (var tab in browser.get_tabs ())
tab_added (browser, tab); tab_added (browser, tab);
browser.add_tab.connect (tab_added); browser.add_tab.connect (tab_added);
@ -199,7 +280,8 @@ private class HistoryList : Midori.Extension {
browser.notify["tab"].connect (this.tab_changed); browser.notify["tab"].connect (this.tab_changed);
} }
void browser_removed (Midori.Browser browser) { void browser_removed (Midori.Browser browser) {
string[] callbacks = { "HistoryListNextTab", "HistoryListPreviousTab" }; string[] callbacks = { "HistoryListNextTab", "HistoryListPreviousTab",
"HistoryListNextNewTab", "HistoryListPreviousNewTab" };
Gtk.ActionGroup action_group; Gtk.ActionGroup action_group;
action_group = browser.get_action_group (); action_group = browser.get_action_group ();
@ -214,20 +296,40 @@ private class HistoryList : Midori.Extension {
browser.notify["tab"].disconnect (this.tab_changed); browser.notify["tab"].disconnect (this.tab_changed);
} }
void tab_added (Midori.Browser browser, Midori.View view) { void tab_added (Midori.Browser browser, Midori.View view) {
unowned GLib.PtrArray list = browser.get_data<GLib.PtrArray> ("history-list-tab-history"); unowned GLib.PtrArray list = browser.get_data<GLib.PtrArray> ("history-list-tab-history-new");
list.add (view); list.add (view);
} }
void tab_removed (Midori.Browser browser, Midori.View view) { void tab_removed (Midori.Browser browser, Midori.View view) {
unowned GLib.PtrArray list = browser.get_data<GLib.PtrArray> ("history-list-tab-history"); unowned GLib.PtrArray list = browser.get_data<GLib.PtrArray> ("history-list-tab-history");
unowned GLib.PtrArray list_new = browser.get_data<GLib.PtrArray> ("history-list-tab-history-new");
list.remove (view); list.remove (view);
list_new.remove (view);
browser.set_data<Midori.View?> ("history-list-last-change", null);
if ((int) list.len > 0 || (int) list_new.len > 0) {
var hw = new TabWindow (browser);
hw.make_update ();
hw.destroy ();
}
} }
void tab_changed (GLib.Object window, GLib.ParamSpec pspec) { void tab_changed (GLib.Object window, GLib.ParamSpec pspec) {
Midori.Browser browser = window as Midori.Browser; Midori.Browser browser = window as Midori.Browser;
Midori.View view = null; Midori.View view = null;
Midori.View last_view = null;
browser.get ("tab", ref view); browser.get ("tab", ref view);
last_view = browser.get_data<Midori.View?> ("history-list-last-change");
if (last_view != null) {
this.tab_list_resort (browser, last_view);
}
browser.set_data<Midori.View?> ("history-list-last-change", view);
}
void tab_list_resort (Midori.Browser browser, Midori.View view) {
unowned GLib.PtrArray list = browser.get_data<GLib.PtrArray> ("history-list-tab-history"); unowned GLib.PtrArray list = browser.get_data<GLib.PtrArray> ("history-list-tab-history");
unowned GLib.PtrArray list_new = browser.get_data<GLib.PtrArray> ("history-list-tab-history-new");
list.remove (view); list.remove (view);
list_new.remove (view);
list.add (view); list.add (view);
} }
void activated (Midori.App app) { void activated (Midori.App app) {
@ -244,8 +346,8 @@ private class HistoryList : Midori.Extension {
internal HistoryList () { internal HistoryList () {
GLib.Object (name: _("History List"), GLib.Object (name: _("History List"),
description: _("Switch tabs with Ctrl+Tab sorted by last usage"), description: _("Switch tabs with Ctrl+Tab sorted by last usage"),
version: "0.2", version: "0.3",
authors: "André Stösel <Midori-Plugin@PyIT.de>"); authors: "André Stösel <andre@stoesel.de>");
activate.connect (activated); activate.connect (activated);
deactivate.connect (deactivated); deactivate.connect (deactivated);
} }

View file

@ -28,9 +28,8 @@ page_holder_notebook_append_view (GtkWidget* notebook)
view = midori_view_new (NULL); view = midori_view_new (NULL);
browser = midori_browser_get_for_widget (notebook); browser = midori_browser_get_for_widget (notebook);
settings = katze_object_get_object (browser, "settings"); settings = midori_browser_get_settings (browser);
midori_view_set_settings (MIDORI_VIEW (view), settings); midori_view_set_settings (MIDORI_VIEW (view), settings);
g_object_unref (settings);
gtk_widget_show (view); gtk_widget_show (view);
label = midori_view_get_proxy_tab_label (MIDORI_VIEW (view)); label = midori_view_get_proxy_tab_label (MIDORI_VIEW (view));
return gtk_notebook_append_page (GTK_NOTEBOOK (notebook), view, label); return gtk_notebook_append_page (GTK_NOTEBOOK (notebook), view, label);

View file

@ -79,7 +79,7 @@ statusbar_features_app_add_browser_cb (MidoriApp* app,
statusbar = katze_object_get_object (browser, "statusbar"); statusbar = katze_object_get_object (browser, "statusbar");
bbox = gtk_hbox_new (FALSE, 0); bbox = gtk_hbox_new (FALSE, 0);
settings = katze_object_get_object (browser, "settings"); settings = midori_browser_get_settings (browser);
toolbar = katze_object_get_object (browser, "navigationbar"); toolbar = katze_object_get_object (browser, "navigationbar");
button = katze_property_proxy (settings, "auto-load-images", "toggle"); button = katze_property_proxy (settings, "auto-load-images", "toggle");
g_object_set_data (G_OBJECT (button), "feature-label", _("Images")); g_object_set_data (G_OBJECT (button), "feature-label", _("Images"));
@ -112,7 +112,6 @@ statusbar_features_app_add_browser_cb (MidoriApp* app,
gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 2); gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 2);
gtk_widget_show_all (bbox); gtk_widget_show_all (bbox);
gtk_box_pack_start (GTK_BOX (statusbar), bbox, FALSE, FALSE, 3); gtk_box_pack_start (GTK_BOX (statusbar), bbox, FALSE, FALSE, 3);
g_object_unref (settings);
g_object_unref (statusbar); g_object_unref (statusbar);
g_signal_connect (extension, "deactivate", g_signal_connect (extension, "deactivate",

View file

@ -279,6 +279,20 @@ tab_panel_settings_notify_cb (MidoriWebSettings* settings,
gtk_tree_store_set (GTK_TREE_STORE (model), &iter, 2, buttons, -1); gtk_tree_store_set (GTK_TREE_STORE (model), &iter, 2, buttons, -1);
} }
static void
tab_panel_toggle_toolbook (GtkWidget* toolbar)
{
/* Hack to ensure correct toolbar visibility */
GtkWidget* toolbook = gtk_widget_get_parent (toolbar);
if (gtk_notebook_get_current_page (GTK_NOTEBOOK (toolbook))
== gtk_notebook_page_num (GTK_NOTEBOOK (toolbook), toolbar))
{
GList* items = gtk_container_get_children (GTK_CONTAINER (toolbar));
sokoke_widget_set_visible (toolbook, items != NULL);
g_list_free (items);
}
}
static void static void
tab_panel_remove_view (MidoriBrowser* browser, tab_panel_remove_view (MidoriBrowser* browser,
GtkWidget* view, GtkWidget* view,
@ -287,7 +301,9 @@ tab_panel_remove_view (MidoriBrowser* browser,
if (minimized) if (minimized)
{ {
GtkToolItem* toolitem = tab_panel_get_toolitem_for_view (view); GtkToolItem* toolitem = tab_panel_get_toolitem_for_view (view);
GtkWidget* toolbar = tab_panel_get_toolbar_for_browser (browser);
gtk_widget_destroy (GTK_WIDGET (toolitem)); gtk_widget_destroy (GTK_WIDGET (toolitem));
tab_panel_toggle_toolbook (toolbar);
} }
else else
{ {
@ -396,7 +412,7 @@ tab_panel_browser_add_tab_cb (MidoriBrowser* browser,
{ {
GtkWidget* notebook = katze_object_get_object (browser, "notebook"); GtkWidget* notebook = katze_object_get_object (browser, "notebook");
gint page = gtk_notebook_page_num (GTK_NOTEBOOK (notebook), view); gint page = gtk_notebook_page_num (GTK_NOTEBOOK (notebook), view);
MidoriWebSettings* settings = katze_object_get_object (browser, "settings"); MidoriWebSettings* settings = midori_browser_get_settings (browser);
gboolean minimized = katze_object_get_boolean (view, "minimized"); gboolean minimized = katze_object_get_boolean (view, "minimized");
GdkPixbuf* icon = midori_view_get_icon (MIDORI_VIEW (view)); GdkPixbuf* icon = midori_view_get_icon (MIDORI_VIEW (view));
const gchar* title = midori_view_get_display_title (MIDORI_VIEW (view)); const gchar* title = midori_view_get_display_title (MIDORI_VIEW (view));
@ -413,6 +429,7 @@ tab_panel_browser_add_tab_cb (MidoriBrowser* browser,
g_object_set_data (G_OBJECT (view), "tab-panel-ext-toolitem", toolitem); g_object_set_data (G_OBJECT (view), "tab-panel-ext-toolitem", toolitem);
gtk_widget_show (GTK_WIDGET (toolitem)); gtk_widget_show (GTK_WIDGET (toolitem));
gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1); gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
tab_panel_toggle_toolbook (toolbar);
g_signal_connect (toolitem, "clicked", g_signal_connect (toolitem, "clicked",
G_CALLBACK (tab_panel_toolitem_clicked_cb), view); G_CALLBACK (tab_panel_toolitem_clicked_cb), view);
g_signal_connect (gtk_bin_get_child (GTK_BIN (toolitem)), "button-press-event", g_signal_connect (gtk_bin_get_child (GTK_BIN (toolitem)), "button-press-event",
@ -444,7 +461,6 @@ tab_panel_browser_add_tab_cb (MidoriBrowser* browser,
} }
g_object_unref (notebook); g_object_unref (notebook);
g_object_unref (settings);
} }
static void static void
@ -609,6 +625,7 @@ extension_init (void)
{ {
{ STOCK_TAB_PANEL, N_("T_ab Panel"), 0, 0, NULL }, { STOCK_TAB_PANEL, N_("T_ab Panel"), 0, 0, NULL },
}; };
MidoriExtension* extension;
factory = gtk_icon_factory_new (); factory = gtk_icon_factory_new ();
gtk_stock_add (items, G_N_ELEMENTS (items)); gtk_stock_add (items, G_N_ELEMENTS (items));
@ -622,7 +639,7 @@ extension_init (void)
gtk_icon_factory_add_default (factory); gtk_icon_factory_add_default (factory);
g_object_unref (factory); g_object_unref (factory);
MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION, extension = g_object_new (MIDORI_TYPE_EXTENSION,
"name", _("Tab Panel"), "name", _("Tab Panel"),
"description", _("Show tabs in a vertical panel"), "description", _("Show tabs in a vertical panel"),
"version", "0.1", "version", "0.1",

View file

@ -119,9 +119,8 @@ static GSList *tb_editor_parse_active_items(MidoriBrowser *browser)
GSList *list = NULL; GSList *list = NULL;
MidoriWebSettings *settings; MidoriWebSettings *settings;
settings = katze_object_get_object(browser, "settings"); settings = midori_browser_get_settings(browser);
g_object_get(settings, "toolbar-items", &items, NULL); g_object_get(settings, "toolbar-items", &items, NULL);
g_object_unref(settings);
names = g_strsplit(items ? items : "", ",", 0); names = g_strsplit(items ? items : "", ",", 0);
list = tb_editor_array_to_list((const gchar **) names); list = tb_editor_array_to_list((const gchar **) names);
@ -356,9 +355,8 @@ static void tb_editor_update_toolbar(TBEditorWidget *tbw)
gtk_tree_model_foreach(GTK_TREE_MODEL(tbw->store_used), tb_editor_foreach_used, str); gtk_tree_model_foreach(GTK_TREE_MODEL(tbw->store_used), tb_editor_foreach_used, str);
settings = katze_object_get_object(tbw->browser, "settings"); settings = midori_browser_get_settings(tbw->browser);
g_object_set(settings, "toolbar-items", str->str, NULL); g_object_set(settings, "toolbar-items", str->str, NULL);
g_object_unref(settings);
g_string_free(str, TRUE); g_string_free(str, TRUE);
} }

View file

@ -1,5 +1,5 @@
/* /*
Copyright (C) 2008-2010 Christian Dywan <christian@twotoasts.de> Copyright (C) 2008-2011 Christian Dywan <christian@twotoasts.de>
This library is free software; you can redistribute it and/or This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public modify it under the terms of the GNU Lesser General Public
@ -50,6 +50,9 @@ struct _KatzeArrayClass
gint index); gint index);
void void
(*clear) (KatzeArray* array); (*clear) (KatzeArray* array);
void
(*update) (KatzeArray* array);
}; };
G_DEFINE_TYPE (KatzeArray, katze_array, KATZE_TYPE_ITEM); G_DEFINE_TYPE (KatzeArray, katze_array, KATZE_TYPE_ITEM);
@ -59,6 +62,7 @@ enum {
REMOVE_ITEM, REMOVE_ITEM,
MOVE_ITEM, MOVE_ITEM,
CLEAR, CLEAR,
UPDATE,
LAST_SIGNAL LAST_SIGNAL
}; };
@ -74,15 +78,10 @@ static void
_katze_array_add_item (KatzeArray* array, _katze_array_add_item (KatzeArray* array,
gpointer item) gpointer item)
{ {
if (katze_array_is_a (array, G_TYPE_OBJECT))
{
GType type = G_OBJECT_TYPE (item); GType type = G_OBJECT_TYPE (item);
/* g_return_if_fail (katze_array_is_a (array, type)); */
g_object_ref (item); g_object_ref (item);
if (g_type_is_a (type, KATZE_TYPE_ITEM)) if (g_type_is_a (type, KATZE_TYPE_ITEM))
katze_item_set_parent (item, array); katze_item_set_parent (item, array);
}
array->items = g_list_append (array->items, item); array->items = g_list_append (array->items, item);
} }
@ -93,12 +92,9 @@ _katze_array_remove_item (KatzeArray* array,
{ {
array->items = g_list_remove (array->items, item); array->items = g_list_remove (array->items, item);
if (katze_array_is_a (array, G_TYPE_OBJECT))
{
if (KATZE_IS_ITEM (item)) if (KATZE_IS_ITEM (item))
katze_item_set_parent (item, NULL); katze_item_set_parent (item, NULL);
g_object_unref (item); g_object_unref (item);
}
} }
static void static void
@ -183,6 +179,25 @@ katze_array_class_init (KatzeArrayClass* class)
g_cclosure_marshal_VOID__VOID, g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
/**
* KatzeArray::update:
* @array: the object on which the signal is emitted
*
* The array changed and any display widgets should
* be updated.
*
* Since: 0.3.0
**/
signals[UPDATE] = g_signal_new (
"update",
G_TYPE_FROM_CLASS (class),
(GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
0,
0,
NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
gobject_class = G_OBJECT_CLASS (class); gobject_class = G_OBJECT_CLASS (class);
gobject_class->finalize = katze_array_finalize; gobject_class->finalize = katze_array_finalize;
@ -195,7 +210,7 @@ katze_array_class_init (KatzeArrayClass* class)
static void static void
katze_array_init (KatzeArray* array) katze_array_init (KatzeArray* array)
{ {
array->type = G_TYPE_NONE; array->type = G_TYPE_OBJECT;
array->items = NULL; array->items = NULL;
} }
@ -204,16 +219,12 @@ katze_array_finalize (GObject* object)
{ {
KatzeArray* array; KatzeArray* array;
guint i; guint i;
gpointer item;
array = KATZE_ARRAY (object); array = KATZE_ARRAY (object);
if (katze_array_is_a (array, G_TYPE_OBJECT))
{
gpointer item;
i = 0; i = 0;
while ((item = g_list_nth_data (array->items, i++))) while ((item = g_list_nth_data (array->items, i++)))
g_object_unref (item); g_object_unref (item);
}
g_list_free (array->items); g_list_free (array->items);
G_OBJECT_CLASS (katze_array_parent_class)->finalize (object); G_OBJECT_CLASS (katze_array_parent_class)->finalize (object);
@ -225,8 +236,6 @@ katze_array_finalize (GObject* object)
* *
* Creates a new #KatzeArray for @type items. * Creates a new #KatzeArray for @type items.
* *
* You may only add items of the given type or inherited
* from it to this array *if* @type is an #GObject type.
* The array will keep a reference on each object until * The array will keep a reference on each object until
* it is removed from the array. * it is removed from the array.
* *
@ -235,14 +244,17 @@ katze_array_finalize (GObject* object)
KatzeArray* KatzeArray*
katze_array_new (GType type) katze_array_new (GType type)
{ {
KatzeArray* array = g_object_new (KATZE_TYPE_ARRAY, NULL); KatzeArray* array;
g_return_val_if_fail (g_type_is_a (type, G_TYPE_OBJECT), NULL);
array = g_object_new (KATZE_TYPE_ARRAY, NULL);
array->type = type; array->type = type;
return array; return array;
} }
/** /**
*
* katze_array_is_a: * katze_array_is_a:
* @array: a #KatzeArray * @array: a #KatzeArray
* @is_a_type: type to compare with * @is_a_type: type to compare with
@ -371,9 +383,6 @@ katze_array_find_token (KatzeArray* array,
guint i; guint i;
gpointer item; gpointer item;
if (!katze_array_is_a (array, G_TYPE_OBJECT))
return NULL;
i = 0; i = 0;
while ((item = g_list_nth_data (array->items, i++))) while ((item = g_list_nth_data (array->items, i++)))
{ {
@ -410,9 +419,6 @@ katze_array_find_uri (KatzeArray* array,
guint i; guint i;
gpointer item; gpointer item;
if (!katze_array_is_a (array, G_TYPE_OBJECT))
return NULL;
i = 0; i = 0;
while ((item = g_list_nth_data (array->items, i++))) while ((item = g_list_nth_data (array->items, i++)))
{ {
@ -502,3 +508,20 @@ katze_array_clear (KatzeArray* array)
g_signal_emit (array, signals[CLEAR], 0); g_signal_emit (array, signals[CLEAR], 0);
} }
/**
* katze_array_update:
* @array: a #KatzeArray
*
* Indicates that the array changed and any display
* widgets should be updated.
*
* Since: 0.3.0
**/
void
katze_array_update (KatzeArray* array)
{
g_return_if_fail (KATZE_IS_ARRAY (array));
g_signal_emit (array, signals[UPDATE], 0);
}

View file

@ -84,6 +84,15 @@ GList*
katze_array_peek_items (KatzeArray* array); katze_array_peek_items (KatzeArray* array);
extern GList* kalistglobal; extern GList* kalistglobal;
/* KATZE_ARRAY_FOREACH_ITEM:
* @item: a #KatzeItem variable
* @array: a #KatzeArray to loop through
*
* Loops through all items of the array. The macro can
* be used like a for() loop.
* If the array is modified during the loop, you must
* use KATZE_ARRAY_FOREACH_ITEM_L instead.
* */
#define KATZE_ARRAY_FOREACH_ITEM(kaitem, kaarray) \ #define KATZE_ARRAY_FOREACH_ITEM(kaitem, kaarray) \
for (kalistglobal = katze_array_peek_items (kaarray), \ for (kalistglobal = katze_array_peek_items (kaarray), \
kaitem = kalistglobal ? kalistglobal->data : NULL; \ kaitem = kalistglobal ? kalistglobal->data : NULL; \
@ -91,9 +100,28 @@ extern GList* kalistglobal;
kalistglobal = g_list_next (kalistglobal), \ kalistglobal = g_list_next (kalistglobal), \
kaitem = kalistglobal ? kalistglobal->data : NULL) kaitem = kalistglobal ? kalistglobal->data : NULL)
/* KATZE_ARRAY_FOREACH_ITEM_L:
* @item: a #KatzeItem variable
* @array: a #KatzeArray to loop through
* @list: a #GList variable
*
* Loops through all items of the array. The list must be freed.
*
* Since: 0.3.0
* */
#define KATZE_ARRAY_FOREACH_ITEM_L(kaitem, kaarray, kalist) \
for (kalist = katze_array_get_items (kaarray), \
kaitem = kalist ? kalist->data : NULL; \
kalist != NULL; \
kalist = g_list_next (kalist), \
kaitem = kalist ? kalist->data : NULL)
void void
katze_array_clear (KatzeArray* array); katze_array_clear (KatzeArray* array);
void
katze_array_update (KatzeArray* array);
G_END_DECLS G_END_DECLS
#endif /* __KATZE_ARRAY_H__ */ #endif /* __KATZE_ARRAY_H__ */

View file

@ -89,6 +89,10 @@ static void
katze_array_action_disconnect_proxy (GtkAction* action, katze_array_action_disconnect_proxy (GtkAction* action,
GtkWidget* proxy); GtkWidget* proxy);
static void
katze_array_action_proxy_clicked_cb (GtkWidget* proxy,
KatzeArrayAction* array_action);
static void static void
katze_array_action_class_init (KatzeArrayActionClass* class) katze_array_action_class_init (KatzeArrayActionClass* class)
{ {
@ -277,19 +281,6 @@ katze_array_action_get_property (GObject* object,
static void static void
katze_array_action_activate (GtkAction* action) katze_array_action_activate (GtkAction* action)
{ {
GSList* proxies;
proxies = gtk_action_get_proxies (action);
if (!proxies)
return;
do
if (GTK_IS_TOOL_ITEM (proxies->data))
{
}
while ((proxies = g_slist_next (proxies)));
if (GTK_ACTION_CLASS (katze_array_action_parent_class)->activate) if (GTK_ACTION_CLASS (katze_array_action_parent_class)->activate)
GTK_ACTION_CLASS (katze_array_action_parent_class)->activate (action); GTK_ACTION_CLASS (katze_array_action_parent_class)->activate (action);
} }
@ -449,6 +440,18 @@ katze_array_action_menu_item_select_cb (GtkWidget* proxy,
g_signal_emit (array_action, signals[POPULATE_FOLDER], 0, menu, array, &handled); g_signal_emit (array_action, signals[POPULATE_FOLDER], 0, menu, array, &handled);
} }
static void
katze_array_action_menu_deactivate_cb (GtkWidget* menu,
GtkWidget* proxy)
{
void* array_action = g_object_get_data (G_OBJECT (menu), "KatzeArrayAction");
g_signal_handlers_block_by_func (proxy,
katze_array_action_proxy_clicked_cb, array_action);
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (proxy), FALSE);
g_signal_handlers_unblock_by_func (proxy,
katze_array_action_proxy_clicked_cb, array_action);
}
static void static void
katze_array_action_proxy_clicked_cb (GtkWidget* proxy, katze_array_action_proxy_clicked_cb (GtkWidget* proxy,
KatzeArrayAction* array_action) KatzeArrayAction* array_action)
@ -478,6 +481,7 @@ katze_array_action_proxy_clicked_cb (GtkWidget* proxy,
} }
menu = gtk_menu_new (); menu = gtk_menu_new ();
gtk_menu_attach_to_widget (GTK_MENU (menu), proxy, NULL);
if (!array) if (!array)
array = array_action->array; array = array_action->array;
@ -499,6 +503,10 @@ katze_array_action_proxy_clicked_cb (GtkWidget* proxy,
katze_widget_popup (GTK_WIDGET (proxy), GTK_MENU (menu), katze_widget_popup (GTK_WIDGET (proxy), GTK_MENU (menu),
NULL, KATZE_MENU_POSITION_LEFT); NULL, KATZE_MENU_POSITION_LEFT);
#endif #endif
gtk_menu_shell_select_first (GTK_MENU_SHELL (menu), TRUE);
g_object_set_data (G_OBJECT (menu), "KatzeArrayAction", array_action);
g_signal_connect (menu, "deactivate",
G_CALLBACK (katze_array_action_menu_deactivate_cb), proxy);
} }
static GtkWidget* static GtkWidget*
@ -515,7 +523,7 @@ katze_array_action_create_tool_item (GtkAction* action)
{ {
GtkWidget* toolitem; GtkWidget* toolitem;
toolitem = GTK_WIDGET (gtk_tool_button_new (NULL, "")); toolitem = GTK_WIDGET (gtk_toggle_tool_button_new ());
return toolitem; return toolitem;
} }
@ -684,14 +692,19 @@ katze_array_action_create_tool_item_for (KatzeArrayAction* array_action,
if (KATZE_ITEM_IS_SEPARATOR (item)) if (KATZE_ITEM_IS_SEPARATOR (item))
return gtk_separator_tool_item_new (); return gtk_separator_tool_item_new ();
toolitem = gtk_tool_button_new (NULL, "");
g_signal_connect (toolitem, "create-menu-proxy",
G_CALLBACK (katze_array_action_proxy_create_menu_proxy_cb), item);
if (KATZE_ITEM_IS_FOLDER (item)) if (KATZE_ITEM_IS_FOLDER (item))
{
toolitem = gtk_toggle_tool_button_new ();
icon = gtk_widget_render_icon (GTK_WIDGET (toolitem), icon = gtk_widget_render_icon (GTK_WIDGET (toolitem),
GTK_STOCK_DIRECTORY, GTK_ICON_SIZE_MENU, NULL); GTK_STOCK_DIRECTORY, GTK_ICON_SIZE_MENU, NULL);
}
else else
{
toolitem = gtk_tool_button_new (NULL, "");
icon = katze_load_cached_icon (uri, GTK_WIDGET (toolitem)); icon = katze_load_cached_icon (uri, GTK_WIDGET (toolitem));
}
g_signal_connect (toolitem, "create-menu-proxy",
G_CALLBACK (katze_array_action_proxy_create_menu_proxy_cb), item);
image = gtk_image_new_from_pixbuf (icon); image = gtk_image_new_from_pixbuf (icon);
g_object_unref (icon); g_object_unref (icon);
gtk_widget_show (image); gtk_widget_show (image);

View file

@ -856,6 +856,7 @@ katze_throbber_expose_event (GtkWidget* widget,
GdkEventExpose* event) GdkEventExpose* event)
{ {
KatzeThrobber* throbber = KATZE_THROBBER (widget); KatzeThrobber* throbber = KATZE_THROBBER (widget);
gint ax, ay;
if (G_UNLIKELY (!throbber->width || !throbber->height)) if (G_UNLIKELY (!throbber->width || !throbber->height))
return TRUE; return TRUE;
@ -867,7 +868,6 @@ katze_throbber_expose_event (GtkWidget* widget,
if (!throbber->animated && (throbber->static_pixbuf if (!throbber->animated && (throbber->static_pixbuf
|| throbber->static_icon_name || throbber->static_stock_id)) || throbber->static_icon_name || throbber->static_stock_id))
{ {
gint ax, ay;
cairo_t* cr; cairo_t* cr;
if (G_UNLIKELY (!throbber->static_pixbuf && throbber->static_icon_name)) if (G_UNLIKELY (!throbber->static_pixbuf && throbber->static_icon_name))

View file

@ -134,7 +134,6 @@ settings_and_accels_new (const gchar* config,
GEnumClass* enum_class = G_ENUM_CLASS ( GEnumClass* enum_class = G_ENUM_CLASS (
g_type_class_peek (pspec->value_type)); g_type_class_peek (pspec->value_type));
GEnumValue* enum_value; GEnumValue* enum_value;
str = g_key_file_get_string (key_file, "settings", property, NULL); str = g_key_file_get_string (key_file, "settings", property, NULL);
enum_value = g_enum_get_value_by_name (enum_class, str); enum_value = g_enum_get_value_by_name (enum_class, str);
if (enum_value) if (enum_value)
@ -142,9 +141,7 @@ settings_and_accels_new (const gchar* config,
else else
g_warning (_("Value '%s' is invalid for %s"), g_warning (_("Value '%s' is invalid for %s"),
str, property); str, property);
g_free (str); g_free (str);
g_type_class_unref (enum_class);
} }
else else
g_warning (_("Invalid configuration value '%s'"), property); g_warning (_("Invalid configuration value '%s'"), property);
@ -230,7 +227,7 @@ settings_save_to_file (MidoriWebSettings* settings,
else if (type == G_TYPE_PARAM_ENUM) else if (type == G_TYPE_PARAM_ENUM)
{ {
GEnumClass* enum_class = G_ENUM_CLASS ( GEnumClass* enum_class = G_ENUM_CLASS (
g_type_class_ref (pspec->value_type)); g_type_class_peek (pspec->value_type));
gint integer; gint integer;
GEnumValue* enum_value; GEnumValue* enum_value;
g_object_get (settings, property, &integer, NULL); g_object_get (settings, property, &integer, NULL);
@ -391,7 +388,20 @@ search_engines_save_to_file (KatzeArray* search_engines,
return saved; return saved;
} }
static sqlite3* static void
midori_history_clear_cb (KatzeArray* array,
sqlite3* db)
{
char* errmsg = NULL;
if (sqlite3_exec (db, "DELETE FROM history; DELETE FROM search",
NULL, NULL, &errmsg) != SQLITE_OK)
{
g_printerr (_("Failed to clear history: %s\n"), errmsg);
sqlite3_free (errmsg);
}
}
static gboolean
midori_history_initialize (KatzeArray* array, midori_history_initialize (KatzeArray* array,
const gchar* filename, const gchar* filename,
const gchar* bookmarks_filename, const gchar* bookmarks_filename,
@ -411,7 +421,7 @@ midori_history_initialize (KatzeArray* array,
*errmsg = g_strdup_printf (_("Failed to open database: %s\n"), *errmsg = g_strdup_printf (_("Failed to open database: %s\n"),
sqlite3_errmsg (db)); sqlite3_errmsg (db));
sqlite3_close (db); sqlite3_close (db);
return NULL; return FALSE;
} }
sqlite3_exec (db, "PRAGMA journal_mode = TRUNCATE;", NULL, NULL, errmsg); sqlite3_exec (db, "PRAGMA journal_mode = TRUNCATE;", NULL, NULL, errmsg);
@ -426,7 +436,7 @@ midori_history_initialize (KatzeArray* array,
"CREATE TABLE IF NOT EXISTS " "CREATE TABLE IF NOT EXISTS "
"search (keywords text, uri text, day integer);", "search (keywords text, uri text, day integer);",
NULL, NULL, errmsg) != SQLITE_OK) NULL, NULL, errmsg) != SQLITE_OK)
return NULL; return FALSE;
sqlite3_prepare_v2 (db, "SELECT day FROM history LIMIT 1", -1, &stmt, NULL); sqlite3_prepare_v2 (db, "SELECT day FROM history LIMIT 1", -1, &stmt, NULL);
result = sqlite3_step (stmt); result = sqlite3_step (stmt);
@ -452,18 +462,20 @@ midori_history_initialize (KatzeArray* array,
sql = g_strdup_printf ("ATTACH DATABASE '%s' AS bookmarks", bookmarks_filename); sql = g_strdup_printf ("ATTACH DATABASE '%s' AS bookmarks", bookmarks_filename);
sqlite3_exec (db, sql, NULL, NULL, errmsg); sqlite3_exec (db, sql, NULL, NULL, errmsg);
g_free (sql); g_free (sql);
g_object_set_data (G_OBJECT (array), "db", db);
g_signal_connect (array, "clear",
G_CALLBACK (midori_history_clear_cb), db);
return db; return TRUE;
} }
static void static void
midori_history_terminate (sqlite3* db, midori_history_terminate (KatzeArray* array,
gint max_history_age) gint max_history_age)
{ {
gchar* sqlcmd; sqlite3* db = g_object_get_data (G_OBJECT (array), "db");
char* errmsg = NULL; char* errmsg = NULL;
gchar* sqlcmd = g_strdup_printf (
sqlcmd = g_strdup_printf (
"DELETE FROM history WHERE " "DELETE FROM history WHERE "
"(julianday(date('now')) - julianday(date(date,'unixepoch')))" "(julianday(date('now')) - julianday(date(date,'unixepoch')))"
" >= %d", max_history_age); " >= %d", max_history_age);
@ -477,6 +489,15 @@ midori_history_terminate (sqlite3* db,
sqlite3_close (db); sqlite3_close (db);
} }
static void
midori_bookmarks_add_item_cb (KatzeArray* array,
KatzeItem* item,
sqlite3* db)
{
midori_bookmarks_insert_item_db (db, item,
katze_item_get_meta_string (item, "folder"));
}
static void static void
midori_bookmarks_remove_item_cb (KatzeArray* array, midori_bookmarks_remove_item_cb (KatzeArray* array,
KatzeItem* item, KatzeItem* item,
@ -530,6 +551,8 @@ midori_bookmarks_initialize (KatzeArray* array,
"desc text, app integer, toolbar integer);", "desc text, app integer, toolbar integer);",
NULL, NULL, errmsg) != SQLITE_OK) NULL, NULL, errmsg) != SQLITE_OK)
return NULL; return NULL;
g_signal_connect (array, "add-item",
G_CALLBACK (midori_bookmarks_add_item_cb), db);
g_signal_connect (array, "remove-item", g_signal_connect (array, "remove-item",
G_CALLBACK (midori_bookmarks_remove_item_cb), db); G_CALLBACK (midori_bookmarks_remove_item_cb), db);
return db; return db;
@ -863,6 +886,7 @@ midori_soup_session_prepare (SoupSession* session,
{ {
"/etc/pki/tls/certs/ca-bundle.crt", "/etc/pki/tls/certs/ca-bundle.crt",
"/etc/ssl/certs/ca-certificates.crt", "/etc/ssl/certs/ca-certificates.crt",
"/usr/local/share/certs/ca-root-nss.crt",
NULL NULL
}; };
guint i; guint i;
@ -1047,53 +1071,6 @@ midori_load_cookie_jar (gpointer data)
return FALSE; return FALSE;
} }
static gboolean
midori_load_netscape_plugins (gpointer data)
{
MidoriApp* app = MIDORI_APP (data);
KatzeArray* extensions = katze_object_get_object (app, "extensions");
/* FIXME: WebKit should have API to obtain the list of plugins. */
/* FIXME: Monitor folders for newly added and removes files */
GtkWidget* web_view = webkit_web_view_new ();
WebKitWebFrame* web_frame = webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (web_view));
JSContextRef js_context = webkit_web_frame_get_global_context (web_frame);
/* This snippet joins the available plugins into a string like this:
URI1|title1,URI2|title2
FIXME: Ensure separators contained in the string can't break it */
gchar* value = sokoke_js_script_eval (js_context,
"function plugins (l) { var f = new Array (); for (i in l) "
"{ var p = l[i].name + '|' + l[i].filename; "
"if (f.indexOf (p) == -1) f.push (p); } return f; }"
"plugins (navigator.plugins)", NULL);
gchar** items = g_strsplit (value, ",", 0);
guint i = 0;
if (items != NULL)
while (items[i] != NULL)
{
gchar** parts = g_strsplit (items[i], "|", 2);
if (parts && *parts && !g_str_equal (parts[1], "undefined"))
{
MidoriExtension* extension;
gchar* desc = parts[1];
gsize j = 0;
while (desc[j++])
if (desc[j-1] == ';')
desc[j-1] = '\n';
extension = g_object_new (MIDORI_TYPE_EXTENSION,
"name", parts[0], "description", desc, NULL);
g_object_set_data (G_OBJECT (extension), "static", (void*)0xdeadbeef);
katze_array_add_item (extensions, extension);
}
g_strfreev (parts);
i++;
}
g_strfreev (items);
g_object_unref (extensions);
return FALSE;
}
static gboolean static gboolean
midori_load_extensions (gpointer data) midori_load_extensions (gpointer data)
{ {
@ -1197,9 +1174,6 @@ midori_load_extensions (gpointer data)
} }
g_strfreev (active_extensions); g_strfreev (active_extensions);
if (g_getenv ("MIDORI_UNARMED") == NULL)
g_idle_add (midori_load_netscape_plugins, app);
#ifdef G_ENABLE_DEBUG #ifdef G_ENABLE_DEBUG
if (startup_timer) if (startup_timer)
g_debug ("Extensions:\t%f", g_test_timer_elapsed ()); g_debug ("Extensions:\t%f", g_test_timer_elapsed ());
@ -1302,11 +1276,12 @@ midori_load_session (gpointer data)
midori_browser_add_item (browser, item); midori_browser_add_item (browser, item);
} }
current = katze_item_get_meta_integer (KATZE_ITEM (_session), "current"); current = katze_item_get_meta_integer (KATZE_ITEM (_session), "current");
if (current < 0)
current = 0;
midori_browser_set_current_page (browser, current);
if (!(item = katze_array_get_nth_item (_session, current))) if (!(item = katze_array_get_nth_item (_session, current)))
{
current = 0;
item = katze_array_get_nth_item (_session, 0); item = katze_array_get_nth_item (_session, 0);
}
midori_browser_set_current_page (browser, current);
if (!g_strcmp0 (katze_item_get_uri (item), "")) if (!g_strcmp0 (katze_item_get_uri (item), ""))
midori_browser_activate_action (browser, "Location"); midori_browser_activate_action (browser, "Location");
@ -1407,6 +1382,8 @@ midori_web_app_browser_notify_load_status_cb (MidoriBrowser* browser,
{ {
GtkWidget* view = midori_browser_get_current_tab (browser); GtkWidget* view = midori_browser_get_current_tab (browser);
GdkPixbuf* icon = midori_view_get_icon (MIDORI_VIEW (view)); GdkPixbuf* icon = midori_view_get_icon (MIDORI_VIEW (view));
if (midori_view_is_blank (MIDORI_VIEW (view)))
icon = NULL;
gtk_window_set_icon (GTK_WINDOW (browser), icon); gtk_window_set_icon (GTK_WINDOW (browser), icon);
} }
} }
@ -1514,7 +1491,6 @@ midori_inactivity_timeout (gpointer data)
guint i = 0; guint i = 0;
GtkWidget* view; GtkWidget* view;
KatzeArray* history = katze_object_get_object (mit->browser, "history"); KatzeArray* history = katze_object_get_object (mit->browser, "history");
sqlite3* db;
KatzeArray* trash = katze_object_get_object (mit->browser, "trash"); KatzeArray* trash = katze_object_get_object (mit->browser, "trash");
GList* data_items = sokoke_register_privacy_item (NULL, NULL, NULL); GList* data_items = sokoke_register_privacy_item (NULL, NULL, NULL);
@ -1522,9 +1498,8 @@ midori_inactivity_timeout (gpointer data)
gtk_widget_destroy (view); gtk_widget_destroy (view);
midori_browser_set_current_uri (mit->browser, mit->uri); midori_browser_set_current_uri (mit->browser, mit->uri);
/* Clear all private data */ /* Clear all private data */
if (history && (db = g_object_get_data (G_OBJECT (history), "db"))) if (history != NULL)
sqlite3_exec (db, "DELETE FROM history; DELETE FROM search", katze_array_clear (history);
NULL, NULL, NULL);
if (trash != NULL) if (trash != NULL)
katze_array_clear (trash); katze_array_clear (trash);
for (; data_items != NULL; data_items = g_list_next (data_items)) for (; data_items != NULL; data_items = g_list_next (data_items))
@ -1858,7 +1833,7 @@ main (int argc,
} }
else else
{ {
settings = katze_object_get_object (browser, "settings"); settings = g_object_ref (midori_browser_get_settings (browser));
g_object_set (settings, g_object_set (settings,
"show-menubar", FALSE, "show-menubar", FALSE,
"show-navigationbar", FALSE, "show-navigationbar", FALSE,
@ -2008,7 +1983,7 @@ main (int argc,
if (g_access (old_bookmarks, F_OK) == 0) if (g_access (old_bookmarks, F_OK) == 0)
{ {
midori_bookmarks_import (old_bookmarks, db); midori_bookmarks_import (old_bookmarks, db);
g_unlink(old_bookmarks); /* Leave old bookmarks around */
} }
g_free (old_bookmarks); g_free (old_bookmarks);
g_object_set_data (G_OBJECT (bookmarks), "db", db); g_object_set_data (G_OBJECT (bookmarks), "db", db);
@ -2052,14 +2027,13 @@ main (int argc,
katze_assign (config_file, g_build_filename (config, "history.db", NULL)); katze_assign (config_file, g_build_filename (config, "history.db", NULL));
errmsg = NULL; errmsg = NULL;
if ((db = midori_history_initialize (history, config_file, bookmarks_file ,&errmsg)) == NULL) if (!midori_history_initialize (history, config_file, bookmarks_file, &errmsg))
{ {
g_string_append_printf (error_messages, g_string_append_printf (error_messages,
_("The history couldn't be loaded: %s\n"), errmsg); _("The history couldn't be loaded: %s\n"), errmsg);
g_free (errmsg); g_free (errmsg);
} }
g_free (bookmarks_file); g_free (bookmarks_file);
g_object_set_data (G_OBJECT (history), "db", db);
midori_startup_timer ("History read: \t%f"); midori_startup_timer ("History read: \t%f");
/* In case of errors */ /* In case of errors */
@ -2203,7 +2177,7 @@ main (int argc,
settings = katze_object_get_object (app, "settings"); settings = katze_object_get_object (app, "settings");
g_object_get (settings, "maximum-history-age", &max_history_age, NULL); g_object_get (settings, "maximum-history-age", &max_history_age, NULL);
midori_history_terminate (db, max_history_age); midori_history_terminate (history, max_history_age);
/* Removing KatzeHttpCookies makes it save outstanding changes */ /* Removing KatzeHttpCookies makes it save outstanding changes */
soup_session_remove_feature_by_type (webkit_get_default_session (), soup_session_remove_feature_by_type (webkit_get_default_session (),
KATZE_TYPE_HTTP_COOKIES); KATZE_TYPE_HTTP_COOKIES);

View file

@ -42,6 +42,9 @@
#if HAVE_LIBNOTIFY #if HAVE_LIBNOTIFY
#include <libnotify/notify.h> #include <libnotify/notify.h>
#ifndef NOTIFY_CHECK_VERSION
#define NOTIFY_CHECK_VERSION(x,y,z) 0
#endif
#endif #endif
struct _MidoriApp struct _MidoriApp
@ -1203,8 +1206,11 @@ midori_app_send_notification (MidoriApp* app,
if (notify_is_initted ()) if (notify_is_initted ())
{ {
NotifyNotification* note; NotifyNotification* note;
#if NOTIFY_CHECK_VERSION (0, 7, 0)
note = notify_notification_new (title, message, "midori");
#else
note = notify_notification_new (title, message, "midori", NULL); note = notify_notification_new (title, message, "midori", NULL);
#endif
notify_notification_show (note, NULL); notify_notification_show (note, NULL);
g_object_unref (note); g_object_unref (note);
} }

View file

@ -294,18 +294,93 @@ katze_array_from_xmlDocPtr (KatzeArray* array,
} }
static gboolean static gboolean
katze_array_from_opera_file (KatzeArray* array, katze_array_from_netscape_file (KatzeArray* array,
FILE* file) const gchar* filename)
{ {
gchar line[200]; gchar* line = NULL;
gchar* partial_line = NULL; GIOChannel* channel = g_io_channel_new_file (filename, "r", 0);
KatzeArray* folder = array; KatzeArray* folder = array;
KatzeItem* item = NULL; KatzeItem* item = NULL;
while (fgets (line, 200, file)) if (!channel)
return FALSE;
while (g_io_channel_read_line (channel, &line, NULL, NULL, NULL)
== G_IO_STATUS_NORMAL)
{ {
gboolean incomplete_line = (strlen (line) == 199);
g_strstrip (line); g_strstrip (line);
/* parse lines with bookmarks data only, skip the rest */
if (!strncmp (line, "<D", 2) || !strncmp (line, "</D", 3))
{
gchar** element = g_strsplit_set (line, "<>", -1);
/* current item */
if (katze_str_equal (element[1], "DT"))
{
/* item is bookmark */
if (!strncmp (element[3], "A HREF", 6))
{
gchar** parts = g_strsplit (line, "\"", -1);
item = katze_item_new ();
katze_array_add_item (folder, item);
item->name = g_strdup (element[4]);
item->uri = g_strdup (parts[1]);
g_strfreev (parts);
}
/* item is folder */
if (!strncmp (element[3], "H3", 2))
{
item = (KatzeItem*)katze_array_new (KATZE_TYPE_ARRAY);
katze_array_add_item (folder, item);
folder = (KatzeArray*)item;
item->name = g_strdup (element[4]);
}
}
/* item description */
if (item && katze_str_equal (element[1], "DD"))
{
if (element[2])
item->text = g_strdup (element[2]);
item = NULL;
}
/* end of current folder, level-up */
if (katze_str_equal (element[1], "/DL"))
{
if (folder != array)
folder = katze_item_get_parent ((KatzeItem*)folder);
continue;
}
g_strfreev (element);
}
continue;
}
g_io_channel_shutdown (channel, FALSE, 0);
g_io_channel_unref (channel);
return TRUE;
}
static gboolean
katze_array_from_opera_file (KatzeArray* array,
const gchar* filename)
{
gchar* line = NULL;
GIOChannel* channel = g_io_channel_new_file (filename, "r", 0);
KatzeArray* folder = array;
KatzeItem* item = NULL;
if (!channel)
return FALSE;
while (g_io_channel_read_line (channel, &line, NULL, NULL, NULL)
== G_IO_STATUS_NORMAL)
{
g_strstrip (line);
/* skip file header */
if (katze_str_equal (line, "Options: encoding = utf8, version=3")
|| katze_str_equal (line, "Opera Hotlist version 2.0"))
{
item = NULL;
continue;
}
if (line[0] == '\0') if (line[0] == '\0')
{ {
item = NULL; item = NULL;
@ -340,30 +415,7 @@ katze_array_from_opera_file (KatzeArray* array,
} }
else if (item) else if (item)
{ {
gchar** parts; gchar** parts = g_strsplit (line, "=", 2);
/* Handle lines longer than 200 characters */
if (incomplete_line)
{
if (partial_line)
{
gchar* chunk = g_strconcat (partial_line, line, NULL);
katze_assign (partial_line, chunk);
}
else
partial_line = g_strdup (line);
continue;
}
if (partial_line)
{
gchar* full_line = g_strconcat (partial_line, line, NULL);
katze_assign (partial_line, NULL);
parts = g_strsplit (full_line, "=", 2);
g_free (full_line);
}
else
parts = g_strsplit (line, "=", 2);
if (parts && parts[0] && parts[1]) if (parts && parts[0] && parts[1])
{ {
@ -392,6 +444,8 @@ katze_array_from_opera_file (KatzeArray* array,
else else
g_warning ("Unexpected property outside of element: %s", line); g_warning ("Unexpected property outside of element: %s", line);
} }
g_io_channel_shutdown (channel, FALSE, 0);
g_io_channel_unref (channel);
return TRUE; return TRUE;
} }
@ -433,6 +487,36 @@ midori_array_from_file (KatzeArray* array,
if (!format) if (!format)
format = ""; format = "";
/* netscape html */
if (!*format && g_str_has_suffix (filename, ".html"))
{
FILE* file;
if ((file = g_fopen (filename, "r")))
{
gchar line[50];
while (fgets (line, 50, file))
{
g_strstrip (line);
if (katze_str_equal (line, "<!DOCTYPE NETSCAPE-Bookmark-file-1>"))
{
if (!katze_array_from_netscape_file (array, filename))
{
/* Parsing failed */
fclose (file);
if (error)
*error = g_error_new_literal (G_FILE_ERROR,
G_FILE_ERROR_FAILED, _("Malformed document."));
return FALSE;
}
return TRUE;
}
else
break;
}
fclose (file);
}
}
/* Opera6 */ /* Opera6 */
if (katze_str_equal (format, "opera") if (katze_str_equal (format, "opera")
|| (!*format && g_str_has_suffix (filename, ".adr"))) || (!*format && g_str_has_suffix (filename, ".adr")))
@ -454,7 +538,7 @@ midori_array_from_file (KatzeArray* array,
verify++; verify++;
else if (verify == 2) else if (verify == 2)
{ {
if (!katze_array_from_opera_file (array, file)) if (!katze_array_from_opera_file (array, filename))
{ {
/* Parsing failed */ /* Parsing failed */
fclose (file); fclose (file);
@ -591,15 +675,17 @@ string_append_item (GString* string,
{ {
KatzeItem* _item; KatzeItem* _item;
KatzeArray* array = KATZE_ARRAY (item); KatzeArray* array = KATZE_ARRAY (item);
GList* list;
g_string_append (string, "<folder>\n"); g_string_append (string, "<folder>\n");
/* FIXME: " folded=\"no\" */ /* FIXME: " folded=\"no\" */
string_append_xml_element (string, "title", katze_item_get_name (item)); string_append_xml_element (string, "title", katze_item_get_name (item));
string_append_xml_element (string, "desc", katze_item_get_text (item)); string_append_xml_element (string, "desc", katze_item_get_text (item));
KATZE_ARRAY_FOREACH_ITEM (_item, array) KATZE_ARRAY_FOREACH_ITEM_L (_item, array, list)
string_append_item (string, _item); string_append_item (string, _item);
g_string_append (string, metadata); g_string_append (string, metadata);
g_string_append (string, "</folder>\n"); g_string_append (string, "</folder>\n");
g_list_free (list);
} }
else if (katze_item_get_uri (item)) else if (katze_item_get_uri (item))
{ {
@ -679,6 +765,7 @@ katze_array_to_xbel (KatzeArray* array,
{ {
gchar* metadata = katze_item_metadata_to_xbel (KATZE_ITEM (array)); gchar* metadata = katze_item_metadata_to_xbel (KATZE_ITEM (array));
KatzeItem* item; KatzeItem* item;
GList* list;
GString* markup = g_string_new ( GString* markup = g_string_new (
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
@ -691,11 +778,12 @@ katze_array_to_xbel (KatzeArray* array,
string_append_xml_element (markup, "title", katze_item_get_name (KATZE_ITEM (array))); string_append_xml_element (markup, "title", katze_item_get_name (KATZE_ITEM (array)));
string_append_xml_element (markup, "desc", katze_item_get_text (KATZE_ITEM (array))); string_append_xml_element (markup, "desc", katze_item_get_text (KATZE_ITEM (array)));
g_string_append (markup, metadata); g_string_append (markup, metadata);
KATZE_ARRAY_FOREACH_ITEM (item, array) KATZE_ARRAY_FOREACH_ITEM_L (item, array, list)
string_append_item (markup, item); string_append_item (markup, item);
g_string_append (markup, "</xbel>\n"); g_string_append (markup, "</xbel>\n");
g_free (metadata); g_free (metadata);
g_list_free (list);
return g_string_free (markup, FALSE); return g_string_free (markup, FALSE);
} }

View file

@ -178,11 +178,6 @@ midori_bookmarks_export_array_db (sqlite3* db,
KatzeArray* array, KatzeArray* array,
const gchar* folder); const gchar* folder);
void
midori_bookmarks_insert_item_db (sqlite3* db,
KatzeItem* item,
gchar* folder);
void void
midori_browser_open_bookmark (MidoriBrowser* browser, midori_browser_open_bookmark (MidoriBrowser* browser,
KatzeItem* item); KatzeItem* item);
@ -476,6 +471,7 @@ midori_browser_update_history_title (MidoriBrowser* browser,
g_return_if_fail (katze_item_get_uri (item) != NULL); g_return_if_fail (katze_item_get_uri (item) != NULL);
db = g_object_get_data (G_OBJECT (browser->history), "db"); db = g_object_get_data (G_OBJECT (browser->history), "db");
g_return_if_fail (db != NULL);
if (!stmt) if (!stmt)
{ {
const gchar* sqlcmd; const gchar* sqlcmd;
@ -909,8 +905,6 @@ midori_browser_edit_bookmark_dialog_new (MidoriBrowser* browser,
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
{ {
gchar* selected; gchar* selected;
GtkTreeView* treeview;
GtkTreeModel* model;
if (!new_bookmark) if (!new_bookmark)
katze_array_remove_item (browser->bookmarks, bookmark); katze_array_remove_item (browser->bookmarks, bookmark);
@ -930,23 +924,13 @@ midori_browser_edit_bookmark_dialog_new (MidoriBrowser* browser,
} }
selected = gtk_combo_box_get_active_text (GTK_COMBO_BOX (combo_folder)); selected = gtk_combo_box_get_active_text (GTK_COMBO_BOX (combo_folder));
if (!strcmp (selected, _("Toplevel folder"))) if (!strcmp (selected, _("Toplevel folder")))
selected = g_strdup (""); katze_assign (selected, g_strdup (""));
katze_item_set_meta_string (bookmark, "folder", selected);
midori_bookmarks_insert_item_db (db, bookmark, selected); katze_array_add_item (browser->bookmarks, bookmark);
if (new_bookmark)
{
treeview = g_object_get_data (G_OBJECT (browser->bookmarks), "treeview");
model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview));
gtk_tree_store_insert_with_values (GTK_TREE_STORE (model),
NULL, NULL, G_MAXINT, 0, bookmark, -1);
}
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_toolbar))) if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_toolbar)))
if (!gtk_widget_get_visible (browser->bookmarkbar) if (!gtk_widget_get_visible (browser->bookmarkbar))
&& browser->bookmarks != NULL)
_action_set_active (browser, "Bookmarkbar", TRUE); _action_set_active (browser, "Bookmarkbar", TRUE);
g_free (selected); g_free (selected);
return_status = TRUE; return_status = TRUE;
@ -2218,14 +2202,46 @@ static void
_action_add_desktop_shortcut_activate (GtkAction* action, _action_add_desktop_shortcut_activate (GtkAction* action,
MidoriBrowser* browser) MidoriBrowser* browser)
{ {
#if defined (GDK_WINDOWING_X11) #if HAVE_HILDON
/* TODO: Implement */ /* TODO: Implement */
#elif defined (GDK_WINDOWING_X11)
GtkWidget* tab = midori_browser_get_current_tab (browser);
KatzeItem* item = midori_view_get_proxy_item (MIDORI_VIEW (tab));
const gchar* app_name = katze_item_get_name (item);
gchar* app_exec = g_strconcat ("midori -a ", katze_item_get_uri (item), NULL);
const gchar* icon_uri = midori_view_get_icon_uri (MIDORI_VIEW (tab));
gchar* app_icon;
GKeyFile* keyfile = g_key_file_new ();
gchar* filename = g_strconcat (app_name, ".desktop", NULL);
gchar* app_dir;
int i = 0;
while (filename[i] != '\0')
{
if (filename[i] == '/')
filename[i] = '_';
i++;
}
app_dir = g_build_filename (g_get_user_data_dir (),
"applications", filename, NULL);
app_icon = katze_net_get_cached_path (NULL, icon_uri, "icons");
if (!g_file_test (app_icon, G_FILE_TEST_EXISTS))
katze_assign (app_icon, g_strdup (STOCK_WEB_BROWSER));
g_key_file_set_string (keyfile, "Desktop Entry", "Version", "1.0");
g_key_file_set_string (keyfile, "Desktop Entry", "Type", "Application");
g_key_file_set_string (keyfile, "Desktop Entry", "Name", app_name);
g_key_file_set_string (keyfile, "Desktop Entry", "Exec", app_exec);
g_key_file_set_string (keyfile, "Desktop Entry", "TryExec", "midori");
g_key_file_set_string (keyfile, "Desktop Entry", "Icon", app_icon);
g_key_file_set_string (keyfile, "Desktop Entry", "Categories", "Network;");
sokoke_key_file_save_to_file (keyfile, app_dir, NULL);
g_free (app_dir);
g_free (filename);
g_free (app_exec);
g_key_file_free (keyfile);
#elif defined(GDK_WINDOWING_QUARTZ) #elif defined(GDK_WINDOWING_QUARTZ)
/* TODO: Implement */ /* TODO: Implement */
#elif defined (GDK_WINDOWING_WIN32) #elif defined (GDK_WINDOWING_WIN32)
/* TODO: Implement */ /* TODO: Implement */
#elif HAVE_HILDON
/* TODO: Implement */
#endif #endif
} }
@ -2921,9 +2937,8 @@ _action_compact_menu_populate_popup (GtkAction* action,
{ "WindowNew" }, { "WindowNew" },
{ "PrivateBrowsing" }, { "PrivateBrowsing" },
{ "Open" }, { "Open" },
#if HAVE_HILDON
{ "Find" }, { "Find" },
#else #if !HAVE_HILDON
{ "Print" }, { "Print" },
{ NULL }, { NULL },
{ "Panel" }, { "Panel" },
@ -3989,6 +4004,7 @@ _action_bookmarks_import_activate (GtkAction* action,
gint icon_width = 16; gint icon_width = 16;
guint i; guint i;
KatzeItem* item; KatzeItem* item;
KatzeArray* bookmarks;
sqlite3* db; sqlite3* db;
const gchar* sqlcmd; const gchar* sqlcmd;
KatzeArray* bookmarkdirs; KatzeArray* bookmarkdirs;
@ -4038,7 +4054,7 @@ _action_bookmarks_import_activate (GtkAction* action,
g_free (path); g_free (path);
} }
gtk_list_store_insert_with_values (model, NULL, G_MAXINT, gtk_list_store_insert_with_values (model, NULL, G_MAXINT,
0, _("Import from a file"), 1, NULL, 2, NULL, 3, icon_width, -1); 0, _("Import from XBEL or HTML file"), 1, NULL, 2, NULL, 3, icon_width, -1);
gtk_combo_box_set_active (combobox, 0); gtk_combo_box_set_active (combobox, 0);
gtk_box_pack_start (GTK_BOX (hbox), combo, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (hbox), combo, TRUE, TRUE, 0);
gtk_container_add (GTK_CONTAINER (content_area), hbox); gtk_container_add (GTK_CONTAINER (content_area), hbox);
@ -4095,14 +4111,17 @@ _action_bookmarks_import_activate (GtkAction* action,
} }
error = NULL; error = NULL;
if (path && !midori_array_from_file (browser->bookmarks, path, NULL, &error)) bookmarks = katze_array_new (KATZE_TYPE_ARRAY);
if (path && !midori_array_from_file (bookmarks, path, NULL, &error))
{ {
sokoke_message_dialog (GTK_MESSAGE_ERROR, sokoke_message_dialog (GTK_MESSAGE_ERROR,
_("Failed to import bookmarks"), error ? error->message : ""); _("Failed to import bookmarks"), error ? error->message : "");
if (error) if (error)
g_error_free (error); g_error_free (error);
} }
midori_bookmarks_import_array_db (db, browser->bookmarks, selected); midori_bookmarks_import_array_db (db, bookmarks, selected);
katze_array_update (browser->bookmarks);
g_object_unref (bookmarks);
g_free (selected); g_free (selected);
g_free (path); g_free (path);
} }
@ -4118,6 +4137,7 @@ _action_bookmarks_export_activate (GtkAction* action,
gchar* path = NULL; gchar* path = NULL;
GError* error; GError* error;
sqlite3* db; sqlite3* db;
KatzeArray* bookmarks;
if (!browser->bookmarks || !gtk_widget_get_visible (GTK_WIDGET (browser))) if (!browser->bookmarks || !gtk_widget_get_visible (GTK_WIDGET (browser)))
return; return;
@ -4135,14 +4155,16 @@ _action_bookmarks_export_activate (GtkAction* action,
error = NULL; error = NULL;
db = g_object_get_data (G_OBJECT (browser->history), "db"); db = g_object_get_data (G_OBJECT (browser->history), "db");
midori_bookmarks_export_array_db (db, browser->bookmarks, ""); bookmarks = katze_array_new (KATZE_TYPE_ARRAY);
if (!midori_array_to_file (browser->bookmarks, path, "xbel", &error)) midori_bookmarks_export_array_db (db, bookmarks, "");
if (!midori_array_to_file (bookmarks, path, "xbel", &error))
{ {
sokoke_message_dialog (GTK_MESSAGE_ERROR, sokoke_message_dialog (GTK_MESSAGE_ERROR,
_("Failed to export bookmarks"), error ? error->message : ""); _("Failed to export bookmarks"), error ? error->message : "");
if (error) if (error)
g_error_free (error); g_error_free (error);
} }
g_object_unref (bookmarks);
g_free (path); g_free (path);
} }
@ -4184,24 +4206,7 @@ midori_browser_clear_private_data_response_cb (GtkWidget* dialog,
button = g_object_get_data (G_OBJECT (dialog), "history"); button = g_object_get_data (G_OBJECT (dialog), "history");
if (gtk_toggle_button_get_active (button)) if (gtk_toggle_button_get_active (button))
{ {
const gchar* sqlcmd = "DELETE FROM history"; katze_array_clear (browser->history);
sqlite3* db = g_object_get_data (G_OBJECT (browser->history), "db");
char* errmsg = NULL;
if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) != SQLITE_OK)
{
g_printerr (_("Failed to clear history: %s\n"), errmsg);
sqlite3_free (errmsg);
}
else
{
sqlcmd = "DELETE FROM search";
if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) != SQLITE_OK)
{
g_printerr (_("Failed to clear search history: %s\n"), errmsg);
sqlite3_free (errmsg);
}
}
clear_prefs |= MIDORI_CLEAR_HISTORY; clear_prefs |= MIDORI_CLEAR_HISTORY;
} }
button = g_object_get_data (G_OBJECT (dialog), "trash"); button = g_object_get_data (G_OBJECT (dialog), "trash");
@ -4403,10 +4408,11 @@ _action_tab_duplicate_activate (GtkAction* action,
{ {
GtkWidget* view = midori_browser_get_current_tab (browser); GtkWidget* view = midori_browser_get_current_tab (browser);
MidoriNewView where = MIDORI_NEW_VIEW_TAB; MidoriNewView where = MIDORI_NEW_VIEW_TAB;
GtkWidget* new_view = midori_view_new_with_uri ( GtkWidget* new_view = midori_view_new_with_title (
midori_view_get_display_uri (MIDORI_VIEW (view)), NULL, browser->settings, FALSE);
NULL, browser->settings); const gchar* uri = midori_view_get_display_uri (MIDORI_VIEW (view));
g_signal_emit_by_name (view, "new-view", new_view, where); g_signal_emit_by_name (view, "new-view", new_view, where);
midori_view_set_uri (MIDORI_VIEW (new_view), uri);
} }
static void static void
@ -4514,8 +4520,8 @@ _action_help_link_activate (GtkAction* action,
uri = free_uri = g_filename_to_uri (path, NULL, NULL); uri = free_uri = g_filename_to_uri (path, NULL, NULL);
if (g_access (path, F_OK) != 0) if (g_access (path, F_OK) != 0)
{ {
if (g_access (DOCDIR "/midori/user/midori.html", F_OK) == 0) if (g_access (DOCDIR "/user/midori.html", F_OK) == 0)
uri = "file://" DOCDIR "/midori/user/midori.html"; uri = "file://" DOCDIR "/user/midori.html";
else else
#endif #endif
uri = "error:nodocs share/doc/midori/user/midori.html"; uri = "error:nodocs share/doc/midori/user/midori.html";
@ -4526,16 +4532,16 @@ _action_help_link_activate (GtkAction* action,
} }
#else #else
#ifdef DOCDIR #ifdef DOCDIR
uri = "file://" DOCDIR "/midori/user/midori.html"; uri = "file://" DOCDIR "/user/midori.html";
if (g_access (DOCDIR "/midori/user/midori.html", F_OK) != 0) if (g_access (DOCDIR "/user/midori.html", F_OK) != 0)
#endif #endif
uri = "error:nodocs " DOCDIR "/midori/user/midori.html"; uri = "error:nodocs " DOCDIR "/user/midori.html";
#endif #endif
} }
else if (!strncmp ("HelpFAQ", action_name, 7)) else if (!strncmp ("HelpFAQ", action_name, 7))
uri = "http://wiki.xfce.org/midori/faq"; uri = "http://wiki.xfce.org/midori/faq";
else if (!strncmp ("HelpBugs", action_name, 8)) else if (!strncmp ("HelpBugs", action_name, 8))
uri = "http://www.twotoasts.de/bugs/"; uri = PACKAGE_BUGREPORT;
else else
uri = NULL; uri = NULL;
@ -4584,7 +4590,7 @@ midori_panel_notify_page_cb (MidoriPanel* panel,
GParamSpec* pspec, GParamSpec* pspec,
MidoriBrowser* browser) MidoriBrowser* browser)
{ {
gint page = katze_object_get_boolean (panel, "page"); gint page = midori_panel_get_current_page (panel);
if (page > -1) if (page > -1)
g_object_set (browser->settings, "last-panel-page", page, NULL); g_object_set (browser->settings, "last-panel-page", page, NULL);
} }
@ -4750,10 +4756,7 @@ midori_browser_notebook_button_press_event_after_cb (GtkNotebook* notebook,
if (/*(event->type == GDK_2BUTTON_PRESS && event->button == 1) if (/*(event->type == GDK_2BUTTON_PRESS && event->button == 1)
|| */(event->type == GDK_BUTTON_PRESS && event->button == 2)) || */(event->type == GDK_BUTTON_PRESS && event->button == 2))
{ {
gint n; gint n = midori_browser_add_uri (browser, "");
GtkWidget* view = midori_view_new_with_uri ("", NULL, browser->settings);
g_object_set_data (G_OBJECT (view), "midori-view-append", (void*)1);
n = midori_browser_add_tab (browser, view);
midori_browser_set_current_page (browser, n); midori_browser_set_current_page (browser, n);
return TRUE; return TRUE;
@ -4816,7 +4819,7 @@ static const GtkActionEntry entries[] =
N_("Add to Speed _dial"), "<Ctrl>h", N_("Add to Speed _dial"), "<Ctrl>h",
N_("Add shortcut to speed dial"), G_CALLBACK (_action_add_speed_dial_activate) }, N_("Add shortcut to speed dial"), G_CALLBACK (_action_add_speed_dial_activate) },
{ "AddDesktopShortcut", NULL, { "AddDesktopShortcut", NULL,
N_("Add Shortcut to the _desktop"), "<Ctrl>h", N_("Add Shortcut to the _desktop"), "<Ctrl>j",
N_("Add shortcut to the desktop"), G_CALLBACK (_action_add_desktop_shortcut_activate) }, N_("Add shortcut to the desktop"), G_CALLBACK (_action_add_desktop_shortcut_activate) },
{ "AddNewsFeed", NULL, { "AddNewsFeed", NULL,
N_("Subscribe to News _feed"), NULL, N_("Subscribe to News _feed"), NULL,
@ -4852,9 +4855,6 @@ static const GtkActionEntry entries[] =
{ "Copy", GTK_STOCK_COPY, { "Copy", GTK_STOCK_COPY,
NULL, "<Ctrl>c", NULL, "<Ctrl>c",
N_("Copy the selected text"), G_CALLBACK (_action_copy_activate) }, N_("Copy the selected text"), G_CALLBACK (_action_copy_activate) },
{ "Copy_", GTK_STOCK_COPY,
NULL, "<Ctrl>c",
N_("Copy the selected text"), G_CALLBACK (_action_copy_activate) },
{ "Paste", GTK_STOCK_PASTE, { "Paste", GTK_STOCK_PASTE,
NULL, "<Ctrl>v", NULL, "<Ctrl>v",
N_("Paste text from the clipboard"), G_CALLBACK (_action_paste_activate) }, N_("Paste text from the clipboard"), G_CALLBACK (_action_paste_activate) },
@ -5330,6 +5330,7 @@ midori_browser_new_history_item (MidoriBrowser* browser,
day = sokoke_time_t_to_julian (&now); day = sokoke_time_t_to_julian (&now);
db = g_object_get_data (G_OBJECT (browser->history), "db"); db = g_object_get_data (G_OBJECT (browser->history), "db");
g_return_if_fail (db != NULL);
if (!stmt) if (!stmt)
{ {
const gchar* sqlcmd; const gchar* sqlcmd;
@ -5702,7 +5703,7 @@ midori_browser_init (MidoriBrowser* browser)
action = g_object_new (KATZE_TYPE_ARRAY_ACTION, action = g_object_new (KATZE_TYPE_ARRAY_ACTION,
"name", "CompactMenu", "name", "CompactMenu",
"label", _("_Menu"), "label", _("_Menu"),
"stock-id", STOCK_WEB_BROWSER, "stock-id", GTK_STOCK_PROPERTIES,
"tooltip", _("Menu"), "tooltip", _("Menu"),
"array", katze_array_new (KATZE_TYPE_ITEM), "array", katze_array_new (KATZE_TYPE_ITEM),
NULL); NULL);
@ -5776,8 +5777,9 @@ midori_browser_init (MidoriBrowser* browser)
#endif #endif
_action_set_sensitive (browser, "EncodingCustom", FALSE); _action_set_sensitive (browser, "EncodingCustom", FALSE);
_action_set_visible (browser, "LastSession", FALSE); _action_set_visible (browser, "LastSession", FALSE);
/* FIXME: Show once implemented */ #if !HAVE_HILDON && !defined (GDK_WINDOWING_X11)
_action_set_visible (browser, "AddDesktopShortcut", FALSE); _action_set_visible (browser, "AddDesktopShortcut", FALSE);
#endif
_action_set_visible (browser, "Bookmarks", browser->bookmarks != NULL); _action_set_visible (browser, "Bookmarks", browser->bookmarks != NULL);
_action_set_visible (browser, "BookmarkAdd", browser->bookmarks != NULL); _action_set_visible (browser, "BookmarkAdd", browser->bookmarks != NULL);
@ -6454,6 +6456,8 @@ midori_browser_set_bookmarks (MidoriBrowser* browser,
if (!bookmarks) if (!bookmarks)
return; return;
if (katze_object_get_boolean (browser->settings, "show-bookmarkbar"))
_action_set_active (browser, "Bookmarkbar", TRUE);
g_object_ref (bookmarks); g_object_ref (bookmarks);
g_signal_connect (settings, "notify::show-bookmarkbar", g_signal_connect (settings, "notify::show-bookmarkbar",
G_CALLBACK (midori_browser_show_bookmarkbar_notify_value_cb), browser); G_CALLBACK (midori_browser_show_bookmarkbar_notify_value_cb), browser);
@ -6712,23 +6716,24 @@ midori_browser_add_item (MidoriBrowser* browser,
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); uri = katze_item_get_uri (item);
if (!uri)
uri = "about:blank";
title = katze_item_get_name (item); title = katze_item_get_name (item);
view = midori_view_new_with_title (title, browser->settings,
g_object_get_data (G_OBJECT (item), "midori-view-append") ? TRUE : FALSE);
page = midori_browser_add_tab (browser, view);
/* Blank pages should not be delayed */ /* Blank pages should not be delayed */
if (katze_item_get_meta_integer (item, "delay") > 0 if (katze_item_get_meta_integer (item, "delay") > 0
&& uri != NULL && strcmp (uri, "about:blank") != 0) && strcmp (uri, "about:blank") != 0)
{ {
gchar* new_uri = g_strdup_printf ("pause:%s", uri); gchar* new_uri = g_strdup_printf ("pause:%s", uri);
view = midori_view_new_with_uri (new_uri, title, browser->settings); midori_view_set_uri (MIDORI_VIEW (view), new_uri);
g_free (new_uri); g_free (new_uri);
} }
else else
view = midori_view_new_with_uri (uri, title, browser->settings); midori_view_set_uri (MIDORI_VIEW (view), uri);
/* FIXME: We should have public API for that */
if (g_object_get_data (G_OBJECT (item), "midori-view-append"))
g_object_set_data (G_OBJECT (view), "midori-view-append", (void*)1);
page = midori_browser_add_tab (browser, view);
proxy_item = midori_view_get_proxy_item (MIDORI_VIEW (view)); proxy_item = midori_view_get_proxy_item (MIDORI_VIEW (view));
if ((keys = katze_item_get_meta_keys (item))) if ((keys = katze_item_get_meta_keys (item)))
{ {
@ -6756,12 +6761,15 @@ midori_browser_add_uri (MidoriBrowser* browser,
const gchar* uri) const gchar* uri)
{ {
GtkWidget* view; GtkWidget* view;
gint n;
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 (uri != NULL, -1); g_return_val_if_fail (uri != NULL, -1);
view = midori_view_new_with_uri (uri, NULL, browser->settings); view = midori_view_new_with_title (NULL, browser->settings, FALSE);
return midori_browser_add_tab (browser, view); n = midori_browser_add_tab (browser, view);
midori_view_set_uri (MIDORI_VIEW (view), uri);
return n;
} }
/** /**
@ -6872,8 +6880,14 @@ void
midori_browser_set_current_page (MidoriBrowser* browser, midori_browser_set_current_page (MidoriBrowser* browser,
gint n) gint n)
{ {
gint n_pages;
GtkWidget* view; GtkWidget* view;
g_return_if_fail (MIDORI_IS_BROWSER (browser));
n_pages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (browser->notebook));
g_return_if_fail (n < n_pages);
gtk_notebook_set_current_page (GTK_NOTEBOOK (browser->notebook), n); gtk_notebook_set_current_page (GTK_NOTEBOOK (browser->notebook), n);
view = gtk_notebook_get_nth_page (GTK_NOTEBOOK (browser->notebook), n); view = gtk_notebook_get_nth_page (GTK_NOTEBOOK (browser->notebook), n);
if (midori_view_is_blank (MIDORI_VIEW (view))) if (midori_view_is_blank (MIDORI_VIEW (view)))

View file

@ -566,7 +566,8 @@ midori_extension_get_config_dir (MidoriExtension* extension)
if (!extension->priv->config_dir) if (!extension->priv->config_dir)
{ {
gchar* filename = g_object_get_data (G_OBJECT (extension), "filename"); gchar* filename = g_object_get_data (G_OBJECT (extension), "filename");
g_return_val_if_fail (filename != NULL, NULL); if (!filename)
return "/";
extension->priv->config_dir = g_build_filename ( extension->priv->config_dir = g_build_filename (
sokoke_set_config_dir (NULL), "extensions", filename, NULL); sokoke_set_config_dir (NULL), "extensions", filename, NULL);
} }

View file

@ -30,9 +30,6 @@ struct _MidoriPanel
GtkWidget* labelbar; GtkWidget* labelbar;
GtkWidget* toolbar; GtkWidget* toolbar;
GtkToolItem* button_align;
GtkToolItem* button_detach;
GtkToolItem* button_controls;
GtkWidget* toolbar_label; GtkWidget* toolbar_label;
GtkWidget* frame; GtkWidget* frame;
GtkWidget* toolbook; GtkWidget* toolbook;
@ -194,6 +191,8 @@ midori_panel_class_init (MidoriPanelClass* class)
* Whether to show operating controls. * Whether to show operating controls.
* *
* Since: 0.1.9 * Since: 0.1.9
*
* Deprecated: 0.3.0
*/ */
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_SHOW_CONTROLS, PROP_SHOW_CONTROLS,
@ -210,6 +209,8 @@ midori_panel_class_init (MidoriPanelClass* class)
* Whether to align the panel on the right. * Whether to align the panel on the right.
* *
* Since: 0.1.3 * Since: 0.1.3
*
* Deprecated: 0.3.0
*/ */
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_RIGHT_ALIGNED, PROP_RIGHT_ALIGNED,
@ -338,31 +339,11 @@ midori_panel_detach_page (MidoriPanel* panel,
midori_panel_set_current_page (panel, n > 0 ? n - 1 : 0); midori_panel_set_current_page (panel, n > 0 ? n - 1 : 0);
toolitem = gtk_toolbar_get_nth_item (GTK_TOOLBAR (panel->toolbar), toolitem = gtk_toolbar_get_nth_item (GTK_TOOLBAR (panel->toolbar),
n > 0 ? n - 1 : 0); n > 0 ? n - 1 : 0);
if (!gtk_notebook_get_n_pages (GTK_NOTEBOOK (panel->notebook)))
gtk_widget_set_sensitive (GTK_WIDGET (panel->button_detach), FALSE);
g_signal_connect (window, "delete-event", g_signal_connect (window, "delete-event",
G_CALLBACK (midori_panel_detached_window_delete_event_cb), panel); G_CALLBACK (midori_panel_detached_window_delete_event_cb), panel);
gtk_widget_show (window); gtk_widget_show (window);
} }
static void
midori_panel_button_detach_clicked_cb (GtkWidget* toolbutton,
MidoriPanel* panel)
{
/* FIXME: What happens when the browser is destroyed? */
/* FIXME: What about multiple browsers? */
/* FIXME: Should we remember if the child was detached? */
gint n = midori_panel_get_current_page (panel);
midori_panel_detach_page (panel, n);
}
static void
midori_panel_button_align_clicked_cb (GtkWidget* toolitem,
MidoriPanel* panel)
{
midori_panel_set_right_aligned (panel, !panel->right_aligned);
}
static void static void
midori_panel_destroy_cb (MidoriPanel* panel) midori_panel_destroy_cb (MidoriPanel* panel)
{ {
@ -405,33 +386,6 @@ midori_panel_init (MidoriPanel* panel)
gtk_container_add (GTK_CONTAINER (toolitem), panel->toolbar_label); gtk_container_add (GTK_CONTAINER (toolitem), panel->toolbar_label);
gtk_container_set_border_width (GTK_CONTAINER (toolitem), 6); gtk_container_set_border_width (GTK_CONTAINER (toolitem), 6);
gtk_toolbar_insert (GTK_TOOLBAR (labelbar), toolitem, -1); gtk_toolbar_insert (GTK_TOOLBAR (labelbar), toolitem, -1);
toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_FULLSCREEN);
gtk_widget_set_sensitive (GTK_WIDGET (toolitem), FALSE);
panel->button_detach = toolitem;
gtk_tool_button_set_label (GTK_TOOL_BUTTON (toolitem),
_("Detach chosen panel from the window"));
gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM (toolitem),
_("Detach chosen panel from the window"));
g_signal_connect (toolitem, "clicked",
G_CALLBACK (midori_panel_button_detach_clicked_cb), panel);
#if HAVE_OSX
gtk_toolbar_insert (GTK_TOOLBAR (labelbar), toolitem, 0);
#else
gtk_toolbar_insert (GTK_TOOLBAR (labelbar), toolitem, -1);
#endif
toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_GO_FORWARD);
gtk_tool_button_set_label (GTK_TOOL_BUTTON (toolitem),
_("Align sidepanel to the right"));
gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM (toolitem),
_("Align sidepanel to the right"));
g_signal_connect (toolitem, "clicked",
G_CALLBACK (midori_panel_button_align_clicked_cb), panel);
#if HAVE_OSX
gtk_toolbar_insert (GTK_TOOLBAR (labelbar), toolitem, 0);
#else
gtk_toolbar_insert (GTK_TOOLBAR (labelbar), toolitem, -1);
#endif
panel->button_align = toolitem;
toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_CLOSE); toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_CLOSE);
gtk_tool_button_set_label (GTK_TOOL_BUTTON (toolitem), _("Close panel")); gtk_tool_button_set_label (GTK_TOOL_BUTTON (toolitem), _("Close panel"));
gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM (toolitem), _("Close panel")); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM (toolitem), _("Close panel"));
@ -450,7 +404,6 @@ midori_panel_init (MidoriPanel* panel)
gtk_notebook_set_show_border (GTK_NOTEBOOK (panel->toolbook), FALSE); gtk_notebook_set_show_border (GTK_NOTEBOOK (panel->toolbook), FALSE);
gtk_notebook_set_show_tabs (GTK_NOTEBOOK (panel->toolbook), FALSE); gtk_notebook_set_show_tabs (GTK_NOTEBOOK (panel->toolbook), FALSE);
gtk_box_pack_start (GTK_BOX (vbox), panel->toolbook, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), panel->toolbook, FALSE, FALSE, 0);
gtk_widget_show (panel->toolbook);
/* Create the notebook */ /* Create the notebook */
panel->notebook = gtk_notebook_new (); panel->notebook = gtk_notebook_new ();
@ -497,12 +450,6 @@ midori_panel_set_property (GObject* object,
break; break;
case PROP_SHOW_CONTROLS: case PROP_SHOW_CONTROLS:
panel->show_controls = g_value_get_boolean (value); panel->show_controls = g_value_get_boolean (value);
sokoke_widget_set_visible (panel->labelbar, panel->show_controls);
sokoke_widget_set_visible (panel->toolbar, panel->show_controls);
if (panel->button_controls)
gtk_toggle_tool_button_set_active (
GTK_TOGGLE_TOOL_BUTTON (panel->button_controls),
!panel->show_controls);
break; break;
case PROP_RIGHT_ALIGNED: case PROP_RIGHT_ALIGNED:
midori_panel_set_right_aligned (panel, g_value_get_boolean (value)); midori_panel_set_right_aligned (panel, g_value_get_boolean (value));
@ -589,15 +536,7 @@ midori_panel_set_right_aligned (MidoriPanel* panel,
box = gtk_widget_get_parent (panel->toolbar); box = gtk_widget_get_parent (panel->toolbar);
gtk_box_reorder_child (GTK_BOX (box), panel->toolbar, gtk_box_reorder_child (GTK_BOX (box), panel->toolbar,
right_aligned ? -1 : 0); right_aligned ? -1 : 0);
gtk_tool_button_set_stock_id (GTK_TOOL_BUTTON (panel->button_align),
right_aligned ? GTK_STOCK_GO_BACK : GTK_STOCK_GO_FORWARD);
panel->right_aligned = right_aligned; panel->right_aligned = right_aligned;
gtk_tool_button_set_label (GTK_TOOL_BUTTON (panel->button_align),
!panel->right_aligned ? _("Align sidepanel to the right")
: _("Align sidepanel to the left"));
gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM (panel->button_align),
!panel->right_aligned ? _("Align sidepanel to the right")
: _("Align sidepanel to the left"));
g_object_notify (G_OBJECT (panel), "right-aligned"); g_object_notify (G_OBJECT (panel), "right-aligned");
} }
@ -644,9 +583,6 @@ midori_panel_construct_tool_item (MidoriPanel* panel,
g_signal_connect (viewable, "destroy", g_signal_connect (viewable, "destroy",
G_CALLBACK (midori_panel_widget_destroy_cb), toolitem); G_CALLBACK (midori_panel_widget_destroy_cb), toolitem);
if (gtk_notebook_get_n_pages (GTK_NOTEBOOK (panel->notebook)))
gtk_widget_set_sensitive (GTK_WIDGET (panel->button_detach), TRUE);
return GTK_TOOL_ITEM (toolitem); return GTK_TOOL_ITEM (toolitem);
} }
@ -677,16 +613,6 @@ midori_panel_action_activate_cb (GtkRadioAction* action,
} }
} }
#if !HAVE_HILDON
static void
midori_panel_show_controls_toggled_cb (GtkWidget* menuitem,
MidoriPanel* panel)
{
if (panel->show_controls != !gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON (menuitem)))
g_object_set (panel, "show-controls", !panel->show_controls, NULL);
}
#endif
/** /**
* midori_panel_append_page: * midori_panel_append_page:
* @panel: a #MidoriPanel * @panel: a #MidoriPanel
@ -749,17 +675,6 @@ midori_panel_append_page (MidoriPanel* panel,
gtk_container_add (GTK_CONTAINER (panel->notebook), scrolled); gtk_container_add (GTK_CONTAINER (panel->notebook), scrolled);
toolbar = midori_viewable_get_toolbar (viewable); toolbar = midori_viewable_get_toolbar (viewable);
#if !HAVE_HILDON
toolitem = gtk_toggle_tool_button_new_from_stock (GTK_STOCK_PROPERTIES);
gtk_tool_item_set_tooltip_text (toolitem, _("Hide operating controls"));
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (toolitem),
!panel->show_controls);
g_signal_connect (toolitem, "clicked",
G_CALLBACK (midori_panel_show_controls_toggled_cb), panel);
gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, 0);
gtk_widget_show (GTK_WIDGET (toolitem));
panel->button_controls = toolitem;
#endif
gtk_widget_show (toolbar); gtk_widget_show (toolbar);
gtk_container_add (GTK_CONTAINER (panel->toolbook), toolbar); gtk_container_add (GTK_CONTAINER (panel->toolbook), toolbar);
g_signal_connect (viewable, "destroy", g_signal_connect (viewable, "destroy",
@ -954,8 +869,7 @@ midori_panel_set_current_page (MidoriPanel* panel,
gtk_notebook_set_current_page (GTK_NOTEBOOK (panel->toolbook), n); gtk_notebook_set_current_page (GTK_NOTEBOOK (panel->toolbook), n);
toolbar = gtk_notebook_get_nth_page (GTK_NOTEBOOK (panel->toolbook), n); toolbar = gtk_notebook_get_nth_page (GTK_NOTEBOOK (panel->toolbook), n);
items = gtk_container_get_children (GTK_CONTAINER (toolbar)); items = gtk_container_get_children (GTK_CONTAINER (toolbar));
sokoke_widget_set_visible (panel->toolbook, sokoke_widget_set_visible (panel->toolbook, items != NULL);
g_list_nth_data (items, 1) != NULL);
g_list_free (items); g_list_free (items);
gtk_notebook_set_current_page (GTK_NOTEBOOK (panel->notebook), n); gtk_notebook_set_current_page (GTK_NOTEBOOK (panel->notebook), n);
label = midori_viewable_get_label (MIDORI_VIEWABLE (viewable)); label = midori_viewable_get_label (MIDORI_VIEWABLE (viewable));

View file

@ -413,22 +413,14 @@ midori_preferences_set_settings (MidoriPreferences* preferences,
#if !HAVE_HILDON #if !HAVE_HILDON
button = katze_property_proxy (settings, "auto-load-images", NULL); button = katze_property_proxy (settings, "auto-load-images", NULL);
INDENTED_ADD (button); INDENTED_ADD (button);
#endif #if WEBKIT_CHECK_VERSION (1, 1, 6)
#if WEBKIT_CHECK_VERSION (1, 1, 15) || HAVE_HILDON button = katze_property_proxy (settings, "enable-spell-checking", NULL);
if (katze_widget_has_touchscreen_mode (parent ? #else
GTK_WIDGET (parent) : GTK_WIDGET (preferences)))
button = katze_property_proxy (settings, "kinetic-scrolling", NULL);
else
{
button = katze_property_proxy (settings, "enforce-96-dpi", NULL); button = katze_property_proxy (settings, "enforce-96-dpi", NULL);
gtk_button_set_label (GTK_BUTTON (button), _("Enforce 96 dots per inch")); gtk_button_set_label (GTK_BUTTON (button), _("Enforce 96 dots per inch"));
gtk_widget_set_tooltip_text (button, _("Enforce a video dot density of 96 DPI")); gtk_widget_set_tooltip_text (button, _("Enforce a video dot density of 96 DPI"));
}
#else
button = katze_property_proxy (settings, "middle-click-opens-selection", NULL);
#endif #endif
SPANNED_ADD (button); SPANNED_ADD (button);
#if !HAVE_HILDON
button = katze_property_proxy (settings, "enable-scripts", NULL); button = katze_property_proxy (settings, "enable-scripts", NULL);
INDENTED_ADD (button); INDENTED_ADD (button);
button = katze_property_proxy (settings, "enable-plugins", NULL); button = katze_property_proxy (settings, "enable-plugins", NULL);
@ -442,18 +434,20 @@ midori_preferences_set_settings (MidoriPreferences* preferences,
gtk_widget_set_tooltip_text (button, _("Whether scripts are allowed to open popup windows automatically")); gtk_widget_set_tooltip_text (button, _("Whether scripts are allowed to open popup windows automatically"));
SPANNED_ADD (button); SPANNED_ADD (button);
#endif #endif
#if WEBKIT_CHECK_VERSION (1, 1, 6) button = NULL;
FRAME_NEW (_("Spell Checking")); #if WEBKIT_CHECK_VERSION (1, 1, 15) || HAVE_HILDON
button = katze_property_proxy (settings, "enable-spell-checking", NULL); if (katze_widget_has_touchscreen_mode (parent ?
gtk_button_set_label (GTK_BUTTON (button), _("Enable Spell Checking")); GTK_WIDGET (parent) : GTK_WIDGET (preferences)))
gtk_widget_set_tooltip_text (button, _("Enable spell checking while typing")); button = katze_property_proxy (settings, "kinetic-scrolling", NULL);
INDENTED_ADD (button); #else
entry = katze_property_proxy (settings, "spell-checking-languages", "languages"); button = katze_property_proxy (settings, "middle-click-opens-selection", NULL);
/* i18n: The example should be adjusted to contain a good local default */
gtk_widget_set_tooltip_text (entry, _("A comma separated list of "
"languages to be used for spell checking, for example \"en_GB,de_DE\""));
SPANNED_ADD (entry);
#endif #endif
if (button != NULL)
INDENTED_ADD (button);
button = katze_property_label (settings, "preferred-languages");
INDENTED_ADD (button);
entry = katze_property_proxy (settings, "preferred-languages", "languages");
SPANNED_ADD (entry);
/* Page "Interface" */ /* Page "Interface" */
PAGE_NEW (GTK_STOCK_CONVERT, _("Interface")); PAGE_NEW (GTK_STOCK_CONVERT, _("Interface"));
@ -521,10 +515,6 @@ midori_preferences_set_settings (MidoriPreferences* preferences,
INDENTED_ADD (label); INDENTED_ADD (label);
button = katze_property_proxy (settings, "identify-as", "custom-user-agent"); button = katze_property_proxy (settings, "identify-as", "custom-user-agent");
SPANNED_ADD (button); SPANNED_ADD (button);
label = katze_property_label (settings, "preferred-languages");
INDENTED_ADD (label);
entry = katze_property_proxy (settings, "preferred-languages", "languages");
SPANNED_ADD (entry);
/* Page "Privacy" */ /* Page "Privacy" */
PAGE_NEW (GTK_STOCK_INDEX, _("Privacy")); PAGE_NEW (GTK_STOCK_INDEX, _("Privacy"));

View file

@ -403,20 +403,21 @@ midori_search_action_manage_activate_cb (GtkWidget* menuitem,
/* static */ GdkPixbuf* /* static */ GdkPixbuf*
midori_search_action_get_icon (KatzeItem* item, midori_search_action_get_icon (KatzeItem* item,
GtkWidget* widget, GtkWidget* widget,
const gchar** icon_name) const gchar** icon_name,
gboolean in_entry)
{ {
const gchar* icon; const gchar* icon;
GdkScreen* screen;
GtkIconTheme* icon_theme;
if ((icon = katze_item_get_uri (item)) && (g_strstr_len (icon, 8, "://"))) if ((icon = katze_item_get_uri (item)) && (g_strstr_len (icon, 8, "://")))
return katze_load_cached_icon (icon, widget); return katze_load_cached_icon (icon, widget);
if ((icon = katze_item_get_icon (item)) && *icon)
{
GdkScreen* screen;
GtkIconTheme* icon_theme;
screen = gtk_widget_get_screen (widget); screen = gtk_widget_get_screen (widget);
icon_theme = gtk_icon_theme_get_for_screen (screen); icon_theme = gtk_icon_theme_get_for_screen (screen);
if ((icon = katze_item_get_icon (item)) && *icon)
{
if (gtk_icon_theme_has_icon (icon_theme, icon)) if (gtk_icon_theme_has_icon (icon_theme, icon))
{ {
*icon_name = icon; *icon_name = icon;
@ -424,7 +425,12 @@ midori_search_action_get_icon (KatzeItem* item,
} }
} }
*icon_name = GTK_STOCK_FILE; if (in_entry && gtk_icon_theme_has_icon (icon_theme, "edit-find-option-symbolic"))
*icon_name = "edit-find-option-symbolic";
else if (gtk_icon_theme_has_icon (icon_theme, "edit-find-option"))
*icon_name = "edit-find-option";
else
*icon_name = "edit-find";
return NULL; return NULL;
} }
@ -455,7 +461,7 @@ midori_search_action_icon_released_cb (GtkWidget* entry,
menuitem = gtk_image_menu_item_new_with_label ( menuitem = gtk_image_menu_item_new_with_label (
katze_item_get_name (item)); katze_item_get_name (item));
image = gtk_image_new (); image = gtk_image_new ();
icon = midori_search_action_get_icon (item, entry, &icon_name); icon = midori_search_action_get_icon (item, entry, &icon_name, FALSE);
if (icon) if (icon)
{ {
gtk_image_set_from_pixbuf (GTK_IMAGE (image), icon); gtk_image_set_from_pixbuf (GTK_IMAGE (image), icon);
@ -520,7 +526,7 @@ midori_search_action_set_entry_icon (MidoriSearchAction* search_action,
const gchar* icon_name; const gchar* icon_name;
icon = midori_search_action_get_icon (search_action->current_item, icon = midori_search_action_get_icon (search_action->current_item,
entry, &icon_name); entry, &icon_name, TRUE);
if (icon) if (icon)
{ {
gtk_icon_entry_set_icon_from_pixbuf (GTK_ICON_ENTRY (entry), gtk_icon_entry_set_icon_from_pixbuf (GTK_ICON_ENTRY (entry),
@ -825,7 +831,7 @@ midori_search_action_dialog_render_icon_cb (GtkTreeViewColumn* column,
gtk_tree_model_get (model, iter, 0, &item, -1); gtk_tree_model_get (model, iter, 0, &item, -1);
search_action = g_object_get_data (G_OBJECT (treeview), "search-action"); search_action = g_object_get_data (G_OBJECT (treeview), "search-action");
if ((icon = midori_search_action_get_icon (item, treeview, &icon_name))) if ((icon = midori_search_action_get_icon (item, treeview, &icon_name, FALSE)))
{ {
g_object_set (renderer, "pixbuf", icon, "yalign", 0.25, NULL); g_object_set (renderer, "pixbuf", icon, "yalign", 0.25, NULL);
g_object_unref (icon); g_object_unref (icon);

View file

@ -20,7 +20,7 @@
Names should match with epiphany and/ or xdg spec */ Names should match with epiphany and/ or xdg spec */
#define STOCK_BOOKMARK "stock_bookmark" #define STOCK_BOOKMARK "stock_bookmark"
#define STOCK_BOOKMARKS "vcard" #define STOCK_BOOKMARKS "user-bookmarks"
#define STOCK_CONSOLE "terminal" #define STOCK_CONSOLE "terminal"
#define STOCK_EXTENSION "extension" #define STOCK_EXTENSION "extension"
#define STOCK_EXTENSIONS "extension" #define STOCK_EXTENSIONS "extension"

View file

@ -59,6 +59,10 @@ midori_view_item_meta_data_changed (KatzeItem* item,
const gchar* key, const gchar* key,
MidoriView* view); MidoriView* view);
static void
_midori_view_set_settings (MidoriView* view,
MidoriWebSettings* settings);
struct _MidoriView struct _MidoriView
{ {
GtkVBox parent_instance; GtkVBox parent_instance;
@ -470,7 +474,7 @@ midori_view_class_init (MidoriViewClass* class)
"Title", "Title",
"The title of the currently loaded page", "The title of the currently loaded page",
NULL, NULL,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); flags));
/** /**
* MidoriView:security: * MidoriView:security:
@ -600,8 +604,9 @@ midori_view_class_init (MidoriViewClass* class)
} }
static void static void
midori_view_update_title (MidoriView* view) midori_view_set_title (MidoriView* view, const gchar* title)
{ {
katze_assign (view->title, g_strdup (title));
#ifndef G_OS_WIN32 #ifndef G_OS_WIN32
/* If left-to-right text is combined with right-to-left text the default /* If left-to-right text is combined with right-to-left text the default
behaviour of Pango can result in awkwardly aligned text. For example behaviour of Pango can result in awkwardly aligned text. For example
@ -1447,9 +1452,9 @@ midori_view_apply_scroll_position (MidoriView* view)
{ {
if (view->scrollh > 0) if (view->scrollh > 0)
{ {
GtkAdjustment* adjustment = katze_object_get_object (view->scrolled_window, "hadjustment"); GtkScrolledWindow* scrolled = GTK_SCROLLED_WINDOW (view->scrolled_window);
GtkAdjustment* adjustment = gtk_scrolled_window_get_hadjustment (scrolled);
gtk_adjustment_set_value (adjustment, view->scrollh); gtk_adjustment_set_value (adjustment, view->scrollh);
g_object_unref (adjustment);
} }
view->scrollh = -3; view->scrollh = -3;
} }
@ -1457,9 +1462,9 @@ midori_view_apply_scroll_position (MidoriView* view)
{ {
if (view->scrollv > 0) if (view->scrollv > 0)
{ {
GtkAdjustment* adjustment = katze_object_get_object (view->scrolled_window, "vadjustment"); GtkScrolledWindow* scrolled = GTK_SCROLLED_WINDOW (view->scrolled_window);
GtkAdjustment* adjustment = gtk_scrolled_window_get_vadjustment (scrolled);
gtk_adjustment_set_value (adjustment, view->scrollv); gtk_adjustment_set_value (adjustment, view->scrollv);
g_object_unref (adjustment);
} }
view->scrollv = -3; view->scrollv = -3;
} }
@ -1542,7 +1547,8 @@ midori_web_view_notify_icon_uri_cb (WebKitWebView* web_view,
GParamSpec* pspec, GParamSpec* pspec,
MidoriView* view) MidoriView* view)
{ {
katze_assign (view->icon_uri, katze_object_get_string (web_view, "icon-uri")); const gchar* icon_uri = webkit_web_view_get_icon_uri (web_view);
katze_assign (view->icon_uri, g_strdup (icon_uri));
_midori_web_view_load_icon (view); _midori_web_view_load_icon (view);
} }
#endif #endif
@ -1553,8 +1559,8 @@ webkit_web_view_notify_title_cb (WebKitWebView* web_view,
GParamSpec* pspec, GParamSpec* pspec,
MidoriView* view) MidoriView* view)
{ {
g_object_get (web_view, "title", &view->title, NULL); const gchar* title = webkit_web_view_get_title (web_view);
midori_view_update_title (view); midori_view_set_title (view, title);
g_object_notify (G_OBJECT (view), "title"); g_object_notify (G_OBJECT (view), "title");
} }
#else #else
@ -1609,26 +1615,33 @@ webkit_web_view_hovering_over_link_cb (WebKitWebView* web_view,
static void static void
midori_view_ensure_link_uri (MidoriView* view, midori_view_ensure_link_uri (MidoriView* view,
gint *x, gint *x,
gint *y) gint *y,
GdkEventButton* event)
{ {
g_return_if_fail (MIDORI_IS_VIEW (view)); g_return_if_fail (MIDORI_IS_VIEW (view));
#if WEBKIT_CHECK_VERSION (1, 1, 15) #if WEBKIT_CHECK_VERSION (1, 1, 15)
if (view->web_view && gtk_widget_get_window (view->web_view)) if (view->web_view && gtk_widget_get_window (view->web_view))
{ {
GdkEventButton ev;
if (!event) {
gint ex, ey; gint ex, ey;
GdkEventButton event; event = &ev;
gdk_window_get_pointer (gtk_widget_get_window (view->web_view), &ex, &ey, NULL); gdk_window_get_pointer (gtk_widget_get_window (view->web_view), &ex, &ey, NULL);
if (x != NULL) event->x = ex;
*x = ex; event->y = ey;
if (y != NULL) }
*y = ey;
event.x = ex; if (x != NULL)
event.y = ey; *x = event->x;
katze_object_assign (view->hit_test, webkit_web_view_get_hit_test_result ( if (y != NULL)
WEBKIT_WEB_VIEW (view->web_view), &event)); *y = event->y;
katze_object_assign (view->hit_test,
g_object_ref (
webkit_web_view_get_hit_test_result (
WEBKIT_WEB_VIEW (view->web_view), event)));
katze_assign (view->link_uri, katze_assign (view->link_uri,
katze_object_get_string (view->hit_test, "link-uri")); katze_object_get_string (view->hit_test, "link-uri"));
} }
@ -1650,7 +1663,7 @@ gtk_widget_button_press_event_cb (WebKitWebView* web_view,
gboolean background; gboolean background;
event->state = event->state & MIDORI_KEYS_MODIFIER_MASK; event->state = event->state & MIDORI_KEYS_MODIFIER_MASK;
midori_view_ensure_link_uri (view, NULL, NULL); midori_view_ensure_link_uri (view, NULL, NULL, event);
link_uri = midori_view_get_link_uri (view); link_uri = midori_view_get_link_uri (view);
switch (event->button) switch (event->button)
@ -1801,9 +1814,16 @@ gtk_widget_key_press_event_cb (WebKitWebView* web_view,
event->state = event->state & MIDORI_KEYS_MODIFIER_MASK; event->state = event->state & MIDORI_KEYS_MODIFIER_MASK;
/* Handle oddities in Russian keyboard layouts */
if (event->hardware_keycode == ';')
event->keyval = ',';
else if (event->hardware_keycode == '<')
event->keyval = '.';
/* Find links by number: . to show links, type number, Return to go */ /* Find links by number: . to show links, type number, Return to go */
if (event->keyval == '.' if (event->keyval == '.'
|| (view->find_links > -1 && (digit != -1 || event->keyval == GDK_Return))) || (view->find_links > -1
&& (digit != -1 || event->keyval == GDK_Return || event->keyval == GDK_Escape)))
{ {
WebKitWebFrame* web_frame = webkit_web_view_get_main_frame (web_view); WebKitWebFrame* web_frame = webkit_web_view_get_main_frame (web_view);
JSContextRef js_context = webkit_web_frame_get_global_context (web_frame); JSContextRef js_context = webkit_web_frame_get_global_context (web_frame);
@ -1850,10 +1870,11 @@ gtk_widget_key_press_event_cb (WebKitWebView* web_view,
"if (return_key || typeof links[i * 10] == 'undefined') {" "if (return_key || typeof links[i * 10] == 'undefined') {"
" for (var j = 0; j < links.length; j++)" " for (var j = 0; j < links.length; j++)"
" links[j].style.display = 'none !important';" " links[j].style.display = 'none !important';"
" if (typeof links[i] != 'undefined')"
" links[i].parentNode.href; }", " links[i].parentNode.href; }",
view->find_links, event->keyval == GDK_Return); view->find_links, event->keyval == GDK_Return);
result = sokoke_js_script_eval (js_context, script, NULL); result = sokoke_js_script_eval (js_context, script, NULL);
if (strcmp (result, "undefined")) if (result && strstr (result, "://"))
{ {
view->find_links = -1; view->find_links = -1;
if (MIDORI_MOD_NEW_TAB (event->state)) if (MIDORI_MOD_NEW_TAB (event->state))
@ -2236,7 +2257,7 @@ midori_view_populate_popup (MidoriView* view,
gboolean is_image; gboolean is_image;
gboolean is_media; gboolean is_media;
midori_view_ensure_link_uri (view, &x, &y); midori_view_ensure_link_uri (view, &x, &y, NULL);
context = katze_object_get_int (view->hit_test, "context"); context = katze_object_get_int (view->hit_test, "context");
has_selection = context & WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION; has_selection = context & WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION;
/* Ensure view->selected_text */ /* Ensure view->selected_text */
@ -2801,9 +2822,8 @@ webkit_web_view_create_web_view_cb (GtkWidget* web_view,
new_view = view; new_view = view;
else else
{ {
new_view = (MidoriView*)midori_view_new_with_uri (NULL, NULL, new_view = (MidoriView*)midori_view_new_with_title (NULL,
view->settings); view->settings, FALSE);
midori_view_construct_web_view (new_view);
g_signal_connect (new_view->web_view, "web-view-ready", g_signal_connect (new_view->web_view, "web-view-ready",
G_CALLBACK (webkit_web_view_web_view_ready_cb), view); G_CALLBACK (webkit_web_view_web_view_ready_cb), view);
} }
@ -3015,10 +3035,10 @@ midori_view_notify_hadjustment_cb (MidoriView* view,
GParamSpec* pspec, GParamSpec* pspec,
gpointer data) gpointer data)
{ {
GtkAdjustment* hadjustment = katze_object_get_object (view->scrolled_window, "hadjustment"); GtkScrolledWindow* scrolled = GTK_SCROLLED_WINDOW (view->scrolled_window);
GtkAdjustment* hadjustment = gtk_scrolled_window_get_hadjustment (scrolled);
g_signal_connect (hadjustment, "notify::value", g_signal_connect (hadjustment, "notify::value",
G_CALLBACK (midori_view_hadjustment_notify_value_cb), view); G_CALLBACK (midori_view_hadjustment_notify_value_cb), view);
g_object_unref (hadjustment);
} }
static void static void
@ -3035,10 +3055,10 @@ midori_view_notify_vadjustment_cb (MidoriView* view,
GParamSpec* pspec, GParamSpec* pspec,
gpointer data) gpointer data)
{ {
GtkAdjustment* vadjustment = katze_object_get_object (view->scrolled_window, "vadjustment"); GtkScrolledWindow* scrolled = GTK_SCROLLED_WINDOW (view->scrolled_window);
GtkAdjustment* vadjustment = gtk_scrolled_window_get_vadjustment (scrolled);
g_signal_connect (vadjustment, "notify::value", g_signal_connect (vadjustment, "notify::value",
G_CALLBACK (midori_view_vadjustment_notify_value_cb), view); G_CALLBACK (midori_view_vadjustment_notify_value_cb), view);
g_object_unref (vadjustment);
} }
static void static void
@ -3048,6 +3068,16 @@ katze_net_object_maybe_unref (gpointer object)
g_object_unref (object); g_object_unref (object);
} }
static GHashTable* midori_view_get_memory (void)
{
static GHashTable* memory = NULL;
if (!memory)
memory = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, katze_net_object_maybe_unref);
return g_hash_table_ref (memory);
}
static void static void
midori_view_init (MidoriView* view) midori_view_init (MidoriView* view)
{ {
@ -3057,8 +3087,7 @@ midori_view_init (MidoriView* view)
view->mime_type = g_strdup (""); view->mime_type = g_strdup ("");
view->icon = NULL; view->icon = NULL;
view->icon_uri = NULL; view->icon_uri = NULL;
view->memory = g_hash_table_new_full (g_str_hash, g_str_equal, view->memory = midori_view_get_memory ();
g_free, katze_net_object_maybe_unref);
view->progress = 0.0; view->progress = 0.0;
view->load_status = MIDORI_LOAD_FINISHED; view->load_status = MIDORI_LOAD_FINISHED;
view->minimized = FALSE; view->minimized = FALSE;
@ -3091,6 +3120,8 @@ midori_view_init (MidoriView* view)
G_CALLBACK (midori_view_notify_hadjustment_cb), view); G_CALLBACK (midori_view_notify_hadjustment_cb), view);
g_signal_connect (view->scrolled_window, "notify::vadjustment", g_signal_connect (view->scrolled_window, "notify::vadjustment",
G_CALLBACK (midori_view_notify_vadjustment_cb), view); G_CALLBACK (midori_view_notify_vadjustment_cb), view);
midori_view_construct_web_view (view);
} }
static void static void
@ -3107,13 +3138,22 @@ midori_view_finalize (GObject* object)
midori_view_item_meta_data_changed, view); midori_view_item_meta_data_changed, view);
if (view->thumb_view) if (view->thumb_view)
{
gtk_widget_destroy (view->thumb_view); gtk_widget_destroy (view->thumb_view);
view->thumb_view = NULL;
}
katze_assign (view->uri, NULL); katze_assign (view->uri, NULL);
katze_assign (view->title, NULL); katze_assign (view->title, NULL);
katze_object_assign (view->icon, NULL); katze_object_assign (view->icon, NULL);
katze_assign (view->icon_uri, NULL); katze_assign (view->icon_uri, NULL);
g_hash_table_destroy (view->memory);
if (view->memory)
{
g_hash_table_unref (view->memory);
view->memory = NULL;
}
katze_assign (view->statusbar_text, NULL); katze_assign (view->statusbar_text, NULL);
katze_assign (view->link_uri, NULL); katze_assign (view->link_uri, NULL);
katze_assign (view->selected_text, NULL); katze_assign (view->selected_text, NULL);
@ -3141,8 +3181,7 @@ midori_view_set_property (GObject* object,
switch (prop_id) switch (prop_id)
{ {
case PROP_TITLE: case PROP_TITLE:
katze_assign (view->title, g_value_dup_string (value)); midori_view_set_title (view, g_value_get_string (value));
midori_view_update_title (view);
break; break;
case PROP_MINIMIZED: case PROP_MINIMIZED:
view->minimized = g_value_get_boolean (value); view->minimized = g_value_get_boolean (value);
@ -3162,7 +3201,7 @@ midori_view_set_property (GObject* object,
katze_assign (view->statusbar_text, g_value_dup_string (value)); katze_assign (view->statusbar_text, g_value_dup_string (value));
break; break;
case PROP_SETTINGS: case PROP_SETTINGS:
midori_view_set_settings (view, g_value_get_object (value)); _midori_view_set_settings (view, g_value_get_object (value));
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -3228,10 +3267,7 @@ midori_view_focus_in_event (GtkWidget* widget,
{ {
MidoriView* view = MIDORI_VIEW (widget); MidoriView* view = MIDORI_VIEW (widget);
/* Always propagate focus to the child web view, /* Always propagate focus to the child web view */
* create it if it's not there yet. */
if (!view->web_view)
midori_view_construct_web_view (view);
gtk_widget_grab_focus (view->web_view); gtk_widget_grab_focus (view->web_view);
return TRUE; return TRUE;
} }
@ -3244,7 +3280,7 @@ midori_view_focus_in_event (GtkWidget* widget,
* *
* Return value: a new #MidoriView * Return value: a new #MidoriView
* *
* Deprecated: 0.2.8: Use midori_view_new_with_uri() instead. * Deprecated: 0.2.8: Use midori_view_new_with_title() instead.
**/ **/
GtkWidget* GtkWidget*
midori_view_new (KatzeNet* net) midori_view_new (KatzeNet* net)
@ -3253,10 +3289,25 @@ midori_view_new (KatzeNet* net)
} }
static void static void
_midori_view_update_settings (MidoriView* view) _midori_view_set_settings (MidoriView* view,
MidoriWebSettings* settings)
{ {
gboolean zoom_text_and_images, kinetic_scrolling; gboolean zoom_text_and_images, kinetic_scrolling;
if (view->settings)
g_signal_handlers_disconnect_by_func (view->settings,
midori_view_settings_notify_cb, view);
katze_object_assign (view->settings, settings);
if (!settings)
return;
g_object_ref (settings);
g_signal_connect (settings, "notify",
G_CALLBACK (midori_view_settings_notify_cb), view);
g_object_set (view->web_view, "settings", settings, NULL);
g_free (view->download_manager); g_free (view->download_manager);
g_free (view->news_aggregator); g_free (view->news_aggregator);
@ -3281,36 +3332,29 @@ _midori_view_update_settings (MidoriView* view)
} }
/** /**
* midori_view_new_with_uri: * midori_view_new_with_title:
* @uri: an URI string, or %NULL * @uri: an URI string, or %NULL
* @title: a title, or %NULL * @title: a title, or %NULL
* @settings: a #MidoriWebSettings, or %NULL * @settings: a #MidoriWebSettings, or %NULL
* @append: if %TRUE, the view should be appended
* *
* Creates a new view with the specified parameters that * Creates a new view with the specified parameters that
* is visible by default. * is visible by default.
* *
* Return value: a new #MidoriView * Return value: a new #MidoriView
* *
* Since: 0.2.8 * Since: 0.3.0
**/ **/
GtkWidget* GtkWidget*
midori_view_new_with_uri (const gchar* uri, midori_view_new_with_title (const gchar* title,
const gchar* title, MidoriWebSettings* settings,
MidoriWebSettings* settings) gboolean append)
{ {
MidoriView* view = g_object_new (MIDORI_TYPE_VIEW, NULL); MidoriView* view = g_object_new (MIDORI_TYPE_VIEW, "title", title, NULL);
view->title = g_strdup (title);
if (title != NULL)
midori_view_update_title (view);
if (settings) if (settings)
{ _midori_view_set_settings (view, settings);
view->settings = g_object_ref (settings); if (append)
_midori_view_update_settings (view); g_object_set_data (G_OBJECT (view), "midori-view-append", (void*)1);
g_signal_connect (settings, "notify",
G_CALLBACK (midori_view_settings_notify_cb), view);
}
if (uri != NULL)
midori_view_set_uri (view, uri);
gtk_widget_show ((GtkWidget*)view); gtk_widget_show ((GtkWidget*)view);
return (GtkWidget*)view; return (GtkWidget*)view;
} }
@ -3376,25 +3420,12 @@ midori_view_set_settings (MidoriView* view,
MidoriWebSettings* settings) MidoriWebSettings* settings)
{ {
g_return_if_fail (MIDORI_IS_VIEW (view)); g_return_if_fail (MIDORI_IS_VIEW (view));
g_return_if_fail (!settings || MIDORI_IS_WEB_SETTINGS (settings)); g_return_if_fail (MIDORI_IS_WEB_SETTINGS (settings));
if (view->settings == settings) if (view->settings == settings)
return; return;
if (view->settings) _midori_view_set_settings (view, settings);
g_signal_handlers_disconnect_by_func (view->settings,
midori_view_settings_notify_cb, view);
katze_object_assign (view->settings, settings);
if (settings)
{
g_object_ref (settings);
if (view->web_view)
g_object_set (view->web_view, "settings", settings, NULL);
_midori_view_update_settings (view);
g_signal_connect (settings, "notify",
G_CALLBACK (midori_view_settings_notify_cb), view);
}
g_object_notify (G_OBJECT (view), "settings"); g_object_notify (G_OBJECT (view), "settings");
} }
@ -3501,13 +3532,11 @@ midori_view_web_inspector_inspect_web_view_cb (gpointer inspector,
} }
static gboolean static gboolean
midori_view_web_inspector_show_window_cb (gpointer inspector, midori_view_web_inspector_show_window_cb (WebKitWebInspector* inspector,
MidoriView* view) MidoriView* view)
{ {
GtkWidget* inspector_view = katze_object_get_object (inspector, "web-view"); WebKitWebView* inspector_view = webkit_web_inspector_get_web_view (inspector);
GtkWidget* window = gtk_widget_get_toplevel (inspector_view); GtkWidget* window = gtk_widget_get_toplevel (GTK_WIDGET (inspector_view));
g_object_unref (inspector_view);
if (!window) if (!window)
return FALSE; return FALSE;
gtk_window_present (GTK_WINDOW (window)); gtk_window_present (GTK_WINDOW (window));
@ -3518,9 +3547,8 @@ static gboolean
midori_view_web_inspector_attach_window_cb (gpointer inspector, midori_view_web_inspector_attach_window_cb (gpointer inspector,
MidoriView* view) MidoriView* view)
{ {
GtkWidget* inspector_view = katze_object_get_object (inspector, "web-view"); WebKitWebView* inspector_view = webkit_web_inspector_get_web_view (inspector);
g_signal_emit (view, signals[ATTACH_INSPECTOR], 0, inspector_view); g_signal_emit (view, signals[ATTACH_INSPECTOR], 0, inspector_view);
g_object_unref (inspector_view);
return TRUE; return TRUE;
} }
@ -3528,15 +3556,15 @@ static gboolean
midori_view_web_inspector_detach_window_cb (gpointer inspector, midori_view_web_inspector_detach_window_cb (gpointer inspector,
MidoriView* view) MidoriView* view)
{ {
GtkWidget* inspector_view = katze_object_get_object (inspector, "web-view"); WebKitWebView* inspector_view = webkit_web_inspector_get_web_view (inspector);
GtkWidget* parent = gtk_widget_get_parent (inspector_view); GtkWidget* parent = gtk_widget_get_parent (GTK_WIDGET (inspector_view));
g_object_unref (inspector_view);
if (GTK_IS_WINDOW (parent)) if (GTK_IS_WINDOW (parent))
return FALSE; return FALSE;
gtk_widget_hide (parent); gtk_widget_hide (parent);
gtk_container_remove (GTK_CONTAINER (parent), inspector_view); gtk_container_remove (GTK_CONTAINER (parent), GTK_WIDGET (inspector_view));
midori_view_web_inspector_construct_window (inspector, midori_view_web_inspector_construct_window (inspector,
WEBKIT_WEB_VIEW (view->web_view), inspector_view, view); WEBKIT_WEB_VIEW (view->web_view), GTK_WIDGET (inspector_view), view);
return TRUE; return TRUE;
} }
@ -3647,7 +3675,7 @@ midori_view_construct_web_view (MidoriView* view)
gtk_container_add (GTK_CONTAINER (view->scrolled_window), view->web_view); gtk_container_add (GTK_CONTAINER (view->scrolled_window), view->web_view);
gtk_widget_show_all (view->scrolled_window); gtk_widget_show_all (view->scrolled_window);
inspector = katze_object_get_object (view->web_view, "web-inspector"); inspector = webkit_web_view_get_inspector ((WebKitWebView*)view->web_view);
g_object_connect (inspector, g_object_connect (inspector,
"signal::inspect-web-view", "signal::inspect-web-view",
midori_view_web_inspector_inspect_web_view_cb, view, midori_view_web_inspector_inspect_web_view_cb, view,
@ -3658,7 +3686,6 @@ midori_view_construct_web_view (MidoriView* view)
"signal::detach-window", "signal::detach-window",
midori_view_web_inspector_detach_window_cb, view, midori_view_web_inspector_detach_window_cb, view,
NULL); NULL);
g_object_unref (inspector);
} }
/** /**
@ -3666,6 +3693,10 @@ midori_view_construct_web_view (MidoriView* view)
* @view: a #MidoriView * @view: a #MidoriView
* *
* Opens the specified URI in the view. * Opens the specified URI in the view.
*
* Since 0.3.0 a warning is shown if the view is not yet
* contained in a browser. This is because extensions
* can't monitor page loading if that happens.
**/ **/
void void
midori_view_set_uri (MidoriView* view, midori_view_set_uri (MidoriView* view,
@ -3675,14 +3706,15 @@ midori_view_set_uri (MidoriView* view,
g_return_if_fail (MIDORI_IS_VIEW (view)); g_return_if_fail (MIDORI_IS_VIEW (view));
if (!gtk_widget_get_parent (GTK_WIDGET (view)))
g_warning ("Calling %s() before adding the view to a browser. This "
"breaks extensions that monitor page loading.", G_STRFUNC);
/* Treat "about:blank" and "" equally, see midori_view_is_blank(). */ /* Treat "about:blank" and "" equally, see midori_view_is_blank(). */
if (!uri || !strcmp (uri, "about:blank")) uri = ""; if (!uri || !strcmp (uri, "about:blank")) uri = "";
if (g_getenv ("MIDORI_UNARMED") == NULL) if (g_getenv ("MIDORI_UNARMED") == NULL)
{ {
if (!view->web_view)
midori_view_construct_web_view (view);
if (view->speed_dial_in_new_tabs && !strcmp (uri, "")) if (view->speed_dial_in_new_tabs && !strcmp (uri, ""))
{ {
#if !WEBKIT_CHECK_VERSION (1, 1, 14) #if !WEBKIT_CHECK_VERSION (1, 1, 14)
@ -3847,6 +3879,7 @@ midori_view_set_uri (MidoriView* view,
data = g_strdup_printf ( data = g_strdup_printf (
"<html><head><title>about:version</title></head>" "<html><head><title>about:version</title></head>"
"<body><h1>about:version</h1>" "<body><h1>about:version</h1>"
"<p>Version numbers in brackets show the version used at runtime.</p>"
"<img src=\"res://logo-shade.png\" " "<img src=\"res://logo-shade.png\" "
"style=\"position: absolute; right: 15px; bottom: 15px; z-index: -9;\">" "style=\"position: absolute; right: 15px; bottom: 15px; z-index: -9;\">"
"<table>" "<table>"
@ -4227,10 +4260,11 @@ midori_view_tab_label_menu_duplicate_tab_cb (GtkWidget* menuitem,
MidoriView* view) MidoriView* view)
{ {
MidoriNewView where = MIDORI_NEW_VIEW_TAB; MidoriNewView where = MIDORI_NEW_VIEW_TAB;
GtkWidget* new_view = midori_view_new_with_uri ( GtkWidget* new_view = midori_view_new_with_title (
midori_view_get_display_uri (view), NULL, view->settings, FALSE);
NULL, view->settings); const gchar* uri = midori_view_get_display_uri (MIDORI_VIEW (view));
g_signal_emit (view, signals[NEW_VIEW], 0, new_view, where); g_signal_emit (view, signals[NEW_VIEW], 0, new_view, where);
midori_view_set_uri (MIDORI_VIEW (new_view), uri);
} }
static void static void
@ -4331,7 +4365,7 @@ midori_view_get_tab_menu (MidoriView* view)
} }
static gboolean static gboolean
midori_view_tab_label_button_release_event (GtkWidget* tab_label, midori_view_tab_label_button_press_event (GtkWidget* tab_label,
GdkEventButton* event, GdkEventButton* event,
GtkWidget* widget) GtkWidget* widget)
{ {
@ -4564,8 +4598,8 @@ midori_view_get_proxy_tab_label (MidoriView* view)
if (!view->close_buttons_on_tabs) if (!view->close_buttons_on_tabs)
gtk_widget_hide (view->tab_close); gtk_widget_hide (view->tab_close);
g_signal_connect (event_box, "button-release-event", g_signal_connect (event_box, "button-press-event",
G_CALLBACK (midori_view_tab_label_button_release_event), view); G_CALLBACK (midori_view_tab_label_button_press_event), view);
g_signal_connect (view->tab_close, "style-set", g_signal_connect (view->tab_close, "style-set",
G_CALLBACK (midori_view_tab_icon_style_set_cb), NULL); G_CALLBACK (midori_view_tab_icon_style_set_cb), NULL);
g_signal_connect (view->tab_close, "clicked", g_signal_connect (view->tab_close, "clicked",
@ -4666,7 +4700,9 @@ midori_view_can_zoom_in (MidoriView* view)
{ {
g_return_val_if_fail (MIDORI_IS_VIEW (view), FALSE); g_return_val_if_fail (MIDORI_IS_VIEW (view), FALSE);
return view->web_view != NULL && !g_str_has_prefix (view->mime_type, "image/"); return view->web_view != NULL
&& (katze_object_get_boolean (view->settings, "zoom-text-and-images")
|| !g_str_has_prefix (view->mime_type, "image/"));
} }
gboolean gboolean
@ -4674,7 +4710,9 @@ midori_view_can_zoom_out (MidoriView* view)
{ {
g_return_val_if_fail (MIDORI_IS_VIEW (view), FALSE); g_return_val_if_fail (MIDORI_IS_VIEW (view), FALSE);
return view->web_view != NULL && !g_str_has_prefix (view->mime_type, "image/"); return view->web_view != NULL
&& (katze_object_get_boolean (view->settings, "zoom-text-and-images")
|| !g_str_has_prefix (view->mime_type, "image/"));
} }
gboolean gboolean
@ -4907,31 +4945,14 @@ midori_view_print_create_custom_widget_cb (GtkPrintOperation* operation,
box = gtk_vbox_new (FALSE, 0); box = gtk_vbox_new (FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER (box), 4); gtk_container_set_border_width (GTK_CONTAINER (box), 4);
button = gtk_check_button_new (); button = katze_property_proxy (view->settings, "print-backgrounds", NULL);
g_object_set_data (G_OBJECT (operation), "print-backgrounds", button);
gtk_button_set_label (GTK_BUTTON (button), _("Print background images")); gtk_button_set_label (GTK_BUTTON (button), _("Print background images"));
gtk_widget_set_tooltip_text (button, _("Whether background images should be printed")); gtk_widget_set_tooltip_text (button, _("Whether background images should be printed"));
if (katze_object_get_boolean (view->settings, "print-backgrounds"))
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
gtk_widget_show_all (box); gtk_widget_show_all (box);
return box; return box;
} }
static void
midori_view_print_custom_widget_apply_cb (GtkPrintOperation* operation,
GtkWidget* widget,
MidoriView* view)
{
GtkWidget* button;
button = g_object_get_data (G_OBJECT (operation), "print-backgrounds");
g_object_set (view->settings,
"print-backgrounds",
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)),
NULL);
}
#endif #endif
static void static void
@ -4968,8 +4989,6 @@ midori_view_print (MidoriView* view)
#endif #endif
g_signal_connect (operation, "create-custom-widget", g_signal_connect (operation, "create-custom-widget",
G_CALLBACK (midori_view_print_create_custom_widget_cb), view); G_CALLBACK (midori_view_print_create_custom_widget_cb), view);
g_signal_connect (operation, "custom-widget-apply",
G_CALLBACK (midori_view_print_custom_widget_apply_cb), view);
error = NULL; error = NULL;
webkit_web_frame_print_full (frame, operation, webkit_web_frame_print_full (frame, operation,
GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, &error); GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, &error);
@ -5244,7 +5263,7 @@ thumb_view_load_status_cb (MidoriView* thumb_view,
gchar* js; gchar* js;
gsize sz; gsize sz;
if (katze_object_get_enum (thumb_view, "load-status") != MIDORI_LOAD_FINISHED) if (midori_view_get_load_status (thumb_view) != MIDORI_LOAD_FINISHED)
return; return;
gtk_widget_realize (midori_view_get_web_view (MIDORI_VIEW (thumb_view))); gtk_widget_realize (midori_view_get_web_view (MIDORI_VIEW (thumb_view)));
@ -5307,7 +5326,7 @@ midori_view_speed_dial_inject_thumb (MidoriView* view,
if (!view->thumb_view) if (!view->thumb_view)
{ {
view->thumb_view = midori_view_new_with_uri (NULL, NULL, NULL); view->thumb_view = midori_view_new_with_title (NULL, NULL, FALSE);
gtk_container_add (GTK_CONTAINER (notebook), view->thumb_view); gtk_container_add (GTK_CONTAINER (notebook), view->thumb_view);
/* We use an empty label. It's not invisible but at least hard to spot. */ /* We use an empty label. It's not invisible but at least hard to spot. */
label = gtk_event_box_new (); label = gtk_event_box_new ();
@ -5318,7 +5337,7 @@ midori_view_speed_dial_inject_thumb (MidoriView* view,
thumb_view = view->thumb_view; thumb_view = view->thumb_view;
settings = g_object_new (MIDORI_TYPE_WEB_SETTINGS, "enable-scripts", FALSE, settings = g_object_new (MIDORI_TYPE_WEB_SETTINGS, "enable-scripts", FALSE,
"enable-plugins", FALSE, "auto-load-images", TRUE, NULL); "enable-plugins", FALSE, "auto-load-images", TRUE, NULL);
midori_view_set_settings (MIDORI_VIEW (thumb_view), settings); _midori_view_set_settings (MIDORI_VIEW (thumb_view), settings);
g_object_set_data (G_OBJECT (thumb_view), "dom-id", dom_id); g_object_set_data (G_OBJECT (thumb_view), "dom-id", dom_id);
g_signal_connect (thumb_view, "notify::load-status", g_signal_connect (thumb_view, "notify::load-status",

View file

@ -81,9 +81,9 @@ GtkWidget*
midori_view_new (KatzeNet* net); midori_view_new (KatzeNet* net);
GtkWidget* GtkWidget*
midori_view_new_with_uri (const gchar* uri, midori_view_new_with_title (const gchar* title,
const gchar* title, MidoriWebSettings* settings,
MidoriWebSettings* settings); gboolean append);
void void
midori_view_set_settings (MidoriView* view, midori_view_set_settings (MidoriView* view,

View file

@ -151,6 +151,7 @@ enum
PROP_ENABLE_SCRIPTS, PROP_ENABLE_SCRIPTS,
PROP_ENABLE_PLUGINS, PROP_ENABLE_PLUGINS,
PROP_ENABLE_DEVELOPER_EXTRAS, PROP_ENABLE_DEVELOPER_EXTRAS,
PROP_ENABLE_SPELL_CHECKING,
PROP_ENABLE_HTML5_DATABASE, PROP_ENABLE_HTML5_DATABASE,
PROP_ENABLE_HTML5_LOCAL_STORAGE, PROP_ENABLE_HTML5_LOCAL_STORAGE,
PROP_ENABLE_OFFLINE_WEB_APPLICATION_CACHE, PROP_ENABLE_OFFLINE_WEB_APPLICATION_CACHE,
@ -547,7 +548,7 @@ midori_web_settings_class_init (MidoriWebSettingsClass* class)
"toolbar-items", "toolbar-items",
_("Toolbar Items"), _("Toolbar Items"),
_("The items to show on the toolbar"), _("The items to show on the toolbar"),
"TabNew,Back,Forward,Next,ReloadStop,Location,Panel,Search,Trash", "TabNew,Back,Forward,Next,ReloadStop,BookmarkAdd,Location,Search,Trash",
flags)); flags));
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
@ -565,6 +566,8 @@ midori_web_settings_class_init (MidoriWebSettingsClass* class)
* Whether to show the operating controls of the panel. * Whether to show the operating controls of the panel.
* *
* Since: 0.1.9 * Since: 0.1.9
*
* Deprecated: 0.3.0
*/ */
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_SHOW_PANEL_CONTROLS, PROP_SHOW_PANEL_CONTROLS,
@ -681,6 +684,8 @@ midori_web_settings_class_init (MidoriWebSettingsClass* class)
* Note: Only since 0.2.0 is this value actually used. * Note: Only since 0.2.0 is this value actually used.
* *
* Since: 0.1.7 * Since: 0.1.7
*
* Deprecated: 0.3.0
*/ */
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_ASK_FOR_DESTINATION_FOLDER, PROP_ASK_FOR_DESTINATION_FOLDER,
@ -701,6 +706,8 @@ midori_web_settings_class_init (MidoriWebSettingsClass* class)
* Whether to show a notification when a transfer has been completed. * Whether to show a notification when a transfer has been completed.
* *
* Since: 0.1.7 * Since: 0.1.7
*
* Deprecated: 0.3.0
*/ */
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_NOTIFY_TRANSFER_COMPLETED, PROP_NOTIFY_TRANSFER_COMPLETED,
@ -878,6 +885,15 @@ midori_web_settings_class_init (MidoriWebSettingsClass* class)
"Enable special extensions for developers", "Enable special extensions for developers",
TRUE, TRUE,
flags)); flags));
#if WEBKIT_CHECK_VERSION (1, 1, 6)
g_object_class_install_property (gobject_class,
PROP_ENABLE_SPELL_CHECKING,
g_param_spec_boolean ("enable-spell-checking",
_("Enable Spell Checking"),
_("Enable spell checking while typing"),
TRUE,
flags));
#endif
#if WEBKIT_CHECK_VERSION (1, 1, 8) #if WEBKIT_CHECK_VERSION (1, 1, 8)
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_ENABLE_HTML5_DATABASE, PROP_ENABLE_HTML5_DATABASE,
@ -1071,7 +1087,8 @@ midori_web_settings_class_init (MidoriWebSettingsClass* class)
/** /**
* MidoriWebSettings:preferred-languages: * MidoriWebSettings:preferred-languages:
* *
* A comma separated list of languages preferred for rendering multilingual webpages. * A comma separated list of languages preferred for rendering multilingual
* webpages and spell checking.
* *
* Since: 0.2.3 * Since: 0.2.3
*/ */
@ -1438,13 +1455,23 @@ midori_web_settings_set_property (GObject* object,
g_value_get_boolean (value), NULL); g_value_get_boolean (value), NULL);
break; break;
case PROP_ENABLE_PLUGINS: case PROP_ENABLE_PLUGINS:
g_object_set (web_settings, "WebKitWebSettings::enable-plugins", g_object_set (web_settings,
g_value_get_boolean (value), NULL); "WebKitWebSettings::enable-plugins", g_value_get_boolean (value),
#if WEBKIT_CHECK_VERSION (1, 1, 22)
"enable-java-applet", g_value_get_boolean (value),
#endif
NULL);
break; break;
case PROP_ENABLE_DEVELOPER_EXTRAS: case PROP_ENABLE_DEVELOPER_EXTRAS:
g_object_set (web_settings, "WebKitWebSettings::enable-developer-extras", g_object_set (web_settings, "WebKitWebSettings::enable-developer-extras",
g_value_get_boolean (value), NULL); g_value_get_boolean (value), NULL);
break; break;
#if WEBKIT_CHECK_VERSION (1, 1, 6)
case PROP_ENABLE_SPELL_CHECKING:
g_object_set (web_settings, "WebKitWebSettings::enable-spell-checking",
g_value_get_boolean (value), NULL);
break;
#endif
#if WEBKIT_CHECK_VERSION (1, 1, 8) #if WEBKIT_CHECK_VERSION (1, 1, 8)
case PROP_ENABLE_HTML5_DATABASE: case PROP_ENABLE_HTML5_DATABASE:
g_object_set (web_settings, "WebKitWebSettings::enable-html5-database", g_object_set (web_settings, "WebKitWebSettings::enable-html5-database",
@ -1519,6 +1546,10 @@ midori_web_settings_set_property (GObject* object,
break; break;
case PROP_PREFERRED_LANGUAGES: case PROP_PREFERRED_LANGUAGES:
katze_assign (web_settings->http_accept_language, g_value_dup_string (value)); katze_assign (web_settings->http_accept_language, g_value_dup_string (value));
#if WEBKIT_CHECK_VERSION (1, 1, 6)
g_object_set (web_settings, "spell-checking-languages",
web_settings->http_accept_language, NULL);
#endif
break; break;
case PROP_CLEAR_PRIVATE_DATA: case PROP_CLEAR_PRIVATE_DATA:
web_settings->clear_private_data = g_value_get_int (value); web_settings->clear_private_data = g_value_get_int (value);
@ -1686,6 +1717,12 @@ midori_web_settings_get_property (GObject* object,
g_value_set_boolean (value, katze_object_get_boolean (web_settings, g_value_set_boolean (value, katze_object_get_boolean (web_settings,
"WebKitWebSettings::enable-developer-extras")); "WebKitWebSettings::enable-developer-extras"));
break; break;
#if WEBKIT_CHECK_VERSION (1, 1, 6)
case PROP_ENABLE_SPELL_CHECKING:
g_value_set_boolean (value, katze_object_get_boolean (web_settings,
"WebKitWebSettings::enable-spell-checking"));
break;
#endif
#if WEBKIT_CHECK_VERSION (1, 1, 8) #if WEBKIT_CHECK_VERSION (1, 1, 8)
case PROP_ENABLE_HTML5_DATABASE: case PROP_ENABLE_HTML5_DATABASE:
g_value_set_boolean (value, katze_object_get_boolean (web_settings, g_value_set_boolean (value, katze_object_get_boolean (web_settings,

View file

@ -45,31 +45,31 @@ namespace Midori {
public unowned GLib.Object get_proxy_items (); public unowned GLib.Object get_proxy_items ();
[NoAccessorMethod] [NoAccessorMethod]
public Gtk.MenuBar menubar { get; } public Gtk.MenuBar menubar { owned get; }
[NoAccessorMethod] [NoAccessorMethod]
public Gtk.Toolbar navigationbar { get; } public Gtk.Toolbar navigationbar { owned get; }
[NoAccessorMethod] [NoAccessorMethod]
public Gtk.Notebook notebook { get; } public Gtk.Notebook notebook { owned get; }
[NoAccessorMethod] [NoAccessorMethod]
public Gtk.Widget panel { get; } public Gtk.Widget panel { owned get; }
[NoAccessorMethod] [NoAccessorMethod]
public string uri { get; set; } public string uri { owned get; set; }
public Gtk.Widget? tab { get; set; } public Gtk.Widget? tab { get; set; }
[NoAccessorMethod] [NoAccessorMethod]
public uint load_status { get; } public uint load_status { get; }
[NoAccessorMethod] [NoAccessorMethod]
public Gtk.Statusbar statusbar { get; } public Gtk.Statusbar statusbar { owned get; }
[NoAccessorMethod] [NoAccessorMethod]
public string statusbar_text { get; set; } public string statusbar_text { owned get; set; }
public Midori.WebSettings settings { get; set; } public Midori.WebSettings settings { get; set; }
[NoAccessorMethod] [NoAccessorMethod]
public GLib.Object bookmarks { get; set; } public GLib.Object bookmarks { owned get; set; }
[NoAccessorMethod] [NoAccessorMethod]
public GLib.Object trash { get; set; } public GLib.Object trash { owned get; set; }
[NoAccessorMethod] [NoAccessorMethod]
public GLib.Object search_engines { get; set; } public GLib.Object search_engines { owned get; set; }
[NoAccessorMethod] [NoAccessorMethod]
public GLib.Object history { get; set; } public GLib.Object history { owned get; set; }
[NoAccessorMethod] [NoAccessorMethod]
public bool show_tabs { get; set; } public bool show_tabs { get; set; }
@ -107,6 +107,8 @@ namespace Midori {
public class View : Gtk.VBox { public class View : Gtk.VBox {
[CCode (type = "GtkWidget*")] [CCode (type = "GtkWidget*")]
public View (GLib.Object net); public View (GLib.Object net);
public View.with_title (string? title=null, WebSettings? settings=null
, bool append=false);
public void set_uri (string uri); public void set_uri (string uri);
public bool is_blank (); public bool is_blank ();
public unowned string get_display_uri (); public unowned string get_display_uri ();

View file

@ -420,7 +420,8 @@ sokoke_spawn_program (const gchar* command,
g_return_val_if_fail (command != NULL, FALSE); g_return_val_if_fail (command != NULL, FALSE);
g_return_val_if_fail (argument != NULL, FALSE); g_return_val_if_fail (argument != NULL, FALSE);
if (!g_strstr_len (argument, 8, "://")) if (!g_strstr_len (argument, 8, "://")
&& !g_str_has_prefix (argument, "about:"))
{ {
gboolean success; gboolean success;
@ -827,15 +828,22 @@ sokoke_magic_uri (const gchar* uri)
* sokoke_uri_unescape_string: * sokoke_uri_unescape_string:
* @uri: an URI string * @uri: an URI string
* *
* Unescape @uri if needed, and pass through '+'. * Unescape @uri if needed, and pass through '+' and '%20'.
* *
* Return value: a newly allocated URI * Return value: a newly allocated URI
**/ **/
gchar* gchar*
sokoke_uri_unescape_string (const gchar* uri) sokoke_uri_unescape_string (const gchar* uri)
{ {
if (strchr (uri,'%')) if (strchr (uri,'%') || strchr (uri, ' '))
return g_uri_unescape_string (uri, "+"); {
/* Preserve %20 for pasting URLs into other windows */
gchar* unescaped = g_uri_unescape_string (uri, "+");
gchar* spaced = sokoke_replace_variables (unescaped, " ", "%20", NULL);
g_free (unescaped);
return spaced;
}
return g_strdup (uri); return g_strdup (uri);
} }
@ -1101,6 +1109,17 @@ sokoke_on_entry_focus_out_event (GtkEntry* entry,
return FALSE; return FALSE;
} }
static void
sokoke_on_entry_drag_data_received (GtkEntry* entry,
GdkDragContext* drag_context,
gint x,
gint y,
guint timestamp,
gpointer user_data)
{
sokoke_on_entry_focus_in_event (entry, NULL, NULL);
}
void void
sokoke_entry_set_default_text (GtkEntry* entry, sokoke_entry_set_default_text (GtkEntry* entry,
const gchar* default_text) const gchar* default_text)
@ -1115,6 +1134,12 @@ sokoke_entry_set_default_text (GtkEntry* entry,
sokoke_widget_set_pango_font_style (GTK_WIDGET (entry), sokoke_widget_set_pango_font_style (GTK_WIDGET (entry),
PANGO_STYLE_ITALIC); PANGO_STYLE_ITALIC);
gtk_entry_set_text (entry, default_text); gtk_entry_set_text (entry, default_text);
g_signal_connect (entry, "drag-data-received",
G_CALLBACK (sokoke_on_entry_drag_data_received), NULL);
g_signal_connect (entry, "focus-in-event",
G_CALLBACK (sokoke_on_entry_focus_in_event), NULL);
g_signal_connect (entry, "focus-out-event",
G_CALLBACK (sokoke_on_entry_focus_out_event), NULL);
} }
else if (!gtk_widget_has_focus (GTK_WIDGET (entry))) else if (!gtk_widget_has_focus (GTK_WIDGET (entry)))
{ {
@ -1129,10 +1154,6 @@ sokoke_entry_set_default_text (GtkEntry* entry,
} }
g_object_set_data (G_OBJECT (entry), "sokoke_default_text", g_object_set_data (G_OBJECT (entry), "sokoke_default_text",
(gpointer)default_text); (gpointer)default_text);
g_signal_connect (entry, "focus-in-event",
G_CALLBACK (sokoke_on_entry_focus_in_event), NULL);
g_signal_connect (entry, "focus-out-event",
G_CALLBACK (sokoke_on_entry_focus_out_event), NULL);
} }
gchar* gchar*

View file

@ -131,12 +131,13 @@ midori_bookmarks_export_array_db (sqlite3* db,
KatzeArray* root_array; KatzeArray* root_array;
KatzeArray* subarray; KatzeArray* subarray;
KatzeItem* item; KatzeItem* item;
GList* list;
sqlcmd = g_strdup_printf ("SELECT * FROM bookmarks where folder='%s'", folder); sqlcmd = g_strdup_printf ("SELECT * FROM bookmarks where folder='%s'", folder);
root_array = katze_array_from_sqlite (db, sqlcmd); root_array = katze_array_from_sqlite (db, sqlcmd);
g_free (sqlcmd); g_free (sqlcmd);
KATZE_ARRAY_FOREACH_ITEM (item, root_array) KATZE_ARRAY_FOREACH_ITEM_L (item, root_array, list)
{ {
if (KATZE_ITEM_IS_FOLDER (item)) if (KATZE_ITEM_IS_FOLDER (item))
{ {
@ -148,6 +149,7 @@ midori_bookmarks_export_array_db (sqlite3* db,
else else
katze_array_add_item (array, item); katze_array_add_item (array, item);
} }
g_list_free (list);
} }
void void
@ -155,14 +157,16 @@ midori_bookmarks_import_array_db (sqlite3* db,
KatzeArray* array, KatzeArray* array,
const gchar* folder) const gchar* folder)
{ {
GList* list;
KatzeItem* item; KatzeItem* item;
KATZE_ARRAY_FOREACH_ITEM (item, array) KATZE_ARRAY_FOREACH_ITEM_L (item, array, list)
{ {
if (KATZE_IS_ARRAY (item)) if (KATZE_IS_ARRAY (item))
midori_bookmarks_import_array_db (db, KATZE_ARRAY (item), folder); midori_bookmarks_import_array_db (db, KATZE_ARRAY (item), folder);
midori_bookmarks_insert_item_db (db, item, folder); midori_bookmarks_insert_item_db (db, item, folder);
} }
g_list_free (list);
} }
static KatzeArray* static KatzeArray*
@ -240,6 +244,9 @@ midori_bookmarks_insert_item_db (sqlite3* db,
gchar* parent; gchar* parent;
gchar* uri; gchar* uri;
/* Bookmarks must have a name, import may produce invalid items */
g_return_if_fail (katze_item_get_name (item));
if (KATZE_ITEM_IS_BOOKMARK (item)) if (KATZE_ITEM_IS_BOOKMARK (item))
uri = g_strdup (katze_item_get_uri (item)); uri = g_strdup (katze_item_get_uri (item));
else else
@ -275,6 +282,24 @@ midori_bookmarks_insert_item_db (sqlite3* db,
sqlite3_free (sqlcmd); sqlite3_free (sqlcmd);
} }
static void
midori_bookmarks_add_item_cb (KatzeArray* array,
KatzeItem* item,
MidoriBookmarks* bookmarks)
{
GtkTreeModel* model;
model = gtk_tree_view_get_model (GTK_TREE_VIEW (bookmarks->treeview));
if (!g_strcmp0 (katze_item_get_meta_string (item, "folder"), ""))
gtk_tree_store_insert_with_values (GTK_TREE_STORE (model),
NULL, NULL, G_MAXINT, 0, item, -1);
else
{
gtk_tree_store_clear (GTK_TREE_STORE (model));
midori_bookmarks_read_from_db_to_model (bookmarks,
GTK_TREE_STORE (model), NULL, NULL, bookmarks->filter);
}
}
static void static void
midori_bookmarks_remove_item_cb (KatzeArray* array, midori_bookmarks_remove_item_cb (KatzeArray* array,
KatzeItem* item, KatzeItem* item,
@ -286,6 +311,17 @@ midori_bookmarks_remove_item_cb (KatzeArray* array,
GTK_TREE_STORE (model), NULL, NULL, bookmarks->filter); GTK_TREE_STORE (model), NULL, NULL, bookmarks->filter);
} }
static void
midori_bookmarks_update_cb (KatzeArray* array,
MidoriBookmarks* bookmarks)
{
GtkTreeModel* model = gtk_tree_view_get_model (GTK_TREE_VIEW (bookmarks->treeview));
gtk_tree_store_clear (GTK_TREE_STORE (model));
midori_bookmarks_read_from_db_to_model (bookmarks,
GTK_TREE_STORE (model), NULL, NULL, bookmarks->filter);
}
static void static void
midori_bookmarks_row_changed_cb (GtkTreeModel* model, midori_bookmarks_row_changed_cb (GtkTreeModel* model,
GtkTreePath* path, GtkTreePath* path,
@ -318,7 +354,8 @@ midori_bookmarks_row_changed_cb (GtkTreeModel* model,
parent_name = g_strdup (""); parent_name = g_strdup ("");
katze_array_remove_item (bookmarks->array, item); katze_array_remove_item (bookmarks->array, item);
midori_bookmarks_insert_item_db (db, item, parent_name); katze_item_set_meta_string (item, "folder", parent_name);
katze_array_add_item (bookmarks->array, item);
} }
static void static void
@ -393,6 +430,7 @@ midori_bookmarks_get_toolbar (MidoriViewable* viewable)
toolbar = gtk_toolbar_new (); toolbar = gtk_toolbar_new ();
gtk_toolbar_set_icon_size (GTK_TOOLBAR (toolbar), GTK_ICON_SIZE_BUTTON); gtk_toolbar_set_icon_size (GTK_TOOLBAR (toolbar), GTK_ICON_SIZE_BUTTON);
gtk_toolbar_set_show_arrow (GTK_TOOLBAR (toolbar), FALSE);
bookmarks->toolbar = toolbar; bookmarks->toolbar = toolbar;
toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_ADD); toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_ADD);
gtk_widget_set_name (GTK_WIDGET (toolitem), "BookmarkAdd"); gtk_widget_set_name (GTK_WIDGET (toolitem), "BookmarkAdd");
@ -468,11 +506,13 @@ midori_bookmarks_set_app (MidoriBookmarks* bookmarks,
g_object_ref (app); g_object_ref (app);
bookmarks->array = katze_object_get_object (app, "bookmarks"); bookmarks->array = katze_object_get_object (app, "bookmarks");
g_object_set_data (G_OBJECT (bookmarks->array), "treeview", bookmarks->treeview); midori_bookmarks_read_from_db_to_model (bookmarks, GTK_TREE_STORE (model), NULL, "", NULL);
g_signal_connect (bookmarks->array, "add-item",
G_CALLBACK (midori_bookmarks_add_item_cb), bookmarks);
g_signal_connect (bookmarks->array, "remove-item", g_signal_connect (bookmarks->array, "remove-item",
G_CALLBACK (midori_bookmarks_remove_item_cb), bookmarks); G_CALLBACK (midori_bookmarks_remove_item_cb), bookmarks);
g_signal_connect (bookmarks->array, "update",
midori_bookmarks_read_from_db_to_model (bookmarks, GTK_TREE_STORE (model), NULL, "", NULL); G_CALLBACK (midori_bookmarks_update_cb), bookmarks);
g_signal_connect_after (model, "row-changed", g_signal_connect_after (model, "row-changed",
G_CALLBACK (midori_bookmarks_row_changed_cb), G_CALLBACK (midori_bookmarks_row_changed_cb),
bookmarks); bookmarks);
@ -777,23 +817,8 @@ midori_bookmarks_key_release_event_cb (GtkWidget* widget,
GdkEventKey* event, GdkEventKey* event,
MidoriBookmarks* bookmarks) MidoriBookmarks* bookmarks)
{ {
GtkTreeModel* model; if (event->keyval == GDK_Delete)
GtkTreeIter iter; midori_bookmarks_delete_clicked_cb (widget, bookmarks);
if (event->keyval != GDK_Delete)
return FALSE;
if (katze_tree_view_get_selected_iter (GTK_TREE_VIEW (widget), &model, &iter))
{
KatzeItem* item;
KatzeArray* parent;
gtk_tree_model_get (model, &iter, 0, &item, -1);
parent = katze_item_get_parent (item);
katze_array_remove_item (parent, item);
g_object_unref (item);
}
return FALSE; return FALSE;
} }
@ -923,6 +948,7 @@ midori_bookmarks_init (MidoriBookmarks* bookmarks)
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE);
gtk_tree_view_set_tooltip_column (GTK_TREE_VIEW (treeview), 1); gtk_tree_view_set_tooltip_column (GTK_TREE_VIEW (treeview), 1);
column = gtk_tree_view_column_new (); column = gtk_tree_view_column_new ();
gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
renderer_pixbuf = gtk_cell_renderer_pixbuf_new (); renderer_pixbuf = gtk_cell_renderer_pixbuf_new ();
gtk_tree_view_column_pack_start (column, renderer_pixbuf, FALSE); gtk_tree_view_column_pack_start (column, renderer_pixbuf, FALSE);
gtk_tree_view_column_set_cell_data_func (column, renderer_pixbuf, gtk_tree_view_column_set_cell_data_func (column, renderer_pixbuf,

View file

@ -357,6 +357,7 @@ midori_extensions_init (MidoriExtensions* extensions)
G_CALLBACK (midori_extensions_cell_renderer_toggled_cb), extensions); G_CALLBACK (midori_extensions_cell_renderer_toggled_cb), extensions);
gtk_tree_view_append_column (GTK_TREE_VIEW (extensions->treeview), column); gtk_tree_view_append_column (GTK_TREE_VIEW (extensions->treeview), column);
column = gtk_tree_view_column_new (); column = gtk_tree_view_column_new ();
gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
renderer_text = gtk_cell_renderer_text_new (); renderer_text = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_start (column, renderer_text, FALSE); gtk_tree_view_column_pack_start (column, renderer_text, FALSE);
gtk_tree_view_column_set_cell_data_func (column, renderer_text, gtk_tree_view_column_set_cell_data_func (column, renderer_text,

View file

@ -154,25 +154,6 @@ midori_history_format_date (KatzeItem *item)
return sdate; return sdate;
} }
static void
midori_history_clear_db (MidoriHistory* history)
{
gchar* sqlcmd;
sqlite3* db;
char* errmsg = NULL;
db = g_object_get_data (G_OBJECT (history->array), "db");
sqlcmd = sqlite3_mprintf ("DELETE FROM history");
if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) != SQLITE_OK)
{
g_printerr (_("Failed to remove history item: %s\n"), errmsg);
sqlite3_free (errmsg);
}
sqlite3_free (sqlcmd);
}
static void static void
midori_history_remove_item_from_db (MidoriHistory* history, midori_history_remove_item_from_db (MidoriHistory* history,
KatzeItem* item) KatzeItem* item)
@ -231,11 +212,11 @@ midori_history_read_from_db (MidoriHistory* history,
gchar* filterstr; gchar* filterstr;
sqlcmd = "SELECT * FROM (" sqlcmd = "SELECT * FROM ("
" SELECT uri, title, day FROM history" " SELECT uri, title, day, date FROM history"
" WHERE uri LIKE ?1 OR title LIKE ?1 GROUP BY uri " " WHERE uri LIKE ?1 OR title LIKE ?1 GROUP BY uri "
"UNION ALL " "UNION ALL "
" SELECT replace (uri, '%s', keywords) AS uri, " " SELECT replace (uri, '%s', keywords) AS uri, "
" keywords AS title, day FROM search " " keywords AS title, day, 0 AS date FROM search "
" WHERE uri LIKE ?1 OR keywords LIKE ?1 GROUP BY uri " " WHERE uri LIKE ?1 OR keywords LIKE ?1 GROUP BY uri "
") ORDER BY day ASC"; ") ORDER BY day ASC";
result = sqlite3_prepare_v2 (db, sqlcmd, -1, &statement, NULL); result = sqlite3_prepare_v2 (db, sqlcmd, -1, &statement, NULL);
@ -327,7 +308,7 @@ midori_history_clear_clicked_cb (GtkWidget* toolitem,
if (result != GTK_RESPONSE_YES) if (result != GTK_RESPONSE_YES)
return; return;
midori_history_clear_db (history); katze_array_clear (history->array);
} }
static void static void
@ -453,6 +434,14 @@ midori_history_add_item_cb (KatzeArray* array,
0, 0, NULL, -1); 0, 0, NULL, -1);
} }
static void
midori_history_clear_cb (KatzeArray* array,
MidoriHistory* history)
{
GtkTreeView* treeview = GTK_TREE_VIEW (history->treeview);
GtkTreeModel* model = gtk_tree_view_get_model (treeview);
gtk_tree_store_clear (GTK_TREE_STORE (model));
}
static void static void
midori_history_set_app (MidoriHistory* history, midori_history_set_app (MidoriHistory* history,
MidoriApp* app) MidoriApp* app)
@ -463,12 +452,14 @@ midori_history_set_app (MidoriHistory* history,
{ {
g_signal_handlers_disconnect_by_func (history->array, g_signal_handlers_disconnect_by_func (history->array,
midori_history_add_item_cb, history); midori_history_add_item_cb, history);
g_signal_handlers_disconnect_by_func (history->array,
midori_history_clear_cb, history);
katze_object_assign (history->array, NULL); katze_object_assign (history->array, NULL);
model = gtk_tree_view_get_model (GTK_TREE_VIEW (history->treeview)); model = gtk_tree_view_get_model (GTK_TREE_VIEW (history->treeview));
gtk_tree_store_clear (GTK_TREE_STORE (model)); gtk_tree_store_clear (GTK_TREE_STORE (model));
} }
katze_assign (history->app, app); katze_object_assign (history->app, app);
if (!app) if (!app)
return; return;
g_object_ref (app); g_object_ref (app);
@ -476,6 +467,8 @@ midori_history_set_app (MidoriHistory* history,
history->array = katze_object_get_object (app, "history"); history->array = katze_object_get_object (app, "history");
g_signal_connect (history->array, "add-item", g_signal_connect (history->array, "add-item",
G_CALLBACK (midori_history_add_item_cb), history); G_CALLBACK (midori_history_add_item_cb), history);
g_signal_connect (history->array, "clear",
G_CALLBACK (midori_history_clear_cb), history);
model = gtk_tree_view_get_model (GTK_TREE_VIEW (history->treeview)); model = gtk_tree_view_get_model (GTK_TREE_VIEW (history->treeview));
if (history->array) if (history->array)
midori_history_read_from_db_to_model (history, GTK_TREE_STORE (model), NULL, 0, NULL); midori_history_read_from_db_to_model (history, GTK_TREE_STORE (model), NULL, 0, NULL);
@ -948,6 +941,7 @@ midori_history_init (MidoriHistory* history)
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE);
gtk_tree_view_set_tooltip_column (GTK_TREE_VIEW (treeview), 1); gtk_tree_view_set_tooltip_column (GTK_TREE_VIEW (treeview), 1);
column = gtk_tree_view_column_new (); column = gtk_tree_view_column_new ();
gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
renderer_pixbuf = gtk_cell_renderer_pixbuf_new (); renderer_pixbuf = gtk_cell_renderer_pixbuf_new ();
gtk_tree_view_column_pack_start (column, renderer_pixbuf, FALSE); gtk_tree_view_column_pack_start (column, renderer_pixbuf, FALSE);
gtk_tree_view_column_set_cell_data_func (column, renderer_pixbuf, gtk_tree_view_column_set_cell_data_func (column, renderer_pixbuf,
@ -992,6 +986,8 @@ midori_history_finalize (GObject* object)
g_signal_handlers_disconnect_by_func (history->array, g_signal_handlers_disconnect_by_func (history->array,
midori_history_add_item_cb, history); midori_history_add_item_cb, history);
g_signal_handlers_disconnect_by_func (history->array,
midori_history_clear_cb, history);
g_object_unref (history->array); g_object_unref (history->array);
katze_assign (history->filter, NULL); katze_assign (history->filter, NULL);
} }

View file

@ -547,6 +547,7 @@ midori_transfers_init (MidoriTransfers* transfers)
transfers->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (treestore)); transfers->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (treestore));
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (transfers->treeview), FALSE); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (transfers->treeview), FALSE);
column = gtk_tree_view_column_new (); column = gtk_tree_view_column_new ();
gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
renderer_pixbuf = gtk_cell_renderer_pixbuf_new (); renderer_pixbuf = gtk_cell_renderer_pixbuf_new ();
gtk_tree_view_column_pack_start (column, renderer_pixbuf, FALSE); gtk_tree_view_column_pack_start (column, renderer_pixbuf, FALSE);
gtk_tree_view_column_set_cell_data_func (column, renderer_pixbuf, gtk_tree_view_column_set_cell_data_func (column, renderer_pixbuf,

2919
po/ar.po Normal file

File diff suppressed because it is too large Load diff

1683
po/ca.po

File diff suppressed because it is too large Load diff

1108
po/cs.po

File diff suppressed because it is too large Load diff

1222
po/de.po

File diff suppressed because it is too large Load diff

1541
po/el.po

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

1821
po/fi.po

File diff suppressed because it is too large Load diff

707
po/fr.po

File diff suppressed because it is too large Load diff

1465
po/gl.po

File diff suppressed because it is too large Load diff

1600
po/hr.po

File diff suppressed because it is too large Load diff

1658
po/hu.po

File diff suppressed because it is too large Load diff

1617
po/it.po

File diff suppressed because it is too large Load diff

1036
po/ja.po

File diff suppressed because it is too large Load diff

1493
po/ko.po

File diff suppressed because it is too large Load diff

1192
po/lt.po

File diff suppressed because it is too large Load diff

952
po/pl.po

File diff suppressed because it is too large Load diff

1338
po/pt.po

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

1363
po/ru.po

File diff suppressed because it is too large Load diff

1802
po/tr.po

File diff suppressed because it is too large Load diff

1206
po/uk.po

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,157 +0,0 @@
/*
Copyright (C) 2009 Christian Dywan <christian@twotoasts.de>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
See the file COPYING for the full license text.
*/
#if HAVE_CONFIG_H
#include <config.h>
#endif
#include "midori.h"
#include "midori-bookmarks.h"
static void
bookmarks_panel_create (void)
{
MidoriApp* app;
MidoriBookmarks* bookmarks;
gpointer value;
app = g_object_new (MIDORI_TYPE_APP, NULL);
bookmarks = g_object_new (MIDORI_TYPE_BOOKMARKS, NULL);
value = katze_object_get_object (bookmarks, "app");
g_assert (value == NULL);
gtk_widget_destroy (GTK_WIDGET (bookmarks));
bookmarks = g_object_new (MIDORI_TYPE_BOOKMARKS, "app", app, NULL);
value = katze_object_get_object (bookmarks, "app");
g_assert (value == app);
gtk_widget_destroy (GTK_WIDGET (bookmarks));
bookmarks = g_object_new (MIDORI_TYPE_BOOKMARKS, NULL);
g_object_set (bookmarks, "app", app, NULL);
value = katze_object_get_object (bookmarks, "app");
g_assert (value == app);
gtk_widget_destroy (GTK_WIDGET (bookmarks));
}
static KatzeItem*
bookmark_new (const gchar* uri,
const gchar* title)
{
return g_object_new (KATZE_TYPE_ITEM, "uri", uri, "name", title, NULL);
}
static KatzeArray*
folder_new (const gchar* title)
{
KatzeArray* folder;
folder = katze_array_new (KATZE_TYPE_ARRAY);
g_object_set (folder, "name", title, NULL);
return folder;
}
static void
bookmarks_panel_fill (void)
{
MidoriApp* app;
KatzeArray* array;
MidoriBookmarks* bookmarks;
GList* children;
GtkWidget* treeview;
GtkTreeModel* model;
GtkTreeIter iter;
KatzeItem* bookmark;
KatzeArray* folder;
guint n;
gpointer value;
app = g_object_new (MIDORI_TYPE_APP, NULL);
array = katze_array_new (KATZE_TYPE_ARRAY);
g_object_set (app, "bookmarks", array, NULL);
value = katze_object_get_object (app, "bookmarks");
g_assert (value == array);
bookmarks = g_object_new (MIDORI_TYPE_BOOKMARKS, "app", app, NULL);
children = gtk_container_get_children (GTK_CONTAINER (bookmarks));
treeview = g_list_nth_data (children, 0);
g_list_free (children);
g_assert (GTK_IS_TREE_VIEW (treeview));
model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview));
g_assert (GTK_IS_TREE_MODEL (model));
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, 0);
bookmark = bookmark_new ("http://www.example.com", "Example");
katze_array_add_item (array, bookmark);
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, 1);
katze_array_remove_item (array, bookmark);
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, 0);
bookmark = bookmark_new ("http://www.example.com", "Example");
katze_array_add_item (array, bookmark);
folder = folder_new ("Empty");
katze_array_add_item (array, folder);
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, 2);
katze_array_remove_item (array, folder);
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, 1);
folder = folder_new ("Empty");
katze_array_add_item (array, folder);
folder = folder_new ("Kurioses");
katze_array_add_item (array, folder);
bookmark = bookmark_new ("http://www.ende.de", "Das Ende");
katze_array_add_item (folder, bookmark);
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, 3);
folder = folder_new ("Miscellaneous");
katze_array_add_item (array, folder);
gtk_tree_model_iter_nth_child (model, &iter, NULL, 3);
n = gtk_tree_model_iter_n_children (model, &iter);
g_assert_cmpint (n, ==, 0);
bookmark = bookmark_new ("http://thesaurus.reference.com/", "Thesaurus");
katze_array_add_item (folder, bookmark);
n = gtk_tree_model_iter_n_children (model, &iter);
g_assert_cmpint (n, ==, 1);
bookmark = bookmark_new ("http://en.wikipedia.org/", "Wikipedia");
katze_array_add_item (folder, bookmark);
n = gtk_tree_model_iter_n_children (model, &iter);
g_assert_cmpint (n, ==, 2);
katze_array_remove_item (folder, bookmark);
n = gtk_tree_model_iter_n_children (model, &iter);
g_assert_cmpint (n, ==, 1);
katze_array_remove_item (array, folder);
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, 3);
katze_array_add_item (array, folder);
/* katze_array_clear (folder);
n = gtk_tree_model_iter_n_children (model, &iter);
g_assert_cmpint (n, ==, 0); */
katze_array_clear (array);
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, 0);
}
int
main (int argc,
char** argv)
{
/* libSoup uses threads, therefore if WebKit is built with libSoup
or Midori is using it, we need to initialize threads. */
if (!g_thread_supported ()) g_thread_init (NULL);
g_test_init (&argc, &argv, NULL);
gtk_init_check (&argc, &argv);
g_test_add_func ("/bookmarks/panel/create", bookmarks_panel_create);
g_test_add_func ("/bookmarks/panel/fill", bookmarks_panel_fill);
return g_test_run ();
}

View file

@ -39,6 +39,8 @@ browser_create (void)
if (g_strcmp0 (gtk_action_get_name (action), "WindowClose")) if (g_strcmp0 (gtk_action_get_name (action), "WindowClose"))
if (g_strcmp0 (gtk_action_get_name (action), "EncodingCustom")) if (g_strcmp0 (gtk_action_get_name (action), "EncodingCustom"))
if (g_strcmp0 (gtk_action_get_name (action), "AddSpeedDial")) if (g_strcmp0 (gtk_action_get_name (action), "AddSpeedDial"))
if (g_strcmp0 (gtk_action_get_name (action), "PrivateBrowsing"))
if (g_strcmp0 (gtk_action_get_name (action), "AddDesktopShortcut"))
gtk_action_activate (action); gtk_action_activate (action);
actions = g_list_next (actions); actions = g_list_next (actions);
} }

View file

@ -1,328 +0,0 @@
/*
Copyright (C) 2009 Christian Dywan <christian@twotoasts.de>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
See the file COPYING for the full license text.
*/
#if HAVE_CONFIG_H
#include <config.h>
#endif
#include "midori.h"
/* This is a private function */
GtkWidget*
midori_location_action_entry_for_proxy (GtkWidget* proxy);
static const gchar* compare_urls[] = {
"http://en.wikipedia.org/wiki/Foul",
"http://de.wikipedia.org/wiki/Düsseldorf",
"http://de.wikipedia.org/wiki/Düsseldorf",
"http://ja.wikipedia.org/wiki/若井はんじ・けんじ",
"http://www.johannkönig.com",
"http://şøñđëřżēıċħęŋđőmæîņĭśŧşũþėŗ.de",
};
static void
completion_compare (void)
{
const guint runs = 10000;
guint t;
gdouble elapsed = 0.0;
for (t = 0; t < runs; t++)
{
g_test_timer_start ();
guint i, j;
for (i = 0; i < G_N_ELEMENTS (compare_urls); i++)
{
gchar* url = katze_collfold (compare_urls[i]);
for (j = 0; j < G_N_ELEMENTS (compare_urls); j++)
katze_utf8_stristr (compare_urls[i], url);
g_free (url);
}
elapsed += g_test_timer_elapsed ();
}
g_print ("%f seconds for comparison\n", elapsed / runs);
}
typedef struct
{
const gchar* uri;
const gchar* name;
} CompletionItem;
static const CompletionItem items[] = {
{ "http://one.com", "One" },
{ "http://one.com/", "One" }, /* Duplicate */
{ "http://one.com/", "One One" }, /* Duplicate */
{ "http://one.com", "One Two" }, /* Duplicate */
{ "http://two.com", "Two" },
{ "http://three.com", "Three" },
{ "http://one.com/one/", "One off" },
{ "http://four.org", "One" },
{ "https://four.org", "Four" },
{ "ftp://four.org/", "ごオルゴ" },
{ "http://muenchen.de/weißwürste/", "Münchner Weißwürste" }, /* Umlauts */
};
static const guint items_n = 9;
static void
completion_count (void)
{
MidoriLocationAction* action;
GtkWidget* toolitem;
GtkWidget* location_entry;
GtkWidget* entry;
GtkTreeModel* model;
guint n, i;
action = g_object_new (MIDORI_TYPE_LOCATION_ACTION, NULL);
toolitem = gtk_action_create_tool_item (GTK_ACTION (action));
location_entry = midori_location_action_entry_for_proxy (toolitem);
entry = gtk_bin_get_child (GTK_BIN (location_entry));
model = gtk_combo_box_get_model (GTK_COMBO_BOX (location_entry));
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, 0);
midori_location_action_add_item (action, "http://one.com", NULL, "One");
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, 1);
midori_location_action_clear (action);
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, 0);
for (i = 0; i < G_N_ELEMENTS (items); i++)
midori_location_action_add_item (action, items[i].uri,
NULL, items[i].name);
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, items_n);
/* Adding the exact same items again shouldn't increase the total amount */
for (i = 0; i < G_N_ELEMENTS (items); i++)
midori_location_action_add_item (action, items[i].uri,
NULL, items[i].name);
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, items_n);
}
/* Components to construct test addresses, the numbers take into account
how many items minus duplicates are unique. */
static const gchar* protocols[] = {
"http", "https", "ftp"
};
static const guint protocols_n = 3;
static const gchar* subs[] = {
"", "www.", "ww2.", "ftp."
};
static const guint subs_n = 4;
static const gchar* slds[] = {
"one", "two", "four", "six", "seven"/*, "Seven", "SEVEN"*/
};
static const guint slds_n = 5;
static const gchar* tlds[] = {
"com", "org", "net", "de", "co.uk", "com.au"/*, "Com.Au", "COM.AU"*/
};
static const guint tlds_n = 6;
static const gchar* files[] = {
"/", "/index.html", "/img.png", /*"/weißwürste",*/ "/images/"
/*, "/Images", "/IMAGES/"*/
};
static const guint files_n = 4;
static const gchar* inputs[] = {
"http://www.one.com/index", "http://two.de/images", "http://six.com.au/img"/*,
"http://muenchen.de/weißwürste/"*/
};
static const gchar* additions[] = {
"http://www.one.com/invention", "http://two.de/island", "http://six.com.au/ish"
};
static void location_action_fill (MidoriLocationAction* action)
{
guint i, j, k, l, m;
for (i = 0; i < G_N_ELEMENTS (protocols); i++)
for (j = 0; j < G_N_ELEMENTS (subs); j++)
for (k = 0; k < G_N_ELEMENTS (slds); k++)
for (l = 0; l < G_N_ELEMENTS (tlds); l++)
for (m = 0; m < G_N_ELEMENTS (files); m++)
{
gchar* uri = g_strdup_printf ("%s://%s%s.%s%s",
protocols[i], subs[j], slds[k], tlds[l], files[m]);
midori_location_action_add_item (action, uri, NULL, uri);
g_free (uri);
}
}
static void
completion_fill (void)
{
MidoriLocationAction* action;
GtkWidget* toolitem;
GtkWidget* location_entry;
GtkWidget* entry;
GtkTreeModel* model;
guint i, items_added, items_added_effective, n;
gdouble elapsed;
action = g_object_new (MIDORI_TYPE_LOCATION_ACTION, NULL);
toolitem = gtk_action_create_tool_item (GTK_ACTION (action));
location_entry = midori_location_action_entry_for_proxy (toolitem);
entry = gtk_bin_get_child (GTK_BIN (location_entry));
g_print ("...\n");
items_added = G_N_ELEMENTS (protocols) * G_N_ELEMENTS (subs)
* G_N_ELEMENTS (slds) * G_N_ELEMENTS (tlds) * G_N_ELEMENTS (files);
items_added_effective = protocols_n * subs_n * slds_n * tlds_n * files_n;
g_print ("Adding %d items, effectively %d items:\n",
items_added, items_added_effective);
/* Since adding items when the action is frozen is very fast,
we run it 5 times and take the average time. */
elapsed = 0.0;
for (i = 0; i < 5; i++)
{
midori_location_action_clear (action);
midori_location_action_freeze (action);
g_test_timer_start ();
location_action_fill (action);
elapsed += g_test_timer_elapsed ();
midori_location_action_thaw (action);
}
model = gtk_combo_box_get_model (GTK_COMBO_BOX (location_entry));
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, items_added_effective);
g_print ("%f seconds, the action is frozen\n", elapsed / 5.0);
midori_location_action_clear (action);
g_test_timer_start ();
location_action_fill (action);
elapsed = g_test_timer_elapsed ();
model = gtk_combo_box_get_model (GTK_COMBO_BOX (location_entry));
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, items_added_effective);
g_print ("%f seconds, the action updates normally\n", elapsed);
/* We don't clear the action intentionally in order to see
how long adding only duplicates takes. */
g_test_timer_start ();
location_action_fill (action);
elapsed = g_test_timer_elapsed ();
model = gtk_combo_box_get_model (GTK_COMBO_BOX (location_entry));
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, items_added_effective);
g_print ("%f seconds, adding exact duplicates\n", elapsed);
g_print ("...");
}
static guint matches = 0;
static guint matches_expected = 0;
static gboolean
entry_completion_insert_prefix_cb (GtkEntryCompletion* completion,
const gchar* prefix,
MidoriLocationAction* action)
{
GtkWidget* entry = gtk_entry_completion_get_entry (completion);
const gchar* text = gtk_entry_get_text (GTK_ENTRY (entry));
if (!g_strrstr (prefix, text))
g_print ("Match failed, input: %s, result: %s\n",
text, prefix);
g_assert (g_strrstr (prefix, text));
midori_location_action_delete_item_from_uri (action, text);
midori_location_action_add_uri (action, text);
matches++;
return FALSE;
}
static void
completion_match (void)
{
MidoriLocationAction* action;
GtkWidget* toolitem;
GtkWidget* location_entry;
GtkWidget* entry;
GtkEntryCompletion* completion;
guint i;
action = g_object_new (MIDORI_TYPE_LOCATION_ACTION, NULL);
midori_location_action_freeze (action);
location_action_fill (action);
midori_location_action_thaw (action);
toolitem = gtk_action_create_tool_item (GTK_ACTION (action));
location_entry = midori_location_action_entry_for_proxy (toolitem);
entry = gtk_bin_get_child (GTK_BIN (location_entry));
completion = gtk_entry_get_completion (GTK_ENTRY (entry));
g_signal_connect (completion, "insert-prefix",
G_CALLBACK (entry_completion_insert_prefix_cb), action);
gtk_entry_completion_set_inline_completion (completion, TRUE);
gtk_entry_completion_set_popup_single_match (completion, FALSE);
for (i = 0; i < G_N_ELEMENTS (inputs); i++)
{
matches_expected++;
gtk_entry_set_text (GTK_ENTRY (entry), inputs[i]);
gtk_entry_completion_complete (completion);
gtk_entry_completion_insert_prefix (completion);
if (matches != matches_expected)
g_print ("Match failed, input: %s, result: %s\n",
inputs[i], gtk_entry_get_text (GTK_ENTRY (entry)));
g_assert_cmpint (matches, ==, matches_expected);
}
for (i = 0; i < G_N_ELEMENTS (additions); i++)
{
midori_location_action_add_uri (action, additions[i]);
midori_location_action_delete_item_from_uri (action, additions[i]);
midori_location_action_add_uri (action, additions[i]);
}
for (i = 0; i < G_N_ELEMENTS (inputs); i++)
{
matches_expected++;
gtk_entry_set_text (GTK_ENTRY (entry), inputs[i]);
gtk_entry_completion_complete (completion);
gtk_entry_completion_insert_prefix (completion);
if (matches != matches_expected)
g_print ("Match failed, input: %s, result: %s\n",
inputs[i], gtk_entry_get_text (GTK_ENTRY (entry)));
g_assert_cmpint (matches, ==, matches_expected);
}
for (i = 0; i < G_N_ELEMENTS (additions); i++)
{
matches_expected++;
gtk_entry_set_text (GTK_ENTRY (entry), additions[i]);
gtk_entry_completion_complete (completion);
gtk_entry_completion_insert_prefix (completion);
if (matches != matches_expected)
g_print ("Match failed, input: %s, result: %s\n",
additions[i], gtk_entry_get_text (GTK_ENTRY (entry)));
g_assert_cmpint (matches, ==, matches_expected);
}
}
int
main (int argc,
char** argv)
{
/* libSoup uses threads, so we need to initialize threads. */
if (!g_thread_supported ()) g_thread_init (NULL);
g_test_init (&argc, &argv, NULL);
gtk_init_check (&argc, &argv);
g_test_add_func ("/completion/compare", completion_compare);
g_test_add_func ("/completion/count", completion_count);
g_test_add_func ("/completion/fill", completion_fill);
g_test_add_func ("/completion/match", completion_match);
return g_test_run ();
}

View file

@ -172,8 +172,8 @@ extension_activate (gconstpointer data)
{ {
MidoriApp* app = midori_app_new (); MidoriApp* app = midori_app_new ();
MidoriExtension* extension = MIDORI_EXTENSION (data); MidoriExtension* extension = MIDORI_EXTENSION (data);
/* g_signal_emit_by_name (extension, "activate", app); g_signal_emit_by_name (extension, "activate", app);
midori_extension_deactivate (extension); */ midori_extension_deactivate (extension);
g_object_unref (app); g_object_unref (app);
} }
@ -237,6 +237,8 @@ main (int argc,
g_test_init (&argc, &argv, NULL); g_test_init (&argc, &argv, NULL);
gtk_init_check (&argc, &argv); gtk_init_check (&argc, &argv);
if (!g_thread_supported ()) g_thread_init (NULL); if (!g_thread_supported ()) g_thread_init (NULL);
soup_session_add_feature_by_type (webkit_get_default_session (),
SOUP_TYPE_COOKIE_JAR);
g_test_add_func ("/extensions/create", extension_create); g_test_add_func ("/extensions/create", extension_create);
g_test_add_func ("/extensions/settings", extension_settings); g_test_add_func ("/extensions/settings", extension_settings);

View file

@ -1,221 +0,0 @@
/*
Copyright (C) 2009 Christian Dywan <christian@twotoasts.de>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
See the file COPYING for the full license text.
*/
#if HAVE_CONFIG_H
#include <config.h>
#endif
#include "midori.h"
#include "midori-history.h"
#include "sokoke.h"
static void
history_panel_create (void)
{
MidoriApp* app;
MidoriHistory* history;
gpointer value;
app = g_object_new (MIDORI_TYPE_APP, NULL);
history = g_object_new (MIDORI_TYPE_HISTORY, NULL);
value = katze_object_get_object (history, "app");
g_assert (value == NULL);
gtk_widget_destroy (GTK_WIDGET (history));
history = g_object_new (MIDORI_TYPE_HISTORY, "app", app, NULL);
value = katze_object_get_object (history, "app");
g_assert (value == app);
gtk_widget_destroy (GTK_WIDGET (history));
history = g_object_new (MIDORI_TYPE_HISTORY, NULL);
g_object_set (history, "app", app, NULL);
value = katze_object_get_object (history, "app");
g_assert (value == app);
gtk_widget_destroy (GTK_WIDGET (history));
}
static KatzeItem*
bookmark_new (const gchar* uri,
const gchar* title)
{
return g_object_new (KATZE_TYPE_ITEM, "uri", uri, "name", title, NULL);
}
static KatzeArray*
folder_new (const gchar* title)
{
KatzeArray* folder;
folder = katze_array_new (KATZE_TYPE_ARRAY);
g_object_set (folder, "name", title, NULL);
return folder;
}
static void
history_panel_fill (void)
{
MidoriApp* app;
KatzeArray* array;
MidoriHistory* history;
GList* children;
GtkWidget* treeview;
GtkTreeModel* model;
GtkTreeIter iter;
KatzeItem* bookmark;
KatzeArray* folder;
guint n;
gpointer value;
app = g_object_new (MIDORI_TYPE_APP, NULL);
array = katze_array_new (KATZE_TYPE_ARRAY);
g_object_set (app, "history", array, NULL);
value = katze_object_get_object (app, "history");
g_assert (value == array);
history = g_object_new (MIDORI_TYPE_HISTORY, "app", app, NULL);
children = gtk_container_get_children (GTK_CONTAINER (history));
treeview = g_list_nth_data (children, 1);
g_list_free (children);
g_assert (GTK_IS_TREE_VIEW (treeview));
model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview));
g_assert (GTK_IS_TREE_MODEL (model));
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, 0);
bookmark = bookmark_new ("http://www.example.com", "Example");
katze_array_add_item (array, bookmark);
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, 1);
katze_array_remove_item (array, bookmark);
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, 0);
bookmark = bookmark_new ("http://www.example.com", "Example");
katze_array_add_item (array, bookmark);
folder = folder_new ("Empty");
katze_array_add_item (array, folder);
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, 2);
katze_array_remove_item (array, folder);
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, 1);
folder = folder_new ("Empty");
katze_array_add_item (array, folder);
folder = folder_new ("Kurioses");
katze_array_add_item (array, folder);
bookmark = bookmark_new ("http://www.ende.de", "Das Ende");
katze_array_add_item (folder, bookmark);
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, 3);
folder = folder_new ("Miscellaneous");
katze_array_add_item (array, folder);
gtk_tree_model_iter_nth_child (model, &iter, NULL, 3);
n = gtk_tree_model_iter_n_children (model, &iter);
g_assert_cmpint (n, ==, 0);
bookmark = bookmark_new ("http://thesaurus.reference.com/", "Thesaurus");
katze_array_add_item (folder, bookmark);
n = gtk_tree_model_iter_n_children (model, &iter);
g_assert_cmpint (n, ==, 1);
bookmark = bookmark_new ("http://en.wikipedia.org/", "Wikipedia");
katze_array_add_item (folder, bookmark);
n = gtk_tree_model_iter_n_children (model, &iter);
g_assert_cmpint (n, ==, 2);
katze_array_remove_item (folder, bookmark);
n = gtk_tree_model_iter_n_children (model, &iter);
g_assert_cmpint (n, ==, 1);
katze_array_remove_item (array, folder);
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, 3);
katze_array_add_item (array, folder);
/* katze_array_clear (folder);
n = gtk_tree_model_iter_n_children (model, &iter);
g_assert_cmpint (n, ==, 0); */
katze_array_clear (array);
n = gtk_tree_model_iter_n_children (model, NULL);
g_assert_cmpint (n, ==, 0);
}
static void
notify_load_status_cb (GtkWidget* view,
GParamSpec* pspec,
guint* done)
{
MidoriLoadStatus status;
status = midori_view_get_load_status (MIDORI_VIEW (view));
if (*done == 2 && status == MIDORI_LOAD_COMMITTED)
*done = 1;
else if (*done == 1 && status == MIDORI_LOAD_FINISHED)
*done = 0;
}
static void
history_browser_add (void)
{
MidoriBrowser* browser;
MidoriWebSettings* settings;
KatzeArray* array;
GtkWidget* view;
guint done;
KatzeItem* date;
gsize i;
GtkActionGroup* action_group;
GtkAction* action;
browser = midori_browser_new ();
settings = midori_web_settings_new ();
array = katze_array_new (KATZE_TYPE_ARRAY);
g_object_set (browser, "settings", settings, "history", array, NULL);
view = midori_view_new (NULL);
midori_browser_add_tab (browser, view);
midori_view_set_uri (MIDORI_VIEW (view),
"data:text/html;charset=utf-8,<title>Test</title>Test");
g_signal_connect (view, "notify::load-status",
G_CALLBACK (notify_load_status_cb), &done);
done = 2;
while (done)
gtk_main_iteration ();
g_assert_cmpint (katze_array_get_length (array), ==, 1);
date = katze_array_get_nth_item (array, 0);
g_assert_cmpint (katze_array_get_length (KATZE_ARRAY (date)), ==, 1);
i = 0;
gtk_widget_show (view);
midori_browser_set_current_tab (browser, view);
g_assert (midori_browser_get_current_tab (browser) == view);
done = 2;
action_group = midori_browser_get_action_group (browser);
action = gtk_action_group_get_action (action_group, "Location");
midori_location_action_set_uri (MIDORI_LOCATION_ACTION (action),
"data:text/html;charset=utf-8,<title>Test</title>Test");
g_signal_emit_by_name (action, "submit-uri",
"data:text/html;charset=utf-8,<title>Test</title>Test", FALSE);
while (done)
gtk_main_iteration ();
g_assert_cmpint (katze_array_get_length (array), ==, 1);
date = katze_array_get_nth_item (array, 0);
g_assert_cmpint (katze_array_get_length (KATZE_ARRAY (date)), ==, 1);
i = 0;
}
int
main (int argc,
char** argv)
{
/* libSoup uses threads, so we need to initialize threads. */
if (!g_thread_supported ()) g_thread_init (NULL);
g_test_init (&argc, &argv, NULL);
gtk_init_check (&argc, &argv);
sokoke_register_stock_items ();
g_test_add_func ("/history/panel/create", history_panel_create);
g_test_add_func ("/history/panel/fill", history_panel_fill);
g_test_add_func ("/history/browser/add", history_browser_add);
return g_test_run ();
}

View file

@ -161,8 +161,8 @@ static void
magic_uri_search (void) magic_uri_search (void)
{ {
test_input ("sm midori", SM "midori"); test_input ("sm midori", SM "midori");
test_input ("sm cats dogs", SM "cats dogs"); test_input ("sm cats dogs", SM "cats%20dogs");
test_input ("se cats dogs", SM "cats dogs"); test_input ("se cats dogs", SM "cats%20dogs");
test_input ("dict midori", NULL); test_input ("dict midori", NULL);
test_input ("cats", NULL); test_input ("cats", NULL);
test_input ("cats dogs", NULL); test_input ("cats dogs", NULL);
@ -185,9 +185,9 @@ magic_uri_search (void)
test_input ("de.po verbose", NULL); test_input ("de.po verbose", NULL);
test_input ("verbose de.po", NULL); test_input ("verbose de.po", NULL);
test_input ("g de.po verbose", NULL); test_input ("g de.po verbose", NULL);
test_input ("sm de.po verbose", SM "de.po verbose"); test_input ("sm de.po verbose", SM "de.po%20verbose");
test_input ("sm warning: configure /dev/net: virtual", test_input ("sm warning: configure /dev/net: virtual",
SM "warning: configure /dev/net: virtual"); SM "warning:%20configure%20/dev/net:%20virtual");
test_input ("g \"ISO 9001:2000 certified\"", NULL); test_input ("g \"ISO 9001:2000 certified\"", NULL);
test_input ("g conference \"April 2, 7:00 am\"", NULL); test_input ("g conference \"April 2, 7:00 am\"", NULL);
test_input ("max@mustermann.de", NULL); test_input ("max@mustermann.de", NULL);

View file

@ -133,11 +133,14 @@ properties_object_get_set (GObject* object)
G_PARAM_SPEC_ENUM (pspec)->default_value, NULL); G_PARAM_SPEC_ENUM (pspec)->default_value, NULL);
for (k = enum_class->minimum; k < enum_class->maximum; k++) for (k = enum_class->minimum; k < enum_class->maximum; k++)
{ {
GEnumValue* enum_value = g_enum_get_value (enum_class, k); GEnumValue* enum_value;
GEnumValue* enum_value_;
enum_value = g_enum_get_value (enum_class, k);
if (!enum_value) if (!enum_value)
g_error ("%s.%s has no value %d", g_error ("%s.%s has no value %d",
G_OBJECT_TYPE_NAME (object), property, k); G_OBJECT_TYPE_NAME (object), property, k);
GEnumValue* enum_value_ = g_enum_get_value_by_name (enum_class, enum_value_ = g_enum_get_value_by_name (enum_class,
enum_value->value_name); enum_value->value_name);
if (!enum_value) if (!enum_value)
g_error ("%s.%s has no value '%s'", g_error ("%s.%s has no value '%s'",

View file

@ -97,22 +97,29 @@ midori_findbar_case_sensitive (MidoriFindbar* findbar)
} }
void void
midori_findbar_find (MidoriFindbar* findbar, midori_findbar_find_text (MidoriFindbar* findbar,
const gchar* text,
gboolean forward) gboolean forward)
{ {
MidoriBrowser* browser = midori_browser_get_for_widget (GTK_WIDGET (findbar)); MidoriBrowser* browser = midori_browser_get_for_widget (GTK_WIDGET (findbar));
const gchar* text;
gboolean case_sensitive; gboolean case_sensitive;
GtkWidget* view; GtkWidget* view;
if (!(view = midori_browser_get_current_tab (browser))) if (!(view = midori_browser_get_current_tab (browser)))
return; return;
text = gtk_entry_get_text (GTK_ENTRY (findbar->find_text));
case_sensitive = midori_findbar_case_sensitive (findbar); case_sensitive = midori_findbar_case_sensitive (findbar);
midori_view_search_text (MIDORI_VIEW (view), text, case_sensitive, forward); midori_view_search_text (MIDORI_VIEW (view), text, case_sensitive, forward);
} }
void
midori_findbar_find (MidoriFindbar* findbar,
gboolean forward)
{
const gchar* text = gtk_entry_get_text (GTK_ENTRY (findbar->find_text));
midori_findbar_find_text (findbar, text, forward);
}
void void
midori_findbar_invoke (MidoriFindbar* findbar) midori_findbar_invoke (MidoriFindbar* findbar)
{ {
@ -161,20 +168,28 @@ midori_findbar_button_close_clicked_cb (GtkWidget* widget,
} }
static void static void
midori_findbar_text_changed_cb (GtkWidget* entry, midori_findbar_preedit_changed_cb (GtkWidget* entry,
const gchar* preedit,
MidoriFindbar* findbar) MidoriFindbar* findbar)
{ {
if (findbar->find_typing) if (findbar->find_typing)
{ {
MidoriBrowser* browser = midori_browser_get_for_widget (entry); MidoriBrowser* browser = midori_browser_get_for_widget (entry);
GtkWidget* view = midori_browser_get_current_tab (browser); GtkWidget* view = midori_browser_get_current_tab (browser);
const gchar* text = gtk_entry_get_text (GTK_ENTRY (entry));
midori_view_unmark_text_matches (MIDORI_VIEW (view)); midori_view_unmark_text_matches (MIDORI_VIEW (view));
if (g_utf8_strlen (text, -1) > 1) if (g_utf8_strlen (preedit, -1) > 1)
midori_findbar_find (findbar, TRUE); midori_findbar_find_text (findbar, preedit, TRUE);
} }
} }
static void
midori_findbar_text_changed_cb (GtkWidget* entry,
MidoriFindbar* findbar)
{
const gchar* text = gtk_entry_get_text (GTK_ENTRY (entry));
midori_findbar_preedit_changed_cb (entry, text, findbar);
}
static gboolean static gboolean
midori_findbar_text_focus_out_event_cb (GtkWidget* entry, midori_findbar_text_focus_out_event_cb (GtkWidget* entry,
GdkEventFocus* event, GdkEventFocus* event,
@ -227,6 +242,8 @@ midori_findbar_init (MidoriFindbar* findbar)
G_CALLBACK (midori_findbar_entry_clear_icon_released_cb), NULL); G_CALLBACK (midori_findbar_entry_clear_icon_released_cb), NULL);
g_signal_connect (findbar->find_text, "activate", g_signal_connect (findbar->find_text, "activate",
G_CALLBACK (midori_findbar_next_activate_cb), findbar); G_CALLBACK (midori_findbar_next_activate_cb), findbar);
g_signal_connect (findbar->find_text, "preedit-changed",
G_CALLBACK (midori_findbar_preedit_changed_cb), findbar);
g_signal_connect (findbar->find_text, "changed", g_signal_connect (findbar->find_text, "changed",
G_CALLBACK (midori_findbar_text_changed_cb), findbar); G_CALLBACK (midori_findbar_text_changed_cb), findbar);
g_signal_connect (findbar->find_text, "focus-out-event", g_signal_connect (findbar->find_text, "focus-out-event",

View file

@ -42,6 +42,11 @@ void
midori_findbar_find (MidoriFindbar* findbar, midori_findbar_find (MidoriFindbar* findbar,
gboolean forward); gboolean forward);
void
midori_findbar_find_text (MidoriFindbar* findbar,
const gchar* text,
gboolean forward);
void void
midori_findbar_set_can_find (MidoriFindbar* findbar, midori_findbar_set_can_find (MidoriFindbar* findbar,
gboolean can_find); gboolean can_find);

View file

@ -28,8 +28,8 @@ import misc
from Configure import find_program_impl from Configure import find_program_impl
major = 0 major = 0
minor = 2 minor = 3
micro = 9 micro = 0
APPNAME = 'midori' APPNAME = 'midori'
VERSION = str (major) + '.' + str (minor) + '.' + str (micro) VERSION = str (major) + '.' + str (minor) + '.' + str (micro)
@ -161,6 +161,7 @@ def configure (conf):
dirname_default ('DOCDIR', os.path.join (conf.env['MDATADIR'], 'doc')) dirname_default ('DOCDIR', os.path.join (conf.env['MDATADIR'], 'doc'))
if not APPNAME in conf.env['DOCDIR']: if not APPNAME in conf.env['DOCDIR']:
conf.env['DOCDIR'] += '/' + APPNAME conf.env['DOCDIR'] += '/' + APPNAME
conf.define ('DOCDIR', conf.env['DOCDIR'])
if option_enabled ('apidocs'): if option_enabled ('apidocs'):
conf.find_program ('gtkdoc-scan', var='GTKDOC_SCAN') conf.find_program ('gtkdoc-scan', var='GTKDOC_SCAN')
@ -276,7 +277,7 @@ def configure (conf):
conf.define ('PACKAGE_VERSION', VERSION) conf.define ('PACKAGE_VERSION', VERSION)
conf.define ('PACKAGE_NAME', APPNAME) conf.define ('PACKAGE_NAME', APPNAME)
conf.define ('PACKAGE_BUGREPORT', 'http://www.twotoasts.de/bugs') conf.define ('PACKAGE_BUGREPORT', 'https://bugs.launchpad.net/midori')
conf.define ('GETTEXT_PACKAGE', APPNAME) conf.define ('GETTEXT_PACKAGE', APPNAME)
conf.define ('MIDORI_MAJOR_VERSION', major) conf.define ('MIDORI_MAJOR_VERSION', major)
@ -417,7 +418,7 @@ def build (bld):
bld.add_group () bld.add_group ()
if bld.env['docs']: if bld.env['docs']:
bld.install_files ('${DOCDIR}/' + '/', \ bld.install_files ('${DOCDIR}/', \
'AUTHORS COPYING ChangeLog EXPAT README') 'AUTHORS COPYING ChangeLog EXPAT README')
# Install default configuration # Install default configuration