phase1geo / Minder

Mind-mapping application for Elementary OS
GNU General Public License v3.0
1.01k stars 69 forks source link

Crash when inserting nodes with Quick Entry #593

Closed prokoudine closed 8 months ago

prokoudine commented 8 months ago
  1. Add some text in the Quick Entry dialog:

Screenshot from 2024-01-09 16-58-50

  1. Click Insert.

Backtrace:

Thread 1 "com.github.phas" received signal SIGSEGV, Segmentation fault.
0x000055555575ed00 in export_text_import_text (self=0x555555b36510 [ExportText], 
    txt=0x555555b92f80 "Minder 1.16.0\n\tNew\n\t\tAdded support for adding node links in node, connection or group notes.\n\t\tAdded support for providing custom stickers.\n\t\tAdded support for callouts that can be applied to nodes.\n\t"..., tab_spaces=8, 
    da=0x555556fef000 [DrawArea], replace=0, nodes=0x5555574e2ad0) at ../src/exports/ExportText.vala:274
274       nodes.append_val( stack.index( 0 ).node );
(gdb) bt
#0  0x000055555575ed00 in export_text_import_text
    (self=0x555555b36510 [ExportText], txt=0x555555b92f80 "Minder 1.16.0\n\tNew\n\t\tAdded support for adding node links in node, connection or group notes.\n\t\tAdded support for providing custom stickers.\n\t\tAdded support for callouts that can be applied to nodes.\n\t"..., tab_spaces=8, da=0x555556fef000 [DrawArea], replace=0, nodes=0x5555574e2ad0) at ../src/exports/ExportText.vala:274
#1  0x00005555556a6d7f in quick_entry_handle_insert (self=0x5555571eec00 [QuickEntry]) at ../src/QuickEntry.vala:448
#2  0x00005555556a04e8 in ___lambda134_ (self=0x5555571eec00 [QuickEntry]) at ../src/QuickEntry.vala:138
#3  0x00005555556a0517 in ____lambda134__gtk_button_clicked (_sender=0x555557214cc0 [GtkButton], self=0x5555571eec00)
    at ../src/QuickEntry.vala:137
#7  0x00007ffff7f60c93 in <emit signal 'clicked' on instance 0x555557214cc0 [GtkButton]>
    (instance=instance@entry=0x555557214cc0, signal_id=<optimized out>, detail=detail@entry=0) at ../../../gobject/gsignal.c:3675
    #4  0x00007ffff7f60add in _g_closure_invoke_va
    (param_types=0x0, n_params=<optimized out>, args=0x7fffffffcb20, instance=0x555557214cc0, return_value=0x0, closure=0x55555753b6a0)
    at ../../../gobject/gclosure.c:895
    #5  signal_emit_valist_unlocked
    (instance=instance@entry=0x555557214cc0, signal_id=signal_id@entry=203, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffcb20)
    at ../../../gobject/gsignal.c:3516
    #6  0x00007ffff7f60bd6 in g_signal_emit_valist
    (instance=0x555557214cc0, signal_id=203, detail=0, var_args=var_args@entry=0x7fffffffcb20) at ../../../gobject/gsignal.c:3355
#8  0x00007ffff72d60e1 in gtk_button_clicked (button=button@entry=0x555557214cc0 [GtkButton]) at ../../../gtk/gtkbutton.c:1541
#9  0x00007ffff72d7fb0 in gtk_button_do_release (emit_clicked=1, button=0x555557214cc0 [GtkButton]) at ../../../gtk/gtkbutton.c:1845
#10 gtk_button_do_release (emit_clicked=1, button=0x555557214cc0 [GtkButton]) at ../../../gtk/gtkbutton.c:1832
#11 gtk_real_button_released (button=0x555557214cc0 [GtkButton]) at ../../../gtk/gtkbutton.c:1963
#12 0x00007ffff7f42130 in g_closure_invoke
    (closure=0x555555b17c60, return_value=0x0, n_param_values=1, param_values=0x7fffffffce20, invocation_hint=0x7fffffffcd70)
    at ../../../gobject/gclosure.c:832
