19f62ea84SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 39f62ea84SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 49f62ea84SAndrew Rist * or more contributor license agreements. See the NOTICE file 59f62ea84SAndrew Rist * distributed with this work for additional information 69f62ea84SAndrew Rist * regarding copyright ownership. The ASF licenses this file 79f62ea84SAndrew Rist * to you under the Apache License, Version 2.0 (the 89f62ea84SAndrew Rist * "License"); you may not use this file except in compliance 99f62ea84SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 119f62ea84SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 139f62ea84SAndrew Rist * Unless required by applicable law or agreed to in writing, 149f62ea84SAndrew Rist * software distributed under the License is distributed on an 159f62ea84SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 169f62ea84SAndrew Rist * KIND, either express or implied. See the License for the 179f62ea84SAndrew Rist * specific language governing permissions and limitations 189f62ea84SAndrew Rist * under the License. 19cdf0e10cSrcweir * 209f62ea84SAndrew Rist *************************************************************/ 219f62ea84SAndrew Rist 229f62ea84SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir #define INCL_DOSMISC 25cdf0e10cSrcweir #define INCL_DOSMODULEMGR 26cdf0e10cSrcweir #define INCL_DOSPROCESS 27cdf0e10cSrcweir 28cdf0e10cSrcweir #include <string.h> 29cdf0e10cSrcweir #include <svpm.h> 30cdf0e10cSrcweir #include <process.h> 31cdf0e10cSrcweir 32cdf0e10cSrcweir #define _SV_SALINST_CXX 33cdf0e10cSrcweir 34cdf0e10cSrcweir #ifndef _VOS_MUTEX_HXX 35cdf0e10cSrcweir #include <vos/mutex.hxx> 36cdf0e10cSrcweir #endif 37cdf0e10cSrcweir #include <tools/debug.hxx> 38cdf0e10cSrcweir 39cdf0e10cSrcweir #ifndef _SV_SALIDS_HRC 40*fc9fd3f1SPedro Giffuni #include <os2/salids.hrc> 41cdf0e10cSrcweir #endif 42cdf0e10cSrcweir #include <vcl/apptypes.hxx> 43*fc9fd3f1SPedro Giffuni #include <os2/saldata.hxx> 44*fc9fd3f1SPedro Giffuni #include <os2/salinst.h> 45*fc9fd3f1SPedro Giffuni #include <os2/salframe.h> 46*fc9fd3f1SPedro Giffuni #include <os2/salobj.h> 47*fc9fd3f1SPedro Giffuni #include <os2/saltimer.h> 48*fc9fd3f1SPedro Giffuni #include <os2/salbmp.h> 49*fc9fd3f1SPedro Giffuni #include <salimestatus.hxx> 50cdf0e10cSrcweir #include <vcl/timer.hxx> 51cdf0e10cSrcweir #include <tools/solarmutex.hxx> 52cdf0e10cSrcweir 53cdf0e10cSrcweir // ======================================================================= 54cdf0e10cSrcweir 55cdf0e10cSrcweir void SalAbort( const XubString& rErrorText ) 56cdf0e10cSrcweir { 57cdf0e10cSrcweir ImplFreeSalGDI(); 58cdf0e10cSrcweir 59cdf0e10cSrcweir if( !rErrorText.Len() ) 60cdf0e10cSrcweir fprintf( stderr, "Application Error " ); 61cdf0e10cSrcweir else 62cdf0e10cSrcweir fprintf( stderr, "%s ", 63cdf0e10cSrcweir ByteString( rErrorText, gsl_getSystemTextEncoding() ).GetBuffer() ); 64cdf0e10cSrcweir abort(); 65cdf0e10cSrcweir } 66cdf0e10cSrcweir 67cdf0e10cSrcweir // ======================================================================= 68cdf0e10cSrcweir 69cdf0e10cSrcweir ULONG GetCurrentThreadId() 70cdf0e10cSrcweir { 71cdf0e10cSrcweir PTIB pptib = NULL; 72cdf0e10cSrcweir PPIB pppib = NULL; 73cdf0e10cSrcweir 74cdf0e10cSrcweir DosGetInfoBlocks( &pptib, &pppib ); 75cdf0e10cSrcweir return pptib->tib_ptib2->tib2_ultid; 76cdf0e10cSrcweir } 77cdf0e10cSrcweir 78cdf0e10cSrcweir // ======================================================================= 79cdf0e10cSrcweir 80cdf0e10cSrcweir MRESULT EXPENTRY SalComWndProc( HWND hWnd, ULONG nMsg, MPARAM nMP1, MPARAM nMP2 ); 81cdf0e10cSrcweir 82cdf0e10cSrcweir // ======================================================================= 83cdf0e10cSrcweir 84cdf0e10cSrcweir class SalYieldMutex : public vos::OMutex 85cdf0e10cSrcweir { 86cdf0e10cSrcweir public: 87cdf0e10cSrcweir Os2SalInstance* mpInstData; 88cdf0e10cSrcweir ULONG mnCount; 89cdf0e10cSrcweir ULONG mnThreadId; 90cdf0e10cSrcweir 91cdf0e10cSrcweir public: 92cdf0e10cSrcweir SalYieldMutex( Os2SalInstance* pInstData ); 93cdf0e10cSrcweir 94cdf0e10cSrcweir virtual void SAL_CALL acquire(); 95cdf0e10cSrcweir virtual void SAL_CALL release(); 96cdf0e10cSrcweir virtual sal_Bool SAL_CALL tryToAcquire(); 97cdf0e10cSrcweir 98cdf0e10cSrcweir ULONG GetAcquireCount( ULONG nThreadId ); 99cdf0e10cSrcweir }; 100cdf0e10cSrcweir 101cdf0e10cSrcweir // ----------------------------------------------------------------------- 102cdf0e10cSrcweir 103cdf0e10cSrcweir SalYieldMutex::SalYieldMutex( Os2SalInstance* pInstData ) 104cdf0e10cSrcweir { 105cdf0e10cSrcweir mpInstData = pInstData; 106cdf0e10cSrcweir mnCount = 0; 107cdf0e10cSrcweir mnThreadId = 0; 108cdf0e10cSrcweir } 109cdf0e10cSrcweir 110cdf0e10cSrcweir // ----------------------------------------------------------------------- 111cdf0e10cSrcweir 112cdf0e10cSrcweir void SalYieldMutex::acquire() 113cdf0e10cSrcweir { 114cdf0e10cSrcweir OMutex::acquire(); 115cdf0e10cSrcweir mnCount++; 116cdf0e10cSrcweir mnThreadId = GetCurrentThreadId(); 117cdf0e10cSrcweir } 118cdf0e10cSrcweir 119cdf0e10cSrcweir // ----------------------------------------------------------------------- 120cdf0e10cSrcweir 121cdf0e10cSrcweir void SalYieldMutex::release() 122cdf0e10cSrcweir { 123cdf0e10cSrcweir ULONG nThreadId = GetCurrentThreadId(); 124cdf0e10cSrcweir if ( mnThreadId != nThreadId ) 125cdf0e10cSrcweir OMutex::release(); 126cdf0e10cSrcweir else 127cdf0e10cSrcweir { 128cdf0e10cSrcweir SalData* pSalData = GetSalData(); 129cdf0e10cSrcweir if ( pSalData->mnAppThreadId != nThreadId ) 130cdf0e10cSrcweir { 131cdf0e10cSrcweir if ( mnCount == 1 ) 132cdf0e10cSrcweir { 133cdf0e10cSrcweir mpInstData->mpSalWaitMutex->acquire(); 134cdf0e10cSrcweir if ( mpInstData->mnYieldWaitCount ) 135cdf0e10cSrcweir WinPostMsg( mpInstData->mhComWnd, SAL_MSG_RELEASEWAITYIELD, 0, 0 ); 136cdf0e10cSrcweir mnThreadId = 0; 137cdf0e10cSrcweir mnCount--; 138cdf0e10cSrcweir OMutex::release(); 139cdf0e10cSrcweir mpInstData->mpSalWaitMutex->release(); 140cdf0e10cSrcweir } 141cdf0e10cSrcweir else 142cdf0e10cSrcweir { 143cdf0e10cSrcweir mnCount--; 144cdf0e10cSrcweir OMutex::release(); 145cdf0e10cSrcweir } 146cdf0e10cSrcweir } 147cdf0e10cSrcweir else 148cdf0e10cSrcweir { 149cdf0e10cSrcweir if ( mnCount == 1 ) 150cdf0e10cSrcweir mnThreadId = 0; 151cdf0e10cSrcweir mnCount--; 152cdf0e10cSrcweir OMutex::release(); 153cdf0e10cSrcweir } 154cdf0e10cSrcweir } 155cdf0e10cSrcweir } 156cdf0e10cSrcweir 157cdf0e10cSrcweir // ----------------------------------------------------------------------- 158cdf0e10cSrcweir 159cdf0e10cSrcweir sal_Bool SalYieldMutex::tryToAcquire() 160cdf0e10cSrcweir { 161cdf0e10cSrcweir if ( OMutex::tryToAcquire() ) 162cdf0e10cSrcweir { 163cdf0e10cSrcweir mnCount++; 164cdf0e10cSrcweir mnThreadId = GetCurrentThreadId(); 165cdf0e10cSrcweir return sal_True; 166cdf0e10cSrcweir } 167cdf0e10cSrcweir else 168cdf0e10cSrcweir return sal_False; 169cdf0e10cSrcweir } 170cdf0e10cSrcweir 171cdf0e10cSrcweir // ----------------------------------------------------------------------- 172cdf0e10cSrcweir 173cdf0e10cSrcweir ULONG SalYieldMutex::GetAcquireCount( ULONG nThreadId ) 174cdf0e10cSrcweir { 175cdf0e10cSrcweir if ( nThreadId == mnThreadId ) 176cdf0e10cSrcweir return mnCount; 177cdf0e10cSrcweir else 178cdf0e10cSrcweir return 0; 179cdf0e10cSrcweir } 180cdf0e10cSrcweir 181cdf0e10cSrcweir // ----------------------------------------------------------------------- 182cdf0e10cSrcweir 183cdf0e10cSrcweir void ImplSalYieldMutexAcquireWithWait() 184cdf0e10cSrcweir { 185cdf0e10cSrcweir Os2SalInstance* pInst = GetSalData()->mpFirstInstance; 186cdf0e10cSrcweir if ( !pInst ) 187cdf0e10cSrcweir return; 188cdf0e10cSrcweir 189cdf0e10cSrcweir // If we are the main thread, then we must wait with wait, because 190cdf0e10cSrcweir // in if we don't reschedule, then we create deadlocks if a Windows 191cdf0e10cSrcweir // Function is called from another thread. If we arn't the main thread, 192cdf0e10cSrcweir // than we call qcquire directly. 193cdf0e10cSrcweir ULONG nThreadId = GetCurrentThreadId(); 194cdf0e10cSrcweir SalData* pSalData = GetSalData(); 195cdf0e10cSrcweir if ( pSalData->mnAppThreadId == nThreadId ) 196cdf0e10cSrcweir { 197cdf0e10cSrcweir // Wenn wir den Mutex nicht bekommen, muessen wir solange 198cdf0e10cSrcweir // warten, bis wir Ihn bekommen 199*fc9fd3f1SPedro Giffuni sal_Bool bAcquire = FALSE; 200cdf0e10cSrcweir do 201cdf0e10cSrcweir { 202cdf0e10cSrcweir if ( pInst->mpSalYieldMutex->tryToAcquire() ) 203cdf0e10cSrcweir bAcquire = TRUE; 204cdf0e10cSrcweir else 205cdf0e10cSrcweir { 206cdf0e10cSrcweir pInst->mpSalWaitMutex->acquire(); 207cdf0e10cSrcweir if ( pInst->mpSalYieldMutex->tryToAcquire() ) 208cdf0e10cSrcweir { 209cdf0e10cSrcweir bAcquire = TRUE; 210cdf0e10cSrcweir pInst->mpSalWaitMutex->release(); 211cdf0e10cSrcweir } 212cdf0e10cSrcweir else 213cdf0e10cSrcweir { 214cdf0e10cSrcweir pInst->mnYieldWaitCount++; 215cdf0e10cSrcweir pInst->mpSalWaitMutex->release(); 216cdf0e10cSrcweir QMSG aTmpMsg; 217cdf0e10cSrcweir WinGetMsg( pSalData->mhAB, &aTmpMsg, pInst->mhComWnd, SAL_MSG_RELEASEWAITYIELD, SAL_MSG_RELEASEWAITYIELD ); 218cdf0e10cSrcweir pInst->mnYieldWaitCount--; 219cdf0e10cSrcweir if ( pInst->mnYieldWaitCount ) 220cdf0e10cSrcweir WinPostMsg( pInst->mhComWnd, SAL_MSG_RELEASEWAITYIELD, 0 , 0 ); 221cdf0e10cSrcweir } 222cdf0e10cSrcweir } 223cdf0e10cSrcweir } 224cdf0e10cSrcweir while ( !bAcquire ); 225cdf0e10cSrcweir } 226cdf0e10cSrcweir else 227cdf0e10cSrcweir pInst->mpSalYieldMutex->acquire(); 228cdf0e10cSrcweir } 229cdf0e10cSrcweir 230cdf0e10cSrcweir // ----------------------------------------------------------------------- 231cdf0e10cSrcweir 232*fc9fd3f1SPedro Giffuni sal_Bool ImplSalYieldMutexTryToAcquire() 233cdf0e10cSrcweir { 234cdf0e10cSrcweir Os2SalInstance* pInst = GetSalData()->mpFirstInstance; 235cdf0e10cSrcweir if ( pInst ) 236cdf0e10cSrcweir return pInst->mpSalYieldMutex->tryToAcquire(); 237cdf0e10cSrcweir else 238cdf0e10cSrcweir return FALSE; 239cdf0e10cSrcweir } 240cdf0e10cSrcweir 241cdf0e10cSrcweir // ----------------------------------------------------------------------- 242cdf0e10cSrcweir 243cdf0e10cSrcweir void ImplSalYieldMutexAcquire() 244cdf0e10cSrcweir { 245cdf0e10cSrcweir Os2SalInstance* pInst = GetSalData()->mpFirstInstance; 246cdf0e10cSrcweir if ( pInst ) 247cdf0e10cSrcweir pInst->mpSalYieldMutex->acquire(); 248cdf0e10cSrcweir } 249cdf0e10cSrcweir 250cdf0e10cSrcweir // ----------------------------------------------------------------------- 251cdf0e10cSrcweir 252cdf0e10cSrcweir void ImplSalYieldMutexRelease() 253cdf0e10cSrcweir { 254cdf0e10cSrcweir Os2SalInstance* pInst = GetSalData()->mpFirstInstance; 255cdf0e10cSrcweir if ( pInst ) 256cdf0e10cSrcweir pInst->mpSalYieldMutex->release(); 257cdf0e10cSrcweir } 258cdf0e10cSrcweir 259cdf0e10cSrcweir // ----------------------------------------------------------------------- 260cdf0e10cSrcweir 261cdf0e10cSrcweir ULONG ImplSalReleaseYieldMutex() 262cdf0e10cSrcweir { 263cdf0e10cSrcweir Os2SalInstance* pInst = GetSalData()->mpFirstInstance; 264cdf0e10cSrcweir if ( !pInst ) 265cdf0e10cSrcweir return 0; 266cdf0e10cSrcweir 267cdf0e10cSrcweir SalYieldMutex* pYieldMutex = pInst->mpSalYieldMutex; 268cdf0e10cSrcweir ULONG nCount = pYieldMutex->GetAcquireCount( GetCurrentThreadId() ); 269cdf0e10cSrcweir ULONG n = nCount; 270cdf0e10cSrcweir while ( n ) 271cdf0e10cSrcweir { 272cdf0e10cSrcweir pYieldMutex->release(); 273cdf0e10cSrcweir n--; 274cdf0e10cSrcweir } 275cdf0e10cSrcweir 276cdf0e10cSrcweir return nCount; 277cdf0e10cSrcweir } 278cdf0e10cSrcweir 279cdf0e10cSrcweir // ----------------------------------------------------------------------- 280cdf0e10cSrcweir 281cdf0e10cSrcweir void ImplSalAcquireYieldMutex( ULONG nCount ) 282cdf0e10cSrcweir { 283cdf0e10cSrcweir Os2SalInstance* pInst = GetSalData()->mpFirstInstance; 284cdf0e10cSrcweir if ( !pInst ) 285cdf0e10cSrcweir return; 286cdf0e10cSrcweir 287cdf0e10cSrcweir SalYieldMutex* pYieldMutex = pInst->mpSalYieldMutex; 288cdf0e10cSrcweir while ( nCount ) 289cdf0e10cSrcweir { 290cdf0e10cSrcweir pYieldMutex->acquire(); 291cdf0e10cSrcweir nCount--; 292cdf0e10cSrcweir } 293cdf0e10cSrcweir } 294cdf0e10cSrcweir 295cdf0e10cSrcweir // ----------------------------------------------------------------------- 296cdf0e10cSrcweir 297cdf0e10cSrcweir bool Os2SalInstance::CheckYieldMutex() 298cdf0e10cSrcweir { 299cdf0e10cSrcweir bool bRet = true; 300cdf0e10cSrcweir SalData* pSalData = GetSalData(); 301cdf0e10cSrcweir ULONG nCurThreadId = GetCurrentThreadId(); 302cdf0e10cSrcweir if ( pSalData->mnAppThreadId != nCurThreadId ) 303cdf0e10cSrcweir { 304cdf0e10cSrcweir if ( pSalData->mpFirstInstance ) 305cdf0e10cSrcweir { 306cdf0e10cSrcweir SalYieldMutex* pYieldMutex = pSalData->mpFirstInstance->mpSalYieldMutex; 307cdf0e10cSrcweir if ( pYieldMutex->mnThreadId != nCurThreadId ) 308cdf0e10cSrcweir { 309cdf0e10cSrcweir bRet = false; 310cdf0e10cSrcweir } 311cdf0e10cSrcweir } 312cdf0e10cSrcweir } 313cdf0e10cSrcweir else 314cdf0e10cSrcweir { 315cdf0e10cSrcweir if ( pSalData->mpFirstInstance ) 316cdf0e10cSrcweir { 317cdf0e10cSrcweir SalYieldMutex* pYieldMutex = pSalData->mpFirstInstance->mpSalYieldMutex; 318cdf0e10cSrcweir if ( pYieldMutex->mnThreadId != nCurThreadId ) 319cdf0e10cSrcweir { 320cdf0e10cSrcweir bRet = false; 321cdf0e10cSrcweir } 322cdf0e10cSrcweir } 323cdf0e10cSrcweir } 324cdf0e10cSrcweir return bRet; 325cdf0e10cSrcweir } 326cdf0e10cSrcweir 327cdf0e10cSrcweir // ======================================================================= 328cdf0e10cSrcweir 329cdf0e10cSrcweir void InitSalData() 330cdf0e10cSrcweir { 331cdf0e10cSrcweir SalData* pSalData = new SalData; 332cdf0e10cSrcweir memset( pSalData, 0, sizeof( SalData ) ); 333cdf0e10cSrcweir SetSalData( pSalData ); 334cdf0e10cSrcweir } 335cdf0e10cSrcweir 336cdf0e10cSrcweir // ----------------------------------------------------------------------- 337cdf0e10cSrcweir 338cdf0e10cSrcweir void DeInitSalData() 339cdf0e10cSrcweir { 340cdf0e10cSrcweir SalData* pSalData = GetSalData(); 341cdf0e10cSrcweir if ( pSalData->mpFontMetrics ) 342cdf0e10cSrcweir delete pSalData->mpFontMetrics; 343cdf0e10cSrcweir delete pSalData; 344cdf0e10cSrcweir SetSalData( NULL ); 345cdf0e10cSrcweir } 346cdf0e10cSrcweir 347cdf0e10cSrcweir // ----------------------------------------------------------------------- 348cdf0e10cSrcweir 349cdf0e10cSrcweir void InitSalMain() 350cdf0e10cSrcweir { 351cdf0e10cSrcweir PPIB pib; 352cdf0e10cSrcweir PTIB tib; 353cdf0e10cSrcweir HAB hAB; 354cdf0e10cSrcweir HMQ hMQ; 355cdf0e10cSrcweir SalData* pData = GetAppSalData(); 356cdf0e10cSrcweir #if OSL_DEBUG_LEVEL>0 357cdf0e10cSrcweir printf("InitSalMain\n"); 358cdf0e10cSrcweir #endif 359cdf0e10cSrcweir 360cdf0e10cSrcweir // morph application to PM 361cdf0e10cSrcweir DosGetInfoBlocks(&tib, &pib); 362cdf0e10cSrcweir // Change flag from VIO to PM: 363cdf0e10cSrcweir if (pib->pib_ultype==2) pib->pib_ultype = 3; 364cdf0e10cSrcweir 365cdf0e10cSrcweir // create anchor block 366cdf0e10cSrcweir hAB = WinInitialize( 0 ); 367cdf0e10cSrcweir if ( !hAB ) 368cdf0e10cSrcweir return; 369cdf0e10cSrcweir 370cdf0e10cSrcweir // create message queue 371cdf0e10cSrcweir hMQ = WinCreateMsgQueue( hAB, 60 ); 372cdf0e10cSrcweir if ( !hMQ ) 373cdf0e10cSrcweir { 374cdf0e10cSrcweir WinTerminate( hAB ); 375cdf0e10cSrcweir return; 376cdf0e10cSrcweir } 377cdf0e10cSrcweir 378cdf0e10cSrcweir if ( pData ) // Im AppServer NULL 379cdf0e10cSrcweir { 380cdf0e10cSrcweir // Ankerblock und Messagequeue merken 381cdf0e10cSrcweir pData->mhAB = hAB; 382cdf0e10cSrcweir pData->mhMQ = hMQ; 383cdf0e10cSrcweir } 384cdf0e10cSrcweir 385cdf0e10cSrcweir } 386cdf0e10cSrcweir 387cdf0e10cSrcweir void DeInitSalMain() 388cdf0e10cSrcweir { 389cdf0e10cSrcweir #if OSL_DEBUG_LEVEL>0 390cdf0e10cSrcweir printf("DeInitSalMain\n"); 391cdf0e10cSrcweir #endif 392cdf0e10cSrcweir 393cdf0e10cSrcweir SalData* pData = GetAppSalData(); 394cdf0e10cSrcweir // destroy message queue and anchor block 395cdf0e10cSrcweir WinDestroyMsgQueue( pData->mhMQ ); 396cdf0e10cSrcweir WinTerminate( pData->mhAB ); 397cdf0e10cSrcweir 398cdf0e10cSrcweir } 399cdf0e10cSrcweir 400cdf0e10cSrcweir // ----------------------------------------------------------------------- 401cdf0e10cSrcweir 402cdf0e10cSrcweir SalInstance* CreateSalInstance() 403cdf0e10cSrcweir { 404cdf0e10cSrcweir SalData* pSalData = GetSalData(); 405cdf0e10cSrcweir 406cdf0e10cSrcweir // determine the os2 version 407cdf0e10cSrcweir ULONG nMayor; 408cdf0e10cSrcweir ULONG nMinor; 409cdf0e10cSrcweir DosQuerySysInfo( QSV_VERSION_MAJOR, QSV_VERSION_MAJOR, &nMayor, sizeof( nMayor ) ); 410cdf0e10cSrcweir DosQuerySysInfo( QSV_VERSION_MINOR, QSV_VERSION_MINOR, &nMinor, sizeof( nMinor ) ); 411cdf0e10cSrcweir aSalShlData.mnVersion = (USHORT)(nMayor*10 + nMinor); 412cdf0e10cSrcweir 413cdf0e10cSrcweir pSalData->mnAppThreadId = GetCurrentThreadId(); 414cdf0e10cSrcweir 415cdf0e10cSrcweir // register frame class 416cdf0e10cSrcweir if ( !WinRegisterClass( pSalData->mhAB, (PSZ)SAL_FRAME_CLASSNAME, 417cdf0e10cSrcweir (PFNWP)SalFrameWndProc, CS_MOVENOTIFY /* 17/08 CS_HITTEST | CS_MOVENOTIFY */, 418cdf0e10cSrcweir SAL_FRAME_WNDEXTRA ) ) 419cdf0e10cSrcweir { 420cdf0e10cSrcweir return NULL; 421cdf0e10cSrcweir } 422cdf0e10cSrcweir // register subframe class 423cdf0e10cSrcweir if ( !WinRegisterClass( pSalData->mhAB, (PSZ)SAL_SUBFRAME_CLASSNAME, 424cdf0e10cSrcweir (PFNWP)SalFrameWndProc, CS_SAVEBITS| CS_MOVENOTIFY, 425cdf0e10cSrcweir SAL_FRAME_WNDEXTRA ) ) 426cdf0e10cSrcweir { 427cdf0e10cSrcweir return NULL; 428cdf0e10cSrcweir } 429cdf0e10cSrcweir // register object class 430cdf0e10cSrcweir if ( !WinRegisterClass( pSalData->mhAB, (PSZ)SAL_COM_CLASSNAME, 431cdf0e10cSrcweir (PFNWP)SalComWndProc, 0, 0 )) 432cdf0e10cSrcweir { 433cdf0e10cSrcweir return NULL; 434cdf0e10cSrcweir } 435cdf0e10cSrcweir 436cdf0e10cSrcweir HWND hComWnd = WinCreateWindow( HWND_OBJECT, (PCSZ)SAL_COM_CLASSNAME, 437cdf0e10cSrcweir (PCSZ)"", 0, 0, 0, 0, 0, 438cdf0e10cSrcweir HWND_OBJECT, HWND_TOP, 439cdf0e10cSrcweir 222, NULL, NULL); 440cdf0e10cSrcweir if ( !hComWnd ) 441cdf0e10cSrcweir return NULL; 442cdf0e10cSrcweir 443cdf0e10cSrcweir #if OSL_DEBUG_LEVEL>0 444cdf0e10cSrcweir debug_printf("CreateSalInstance hComWnd %x\n", hComWnd); 445cdf0e10cSrcweir #endif 446cdf0e10cSrcweir Os2SalInstance* pInst = new Os2SalInstance; 447cdf0e10cSrcweir 448cdf0e10cSrcweir // init instance (only one instance in this version !!!) 449cdf0e10cSrcweir pSalData->mpFirstInstance = pInst; 450cdf0e10cSrcweir pInst->mhAB = pSalData->mhAB; 451cdf0e10cSrcweir pInst->mhMQ = pSalData->mhMQ; 452cdf0e10cSrcweir pInst->mnArgc = pSalData->mnArgc; 453cdf0e10cSrcweir pInst->mpArgv = pSalData->mpArgv; 454cdf0e10cSrcweir pInst->mhComWnd = hComWnd; 455cdf0e10cSrcweir 456cdf0e10cSrcweir // AppIcon ermitteln 457cdf0e10cSrcweir ImplLoadSalIcon( SAL_RESID_ICON_DEFAULT, pInst->mhAppIcon); 458cdf0e10cSrcweir 459cdf0e10cSrcweir // init static GDI Data 460cdf0e10cSrcweir ImplInitSalGDI(); 461cdf0e10cSrcweir 462cdf0e10cSrcweir return pInst; 463cdf0e10cSrcweir } 464cdf0e10cSrcweir 465cdf0e10cSrcweir // ----------------------------------------------------------------------- 466cdf0e10cSrcweir 467cdf0e10cSrcweir void DestroySalInstance( SalInstance* pInst ) 468cdf0e10cSrcweir { 469cdf0e10cSrcweir SalData* pSalData = GetSalData(); 470cdf0e10cSrcweir 471cdf0e10cSrcweir // (only one instance in this version !!!) 472cdf0e10cSrcweir ImplFreeSalGDI(); 473cdf0e10cSrcweir 474cdf0e10cSrcweir #ifdef ENABLE_IME 475cdf0e10cSrcweir // IME-Daten freigeben 476cdf0e10cSrcweir if ( pSalData->mpIMEData ) 477cdf0e10cSrcweir ImplReleaseSALIMEData(); 478cdf0e10cSrcweir #endif 479cdf0e10cSrcweir 480cdf0e10cSrcweir // reset instance 481cdf0e10cSrcweir if ( pSalData->mpFirstInstance == pInst ) 482cdf0e10cSrcweir pSalData->mpFirstInstance = NULL; 483cdf0e10cSrcweir 484cdf0e10cSrcweir delete pInst; 485cdf0e10cSrcweir } 486cdf0e10cSrcweir 487cdf0e10cSrcweir // ----------------------------------------------------------------------- 488cdf0e10cSrcweir 489cdf0e10cSrcweir Os2SalInstance::Os2SalInstance() 490cdf0e10cSrcweir { 491cdf0e10cSrcweir mhComWnd = 0; 492cdf0e10cSrcweir mpSalYieldMutex = new SalYieldMutex( this ); 493cdf0e10cSrcweir mpSalWaitMutex = new vos::OMutex; 494cdf0e10cSrcweir mnYieldWaitCount = 0; 495cdf0e10cSrcweir mpSalYieldMutex->acquire(); 496cdf0e10cSrcweir ::tools::SolarMutex::SetSolarMutex( mpSalYieldMutex ); 497cdf0e10cSrcweir } 498cdf0e10cSrcweir 499cdf0e10cSrcweir // ----------------------------------------------------------------------- 500cdf0e10cSrcweir 501cdf0e10cSrcweir Os2SalInstance::~Os2SalInstance() 502cdf0e10cSrcweir { 503cdf0e10cSrcweir ::tools::SolarMutex::SetSolarMutex( 0 ); 504cdf0e10cSrcweir mpSalYieldMutex->release(); 505cdf0e10cSrcweir delete mpSalYieldMutex; 506cdf0e10cSrcweir delete mpSalWaitMutex; 507cdf0e10cSrcweir WinDestroyWindow( mhComWnd); 508cdf0e10cSrcweir } 509cdf0e10cSrcweir 510cdf0e10cSrcweir // ----------------------------------------------------------------------- 511cdf0e10cSrcweir 512cdf0e10cSrcweir vos::IMutex* Os2SalInstance::GetYieldMutex() 513cdf0e10cSrcweir { 514cdf0e10cSrcweir return mpSalYieldMutex; 515cdf0e10cSrcweir } 516cdf0e10cSrcweir // ----------------------------------------------------------------------- 517cdf0e10cSrcweir 518cdf0e10cSrcweir ULONG Os2SalInstance::ReleaseYieldMutex() 519cdf0e10cSrcweir { 520cdf0e10cSrcweir return ImplSalReleaseYieldMutex(); 521cdf0e10cSrcweir } 522cdf0e10cSrcweir 523cdf0e10cSrcweir // ----------------------------------------------------------------------- 524cdf0e10cSrcweir 525cdf0e10cSrcweir void Os2SalInstance::AcquireYieldMutex( ULONG nCount ) 526cdf0e10cSrcweir { 527cdf0e10cSrcweir ImplSalAcquireYieldMutex( nCount ); 528cdf0e10cSrcweir } 529cdf0e10cSrcweir 530cdf0e10cSrcweir // ----------------------------------------------------------------------- 531cdf0e10cSrcweir 532*fc9fd3f1SPedro Giffuni static void ImplSalYield( sal_Bool bWait, sal_Bool bHandleAllCurrentEvents ) 533cdf0e10cSrcweir { 534cdf0e10cSrcweir QMSG aMsg; 535cdf0e10cSrcweir bool bWasMsg = false, bOneEvent = false; 536cdf0e10cSrcweir bool bQuit = false; 537cdf0e10cSrcweir 538cdf0e10cSrcweir Os2SalInstance* pInst = GetSalData()->mpFirstInstance; 539cdf0e10cSrcweir int nMaxEvents = bHandleAllCurrentEvents ? 100 : 1; 540cdf0e10cSrcweir do 541cdf0e10cSrcweir { 542cdf0e10cSrcweir if ( WinPeekMsg( pInst->mhAB, &aMsg, 0, 0, 0, PM_REMOVE ) ) 543cdf0e10cSrcweir { 544cdf0e10cSrcweir WinDispatchMsg( pInst->mhAB, &aMsg ); 545cdf0e10cSrcweir bOneEvent = bWasMsg = true; 546cdf0e10cSrcweir if (aMsg.msg == WM_QUIT) 547cdf0e10cSrcweir bQuit = true; 548cdf0e10cSrcweir } 549cdf0e10cSrcweir else 550cdf0e10cSrcweir bOneEvent = false; 551cdf0e10cSrcweir } while( --nMaxEvents && bOneEvent ); 552cdf0e10cSrcweir 553cdf0e10cSrcweir if ( bWait && ! bWasMsg ) 554cdf0e10cSrcweir { 555cdf0e10cSrcweir if ( WinGetMsg( pInst->mhAB, &aMsg, 0, 0, 0 ) ) 556cdf0e10cSrcweir WinDispatchMsg( pInst->mhAB, &aMsg ); 557cdf0e10cSrcweir else 558cdf0e10cSrcweir bQuit = true; 559cdf0e10cSrcweir } 560cdf0e10cSrcweir 561cdf0e10cSrcweir if (bQuit) 562cdf0e10cSrcweir { 563cdf0e10cSrcweir ImplSalYieldMutexAcquireWithWait(); 564cdf0e10cSrcweir Os2SalFrame* pFrame = GetSalData()->mpFirstFrame; 565cdf0e10cSrcweir if ( pFrame ) 566cdf0e10cSrcweir { 567cdf0e10cSrcweir if (pFrame->CallCallback( SALEVENT_SHUTDOWN, 0 )) 568cdf0e10cSrcweir WinCancelShutdown( pFrame->mhAB, FALSE ); 569cdf0e10cSrcweir } 570cdf0e10cSrcweir ImplSalYieldMutexRelease(); 571cdf0e10cSrcweir } 572cdf0e10cSrcweir 573cdf0e10cSrcweir } 574cdf0e10cSrcweir 575cdf0e10cSrcweir // ----------------------------------------------------------------------- 576cdf0e10cSrcweir 577cdf0e10cSrcweir void Os2SalInstance::Yield( bool bWait, bool bHandleAllCurrentEvents ) 578cdf0e10cSrcweir { 579cdf0e10cSrcweir SalYieldMutex* pYieldMutex = mpSalYieldMutex; 580cdf0e10cSrcweir SalData* pSalData = GetSalData(); 581cdf0e10cSrcweir ULONG nCurThreadId = GetCurrentThreadId(); 582cdf0e10cSrcweir ULONG nCount = pYieldMutex->GetAcquireCount( nCurThreadId ); 583cdf0e10cSrcweir ULONG n = nCount; 584cdf0e10cSrcweir while ( n ) 585cdf0e10cSrcweir { 586cdf0e10cSrcweir pYieldMutex->release(); 587cdf0e10cSrcweir n--; 588cdf0e10cSrcweir } 589cdf0e10cSrcweir if ( pSalData->mnAppThreadId != nCurThreadId ) 590cdf0e10cSrcweir { 591cdf0e10cSrcweir // #97739# A SendMessage call blocks until the called thread (here: the main thread) 592cdf0e10cSrcweir // returns. During a yield however, messages are processed in the main thread that might 593cdf0e10cSrcweir // result in a new message loop due to opening a dialog. Thus, SendMessage would not 594cdf0e10cSrcweir // return which will block this thread! 595cdf0e10cSrcweir // Solution: just give up the time slice and hope that messages are processed 596cdf0e10cSrcweir // by the main thread anyway (where all windows are created) 597cdf0e10cSrcweir // If the mainthread is not currently handling messages, then our SendMessage would 598cdf0e10cSrcweir // also do nothing, so this seems to be reasonable. 599cdf0e10cSrcweir 600cdf0e10cSrcweir // #i18883# only sleep if potential deadlock scenario, ie, when a dialog is open 601cdf0e10cSrcweir if( ImplGetSVData()->maAppData.mnModalMode ) 602cdf0e10cSrcweir DosSleep(1); 603cdf0e10cSrcweir else 604cdf0e10cSrcweir WinSendMsg( mhComWnd, SAL_MSG_THREADYIELD, (MPARAM)bWait, (MPARAM)bHandleAllCurrentEvents ); 605cdf0e10cSrcweir 606cdf0e10cSrcweir n = nCount; 607cdf0e10cSrcweir while ( n ) 608cdf0e10cSrcweir { 609cdf0e10cSrcweir pYieldMutex->acquire(); 610cdf0e10cSrcweir n--; 611cdf0e10cSrcweir } 612cdf0e10cSrcweir } 613cdf0e10cSrcweir else 614cdf0e10cSrcweir { 615cdf0e10cSrcweir ImplSalYield( bWait, bHandleAllCurrentEvents ); 616cdf0e10cSrcweir 617cdf0e10cSrcweir n = nCount; 618cdf0e10cSrcweir while ( n ) 619cdf0e10cSrcweir { 620cdf0e10cSrcweir ImplSalYieldMutexAcquireWithWait(); 621cdf0e10cSrcweir n--; 622cdf0e10cSrcweir } 623cdf0e10cSrcweir } 624cdf0e10cSrcweir } 625cdf0e10cSrcweir 626cdf0e10cSrcweir // ----------------------------------------------------------------------- 627cdf0e10cSrcweir 628cdf0e10cSrcweir MRESULT EXPENTRY SalComWndProc( HWND hWnd, ULONG nMsg, 629cdf0e10cSrcweir MPARAM nMP1, MPARAM nMP2 ) 630cdf0e10cSrcweir { 631cdf0e10cSrcweir //debug_printf( "SalComWndProc hWnd 0x%x nMsg %d\n", hWnd, nMsg); 632cdf0e10cSrcweir 633cdf0e10cSrcweir switch ( nMsg ) 634cdf0e10cSrcweir { 635cdf0e10cSrcweir case SAL_MSG_PRINTABORTJOB: 636cdf0e10cSrcweir //ImplSalPrinterAbortJobAsync( (HDC)wParam ); 637cdf0e10cSrcweir break; 638cdf0e10cSrcweir case SAL_MSG_THREADYIELD: 639cdf0e10cSrcweir ImplSalYield( (bool)nMP1, (bool) nMP2); 640cdf0e10cSrcweir return 0; 641cdf0e10cSrcweir // If we get this message, because another GetMessage() call 642cdf0e10cSrcweir // has recieved this message, we must post this message to 643cdf0e10cSrcweir // us again, because in the other case we wait forever. 644cdf0e10cSrcweir case SAL_MSG_RELEASEWAITYIELD: 645cdf0e10cSrcweir { 646cdf0e10cSrcweir Os2SalInstance* pInst = GetSalData()->mpFirstInstance; 647cdf0e10cSrcweir if ( pInst && pInst->mnYieldWaitCount ) 648cdf0e10cSrcweir WinPostMsg( hWnd, SAL_MSG_RELEASEWAITYIELD, nMP1, nMP2 ); 649cdf0e10cSrcweir } 650cdf0e10cSrcweir return 0; 651cdf0e10cSrcweir case SAL_MSG_STARTTIMER: 652cdf0e10cSrcweir ImplSalStartTimer( (ULONG)nMP2, FALSE); 653cdf0e10cSrcweir return 0; 654cdf0e10cSrcweir case SAL_MSG_CREATEFRAME: 655cdf0e10cSrcweir return (MRESULT)ImplSalCreateFrame( GetSalData()->mpFirstInstance, (HWND)nMP2, (ULONG)nMP1 ); 656cdf0e10cSrcweir case SAL_MSG_DESTROYFRAME: 657cdf0e10cSrcweir delete (SalFrame*)nMP2; 658cdf0e10cSrcweir return 0; 659cdf0e10cSrcweir case SAL_MSG_DESTROYHWND: 660cdf0e10cSrcweir //We only destroy the native window here. We do NOT destroy the SalFrame contained 661cdf0e10cSrcweir //in the structure (GetWindowPtr()). 662cdf0e10cSrcweir if (WinDestroyWindow((HWND)nMP2) == 0) 663cdf0e10cSrcweir { 664cdf0e10cSrcweir OSL_ENSURE(0, "DestroyWindow failed!"); 665cdf0e10cSrcweir //Failure: We remove the SalFrame from the window structure. So we avoid that 666cdf0e10cSrcweir // the window structure may contain an invalid pointer, once the SalFrame is deleted. 667cdf0e10cSrcweir SetWindowPtr((HWND)nMP2, 0); 668cdf0e10cSrcweir } 669cdf0e10cSrcweir return 0; 670cdf0e10cSrcweir case SAL_MSG_CREATEOBJECT: 671cdf0e10cSrcweir return (MRESULT)ImplSalCreateObject( GetSalData()->mpFirstInstance, (Os2SalFrame*)(ULONG)nMP2 ); 672cdf0e10cSrcweir case SAL_MSG_DESTROYOBJECT: 673cdf0e10cSrcweir delete (SalObject*)nMP2; 674cdf0e10cSrcweir return 0; 675cdf0e10cSrcweir case SAL_MSG_CREATESOUND: 676cdf0e10cSrcweir //return (MRESULT)((Os2SalSound*)nMP2)->ImplCreate(); 677cdf0e10cSrcweir return 0; 678cdf0e10cSrcweir case SAL_MSG_DESTROYSOUND: 679cdf0e10cSrcweir //((Os2SalSound*)nMP2)->ImplDestroy(); 680cdf0e10cSrcweir return 0; 681cdf0e10cSrcweir case SAL_MSG_POSTTIMER: 682cdf0e10cSrcweir SalTimerProc( 0, 0, SALTIMERPROC_RECURSIVE, (ULONG)nMP2 ); 683cdf0e10cSrcweir break; 684cdf0e10cSrcweir case WM_TIMER: 685cdf0e10cSrcweir SalTimerProc( hWnd, 0, 0, 0 ); 686cdf0e10cSrcweir break; 687cdf0e10cSrcweir } 688cdf0e10cSrcweir 689cdf0e10cSrcweir return WinDefWindowProc( hWnd, nMsg, nMP1, nMP2 ); 690cdf0e10cSrcweir } 691cdf0e10cSrcweir 692cdf0e10cSrcweir // ----------------------------------------------------------------------- 693cdf0e10cSrcweir 694cdf0e10cSrcweir bool Os2SalInstance::AnyInput( USHORT nType ) 695cdf0e10cSrcweir { 696cdf0e10cSrcweir SalData* pSalData = GetSalData(); 697cdf0e10cSrcweir QMSG aQMSG; 698cdf0e10cSrcweir 699cdf0e10cSrcweir if ( (nType & (INPUT_ANY)) == INPUT_ANY ) 700cdf0e10cSrcweir { 701cdf0e10cSrcweir // Any Input 702cdf0e10cSrcweir if ( WinPeekMsg( pSalData->mhAB, &aQMSG, 0, 0, 0, PM_NOREMOVE ) ) 703cdf0e10cSrcweir return TRUE; 704cdf0e10cSrcweir } 705cdf0e10cSrcweir else 706cdf0e10cSrcweir { 707cdf0e10cSrcweir if ( nType & INPUT_MOUSE ) 708cdf0e10cSrcweir { 709cdf0e10cSrcweir // Test auf Mouseinput 710cdf0e10cSrcweir if ( WinPeekMsg( pSalData->mhAB, &aQMSG, 0, 711cdf0e10cSrcweir WM_MOUSEFIRST, WM_MOUSELAST, PM_NOREMOVE ) ) 712cdf0e10cSrcweir return TRUE; 713cdf0e10cSrcweir } 714cdf0e10cSrcweir 715cdf0e10cSrcweir if ( nType & INPUT_KEYBOARD ) 716cdf0e10cSrcweir { 717cdf0e10cSrcweir // Test auf Keyinput 718cdf0e10cSrcweir if ( WinPeekMsg( pSalData->mhAB, &aQMSG, 0, 719cdf0e10cSrcweir WM_CHAR, WM_CHAR, PM_NOREMOVE ) ) 720cdf0e10cSrcweir return !(SHORT1FROMMP( aQMSG.mp1 ) & KC_KEYUP); 721cdf0e10cSrcweir } 722cdf0e10cSrcweir 723cdf0e10cSrcweir if ( nType & INPUT_PAINT ) 724cdf0e10cSrcweir { 725cdf0e10cSrcweir // Test auf Paintinput 726cdf0e10cSrcweir if ( WinPeekMsg( pSalData->mhAB, &aQMSG, 0, 727cdf0e10cSrcweir WM_PAINT, WM_PAINT, PM_NOREMOVE ) ) 728cdf0e10cSrcweir return TRUE; 729cdf0e10cSrcweir } 730cdf0e10cSrcweir 731cdf0e10cSrcweir if ( nType & INPUT_TIMER ) 732cdf0e10cSrcweir { 733cdf0e10cSrcweir // Test auf Timerinput 734cdf0e10cSrcweir if ( WinPeekMsg( pSalData->mhAB, &aQMSG, 0, 735cdf0e10cSrcweir WM_TIMER, WM_TIMER, PM_NOREMOVE ) ) 736cdf0e10cSrcweir return TRUE; 737cdf0e10cSrcweir } 738cdf0e10cSrcweir 739cdf0e10cSrcweir if ( nType & INPUT_OTHER ) 740cdf0e10cSrcweir { 741cdf0e10cSrcweir // Test auf sonstigen Input 742cdf0e10cSrcweir if ( WinPeekMsg( pSalData->mhAB, &aQMSG, 0, 0, 0, PM_NOREMOVE ) ) 743cdf0e10cSrcweir return TRUE; 744cdf0e10cSrcweir } 745cdf0e10cSrcweir } 746cdf0e10cSrcweir 747cdf0e10cSrcweir return FALSE; 748cdf0e10cSrcweir } 749cdf0e10cSrcweir 750cdf0e10cSrcweir // ----------------------------------------------------------------------- 751cdf0e10cSrcweir 752cdf0e10cSrcweir SalFrame* Os2SalInstance::CreateChildFrame( SystemParentData* pSystemParentData, ULONG nSalFrameStyle ) 753cdf0e10cSrcweir { 754cdf0e10cSrcweir // Um auf Main-Thread umzuschalten 755cdf0e10cSrcweir return (SalFrame*)WinSendMsg( mhComWnd, SAL_MSG_CREATEFRAME, (MPARAM)nSalFrameStyle, (MPARAM)pSystemParentData->hWnd ); 756cdf0e10cSrcweir } 757cdf0e10cSrcweir 758cdf0e10cSrcweir // ----------------------------------------------------------------------- 759cdf0e10cSrcweir 760cdf0e10cSrcweir SalFrame* Os2SalInstance::CreateFrame( SalFrame* pParent, ULONG nSalFrameStyle ) 761cdf0e10cSrcweir { 762cdf0e10cSrcweir // Um auf Main-Thread umzuschalten 763cdf0e10cSrcweir HWND mhWndClient; 764cdf0e10cSrcweir //31/05/06 YD use client as owner(parent) so positioning will not need to 765cdf0e10cSrcweir // take care of borders and captions 766cdf0e10cSrcweir if ( pParent ) 767cdf0e10cSrcweir mhWndClient = static_cast<Os2SalFrame*>(pParent)->mhWndClient; 768cdf0e10cSrcweir else 769cdf0e10cSrcweir mhWndClient = 0; 770cdf0e10cSrcweir return (SalFrame*)WinSendMsg( mhComWnd, SAL_MSG_CREATEFRAME, (MPARAM)nSalFrameStyle, (MPARAM)mhWndClient ); 771cdf0e10cSrcweir } 772cdf0e10cSrcweir 773cdf0e10cSrcweir 774cdf0e10cSrcweir // ----------------------------------------------------------------------- 775cdf0e10cSrcweir 776cdf0e10cSrcweir void Os2SalInstance::DestroyFrame( SalFrame* pFrame ) 777cdf0e10cSrcweir { 778cdf0e10cSrcweir WinSendMsg( mhComWnd, SAL_MSG_DESTROYFRAME, 0, (MPARAM)pFrame ); 779cdf0e10cSrcweir } 780cdf0e10cSrcweir 781cdf0e10cSrcweir // ----------------------------------------------------------------------- 782cdf0e10cSrcweir 783cdf0e10cSrcweir SalObject* Os2SalInstance::CreateObject( SalFrame* pParent, 784cdf0e10cSrcweir SystemWindowData* /*pWindowData*/, // SystemWindowData meaningless on Windows 785*fc9fd3f1SPedro Giffuni sal_Bool /*bShow*/ ) 786cdf0e10cSrcweir { 787cdf0e10cSrcweir // Um auf Main-Thread umzuschalten 788cdf0e10cSrcweir return (SalObject*)WinSendMsg( mhComWnd, SAL_MSG_CREATEOBJECT, 0, (MPARAM)pParent ); 789cdf0e10cSrcweir } 790cdf0e10cSrcweir 791cdf0e10cSrcweir 792cdf0e10cSrcweir // ----------------------------------------------------------------------- 793cdf0e10cSrcweir 794cdf0e10cSrcweir void Os2SalInstance::DestroyObject( SalObject* pObject ) 795cdf0e10cSrcweir { 796cdf0e10cSrcweir WinSendMsg( mhComWnd, SAL_MSG_DESTROYOBJECT, 0, (MPARAM)pObject ); 797cdf0e10cSrcweir } 798cdf0e10cSrcweir 799cdf0e10cSrcweir // ----------------------------------------------------------------------- 800cdf0e10cSrcweir 801cdf0e10cSrcweir void* Os2SalInstance::GetConnectionIdentifier( ConnectionIdentifierType& rReturnedType, int& rReturnedBytes ) 802cdf0e10cSrcweir { 803cdf0e10cSrcweir rReturnedBytes = 1; 804cdf0e10cSrcweir rReturnedType = AsciiCString; 805cdf0e10cSrcweir return (void*) ""; 806cdf0e10cSrcweir } 807cdf0e10cSrcweir 808cdf0e10cSrcweir void Os2SalInstance::AddToRecentDocumentList(const rtl::OUString& /*rFileUrl*/, const rtl::OUString& /*rMimeType*/) 809cdf0e10cSrcweir { 810cdf0e10cSrcweir } 811cdf0e10cSrcweir 812cdf0e10cSrcweir // ----------------------------------------------------------------------- 813cdf0e10cSrcweir 814cdf0e10cSrcweir SalTimer* Os2SalInstance::CreateSalTimer() 815cdf0e10cSrcweir { 816cdf0e10cSrcweir return new Os2SalTimer(); 817cdf0e10cSrcweir } 818cdf0e10cSrcweir 819cdf0e10cSrcweir // ----------------------------------------------------------------------- 820cdf0e10cSrcweir 821cdf0e10cSrcweir SalBitmap* Os2SalInstance::CreateSalBitmap() 822cdf0e10cSrcweir { 823cdf0e10cSrcweir return new Os2SalBitmap(); 824cdf0e10cSrcweir } 825cdf0e10cSrcweir 826cdf0e10cSrcweir // ----------------------------------------------------------------------- 827cdf0e10cSrcweir 828cdf0e10cSrcweir class Os2ImeStatus : public SalI18NImeStatus 829cdf0e10cSrcweir { 830cdf0e10cSrcweir public: 831cdf0e10cSrcweir Os2ImeStatus() {} 832cdf0e10cSrcweir virtual ~Os2ImeStatus() {} 833cdf0e10cSrcweir 834cdf0e10cSrcweir // asks whether there is a status window available 835cdf0e10cSrcweir // to toggle into menubar 836cdf0e10cSrcweir virtual bool canToggle() { return false; } 837cdf0e10cSrcweir virtual void toggle() {} 838cdf0e10cSrcweir }; 839cdf0e10cSrcweir 840cdf0e10cSrcweir SalI18NImeStatus* Os2SalInstance::CreateI18NImeStatus() 841cdf0e10cSrcweir { 842cdf0e10cSrcweir return new Os2ImeStatus(); 843cdf0e10cSrcweir } 844cdf0e10cSrcweir 845cdf0e10cSrcweir // ----------------------------------------------------------------------- 846cdf0e10cSrcweir 847cdf0e10cSrcweir const ::rtl::OUString& SalGetDesktopEnvironment() 848cdf0e10cSrcweir { 849cdf0e10cSrcweir static ::rtl::OUString aDesktopEnvironment( RTL_CONSTASCII_USTRINGPARAM( "OS/2" ) ); 850cdf0e10cSrcweir return aDesktopEnvironment; 851cdf0e10cSrcweir } 852cdf0e10cSrcweir 853cdf0e10cSrcweir SalSession* Os2SalInstance::CreateSalSession() 854cdf0e10cSrcweir { 855cdf0e10cSrcweir return NULL; 856cdf0e10cSrcweir } 857