Как инициализировать GtkScrolledWindow, чтобы полосы прокрутки не увеличивались настолько, насколько это возможно?
По умолчанию он кажется минимально возможным.
Демо-код (Выйти с SIGINT):
#include <gtk/gtk.h>
int main(int argc, char *argv[]) {
GtkWidget* window;
GtkWidget* content;
GtkWidget* sw;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
sw = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_container_add(GTK_CONTAINER(window), sw);
gtk_widget_show(sw);
content = gtk_button_new_with_label("This is a very, very"
"very very very very very very very very long text");
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), content);
gtk_widget_show(content);
gtk_widget_show(window);
gtk_main();
return 0;
}





Я не уверен, как это сделать правильно, но я обнаружил, что для меня лучше всего установить размер окна, а содержащиеся в нем виджеты обычно имеют правильный размер:
gtk_window_set_default_size(GTK_WINDOW(window), 1000, 500);
В качестве альтернативы вы можете установить размер GtkScrolledWindow:
gtk_widget_set_size_request(window, 500, 250);
Обратите внимание, что особенно в этом последнем случае при вычислении размера в пикселях, вероятно, следует учитывать локализацию, размеры шрифта и другие подобные детали.
Я думаю, что это работает и не является уродливым хаком (сильно):
int main(int argc, char *argv[]) {
GtkWidget* window;
GtkWidget* content;
GtkWidget* sw;
GtkRequisition size;
GtkWidget* viewport;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
sw = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_container_add(GTK_CONTAINER(window), sw);
gtk_widget_show(sw);
content = gtk_button_new_with_label("This is a very, very"
"very very very very very very very very long text");
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), content);
gtk_widget_show(content);
gtk_widget_show(window);
viewport = gtk_widget_get_ancestor(content, GTK_TYPE_VIEWPORT);
gtk_widget_size_request(viewport, &size);
gtk_widget_set_size_request(sw, size.width, size.height);
gtk_main();
return 0;
}
Конечно, это работает, но это уродливый хакер, и, как вы сказали, не работает, за исключением нескольких удачных случаев. И, черт возьми, вы не можете просто запросить размер виджета GTK, не так ли?