启动脚本
应用启动 /etc/profile: echo "cd to applications/apm" cd applications/apm ./svcmgr & ./bigbang ---path /applications/apm/appmgr ---argv -ed off -c /Customer/app.cfg Svcmgr : Svcmgr 是android中比较重要的一个进程,它是在init进程启动之后启动,从名字上就可以看出来它是用来管理系统中的service。比如:InputMethodService、ActivityManagerService等。在Svcmgr 中有两个比较重要的方法:add_service、check_service。系统的service需要通过add_service把自己的信息注册到ServiceManager中,当需要使用时,通过check_service检查该service是否存在。 它的main函数处理: 打开/dev/binder设备,并在内存中映射128K的空间; 通知Binder设备,把自己变成context_manager; 进入循环,不停的去读Binder设备,看是否有对service的请求,如果有的话,就去调用svcmgr_handler函数回调处理请求。
Bigbang appmgr 进程监控 appmgr启动参数: ("-------- MSTAR AppMgr -----------------------------------------------\n"); (" \n"); (" -h \n"); (" --help print this help message and simple intro. \n"); (" \n"); (" -v verbose (level=1) \n"); (" -vv verbose (level=2) \n"); (" -vvv verbose (level=3) \n"); (" \n"); (" -s \n"); (" --slient no message will be printed. \n"); (" \n"); (" -kd [on/off] turn on/off key dispatch function \n");未使用 (" -da [on/off] launching default app at start up or not \n");配置cfg中设定SN为default app (" -is [on/off] turn on/off internal statstics/accouting \n");未使用内部统计 (" -nl [on/off] enable/disable now loading logo procedure \n"); (" -rl [on/off] re-launch or not when app abnormal abort/exit \n"); (" -ed [on/off] enable dfb init at main() \n"); (" \n"); (" -lt n n seconds for auto. loading logo when \n"); (" application switch. \n"); (" \n"); // (" -l now_loading logo plugin file. \n"); // (" default: %s\n", APM_NOWLOAD_PLUGIN_FILE); (" \n"); (" -k dfb_keymap_file override default dfb keymap file. \n"); (" default: %s\n", APM_DFB_KEYMAP_FILE); (" \n"); (" -c app_def_file override default app definition file path \n"); (" default: %s\n", APM_APP_DEFINITION_FILE); (" \n"); ("---------------------------------------------------------------------\n");
APM配置文件
在编译时是projects\ui\Apps\apm\cfg\mstar.apm.def,在系统运行时是/Customer/app.cfg [System] default = SN TV应用 mem_limit = 4096 kb应用memory envv1 = country=GBR lang=eng 应用参数,会解析填入appinfo 在project/systeminfo/board.h中会有下述定义 //Default Country #define DEFAULT_COUNTRY E_GERMANY //Default Language #define DEFAULT_LANGUAGE E_LANGUAGE_ENGLISH //define auto start App data_dir = /Customer/apps 应用数据读写目录 auto_start_count = 2 应用启动顺序 auto_start_1 = SN auto_start_1_delay = 10 应用启动间隔 auto_start_2 = CommonUI auto_start_2_para = --silent 不输出打印信息 auto_start_2_delay = 3 auto_start_3 = MstarLauncher auto_start_3_para = --silent //auto_start_3 = DIAL //auto_start_3_para = --silent timeout=20 应用启动默认超时 [CommonUI] path = /applications/CommUI/bin/CommUI 应用路径 exe_type = app app/widget exe_domain = native linux本地应用 exclusive=0 1独占应用 0 非独占应用 When launching a new app (target app), if target-app is non-exclusive, the exclusive app will not be destroyed.if target-app is exclusive, the exclusive app will be destroyed..if an exclusive but non-target app exists, call onDestroy() and terminate that app if target app is exclusive, and there is an alive app which is not target & exclusive; call onLoseResource() else if target app is non-exclusive but use resource, and resource owner app is not target app, call onLoseResource() 需要运行新的应用时,如果新应用是非独占的,独占应用不会被destroy,如果新应用是独占的,当前独占应用destroy,调用onDestroy()完成操作,并且需要释放资源。 argv1= --nowloading=n 判断是否需要立刻加载,应用读取判断 priority= hotkey1=MIX 需要接收的热键 [SN] pretty_name=Back2TV icon_path=/applications/CommUI/rc/rc/img/Demo_img/App/GRIDMENU_IMG_DEFAULT.png path=/applications/bin/autorun exe_type=app exe_domain=native tmpfs_size=4096 maximal size of temp directory exclusive=0 envv1 = PORTAL_PATH=http://itv.ard.de/ardstart 入口URL下载了一个页面无法打开 argv1= --nowloading=y priority= timeout=0 hotkey1=POWER hotkey2=MUTE hotkey3=VOLUME_UP hotkey4=VOLUME_DOWN hotkey5=AUDIO hotkey6=REVEAL hotkey7=PAGE_UP
MstarLauncher和启动应用
[MstarLauncher] pretty_name=MstarLauncher icon_path=/applications/CommUI/rc/rc/img/Demo_img/App/GRIDMENU_IMG_QtWebkit.png path=/applications/MWB/MstarLauncher exe_type=app exe_domain=native exclusive=0 argv1 = "-qws -display directfb:layerid=0 (指定显示驱动)-transparent-background (背景透明)-nomouse" //-remote-inspector-port 1234 envv1 = DFB_LAYER=0 WINDOW_STACK=middle MSTAR_DEVICE_INPUT=APM DFB_LAYER WINDOW_STACK Specify which DirectFB layer and WINDOW_STACK to use. MSTAR_DEVICE_INPUT Specify source of input events. envv2 = LD_LIBRARY_PATH=/applications/appdata:/applications/MWB/lib:/vendor/lib:/vendor/lib/utopia:/vendor/lib/directfb-1.4-0/inputdrivers/:/config envv3 = QT_QWS_FONTDIR=/applications/MWB/fonts QT_PLUGIN_PATH=/vendor/lib/qt/plugins envv4 = WEB_WIDTH=1280 WEB_HEIGHT=720 WEB_RESOLUTION_WIDTH=1280 WEB_RESOLUTION_HEIGHT=720 envv5 = CERT_CA_BUNDLE_PATH=/applications/MWB/certificates envv6 = QTWEBKIT_PLUGIN_PATH=/applications/MWB/plugins envv7 = CERT_KEY_PATH=/applications/MWB/certificates/key.pem envv8 = CERT_CERT_PATH=/applications/MWB/certificates/cert.pem MSTAR_QT_KEYMAP=/applications/MWB/mstarkeymap.csv envv9 = FORCE_RDATE=1 QWS_NO_SHARE_FONTS=true SW_Version=7.2.12.0.0.1 Full_ModelName=SN_401 ConnectType=wireless ENABLE_DBG_OUT=0 envv10 = PanelWidth=1920 PanelHeight=1080 timeout=0 priority= hotkey1= [YTTV] pretty_name=YTTV icon_path=/applications/CommUI/rc/rc/img/Demo_img/App/GRIDMENU_IMG_YOUTUBE.png path=/applications/MWB/MstarLauncher exe_type=app exe_domain=native exclusive=0 argv1 = "-qws -display directfb:layerid=0 -transparent-background -nomouse -app YOUTUBE http://www.youtube.com/tv?launch=menu&additionalDataUrl=http%3a%2f%2flocalhost%3a56789%2fdialData%3fapp%3dYouTube" envv1 = DFB_LAYER=0 WINDOW_STACK=middle MSTAR_DEVICE_INPUT=APM envv2 = LD_LIBRARY_PATH=/applications/appdata/:/applications/MWB/lib:/vendor/lib:/vendor/lib/utopia:/vendor/lib/directfb-1.4-0/inputdrivers/:/config:/vendor/lib/qt/plugins/gfxdrivers/:/vendor/lib/gstreamer-0.10 envv3 = QT_QWS_FONTDIR=/applications/MWB/fonts QT_PLUGIN_PATH=/vendor/lib/qt/plugins envv4 = WEB_RESOLUTION_WIDTH=1280 WEB_RESOLUTION_HEIGHT=720 envv5 = CURL_CA_BUNDLE_PATH=/applications/MWB/certificates/cacert.pem envv6 = MSTAR_QT_KEYMAP=/applications/MWB/mstarkeymap.csv envv7 = FORCE_RDATE=1 priority= hotkey1=
APM应用启动分类
系统启动:SN、CommonUI、MstarLauncher 后续页面启动: Netflix Netflix_power Netflix_mix Netflix_dial CinemaNow CinemaNow_2 CinePlex KnowHowMovies QJY QJY_BestTV Vudu OPERA_TV_STORE OPERA_BROWSER Skype OpenBrowser OWB:WidgetDock Googlemap_widget MstarLauncher 启动: Pandora_MWB、AccuWeather_MWB、YTTV、TOONGOGGLES、MEDIAMARKT、CATAL、iPlayerv3、BBCSports、BBCNews、Blinkbox、Facebook_MWB、Twitter_MWB、Picasa_MWB、Flickr_widget、TerraTV_MWB、 南美opera启动应用: OPERA_TVSTORE OPERA_ASKBALL OPERA_TVB OPERA_Viewster OPERA_AccuWeather OPERA_Webseriados OPERA_Sony OPERA_Cinema OPERA_FM OPERA_Vimeo OPERA_InstaTV OPERA_Dailymotion OPERA_Xtremefilms OPERA_PRMotor TV OPERA_CNN [OPERA_TVSTORE] pretty_name=Opera TV Store icon_path=/applications/CommUI/rc/rc/img/Demo_img/App/OPERA_TVSTORE.png path=/applications/opera_tvstore/mipsel/gcc-4.3-51-glibc-2.8/run-Opera exe_type=app envv1=LD_LIBRARY_PATH=/vendor/lib:/vendor/lib/utopia:/vendor/lib/directfb-1.4-0/inputdrivers:/config envv2 = DFB_LAYER=1 WINDOW_STACK=middle GST_PLUGIN_PATH=/vendor/lib/gstreamer-0.10 argv1=4 argv2 = -a argv3 = Model/MST6328 argv4 = --slave /applications/opera_tvstore/browser/opera-tv-browser-slave.sh //argv5 = -q ShortcutApp argv5 = -q tvstore argv6 = -l https://tvstore.opera.com/redirect/accuweather?action=runapp exe_domain=native timeout=0 tmpfs_size=4096 exclusive=1 priority= hotkey1= [OPERA_ASKBALL] pretty_name=Opera TV Store icon_path=/applications/CommUI/rc/rc/img/Demo_img/App/OPERA_TVSTORE.png path=/applications/opera_tvstore/mipsel/gcc-4.3-51-glibc-2.8/run-Opera exe_type=app envv1=LD_LIBRARY_PATH=/vendor/lib:/vendor/lib/utopia:/vendor/lib/directfb-1.4-0/inputdrivers:/config envv2 = DFB_LAYER=1 WINDOW_STACK=middle GST_PLUGIN_PATH=/vendor/lib/gstreamer-0.10 argv1=4 argv2 = -a argv3 = Model/MST6328 argv4 = --slave /applications/opera_tvstore/browser/opera-tv-browser-slave.sh argv5 = -q ShortcutApp //argv5 = -q tvstore argv6 = -l https://tvstore.opera.com/redirect/ask-the-ball?action=try exe_domain=native timeout=0 tmpfs_size=4096 exclusive=1 priority= hotkey1=
APM应用中启动其它应用
接口APM_RequestToRun 参考测试用例: printf("App: %s launched\n", APP_NAME); 主应用 APM_Join(&appctrl_handler); sleep(3); APM_RequestToRun(char *)"test_Loop"); 测试应用启动 sleep(1); printf("[%s] call APM_Leave()\n", APP_NAME); APM_Leave(); 在UI中启动MStarLauncher应用:UI调用下面接口发命令让Mstarlauncer来启动应用 Mstarlauncer启动的应用是基于Web based AP, Hbbtv and Ginga,例如youtube、facebook,pandora之类, 启动的接口如下: int32_t WebAppMgr_SendCommand(EN_WEBAPPMGR_COMMAND_TYPE cmd, const char *args)
APM应用启动
默认启动SN(TV)、CommonUI、MstarLauncher TV默认加载到前台,通过热键可分别启动CommonUI和MstarLauncher,并切换到前台。 目前在6308来看,只有TV界面能够进入CommonUI和MstarLauncher,CommonUI界面不能进入MstarLauncher,MstarLauncher界面不能进入CommonUI,CommonUI和MstarLauncher退出进入TV界面。CommonUI和MstarLauncher界面通过RequestToRun启动其它应用。
// 本地应用收到HotKey後要做的動作void HotKeyToHome(void) { GetFocusApp(pAppName, size); if (strcmp(pAppName, “HomeUI”) == 0) { ReleaseFocus(); }else if (strcmp(pAppName, “TV”) == 0) { RequestFocus(); }else { // For other native/android app, // terminate that app & let HomeUI be focused RequestToExit(pAppNmae); }
callback函数
应用必须注册APM callback函数,APM通过callback函数控制应用状态,注册完成后,应用才能算是纳入APM管理。 OnGetFocus, OnLoseFocus,分别是在应用激活或非激活时使用,同时也影响按键接收,只有Focus应用才能接收按键。 APM_APPCTRL_HANDLER_t appctrl_handler = { OnGetFocus, OnLoseFocus, OnDestroy, OnGetResource, OnLoseResource, OnNotify, }; 参考commonUI和test示例的设计。 OnGetFocus, OnLoseFocus,主要针对应用可切换到后台的操作,应用根据自身需求实现该接口,如CommonUI的OnGetFocus需要初始化CVBS layer和DFB等操作,最后调用 FileBrowserFrame::applet->Show和 menuApp::Summon显示,OnLoseFocus时调用FileBrowserFrame::applet->Hide和menuApp::pApp->Kill()。还有galaxy应用里的OnGetFocus和OnLoseFocus分别是iIpcApi_ActiveAP和iIpcApi_InactiveAP。其它应用internal_osd、nebula等实现OnGetFocus是调用MSrv_LoadingLogo::DisplayLogo。目前大部分应用的OnGetFocus和OnLoseFocus都是空函数。 OnDestroy,是应用自销毁函数接口,主要在测试代码中有体现,比如设置应用退出标志,使应用自己退出循环。 OnGetResource和OnLoseResource的实现可以参考internal_osd:OnGetResource主要是设置显示输出和屏蔽其它应用热键。OnLoseResource设置输出关闭和使能热键。 OnNotify主要让应用处理APMEVENT。
资源管理
应用资源占用申请分类 ///Resource typedef enum { APM_RESOURCE_NONE = 0x00000000, APM_RESOURCE_OVERALL = 0xFFFFFFFF, APM_RESOURCE_VIDEO = 0x00000001, APM_RESOURCE_AUDIO = 0x00000002, APM_RESOURCE_VIDEOAUDIO = 0x00000004, APM_RESOURCE_GRAPHIC_APP = 0x00000008, APM_RESOURCE_GRAPHIC_G3D = 0x00000010, } APM_RESOURCE_e; APM_RequestResource一般在APM_Join后,应用启动前使用,参考internal_osd、galaxy等,如galaxy使用APM_RequestResource(APM_RESOURCE_OVERALL)、 internal_osd使用APM_RequestResource(APM_RESOURCE_VIDEOAUDIO)和 APM_RequestResource(APM_RESOURCE_GRAPHIC_APP)。 APM_RESOURCE一般与图层layer相关,LAYER_VIDEO和VIDEO资源相关,LAYER_APP是应用GUI layer,如Netflix, CinemaNow,Leanback, Chumby,DLNA,Skype等应用使用。CommonUI 、Supernova UI(TV)使用LAYER_MENU,叠加在LAYER_VIDEO上。 ///GUI layer typedef enum { APM_GUI_LAYER_VIDEO = 0x1, APM_GUI_LAYER_APP = 0x2, APM_GUI_LAYER_ANDROID = 0x4, APM_GUI_LAYER_WIDGET = 0x8, APM_GUI_LAYER_MENU = 0x10, APM_GUI_LAYER_NOTIFY = 0x20, } APM_GUI_LAYLER_e; 所有资源都只能被当前一个应用使用,当其它应用需要使用该资源时APM_ReleaseResource释放资源,在应用退出运行调用APM_Leave前。 目前主要的实现是在APM service中的RequestToRun通过判断bExclusive值,在应用启动时判断应用资源是RESOURCE_OVERALL或者是RESOURCE_NONE,然后根据需要释放当前运行应用的资源,需要运行的应用获得资源。 exclusive和non-exclusive应用分类 Exclusive=1: Netflix、Netflix_power、Netflix_mix、Netflix_dial、CinemaNow、CinemaNow_2、CinePlex、KnowHowMovies、QJY、QJY_BestTV、Vudu、OPERA_TV_STORE、OPERA_BROWSER、OpenBrowser、CBrowser、Googlemap_widget、BESTV、GamePlayer MstarLauncher启动的应用:Pandora_MWB、AccuWeather_MWB、Facebook_MWB、Twitter_MWB、Picasa_MWB、Flickr_widget、TerraTV_MWB、 Exclusive=0(non-exclusive): SN、CommonUI、MstarLauncher、MWBLauncherMemoryMonitor (MWBLauncherMemoryMonitor用来做内存监控使用)、Skype、 MstarLauncher启动的应用:YTTV、TOONGOGGLES、MEDIAMARKT、CATAL、iPlayerv3、BBCSports、BBCNews、Blinkbox、WidgetDock、
按键处理
QT应用从DFB接收按键消息,调用QT KeyPressEvent函数处理按键。 void TVHomePage::keyPressEvent(QKeyEvent *event) { //if(focusWidget()) for(QVector<QWidget *>::iterator it = bigControlList.begin(); it != bigControlList.end(); ++it) { if (*it == focusWidget()) { qDebug("\n keycode is 0x%x,nFocusedWdgIdx = %d,COUNT = %d\n",event->key(),bigControlList.indexOf(focusWidget()),bigControlList.count()); switch(event->key()) ............ 在需要处理Hotkey的QT应用中建立单独的线程或者定时器方式来接收处理Hotkey。QT应用从APM读取Hotkey,APM接收DFB的按键消息。 从目前的场景来看只有TV应用使用到了Hotkey,但不排除后续其他应用会使用到Hotkey。QT应用中只有当前focused的应用才能接收到按键,为了使各个独立的QT应用都能使用到Hotkey,采用从APM读取按键并判断是否热键处理的方式。 DFBInputEvent evt; if (APM_HasInputEvent() > 0) { APMInputEvent apmkey; if ((APM_GetInputNonBlock(&apmkey) > 0)) { memcpy(&evt, &(apmkey.data), apmkey.size); 同时为了避免其它应用的热键影响当前应用的使用,APM_RequestToDisableHotkey屏蔽热键,在应用退出时APM_RequestToEnableHotkey使能热键。 APM对按键的接收主要实现是在APM_Join函数中,在应用调用APM_Join时, _join_key_receiver();和_join_event_receiver()分别使能按键接收和APM event接收,在onDestroy时调用_leave_key_receiver()和_leave_event_receiver屏蔽。
QT应用使用示例
QT应用主程序
这里主要指TV、CommonUI和MStarLauncher的实现,其它第三方应用目前大部分是由MStarLauncher运行的,如果如Netflix、DIAL和DLNA等应用需要单独启动,需要封装类似的porting接口,可参考projects\ui\apps\dlna。 如果使用opera的则不使用MStarLauncher启动网络应用,但是run-Opera类似于MStarLauncher。 9.1.1.回调函数 在代码中实现回调函数APM_APPCTRL_HANDLER_t appctrl_handler ,分别实现里面的接口: OnGetFocus, 应用启动或显示 OnLoseFocus, 应用隐藏 OnDestroy, 应用退出,在两个exclusive应用同时运行时。 OnGetResource, 获取资源 OnLoseResource, 释放资源 OnNotify, 处理APM event 参考按键处理测试代码: 在线程初始化前加入: void QThreadApp::initVariable() { focus = 0; RowNumber = 0; qDebug()<<"<------Testing test_GetInputLoop------>"; APM_Join(&appctrl_handler); //创建子线程 workthread = new WorkThread(); connect(workthread, SIGNAL(WorkSignal(char *)), this, SLOT(Start(char *))); workthread->start(); } 在线程退出时: QThreadApp::~QThreadApp() { delete workthread; APM_Leave(); }
按键处理
普通按键处理: void TVHomePage::keyPressEvent(QKeyEvent *event) { switch(event->key()) { } } 热键线程处理流程: workthread = new WorkThread(); connect(workthread, SIGNAL(WorkSignal(char *)), this, SLOT(Start(char *))); void WorkThread::run() { APMInputEvent ApmInputEvt; DFBInputEvent pDFBInputEvt; int size; int key_id; char * keystr = NULL; qDebug()<<"Testing test_GetInputLoop"; APM_Join(&appctrl_handler); while(1) { size = APM_GetInputWait(&ApmInputEvt); if (size > 0) { pDFBInputEvt = (DFBInputEvent)(&(ApmInputEvt.data)); qDebug()<<"<------------------"<<APP_NAME<<"receive key"; qDebug()<<"<--------------------------------pDFBInputEvt->key_symbol="<<pDFBInputEvt->key_symbol; qDebug()<<"<--------------------------------pDFBInputEvt->key_code="<<pDFBInputEvt->key_code; if (pDFBInputEvt->type != 1) continue ; keystr = DFB_KeySymbolU32ToName(pDFBInputEvt->key_symbol); qDebug()<<"<------------------KEY STR = "<<keystr; key_id = pDFBInputEvt->key_id; qDebug()<<"<------------------pDFBInputEvt->key_id="<<key_id; emit WorkSignal(keystr); } } APM_Leave(); } 热键的定时器方式读取: timer = new QTimer(this); QObject::connect(timer, SIGNAL(timeout()), this, SLOT(Start())); timer->start(500); //设置定时器为0.5s void QTimerApp::Start() { qDebug()<<"<------------------PlayerControl::Start"; DFBInputEvent pDFBInputEvt; int size; int key_id; size = APM_GetInputWait(&ApmInputEvt); if (size > 0) { char * keystr = NULL; pDFBInputEvt = (DFBInputEvent)(&(ApmInputEvt.data)); qDebug()<<"<------------------"<<APP_NAME<<"receive key"; qDebug()<<"<--------------------------------pDFBInputEvt->key_symbol="<<pDFBInputEvt->key_symbol; qDebug()<<"<--------------------------------pDFBInputEvt->key_code="<<pDFBInputEvt->key_code; if (pDFBInputEvt->type != 1) return ; keystr = DFB_KeySymbolU32ToName(pDFBInputEvt->key_symbol); qDebug()<<"<------------------KEY STR = "<<keystr; key_id = pDFBInputEvt->key_id; qDebug()<<"<------------------pDFBInputEvt->key_id="<<key_id; if(strcmp(keystr, "0") == 0) { this->hide(); } if(strcmp(keystr, "1")==0 || strcmp(keystr, "2")==0) { this->show(); } } } 热键的屏蔽和使能: unsigned int _disabled_hotkey[] ={MVK_MIX}; APM_RequestToDisableHotkey(_disabled_hotkey, sizeof(_disabled_hotkey)/sizeof(int)) 在应用退出前: APM_RequestToEnableHotkey(_disabled_hotkey, sizeof(_disabled_hotkey)/sizeof(int)) 9.1.3.main函数APM调用示例 APM_Join(&appctrl_handler) ;应用运行前 根据需要申请资源和注册或屏蔽热键: APM_RequestResource(APM_RESOURCE_OVERALL); RegisterAllHotKey();或者APM_RequestToDisableHotkey pApp->Run();应用运行 循环 应用退出后: APM_RequestToEnableHotkey使能屏蔽的热键 APM_Leave();
APM配置文件
应用在app.cfg文件中增加应用启动信息,详细设置查看前文。 主要项: [test_GetInputLoop] pretty_name=test_GetInputLoop icon_path=/applications/CommUI/rc/rc/img/Demo_img/App/GRIDMENU_IMG_OPENBROWSER.png path=/Customer/usb/sda1/timer_run.sh exe_type=app argv1 = "-qws -display directfb:layerid=0 http://655acfd8beea0026e6c70f8625ed11d0.b15647443e92946b3e4fa5b76890f6c9.com/www/nr_portal.php?lang=en&country=GER" envv1 = DFB_LAYER=0 WINDOW_STACK=middle MSTAR_DEVICE_INPUT=APM envv2 = LD_LIBRARY_PATH=/Customer/usb/sda1/QT/libs:/applications/OpenBrowser/lib:/vendor/lib:/vendor/lib/utopia:/vendor/lib/directfb-1.4-0/inputdrivers/:/config:/vendor/lib/qt/plugins/gfxdrivers/ envv3 = QT_QWS_FONTDIR=/Customer/.owb/conf/font QT_PLUGIN_PATH=/vendor/lib/qt/plugins envv4 = WEB_RESOLUTION_WIDTH=1280 WEB_RESOLUTION_HEIGHT=720 envv5 = QWS_NO_SHARE_FONTS=true envv6 = QTWEBKIT_PLUGIN_PATH=/Customer/usb/sda4/6308/QT/plugins envv7 = QWS_DISPLAY=directfb envv8 = QT_PLUGIN_PATH=/Customer/usb/sda4/6308/QT/plugins exe_domain=native timeout=0 tmpfs_size=4096 exclusive=1 priority= hotkey1=