Skip to content

Commit eae72ea

Browse files
committed
#4346 prevent menu item callbacks from firing when setting them
1 parent 90a8cff commit eae72ea

File tree

1 file changed

+48
-39
lines changed

1 file changed

+48
-39
lines changed

xpra/client/gtk3/menu_helper.py

Lines changed: 48 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ def make_min_auto_menu(title, min_options, options,
209209
submenu.append(fstitle)
210210
submenu.menu_items = {}
211211
submenu.min_menu_items = {}
212+
submenu.updating = False
212213

213214
def populate_menu(options, value, set_fn):
214215
found_match = False
@@ -230,25 +231,29 @@ def populate_menu(options, value, set_fn):
230231
return items
231232

232233
def set_value(item, ss):
233-
if not item.get_active():
234+
if not item.get_active() or submenu.updating:
234235
return
235-
# user selected a new value from the menu:
236-
s = -1
237-
for ts, tl in options.items():
238-
if tl == item.get_label():
239-
s = ts
240-
break
241-
if s >= 0 and s != ss.get_current_value():
242-
log("setting %s to %s", title, s)
243-
ss.set_value_cb(s)
244-
# deselect other items:
245-
for x in ss.menu_items.values():
246-
if x != item:
247-
x.set_active(False)
248-
# min is only relevant in auto-mode:
249-
if s != 0:
250-
for v, x in ss.min_menu_items.items():
251-
x.set_active(v == 0)
236+
try:
237+
submenu.updating = True
238+
# user selected a new value from the menu:
239+
s = -1
240+
for ts, tl in options.items():
241+
if tl == item.get_label():
242+
s = ts
243+
break
244+
if s >= 0 and s != ss.get_current_value():
245+
log("setting %s to %s", title, s)
246+
ss.set_value_cb(s)
247+
# deselect other items:
248+
for x in ss.menu_items.values():
249+
if x != item:
250+
x.set_active(False)
251+
# min is only relevant in auto-mode:
252+
if s != 0:
253+
for v, x in ss.min_menu_items.items():
254+
x.set_active(v == 0)
255+
finally:
256+
submenu.updating = False
252257

253258
submenu.menu_items.update(populate_menu(options, get_current_value(), set_value))
254259
submenu.append(Gtk.SeparatorMenuItem())
@@ -258,28 +263,32 @@ def set_value(item, ss):
258263
submenu.append(mstitle)
259264

260265
def set_min_value(item, ss):
261-
if not item.get_active():
266+
if not item.get_active() or submenu.updating:
262267
return
263-
# user selected a new min-value from the menu:
264-
s = -1
265-
for ts, tl in min_options.items():
266-
if tl == item.get_label():
267-
s = ts
268-
break
269-
if s >= 0 and s != ss.get_current_min_value():
270-
log(f"setting min-{title} to {s}")
271-
ss.set_min_value_cb(s)
272-
# deselect other min items:
273-
for x in ss.min_menu_items.values():
274-
if x != item:
275-
x.set_active(False)
276-
# min requires auto-mode:
277-
for x in ss.menu_items.values():
278-
if x.get_label() == "Auto":
279-
if not x.get_active():
280-
x.activate()
281-
else:
282-
x.set_active(False)
268+
try:
269+
submenu.updating = True
270+
# user selected a new min-value from the menu:
271+
s = -1
272+
for ts, tl in min_options.items():
273+
if tl == item.get_label():
274+
s = ts
275+
break
276+
if s >= 0 and s != ss.get_current_min_value():
277+
log(f"setting min-{title} to {s}")
278+
ss.set_min_value_cb(s)
279+
# deselect other min items:
280+
for x in ss.min_menu_items.values():
281+
if x != item:
282+
x.set_active(False)
283+
# min requires auto-mode:
284+
for x in ss.menu_items.values():
285+
if x.get_label() == "Auto":
286+
if not x.get_active():
287+
x.activate()
288+
else:
289+
x.set_active(False)
290+
finally:
291+
submenu.updating = False
283292

284293
mv = -1
285294
if get_current_value() <= 0:

0 commit comments

Comments
 (0)