How to prevent scrolling to change the value on SpinButton


Seems that when the SpinButton is created, an EventControllerScroll is added too. So that users can change the value of SpinButton by scrolling.

But I often change it accidentally.

How can I remove EventControllerScroll from SpinButton? I can do this by looping Widget.observe_controllers() and then remove it.

But the doc says:

Applications should try hard to avoid calling this function
because of the slowdowns.

So is there other better ways to stop scoll to change the value of SpinButton?

g_signal_connect(spinbutton, “scroll-event”, G_CALLBACK(gtk_true), NULL);

The scroll-event signal is only available on widgets if you’re using GTK3, but since @Charles is referring to the observe_controllers() method, they are using GTK4.

Do not ever remove internal objects from a GTK widget: things are going to break, horribly, and there is no expectation that what you do is supported in any way.

You could add a scroll event controller on the parent widget of the spin button, using the capture phase, and prevent any scroll event from reaching the spin button.

I added a Gtk.EventControllerScroll on the parent widget GtkBox:

This is the properties on the added Gtk.EventControllerScroll:

The code is:

_newBox(properties) {
        const box = new Gtk.Box({
            spacing: 6,
            margin_top: 6,
            margin_bottom: 6,
            margin_start: 6,
            margin_end: 6,
        Object.assign(box, properties);
        return box;

const boxLeft = this._newBox({
  hexpand: true,
  halign: Gtk.Align.START

// Add a spin button on boxLeft

// add a Gtk.EventControllerScroll on boxLeft
const controller = new Gtk.EventControllerScroll();
// Prevent the scroll event of the spin button inside the boxLeft? It's not working
controller.connect('scroll', () => {
    // Can't receive this event while scroll on the spin button added on the boxLeft
    return Gdk.EVENT_STOP;

The above code is not working. Am I missing something important?

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.