[empathy: 26/28] Factor out WebKit context menu as a utility



commit 1ba7c298c282b4775c29c80214009876e943648d
Author: Danielle Madeley <danielle madeley collabora co uk>
Date:   Wed Aug 17 15:37:09 2011 +1000

    Factor out WebKit context menu as a utility

 libempathy-gtk/empathy-theme-adium.c  |  121 +----------------------------
 libempathy-gtk/empathy-webkit-utils.c |  136 +++++++++++++++++++++++++++++++++
 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 e5227f5..4e32630 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 827d57e..cac9af9 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 5ba0a84..322f94c 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
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]