Gtk gtk_container_dequeue_resize_handler Warning - Scroll Window
-
Hallo,
ich habe schon einmal gepostet, aber schon relativ lange her, deswegen ein 2. Versuch, evtl kann mir ja doch noch wer helfen.
Ich habe eine Vbox mit jeweils einem Scrollwindow, wo eine Textview drinliegt. Die Scrollbars möchte ich ausgeblendet haben. Dann wird ein Text in die Textviews geschrieben. An und für sich kein Problem. Geht der Text jedoch über den Rand hinaus, egal ob zuviel Zeilen oder zuviele Spalten wird die GTK-Critical Warnung: gtk_container_dequeue_resize_handler:.... ausgegeben und das Programm läuft zwar, aber angezeigt wird mir nichts.
Der Code ist:cancelWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); cancelHbox = gtk_hbox_new(TRUE, 5); cancelTv1 = gtk_text_view_new(); cancelTv2 = gtk_text_view_new(); scrollwindow1 = gtk_scrolled_window_new(NULL, NULL); scrollwindow2 = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwindow1), GTK_POLICY_NEVER, GTK_POLICY_NEVER); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwindow2), GTK_POLICY_NEVER, GTK_POLICY_NEVER); // settings for cwindow gtk_container_set_border_width (GTK_CONTAINER (cancelWindow), 5); // Sets that the window has no frame gtk_window_set_decorated (GTK_WINDOW (cancelWindow), false); gtk_window_set_type_hint(GTK_WINDOW(cancelWindow), GDK_WINDOW_TYPE_HINT_DIALOG); gtk_window_set_transient_for(GTK_WINDOW(cancelWindow), GTK_WINDOW(window)); // settings for textviews gtk_text_view_set_editable(GTK_TEXT_VIEW(cancelTv1), false); gtk_text_view_set_editable(GTK_TEXT_VIEW(cancelTv2), false); gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(cancelTv1), false); gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(cancelTv2), false); // no wrapping of lines gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(cancelTv1), GTK_WRAP_NONE); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(cancelTv2), GTK_WRAP_NONE); // put textviews in hbox` gtk_container_add(GTK_CONTAINER(scrollwindow1), cancelTv1); gtk_container_add(GTK_CONTAINER(scrollwindow2), cancelTv2); gtk_container_add(GTK_CONTAINER(cancelHbox), scrollwindow1); gtk_container_add(GTK_CONTAINER(cancelHbox), scrollwindow2); // Pack the hbox in the main cancel viewer window gtk_container_add (GTK_CONTAINER (cancelWindow), cancelHbox); *************************************************************** *********************************************************** in die TextView wird Zeile für Zeile geschrieben aus einem File. Eine Zeile von File wird dabei eingelesen, anschließend in Textview geschrieben, nächste Zeile usw. void FtpDownload::writeTextView(GtkWidget* textview, string text) { GtkTextBuffer* buffer; GtkTextIter textiterend; buffer = gtk_text_buffer_new(NULL); // get text in textview buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); // get mark with last text character and add new text there gtk_text_buffer_get_end_iter(buffer, &textiterend); gtk_text_buffer_insert(buffer, &textiterend, text.c_str(), -1); //g_free(buffer); }
Kennt jemand das Problem oder weiß jemand woran das liegen könnte? bzw. ne andere Lösung war natürlich auch super ^^
Danke schon mal,
-
Könntest du mir ein lauffähiges Beispiel geben, das die Fehlermeldung produziert?
Folgender zusammengepasteter Code läuft bei mir ohne Warnungen vonseiten GTK+:#include <gtk/gtk.h> #define true TRUE #define false FALSE int main (int argc, char *argv[]) { gtk_init (&argc, &argv); GtkWidget *cancelWindow, *cancelHbox, *cancelTv1, *cancelTv2; GtkWidget *scrollwindow1, *scrollwindow2; cancelWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(cancelWindow), 100, 100); cancelHbox = gtk_hbox_new(TRUE, 5); cancelTv1 = gtk_text_view_new(); cancelTv2 = gtk_text_view_new(); scrollwindow1 = gtk_scrolled_window_new(NULL, NULL); scrollwindow2 = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwindow1), GTK_POLICY_NEVER, GTK_POLICY_NEVER); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwindow2), GTK_POLICY_NEVER, GTK_POLICY_NEVER); // settings for cwindow gtk_container_set_border_width (GTK_CONTAINER (cancelWindow), 5); // Sets that the window has no frame //gtk_window_set_decorated (GTK_WINDOW (cancelWindow), false); //gtk_window_set_type_hint(GTK_WINDOW(cancelWindow), GDK_WINDOW_TYPE_HINT_DIALOG); //gtk_window_set_transient_for(GTK_WINDOW(cancelWindow), GTK_WINDOW(window)); // settings for textviews gtk_text_view_set_editable(GTK_TEXT_VIEW(cancelTv1), false); gtk_text_view_set_editable(GTK_TEXT_VIEW(cancelTv2), false); gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(cancelTv1), false); gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(cancelTv2), false); // no wrapping of lines gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(cancelTv1), GTK_WRAP_NONE); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(cancelTv2), GTK_WRAP_NONE); // put textviews in hbox` gtk_container_add(GTK_CONTAINER(scrollwindow1), cancelTv1); gtk_container_add(GTK_CONTAINER(scrollwindow2), cancelTv2); gtk_container_add(GTK_CONTAINER(cancelHbox), scrollwindow1); gtk_container_add(GTK_CONTAINER(cancelHbox), scrollwindow2); // Pack the hbox in the main cancel viewer window gtk_container_add (GTK_CONTAINER (cancelWindow), cancelHbox); GtkTextBuffer* buffer; GtkTextIter textiterend; GtkWidget *textview = cancelTv1; buffer = gtk_text_buffer_new(NULL); // get text in textview buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); // get mark with last text character and add new text there gtk_text_buffer_get_end_iter(buffer, &textiterend); int i; for (i=0; i<5000; i++) /* Bei 5000 eventuell Probleme für Window Manager */ gtk_text_buffer_insert(buffer, &textiterend, "hallo ", -1); //g_free(buffer); gtk_widget_show_all (cancelWindow); gtk_main(); }
BTW, ein Fenster ohne Border mit einer ungewrappten TextView kommt mir sehr unpraktikabel vor.
-
Hallo,
danke für deine Antwort.
Sorry für die etwas "komischen" Layout Sachen. Innerhalb von dem Projekt wo dieses Window läuft, passt es, alleine nicht.
Zu dem komplett lauffähigen Code. Ich kann ihn leider nicht posten. Dieser besteht ungefähr aus 10 Klassen, die nicht alle klein sind und ist etwas komplizierter. Im groben gibt es eine Server/Client Kommunikationen... Der Server schickt dem Client dabei irgendwelche Nachrichten, die der Client auswertet und anschließend verwertet sozusagen. Eine Nachricht ist eben, dass er ein Window anzeigen soll mit 2 Textviews, wo man 2 Files gegenüber stellen kann. Scrollen geschieht dabei auch automatisch, deswegen keine ScrollBars, und Schließen funktioniert eben auch über eine Message, deswegen ist das Layout so seltsam.Ich habe deinen code auch mal in einem extra Projekt ausprobiert. Bei mir stellt er das Window jetzt aber nicht mehr in der eigentlich vorgegebenen Größe dar, sondern in der Größe von dem Text der dann drinsteht Sprich die erste Textview hat ne Länge von etlichen Monitorlängern sag ich mal, Höhe is ok, das sind ungefähr 3 Zeilen. Ist das bei dir auch so?
Ich hätt eigentlich gerne, dass das Window immer die selbe Größe hat, und man den Text, der über die Textview hinausgeht, sozusagen nicht sichtbar ist, nur durch Scrollen erreichbar ist.Hoffe du kannst mir da auch weiterhelfen.
Schöne Grüße
-
Hallöchen,
habs etz doch hinbekommen...
musste der Textview noch ne Größe geben über gtk_widget_set_size_request, dann ändert sich nichts, und ich kann über den rand schreiben.danke trotzdem