xref: /AOO41X/main/vcl/os2/source/app/saltimer.cxx (revision fc9fd3f14a55d77b35643a64034752a178b2a5b0)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #include <svpm.h>
25 
26 #define _SV_SALTIMER_CXX
27 #include <os2/saldata.hxx>
28 #include <os2/saltimer.h>
29 #include <os2/salinst.h>
30 
31 // =======================================================================
32 
33 // Maximale Periode
34 #define MAX_SYSPERIOD     65533
35 #define IDTIMER             10
36 
37 // =======================================================================
38 
ImplSalStartTimer(ULONG nMS,sal_Bool bMutex)39 void ImplSalStartTimer( ULONG nMS, sal_Bool bMutex )
40 {
41     SalData*    pSalData = GetSalData();
42 
43     // Periode darf nicht zu gross sein, da OS2 2.11 mit USHORT arbeitet
44     // Remenber the time of the timer
45     pSalData->mnTimerMS = nMS;
46     if ( !bMutex )
47         pSalData->mnTimerOrgMS = nMS;
48 
49     // Periode darf nicht zu gross sein, da Windows mit USHORT arbeitet
50     if ( nMS > MAX_SYSPERIOD )
51         nMS = MAX_SYSPERIOD;
52 
53     // Gibt es einen Timer, dann zerstoren
54     if ( pSalData->mnTimerId )
55         WinStopTimer( pSalData->mhAB, pSalData->mpFirstInstance->mhComWnd, pSalData->mnTimerId );
56 
57     // Make a new timer with new period
58     pSalData->mnTimerId = WinStartTimer( pSalData->mhAB, pSalData->mpFirstInstance->mhComWnd, IDTIMER, nMS );
59     pSalData->mnNextTimerTime = pSalData->mnLastEventTime + nMS;
60 }
61 
62 // -----------------------------------------------------------------------
63 
~Os2SalTimer()64 Os2SalTimer::~Os2SalTimer()
65 {
66 }
67 
68 // -----------------------------------------------------------------------
69 
Start(ULONG nMS)70 void Os2SalTimer::Start( ULONG nMS )
71 {
72     // Um auf Main-Thread umzuschalten
73     SalData* pSalData = GetSalData();
74     if ( pSalData->mpFirstInstance )
75     {
76         if ( pSalData->mnAppThreadId != GetCurrentThreadId() )
77             WinPostMsg( pSalData->mpFirstInstance->mhComWnd, SAL_MSG_STARTTIMER, 0, (MPARAM)nMS );
78         else
79             WinSendMsg( pSalData->mpFirstInstance->mhComWnd, SAL_MSG_STARTTIMER, 0, (MPARAM)nMS );
80     }
81     else
82         ImplSalStartTimer( nMS, FALSE);
83 }
84 
85 // -----------------------------------------------------------------------
86 
Stop()87 void Os2SalTimer::Stop()
88 {
89     SalData*    pSalData = GetSalData();
90 
91     // Exitstiert ein Timer, dann diesen zerstoeren
92     if ( pSalData->mnTimerId ) {
93         WinStopTimer( pSalData->mhAB, pSalData->mpFirstInstance->mhComWnd, pSalData->mnTimerId );
94         pSalData->mnTimerId = 0;
95         pSalData->mnNextTimerTime = 0;
96     }
97 }
98 
99 // -----------------------------------------------------------------------
100 
SalTimerProc(HWND,UINT,UINT nId,ULONG)101 void SalTimerProc( HWND, UINT, UINT nId, ULONG )
102 {
103     SalData* pSalData = GetSalData();
104     ImplSVData* pSVData = ImplGetSVData();
105 
106     // Test for MouseLeave
107     SalTestMouseLeave();
108 
109     bool bRecursive = pSalData->mbInTimerProc && (nId != SALTIMERPROC_RECURSIVE);
110     if ( pSVData->mpSalTimer && ! bRecursive )
111     {
112         // Try to aquire the mutex. If we don't get the mutex then we
113         // try this a short time later again.
114         if ( ImplSalYieldMutexTryToAcquire() )
115         {
116             bRecursive = pSalData->mbInTimerProc && (nId != SALTIMERPROC_RECURSIVE);
117             if ( pSVData->mpSalTimer && ! bRecursive )
118             {
119                 pSalData->mbInTimerProc = TRUE;
120                 pSVData->mpSalTimer->CallCallback();
121                 pSalData->mbInTimerProc = FALSE;
122                 ImplSalYieldMutexRelease();
123 
124                 // Run the timer in the correct time, if we start this
125                 // with a small timeout, because we don't get the mutex
126                 if ( pSalData->mnTimerId &&
127                     (pSalData->mnTimerMS != pSalData->mnTimerOrgMS) )
128                     ImplSalStartTimer( pSalData->mnTimerOrgMS, FALSE );
129             }
130         }
131         else
132             ImplSalStartTimer( 10, TRUE );
133     }
134 
135 }
136 
137