#13 0x00007ffff7f6f5f0 in signal_emit_unlocked_R.isra.0
    (node=node@entry=0x7fffffffcef0, detail=detail@entry=0, instance=instance@entry=0x555557214cc0, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7fffffffce20) at ../../../gobject/gsignal.c:3813
#14 0x00007ffff7f609b1 in signal_emit_valist_unlocked
    (instance=instance@entry=0x555557214cc0, signal_id=signal_id@entry=202, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffd050)
    at ../../../gobject/gsignal.c:3612
#15 0x00007ffff7f60bd6 in g_signal_emit_valist (instance=0x555557214cc0, signal_id=202, detail=0, var_args=var_args@entry=0x7fffffffd050)
--Type <RET> for more, q to quit, c to continue without paging--c
    at ../../../gobject/gsignal.c:3355
#16 0x00007ffff7f60c93 in g_signal_emit (instance=instance@entry=0x555557214cc0, signal_id=<optimized out>, detail=detail@entry=0)
    at ../../../gobject/gsignal.c:3675
#17 0x00007ffff72d7d84 in multipress_released_cb
    (gesture=0x555557534310 [GtkGestureMultiPress], n_press=<optimized out>, x=<optimized out>, y=<optimized out>, widget=0x555557214cc0 [GtkButton]) at ../../../gtk/gtkbutton.c:666
#22 0x00007ffff7f60c93 in <emit signal 'released' on instance 0x555557534310 [GtkGestureMultiPress]>
    (instance=instance@entry=0x555557534310, signal_id=<optimized out>, detail=detail@entry=0) at ../../../gobject/gsignal.c:3675
    #18 0x00007ffff72999b5 in _gtk_marshal_VOID__INT_DOUBLE_DOUBLEv
    (closure=<optimized out>, return_value=<optimized out>, instance=<optimized out>, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x555555ad3420) at gtk/gtkmarshalers.c:4804
    #19 0x00007ffff7f60add in _g_closure_invoke_va
    (param_types=0x555555ad3420, n_params=<optimized out>, args=0x7fffffffd3a0, instance=0x555557534310, return_value=0x0, closure=0x55555756c5b0) at ../../../gobject/gclosure.c:895
    #20 signal_emit_valist_unlocked
    (instance=instance@entry=0x555557534310, signal_id=signal_id@entry=258, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffd3a0)
    at ../../../gobject/gsignal.c:3516
    #21 0x00007ffff7f60bd6 in g_signal_emit_valist
    (instance=0x555557534310, signal_id=258, detail=0, var_args=var_args@entry=0x7fffffffd3a0) at ../../../gobject/gsignal.c:3355
#23 0x00007ffff73aeb0e in gtk_gesture_multi_press_end (gesture=0x555557534310 [GtkGestureMultiPress], sequence=sequence@entry=0x0)
    at ../../../gtk/gtkgesturemultipress.c:287
#28 0x00007ffff7f60c93 in <emit signal 'end' on instance 0x555557534310 [GtkGestureMultiPress]>
    (instance=instance@entry=0x555557534310, signal_id=<optimized out>, detail=detail@entry=0) at ../../../gobject/gsignal.c:3675
    #24 0x00007ffff7f45df6 in g_cclosure_marshal_VOID__BOXEDv
    (closure=0x555555b3ad90, return_value=<optimized out>, instance=0x555557534310, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x555555b3adc0) at ../../../gobject/gmarshal.c:1686
    #25 0x00007ffff7f60add in _g_closure_invoke_va
    (param_types=0x555555b3adc0, n_params=<optimized out>, args=0x7fffffffd750, instance=0x555557534310, return_value=0x0, closure=0x555555b3ad90) at ../../../gobject/gclosure.c:895
    #26 signal_emit_valist_unlocked
    (instance=instance@entry=0x555557534310, signal_id=signal_id@entry=249, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffd750)
    at ../../../gobject/gsignal.c:3516
    #27 0x00007ffff7f60bd6 in g_signal_emit_valist
    (instance=0x555557534310, signal_id=249, detail=0, var_args=var_args@entry=0x7fffffffd750) at ../../../gobject/gsignal.c:3355
