gtk-rs / gtk

DEPRECATED, use https://github.com/gtk-rs/gtk3-rs repository instead!

Home Page:https://gtk-rs.org/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

TextView Resize Issue

jdgwf opened this issue · comments

I'm having pretty major performance issue when resizing an app with the TextView on a grid. The redraw is very slow. It's relatively quick when compiled in C, but in both Python and Rust, resizing the text area with only 5 paragraphs of text is excruciating.

What am I doing wrong?

use gio::prelude::*;
use glib::clone;
use gtk::prelude::*;

// When the application is launched…
fn on_activate(application: &gtk::Application) {
    let grid = gtk::Grid::new();
    let window = gtk::ApplicationWindow::new(application);
    let close_button = gtk::Button::new_with_label("Close");

    let lorem_ipsum_sample_text = r#"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Tellus integer feugiat scelerisque varius morbi enim. Ut etiam sit amet nisl purus in mollis nunc sed. Convallis tellus id interdum velit laoreet id. Id diam maecenas ultricies mi eget. Mattis nunc sed blandit libero volutpat sed. Quisque id diam vel quam elementum pulvinar. In dictum non consectetur a erat. Quam nulla porttitor massa id. Ut lectus arcu bibendum at. Ac odio tempor orci dapibus. In ante metus dictum at tempor commodo ullamcorper.
    Ac odio tempor orci dapibus ultrices in iaculis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Duis ut diam quam nulla porttitor massa id neque aliquam. Quisque id diam vel quam elementum. Risus quis varius quam quisque id. Tincidunt arcu non sodales neque sodales ut etiam sit amet. At tellus at urna condimentum mattis pellentesque. A pellentesque sit amet porttitor eget dolor morbi non. Sodales neque sodales ut etiam sit amet. Amet mauris commodo quis imperdiet massa tincidunt nunc pulvinar. Ac tortor dignissim convallis aenean et tortor at. Lacus viverra vitae congue eu. Pharetra massa massa ultricies mi quis hendrerit. Sed nisi lacus sed viverra tellus in hac habitasse. Purus in massa tempor nec feugiat nisl pretium. Sed euismod nisi porta lorem mollis aliquam ut.
    Vel orci porta non pulvinar neque laoreet. Porttitor eget dolor morbi non arcu risus. Pharetra et ultrices neque ornare aenean. At in tellus integer feugiat scelerisque varius. Neque egestas congue quisque egestas diam in arcu cursus euismod. Ut aliquam purus sit amet luctus. Ac turpis egestas maecenas pharetra convallis posuere morbi. Vestibulum mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare massa. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Tristique senectus et netus et malesuada fames ac turpis egestas. Diam maecenas ultricies mi eget. Tincidunt vitae semper quis lectus nulla at volutpat. Malesuada pellentesque elit eget gravida cum sociis. Tellus rutrum tellus pellentesque eu. A erat nam at lectus urna duis convallis convallis tellus. Porttitor leo a diam sollicitudin tempor. Facilisi cras fermentum odio eu feugiat pretium. Tincidunt arcu non sodales neque sodales ut etiam.
    Ornare massa eget egestas purus viverra accumsan in nisl nisi. Scelerisque varius morbi enim nunc faucibus a pellentesque sit. Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu turpis egestas pretium aenean pharetra magna ac placerat. Neque aliquam vestibulum morbi blandit. Sed risus pretium quam vulputate dignissim suspendisse. At consectetur lorem donec massa. Metus aliquam eleifend mi in. Ac turpis egestas integer eget aliquet nibh praesent. Tristique nulla aliquet enim tortor. Rhoncus mattis rhoncus urna neque viverra justo. Erat imperdiet sed euismod nisi porta lorem mollis. Blandit turpis cursus in hac. Molestie a iaculis at erat pellentesque adipiscing. Ut etiam sit amet nisl purus in mollis nunc sed. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Fringilla urna porttitor rhoncus dolor purus non enim praesent elementum.
    Nunc scelerisque viverra mauris in aliquam. Nulla facilisi cras fermentum odio eu feugiat pretium. Vulputate sapien nec sagittis aliquam malesuada. Vulputate ut pharetra sit amet aliquam id diam maecenas. Auctor augue mauris augue neque. Faucibus nisl tincidunt eget nullam non nisi est sit amet. Diam volutpat commodo sed egestas egestas fringilla phasellus faucibus. Aliquet porttitor lacus luctus accumsan tortor posuere ac. Pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Ultrices eros in cursus turpis.
    "#;

    let summary = gtk::TextView::new();
    summary.set_wrap_mode(gtk::WrapMode::Word);
    summary.set_left_margin(10);
    summary.set_right_margin(10);
    summary.set_pixels_above_lines(10);
    summary.set_pixels_below_lines(10);
    summary.set_editable(true);
    summary.get_buffer().unwrap().set_text( lorem_ipsum_sample_text );


    // Close the window when clicked
    close_button.connect_clicked(clone!(@weak window => move |_| window.destroy()));

    grid.attach(&close_button, 0, 0, 1, 1);
    grid.attach(&summary, 0, 1, 1, 1);
    grid.set_row_homogeneous(false);
    grid.set_column_homogeneous(true);

    window.add(&grid);

    window.set_default_size( 600, 600);
    window.set_size_request(600,600);
    window.show_all();
}

fn main() {
    // Create a new application
    let app = gtk::Application::new(Some("com.jdgwf.testytest.example"), Default::default())
        .expect("Initialization failed...");
    app.connect_activate(|app| on_activate(app));
    // Run the application
    app.run(&std::env::args().collect::<Vec<_>>());
}

