Как изменить контекстное меню WebKit? - PullRequest
0 голосов
/ 30 апреля 2019

Я разрабатываю небольшое приложение. Я хотел бы изменить контекстное меню по умолчанию веб-просмотра WebKit. В частности, я хотел бы

  • заблокировать / скрыть контекстное меню
  • добавить пункт в контекстное меню
  • удалить пункт из контекстного меню
  • удалить все элементы из контекстного меню

Я ищу решения для

  • Python 2 и WebKit
  • Python 3 и WebKit2

Python 2 и WebKit

Что работает:

  • заблокировать / скрыть контекстное меню
  • добавить элемент в контекстное меню

Что не работает:

  • удалить элемент из контекстного меню
  • удалить все элементы из контекстного меню

Код:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from gi.repository import Gtk, WebKit

class MyWindow(Gtk.Window):

    def __init__(self, *args):

        Gtk.Window.__init__(self, title="test")

        self.wv = WebKit.WebView()
        self.add(self.wv)

        # add item
        def append_item(webview, context_menu, hit_result_event, event):
            option = Gtk.ImageMenuItem('Extra')
            context_menu.append(option)
            option.show()

        # select case, change this to "1", "2" etc.
        x = 0

        # block/hide context menu
        if x == 1:
            settings = self.wv.get_settings()
            settings.set_property('enable-default-context-menu', False)
        # add item
        elif x == 2:
            self.wv.connect('context-menu', append_item)
        # remove item
        # ???
        # remove all items
        # ???

win = MyWindow()
win.show_all()
Gtk.main()

Python 3 и WebKit2

Что работает:

  • заблокировать / скрыть контекстное меню
  • добавить элемент в контекстное меню
  • удалить все элементы из контекстного меню

Что не работает:

  • удалить элемент из контекстного меню
  • значки в контекстном меню (значки не отображаются)

Код:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import gi
gi.require_version('Gtk', '3.0')
gi.require_version('WebKit2', '4.0')
from gi.repository import Gtk, Gdk, WebKit2

class MyWindow(Gtk.Window):

    def __init__(self, *args):

        Gtk.Window.__init__(self, title="test")

        self.wv = WebKit2.WebView()
        self.add(self.wv)

        # block/hide context menu
        def context_menu_block(self, event, case):
            # right-click
            if case == "button":
                if event.button == 3:
                    return True
            # keyboard
            elif case == "key":
                state = event.state
                shift = (state & Gdk.ModifierType.SHIFT_MASK)
                # menu key
                if event.keyval == 65383:
                    return True
                # shift & F10
                elif shift and event.keyval == 65479:
                    return True

        # add item
        def append_item(webview, context_menu, hit_result_event, event):
            action = Gtk.Action("FileNewStandard", "_New", "Create a new file", Gtk.STOCK_NEW)
            option = WebKit2.ContextMenuItem().new(action)
            context_menu.append(option)

        # remove all items
        def remove_all_items(webview, context_menu, hit_result_event, event):
            context_menu.remove_all()

        # select case, change this to "1", "2" etc.
        x = 0

        # block/hide context menu
        if x == 1:
            self.wv.connect('button-press-event', context_menu_block, "button")
            self.wv.connect('key-press-event', context_menu_block, "key")
        # add item
        elif x == 2:
            self.wv.connect('context-menu', append_item)
        # remove item
        # ???
        # remove all items
        elif x == 3:
            self.wv.connect('context-menu', remove_all_items)

win = MyWindow()
win.show_all()
Gtk.main()

1 Ответ

0 голосов
/ 30 апреля 2019

Согласно документации , вы можете отключить контекстное меню, подключившись к сигналу "context-menu" и вернув True, чтобы скрыть контекстное меню.

Вот ваш код обновлен до того, что вы ищете, я считаю:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import gi
gi.require_version('Gtk', '3.0')
gi.require_version('WebKit2', '4.0')
from gi.repository import Gtk, Gdk, WebKit2

class MyWindow(Gtk.Window):

    def __init__(self, *args):

        Gtk.Window.__init__(self, title="test")

        self.wv = WebKit2.WebView()
        self.add(self.wv)
        self.wv.connect('context-menu', self.append_item)

        # add item
    def append_item(self, webview, context_menu, hit_result_event, event):
        context_menu.remove_all()
        action = Gtk.Action("FileNewStandard", "_New", "Create a new file", Gtk.STOCK_NEW)
        option = WebKit2.ContextMenuItem().new(action)
        context_menu.append(option)

win = MyWindow()
win.show_all()
win.connect('destroy', Gtk.main_quit)
Gtk.main()
...