> 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.

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.


- 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
> 
>

Reply via email to