From kde-core-devel Fri May 04 16:04:02 2001 From: Lubos Lunak Date: Fri, 04 May 2001 16:04:02 +0000 To: kde-core-devel Subject: app startup wrapper again ( now with some source for free ) X-MARC-Message: https://marc.info/?l=kde-core-devel&m=98899769819590 MIME-Version: 1 Content-Type: multipart/mixed; boundary="--------------Boundary-00=_QAJTOB62QDX5DLPV0A0N" --------------Boundary-00=_QAJTOB62QDX5DLPV0A0N Content-Type: text/plain; charset="iso-8859-2" Content-Transfer-Encoding: quoted-printable Hello, since nobody expressed insterest in my idea of a wrapper for starting KD= E=20 apps ( see http://lists.kde.org/?l=3Dkde-core-devel&m=3D98832152529961&w=3D= 2 ), I=20 decided to find the time to at least partially implement it, which will=20 probably get more attention ( I forgot, source always gets more attention= =20 here than just ideas ). See the attached patches ( it also includes one kdeinit fix that I've=20 already commited ). Right now, it can do this : - start apps via kdeinit even if started from e.g. konsole - start_on_desktop ( i.e. mapping first window of the app to desktop that= was=20 active when the app was started ), again, even if started e.g. from konso= le - redirecting stdout and stderr of kdeinit started app to the console fro= m=20 which the wrapper was started ( I'm not actually very sure if it's 100% o= k or=20 if it works just by accident ) - wrapper app passes all signals it gets to the "real" process, so you ma= n=20 e.g. ctrl+z the app - wrapper app waits for the "real" process to finish and only after that = it=20 quits, it doesn't return it's return status though ( but it probably coul= d be=20 done too ) - it notices KWin and possibly other apps about the starting app using pu= re=20 X, no DCOP or anything like that, and it's a simple plain text message=20 listing several "name=3Dvalue" - this is because I like it better this wa= y (=20 DCOP can't be used in the kdeinit process ), it can be easily used by oth= er=20 WMs or Gnome - I'd like to convert the taskbar to this too and declare=20 appStarted() and clientDied() DCOP calls obsolete, so we will get also=20 app-start notification The only really missing part ( besides bugfixing and general improving )= now=20 is configuration - kcontrol module, settings things up, list of apps that= =20 don't want to use this or that, etc. I think this can be easily done for=20 KDE2.2, and since I noted that gnomers are designing galf ( gnome app lau= nch=20 feedback ) these days too, it could be even standardized by then with som= e=20 luck. If this will be okayed for commiting, I'll join the discussion on=20 xdg-list@freedesktop.org and try to persuade them to use the same approac= h (=20 gnomers actually seem to want to use app-starting with the help of toolki= t,=20 which is a thing I ingored for now, only left a room for extending, so th= e=20 result could be a merge of these two approaches ). =20 Right now, because the configuration is missing, you can either start th= e=20 apps as 'kwrapper ', or make symlinks e.g. konsole->kwrapper = (=20 don't use symlinks for apps that don't have kdeinit module, you'll most=20 probably get infinite loop now ). Ok, now questions ( Waldo ? ): - The most important : May I commit ? ( read : is it ok for KDE2.2 ? ) - What exactly is kdeinit_shell supposed to do ? - kdeinit_wrapper simply starts an app using kdeinit and nothing else, = it's=20 used for things like starting kwin, so it should ignore all the above=20 described things - kwrapper ( i.e. what I added ) - my idea is that this will simply mak= e=20 the app look like it was really started in the console ( as far as possib= le=20 ), so it will pass env, tty etc. and do start-app notify etc. - kdeinit_shell - well, my idea is that this will be simply kwrapper=20 without all that IMHO unnecessary burden requiring another process - no t= ty=20 passing, no signals passing, but it will still do app-starting notify etc= =2E - What else uses kdeinit ? I'm getting a bit lost in the KLauncher/KRun=20 sources :(. Probably enough for now ... unless I forgot something important. Yes, one important thing : I don't see the main reason of this in gettin= g=20 apps loaded faster and use less memory ( but it counts of course ), I see= all=20 the three things equally important ( kdeinit loading, app-start notificat= ion,=20 start_on_desktop ) =20 Lubos Lunak ( Seli on #kde ) -- l.lunak@email.cz ; l.lunak@kde.org http://dforce.sh.cvut.cz/~seli --------------Boundary-00=_QAJTOB62QDX5DLPV0A0N Content-Type: application/x-bzip2; name="kwrapper.tar.bz2" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="kwrapper.tar.bz2" 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 --------------Boundary-00=_QAJTOB62QDX5DLPV0A0N--