diff --git a/midori/midori-browser.c b/midori/midori-browser.c index 4ceba146..a6d52b81 100644 --- a/midori/midori-browser.c +++ b/midori/midori-browser.c @@ -225,6 +225,8 @@ _midori_browser_update_interface (MidoriBrowser* browser) midori_view_can_find (MIDORI_VIEW (view))); /* _action_set_sensitive (browser, "FindQuick", midori_view_can_find (MIDORI_VIEW (view))); */ + gtk_widget_set_sensitive (GTK_WIDGET (browser->find_highlight), + midori_view_can_find (MIDORI_VIEW (view))); action = gtk_action_group_get_action (browser->action_group, "ReloadStop"); if (!loading) @@ -632,6 +634,29 @@ midori_view_new_window_cb (GtkWidget* view, g_signal_emit (browser, signals[NEW_WINDOW], 0, uri); } +static void +midori_view_search_text_cb (GtkWidget* view, + gboolean found, + MidoriBrowser* browser) +{ + const gchar* text; + gboolean case_sensitive; + gboolean highlight; + + if (GTK_WIDGET_VISIBLE (browser->find)) + { + gtk_icon_entry_set_icon_from_stock (GTK_ICON_ENTRY (browser->find_text), + GTK_ICON_ENTRY_PRIMARY, (found) ? GTK_STOCK_FIND : GTK_STOCK_STOP); + text = gtk_entry_get_text (GTK_ENTRY (browser->find_text)); + case_sensitive = gtk_toggle_tool_button_get_active ( + GTK_TOGGLE_TOOL_BUTTON (browser->find_case)); + midori_view_mark_text_matches (MIDORI_VIEW (view), text, case_sensitive); + highlight = gtk_toggle_tool_button_get_active ( + GTK_TOGGLE_TOOL_BUTTON (browser->find_highlight)); + midori_view_set_highlight_text_matches (MIDORI_VIEW (view), highlight); + } +} + static gboolean midori_browser_tab_destroy_cb (GtkWidget* widget, MidoriBrowser* browser) @@ -723,6 +748,8 @@ _midori_browser_add_tab (MidoriBrowser* browser, midori_view_new_tab_cb, browser, "signal::new-window", midori_view_new_window_cb, browser, + "signal::search-text", + midori_view_search_text_cb, browser, "signal::add-bookmark", midori_view_add_bookmark_cb, browser, NULL); @@ -1235,56 +1262,16 @@ _action_select_all_activate (GtkAction* action, } } -static void -_midori_browser_tab_unmark_text_matches (MidoriBrowser* browser, - GtkWidget* widget) -{ - if (WEBKIT_IS_WEB_VIEW (widget)) - webkit_web_view_unmark_text_matches (WEBKIT_WEB_VIEW (widget)); -} - -static gboolean -_midori_browser_tab_search_text (MidoriBrowser* browser, - GtkWidget* widget, - const gchar* text, - gboolean case_sensitive, - gboolean forward) -{ - if (WEBKIT_IS_WEB_VIEW (widget)) - return webkit_web_view_search_text (WEBKIT_WEB_VIEW (widget), - text, case_sensitive, forward, TRUE); - return FALSE; -} - -static void -_midori_browser_tab_mark_text_matches (MidoriBrowser* browser, - GtkWidget* widget, - const gchar* text, - gboolean case_sensitive) -{ - if (WEBKIT_IS_WEB_VIEW (widget)) - webkit_web_view_mark_text_matches (WEBKIT_WEB_VIEW (widget), - text, case_sensitive, 0); -} - -static void -_midori_browser_tab_set_highlight_text_matches (MidoriBrowser* browser, - GtkWidget* widget, - gboolean highlight) -{ - if (WEBKIT_IS_WEB_VIEW (widget)) - webkit_web_view_set_highlight_text_matches ( - WEBKIT_WEB_VIEW (widget), highlight); -} - static void _action_find_activate (GtkAction* action, MidoriBrowser* browser) { + GtkWidget* view; + if (GTK_WIDGET_VISIBLE (browser->find)) { - GtkWidget* widget = midori_browser_get_current_tab (browser); - _midori_browser_tab_unmark_text_matches (browser, widget); + view = midori_browser_get_current_tab (browser); + midori_view_unmark_text_matches (MIDORI_VIEW (view)); gtk_toggle_tool_button_set_active ( GTK_TOGGLE_TOOL_BUTTON (browser->find_highlight), FALSE); gtk_widget_hide (browser->find); @@ -1303,26 +1290,18 @@ static void _midori_browser_find (MidoriBrowser* browser, gboolean forward) { - const gchar* text = gtk_entry_get_text (GTK_ENTRY (browser->find_text)); - const gboolean case_sensitive = gtk_toggle_tool_button_get_active ( + const gchar* text; + gboolean case_sensitive; + GtkWidget* view; + + text = gtk_entry_get_text (GTK_ENTRY (browser->find_text)); + case_sensitive = gtk_toggle_tool_button_get_active ( GTK_TOGGLE_TOOL_BUTTON (browser->find_case)); - GtkWidget* widget = midori_browser_get_current_tab (browser); + view = midori_browser_get_current_tab (browser); + if (GTK_WIDGET_VISIBLE (browser->find)) - _midori_browser_tab_unmark_text_matches (browser, widget); - gboolean found = _midori_browser_tab_search_text (browser, widget, - text, case_sensitive, forward); - if (GTK_WIDGET_VISIBLE (browser->find)) - { - gtk_icon_entry_set_icon_from_stock (GTK_ICON_ENTRY (browser->find_text), - GTK_ICON_ENTRY_PRIMARY, - (found) ? GTK_STOCK_FIND : GTK_STOCK_STOP); - _midori_browser_tab_mark_text_matches (browser, widget, - text, case_sensitive); - const gboolean highlight = gtk_toggle_tool_button_get_active ( - GTK_TOGGLE_TOOL_BUTTON (browser->find_highlight)); - _midori_browser_tab_set_highlight_text_matches (browser, widget, - highlight); - } + midori_view_unmark_text_matches (MIDORI_VIEW (view)); + midori_view_search_text (MIDORI_VIEW (view), text, case_sensitive, forward); } static void @@ -1343,10 +1322,12 @@ static void _find_highlight_toggled (GtkToggleToolButton* toolitem, MidoriBrowser* browser) { - GtkWidget* widget = midori_browser_get_current_tab (browser); - const gboolean highlight = gtk_toggle_tool_button_get_active (toolitem); - _midori_browser_tab_set_highlight_text_matches (browser, widget, - highlight); + GtkWidget* view; + gboolean highlight; + + view = midori_browser_get_current_tab (browser); + highlight = gtk_toggle_tool_button_get_active (toolitem); + midori_view_set_highlight_text_matches (MIDORI_VIEW (view), highlight); } static void diff --git a/midori/midori-view.c b/midori/midori-view.c index aa17c8dd..b1f57716 100644 --- a/midori/midori-view.c +++ b/midori/midori-view.c @@ -119,6 +119,7 @@ enum { CONSOLE_MESSAGE, NEW_TAB, NEW_WINDOW, + SEARCH_TEXT, ADD_BOOKMARK, LAST_SIGNAL @@ -231,6 +232,17 @@ midori_view_class_init (MidoriViewClass* class) G_TYPE_NONE, 1, G_TYPE_STRING); + signals[SEARCH_TEXT] = g_signal_new ( + "search-text", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST), + 0, + 0, + NULL, + g_cclosure_marshal_VOID__BOOLEAN, + G_TYPE_NONE, 1, + G_TYPE_BOOLEAN); + signals[ADD_BOOKMARK] = g_signal_new ( "add-bookmark", G_TYPE_FROM_CLASS (class), @@ -385,7 +397,6 @@ float_to_str (gfloat in) return out; } - static void send_command (MidoriView* view, const gchar* command, @@ -642,6 +653,16 @@ midori_view_new_window_cb (MidoriView* view, send_command (view, "new-window", uri); } +static void +midori_view_search_text_cb (MidoriView* view, + gboolean found) +{ + if (!midori_view_is_plug (view)) + return; + + send_command (view, "search-text", int_to_str (found)); +} + static void midori_view_add_bookmark_cb (MidoriView* view, const gchar* uri) @@ -708,6 +729,10 @@ receive_status (MidoriView* view, { g_signal_emit (view, signals[NEW_WINDOW], 0, &command[11]); } + else if (!strncmp (command, "search-text ", 12)) + { + g_signal_emit (view, signals[SEARCH_TEXT], 0, atoi (&command[12])); + } else if (!strncmp (command, "add-bookmark ", 13)) { g_signal_emit (view, signals[ADD_BOOKMARK], 0, &command[13]); @@ -749,6 +774,18 @@ receive_command (MidoriView* view, midori_view_go_forward (view); else if (!strncmp (command, "print", 5)) midori_view_print (view); + else if (!strncmp (command, "unmark-matches", 14)) + midori_view_unmark_text_matches (view); + else if (!strncmp (command, "search-text ", 12)) + /* (forward, case_sensitive, text) => (text, case_sensitive, forward) */ + midori_view_search_text (view, &command[16], + atoi (&command[14]), atoi (&command[12])); + else if (!strncmp (command, "mark-matches ", 13)) + /* (case_sensitive, text) => (text, case_sensitive) */ + midori_view_mark_text_matches (view, &command[17], + atoi (&command[15])); + else if (!strncmp (command, "hl-matches ", 11)) + midori_view_set_highlight_text_matches (view, atoi (&command[11])); else if (!strncmp (command, "download-manager ", 17)) { katze_assign (view->download_manager, g_strdup (&command[17])); @@ -1520,6 +1557,8 @@ midori_view_init (MidoriView* view) midori_view_new_tab_cb, NULL, "signal::new-window", midori_view_new_window_cb, NULL, + "signal::search-text", + midori_view_search_text_cb, NULL, "signal::add-bookmark", midori_view_add_bookmark_cb, NULL, NULL); @@ -2498,3 +2537,101 @@ midori_view_print (MidoriView* view) webkit_web_view_execute_script ( WEBKIT_WEB_VIEW (view->web_view), "print();"); } + +/** + * midori_view_unmark_text_matches + * @view: a #MidoriView + * + * Unmarks the text matches in the view. + **/ +void +midori_view_unmark_text_matches (MidoriView* view) +{ + g_return_if_fail (MIDORI_IS_VIEW (view)); + + if (midori_view_is_socket (view)) + send_command (view, "unmark-matches", NULL); + else + webkit_web_view_unmark_text_matches (WEBKIT_WEB_VIEW (view->web_view)); +} + +/** + * midori_view_search_text + * @view: a #MidoriView + * @text: a string + * @case_sensitive: case sensitivity + * @forward: whether to search forward + * + * Searches a text within the view. + **/ +void +midori_view_search_text (MidoriView* view, + const gchar* text, + gboolean case_sensitive, + gboolean forward) +{ + gchar* data; + + g_return_if_fail (MIDORI_IS_VIEW (view)); + + if (midori_view_is_socket (view)) + { + /* (text, case_sensitive, forward) => (forward, case_sensitive, text) */ + data = g_strdup_printf ("%d %d %s", forward, case_sensitive, text); + send_command (view, "search-text", data); + g_free (data); + } + else + g_signal_emit (view, signals[SEARCH_TEXT], 0, + webkit_web_view_search_text (WEBKIT_WEB_VIEW (view->web_view), + text, case_sensitive, forward, TRUE)); +} + +/** + * midori_view_mark_text_matches + * @view: a #MidoriView + * @text: a string + * @case_sensitive: case sensitivity + * + * Marks all text matches within the view. + **/ +void +midori_view_mark_text_matches (MidoriView* view, + const gchar* text, + gboolean case_sensitive) +{ + gchar* data; + + g_return_if_fail (MIDORI_IS_VIEW (view)); + + if (midori_view_is_socket (view)) + { + /* (text, case_sensitive) => (case_sensitive, text) */ + data = g_strdup_printf ("%d %s", case_sensitive, text); + send_command (view, "mark-matches", data); + g_free (data); + } + else + webkit_web_view_mark_text_matches (WEBKIT_WEB_VIEW (view->web_view), + text, case_sensitive, 0); +} + +/** + * midori_view_set_highlight_text_matches + * @view: a #MidoriView + * @highlight: whether to highlight matches + * + * Whether to highlight all matches within the view. + **/ +void +midori_view_set_highlight_text_matches (MidoriView* view, + gboolean highlight) +{ + g_return_if_fail (MIDORI_IS_VIEW (view)); + + if (midori_view_is_socket (view)) + send_command (view, "hl-matches", int_to_str (highlight)); + else + webkit_web_view_set_highlight_text_matches ( + WEBKIT_WEB_VIEW (view->web_view), highlight); +} diff --git a/midori/midori-view.h b/midori/midori-view.h index 96b5d22e..b052266a 100644 --- a/midori/midori-view.h +++ b/midori/midori-view.h @@ -156,6 +156,24 @@ midori_view_can_view_source (MidoriView* view); gboolean midori_view_can_find (MidoriView* view); +void +midori_view_unmark_text_matches (MidoriView* view); + +void +midori_view_search_text (MidoriView* view, + const gchar* text, + gboolean case_sensitive, + gboolean forward); + +void +midori_view_mark_text_matches (MidoriView* view, + const gchar* text, + gboolean case_sensitive); + +void +midori_view_set_highlight_text_matches (MidoriView* view, + gboolean highlight); + G_END_DECLS #endif /* __MIDORI_VIEW_H__ */