gtk-rust-resize-slow-rerender

Can you also provide the same code in C, the one that runs fast? That would make comparison easier to find the differences :)

My mistake - same issues in straight C
I should have tested better, and this is a whole different bag of worms.

#include <gtk/gtk.h>

int main(int argc, char *argv[]) {

  GtkWidget *window;
  GtkWidget *view;
  GtkWidget *vbox;

  GtkTextBuffer *buffer;
  GtkTextIter start, end;
  GtkTextIter iter;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_resizable (GTK_WINDOW(window), TRUE);

  gtk_window_set_title(GTK_WINDOW(window), "GtkTextView");

  vbox = gtk_vbox_new(FALSE, 0);
  view = gtk_text_view_new();
  gtk_box_pack_start(GTK_BOX(vbox), view, TRUE, TRUE, 0);


  buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));

  gtk_text_buffer_create_tag(buffer, "gap",
        "pixels_above_lines", 30, NULL);



  gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0);

  gtk_text_buffer_insert(
      buffer,
      &iter,
      "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Tellus integer feugiat scelerisque varius morbi enim. Ut etiam sit amet nisl purus in mollis nunc sed. Convallis tellus id interdum velit laoreet id. Id diam maecenas ultricies mi eget. Mattis nunc sed blandit libero volutpat sed. Quisque id diam vel quam elementum pulvinar. In dictum non consectetur a erat. Quam nulla porttitor massa id. Ut lectus arcu bibendum at. Ac odio tempor orci dapibus. In ante metus dictum at tempor commodo ullamcorper.\n    Ac odio tempor orci dapibus ultrices in iaculis nunc sed. Adipiscing elit ut aliquam purus sit amet luctus venenatis. Duis ut diam quam nulla porttitor massa id neque aliquam. Quisque id diam vel quam elementum. Risus quis varius quam quisque id. Tincidunt arcu non sodales neque sodales ut etiam sit amet. At tellus at urna condimentum mattis pellentesque. A pellentesque sit amet porttitor eget dolor morbi non. Sodales neque sodales ut etiam sit amet. Amet mauris commodo quis imperdiet massa tincidunt nunc pulvinar. Ac tortor dignissim convallis aenean et tortor at. Lacus viverra vitae congue eu. Pharetra massa massa ultricies mi quis hendrerit. Sed nisi lacus sed viverra tellus in hac habitasse. Purus in massa tempor nec feugiat nisl pretium. Sed euismod nisi porta lorem mollis aliquam ut.\n    Vel orci porta non pulvinar neque laoreet. Porttitor eget dolor morbi non arcu risus. Pharetra et ultrices neque ornare aenean. At in tellus integer feugiat scelerisque varius. Neque egestas congue quisque egestas diam in arcu cursus euismod. Ut aliquam purus sit amet luctus. Ac turpis egestas maecenas pharetra convallis posuere morbi. Vestibulum mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare massa. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Tristique senectus et netus et malesuada fames ac turpis egestas. Diam maecenas ultricies mi eget. Tincidunt vitae semper quis lectus nulla at volutpat. Malesuada pellentesque elit eget gravida cum sociis. Tellus rutrum tellus pellentesque eu. A erat nam at lectus urna duis convallis convallis tellus. Porttitor leo a diam sollicitudin tempor. Facilisi cras fermentum odio eu feugiat pretium. Tincidunt arcu non sodales neque sodales ut etiam.\n    Ornare massa eget egestas purus viverra accumsan in nisl nisi. Scelerisque varius morbi enim nunc faucibus a pellentesque sit. Elit duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Egestas egestas fringilla phasellus faucibus scelerisque eleifend. Eu turpis egestas pretium aenean pharetra magna ac placerat. Neque aliquam vestibulum morbi blandit. Sed risus pretium quam vulputate dignissim suspendisse. At consectetur lorem donec massa. Metus aliquam eleifend mi in. Ac turpis egestas integer eget aliquet nibh praesent. Tristique nulla aliquet enim tortor. Rhoncus mattis rhoncus urna neque viverra justo. Erat imperdiet sed euismod nisi porta lorem mollis. Blandit turpis cursus in hac. Molestie a iaculis at erat pellentesque adipiscing. Ut etiam sit amet nisl purus in mollis nunc sed. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Sem viverra aliquet eget sit amet tellus cras adipiscing enim. Fringilla urna porttitor rhoncus dolor purus non enim praesent elementum.\n    Nunc scelerisque viverra mauris in aliquam. Nulla facilisi cras fermentum odio eu feugiat pretium. Vulputate sapien nec sagittis aliquam malesuada. Vulputate ut pharetra sit amet aliquam id diam maecenas. Auctor augue mauris augue neque. Faucibus nisl tincidunt eget nullam non nisi est sit amet. Diam volutpat commodo sed egestas egestas fringilla phasellus faucibus. Aliquet porttitor lacus luctus accumsan tortor posuere ac. Pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Ultrices eros in cursus turpis.",
      -1
);

  gtk_widget_set_size_request(view, 600, 600);
  gtk_container_add(GTK_CONTAINER(window), vbox);

  gtk_text_view_set_wrap_mode( view, GTK_WRAP_WORD );

  g_signal_connect(G_OBJECT(window), "destroy",
        G_CALLBACK(gtk_main_quit), NULL);

  gtk_widget_show_all(window);
  gtk_widget_set_size_request(window, 600, 600);

  gtk_window_set_default_size(GTK_WINDOW(window), 600, 600);
  gtk_main();

  return 0;
}