#29 0x00007ffff73a7bc7 in _gtk_gesture_set_recognized (sequence=0x0, recognized=0, gesture=0x555557534310 [GtkGestureMultiPress])
    at ../../../gtk/gtkgesture.c:346
#30 _gtk_gesture_check_recognized (gesture=gesture@entry=0x555557534310 [GtkGestureMultiPress], sequence=sequence@entry=0x0)
    at ../../../gtk/gtkgesture.c:387
#31 0x00007ffff73b022b in gtk_gesture_handle_event (controller=0x555557534310 [GtkGestureMultiPress], event=0x5555571f6910)
    at ../../../gtk/gtkgesture.c:784
#32 0x00007ffff73b0b92 in gtk_gesture_single_handle_event (controller=0x555557534310 [GtkGestureMultiPress], event=0x5555571f6910)
    at ../../../gtk/gtkgesturesingle.c:222
#33 0x00007ffff736d041 in gtk_event_controller_handle_event (controller=0x555557534310 [GtkGestureMultiPress], event=0x5555571f6910)
    at ../../../gtk/gtkeventcontroller.c:230
#34 0x00007ffff7546ec5 in _gtk_widget_run_controllers (widget=0x555557214cc0 [GtkButton], event=0x5555571f6910, phase=GTK_PHASE_BUBBLE)
    at ../../../gtk/gtkwidget.c:7447
#39 0x00007ffff7f60c93 in <emit signal 'button-release-event' on instance 0x555557214cc0 [GtkButton]>
    (instance=instance@entry=0x555557214cc0, signal_id=<optimized out>, detail=detail@entry=0) at ../../../gobject/gsignal.c:3675
    #35 0x00007ffff72980d8 in _gtk_marshal_BOOLEAN__BOXEDv
    (closure=0x5555559bd5c0, return_value=0x7fffffffdaf0, instance=<optimized out>, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x5555559bd5f0) at gtk/gtkmarshalers.c:130
    #36 0x00007ffff7f60add in _g_closure_invoke_va
    (param_types=0x5555559bd5f0, n_params=<optimized out>, args=0x7fffffffdbd0, instance=0x555557214cc0, return_value=0x7fffffffdaf0, closure=0x5555559bd5c0) at ../../../gobject/gclosure.c:895
    #37 signal_emit_valist_unlocked
    (instance=instance@entry=0x555557214cc0, signal_id=signal_id@entry=84, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffdbd0)
    at ../../../gobject/gsignal.c:3516
    #38 0x00007ffff7f60bd6 in g_signal_emit_valist
    (instance=0x555557214cc0, signal_id=84, detail=0, var_args=var_args@entry=0x7fffffffdbd0) at ../../../gobject/gsignal.c:3355
#40 0x00007ffff754f154 in gtk_widget_event_internal.part.0.lto_priv.0 (widget=0x555557214cc0 [GtkButton], event=0x5555571f6910)
    at ../../../gtk/gtkwidget.c:7812
#41 0x00007ffff73f7b1e in propagate_event_up (topmost=<optimized out>, event=<optimized out>, widget=0x555557214cc0 [GtkButton])
    at ../../../gtk/gtkmain.c:2598
#42 propagate_event
    (widget=widget@entry=0x555557214cc0 [GtkButton], event=event@entry=0x5555571f6910, captured=captured@entry=0, topmost=topmost@entry=0x0) at ../../../gtk/gtkmain.c:2701
