Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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()
    
like image 975
L__ Avatar asked Jan 19 '26 07:01

L__


1 Answers

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()
like image 136
L__ Avatar answered Jan 20 '26 21:01

L__