> On Sept. 25, 2014, 8:07 p.m., Thomas Lübking wrote: > > Aside Thiagos concern, what actually causes the menubar/docker item stuff? > > > > Quoting QApplication (4.8): > > > On X11, the window system is initialized if GUIenabled is true. If > > > GUIenabled is false, the application does not connect to the X server. On > > > Windows and Mac OS, currently the window system is always initialized, > > > regardless of the value of GUIenabled. This may change in future versions > > > of Qt. > > > > So it's perhaps rather a statement in KApplicationPrivate::init() which > > causes this? > > There aren't too many depending on GUIEnabled ... ;-) > > René J.V. Bertin wrote: > Thiagos? > > The menubar/Dock "item stuff" is the result of `qt_mac_loadMenuNib` in > `qapplication_mac.mm`, which is called when > `!QApplication::testAttribute(Qt::AA_MacPluginApplication)`. Setting > `GUIenabled=false` has that effect, ultimately. > > Thomas Lübking wrote: > > Thiagos? > > By mail: > http://lists.kde.org/?l=kde-core-devel&m=141166670217317&w=2 > > > result of qt_mac_loadMenuNib in qapplication_mac.mm > > Ok, so the API doc lied to me ;-) > Since the attributes are static, you could simply set it before creating > the application in the relevant main funcs, could you? > (Though i actually don't see it set anywhere - but it's late and i'm > tired...) > > René J.V. Bertin wrote: > Ah, apparently Thiago missed the multiple recent reminders of the fact > that we OS X users are going to be "stuck" in/with KDE4 for a tad longer than > the average Linux user (Debian apart, maybe? ;)) > Anyway, I guess I'm going to have to look again at how exactly > `GUIenabled=false` leads to the qt_menu.nib not being loaded in Qt ... > > I don't think the API docs lied to you. Not loading the menu nib doesn't > mean that the window system is not initialised ... > > René J.V. Bertin wrote: > Taking this back to RR: > > On Friday September 26 2014 13:33:20 Thomas Lübking wrote: > > On Freitag, 26. September 2014 10:41:39 CEST, Ben Cooksley wrote: > > > Applying a solution to a single OS is inherently wrong > > > > > On Fri, Sep 26, 2014 at 5:01 PM, Thiago Macieira <thi...@kde.org> > wrote: > > >> And still it needs to be studied for Qt5 > > > > Afaics there are two major issues with this patch (and actually they > make everyone right in this thread ;-) > > > > 1. It's Qt4 only > > 2. It's the broadsword > > > > We can skip 1 (which is not "fixable", the API doesn't exist anymore) > and should focus on 2 - and the foil may implicitly handle this as well ;-) > > You know 4.8.7 is in the making? ;) > Also, concerning QApplication (4.8): > >On X11, the window system is initialized if GUIenabled is true. If > GUIenabled is false, the application does not connect to the X server > > That may be true for Qapplication, but KApplication does preciously > little with GUIenabled. It's either ignored on X11, or only serves to > determine whether the clipboard is initialised or not. > > > It is too broadsword as, as mentioned by Thiago, the GUIEnabled > parameter has several implications on all systems (let alone that the patch > attempts to control it by the so far unrelated NOGUI cmake switch). > > True, but what *does* the NOGUI switch do? Not much that I can see, until > now. I'd still like to make a case that if there is such a switch, it'd best > do what you'd expect it to do. It's unambiguous as can be, and removes the > burden of having to remember the exact call and add it to code you're working > on - actually, also the burden of knowing about the issue in the first place! > This is the same argument a Qt5 dev gave me for their heuristics menurole > guessing feature. > > > Luckily the behavior whether there's a menubar and stuff on OSX can be > controlled by a QCoreApplication attribute that *is* OSX specific: > > > > Qt::AA_MacPluginApplication > > [So I went on a little profiling spree :)] > > Indeed, but this is not exactly what `GUIenabled=false` leads to > ultimately in Qt4, on OS X. `qt_appType` is set to `QApplication::Tty` which > is in fact the default (at least in Qt4) instead of > `QApplication::GuiClient`, which in turn sets the global bool variable > `qt_is_gui_used=false`. > `qt_is_gui_used` is read in the OS X `qt_init()` function (in > qapplication_mac.mm), and controls a whole lot more than what > `AA_MacPluginApplication` controls. Roughly speaking, one can resume that the > window system isn't initialised *at all* when `qt_is_gui_used==false`. > Note that `qt_init` reads out the `LSUIElement` flag (as well as > `LSBackgroundOnly`) from the app's InfoDictionary (Info.plist or set > programmatically). This is then used to call `TransformProcessType(&psn, > kProcessTransformToForegroundApplication)`, or not. (I'm surprised to see > that it'd be up to the application to take that Info.plist flag into account; > I'd have guessed the window manager would take care of it.) > > *FYI*: In Qt 5.3.1, `qt_appType` is called `qapplication_type`, > `qt_is_gui_used` exists, but is no longer used in `qt_init` which I've found > only in `qapplication_qpa.cpp` and not in any platform-specific code. > `AA_MacPluginApplication` is read out in > `QCocoaIntegration::QCocoaIntegration` (qcocoaintegration.mm). That same ctor > handles the readout of `LSUIElement` through a call to > `qt_mac_transformProccessToForegroundApplication()` (qcocoahelpers.mm), which > is called only when > `qEnvironmentVariableIsEmpty("QT_MAC_DISABLE_FOREGROUND_APPLICATION_TRANSFORM")` > (which just checks `getenv`, nothing more fancy). > Most of the window system calls made when `qt_is_gui_used==true` in > Qt4.8 but independent of AA_MacPluginApplication have moved all over the > place in Qt 5.3 . > > > So my very first attempt would be to set that (unconditionally, ie. on > all systems - it should be idempotent outside OSX anyway) before > instantiating the application in the main funcs of the problematic > applications AND LEAVE THE GUIEnabled PARAMETER UNTOUCHED. > > Not sure it's not as simple as that. Reading back up on what > `GUIenabled=false` makes me understand why an application like kglobabaccel > crashes (aborts) when build with that setting. It tries to do things for > which the window system must have been initialised. > I'll try to see what happens when I do > `QApplication::setAttribute(AA_MacPluginApplication)` or `ditto > AA_DontUseNativeMenuBar` (but without my CoreFoundation patch) in > kglobalaccel. > > But supposing that it indeed has the intended effect, surely you're not > proposing to make it the default, obliging every applications that does want > to present a full-blown GUI to unset the attribute?! > > > Charmingly, such change would be Qt5 compatible =) > > It remains to be seen whether the attribute has the same effect. > Fortunately I do have a little Qt5-only test application with which I can > test such things. > > > Personally I doubt that this needs to or should be injected by a cmake > parameter, but added directly (notably since this will only affect a fistful > of applications in KDE anyway) > > "this" being what, the NOGUI cmake parameter? There's quite a few of > those around in kde-workspace, kde-baseapps and (esp.) the kdepim packages. > > René J.V. Bertin wrote: > OK, so I added `QApplication::setAttribute(AA_MacPluginApplication)` to > kglobalaccel, as close as possible to the beginning of KDEMain (= instead of > the CoreFoundation code that I pushed to HEAD earlier today). In this > location, setting that attribute (or `AA_DontUseNativeMenuBar`) did NOT have > the intended effect: kglobalaccel remained visible in the Dock, the > AppSwitcher, and still had a menubar with the application menu. I didn't > really note whether that menu had an items in it, but that's a moot point. > > When I did the same tests with the Qt5 'systray' example application, I > got a very comparable result. With both attributes I still get the same > presence in Dock, app switcher and menubar. With `AA_MacPluginApplication` > the system tray *icon* disappears, but the menu can still be obtained by > clicking in the empty spot (which of course takes up space). With > `AA_MacPluginApplication`, the application menu is empty, but visible on the > menu bar. That's probably unavoidable (and means the app doesn't have its own > menu) when an application is visible in the dock and app switcher. > > The only way for that example app to become a true plugin is to use the > aforementioned CoreFoundation code : > > ` CFBundleRef mainBundle = CFBundleGetMainBundle(); > if (mainBundle) { > // get the application's Info Dictionary. For app bundles this > would live in the bundle's Info.plist, > // for regular executables it is obtained in another way. > CFMutableDictionaryRef infoDict = (CFMutableDictionaryRef) > CFBundleGetInfoDictionary(mainBundle); > if (infoDict) { > // Add or set the "LSUIElement" key with/to value "1". This > can simply be a CFString. > CFDictionarySetValue(infoDict, CFSTR("LSUIElement"), > CFSTR("1")); > // That's it. We're now considered as an "agent" by the > window server, and thus will have > // neither menubar nor presence in the Dock or App Switcher. > } > } > ` > which would be suitable for an application that lives in the systemtray > or doesn't have a public interface at all unless it decides to open a dialog. > > Note also that the `QCocoaIntegration` ctor UNSETS > `AA_DontUseNativeMenuBar` as one of its first actions ... and that > `TransformProcessType` (see my previous post) can only make a foreground > application out of a background application on OS X 10.6 and earlier.
That'd be ```C++ CFBundleRef mainBundle = CFBundleGetMainBundle(); if (mainBundle) { // get the application's Info Dictionary. For app bundles this would live in the bundle's Info.plist, // for regular executables it is obtained in another way. CFMutableDictionaryRef infoDict = (CFMutableDictionaryRef) CFBundleGetInfoDictionary(mainBundle); if (infoDict) { // Add or set the "LSUIElement" key with/to value "1". This can simply be a CFString. CFDictionarySetValue(infoDict, CFSTR("LSUIElement"), CFSTR("1")); // That's it. We're now considered as an "agent" by the window server, and thus will have // neither menubar nor presence in the Dock or App Switcher. } } ``` - René J.V. ----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://git.reviewboard.kde.org/r/120363/#review67442 ----------------------------------------------------------- On Sept. 25, 2014, 3:32 p.m., René J.V. Bertin wrote: > > ----------------------------------------------------------- > This is an automatically generated e-mail. To reply, visit: > https://git.reviewboard.kde.org/r/120363/ > ----------------------------------------------------------- > > (Updated Sept. 25, 2014, 3:32 p.m.) > > > Review request for KDE Software on Mac OS X and kdelibs. > > > Repository: kdelibs > > > Description > ------- > > Applications can be defined in their CMake file as being `NOGUI`, but until > now this has had very limited effect. Especially on OS X, those applications > can still construct a minimal GUI and thus have "visual presence" in the Dock > and application switcher (and have a menubar as well). > > This patch proposes to define a preprocessor token, `KDE_WITHOUT_GUI`, for > those targets, and uses that token to set the default value for the > `GUIenabled` option of the `KApplication` and `KUniqueApplication` classes. > > This could potentially be combined on OS X with the CoreFoundation call that > turns a running application into an "agent" (see > https://git.reviewboard.kde.org/r/120354). > > > Diffs > ----- > > cmake/modules/KDE4Macros.cmake 073d726 > kdeui/kernel/kapplication.h fa2ab26 > kdeui/kernel/kapplication.cpp b093034 > kdeui/kernel/kuniqueapplication.h e05dcd7 > > Diff: https://git.reviewboard.kde.org/r/120363/diff/ > > > Testing > ------- > > On OS X 10.6.8 with kdelibs 4.14.1 (git/kde4.14), rebuilt kdelibs, > kde-workspace, kde-runtime, kde-baseapps, kdepim-runtime and nepomuk-core. > If the documentation I read is correct, the `GUIenabled` switch has no effect > on Linux, so this patch shouldn't have any either on that OS. > > > Thanks, > > René J.V. Bertin > >