555
midori_view_notify_uri_cb (GtkWidget* view,
560
midori_view_notify_uri_cb (GtkWidget* widget,
556
561
GParamSpec* pspec,
557
562
MidoriBrowser* browser)
559
if (view == midori_browser_get_current_tab (browser))
564
if (widget == midori_browser_get_current_tab (browser))
561
const gchar* uri = midori_view_get_display_uri (MIDORI_VIEW (view));
566
MidoriView* view = MIDORI_VIEW (widget);
567
const gchar* uri = midori_view_get_display_uri (view);
562
568
GtkAction* action = _action_by_name (browser, "Location");
563
569
midori_location_action_set_text (MIDORI_LOCATION_ACTION (action), uri);
570
_action_set_sensitive (browser, "Back", midori_view_can_go_back (view));
571
_action_set_sensitive (browser, "Forward", midori_view_can_go_forward (view));
576
midori_browser_set_title (MidoriBrowser* browser,
579
#if WEBKIT_CHECK_VERSION (1, 1, 2)
580
if (katze_object_get_boolean (browser->settings, "enable-private-browsing"))
582
gchar* window_title = g_strconcat (title, " - ",
583
g_get_application_name (), NULL);
584
gtk_window_set_title (GTK_WINDOW (browser), window_title);
585
g_free (window_title);
589
gtk_window_set_title (GTK_WINDOW (browser), title);
589
611
!g_str_has_prefix (proxy_uri, "about:") &&
590
612
(katze_item_get_meta_integer (proxy, "history-step") == -1))
592
midori_browser_new_history_item (browser, proxy);
593
katze_item_set_meta_integer (proxy, "history-step", 1);
614
if (!katze_item_get_meta_boolean (proxy, "dont-write-history"))
616
midori_browser_new_history_item (browser, proxy);
617
katze_item_set_meta_integer (proxy, "history-step", 1);
595
620
else if (katze_item_get_name (proxy) &&
596
621
!g_str_has_prefix (proxy_uri, "about:") &&
605
630
if (widget == midori_browser_get_current_tab (browser))
631
midori_browser_set_title (browser, title);
635
midori_view_notify_minimized_cb (GtkWidget* widget,
637
MidoriBrowser* browser)
639
if (katze_object_get_boolean (widget, "minimized"))
607
window_title = g_strconcat (title, " - ",
608
g_get_application_name (), NULL);
609
gtk_window_set_title (GTK_WINDOW (browser), window_title);
610
g_free (window_title);
641
GtkNotebook* notebook = GTK_NOTEBOOK (browser->notebook);
642
GtkWidget* label = gtk_notebook_get_tab_label (notebook, widget);
643
gtk_widget_set_size_request (label, -1, -1);
646
_midori_browser_update_notebook (browser);
640
midori_browser_edit_bookmark_uri_changed_cb (GtkEntry* entry,
643
const gchar* uri = gtk_entry_get_text (entry);
644
gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_ACCEPT,
645
uri && (g_str_has_prefix (uri, "http://")
646
|| g_str_has_prefix (uri, "https://")
647
|| g_str_has_prefix (uri, "file://")
648
|| g_str_has_prefix (uri, "data:")
649
|| g_str_has_prefix (uri, "javascript:")));
653
675
midori_browser_edit_bookmark_title_changed_cb (GtkEntry* entry,
654
676
GtkDialog* dialog)
769
791
label = gtk_label_new_with_mnemonic (_("_Address:"));
770
792
gtk_size_group_add_widget (sizegroup, label);
771
793
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
772
entry_uri = gtk_entry_new ();
794
entry_uri = katze_uri_entry_new (
795
#if GTK_CHECK_VERSION (2, 20, 0)
796
gtk_dialog_get_widget_for_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT));
774
801
HildonGtkInputMode mode = hildon_gtk_entry_get_input_mode (GTK_ENTRY (entry_uri));
775
802
mode &= ~HILDON_GTK_INPUT_MODE_AUTOCAP;
778
805
gtk_entry_set_activates_default (GTK_ENTRY (entry_uri), TRUE);
779
806
gtk_entry_set_text (GTK_ENTRY (entry_uri), katze_item_get_uri (bookmark));
780
midori_browser_edit_bookmark_uri_changed_cb (GTK_ENTRY (entry_uri),
781
GTK_DIALOG (dialog));
782
g_signal_connect (entry_uri, "changed",
783
G_CALLBACK (midori_browser_edit_bookmark_uri_changed_cb), dialog);
784
807
gtk_box_pack_start (GTK_BOX (hbox), entry_uri, TRUE, TRUE, 0);
785
808
gtk_container_add (GTK_CONTAINER (content_area), hbox);
786
809
gtk_widget_show_all (hbox);
1099
midori_browser_speed_dial_get_next_free_slot (void)
1122
midori_browser_speed_dial_get_next_free_slot (MidoriView* view)
1102
GMatchInfo* match_info;
1103
gchar* speed_dial_body;
1105
gchar* slot_id = NULL;
1107
body_fname = g_build_filename (sokoke_set_config_dir (NULL),
1108
"speeddial.json", NULL);
1110
if (g_access (body_fname, F_OK) != 0)
1124
MidoriBrowser* browser = midori_browser_get_for_widget (GTK_WIDGET (view));
1126
guint cols, rows, slot = 1;
1128
g_object_get (browser, "speed-dial", &key_file, NULL);
1129
rows = g_key_file_get_integer (key_file, "settings", "rows", NULL);
1130
cols = g_key_file_get_integer (key_file, "settings", "columns", NULL);
1131
while (slot <= cols * rows)
1112
gchar* filename = g_build_filename ("midori", "res", "speeddial.json", NULL);
1113
gchar* filepath = sokoke_find_data_filename (filename);
1115
if (g_file_get_contents (filepath, &speed_dial_body, NULL, NULL))
1133
gchar* dial_id = g_strdup_printf ("Dial %d", slot);
1134
if (!g_key_file_has_group (key_file, dial_id))
1117
g_file_set_contents (body_fname, speed_dial_body, -1, NULL);
1119
g_free (speed_dial_body);
1137
return g_strdup_printf ("s%d", slot);
1122
g_free (body_fname);
1123
return g_strdup ("s1");
1126
g_file_get_contents (body_fname, &speed_dial_body, NULL, NULL);
1128
regex = g_regex_new ("\"id\":\"(s[0-9]{1,2})\",\"href\":\"#\"",
1129
G_REGEX_MULTILINE, 0, NULL);
1131
if (g_regex_match (regex, speed_dial_body, 0, &match_info))
1133
slot_id = g_match_info_fetch (match_info, 1);
1134
g_match_info_free (match_info);
1137
if (!g_strcmp0 (slot_id, ""))
1140
g_free (body_fname);
1141
g_free (speed_dial_body);
1148
1146
midori_browser_add_speed_dial (MidoriBrowser* browser)
1150
1148
GdkPixbuf* img;
1151
gchar* replace_from;
1155
1149
GtkWidget* view = midori_browser_get_current_tab (browser);
1157
1150
gchar* uri = g_strdup (midori_view_get_display_uri (MIDORI_VIEW (view)));
1158
1151
gchar* title = g_strdup (midori_view_get_display_title (MIDORI_VIEW (view)));
1159
gchar* slot_id = midori_browser_speed_dial_get_next_free_slot ();
1161
GRegex* reg_quotes = g_regex_new ("'", 0, 0, NULL);
1162
GRegex* reg_others = g_regex_new ("[\\\"\\\\]", 0, 0, NULL);
1163
gchar* temp_title = g_regex_replace_literal (reg_others, title,
1164
-1, 0, " ", 0, NULL);
1166
title = g_regex_replace_literal (reg_quotes, temp_title, -1, 0,
1169
g_free (temp_title);
1170
g_regex_unref (reg_quotes);
1171
g_regex_unref (reg_others);
1152
gchar* slot_id = midori_browser_speed_dial_get_next_free_slot (MIDORI_VIEW (view));
1173
1154
if (slot_id == NULL)
1180
if ((len = g_utf8_strlen (title, -1)) > 15)
1183
* The case when a quote was escaped with a backslash and the
1184
* backslash becomes the last character of the ellipsized string.
1185
* This causes JSON parsing to fail.
1186
* For example: "My Foo Bar \'b\..."
1188
GRegex* reg_unsafe = g_regex_new ("([\\\\]+\\.)", 0, 0, NULL);
1191
gchar* ellipsized = g_malloc0 ( len + 1);
1193
g_utf8_strncpy (ellipsized, title, 15);
1196
temp = g_strdup_printf ("%s...", ellipsized);
1197
g_free (ellipsized);
1199
title = g_regex_replace_literal (reg_unsafe, temp, -1, 0, ".", 0, NULL);
1202
g_regex_unref (reg_unsafe);
1205
1161
if ((img = midori_view_get_snapshot (MIDORI_VIEW (view), 240, 160)))
1209
gchar* file_content;
1211
gchar* speed_dial_body;
1215
body_fname = g_build_filename (sokoke_set_config_dir (NULL),
1216
"speeddial.json", NULL);
1218
if (g_file_get_contents (body_fname, &speed_dial_body, NULL, NULL))
1222
gdk_pixbuf_save_to_buffer (img, &file_content, &sz, "png", NULL, NULL);
1223
encoded = g_base64_encode ((guchar *)file_content, sz);
1225
replace_from = g_strdup_printf (
1226
"\\{\"id\":\"%s\",\"href\":\"#\",\"title\":\"\",\"img\":\"\"\\}",
1228
replace_by = g_strdup_printf (
1229
"{\"id\":\"%s\",\"href\":\"%s\",\"title\":\"%s\",\"img\":\"%s\"}",
1230
slot_id, uri, title, encoded);
1232
regex = g_regex_new (replace_from, G_REGEX_MULTILINE, 0, NULL);
1233
replace = g_regex_replace (regex, speed_dial_body, -1,
1234
1, replace_by, 0, NULL);
1236
g_file_set_contents (body_fname, replace, -1, NULL);
1239
while ((view = gtk_notebook_get_nth_page (GTK_NOTEBOOK (
1240
browser->notebook), i++)))
1241
if (midori_view_is_blank (MIDORI_VIEW (view)))
1242
midori_view_reload (MIDORI_VIEW (view), FALSE);
1244
g_object_unref (img);
1245
g_regex_unref (regex);
1247
g_free (file_content);
1248
g_free (speed_dial_body);
1249
g_free (replace_from);
1250
g_free (replace_by);
1253
g_free (body_fname);
1165
gchar* dial_id = g_strdup_printf ("Dial %s", slot_id + 1);
1166
gchar* config_file = g_build_filename (sokoke_set_config_dir (NULL),
1168
gchar* file_path = sokoke_build_thumbnail_path (uri);
1169
gchar* thumb_dir = g_build_path (G_DIR_SEPARATOR_S, g_get_user_cache_dir (),
1170
PACKAGE_NAME, "thumbnails", NULL);
1171
g_object_get (browser, "speed-dial", &key_file, NULL);
1173
g_key_file_set_string (key_file, dial_id, "uri", uri);
1174
g_key_file_set_string (key_file, dial_id, "title", title);
1176
if (!g_file_test (thumb_dir, G_FILE_TEST_EXISTS))
1177
katze_mkdir_with_parents (thumb_dir, 0700);
1179
gdk_pixbuf_save (img, file_path, "png", NULL, "compression", "7", NULL);
1180
sokoke_key_file_save_to_file (key_file, config_file, NULL);
1183
while ((view = gtk_notebook_get_nth_page (GTK_NOTEBOOK (
1184
browser->notebook), i++)))
1185
if (midori_view_is_blank (MIDORI_VIEW (view)))
1186
midori_view_reload (MIDORI_VIEW (view), FALSE);
1189
g_object_unref (img);
1192
g_free (config_file);
1256
1197
g_free (slot_id);
1378
1333
if (where != MIDORI_NEW_VIEW_BACKGROUND)
1379
1334
midori_browser_set_current_page (browser, n);
1337
if (!user_initiated)
1339
GdkWindow* window = gtk_widget_get_window (GTK_WIDGET (browser));
1340
GdkWindowState state = gdk_window_get_state (window);
1341
if ((state | GDK_WINDOW_STATE_MAXIMIZED)
1342
|| (state | GDK_WINDOW_STATE_FULLSCREEN))
1344
if (where == MIDORI_NEW_VIEW_WINDOW)
1345
g_signal_emit (browser, signals[SEND_NOTIFICATION], 0,
1346
_("New Window"), _("A new window has been opened"));
1347
else if (!browser->show_tabs)
1348
g_signal_emit (browser, signals[SEND_NOTIFICATION], 0,
1349
_("New Tab"), _("A new tab has been opened"));
1383
1354
#if WEBKIT_CHECK_VERSION (1, 1, 3)
1509
_midori_browser_update_notebook (MidoriBrowser* browser)
1513
gint n = gtk_notebook_get_n_pages (GTK_NOTEBOOK(browser->notebook));
1514
const gint max_size = 150;
1515
const gint min_size = 32;
1516
GtkAllocation notebook_size;
1518
gtk_widget_get_allocation (browser->notebook, ¬ebook_size);
1519
if (n > 0) new_size = notebook_size.width / n - 7;
1520
if (new_size < min_size) new_size = min_size;
1521
if (new_size > max_size) new_size = max_size;
1523
for (i = 0; i < n; i++)
1527
view = gtk_notebook_get_nth_page (GTK_NOTEBOOK(browser->notebook), i);
1528
label = gtk_notebook_get_tab_label (GTK_NOTEBOOK(browser->notebook), view);
1529
/* Don't resize empty bin, which is used for thumbnail tabs */
1530
if (GTK_IS_BIN (label) && gtk_bin_get_child (GTK_BIN (label))
1531
&& !katze_object_get_boolean (view, "minimized"))
1532
gtk_widget_set_size_request (label, new_size, -1);
1541
1537
_midori_browser_add_tab (MidoriBrowser* browser,
1542
1538
GtkWidget* view)
1659
1659
GdkEventKey* event)
1661
1661
GtkWindow* window = GTK_WINDOW (widget);
1662
MidoriBrowser* browser = MIDORI_BROWSER (widget);
1662
1663
GtkWidgetClass* widget_class;
1663
1664
guint clean_state;
1666
/* Interpret Ctrl(+Shift)+Tab as tab switching for compatibility */
1667
if (midori_browser_get_nth_tab (browser, 1) != NULL
1668
&& event->keyval == GDK_Tab
1669
&& (event->state & GDK_CONTROL_MASK))
1671
gtk_action_activate (_action_by_name (browser, "TabNext"));
1674
else if (event->keyval == GDK_ISO_Left_Tab
1675
&& (event->state & GDK_CONTROL_MASK)
1676
&& (event->state & GDK_SHIFT_MASK))
1678
gtk_action_activate (_action_by_name (browser, "TabPrevious"));
1681
/* Interpret F5 as reloading for compatibility */
1682
else if (event->keyval == GDK_F5)
1684
gtk_action_activate (_action_by_name (browser, "Reload"));
1688
if (gtk_window_get_focus (GTK_WINDOW (widget)) == NULL)
1689
gtk_widget_grab_focus (midori_browser_get_current_tab (MIDORI_BROWSER (widget)));
1665
1691
if (event->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK))
1666
1692
if (sokoke_window_activate_key (window, event))
1742
1775
G_TYPE_NONE, 1,
1743
1776
GTK_TYPE_WIDGET);
1779
* MidoriBrowser::move-tab:
1780
* @browser: the object on which the signal is emitted
1781
* @notebook: the notebook containing the tabs
1782
* @cur_pos: the current position of the tab
1783
* @new_pos: the new position of the tab
1785
* Emitted when a tab is moved.
1789
signals[MOVE_TAB] = g_signal_new (
1791
G_TYPE_FROM_CLASS (class),
1792
(GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
1796
midori_cclosure_marshal_VOID__OBJECT_INT_INT,
1798
GTK_TYPE_NOTEBOOK, G_TYPE_INT, G_TYPE_INT);
1745
1800
signals[ACTIVATE_ACTION] = g_signal_new (
1746
1801
"activate-action",
1747
1802
G_TYPE_FROM_CLASS (class),
1845
1919
g_cclosure_marshal_VOID__VOID,
1846
1920
G_TYPE_NONE, 0);
1923
* MidoriBrowser::show-preferences:
1924
* @browser: the object on which the signal is emitted
1925
* @preferences: the #KatzePreferences to populate
1927
* Emitted when a preference dialogue displayed, to allow
1928
* adding of a new page, to be used sparingly.
1932
signals[SHOW_PREFERENCES] = g_signal_new (
1934
G_TYPE_FROM_CLASS (class),
1935
(GSignalFlags)(G_SIGNAL_RUN_LAST),
1939
g_cclosure_marshal_VOID__OBJECT,
1941
KATZE_TYPE_PREFERENCES);
1848
1943
class->add_tab = _midori_browser_add_tab;
1849
1944
class->remove_tab = _midori_browser_remove_tab;
1850
1945
class->activate_action = _midori_browser_activate_action;
3529
3668
new_uri = sokoke_search_uri (search_uri, keywords);
3532
day = sokoke_time_t_to_julian (&now);
3534
db = g_object_get_data (G_OBJECT (browser->history), "db");
3670
if (browser->history != NULL)
3537
const gchar* sqlcmd;
3538
sqlcmd = "INSERT INTO search (keywords, uri, day) VALUES (?,?,?)";
3539
sqlite3_prepare_v2 (db, sqlcmd, strlen (sqlcmd) + 1, &statement, NULL);
3541
sqlite3_bind_text (statement, 1, keywords, -1, 0);
3542
sqlite3_bind_text (statement, 2, search_uri, -1, 0);
3543
sqlite3_bind_int64 (statement, 3, day);
3545
if (sqlite3_step (statement) != SQLITE_DONE)
3546
g_printerr (_("Failed to insert new history item: %s\n"),
3672
time_t now = time (NULL);
3673
gint64 day = sokoke_time_t_to_julian (&now);
3674
sqlite3* db = g_object_get_data (G_OBJECT (browser->history), "db");
3675
static sqlite3_stmt* statement = NULL;
3679
const gchar* sqlcmd;
3680
sqlcmd = "INSERT INTO search (keywords, uri, day) VALUES (?,?,?)";
3681
sqlite3_prepare_v2 (db, sqlcmd, strlen (sqlcmd) + 1, &statement, NULL);
3683
sqlite3_bind_text (statement, 1, keywords, -1, 0);
3684
sqlite3_bind_text (statement, 2, search_uri, -1, 0);
3685
sqlite3_bind_int64 (statement, 3, day);
3687
if (sqlite3_step (statement) != SQLITE_DONE)
3688
g_printerr (_("Failed to insert new history item: %s\n"),
3547
3689
sqlite3_errmsg (db));
3548
sqlite3_reset (statement);
3549
if (sqlite3_step (statement) == SQLITE_DONE)
3550
sqlite3_clear_bindings (statement);
3690
sqlite3_reset (statement);
3691
if (sqlite3_step (statement) == SQLITE_DONE)
3692
sqlite3_clear_bindings (statement);
3552
3695
g_free (keywords);
4514
_action_tab_move_backward_activate (GtkAction* action,
4515
MidoriBrowser* browser)
4518
gint cur_pos = gtk_notebook_get_current_page (GTK_NOTEBOOK (browser->notebook));
4519
GtkWidget* widget = gtk_notebook_get_nth_page (GTK_NOTEBOOK (browser->notebook), cur_pos);
4521
new_pos = cur_pos - 1;
4523
new_pos = gtk_notebook_get_n_pages (GTK_NOTEBOOK (browser->notebook)) - 1;
4524
gtk_notebook_reorder_child (GTK_NOTEBOOK (browser->notebook), widget, new_pos);
4525
g_signal_emit (browser, signals[MOVE_TAB], 0, browser->notebook, cur_pos, new_pos);
4529
_action_tab_move_forward_activate (GtkAction* action,
4530
MidoriBrowser* browser)
4533
gint cur_pos = gtk_notebook_get_current_page (GTK_NOTEBOOK (browser->notebook));
4534
GtkWidget* widget = gtk_notebook_get_nth_page (GTK_NOTEBOOK (browser->notebook), cur_pos);
4535
if (cur_pos == (gtk_notebook_get_n_pages (GTK_NOTEBOOK (browser->notebook)) - 1))
4538
new_pos = cur_pos + 1;
4539
gtk_notebook_reorder_child (GTK_NOTEBOOK (browser->notebook), widget, new_pos);
4540
g_signal_emit (browser, signals[MOVE_TAB], 0, browser->notebook, cur_pos, new_pos);
4374
4544
_action_tab_previous_activate (GtkAction* action,
4375
4545
MidoriBrowser* browser)
4516
4693
action_name = gtk_action_get_name (action);
4517
if (!strncmp ("HelpContents", action_name, 12))
4694
if (!strncmp ("HelpFAQ", action_name, 7))
4519
4696
#ifdef G_OS_WIN32
4522
gchar* path = sokoke_find_data_filename ("doc/midori/user/midori.html");
4699
gchar* path = sokoke_find_data_filename ("doc/midori/faq.html");
4523
4700
uri = free_uri = g_filename_to_uri (path, NULL, NULL);
4524
4701
if (g_access (path, F_OK) != 0)
4526
if (g_access (DOCDIR "/user/midori.html", F_OK) == 0)
4527
uri = "file://" DOCDIR "/user/midori.html";
4703
if (g_access (DOCDIR "/faq.html", F_OK) == 0)
4704
uri = "file://" DOCDIR "/faq.html";
4530
uri = "error:nodocs share/doc/midori/user/midori.html";
4707
uri = "error:nodocs share/doc/midori/faq.html";
4588
4763
(GSourceFunc)midori_browser_panel_timeout, hpaned, NULL);
4767
midori_panel_cycle_child_focus_cb (GtkWidget* hpaned,
4769
MidoriBrowser* browser)
4771
/* Default cycle goes between all GtkPaned widgets.
4772
If focus is in the panel, focus the location as if it's a paned.
4773
If nothing is focussed, simply go to the location.
4774
Be sure to suppress the default because the signal can recurse. */
4775
GtkWidget* focus = gtk_window_get_focus (GTK_WINDOW (browser));
4776
if (gtk_widget_get_ancestor (focus, MIDORI_TYPE_PANEL)
4777
|| !gtk_widget_get_ancestor (focus, GTK_TYPE_PANED))
4779
g_signal_stop_emission_by_name (hpaned, "cycle-child-focus");
4780
gtk_action_activate (_action_by_name (browser, "Location"));
4592
4787
midori_panel_notify_page_cb (MidoriPanel* panel,
4593
4788
GParamSpec* pspec,
4707
4900
uri = g_object_get_data (G_OBJECT (widget), "midori-browser-typed-text");
4709
4902
uri = midori_view_get_display_uri (view);
4903
midori_browser_set_title (browser, midori_view_get_display_title (view));
4710
4904
action = _action_by_name (browser, "Location");
4711
4905
midori_location_action_set_text (MIDORI_LOCATION_ACTION (action), uri);
4712
4906
midori_location_action_set_icon (MIDORI_LOCATION_ACTION (action),
4713
4907
midori_view_get_icon (view));
4715
title = midori_view_get_display_title (view);
4716
window_title = g_strconcat (title, " - ", g_get_application_name (), NULL);
4717
gtk_window_set_title (GTK_WINDOW (browser), window_title);
4718
g_free (window_title);
4720
4909
if (browser->proxy_array)
4721
4910
katze_item_set_meta_integer (KATZE_ITEM (browser->proxy_array), "current",
4722
4911
midori_browser_get_current_page (browser));
4723
g_object_freeze_notify (G_OBJECT (browser));
4724
g_object_notify (G_OBJECT (browser), "uri");
4725
4912
g_object_notify (G_OBJECT (browser), "tab");
4726
g_object_thaw_notify (G_OBJECT (browser));
4728
4914
_midori_browser_set_statusbar_text (browser, NULL);
4729
4915
_midori_browser_update_interface (browser);
4739
4925
KatzeItem* item = midori_view_get_proxy_item (view);
4740
4926
katze_array_move_item (browser->proxy_array, item, page_num);
4742
g_object_freeze_notify (G_OBJECT (browser));
4743
g_object_notify (G_OBJECT (browser), "uri");
4744
4927
g_object_notify (G_OBJECT (browser), "tab");
4745
g_object_thaw_notify (G_OBJECT (browser));
4931
midori_browser_notebook_reorder_tab_cb (GtkNotebook* notebook,
4932
GtkDirectionType arg1,
4936
g_signal_stop_emission_by_name (notebook, "reorder-tab");
4941
midori_browser_switch_tab_cb (GtkWidget* menuitem,
4942
MidoriBrowser* browser)
4944
gint page = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menuitem), "index"));
4945
midori_browser_set_current_page (browser, page);
4748
4948
static gboolean
4967
else if (event->type == GDK_BUTTON_PRESS && event->button == 3)
4969
GtkWidget* menu = gtk_menu_new ();
4970
GList* tabs = gtk_container_get_children (GTK_CONTAINER (notebook));
4971
GtkWidget* menuitem = sokoke_action_create_popup_menu_item (
4972
gtk_action_group_get_action (browser->action_group, "TabNew"));
4974
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4975
menuitem = sokoke_action_create_popup_menu_item (
4976
gtk_action_group_get_action (browser->action_group, "UndoTabClose"));
4977
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4978
menuitem = gtk_separator_menu_item_new ();
4979
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4980
for (; tabs != NULL; tabs = g_list_next (tabs))
4982
const gchar* title = midori_view_get_display_title (tabs->data);
4983
menuitem = katze_image_menu_item_new_ellipsized (title);
4984
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem),
4985
gtk_image_new_from_pixbuf (midori_view_get_icon (tabs->data)));
4986
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4987
g_object_set_data (G_OBJECT (menuitem), "index", GINT_TO_POINTER (i));
4988
g_signal_connect (menuitem, "activate",
4989
G_CALLBACK (midori_browser_switch_tab_cb), browser);
4993
gtk_widget_show_all (menu);
4994
katze_widget_popup (GTK_WIDGET (notebook), GTK_MENU (menu), NULL,
4995
KATZE_MENU_POSITION_CURSOR);
4845
5075
NULL, "<Ctrl>p",
4846
5076
N_("Print the current page"), G_CALLBACK (_action_print_activate) },
4847
5077
{ "Quit", GTK_STOCK_QUIT,
4849
N_("Quit the application"), G_CALLBACK (_action_quit_activate) },
5078
N_("Close a_ll Windows"), "<Ctrl><Shift>q",
5079
N_("Close all open windows"), G_CALLBACK (_action_quit_activate) },
4851
5081
{ "Edit", NULL, N_("_Edit"), NULL, NULL, G_CALLBACK (_action_edit_activate) },
4852
5082
#if WEBKIT_CHECK_VERSION (1, 1, 14)
4913
5143
{ "SourceView", NULL,
4914
5144
N_("View So_urce"), "<Ctrl><Alt>U",
4915
5145
N_("View the source code of the page"), G_CALLBACK (_action_source_view_activate) },
5146
#if WEBKIT_CHECK_VERSION (1, 1, 6)
5147
{ "CaretBrowsing", NULL,
5148
N_("Ca_ret Browsing"), "F7",
5149
N_("Toggle text cursor navigation"), G_CALLBACK (_action_caret_browsing_activate) },
4916
5151
{ "Fullscreen", GTK_STOCK_FULLSCREEN,
4918
5153
N_("Toggle fullscreen view"), G_CALLBACK (_action_fullscreen_activate) },
4989
5224
{ "TabNext", GTK_STOCK_GO_FORWARD,
4990
5225
N_("_Next Tab"), "<Ctrl>Page_Down",
4991
5226
N_("Switch to the next tab"), G_CALLBACK (_action_tab_next_activate) },
5227
{ "TabMoveBackward", NULL, N_("Move Tab _Backward"), "<Ctrl><Shift>Page_Up",
5228
N_("Move tab behind the previous tab"), G_CALLBACK (_action_tab_move_backward_activate) },
5229
{ "TabMoveForward", NULL, N_("_Move Tab Forward"), "<Ctrl><Shift>Page_Down",
5230
N_("Move tab in front of the next tab"), G_CALLBACK (_action_tab_move_forward_activate) },
4992
5231
{ "TabCurrent", NULL,
4993
5232
N_("Focus _Current Tab"), "<Ctrl>Home",
4994
5233
N_("Focus the current tab"), G_CALLBACK (_action_tab_current_activate) },
5235
N_("Focus _Next view"), "F6",
5236
N_("Cycle focus between views"), G_CALLBACK (_action_next_view_activate) },
4995
5237
{ "TabMinimize", NULL,
4996
5238
N_("Only show the Icon of the _Current Tab"), "",
4997
5239
N_("Only show the icon of the current tab"), G_CALLBACK (_action_tab_minimize_activate) },
5006
5248
N_("Open the tabs saved in the last session"), NULL },
5008
5250
{ "Help", NULL, N_("_Help") },
5009
{ "HelpContents", GTK_STOCK_HELP,
5010
N_("_Contents"), "F1",
5011
N_("Show the documentation"), G_CALLBACK (_action_help_link_activate) },
5013
N_("_Frequent Questions"), NULL,
5251
{ "HelpFAQ", GTK_STOCK_HELP,
5252
N_("_Frequent Questions"), "F1",
5014
5253
N_("Show the Frequently Asked Questions"), G_CALLBACK (_action_help_link_activate) },
5015
5254
{ "HelpBugs", NULL,
5016
N_("_Report a Bug"), NULL,
5255
N_("_Report a Problem..."), NULL,
5017
5256
N_("Open Midori's bug tracker"), G_CALLBACK (_action_help_link_activate) },
5018
5257
{ "About", GTK_STOCK_ABOUT,
5168
5415
/* Destroy panel first, so panels don't need special care */
5169
5416
gtk_widget_destroy (browser->panel);
5170
5417
/* Destroy tabs second, so child widgets don't need special care */
5418
g_signal_handlers_disconnect_by_func (browser->notebook,
5419
midori_browser_notebook_reorder_tab_cb,
5421
g_signal_handlers_disconnect_by_func (browser->notebook,
5422
gtk_notebook_size_allocated_cb,
5171
5424
gtk_container_foreach (GTK_CONTAINER (browser->notebook),
5172
5425
(GtkCallback) gtk_widget_destroy, NULL);
5570
5823
gtk_ui_manager_insert_action_group (ui_manager, browser->action_group, 0);
5572
5825
g_object_set_data (G_OBJECT (accel_group), "midori-browser", browser);
5826
accel_closure = g_cclosure_new (G_CALLBACK (
5827
midori_browser_accel_switch_tab_activate_cb), browser, NULL);
5573
5828
for (i = 0; i < 10; i++)
5575
5830
gchar* accel_path = g_strdup_printf ("<Manual>/Browser/SwitchTab%d", i);
5576
GClosure* closure = g_cclosure_new (
5577
G_CALLBACK (midori_browser_accel_switch_tab_activate_cb),
5579
5831
gtk_accel_map_add_entry (accel_path, GDK_0 + i, GDK_MOD1_MASK);
5580
gtk_accel_group_connect_by_path (accel_group, accel_path, closure);
5832
gtk_accel_group_connect_by_path (accel_group, accel_path, accel_closure);
5581
5833
g_free (accel_path);
5835
g_closure_unref (accel_closure);
5585
5838
if (!gtk_ui_manager_add_ui_from_string (ui_manager, ui_markup, -1, &error))
5886
6140
g_signal_connect (browser->notebook, "page-reordered",
5887
6141
G_CALLBACK (midori_browser_notebook_page_reordered_cb),
6143
g_signal_connect (browser->notebook, "size-allocate",
6144
G_CALLBACK (gtk_notebook_size_allocated_cb),
5889
6146
g_signal_connect_after (browser->notebook, "button-press-event",
5890
6147
G_CALLBACK (midori_browser_notebook_button_press_event_after_cb),
6149
g_signal_connect (browser->notebook, "reorder-tab",
6150
G_CALLBACK (midori_browser_notebook_reorder_tab_cb), NULL);
5892
6151
gtk_widget_show (browser->notebook);
5894
6153
/* Inspector container */
6120
6380
"show-bookmarkbar", &show_bookmarkbar,
6121
6381
"show-panel", &show_panel,
6122
6382
"show-statusbar", &browser->show_statusbar,
6123
"speed-dial-in-new-tabs", &browser->speed_dial_in_new_tabs,
6124
6383
"toolbar-style", &toolbar_style,
6125
6384
"toolbar-items", &toolbar_items,
6126
"last-web-search", &last_web_search,
6127
6385
"location-entry-search", &browser->location_entry_search,
6128
6386
"close-buttons-on-tabs", &close_buttons_on_tabs,
6129
6387
"maximum-history-age", &browser->maximum_history_age,
6714
6970
title = katze_item_get_name (item);
6715
6971
view = midori_view_new_with_title (title, browser->settings,
6716
6972
g_object_get_data (G_OBJECT (item), "midori-view-append") ? TRUE : FALSE);
6974
proxy_item = midori_view_get_proxy_item (MIDORI_VIEW (view));
6976
if (katze_item_get_meta_boolean (item, "dont-write-history"))
6977
katze_item_set_meta_integer (proxy_item, "dont-write-history", 1);
6717
6979
page = midori_browser_add_tab (browser, view);
6719
6981
/* Blank pages should not be delayed */
6720
6982
if (katze_item_get_meta_integer (item, "delay") > 0
6721
&& strcmp (uri, "about:blank") != 0)
6983
&& strcmp (uri, "about:blank") != 0
6984
&& strncmp (uri, "pause:", 6) != 0)
6723
6986
gchar* new_uri = g_strdup_printf ("pause:%s", uri);
6724
6987
midori_view_set_uri (MIDORI_VIEW (view), new_uri);
6791
7054
g_return_if_fail (name != NULL);
6793
7056
_action_set_visible (browser, name, visible);
7057
_action_set_sensitive (browser, name, visible);
7061
* midori_browser_block_action:
7062
* @browser: a #MidoriBrowser
7063
* @name: the action to be blocked
7065
* Blocks built-in behavior of the specified action without
7066
* disabling it, which gives you a chance to connect your
7067
* own signal handling.
7068
* Call midori_browser_unblock_action() to undo the effect.
7073
midori_browser_block_action (MidoriBrowser* browser,
7079
g_return_if_fail (MIDORI_IS_BROWSER (browser));
7080
g_return_if_fail (GTK_IS_ACTION (action));
7082
name = gtk_action_get_name (action);
7083
for (i = 0; i < entries_n; i++)
7084
if (g_str_equal (entries[i].name, name))
7086
g_signal_handlers_block_by_func (action, entries[i].callback, browser);
7089
g_critical ("%s: Action \"%s\" can't be blocked.", G_STRFUNC, name);
7093
* midori_browser_unblock_action:
7094
* @browser: a #MidoriBrowser
7095
* @name: the action to be unblocked
7097
* Restores built-in behavior of the specified action after
7098
* previously blocking it with midori_browser_block_action().
7103
midori_browser_unblock_action (MidoriBrowser* browser,
7109
g_return_if_fail (MIDORI_IS_BROWSER (browser));
7110
g_return_if_fail (GTK_IS_ACTION (action));
7112
name = gtk_action_get_name (action);
7113
for (i = 0; i < entries_n; i++)
7114
if (g_str_equal (entries[i].name, name))
7116
g_signal_handlers_unblock_by_func (action, entries[i].callback, browser);
7119
g_critical ("%s: Action \"%s\" can't be unblocked.", G_STRFUNC, name);
6797
7124
* midori_browser_get_action_group: