continuation from Pressing any global keyboard shortcut causes temporary loss of focus
I’ve tried to devise a workaround. If toplevel window lost focus then run timer of 1s to check if keyboard switch is in process. It replicates original behavior:
- commit change if focus stays on TreeView
- discard if focus changes to different widget/window
What are downsides of this approach?
Could it be the case that GTK devs are interested in implementing it (or similar)?
workaround in python
class CellRendererTextMy(Gtk.CellRendererText):
def __init__(self):
super().__init__()
def on_editing_started(self,editable,path):
if isinstance(editable,Gtk.Entry):
ttag = None
def stop_edit():
nonlocal ttag
GLib.source_remove(ttag)
ttag = None
#gtk_cell_renderer_text_focus_out_event() in gtkcellrenderertext.c
editable.set_property("editing-canceled", True)
editable.editing_done()
editable.remove_widget()
return False
def on_focus_in(widget,event):
nonlocal ttag
if ttag:
GLib.source_remove(ttag)
ttag = None
return False
def editable_workaround(widget, event):
if widget.get_realized():
toplevel = widget
while toplevel.get_parent():
toplevel = toplevel.get_parent()
if not toplevel.get_property("has_toplevel_focus"):
nonlocal ttag
ttag = GLib.timeout_add(1000, stop_edit)
return True
editable.connect("focus-out-event", editable_workaround)
editable.connect("focus-in-event", on_focus_in)
self.connect("editing_started", on_editing_started)