From 34fa4e1ad795489e4e286eaa7f21883b5259eafa Mon Sep 17 00:00:00 2001 From: Luca Toniolo <10792599+grandixximo@users.noreply.github.com> Date: Sat, 30 May 2026 14:31:00 +0800 Subject: [PATCH] touchy: stop pegging X server with redundant button relayouts periodic_radiobuttons() runs at 10 Hz and called set_label() directly on six buttons (wheelinc1-3, fo, so, mv) every cycle. gtk_button_set_label() unconditionally rebuilds the button's label child and queues a resize, so even when the text is unchanged each cycle forces a full window relayout and redraw. Headless under Xvfb this pegged the X server at ~95-110% CPU while touchy's own Python sat idle in the GTK main loop. Route these through the existing guarded set_label() helper, which skips the call when the label is unchanged. Idle touchy now leaves the X server near 0% with no change in displayed behaviour; the labels still update when the increment or override values actually change. Fixes #4070 --- src/emc/usr_intf/touchy/touchy.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/emc/usr_intf/touchy/touchy.py b/src/emc/usr_intf/touchy/touchy.py index 05b76c3097c..9c6d28623ea 100755 --- a/src/emc/usr_intf/touchy/touchy.py +++ b/src/emc/usr_intf/touchy/touchy.py @@ -789,9 +789,9 @@ def periodic_radiobuttons(self): else: incs = ["0.01", "0.001", "0.0001"] - self.wTree.get_object("wheelinc1").set_label(incs[0]) - self.wTree.get_object("wheelinc2").set_label(incs[1]) - self.wTree.get_object("wheelinc3").set_label(incs[2]) + set_label(self.wTree.get_object("wheelinc1"), incs[0]) + set_label(self.wTree.get_object("wheelinc2"), incs[1]) + set_label(self.wTree.get_object("wheelinc3"), incs[2]) self.hal.jogincrement(self.wheelinc, list(map(float,incs))) @@ -820,9 +820,9 @@ def periodic_radiobuttons(self): d0 = d * 10 ** (2-self.wheelinc) if d != 0: self.listing.next(None, d0) - self.wTree.get_object("fo").set_label("FO: %d%%" % self.fo_val) - self.wTree.get_object("so").set_label("SO: %d%%" % self.so_val) - self.wTree.get_object("mv").set_label("MV: %d" % self.mv_val) + set_label(self.wTree.get_object("fo"), "FO: %d%%" % self.fo_val) + set_label(self.wTree.get_object("so"), "SO: %d%%" % self.so_val) + set_label(self.wTree.get_object("mv"), "MV: %d" % self.mv_val) return True