> On Dec. 25, 2015, 3:42 p.m., René J.V. Bertin wrote: > > src/kdeinit/kinit_mac.mm, lines 662-666 > > <https://git.reviewboard.kde.org/r/126161/diff/4/?file=418469#file418469line662> > > > > I'd love to add `[NSApp activateIgnoringOtherApps:YES]` and/or `[NSApp > > unhide]` here, preceded by `[NSApplication sharedApplication]` so that the > > spawned `executable` appears in front and not behind the windows of the > > "parent" application. > > > > I think that's a very sensible thing to do, but sadly those calls are > > part of (or call into) the SDKs that are off-limits between a `fork()` and > > an `exec()`. > > > > This really makes me reconsider to use a wrapper, because it quickly > > grows old 1) having to wait for an expected application to appear, 2) > > realise it must have opened somewhere in the background and 3) go dig it up. > > > > If only I could be sure that the spawned application is NOT supposed to > > inherit the environment and other context from kdeinit5. In that case I > > could rewrite the command to execute so that it uses LaunchServices ... via > > a proxy that's already available (`/usr/bin/open`). > > > > NB: this may well be why `[NSProcessInfo setProcessName:]` doesn't > > appear to have the intended effect. > > > > So, David, what's worse here — introducing an additional layer or > > putting up with applications that play hide and seek? > > David Faure wrote: > Starting apps via kdeinit is only an optimization. It's perfectly OK to > start apps directly with QProcess instead. So yes, the spawned application is > NOT supposed to inherit the environment from kdeinit5. > > As previously stated, I strongly recommend to avoid the whole > complication of "stuff I can't do between fork and exec" on OSX, but not > using fork and exec at all (wrapper or not), and just starting the other > process directly with QProcess. If that doesn't bring the new app to the > front, maybe that's a QProcess bug or missing feature? If you think about > this as a "pure Qt application developer", such a developer would expect > QProcess to be able to start a GUI app and have it pop up to the front. Maybe > you can write a small test with QProcess, to check if that works out of the > box (maybe all your troubles actually come from the indirection via > kdeinit...) > > René J.V. Bertin wrote: > I will indeed have to have another look at what QProcess does exactly in > qprocess_unix, but a priori it looks a variant on the fork+exec scheme. There > is support for app bundles, but that works by obtaining the bundle executable > and launching it as it if were a regular application. > > The underlying issue is not with Qt, it's something specific to OS X. > Maybe there's a reason for it: it could be a cheap way to avoid stealing > focus from the "parent" process. The app bundle detection could be used to > channel spawning the new process through LaunchServices so that it does open > in the foreground, and that could even be extended to cover symlinks that > point inside an app bundle (i.e. open `foo.app` instead of > `/path/to/foo.app/Contents/MacOS/foo_bundle_exec`). Qt's design choices may > make that impossible though: QProcess's implementatin (notably > `QProcessPrivate::startProcess()`) is quite complex and if it is supposed to > support Posix-style communication between parent and child (including pipes) > then LaunchServices is probably out of the question. I don't think there is > any such assumption in kdeinit, correct? > > I have to come back a bit on the idea of using `/usr/bin/open` : it tends > to use Terminal.app to launch shell scripts and "certain" regular executables > ("BSD utilities" in Mac speak). That's evidently not an option. I do have > wrapper utilities lying around that I hacked together, I'll see if and how I > can refactor relevant code from them into kinit_mac.mm .
FWIW, a contact at Apple just told me "As far as spawning processes in general, please don't use system() or fork()/exec(). Please use the posix_spawn syscall instead as it is much cleaner and has less overhead." I'm not exactly familiar with the API. `QProcess` apparently uses it on QNX, but that appears to be a slightly different implementation. Anyone here know the API? https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/posix_spawn.2.html - René J.V. ----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://git.reviewboard.kde.org/r/126161/#review90098 ----------------------------------------------------------- On Nov. 26, 2015, 5:20 p.m., René J.V. Bertin wrote: > > ----------------------------------------------------------- > This is an automatically generated e-mail. To reply, visit: > https://git.reviewboard.kde.org/r/126161/ > ----------------------------------------------------------- > > (Updated Nov. 26, 2015, 5:20 p.m.) > > > Review request for KDE Software on Mac OS X and KDE Frameworks. > > > Repository: kinit > > > Description > ------- > > This patch addresses several issues with the OS X adaptations: > > -1 replaces the obsolete Q_OS_MAC with Q_OS_OSX > -2 builds the relevant applications `nongui` instead of as app bundles > -3 turns klauncher into an "agent" by setting `LSUIElement` to true > programmatically > -4 ports a patch that has been in MacPorts' `port:kdelibs4` since October > 14th 2009, which prevents a kdeinit crash that is caused by calling exec > after `fork()` in an application that has used non-POSIX APIs and/or calling > those APIs in the exec'ed application. This patch (originally by MacPorts > developers Jeremy Lainé and Jeremy Lavergne) rearranges call order and uses a > proxy application to do the actual exec. > > > Diffs > ----- > > src/kdeinit/CMakeLists.txt f94db71 > src/kdeinit/kdeinit5_proxy.mm PRE-CREATION > src/kdeinit/kinit.cpp a18008a > src/kdeinit/kinit_mac.mm PRE-CREATION > src/klauncher/CMakeLists.txt 746edfa > src/klauncher/klauncher.h e155f72 > src/klauncher/klauncher.cpp 8b3d343 > src/klauncher/klauncher_main.cpp f69aaa5 > src/start_kdeinit/CMakeLists.txt 46d6cb3 > src/wrapper.cpp 95b7ec2 > > Diff: https://git.reviewboard.kde.org/r/126161/diff/ > > > Testing > ------- > > On OS X 10.9.5 with Qt 5.5.1 and KF5rameworks 5.16.0 . With this patch, > starting `kded5` will launch kdeinit5 and klauncher5 as expected, but > `kdeinit5 --kded` does not yet launch `kded5`. This is probably acceptable > for typical KF5 use on OS X (kded5 can be launched as a login item or as a > LaunchAgent) but I will have another look at why the kded isn't started. > > I am not yet able to perform further testing; practice will for instance have > to show whether point 2 above needs revision (apps that need to be installed > as app bundles). > > Similarly it will have to be seen whether point 3 above has any drawbacks. > Applications running as agents do not show up in the Dock or App Switcher. > Thus, klauncher will not be able to "turn itself into" an application that > does have a full GUI presence with my current modification. I don't know if > that's supposed to be possible though. > NB: I have been building the KDE4 klauncher in a way that makes it impossible > to construct a GUI at all, so I'm not expecting issues in KF5 as long as > klauncher's role hasn't evolved too much. > > > Thanks, > > René J.V. Bertin > >
_______________________________________________ Kde-frameworks-devel mailing list Kde-frameworks-devel@kde.org https://mail.kde.org/mailman/listinfo/kde-frameworks-devel