BOOL WINAPI ChangeState(BOOL bNewState) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); if(objSettings.bRunState!=bNewState){ if(objSettings.bRunState==0 && bNewState!=0){ if( InitOverlay() < 0 ){ return FALSE; } } if(objSettings.bRunState!=0 && bNewState==0){ UninitOverlay(); } objSettings.bRunState=bNewState; if(objSettings.bRunState){ DWORD dwTID=0; HANDLE hMainThread=CreateThread(NULL,0,MainOVRThread,0,0,&dwTID); CloseHandle(hMainThread); } SetEvent(objSettings.hSync); if(!objSettings.bRunState){ ::EnterCriticalSection(&csMain); ::LeaveCriticalSection(&csMain); } } return TRUE; };
void GPXMapOverlayRow::NameChanged(kGUIEvent *event) { if(event->GetEvent()==EVENT_AFTERUPDATE) { InitOverlay(); gpx->MapDirty(); } }
void GPXMapOverlayRow::BrowseDone(kGUIFileReq *result,int pressed) { if(pressed==MSGBOX_OK) { m_filename.SetString(result->GetFilename()); m_enabled.SetSelected(m_filename.GetLen()>0); InitOverlay(); gpx->MapDirty(); } }
DWORD WINAPI MainOVRThread(LPVOID pData) { static long lLock=0; if(lLock>0){ return 0; } ::EnterCriticalSection(&csMain); srand(time(NULL)); SimpleTracker tr(lLock); SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_IDLE ); while(1){ WaitForSingleObject(objSettings.hSync,objSettings.dwTimeout); if(objSettings.bRunState==0){ break; } HWND hWin=GetForegroundWindow(); if(hWin==NULL || !IsZoomed(hWin)){ // Animate the image UpdateImage(); // Show the new frame if(UpdateOverlay()==-1){ if(objSettings.bRunState){ static DWORD dwTry=0; if(dwTry==0 || long(GetTickCount()-dwTry)>10000){ dwTry=GetTickCount(); UninitOverlay(); if(InitOverlay()>=0){ dwTry=0; } } } }; } } ::LeaveCriticalSection(&csMain); return 0; }