#43 0x00007ffff73f7c40 in gtk_propagate_event (event=0x5555571f6910, widget=0x555557214cc0 [GtkButton]) at ../../../gtk/gtkmain.c:2735
#44 0x00007ffff73f85f6 in gtk_main_do_event (event=0x5555571f6910) at ../../../gtk/gtkmain.c:1921
#45 gtk_main_do_event (event=<optimized out>) at ../../../gtk/gtkmain.c:1691
#46 0x00007ffff7a798b7 in _gdk_event_emit (event=0x5555571f6910) at ../../../gdk/gdkevents.c:73
#47 _gdk_event_emit (event=0x5555571f6910) at ../../../gdk/gdkevents.c:67
#48 0x00007ffff7acfb16 in gdk_event_source_dispatch.lto_priv () at ../../../gdk/x11/gdkeventsource.c:354
#49 0x00007ffff7e40b2c in g_main_dispatch (context=0x55555595b720) at ../../../glib/gmain.c:3476
#50 0x00007ffff7e9c46f in g_main_context_dispatch_unlocked (context=0x55555595b720) at ../../../glib/gmain.c:4284
#51 g_main_context_iterate_unlocked.isra.0 (context=0x55555595b720, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>)
    at ../../../glib/gmain.c:4349
#52 0x00007ffff7e4146f in g_main_loop_run (loop=0x5555570f2cc0) at ../../../glib/gmain.c:4551
#53 0x00007ffff73f61ed in gtk_main () at ../../../gtk/gtkmain.c:1329
#54 0x0000555555578923 in minder_real_activate (base=0x55555594fd50 [Minder]) at ../src/Application.vala:155
#58 0x00007ffff7f60c93 in <emit signal 'activate' on instance 0x55555594fd50 [Minder]>
    (instance=instance@entry=0x55555594fd50, signal_id=<optimized out>, detail=detail@entry=0) at ../../../gobject/gsignal.c:3675
    #55 0x00007ffff7f60add in _g_closure_invoke_va
    (param_types=0x0, n_params=<optimized out>, args=0x7fffffffe1a0, instance=0x55555594fd50, return_value=0x0, closure=0x55555594d2e0)
    at ../../../gobject/gclosure.c:895
    #56 signal_emit_valist_unlocked
    (instance=instance@entry=0x55555594fd50, signal_id=signal_id@entry=8, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffe1a0)
    at ../../../gobject/gsignal.c:3516
    #57 0x00007ffff7f60bd6 in g_signal_emit_valist (instance=0x55555594fd50, signal_id=8, detail=0, var_args=var_args@entry=0x7fffffffe1a0)
    at ../../../gobject/gsignal.c:3355
#59 0x00007ffff709d533 in g_application_activate (application=0x55555594fd50 [Minder]) at ../../../gio/gapplication.c:2316
#60 0x00007ffff70a29a8 in g_application_real_local_command_line
    (application=0x55555594fd50 [Minder], arguments=0x7fffffffe2e8, exit_status=0x7fffffffe2e4) at ../../../gio/gapplication.c:1152
#61 0x00007ffff70a2af8 in g_application_run (application=0x55555594fd50 [Minder], argc=<optimized out>, argv=0x7fffffffe4b8)
    at ../../../gio/gapplication.c:2546
#62 0x000055555557b034 in minder_main (args=0x7fffffffe4b8, args_length1=1) at ../src/Application.vala:282
#63 0x000055555557b07b in main (argc=1, argv=0x7fffffffe4b8) at ../src/Application.vala:266
phase1geo commented 8 months ago

Okay, a couple of things here.

First, the input in the quick entry field is not properly formatted to insert the nodes that you are looking to insert. The bad input to the text parser when the Insert button is pressed is leading to the application crashing. The information button in the lower left side of the quick entry field provides the proper syntax hints.

With that said, obviously the application crashing is really bad.

I have committed changes to the master branch which has the following changes which will keep the application from crashing and it will help to keep the user from inputting bad syntax:

  1. When inserting quick entry text, the first line will be pre-populated with the required "- " syntax so that the user can begin inputting node title text immediately.

  2. The Tab key will work as before, but will automatically insert if the current line is blank "- " after the Tab has been inserted.

  3. I have added support for Shift+Tab which will unindent the current line by one and will automatically insert "- " if the currently line is blank.

  4. If the user has input text that would cause an application crash, hitting the Insert or Replace button will automatically display the syntax help text with the line indicating how to insert new nodes highlighted.

I'm sure that more work can be done in the quick entry field to improve the ability to create proper outlines, but this work should help to improve the current experience.

prokoudine commented 8 months ago

Lovely, thank you! I haven't used Quick Entry for quite some time, so obviously I forgot the right way to do it :)