That’s what I thought should work, having used previous GTK versions, but it doesn’t seem to work with current or recent gtk4s.
I made you a tiny demo program:
/* compile with
* gcc -g -Wall block-scroll.c `pkg-config gtk4 --cflags --libs`
*/
#include <gtk/gtk.h>
static gboolean
scroll_cb (GtkEventControllerMotion *self,
double dx, double dy, gpointer user_data)
{
printf ("scrollcb: dx = %g, dy = %g\n", dx, dy);
// block any further vertical scroll event handling
return TRUE;
}
static void
activate (GtkApplication* app,
gpointer user_data)
{
GtkWidget *window;
GtkWidget *scrolled_window;
GtkTextBuffer *text_buffer;
GtkTextIter text_iter;
GtkWidget *text_view;
int i;
GtkEventController *controller;
window = gtk_application_window_new (app);
gtk_window_set_title (GTK_WINDOW (window), "Window");
gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
scrolled_window = gtk_scrolled_window_new ();
gtk_window_set_child (GTK_WINDOW (window), scrolled_window);
text_buffer = gtk_text_buffer_new (NULL);
gtk_text_buffer_get_iter_at_line (text_buffer, &text_iter, 0);
for (i = 0; i < 100; i++)
gtk_text_buffer_insert (text_buffer, &text_iter, "Hello world\n", -1);
text_view = gtk_text_view_new_with_buffer (text_buffer);
controller = gtk_event_controller_scroll_new (GTK_EVENT_CONTROLLER_SCROLL_DISCRETE | GTK_EVENT_CONTROLLER_SCROLL_VERTICAL);
g_signal_connect (controller, "scroll", G_CALLBACK (scroll_cb), NULL);
gtk_widget_add_controller (text_view, controller);
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolled_window), text_view);
gtk_window_present (GTK_WINDOW (window));
}
int
main (int argc,
char **argv)
{
GtkApplication *app;
int status;
app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
status = g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref (app);
return status;
}
I would have expected returning TRUE
from the scroll handler to stop mousewheel scroll events in scrolledwindow, but it does not seem to. I can still use the mousewheel to scroll the text widget in the program above.
This is gtk 4.10 (the one shipped with ubuntu 23.04).
I’m pretty sure this used to work in early gtk4 versions.