Abdelrazak Younes wrote:
> Peter Kümmel wrote:
>> Abdelrazak Younes wrote:
>>  > I suggest that you test this carefully before applying. You don't want
>>> to know how much time I spent to get it right on windows.
>>
>> Do you see/have problems with the attached patch?
>>
>> Here on windows it works fine. It also removes the
>> buggy Qt code.
> 
> Did you test with multiple windows?
> 

Yes, but it works as expected,
it only quits if views_.empty() is true.

> More comment below...
> 
>> ------------------------------------------------------------------------
>>
>> Index: src/frontends/qt4/GuiImplementation.C
>> ===================================================================
>> --- src/frontends/qt4/GuiImplementation.C    (revision 15972)
>> +++ src/frontends/qt4/GuiImplementation.C    (working copy)
>> @@ -104,9 +104,7 @@
>>      buildViewIds();
>>  
>>      if (views_.empty()) {
>> -        theLyXFunc().setLyXView(0);
>> -//        dispatch(FuncRequest(LFUN_LYX_QUIT));
>> -        return;
>> +        dispatch(FuncRequest(LFUN_LYX_QUIT, "force"));
> 
> I seem to remember that "force" was not doing anything really... not
> sure about that.

                case LFUN_LYX_QUIT:
                        if (argument != "force") {
                                if (!theApp->gui().closeAll())
                                        break;
                                lyx_view_ = 0;
                        }

didn't know what it is good for.
Seems this code is never used. LFUN_LYX_QUIT,  is only called in:
guiImplementation.C(107):               dispatch(FuncRequest(LFUN_LYX_QUIT, 
"force"));

>>      }
>>  
>>      theLyXFunc().setLyXView(views_.begin()->second);
>> Index: src/frontends/qt4/GuiApplication.C
>> ===================================================================
>> --- src/frontends/qt4/GuiApplication.C    (revision 15975)
>> +++ src/frontends/qt4/GuiApplication.C    (working copy)
>> @@ -159,25 +159,10 @@
>>      This feature be turned off by setting quitOnLastWindowClosed to
>> false.
>>      */
>>      setQuitOnLastWindowClosed(false);
>> -    // this connect should not be necessary: -    // we rely on a Qt
>> bug on Windows and maybe Linux
>> -    QObject::connect(this, SIGNAL(lastWindowClosed()),
>> -        this, SLOT(quitLyX()));
> 
> IIUC, then we rely on Qt behaving correctly on quitOnLastWindowClosed.
> This was not possible at the time I implement the multi-windows because
> some things were not destroyed in the correct order. But I have done a
> lot of cleanup in the LyX class after that so it is quite possible that
> it is OK now.

I use Qt 4.2.1. and it works on Windows. On Mac, too, but I don't know the
Qt version Bennett is using, wasn't it also 4.2.1?

I'll test it under Linux.



>>  
>>      guiApp = this;
>>  }
>>  
>> -
>> -void GuiApplication::quitLyX()
>> -{
>> -    theLyXFunc().setLyXView(0);
>> -
>> -    // trigger LFUN_LYX_QUIT instead of QApplication::quit() directly
>> -    // since LFUN_LYX_QUIT may have more cleanup stuff
>> -    dispatch(FuncRequest(LFUN_LYX_QUIT, "force"));
>> -}
>> -
>> -
>>  Clipboard& GuiApplication::clipboard()
>>  {
>>      return clipboard_;
>> Index: src/frontends/qt4/GuiApplication.h
>> ===================================================================
>> --- src/frontends/qt4/GuiApplication.h    (revision 15972)
>> +++ src/frontends/qt4/GuiApplication.h    (working copy)
>> @@ -83,10 +83,6 @@
>>      ///
>>      GuiFontLoader & guiFontLoader() { return font_loader_; }
>>  
>> -private Q_SLOTS:
>> -    /// request an LFUN_LYX_QUIT
>> -    void quitLyX();
>> -
>>  private:
>>      ///
>>      GuiImplementation gui_;
>> Index: src/lyx_main.C
>> ===================================================================
>> --- src/lyx_main.C    (revision 15973)
>> +++ src/lyx_main.C    (working copy)
>> @@ -410,15 +410,20 @@
>>  {
>>      lyxerr[Debug::INFO] << "Running QuitLyX." << endl;
>>  
>> +    theLyXFunc().setLyXView(0);
>> +
> 
> Yes, maybe a good idea to ensure that.

effectively it was only a code moving.

> 
>>      prepareExit();
>>  
>>      if (use_gui) {
>>          pimpl_->session_->writeFile();
>>          pimpl_->lyx_server_.reset();
>>          pimpl_->lyx_socket_.reset();
>> +        // this calls Qt's exit which does return
>>          pimpl_->application_->exit(0);
>>          theApp = 0;
>>      }
>> +    // this is the point of leaving lyx normally
>> +    ::exit(0);
> 
> You should not need to do that explicitily. LyX::exec() will return in
> main() and that should be the normal exit path.

without the exit(0) you go back into some Qt-event-handling code
and you will get a  crashes, so exit(0) is necessary at this place.
But this could also be a sign that something is wrong in the code.

Peter

Reply via email to