/* * Tab body * * Copyright (C) 2017 Patrick McDermott * * This file is part of Marquee. * * Marquee is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Marquee is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Marquee. If not, see . */ #include #include #include #include "tab-body.h" #include "tab.h" static gboolean context_menu_cb(WebKitWebView *web_view, WebKitContextMenu *context_menu, GdkEvent *event, WebKitHitTestResult *hit_test_result, MqTabBody *body) { GList *items; GList *input_items; GList *spell_items; gboolean is_selection; gboolean is_video; WebKitContextMenuAction stock_action; WebKitHitTestResultContext context; gboolean context_handled; /* Get more hints about the context, since WebKit doesn't describe * context very well in hit test results. Also, preserve menu items * that aren't easy to reproduce (e.g. the Unicode menu and spelling * guesses). */ items = webkit_context_menu_get_items(context_menu); input_items = NULL; spell_items = NULL; is_selection = FALSE; is_video = FALSE; for (; items; items = items->next) { stock_action = webkit_context_menu_item_get_stock_action( items->data); #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wswitch" switch (stock_action) { case WEBKIT_CONTEXT_MENU_ACTION_COPY: is_selection = TRUE; break; case WEBKIT_CONTEXT_MENU_ACTION_INPUT_METHODS: case WEBKIT_CONTEXT_MENU_ACTION_UNICODE: input_items = g_list_prepend(input_items, items->data); break; case WEBKIT_CONTEXT_MENU_ACTION_SPELLING_GUESS: case WEBKIT_CONTEXT_MENU_ACTION_NO_GUESSES_FOUND: case WEBKIT_CONTEXT_MENU_ACTION_IGNORE_SPELLING: case WEBKIT_CONTEXT_MENU_ACTION_LEARN_SPELLING: case WEBKIT_CONTEXT_MENU_ACTION_IGNORE_GRAMMAR: spell_items = g_list_prepend(spell_items, items->data); break; case WEBKIT_CONTEXT_MENU_ACTION_OPEN_VIDEO_IN_NEW_WINDOW: case WEBKIT_CONTEXT_MENU_ACTION_COPY_VIDEO_LINK_TO_CLIPBOARD: case WEBKIT_CONTEXT_MENU_ACTION_DOWNLOAD_VIDEO_TO_DISK: is_video = TRUE; break; case WEBKIT_CONTEXT_MENU_ACTION_OPEN_AUDIO_IN_NEW_WINDOW: case WEBKIT_CONTEXT_MENU_ACTION_COPY_AUDIO_LINK_TO_CLIPBOARD: case WEBKIT_CONTEXT_MENU_ACTION_DOWNLOAD_AUDIO_TO_DISK: is_video = FALSE; break; case WEBKIT_CONTEXT_MENU_ACTION_MEDIA_PLAY: case WEBKIT_CONTEXT_MENU_ACTION_MEDIA_PAUSE: break; } #pragma GCC diagnostic pop } context = webkit_hit_test_result_get_context(hit_test_result); context_handled = FALSE; g_print("Context menu, hit test:"); if (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK) { g_print(" link"); context_handled = TRUE; } if (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE) { g_print(" image"); context_handled = TRUE; } if (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA) { if (is_video) { g_print(" video"); context_handled = TRUE; } else { g_print(" audio"); context_handled = TRUE; } } if (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE) { g_print(" editable"); context_handled = TRUE; } if (!context_handled && context & WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT) { if (is_selection) { g_print(" selection"); } else { g_print(" document"); } } g_print("\n"); return FALSE; } MqTabBody * mq_tab_body_new(MqTab *tab, gchar *uri) { MqTabBody *body; body = malloc(sizeof(*body)); body->tab = tab; body->web_view = WEBKIT_WEB_VIEW(webkit_web_view_new()); if (uri) { webkit_web_view_load_uri(body->web_view, uri); } body->container = GTK_WIDGET(body->web_view); gtk_widget_set_vexpand(body->container, TRUE); /* FIXME: This doesn't seem to be working. */ gtk_widget_grab_focus(body->container); g_signal_connect(body->web_view, "context-menu", G_CALLBACK(context_menu_cb), body); return body; } GtkWidget * mq_tab_body_get_container(MqTabBody *body) { return body->container; } WebKitWebView * mq_tab_body_get_web_view(MqTabBody *body) { return body->web_view; }