pythongedit-plugin

Accel not working in gedit 3 plugin error


I was trying to write a small plugin for Gedit 3 which uses GObject introspection. The relevant part of the code shown below just aims at getting an environment up where I could then fit in the function in the callback for the button. However, the accelerator for the button is not working.

  1. What is wrong with this code?

  2. I am using the tutorial here and the python documentation for GTK 3 here. Is there any other links that you know of?

     from gi.repository import Gtk, Gedit, GObject 
     ui_string = """<ui>
     <toolbar name="ToolBar">
     <separator />
     <toolitem name="Test" action="Test" />
     </toolbar>
     </ui>
     """
     class test:
         def __init__(self, plugin, window):
             self.window = window
             self.plugin = plugin
             self.ui_id = None
             manager = self.window.get_ui_manager()
             action_group = Gtk.ActionGroup("TestPluginactions")
             action_test_button = Gtk.Action(name="Test",
                 label="Test",
                 tooltip="Test",
                 stock_id=Gtk.STOCK_EXECUTE)
    
             action_test_button.connect("activate", self.testcallback)
             action_group.add_action_with_accel(action_test_button, "<Ctrl>l")
    
             manager.insert_action_group(action_group, -1)
             self.ui_id = manager.add_ui_from_string(ui_string)
             manager.ensure_update()
    
         def deactivate(self):
             manager = self.window.get_ui_manager()
             manager.remove_ui(self.ui_id)
             self.ui_id = None
             self.window = None
             self.plugin = None
    
         def testcallback(self,unused):
             dialog1 = Gtk.MessageDialog(self.window,Gtk.DialogFlags.DESTROY_WITH_PARENT,
                 Gtk.MessageType.ERROR,Gtk.ButtonsType.OK,"TEST")
             dialog1.run()
             dialog1.destroy()
    
    
     class WindowActivatable(GObject.Object, Gedit.WindowActivatable):
         window = GObject.property(type=Gedit.Window)
         def __init__(self):
             GObject.Object.__init__(self)
             self.instances = {}
    
         def do_activate(self):
             self.instances[self.window] = test(self, self.window)
    
         def do_deactivate(self):
             if self.window in self.instances:
                 self.instances[self.window].deactivate()
    

Solution

  • Got to know that GTK 3 has either some bug which does not allow shortcuts to be assigned to the toolitems in the way shown above. Menu items however work fine. So the below code is better.

        from gi.repository import Gtk, Gedit, GObject 
        ui_string = """<ui>
        <toolbar name="ToolBar">
        <separator />
        <toolitem name="Test" action="Test" />
        </toolbar>
          <menubar name="MenuBar">
          <menu name="ToolsMenu" action="Tools">
          <placeholder name="ToolsOps_2">
          <menuitem name="test1" action="test1"/>
          </placeholder>
          </menu>
          </menubar>
        </ui>
        """
        class test:
            def __init__(self, plugin, window):
                self.window = window
                self.plugin = plugin
                self.ui_id = None
                manager = self.window.get_ui_manager()
                action_group = Gtk.ActionGroup("TestPluginactions")
                action_test_button = Gtk.Action(name="Test",
                    label="Test",
                    tooltip="Test",
                    stock_id=Gtk.STOCK_EXECUTE)
                action_test = Gtk.Action(name="test1",
                    label="Test",
                    tooltip="Test",
                    stock_id=Gtk.STOCK_EXECUTE)
                action_test_button.connect("activate", self.testcallback)
                action_test.connect("activate", self.testcallback)
                action_group.add_action(action_test_button)
                action_group.add_action_with_accel(action_test, "<Ctrl>l")
    
                manager.insert_action_group(action_group, -1)
                self.ui_id = manager.add_ui_from_string(ui_string)
                manager.ensure_update()
    
            def deactivate(self):
                manager = self.window.get_ui_manager()
                manager.remove_ui(self.ui_id)
                self.ui_id = None
                self.window = None
                self.plugin = None
    
            def testcallback(self,unused):
                dialog1 = Gtk.MessageDialog(self.window,Gtk.DialogFlags.DESTROY_WITH_PARENT,
                    Gtk.MessageType.ERROR,Gtk.ButtonsType.OK,"TEST")
                dialog1.run()
                dialog1.destroy()
    
    
        class WindowActivatable(GObject.Object, Gedit.WindowActivatable):
            window = GObject.property(type=Gedit.Window)
            def __init__(self):
                GObject.Object.__init__(self)
                self.instances = {}
    
            def do_activate(self):
                self.instances[self.window] = test(self, self.window)
    
            def do_deactivate(self):
                if self.window in self.instances:
                    self.instances[self.window].deactivate()