aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanielle Madeley <danielle.madeley@collabora.co.uk>2011-08-17 13:37:09 +0800
committerDanielle Madeley <danielle.madeley@collabora.co.uk>2011-08-17 13:37:09 +0800
commit1ba7c298c282b4775c29c80214009876e943648d (patch)
tree1c686f02b2c4850ad1214739fe76bf48e807f598
parentede83c3b09c25b9e08c0aa54d842d844b582e0d8 (diff)
downloadgsoc2013-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
-rw-r--r--libempathy-gtk/empathy-theme-adium.c121
-rw-r--r--libempathy-gtk/empathy-webkit-utils.c136
-rw-r--r--libempathy-gtk/empathy-webkit-utils.h6
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