diff --git a/src/ghtml-webkit.c b/src/ghtml-webkit.c
index 2325dc6..5943e7a 100644
--- a/src/ghtml-webkit.c
+++ b/src/ghtml-webkit.c
@@ -56,6 +56,10 @@ static void _ghtml_set_status(GtkWidget * widget, char const * status);
/* callbacks */
static gboolean _on_console_message(WebKitWebView * view, const gchar * message,
guint line, const gchar * source, gpointer data);
+#if WEBKIT_CHECK_VERSION(1, 10, 0)
+static gboolean _on_context_menu(WebKitWebView * view, GtkWidget * menu,
+ WebKitHitTestResult * result, gboolean keyboard, gpointer data);
+#endif
static WebKitWebView * _on_create_web_view(WebKitWebView * view,
WebKitWebFrame * frame, gpointer data);
#ifdef WEBKIT_TYPE_DOWNLOAD
@@ -119,6 +123,10 @@ GtkWidget * ghtml_new(Surfer * surfer)
/* view */
g_signal_connect(G_OBJECT(ghtml->view), "console-message", G_CALLBACK(
_on_console_message), widget);
+#if WEBKIT_CHECK_VERSION(1, 10, 0)
+ g_signal_connect(G_OBJECT(ghtml->view), "context-menu", G_CALLBACK(
+ _on_context_menu), widget);
+#endif
g_signal_connect(G_OBJECT(ghtml->view), "create-web-view", G_CALLBACK(
_on_create_web_view), widget);
#ifdef WEBKIT_TYPE_DOWNLOAD
@@ -825,6 +833,175 @@ static gboolean _on_console_message(WebKitWebView * view, const gchar * message,
}
+#if WEBKIT_CHECK_VERSION(1, 10, 0)
+/* on_context_menu */
+static void _context_menu_document(GHtml * ghtml, GtkWidget * menu);
+static void _context_menu_editable(GHtml * ghtml);
+static void _context_menu_image(GHtml * ghtml, GtkWidget * menu);
+static void _context_menu_link(GHtml * ghtml, GtkWidget * menu);
+static void _context_menu_media(GHtml * ghtml);
+static void _context_menu_separator(GtkWidget * menu, gboolean * separator);
+
+static gboolean _on_context_menu(WebKitWebView * view, GtkWidget * menu,
+ WebKitHitTestResult * result, gboolean keyboard, gpointer data)
+{
+ GHtml * ghtml = data;
+ WebKitHitTestResultContext context;
+ gboolean separator = FALSE;
+
+ /* FIXME implement the callbacks */
+ menu = gtk_menu_new();
+ g_object_get(result, "context", &context, NULL);
+ if(context & WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE)
+ {
+ _context_menu_separator(menu, &separator);
+ _context_menu_editable(ghtml);
+ }
+ if(context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK)
+ {
+ _context_menu_separator(menu, &separator);
+ _context_menu_link(ghtml, menu);
+ }
+ if(context & WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT
+ && !(context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK))
+ {
+ _context_menu_separator(menu, &separator);
+ _context_menu_document(ghtml, menu);
+ }
+ if(context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE)
+ {
+ _context_menu_separator(menu, &separator);
+ _context_menu_image(ghtml, menu);
+ }
+ if(context & WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA)
+ {
+ _context_menu_separator(menu, &separator);
+ _context_menu_media(ghtml);
+ }
+ gtk_widget_show_all(menu);
+ gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3,
+ gtk_get_current_event_time());
+ return TRUE;
+}
+
+static void _context_menu_document(GHtml * ghtml, GtkWidget * menu)
+{
+ GtkWidget * menuitem;
+ GtkWidget * image;
+
+ /* back */
+ menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_GO_BACK, NULL);
+ if(!ghtml_can_go_back(ghtml))
+ gtk_widget_set_sensitive(menuitem, FALSE);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+ /* forward */
+ menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_GO_FORWARD,
+ NULL);
+ if(!ghtml_can_go_forward(ghtml))
+ gtk_widget_set_sensitive(menuitem, FALSE);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+ menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_REFRESH, NULL);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+ /* separator */
+ menuitem = gtk_separator_menu_item_new();
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+ /* save page */
+ menuitem = gtk_image_menu_item_new_with_mnemonic(
+ _("_Save page as..."));
+ image = gtk_image_new_from_stock(GTK_STOCK_SAVE_AS, GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+ /* separator */
+ menuitem = gtk_separator_menu_item_new();
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+ /* print */
+ menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_PRINT, NULL);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+ /* separator */
+ menuitem = gtk_separator_menu_item_new();
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+ /* select all */
+ menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_SELECT_ALL,
+ NULL);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+ /* separator */
+ menuitem = gtk_separator_menu_item_new();
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+ menuitem = gtk_image_menu_item_new_with_mnemonic(_("View so_urce"));
+ image = gtk_image_new_from_icon_name("surfer-view-html-source",
+ GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+}
+
+static void _context_menu_editable(GHtml * ghtml)
+{
+ /* FIXME implement */
+}
+
+static void _context_menu_image(GHtml * ghtml, GtkWidget * menu)
+{
+ GtkWidget * menuitem;
+ GtkWidget * image;
+
+ /* view image */
+ menuitem = gtk_image_menu_item_new_with_mnemonic(_("_View image"));
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+ /* save image as */
+ menuitem = gtk_image_menu_item_new_with_mnemonic(
+ _("_Save image as..."));
+ image = gtk_image_new_from_stock(GTK_STOCK_SAVE_AS, GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+}
+
+static void _context_menu_link(GHtml * ghtml, GtkWidget * menu)
+{
+ GtkWidget * menuitem;
+ GtkWidget * image;
+
+ /* open in new tab */
+ menuitem = gtk_image_menu_item_new_with_mnemonic(_("Open in new _tab"));
+ image = gtk_image_new_from_icon_name("tab-new", GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+ /* open in new window */
+ menuitem = gtk_image_menu_item_new_with_mnemonic(
+ _("Open in new _window"));
+ image = gtk_image_new_from_icon_name("window-new", GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+ /* separator */
+ menuitem = gtk_separator_menu_item_new();
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+ /* save link as */
+ menuitem = gtk_image_menu_item_new_with_mnemonic(_("_Save link as..."));
+ image = gtk_image_new_from_stock(GTK_STOCK_SAVE_AS, GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+}
+
+static void _context_menu_media(GHtml * ghtml)
+{
+ /* FIXME implement */
+}
+
+static void _context_menu_separator(GtkWidget * menu, gboolean * separator)
+{
+ GtkWidget * menuitem;
+
+ if(*separator == FALSE)
+ {
+ *separator = TRUE;
+ return;
+ }
+ menuitem = gtk_separator_menu_item_new();
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+ *separator = TRUE;
+}
+#endif
+
+
/* on_create_web_view */
static WebKitWebView * _on_create_web_view(WebKitWebView * view,
WebKitWebFrame * frame, gpointer data)