mirror of https://github.com/cutefishos/appmotor
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
5.7 KiB
Plaintext
163 lines
5.7 KiB
Plaintext
/*! \page limitations Limitations and known issues
|
|
|
|
\section issue-exit Using _exit() instead of exit()
|
|
|
|
Use \c _exit() instead of \c exit() with QML, Qt, and MeeGo Touch
|
|
boosters. However, do not use it with exec booster.
|
|
|
|
The basic difference between \c exit() and \c _exit() is that the former
|
|
performs cleanup related to user-mode constructs in the library and
|
|
calls user-supplied cleanup-functions, whereas the latter performs
|
|
only the kernel cleanup for the process.
|
|
|
|
The function \c _exit() terminates the calling process immediately. Any
|
|
open file descriptors belonging to the process are closed; any
|
|
children of the process are inherited by process.
|
|
|
|
The \c exit() function causes normal process termination and the value of
|
|
status is returned to the parent. A child process must strictly use
|
|
\c _exit() instead of a simple \c exit().
|
|
|
|
The user-level initialisations of the libraries are done once when the
|
|
launcher daemon loads the libraries. The launched applications are
|
|
child processes of the launcher, and every time \c exit() is called, the
|
|
corresponding cleanup actions are executed. The root problem is that
|
|
the cleanup actions are carried out multiple times, and libraries may
|
|
not be designed to tolerate this. By calling \c _exit() in the
|
|
applications, the problem is avoided.
|
|
|
|
\section issue-cmdline Command line arguments
|
|
|
|
Current launcher implementation does not support the following Qt and
|
|
MeeGo Touch command line options. For more information on QApplication
|
|
command line options, see MeeGo 1.2 Harmattan API reference
|
|
library. For more information on MApplication command line options,
|
|
see Platform API reference library.
|
|
|
|
\li \c -style
|
|
\li \c -stylesheet
|
|
\li \c -session
|
|
\li \c -widgetcount
|
|
\li \c -reverse
|
|
\li \c -graphicssystem
|
|
\li \c -display
|
|
\li \c -geometry
|
|
\li \c -fn
|
|
\li \c -font
|
|
\li \c -bg
|
|
\li \c -background
|
|
\li \c -fg
|
|
\li \c -foreground
|
|
\li \c -btn
|
|
\li \c -button
|
|
\li \c -name
|
|
\li \c -title
|
|
\li \c -visual
|
|
\li \c -ncols
|
|
\li \c -cmap
|
|
\li \c -im
|
|
\li \c -inputstyle
|
|
\li \c -genimglist
|
|
\li \c -remote-theme
|
|
\li \c -fullscreen
|
|
\li \c -disable-m-input-context
|
|
|
|
QCoreApplication::arguments() returns a QStringList that containing at
|
|
most 32 arguments and drops the rest. The full list of arguments is
|
|
accessible through \c argc and \c argv. They can be converted into
|
|
QStringList similar to returned by QCoreApplication::arguments() as
|
|
follows:
|
|
|
|
\code
|
|
M_EXPORT int main(int argc, char **argv) {
|
|
QStringList arguments;
|
|
for (int a = 0; a < argc; ++a) {
|
|
arguments << QString::fromLocal8Bit(argv[a]);
|
|
}
|
|
...
|
|
\endcode
|
|
|
|
\section issue-watchdog Scripts, D-Bus, and process monitoring
|
|
|
|
By default, invoker processes terminate before or right after booster
|
|
processes have called main(). This can confuse shell scripts and
|
|
process monitoring in D-Bus daemon and Upstart, for instance. To solve
|
|
these issues, you can use the following parameters supported by the
|
|
invoker:
|
|
|
|
\li <tt> --delay 10 </tt> The invoker waits for 10 seconds before terminating
|
|
\li <tt>--wait-term </tt> The invoker does not terminate until the launched
|
|
application terminates. The invoker returns the same return
|
|
value as the application did, or it is terminated by the same
|
|
signal as the launched application. Signals received by the
|
|
invoker process are forwarded to the launched application.
|
|
|
|
\section forking Forking
|
|
|
|
It is not possible to use MComponentCache or MDeclarativeCache in the child
|
|
process if you fork() in your application. This is due to the fact that
|
|
X11 connections are disrupted after fork().
|
|
|
|
\section crashes Crashes after application's main()
|
|
|
|
If an application is launched with invoker, there may be some
|
|
destructors of MeeGo Touch classes executed after application's
|
|
main(). This can cause crashes if the application has installed a
|
|
custom debug message handler and does not uninstall it before exit.
|
|
|
|
\section wm_class_value WM_CLASS value
|
|
|
|
If an application is started with m-booster but it creates its own
|
|
MApplicationWindow based object, such as an MApplicationWindow derived
|
|
class object, or if an application has multiple windows, the launcher
|
|
does not currently set the correct value for WM_CLASS property of X
|
|
window. The WM_CLASS property is used, for example, by Compositor as
|
|
the application name to notify the user if the application is stuck.
|
|
|
|
Set the WM_CLASS property for the application as follows:
|
|
|
|
\code
|
|
M_EXPORT int main(int argc, char **argv)
|
|
{
|
|
MApplication *app = MComponentCache::mApplication(argc, argv);
|
|
|
|
//don't use window from cache, create our own
|
|
MApplicationWindow *window = new myDerivedMApplicationWindow();
|
|
|
|
#ifdef Q_WS_X11
|
|
// reinit WM_COMMAND X11 property
|
|
if (window) {
|
|
Display *display = QX11Info::display();
|
|
if (display) {
|
|
XSetCommand(display, window->effectiveWinId(), argv, argc);
|
|
|
|
// set correct WM_CLASS properties
|
|
QString appName = QFileInfo(argv[0]).fileName();
|
|
QString appClass = appName.left(1).toUpper();
|
|
if (appName.length() > 1)
|
|
appClass += appName.right(appName.length() - 1);
|
|
|
|
// reserve memory for C strings
|
|
QByteArray arrName(appName.toLatin1());
|
|
QByteArray arrClass(appClass.toLatin1());
|
|
|
|
XClassHint class_hint;
|
|
class_hint.res_name = arrName.data();
|
|
class_hint.res_class = arrClass.data();
|
|
|
|
XSetClassHint(display, window->effectiveWinId(), &class_hint);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
// do application specific stuff
|
|
...
|
|
|
|
window->show();
|
|
return app->exec();
|
|
}
|
|
\endcode
|
|
|
|
*/
|
|
|