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

Reply via email to