GtkScrolledWindow - 如何始终显示覆盖滚动条

EMo*_*Mon 5 css c gtk3

我正在使用 GTK3 应用程序,该应用程序需要始终可见、始终活动的滚动条和可见的步进器。我已经能够用 css 实现这一点:

scrollbar.hover,
scrollbar {
    margin-left: 2px;
    -GtkScrollbar-has-backward-stepper: 1;
    -GtkScrollbar-has-forward-stepper: 1;
}

scrollbar trough {
    min-width: 30px;
}

scrollbar button {
    min-height: 30px;
    min-width: 30px;
}

scrollbar.right slider {
    min-height: 70px;
    min-width: 30px;
}
Run Code Online (Sandbox Code Playgroud)

连同这段代码:

GtkWidget *sw = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); //never horizontal, always vertical
g_object_set(sw, "overlay-scrolling", FALSE, NULL);
Run Code Online (Sandbox Code Playgroud)

然而,设置overlay-scrollingFALSE意味着滚动条位于 GtkScrolledWindow 的一侧,而不是在其中。这会导致应用程序(从早期版本的 gtk 移植的遗留应用程序)出现布局问题。

但是,如果我启用覆盖滚动,则滚动条会在几秒钟后隐藏,而不会向 GtkScolledWindow 发送运动事件。

我一直在使用 GtkInspector 来搞乱一切,尝试禁用隐藏滚动条,但没有成功。

一个黑客方法是设置一个计时器,不断向窗口发送运动事件,以防止滚动条隐藏……但这非常难看。

关于在哪里找到禁用覆盖滚动条隐藏的秘密武器的任何建议?

EMo*_*Mon 8

简而言之,您不能按原样使用 GtkScrollableWindow。

我深入研究了GtkScrollableWindow 的源代码(搜索“opacity”)以确认此行为已内置。

这可能会通过向窗口发送周期性“运动”信号来欺骗它保持滚动条可见(丑陋!),或者当然是修改 GtkScrollableWindow 源代码来破解。不太麻烦的是实现我自己的 GtkScrollable,或者可能通过创建 GtkOverlay 并将 GtkScrollbar 放在 GtkScrollableWindow 顶部并将这些滚动条操作映射到窗口。

这对于该项目来说是较低的优先级,所以我可能没有机会进一步研究它,但如果任何读者能够加入“最佳”方法,至少出于我的好奇心,我将不胜感激:)