除非光标位于滚动条上,否则GtkScrolledWindow不响应鼠标滚轮

时间:2018-04-07 16:00:57

标签: c gtk gtk3

我有一个C GTK3 application使用GtkScrolledWindow,里面有一个GtkGrid。我对所有内容的布局感到满意,但是如果光标在滚动条上方,或者我用光标移动滚动条,ScrolledWindow只会通过鼠标滚轮滚动。我正在寻找的行为是鼠标滚轮在使用鼠标滚轮时总是滚动ScrolledWindow,或者至少当光标在ScrolledWindow上时(这是我认为的默认值)。

以下是创建ScrolledWindow的地方:

scroll = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scroll), BANNER_HIGHT * 4);

The location of these lines in the application (GitHub)

我现在想知道是否必须将GtkAdjustment传递给构造函数,但似乎所有这一切都设置了滚动边界。我也想知道我是否可以在主窗口上连接mousescroll事件并尝试在回调时手动触发它,但我也没有办法做到这一点。

1 个答案:

答案 0 :(得分:0)

这实际上似乎是GTK和/或操作系统(Ubuntu)中的一个错误,我试图在我的笔记本电脑的触控板上使用多点触控滚动手势滚动,但这不起作用。今天,我碰巧有一个普通的鼠标插入了一个实际的滚轮,发现它工作得很好。

更新:我通过订阅滚动事件并使用GtkAdjustment手动调整滚动窗口来添加我正在寻找的行为:

bool scroll_entrires(GtkWidget * widget, GdkEvent * event, gpointer data) {
    double delta_x, delta_y; // delta_y is not used
    if (gdk_event_get_scroll_deltas(event, &delta_x, &delta_y)) {
        GtkAdjustment * adj = gtk_scrolled_window_get_vadjustment(
            GTK_SCROLLED_WINDOW(scroll));
        gtk_adjustment_set_value(adj,
            gtk_adjustment_get_value(adj) + 30 * delta_y);
        // 30 is a number that I like for my setup but can
        // be changed for other situations.
        return true; // We have responded to the event
    }
    return false; // Let other handlers respond to this event
}

// ... (In my init code)

g_signal_connect(window, "scroll-event", G_CALLBACK(scroll_entries), NULL);