diff options
author | Danielle Madeley <danielle.madeley@collabora.co.uk> | 2011-08-17 13:37:09 +0800 |
---|---|---|
committer | Danielle Madeley <danielle.madeley@collabora.co.uk> | 2011-08-17 13:37:09 +0800 |
commit | 1ba7c298c282b4775c29c80214009876e943648d (patch) | |
tree | 1c686f02b2c4850ad1214739fe76bf48e807f598 /libempathy-gtk | |
parent | ede83c3b09c25b9e08c0aa54d842d844b582e0d8 (diff) | |
download | gsoc2013-empathy-1ba7c298c282b4775c29c80214009876e943648d.tar gsoc2013-empathy-1ba7c298c282b4775c29c80214009876e943648d.tar.gz gsoc2013-empathy-1ba7c298c282b4775c29c80214009876e943648d.tar.bz2 gsoc2013-empathy-1ba7c298c282b4775c29c80214009876e943648d.tar.lz gsoc2013-empathy-1ba7c298c282b4775c29c80214009876e943648d.tar.xz gsoc2013-empathy-1ba7c298c282b4775c29c80214009876e943648d.tar.zst gsoc2013-empathy-1ba7c298c282b4775c29c80214009876e943648d.zip |
Factor out WebKit context menu as a utility
Diffstat (limited to 'libempathy-gtk')
-rw-r--r-- | libempathy-gtk/empathy-theme-adium.c | 121 | ||||
-rw-r--r-- | libempathy-gtk/empathy-webkit-utils.c | 136 | ||||
-rw-r--r-- | libempathy-gtk/empathy-webkit-utils.h | 6 |
3 files changed, 145 insertions, 118 deletions
diff --git a/libempathy-gtk/empathy-theme-adium.c b/libempathy-gtk/empathy-theme-adium.c index e5227f506..4e32630d5 100644 --- a/libempathy-gtk/empathy-theme-adium.c +++ b/libempathy-gtk/empathy-theme-adium.c @@ -212,39 +212,6 @@ theme_adium_navigation_policy_decision_requested_cb (WebKitWebView * return TRUE; } -static void -theme_adium_copy_address_cb (GtkMenuItem *menuitem, - gpointer user_data) -{ - WebKitHitTestResult *hit_test_result = WEBKIT_HIT_TEST_RESULT (user_data); - gchar *uri; - GtkClipboard *clipboard; - - g_object_get (G_OBJECT (hit_test_result), "link-uri", &uri, NULL); - - clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD); - gtk_clipboard_set_text (clipboard, uri, -1); - - clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY); - gtk_clipboard_set_text (clipboard, uri, -1); - - g_free (uri); -} - -static void -theme_adium_open_address_cb (GtkMenuItem *menuitem, - gpointer user_data) -{ - WebKitHitTestResult *hit_test_result = WEBKIT_HIT_TEST_RESULT (user_data); - gchar *uri; - - g_object_get (G_OBJECT (hit_test_result), "link-uri", &uri, NULL); - - empathy_url_show (GTK_WIDGET (menuitem), uri); - - g_free (uri); -} - /* Replace each %@ in format with string passed in args */ static gchar * string_with_format (const gchar *format, @@ -1296,90 +1263,6 @@ theme_adium_message_acknowledged (EmpathyChatView *view, theme_adium_remove_mark_from_message (self, id); } -static void -theme_adium_context_menu_selection_done_cb (GtkMenuShell *menu, gpointer user_data) -{ - WebKitHitTestResult *hit_test_result = WEBKIT_HIT_TEST_RESULT (user_data); - - g_object_unref (hit_test_result); -} - -static void -theme_adium_context_menu_for_event (EmpathyThemeAdium *theme, GdkEventButton *event) -{ - WebKitWebView *view = WEBKIT_WEB_VIEW (theme); - WebKitHitTestResult *hit_test_result; - WebKitHitTestResultContext context; - GtkWidget *menu; - GtkWidget *item; - - hit_test_result = webkit_web_view_get_hit_test_result (view, event); - g_object_get (G_OBJECT (hit_test_result), "context", &context, NULL); - - /* The menu */ - menu = empathy_context_menu_new (GTK_WIDGET (view)); - - /* Select all item */ - item = gtk_image_menu_item_new_from_stock (GTK_STOCK_SELECT_ALL, NULL); - gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item); - - g_signal_connect_swapped (item, "activate", - G_CALLBACK (webkit_web_view_select_all), - view); - - /* Copy menu item */ - if (webkit_web_view_can_copy_clipboard (view)) { - item = gtk_image_menu_item_new_from_stock (GTK_STOCK_COPY, NULL); - gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item); - - g_signal_connect_swapped (item, "activate", - G_CALLBACK (webkit_web_view_copy_clipboard), - view); - } - - /* Clear menu item */ - item = gtk_separator_menu_item_new (); - gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item); - - item = gtk_image_menu_item_new_from_stock (GTK_STOCK_CLEAR, NULL); - gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item); - - g_signal_connect_swapped (item, "activate", - G_CALLBACK (empathy_chat_view_clear), - view); - - /* We will only add the following menu items if we are - * right-clicking a link */ - if (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK) { - /* Separator */ - item = gtk_separator_menu_item_new (); - gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item); - - /* Copy Link Address menu item */ - item = gtk_menu_item_new_with_mnemonic (_("_Copy Link Address")); - g_signal_connect (item, "activate", - G_CALLBACK (theme_adium_copy_address_cb), - hit_test_result); - gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item); - - /* Open Link menu item */ - item = gtk_menu_item_new_with_mnemonic (_("_Open Link")); - g_signal_connect (item, "activate", - G_CALLBACK (theme_adium_open_address_cb), - hit_test_result); - gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item); - } - - g_signal_connect (GTK_MENU_SHELL (menu), "selection-done", - G_CALLBACK (theme_adium_context_menu_selection_done_cb), - hit_test_result); - - /* Display the menu */ - gtk_widget_show_all (menu); - gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, - event->button, event->time); -} - static gboolean theme_adium_button_press_event (GtkWidget *widget, GdkEventButton *event) { @@ -1393,7 +1276,9 @@ theme_adium_button_press_event (GtkWidget *widget, GdkEventButton *event) * item ourselves, so we disable our customized menu * if the developer extras are enabled. */ if (!developer_tools_enabled) { - theme_adium_context_menu_for_event (EMPATHY_THEME_ADIUM (widget), event); + empathy_webkit_context_menu_for_event ( + WEBKIT_WEB_VIEW (widget), event, + EMPATHY_WEBKIT_MENU_CLEAR); return TRUE; } } diff --git a/libempathy-gtk/empathy-webkit-utils.c b/libempathy-gtk/empathy-webkit-utils.c index 827d57e6b..cac9af9d8 100644 --- a/libempathy-gtk/empathy-webkit-utils.c +++ b/libempathy-gtk/empathy-webkit-utils.c @@ -18,8 +18,13 @@ * Authors: Xavier Claessens <xclaesse@gmail.com> */ +#include "config.h" + +#include <glib/gi18n.h> + #include "empathy-webkit-utils.h" #include "empathy-smiley-manager.h" +#include "empathy-ui-utils.h" #define BORING_DPI_DEFAULT 96 @@ -162,3 +167,134 @@ empathy_webkit_bind_font_setting (WebKitWebView *webview, NULL, NULL, NULL); } + +static void +empathy_webkit_copy_address_cb (GtkMenuItem *menuitem, + gpointer user_data) +{ + WebKitHitTestResult *hit_test_result = WEBKIT_HIT_TEST_RESULT (user_data); + gchar *uri; + GtkClipboard *clipboard; + + g_object_get (G_OBJECT (hit_test_result), + "link-uri", &uri, + NULL); + + clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD); + gtk_clipboard_set_text (clipboard, uri, -1); + + clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY); + gtk_clipboard_set_text (clipboard, uri, -1); + + g_free (uri); +} + +static void +empathy_webkit_open_address_cb (GtkMenuItem *menuitem, + gpointer user_data) +{ + WebKitHitTestResult *hit_test_result = WEBKIT_HIT_TEST_RESULT (user_data); + gchar *uri; + + g_object_get (G_OBJECT (hit_test_result), + "link-uri", &uri, + NULL); + + empathy_url_show (GTK_WIDGET (menuitem), uri); + + g_free (uri); +} + +static void +empathy_webkit_context_menu_selection_done_cb (GtkMenuShell *menu, + gpointer user_data) +{ + WebKitHitTestResult *hit_test_result = WEBKIT_HIT_TEST_RESULT (user_data); + + g_object_unref (hit_test_result); +} + +void +empathy_webkit_context_menu_for_event (WebKitWebView *view, + GdkEventButton *event, + EmpathyWebKitMenuFlags flags) +{ + WebKitHitTestResult *hit_test_result; + WebKitHitTestResultContext context; + GtkWidget *menu; + GtkWidget *item; + + hit_test_result = webkit_web_view_get_hit_test_result (view, event); + g_object_get (G_OBJECT (hit_test_result), + "context", &context, + NULL); + + /* The menu */ + menu = empathy_context_menu_new (GTK_WIDGET (view)); + + /* Select all item */ + item = gtk_image_menu_item_new_from_stock (GTK_STOCK_SELECT_ALL, NULL); + gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item); + + g_signal_connect_swapped (item, "activate", + G_CALLBACK (webkit_web_view_select_all), + view); + + /* Copy menu item */ + if (webkit_web_view_can_copy_clipboard (view)) + { + item = gtk_image_menu_item_new_from_stock (GTK_STOCK_COPY, NULL); + gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item); + + g_signal_connect_swapped (item, "activate", + G_CALLBACK (webkit_web_view_copy_clipboard), + view); + } + + /* Clear menu item */ + if (flags & EMPATHY_WEBKIT_MENU_CLEAR) + { + item = gtk_separator_menu_item_new (); + gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item); + + item = gtk_image_menu_item_new_from_stock (GTK_STOCK_CLEAR, NULL); + gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item); + + g_signal_connect_swapped (item, "activate", + G_CALLBACK (empathy_chat_view_clear), + view); + } + + /* We will only add the following menu items if we are + * right-clicking a link */ + if (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK) + { + /* Separator */ + item = gtk_separator_menu_item_new (); + gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item); + + /* Copy Link Address menu item */ + item = gtk_menu_item_new_with_mnemonic (_("_Copy Link Address")); + g_signal_connect (item, "activate", + G_CALLBACK (empathy_webkit_copy_address_cb), + hit_test_result); + gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item); + + /* Open Link menu item */ + item = gtk_menu_item_new_with_mnemonic (_("_Open Link")); + g_signal_connect (item, "activate", + G_CALLBACK (empathy_webkit_open_address_cb), + hit_test_result); + gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item); + } + + g_signal_connect (GTK_MENU_SHELL (menu), "selection-done", + G_CALLBACK (empathy_webkit_context_menu_selection_done_cb), + hit_test_result); + + /* Display the menu */ + gtk_widget_show_all (menu); + gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, + event->button, event->time); +} + diff --git a/libempathy-gtk/empathy-webkit-utils.h b/libempathy-gtk/empathy-webkit-utils.h index 5ba0a840a..322f94c32 100644 --- a/libempathy-gtk/empathy-webkit-utils.h +++ b/libempathy-gtk/empathy-webkit-utils.h @@ -27,9 +27,15 @@ G_BEGIN_DECLS +typedef enum { + EMPATHY_WEBKIT_MENU_CLEAR = 1 << 0, +} EmpathyWebKitMenuFlags; + EmpathyStringParser *empathy_webkit_get_string_parser (gboolean smileys); void empathy_webkit_bind_font_setting (WebKitWebView *webview, GSettings *gsettings, const char *key); +void empathy_webkit_context_menu_for_event (WebKitWebView *view, + GdkEventButton *event, EmpathyWebKitMenuFlags flags); G_END_DECLS |