A Qt replacement for KGlobal::ref and deref

Stephen Kelly steveire at gmail.com
Wed Feb 9 20:01:09 GMT 2011


Hi,

KGLobal::ref and KGLobal::deref are used in KDE instead of 
QApplication::setQuitOnLastWindowClosed(true).

The reason for this is that with the (de)ref solution

* KJobs which were not finished before the last window was closed will be 
completed before the app exits
* KRun completes its task before the app exits if the last window is closed.

KGlobal::ref and deref are the only internal KDE dependencies of KJob, so 
KJob would be a Qt only library if it didn't need them, and it could be used 
by Qt-only applications. I thought this was a small fry to try to proof-of-
concept the idea of more modularisation of functional libraries and less 
global or platformy dependencies in kdelibs.

http://techbase.kde.org/Projects/KDELibsModifications

I asked Thiago if I the patch would be applied if I wrote one for 
QCoreApplication to fill the role instead, so that we could do 
s/KGlobal::ref/qApp->ref/g in KDE, and QCoreApplication::ref and deref would 
fill the role that the KGlobal methods currently do, and QMainWindow (or 
maybe all top level QWidgets) would use them. 

Obviously there would need to be more thought into how it would react with 
setQuitOnLastWindowClosed etc, but it doesn't matter because Thiago said the 
patch would not be applied. The argument against it was that if the last 
window of a gui app is closed, the app should quit and any running jobs 
should be either completed by then or terminated before the last window is 
allowed to be closed. Thiago thought that ref/deref were a bad idea in the 
first place and shouldn't be in Qt. I disagree, but there you have it.

It's possible that I just didn't argue the case for a ref/deref solution in 
Qt well enough because I don't know all the use cases. It's not clear to me 
whether systray icons which outlive the last main window (and allow 
restoring it) and are managed by the application are affected by 
quitOnLastWindowClosed.

Thiago did also offer the solution of a separate service providing the 
refcounted quit functionality, but the problem with that is that all 
libraries and applications need to use the same ref/deref code otherwise it 
won't work. If I create a separate library with a service providing that 
functionality it wouldn't help because there would be no guarantee that all 
apps and libraries would use it. The solution would need to be in Qt. It 
works in KDE of course because all KDE libraries and applications use 
KGlobal::ref and deref, which perpetuates our walled garden.

So any other ideas on a replacement for KGlobal::ref and deref to make KJob 
a Qt only library by extending Qt some other way or otherwise?

All the best,

Steve.






More information about the kde-core-devel mailing list