GtkTextView Sizing Issues



Hi there,

I've been trying to port an application of mine to Gtk+ 3 and have
been having some issues. Well, only one issue, but I've been
struggling with it for a whole month now. I posted to
gtk-app-devel-list but never had any responses there; so thought this
might be a more appropriate forum (apologies for the cross post for
those who subscribe to both).

My application has a vertical stack of GtkTextViews that I want to
appear immediately one after another. Under Gtk+ 2 everything worked
fine in a VBox, but with Gtk+ 3 I started getting extra vertical
padding or spacing between some of GtkTextViews. Seemingly random, but
I suppose there's a pattern in there somewhere. I thought I'd try
rewriting the application to use the new GtkGrids to see if that
helped, but it didn't.

Having a quick look around I see the issues seem to be same as in bug
650267 [https://bugzilla.gnome.org/show_bug.cgi?id=650267] but there
hasn't been any updates on that since it was raised about a year ago,
which took me to gtk-app-devel-list first, and now here.

There's a simple test program below which seems to reproduce the issue
in the bug above. Like the original report mentioned, the GtkTextViews
appear narrow and very tall by default. More difficult for me to
understand is why there's extra vertical padding in the widgets
without the focus, i.e., the top two of the three GtkTextViews in this
example. Just clicking on either of the top two GtkTextViews will
suddenly resize it down to the correct size!

Setting hexpand TRUE on the GtkTextViews does help with the initial
sizings: everything 'looks' OK until I resize the window, making it
wider so the text renders in fewer lines in the GtkTextViews. I then
get similar behaviour as before: the GtkTextViews without the focus
don't automatically resize, only suddenly and jarringly doing so when
they receive focus. Moreover, if I then narrow the window again the
GtkTextViews don't resize down horizontally, as if the viewport
doesn't automatically contract (regardless of the policy I set on the
horizontal scrollbar of the GtkScrolledWindow).

So, can anyone offer me any help; or an explanation as to what's going
on? I've spent a large amount of time looking at the source code
trying to figure out what's happening with the new height-for-width
geometry management, but I'm not sure I get it. My current thinking is
that I might need to write a custom widget to wrap each GtkTextView
that will size "how I want" (which is really just "how Gtk+ 2 used to
do it") using the new height-for-width approach, and I've got that
going "about 80% right", but it's got its issues and I fear that's
going in the wrong direction altogether and that I'm missing something
fundamental!

Any ideas?

Thanks in advance,
Paul


--8<--

#include <gtk/gtk.h>
#include <string.h>

const char text[] =
  "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod "
  "tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim "
  "veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea "
  "commodo consequat.";

static GtkWidget *create_widget() {
  GtkWidget *widget = gtk_text_view_new();
  gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)),
    text, strlen(text));
  gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(widget), GTK_WRAP_WORD);
//gtk_widget_set_hexpand(widget, TRUE);  /* helps with 'initial' sizings */
  return widget;
}

int main(int argc, char **argv) {
  gtk_init(&argc, &argv);

  GtkWidget *grid = gtk_grid_new();
  gtk_grid_attach(GTK_GRID(grid), create_widget(), 0, 0, 1, 1);
  gtk_grid_attach(GTK_GRID(grid), create_widget(), 0, 1, 1, 1);
  gtk_grid_attach(GTK_GRID(grid), create_widget(), 0, 2, 1, 1);

  GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);
  gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window),
    grid);

  GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_default_size(GTK_WINDOW(window), 500, 300);
  gtk_container_add(GTK_CONTAINER(window), scrolled_window);

  g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
  gtk_widget_show_all(window);
  gtk_main();
  return 0;
}

--8<--


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]