Pavel Sanda wrote: > Scott Kostyshak wrote: > > On Fri, Jan 12, 2018 at 05:20:18PM +0000, Pavel Sanda wrote: > > > Pavel Sanda wrote: > > > > after pushing the outliner button we call in TocWidget::outline generic > > > > GuiApplication::dispatch which likely grabs currently active window; if > > > > that's > > > > the wrong window, it grabs wrong cursor position, moves wrong section > > > > and > > > > suddenly content of outliner and buffer structure are out of sync and > > > > crash is > > > > just matter of time.... > > > > > > > > Now this is not some glitch but rather conceptual problem how we handle > > > > lfuns from the widget(s). > > > > Opinions how to move forward? > > > > > > E.g. I could implement requested_guiview inside FuncRequest so we could > > > specify window > > > as the lfun request travels through GuiApplication. Any objections to > > > this solution? > > > > Bump. > > > > Scott > > I have patch along the lines above, i.e. when we request lyx::dispatch we also > provide guiview inside FuncRequest, so we can at least detect in > guiapplication::dispatch that current_view is different and stop there. So > this > crash is gone. > > Various attempts with raise/activewindow/setcurrentview for getting the right > window up in the first place did not seem to work. But it is difficult to be > sure, the scenario of multiple windows+undocked outliner is minefield with > crashes stemming from different reasons.
I commited the fix for the crash above in 8725614e3f. The other one would need longer debug session. Pavel > There is immediately different crash - apparently when we load already > opened buffer in new window, the load resets tocwidget from the oldwindow > and if you click to some toc item without focusing old window first you often > get crash, see below. > > Thread 1 "lyx" received signal SIGSEGV, Segmentation fault. > 0x00005555557742fd in lyx::CursorSlice::text (this=<optimized out>, > this=<optimized out>) at CursorSlice.h:119 > 119 Text * text() const { return inset_->getText(idx_); } > (gdb) bt > #0 0x00005555557742fd in lyx::CursorSlice::text (this=<optimized out>, > this=<optimized out>) at CursorSlice.h:119 > #1 lyx::DocIterator::innerTextSlice (this=0x7fffffffcbd0) at > DocIterator.cpp:233 > #2 0x0000555555774419 in > lyx::DocIterator::paragraphGotoArgument[abi:cxx11]() const (this=<optimized > out>) at DocIterator.cpp:247 > #3 0x00005555558ae1eb in lyx::TocItem::action > (this=this@entry=0x7fffffffcbd0) at TocBackend.cpp:75 > #4 0x0000555555bbcc5f in lyx::frontend::TocModels::goTo (this=<optimized > out>, type=..., index=...) at TocModel.cpp:316 > #5 0x0000555555d1ebc6 in lyx::frontend::TocWidget::goTo > (this=this@entry=0x555556b42330, index=...) at TocWidget.cpp:252 > #6 0x0000555555d1ec0b in lyx::frontend::TocWidget::on_tocTV_pressed > (this=0x555556b42330, index=...) at TocWidget.cpp:240 > ... > > I saw that when loading the buffer in new window the new guiview points to > buffer, which has pointer to old guiview. That trigers toc updates in old > window. Is this expected??? I seem to be somewhat lost why buffer has > pointer to guiview at all when multiple windows are possible. > > Pavel