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