// function create GUI window bool StWindowImpl::create() { myKeysState.reset(); myInitState = STWIN_INITNOTSTART; myToResetDevice = false; if(myParentWin == NULL) { return false; } // retrieve fixed information myHasOrientSensor = myParentWin->hasOrientationSensor(); myIsPoorOrient = myParentWin->isPoorOrientationSensor(); myParentWin->signals.onInputEvent += stSlot(this, &StWindowImpl::onAndroidInput); myParentWin->signals.onAppCmd += stSlot(this, &StWindowImpl::onAndroidCommand); /*if(myParentWin->getSavedState() != NULL) { // we are starting with a previous saved state; restore from it myState = *(StSavedState* )myParentWin->getSavedState(); }*/ myIsUpdated = true; if(myParentWin->getWindow() != NULL) { // re-starting output for existing window return onAndroidInitWindow(); } // first start - wait for CommandId_WindowInit... int aPollRes = 0; int aNbEvents = 0; StAndroidPollSource* aSource = NULL; while((aPollRes = ALooper_pollAll(-1, NULL, &aNbEvents, (void** )&aSource)) >= 0) { if(aSource != NULL) { aSource->process(myParentWin, aSource); } if(myToResetDevice || myParentWin->ToDestroy()) { //myToResetDevice = true; myStEvent.Type = stEvent_Close; myStEvent.Close.Time = getEventTime(); signals.onClose->emit(myStEvent.Close); return false; } else if(myInitState != STWIN_INITNOTSTART) { break; } } return myInitState == STWIN_INIT_SUCCESS; }
void StWindowImpl::processEvents() { if(myParentWin == NULL || myToResetDevice) { // window is closed! return; } // check if we are exiting if(myParentWin->ToDestroy()) { myStEvent.Type = stEvent_Close; myStEvent.Close.Time = getEventTime(); signals.onClose->emit(myStEvent.Close); return; } // check onNewIntent event StString aDndFile; myParentWin->setHardwareStereoOn(myToEnableStereoHW); myParentWin->setTrackOrientation(myToTrackOrient); myParentWin->setHideSystemBars(myToHideStatusBar, myToHideNavBar); myParentWin->fetchState(aDndFile, myQuaternion, myToSwapEyesHW, myKeysState); if(!aDndFile.isEmpty()) { std::vector<const char*> aDndList; aDndList.push_back(aDndFile.toCString()); myStEvent.Type = stEvent_FileDrop; myStEvent.DNDrop.Time = getEventTime(); myStEvent.DNDrop.NbFiles = aDndList.size(); myStEvent.DNDrop.Files = &aDndList[0]; myEventsBuffer.append(myStEvent); } updateActiveState(); StPointD_t anOldMousePt = myMousePt; int aPollRes = 0; int aNbEvents = 0; StAndroidPollSource* aSource = NULL; bool toWaitEvents = false; while((aPollRes = ALooper_pollAll(toWaitEvents ? -1 : 0, NULL, &aNbEvents, (void** )&aSource)) >= 0) { if(aSource != NULL) { aSource->process(myParentWin, aSource); } if(myToResetDevice) { break; } // check if we are exiting if(myParentWin->ToDestroy()) { break; } } // check if we are exiting if(myParentWin->ToDestroy()) { myStEvent.Type = stEvent_Close; myStEvent.Close.Time = getEventTime(); signals.onClose->emit(myStEvent.Close); return; } myIsMouseMoved = false; if(myMousePt.x() >= 0.0 && myMousePt.x() <= 1.0 && myMousePt.y() >= 0.0 && myMousePt.y() <= 1.0) { StPointD_t aDspl = myMousePt - anOldMousePt; if(std::abs(aDspl.x()) >= 0.0008 || std::abs(aDspl.y()) >= 0.0008) { myIsMouseMoved = true; } } // update position only when all messages are parsed updateWindowPos(); myIsUpdated = false; // StWindow XLib implementation process events in the same thread // thus this double buffer is not in use // however user events may be posted to it swapEventsBuffers(); }
void StAndroidGlue::threadEntry() { if(myJavaVM->AttachCurrentThread(&myThJniEnv, NULL) < 0) { ST_ERROR_LOG("Failed to attach working thread to Java VM"); return; } THE_ANDROID_GLUE = this; StMessageBox::setCallback(msgBoxCallback); myConfig = AConfiguration_new(); AConfiguration_fromAssetManager(myConfig, myActivity->assetManager); updateMonitors(); printConfig(); ALooper* aLooper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS); ALooper_addFd(aLooper, myMsgRead, LooperId_MAIN, ALOOPER_EVENT_INPUT, NULL, &myCmdPollSource); myLooper = aLooper; pthread_mutex_lock(&myMutex); myIsRunning = true; pthread_cond_broadcast(&myCond); pthread_mutex_unlock(&myMutex); // try to load stereo APIs /**jclass aJClass_Real3D = myThJniEnv->FindClass("com/lge/real3d/Real3D"); if(aJClass_Real3D != NULL) { jmethodID aJMet_isStereoDisplayAvailable = myThJniEnv->GetStaticMethodID(aJClass_Real3D, "isStereoDisplayAvailable", "(Landroid/content/Contex;)Z"); postMessage("com.lge.real3d.Real3D !!!"); } jclass aJClass_HTC = myThJniEnv->FindClass("com/htc/view/DisplaySetting"); if(aJClass_HTC != NULL) { jmethodID aJMet_isStereoDisplayAvailable = myThJniEnv->GetStaticMethodID(aJClass_HTC, "setStereoscopic3DFormat", "(Landroid/view/Surface;I)Z"); postMessage("com.htc.view.DisplaySetting !!!"); } jclass aJClass_Sharp = myThJniEnv->FindClass("jp/co/sharp/android/stereo3dlcd/SurfaceController"); if(aJClass_Sharp != NULL) { jmethodID aJMet_setStereoView = myThJniEnv->GetMethodID(aJClass_Sharp, "setStereoView", "(Z)V"); postMessage("jp.co.sharp.android.stereo3dlcd !!!"); }*/ createApplication(); if(!myApp.isNull()) { if(!myApp->open()) { stError("Error: application can not be executed!"); } myApp->exec(); } else { stError("Error: no application to execute!"); } myApp.nullify(); // application is done but we are waiting for destroying event... bool isFirstWait = true; for(; !myToDestroy; ) { if(isFirstWait) { postExit(); isFirstWait = false; } StAndroidPollSource* aSource = NULL; int aNbEvents = 0; ALooper_pollAll(-1, NULL, &aNbEvents, (void** )&aSource); if(aSource != NULL) { aSource->process(this, aSource); } } freeSavedState(); pthread_mutex_lock(&myMutex); if(myInputQueue != NULL) { AInputQueue_detachLooper(myInputQueue); } AConfiguration_delete(myConfig); pthread_cond_broadcast(&myCond); pthread_mutex_unlock(&myMutex); myThJniEnv = NULL; StMessageBox::setCallback(NULL); THE_ANDROID_GLUE = NULL; myJavaVM->DetachCurrentThread(); }