After an evaluation, GNOME has moved from Bugzilla to GitLab. Learn more about GitLab.
No new issues can be reported in GNOME Bugzilla anymore.
To report an issue in a GNOME project, go to GNOME GitLab.
Do not go to GNOME Gitlab for: Bluefish, Doxygen, GnuCash, GStreamer, java-gnome, LDTP, NetworkManager, Tomboy.
Bug 769901 - Reproducible freeze when scrolling the view fast
Reproducible freeze when scrolling the view fast
Status: RESOLVED FIXED
Product: gtksourceview
Classification: Platform
Component: General
3.21.x
Other Linux
: Normal normal
: ---
Assigned To: GTK Sourceview maintainers
GTK Sourceview maintainers
Depends on:
Blocks:
 
 
Reported: 2016-08-14 22:55 UTC by Giovanni Campagna
Modified: 2016-08-19 08:06 UTC
See Also:
GNOME target: ---
GNOME version: ---



Description Giovanni Campagna 2016-08-14 22:55:11 UTC
GNOME Builder freezes completely if you scroll the text view too fast (using smooth 2finger scrolling, or with keybindings).
This is particular reliably triggered with horizontal scrolling, but happens with vertical scrolling too.
I have enabled visible trailing whitespace.

When the freeze occurs, GNOME Builder is gone completely and the only solution is to kill the application, losing unsaved files.

I have experienced this bug with Jade and HTML files, but I don't know if that's related or they just tend to have longer lines.

