From d81eeff5c6f1ab9e6966f762377b008b4e4ff9b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20=C3=89vrard?= Date: Mon, 5 Jun 2023 19:09:46 +0200 Subject: [PATCH] Stop the edition of Selection fields in editable Treeviews on focus-out Closes #12308 (grafted from 9c81c15ec5164ed8e1e3bda05dc932c1430f65d7) --HG-- branch : 6.0 --- tryton/tryton/common/__init__.py | 5 +++-- tryton/tryton/common/common.py | 14 ++++++++++++++ .../window/view_form/view/list_gtk/widget.py | 19 +++++++++++++++---- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/tryton/tryton/common/__init__.py b/tryton/tryton/common/__init__.py index 650b4c8fc4..b94581f564 100644 --- a/tryton/tryton/common/__init__.py +++ b/tryton/tryton/common/__init__.py @@ -9,7 +9,8 @@ from .common import ( RPCProgress, RPCExecute, RPCContextReload, Tooltips, COLOR_SCHEMES, filter_domain, timezoned_date, untimezoned_date, humanize, get_hostname, get_port, resize_pixbuf, data2pixbuf, apply_label_attributes, ellipsize, - get_align, date_format, idle_add, check_version, TRYTON_ICON, setup_window) + get_align, date_format, idle_add, check_version, TRYTON_ICON, setup_window, + get_gdk_backend) from .domain_inversion import ( domain_inversion, eval_domain, localize_domain, merge, inverse_leaf, filter_leaf, prepare_reference_domain, extract_reference_models, concat, @@ -30,4 +31,4 @@ __all__ = [ localize_domain, merge, inverse_leaf, filter_leaf, prepare_reference_domain, extract_reference_models, concat, simplify, unique_value, EvalEnvironment, timedelta, check_version, TRYTON_ICON, - setup_window] + setup_window, get_gdk_backend] diff --git a/tryton/tryton/common/common.py b/tryton/tryton/common/common.py index e097372e4f..82c4b1798f 100644 --- a/tryton/tryton/common/common.py +++ b/tryton/tryton/common/common.py @@ -1339,3 +1339,17 @@ def idle_add(func): def setup_window(window): if sys.platform == 'darwin': window.set_mnemonic_modifier(Gdk.ModifierType.CONTROL_MASK) + + +def get_gdk_backend(): + if sys.platform == 'darwin': + return 'macos' + elif sys.platform == 'win32': + return 'win32' + else: + dm = Gdk.DisplayManager.get() + default = dm.props.default_display + dm_class_name = default.__class__.__name__.lower() + if 'wayland' in dm_class_name: + return 'wayland' + return 'x11' diff --git a/tryton/tryton/gui/window/view_form/view/list_gtk/widget.py b/tryton/tryton/gui/window/view_form/view/list_gtk/widget.py index d1991fb0c3..faa574838a 100644 --- a/tryton/tryton/gui/window/view_form/view/list_gtk/widget.py +++ b/tryton/tryton/gui/window/view_form/view/list_gtk/widget.py @@ -14,6 +14,7 @@ from tryton.gui.window.win_form import WinForm from tryton.gui.window.view_form.screen import Screen from tryton.common import file_selection, file_open, file_write import tryton.common as common +from tryton.common import get_gdk_backend from tryton.common.cellrendererbutton import CellRendererButton from tryton.common.cellrenderertext import CellRendererText, \ CellRendererTextCompletion @@ -1076,10 +1077,12 @@ class Selection(GenericText, SelectionMixin, PopdownMixin): def editing_started(self, cell, editable, path): super(Selection, self).editing_started(cell, editable, path) record, field = self._get_record_field_from_path(path) - # Combobox does not emit remove-widget when focus is changed - self.editable.connect( - 'editing-done', - lambda *a: self.editable.emit('remove-widget')) + gdk_backend = get_gdk_backend() + if gdk_backend == 'x11': + # Combobox does not emit remove-widget when focus is changed + self.editable.connect( + 'editing-done', + lambda *a: self.editable.emit('remove-widget')) selection_shortcuts(editable) @@ -1087,6 +1090,14 @@ class Selection(GenericText, SelectionMixin, PopdownMixin): return self.set_value(editable, record, field) editable.get_child().connect('activate', set_value) editable.get_child().connect('focus-out-event', set_value) + + if gdk_backend != 'x11': + # For non X11 backend we can rely the focus-out-event to be sent + # correctly + def remove_entry(entry, event): + editable.emit('editing-done') + editable.emit('remove-widget') + editable.get_child().connect('focus-out-event', remove_entry) editable.connect('changed', set_value) self.update_selection(record, field)