xref: /trunk/main/vcl/os2/source/app/salinst.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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