Backtrace (the function that hangs is _gtk_source_space_drawer_draw):

  • #0 pango_layout_iter_get_line_extents
    at /home/gcampagn/gnome/pango/pango/pango-layout.c line 6409
  • #1 pango_layout_xy_to_index
    at /home/gcampagn/gnome/pango/pango/pango-layout.c line 2052
  • #2 gtk_text_layout_get_iter_at_position
    at /home/gcampagn/gnome/gtk+/gtk/gtktextlayout.c line 2815
  • #3 gtk_text_layout_get_iter_at_pixel
    at /home/gcampagn/gnome/gtk+/gtk/gtktextlayout.c line 2768
  • #4 gtk_text_view_get_iter_at_location
    at /home/gcampagn/gnome/gtk+/gtk/gtktextview.c line 2109
  • #5 _gtk_source_space_drawer_draw
    at /home/gcampagn/gnome/gtksourceview/gtksourceview/gtksourcespacedrawer.c line 684
  • #6 gtk_source_view_draw_layer
    at /home/gcampagn/gnome/gtksourceview/gtksourceview/gtksourceview.c line 2645
  • #7 ide_source_view_real_draw_layer
    at /home/gcampagn/gnome/gnome-builder/libide/sourceview/ide-source-view.c line 4690
  • #8 draw_text
    at /home/gcampagn/gnome/gtk+/gtk/gtktextview.c line 5918
  • #9 _gtk_pixel_cache_repaint
    at /home/gcampagn/gnome/gtk+/gtk/gtkpixelcache.c line 357
  • #10 _gtk_pixel_cache_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkpixelcache.c line 447
  • #11 gtk_text_view_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtktextview.c line 5998
  • #12 gtk_source_view_draw
    at /home/gcampagn/gnome/gtksourceview/gtksourceview/gtksourceview.c line 2673
  • #13 ide_source_view_real_draw
    at /home/gcampagn/gnome/gnome-builder/libide/sourceview/ide-source-view.c line 4723
  • #14 gtk_widget_draw_internal
    at /home/gcampagn/gnome/gtk+/gtk/gtkwidget.c line 7015
  • #15 gtk_container_propagate_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3838
  • #16 gtk_container_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3658
  • #17 gtk_scrolled_window_render
    at /home/gcampagn/gnome/gtk+/gtk/gtkscrolledwindow.c line 2043
  • #18 gtk_css_custom_gadget_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcsscustomgadget.c line 159
  • #19 gtk_css_gadget_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcssgadget.c line 877
  • #20 gtk_scrolled_window_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkscrolledwindow.c line 2940
  • #21 gtk_widget_draw_internal
    at /home/gcampagn/gnome/gtk+/gtk/gtkwidget.c line 7015
  • #22 gtk_container_propagate_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3838
  • #23 gtk_container_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3658
  • #24 gtk_widget_draw_internal
    at /home/gcampagn/gnome/gtk+/gtk/gtkwidget.c line 7015
  • #25 gtk_container_propagate_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3838
  • #26 gtk_container_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3658
  • #27 gtk_box_draw_contents
    at /home/gcampagn/gnome/gtk+/gtk/gtkbox.c line 448
  • #28 gtk_css_custom_gadget_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcsscustomgadget.c line 159
  • #29 gtk_css_gadget_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcssgadget.c line 877
  • #30 gtk_box_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkbox.c line 457
  • #31 gtk_widget_draw_internal
    at /home/gcampagn/gnome/gtk+/gtk/gtkwidget.c line 7015
  • #32 gtk_container_propagate_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3838
  • #33 gtk_container_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3658
  • #34 gtk_widget_draw_internal
    at /home/gcampagn/gnome/gtk+/gtk/gtkwidget.c line 7015
  • #35 gtk_container_propagate_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3838
  • #36 gtk_container_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3658
  • #37 gtk_widget_draw_internal
    at /home/gcampagn/gnome/gtk+/gtk/gtkwidget.c line 7015
  • #38 gtk_container_propagate_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3838
  • #39 gtk_paned_render
    at /home/gcampagn/gnome/gtk+/gtk/gtkpaned.c line 1818
  • #40 gtk_css_custom_gadget_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcsscustomgadget.c line 159
  • #41 gtk_css_gadget_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcssgadget.c line 877
  • #42 gtk_paned_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkpaned.c line 1782
  • #43 gtk_widget_draw_internal
    at /home/gcampagn/gnome/gtk+/gtk/gtkwidget.c line 7015
  • #44 gtk_container_propagate_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3838
  • #45 gtk_container_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3658
  • #46 gtk_widget_draw_internal
    at /home/gcampagn/gnome/gtk+/gtk/gtkwidget.c line 7015
  • #47 gtk_container_propagate_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3838
  • #48 gtk_container_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3658
  • #49 gtk_box_draw_contents
    at /home/gcampagn/gnome/gtk+/gtk/gtkbox.c line 448
  • #50 gtk_css_custom_gadget_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcsscustomgadget.c line 159
  • #51 gtk_css_gadget_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcssgadget.c line 877
  • #52 gtk_box_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkbox.c line 457
  • #53 gtk_widget_draw_internal
    at /home/gcampagn/gnome/gtk+/gtk/gtkwidget.c line 7015
  • #54 gtk_container_propagate_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3838
  • #55 gtk_container_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3658
  • #56 gtk_box_draw_contents
    at /home/gcampagn/gnome/gtk+/gtk/gtkbox.c line 448
  • #57 gtk_css_custom_gadget_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcsscustomgadget.c line 159
  • #58 gtk_css_gadget_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcssgadget.c line 877
  • #59 gtk_box_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkbox.c line 457
  • #60 gtk_widget_draw_internal
    at /home/gcampagn/gnome/gtk+/gtk/gtkwidget.c line 7015
  • #61 gtk_container_propagate_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3838
  • #62 gtk_stack_render
    at /home/gcampagn/gnome/gtk+/gtk/gtkstack.c line 2203
  • #63 gtk_css_custom_gadget_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcsscustomgadget.c line 159
  • #64 gtk_css_gadget_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcssgadget.c line 877
  • #65 gtk_stack_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkstack.c line 2115
  • #66 gtk_widget_draw_internal
    at /home/gcampagn/gnome/gtk+/gtk/gtkwidget.c line 7015
  • #67 gtk_container_propagate_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3838
  • #68 gtk_container_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3658
  • #69 gtk_box_draw_contents
    at /home/gcampagn/gnome/gtk+/gtk/gtkbox.c line 448
  • #70 gtk_css_custom_gadget_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcsscustomgadget.c line 159
  • #71 gtk_css_gadget_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcssgadget.c line 877
  • #72 gtk_box_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkbox.c line 457
  • #73 gtk_widget_draw_internal
    at /home/gcampagn/gnome/gtk+/gtk/gtkwidget.c line 7015
  • #74 gtk_container_propagate_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3838
  • #75 gtk_container_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3658
  • #76 gtk_widget_draw_internal
    at /home/gcampagn/gnome/gtk+/gtk/gtkwidget.c line 7015
  • #77 gtk_container_propagate_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3838
  • #78 gtk_paned_render
    at /home/gcampagn/gnome/gtk+/gtk/gtkpaned.c line 1818
  • #79 gtk_css_custom_gadget_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcsscustomgadget.c line 159
  • #80 gtk_css_gadget_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcssgadget.c line 877
  • #81 gtk_paned_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkpaned.c line 1782
  • #82 gtk_widget_draw_internal
    at /home/gcampagn/gnome/gtk+/gtk/gtkwidget.c line 7015
  • #83 gtk_container_propagate_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3838
  • #84 gtk_container_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3658
  • #85 gtk_widget_draw_internal
    at /home/gcampagn/gnome/gtk+/gtk/gtkwidget.c line 7015
  • #86 gtk_container_propagate_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3838
  • #87 gtk_stack_render
    at /home/gcampagn/gnome/gtk+/gtk/gtkstack.c line 2203
  • #88 gtk_css_custom_gadget_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcsscustomgadget.c line 159
  • #89 gtk_css_gadget_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcssgadget.c line 877
  • #90 gtk_stack_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkstack.c line 2115
  • #91 gtk_widget_draw_internal
    at /home/gcampagn/gnome/gtk+/gtk/gtkwidget.c line 7015
  • #92 gtk_container_propagate_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3838
  • #93 gtk_container_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3658
  • #94 pnl_dock_bin_draw
    at /home/gcampagn/gnome/gnome-builder/contrib/pnl/pnl-dock-bin.c line 1386
  • #95 gtk_widget_draw_internal
    at /home/gcampagn/gnome/gtk+/gtk/gtkwidget.c line 7015
  • #96 gtk_container_propagate_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3838
  • #97 gtk_stack_render
    at /home/gcampagn/gnome/gtk+/gtk/gtkstack.c line 2203
  • #98 gtk_css_custom_gadget_draw
  • #99 gtk_css_gadget_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcssgadget.c line 877
  • #100 gtk_stack_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkstack.c line 2115
  • #101 gtk_widget_draw_internal
    at /home/gcampagn/gnome/gtk+/gtk/gtkwidget.c line 7015
  • #102 gtk_container_propagate_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3838
  • #103 gtk_container_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3658
  • #104 gtk_widget_draw_internal
    at /home/gcampagn/gnome/gtk+/gtk/gtkwidget.c line 7015
  • #105 gtk_container_propagate_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3838
  • #106 gtk_container_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkcontainer.c line 3658
  • #107 gtk_window_draw
    at /home/gcampagn/gnome/gtk+/gtk/gtkwindow.c line 10180
  • #108 gtk_widget_draw_internal
    at /home/gcampagn/gnome/gtk+/gtk/gtkwidget.c line 7015
  • #109 gtk_widget_render
    at /home/gcampagn/gnome/gtk+/gtk/gtkwidget.c line 17488
  • #110 gtk_main_do_event
    at /home/gcampagn/gnome/gtk+/gtk/gtkmain.c line 1807
  • #111 _gdk_event_emit
    at /home/gcampagn/gnome/gtk+/gdk/gdkevents.c line 73
  • #112 _gdk_window_process_updates_recurse_helper
    at /home/gcampagn/gnome/gtk+/gdk/gdkwindow.c line 3829
  • #113 gdk_window_process_updates_internal
    at /home/gcampagn/gnome/gtk+/gdk/gdkwindow.c line 3975
  • #114 gdk_window_process_updates_with_mode
    at /home/gcampagn/gnome/gtk+/gdk/gdkwindow.c line 4172
  • #115 _g_closure_invoke_va
    at /home/gcampagn/gnome/glib/gobject/gclosure.c line 867
  • #116 g_signal_emit_valist
    at /home/gcampagn/gnome/glib/gobject/gsignal.c line 3294
  • #117 g_signal_emit
    at /home/gcampagn/gnome/glib/gobject/gsignal.c line 3441
  • #118 _gdk_frame_clock_emit_paint
    at /home/gcampagn/gnome/gtk+/gdk/gdkframeclock.c line 640
  • #119 gdk_frame_clock_paint_idle
    at /home/gcampagn/gnome/gtk+/gdk/gdkframeclockidle.c line 430
  • #120 gdk_threads_dispatch
    at /home/gcampagn/gnome/gtk+/gdk/gdk.c line 743
  • #121 g_timeout_dispatch
    at /home/gcampagn/gnome/glib/glib/gmain.c line 4672
  • #122 g_main_dispatch
    at /home/gcampagn/gnome/glib/glib/gmain.c line 3201
  • #123 g_main_context_dispatch
    at /home/gcampagn/gnome/glib/glib/gmain.c line 3854
  • #124 g_main_context_iterate
    at /home/gcampagn/gnome/glib/glib/gmain.c line 3927
  • #125 g_main_context_iteration
    at /home/gcampagn/gnome/glib/glib/gmain.c line 3988
  • #126 g_application_run
    at /home/gcampagn/gnome/glib/gio/gapplication.c line 2381
  • #127 main
    at /home/gcampagn/gnome/gnome-builder/src/main.c line 68

