[KDE/Mac] Fixing graphics problems in KDE/Qt on Apple OS X

Ian Wadham iandw.au at gmail.com
Sun Apr 27 03:34:31 UTC 2014


Hi Nicolas,

On 26/04/2014, at 9:57 PM, Nicolas Pavillon wrote:
> Thanks for the impressively detailed discussion. I do not intend to discuss the details of the 
> graphical approaches as I am essentially ignorant about them, but more on the way of introducing
> this change in practice. 
> 
>> I found I could force it to switch in one of three ways [2]:
>> 
>> 1. Put --args -graphicssystem raster on the "open" command-line.
>> 2. Define environment variable QT_GRAPHICSSYSTEM=raster,
>>     either by exporting it or by prepending it to the command line.
>> 3. Execute QApplication::setGraphicsSystem("raster") in the app's
>>     code before the QApplication object is constructed.
> [snip]
> 
>> I think either of 1 or 2 could be made part of MacPorts installations of
>> all KDE apps and maybe also Qt apps.
>> 
>> So can we proceed with method 1 or 2 in MacPorts as soon as possible?

I take it that you agree in principle, but I see there are some practical
difficulties … ;-(

> Indeed method 3 seems overkill, as patching is usually not the preferred option. 
> However, I see some possible complications with approaches 1 and 2. To my 
> understanding, they both imply launching applications from the command line, which
> is not the usual way on Mac, with most KDE applications being shipped as Mac application
> bundles. 

I had in mind that we could use a modified plist file, adding something like
ProgramArguments in  file /System/Library/LaunchDaemons/com.apple.taskgated.plist,
but it seems to be not that easy.

I have done some further digging.  From what I can tell, KDE relies on CMake to
generate its plist files from the template file
/opt/local/share/cmake-2.8/Modules/MacOSXBundleInfo.plist.in,
as described in two CMake manual sections at
http://www.cmake.org/cmake/help/v2.8.12/cmake.html#prop_tgt:MACOSX_BUNDLE

> So, method 1 would not work, unless the whole process of application bundle generation
> is modified, which seems rather drastic. It would require to create wrapper bundles in which 
> a specific bash command is prepared to launch the application with the desired arguments.

The relevant KDE build code is at 'macro (KDE4_ADD_EXECUTABLE _target_NAME)'
in source file kdelibs/cmake/modules/KDE4Macros.cmake.  It would have to find a
unique custom Info.plist template from some unique location.  That template would be
just like the CMake template, but adding the lines:

        <key>ProgramArguments</key>
        <array>
                <string>${MACOSX_BUNDLE_EXECUTABLE_PATH}</string>
                <string>-graphicssystem</string>
                <string>raster</string>
        </array>

and then supplying a full executable path as the parameter value.

This is tricky, but I am willing to have a go at it if you are interested and the KDE build
guys have no objection to modifying KDE4Macros.cmake some more for Mac OS X.

> Similarly method 2 would be in the same situation, as application bundles blatantly ignore 
> all environment variables set the “normal” way through a .bash_profile, for example. And 
> while Macports can create its own build environment, it does not set anything at runtime 
> (I imagine Homebrew is the same, even though I don’t really know).
> 
> Method 2 could eventually be automated by setting an environment variable for bundle 
> applications, but this approach has been pretty unreliable to my experience. 
> One way is to globally set variables in the file ~/.MacOSX/environment.plist, but this 
> global approach would be up to the user, and is not supported from 10.7. 

I tried the ~/.MacOSX/environment.plist approach and it worked (I am on Lion, 10.7.5),
except that QT_GRAPHICSSYSTEM was then defined for *every* environment (e.g.
Terminal).  Not too bad, I suppose.  It is unlikely there are any synonyms for that symbol
in non-Qt apps.

> There is also the possibility of assigning application-specific variables in the Info.plist
> file of bundles, through the LSEnvironment key. This approach could be used by automatically
> patching the Info.plist of KDE applications, but I don’t know how well it is supported (I remember
> cases with previous OSs where it did not seem to work for me). I made a dummy Cocoa 
> application on 10.9, where it seems to work, but I don’t know if it is also a valid approach for 
> KDE applications.

I tried this, but it does not work for me.  According to StackOverflow it is new in Mountain Lion.
http://stackoverflow.com/questions/12165385/how-to-set-environment-variables-to-an-application-on-osx-mountain-lion
http://stackoverflow.com/questions/7501678/set-environment-variables-on-mac-os-x-lion

I'd like to have a closer look at option 3 [make sure the code does
        QApplication::setGraphicsSystem("raster");
before the QApplication object  is created].  This is a one-line change in libkdegames.
The code to do it is already there.  It just needs to be enabled for Q_OS_MAC [1].  That
would be better than nothing.  At least it would cure the problems in KDE Games,
including KBounce and Palapeli.  I have the access required to make that change.

But similar bugs might surface in other KDE apps, so I'll have a look and see if
there is somewhere in kdelibs to slot it in.  If there is, I could go on bended knee
to the powers-that-be of KDE, OR we could add it as a downstream patch for
KDE 4.13 and 4.14, to cover us for a year or two until KF 5 apps become common.

Cheers, Ian W.

[1] https://projects.kde.org/projects/kde/kdegames/libkdegames/repository/revisions/master/entry/CMakeLists.txt#L105
     https://projects.kde.org/projects/kde/kdegames/libkdegames/repository/revisions/master/entry/chooserastergraphicssystem.cpp
     This code relies on some less well-known features of C++.
     The comments explain what is going on.


More information about the kde-mac mailing list