Version: current master.

PS: Enjoy GUADEC, I can work around the problem for now, it's just annoying to lose data.
Comment 1 Sébastien Wilmet 2016-08-15 09:01:22 UTC
I can't reproduce the freeze with the GtkSourceView test-widget program.

The whitespace drawing code has been refactored recently, but normally the logic didn't change, at least not around the call to gtk_text_view_get_iter_at_location().
Comment 2 Sébastien Wilmet 2016-08-15 09:43:16 UTC
Is the CPU at 100%, i.e. is it an infinite loop? Or does it just freeze?
Comment 3 Giovanni Campagna 2016-08-15 18:53:35 UTC
Yeah it's an infinite loop. It loops in the while(TRUE) IN _gtk_source_space_drawer_draw

Oh and btw, I disabled visible spaces (was "Space", "Tab", "Trailing Only" before, nothing now) and I can't reproduce it any more.
Comment 4 Sébastien Wilmet 2016-08-15 19:53:31 UTC
Ok, I'll have a deeper look at the code soon.

In the meantime, if someone succeeds to reproduce the problem on GSV test-widget, let me know.
Comment 5 Sébastien Wilmet 2016-08-15 20:54:18 UTC
This branch:
https://git.gnome.org/browse/gtksourceview/log/?h=wip/space-drawing-fix

should fix the infinite loop. But it's not tested.
Comment 6 Sébastien Wilmet 2016-08-16 18:14:38 UTC
Pushed commit d461b1b45d1aeb81416d6b7a650fc29573dd64c5.

Feedback welcome. Reopen the bug if there is still an infinite loop.
Comment 7 Sébastien Wilmet 2016-08-16 18:41:12 UTC
Alright, now that I know what was going on, I was able to reproduce the bug:

With text wrapping off (it can maybe happen with text wrapping too, I didn't test), type on the last line lots of tabs, so that there is an horizontal scrolling.

It must be on the last line.
Comment 8 Alexandre Franke 2016-08-19 08:06:15 UTC
Thanks Sébastien, that issue was painful!