Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Timer functions |
| 3 | * |
| 4 | * Copyright 1993 Alexandre Julliard |
| 5 | */ |
| 6 | |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 7 | #include "windows.h" |
Alexandre Julliard | b817f4f | 1996-03-14 18:08:34 +0000 | [diff] [blame] | 8 | #include "queue.h" |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 9 | #include "winproc.h" |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 10 | #include "debug.h" |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 11 | |
| 12 | |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 13 | typedef struct tagTIMER |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 14 | { |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 15 | HWND32 hwnd; |
| 16 | HQUEUE16 hq; |
| 17 | UINT16 msg; /* WM_TIMER or WM_SYSTIMER */ |
| 18 | UINT32 id; |
| 19 | UINT32 timeout; |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 20 | struct tagTIMER *next; |
Alexandre Julliard | 8b91563 | 1996-06-16 16:16:05 +0000 | [diff] [blame] | 21 | DWORD expires; /* Next expiration, or 0 if already expired */ |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 22 | HWINDOWPROC proc; |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 23 | } TIMER; |
| 24 | |
| 25 | #define NB_TIMERS 34 |
| 26 | #define NB_RESERVED_TIMERS 2 /* for SetSystemTimer */ |
| 27 | |
| 28 | static TIMER TimersArray[NB_TIMERS]; |
| 29 | |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 30 | static TIMER * pNextTimer = NULL; /* Next timer to expire */ |
| 31 | |
Alexandre Julliard | 8d24ae6 | 1994-04-05 21:42:43 +0000 | [diff] [blame] | 32 | /* Duration from 'time' until expiration of the timer */ |
| 33 | #define EXPIRE_TIME(pTimer,time) \ |
| 34 | (((pTimer)->expires <= (time)) ? 0 : (pTimer)->expires - (time)) |
| 35 | |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 36 | |
| 37 | /*********************************************************************** |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 38 | * TIMER_InsertTimer |
| 39 | * |
| 40 | * Insert the timer at its place in the chain. |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 41 | */ |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 42 | static void TIMER_InsertTimer( TIMER * pTimer ) |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 43 | { |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 44 | if (!pNextTimer || (pTimer->expires < pNextTimer->expires)) |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 45 | { |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 46 | pTimer->next = pNextTimer; |
| 47 | pNextTimer = pTimer; |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 48 | } |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 49 | else |
| 50 | { |
| 51 | TIMER * ptr = pNextTimer; |
| 52 | while (ptr->next && (pTimer->expires >= ptr->next->expires)) |
| 53 | ptr = ptr->next; |
Alexandre Julliard | 8d24ae6 | 1994-04-05 21:42:43 +0000 | [diff] [blame] | 54 | pTimer->next = ptr->next; |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 55 | ptr->next = pTimer; |
| 56 | } |
| 57 | } |
| 58 | |
| 59 | |
| 60 | /*********************************************************************** |
| 61 | * TIMER_RemoveTimer |
| 62 | * |
| 63 | * Remove the timer from the chain. |
| 64 | */ |
| 65 | static void TIMER_RemoveTimer( TIMER * pTimer ) |
| 66 | { |
Alexandre Julliard | ef702d8 | 1996-05-28 18:54:58 +0000 | [diff] [blame] | 67 | TIMER **ppTimer = &pNextTimer; |
| 68 | |
| 69 | while (*ppTimer && (*ppTimer != pTimer)) ppTimer = &(*ppTimer)->next; |
| 70 | if (*ppTimer) *ppTimer = pTimer->next; |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 71 | pTimer->next = NULL; |
Alexandre Julliard | 8b91563 | 1996-06-16 16:16:05 +0000 | [diff] [blame] | 72 | if (!pTimer->expires) QUEUE_DecTimerCount( pTimer->hq ); |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 73 | } |
| 74 | |
Alexandre Julliard | ef702d8 | 1996-05-28 18:54:58 +0000 | [diff] [blame] | 75 | |
| 76 | /*********************************************************************** |
| 77 | * TIMER_ClearTimer |
| 78 | * |
| 79 | * Clear and remove a timer. |
| 80 | */ |
| 81 | static void TIMER_ClearTimer( TIMER * pTimer ) |
| 82 | { |
| 83 | TIMER_RemoveTimer( pTimer ); |
Alexandre Julliard | ef702d8 | 1996-05-28 18:54:58 +0000 | [diff] [blame] | 84 | pTimer->hwnd = 0; |
| 85 | pTimer->msg = 0; |
| 86 | pTimer->id = 0; |
| 87 | pTimer->timeout = 0; |
Alexandre Julliard | df2673b | 1997-03-29 17:20:20 +0000 | [diff] [blame] | 88 | WINPROC_FreeProc( pTimer->proc, WIN_PROC_TIMER ); |
Alexandre Julliard | ef702d8 | 1996-05-28 18:54:58 +0000 | [diff] [blame] | 89 | } |
| 90 | |
| 91 | |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 92 | /*********************************************************************** |
| 93 | * TIMER_SwitchQueue |
| 94 | */ |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 95 | void TIMER_SwitchQueue( HQUEUE16 old, HQUEUE16 new ) |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 96 | { |
Alexandre Julliard | ef702d8 | 1996-05-28 18:54:58 +0000 | [diff] [blame] | 97 | TIMER * pT = pNextTimer; |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 98 | |
Alexandre Julliard | ef702d8 | 1996-05-28 18:54:58 +0000 | [diff] [blame] | 99 | while (pT) |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 100 | { |
Alexandre Julliard | ef702d8 | 1996-05-28 18:54:58 +0000 | [diff] [blame] | 101 | if (pT->hq == old) pT->hq = new; |
| 102 | pT = pT->next; |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 103 | } |
| 104 | } |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 105 | |
Alexandre Julliard | ef702d8 | 1996-05-28 18:54:58 +0000 | [diff] [blame] | 106 | |
| 107 | /*********************************************************************** |
| 108 | * TIMER_RemoveWindowTimers |
| 109 | * |
| 110 | * Remove all timers for a given window. |
| 111 | */ |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 112 | void TIMER_RemoveWindowTimers( HWND32 hwnd ) |
Alexandre Julliard | ef702d8 | 1996-05-28 18:54:58 +0000 | [diff] [blame] | 113 | { |
| 114 | int i; |
| 115 | TIMER *pTimer; |
| 116 | |
| 117 | for (i = NB_TIMERS, pTimer = TimersArray; i > 0; i--, pTimer++) |
| 118 | if ((pTimer->hwnd == hwnd) && pTimer->timeout) |
| 119 | TIMER_ClearTimer( pTimer ); |
| 120 | } |
| 121 | |
| 122 | |
| 123 | /*********************************************************************** |
| 124 | * TIMER_RemoveQueueTimers |
| 125 | * |
| 126 | * Remove all timers for a given queue. |
| 127 | */ |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 128 | void TIMER_RemoveQueueTimers( HQUEUE16 hqueue ) |
Alexandre Julliard | ef702d8 | 1996-05-28 18:54:58 +0000 | [diff] [blame] | 129 | { |
| 130 | int i; |
| 131 | TIMER *pTimer; |
| 132 | |
| 133 | for (i = NB_TIMERS, pTimer = TimersArray; i > 0; i--, pTimer++) |
| 134 | if ((pTimer->hq == hqueue) && pTimer->timeout) |
| 135 | TIMER_ClearTimer( pTimer ); |
| 136 | } |
| 137 | |
| 138 | |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 139 | /*********************************************************************** |
Alexandre Julliard | 8d24ae6 | 1994-04-05 21:42:43 +0000 | [diff] [blame] | 140 | * TIMER_RestartTimers |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 141 | * |
Alexandre Julliard | 8d24ae6 | 1994-04-05 21:42:43 +0000 | [diff] [blame] | 142 | * Restart an expired timer. |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 143 | */ |
Alexandre Julliard | 8d24ae6 | 1994-04-05 21:42:43 +0000 | [diff] [blame] | 144 | static void TIMER_RestartTimer( TIMER * pTimer, DWORD curTime ) |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 145 | { |
Alexandre Julliard | 8d24ae6 | 1994-04-05 21:42:43 +0000 | [diff] [blame] | 146 | TIMER_RemoveTimer( pTimer ); |
| 147 | pTimer->expires = curTime + pTimer->timeout; |
| 148 | TIMER_InsertTimer( pTimer ); |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 149 | } |
| 150 | |
Alexandre Julliard | 8d24ae6 | 1994-04-05 21:42:43 +0000 | [diff] [blame] | 151 | |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 152 | /*********************************************************************** |
Alexandre Julliard | 8b91563 | 1996-06-16 16:16:05 +0000 | [diff] [blame] | 153 | * TIMER_GetNextExpiration |
Alexandre Julliard | ef702d8 | 1996-05-28 18:54:58 +0000 | [diff] [blame] | 154 | * |
| 155 | * Return next timer expiration time, or -1 if none. |
| 156 | */ |
Alexandre Julliard | 8b91563 | 1996-06-16 16:16:05 +0000 | [diff] [blame] | 157 | LONG TIMER_GetNextExpiration(void) |
Alexandre Julliard | ef702d8 | 1996-05-28 18:54:58 +0000 | [diff] [blame] | 158 | { |
| 159 | return pNextTimer ? EXPIRE_TIME( pNextTimer, GetTickCount() ) : -1; |
| 160 | } |
| 161 | |
| 162 | |
| 163 | /*********************************************************************** |
Alexandre Julliard | 8b91563 | 1996-06-16 16:16:05 +0000 | [diff] [blame] | 164 | * TIMER_ExpireTimers |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 165 | * |
Alexandre Julliard | 8b91563 | 1996-06-16 16:16:05 +0000 | [diff] [blame] | 166 | * Mark expired timers and wake the appropriate queues. |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 167 | */ |
Alexandre Julliard | 8b91563 | 1996-06-16 16:16:05 +0000 | [diff] [blame] | 168 | void TIMER_ExpireTimers(void) |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 169 | { |
Alexandre Julliard | 8b91563 | 1996-06-16 16:16:05 +0000 | [diff] [blame] | 170 | TIMER *pTimer = pNextTimer; |
| 171 | DWORD curTime = GetTickCount(); |
| 172 | |
| 173 | while (pTimer && !pTimer->expires) /* Skip already expired timers */ |
| 174 | pTimer = pTimer->next; |
| 175 | while (pTimer && (pTimer->expires <= curTime)) |
| 176 | { |
| 177 | pTimer->expires = 0; |
| 178 | QUEUE_IncTimerCount( pTimer->hq ); |
| 179 | pTimer = pTimer->next; |
| 180 | } |
| 181 | } |
| 182 | |
| 183 | |
| 184 | /*********************************************************************** |
| 185 | * TIMER_GetTimerMsg |
| 186 | * |
| 187 | * Build a message for an expired timer. |
| 188 | */ |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 189 | BOOL32 TIMER_GetTimerMsg( MSG16 *msg, HWND32 hwnd, |
| 190 | HQUEUE16 hQueue, BOOL32 remove ) |
Alexandre Julliard | 8b91563 | 1996-06-16 16:16:05 +0000 | [diff] [blame] | 191 | { |
| 192 | TIMER *pTimer = pNextTimer; |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 193 | DWORD curTime = GetTickCount(); |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 194 | |
Alexandre Julliard | 8d24ae6 | 1994-04-05 21:42:43 +0000 | [diff] [blame] | 195 | if (hwnd) /* Find first timer for this window */ |
| 196 | while (pTimer && (pTimer->hwnd != hwnd)) pTimer = pTimer->next; |
Alexandre Julliard | 8b91563 | 1996-06-16 16:16:05 +0000 | [diff] [blame] | 197 | else /* Find first timer for this queue */ |
| 198 | while (pTimer && (pTimer->hq != hQueue)) pTimer = pTimer->next; |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 199 | |
Alexandre Julliard | 8b91563 | 1996-06-16 16:16:05 +0000 | [diff] [blame] | 200 | if (!pTimer || (pTimer->expires > curTime)) return FALSE; /* No timer */ |
| 201 | if (remove) TIMER_RestartTimer( pTimer, curTime ); /* Restart it */ |
Alexandre Julliard | 8d24ae6 | 1994-04-05 21:42:43 +0000 | [diff] [blame] | 202 | |
Alexandre Julliard | a69b88b | 1998-03-15 20:29:56 +0000 | [diff] [blame] | 203 | TRACE(timer, "Timer expired: %04x, %04x, %04x, %08lx\n", |
Alexandre Julliard | 8b91563 | 1996-06-16 16:16:05 +0000 | [diff] [blame] | 204 | pTimer->hwnd, pTimer->msg, pTimer->id, (DWORD)pTimer->proc); |
Alexandre Julliard | 8d24ae6 | 1994-04-05 21:42:43 +0000 | [diff] [blame] | 205 | |
| 206 | /* Build the message */ |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 207 | msg->hwnd = (HWND16)pTimer->hwnd; |
Alexandre Julliard | 8d24ae6 | 1994-04-05 21:42:43 +0000 | [diff] [blame] | 208 | msg->message = pTimer->msg; |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 209 | msg->wParam = (UINT16)pTimer->id; |
Alexandre Julliard | 8d24ae6 | 1994-04-05 21:42:43 +0000 | [diff] [blame] | 210 | msg->lParam = (LONG)pTimer->proc; |
| 211 | msg->time = curTime; |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 212 | return TRUE; |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 213 | } |
| 214 | |
| 215 | |
| 216 | /*********************************************************************** |
| 217 | * TIMER_SetTimer |
| 218 | */ |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 219 | static UINT32 TIMER_SetTimer( HWND32 hwnd, UINT32 id, UINT32 timeout, |
| 220 | WNDPROC16 proc, WINDOWPROCTYPE type, BOOL32 sys ) |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 221 | { |
| 222 | int i; |
| 223 | TIMER * pTimer; |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 224 | |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 225 | if (!timeout) return 0; |
Alexandre Julliard | 940d58c | 1994-09-16 09:24:37 +0000 | [diff] [blame] | 226 | |
| 227 | /* Check if there's already a timer with the same hwnd and id */ |
| 228 | |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 229 | for (i = 0, pTimer = TimersArray; i < NB_TIMERS; i++, pTimer++) |
| 230 | if ((pTimer->hwnd == hwnd) && (pTimer->id == id) && |
| 231 | (pTimer->timeout != 0)) |
| 232 | { |
| 233 | /* Got one: set new values and return */ |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 234 | TIMER_RemoveTimer( pTimer ); |
Alexandre Julliard | 8b91563 | 1996-06-16 16:16:05 +0000 | [diff] [blame] | 235 | pTimer->timeout = timeout; |
Alexandre Julliard | df2673b | 1997-03-29 17:20:20 +0000 | [diff] [blame] | 236 | WINPROC_FreeProc( pTimer->proc, WIN_PROC_TIMER ); |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 237 | pTimer->proc = (HWINDOWPROC)0; |
Alexandre Julliard | df2673b | 1997-03-29 17:20:20 +0000 | [diff] [blame] | 238 | if (proc) WINPROC_SetProc( &pTimer->proc, proc, |
| 239 | type, WIN_PROC_TIMER ); |
Alexandre Julliard | 8b91563 | 1996-06-16 16:16:05 +0000 | [diff] [blame] | 240 | pTimer->expires = GetTickCount() + timeout; |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 241 | TIMER_InsertTimer( pTimer ); |
| 242 | return id; |
| 243 | } |
Alexandre Julliard | 940d58c | 1994-09-16 09:24:37 +0000 | [diff] [blame] | 244 | |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 245 | /* Find a free timer */ |
| 246 | |
| 247 | for (i = 0, pTimer = TimersArray; i < NB_TIMERS; i++, pTimer++) |
| 248 | if (!pTimer->timeout) break; |
| 249 | |
| 250 | if (i >= NB_TIMERS) return 0; |
| 251 | if (!sys && (i >= NB_TIMERS-NB_RESERVED_TIMERS)) return 0; |
| 252 | if (!hwnd) id = i + 1; |
| 253 | |
| 254 | /* Add the timer */ |
| 255 | |
| 256 | pTimer->hwnd = hwnd; |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 257 | pTimer->hq = (hwnd) ? GetTaskQueue( GetWindowTask16( hwnd ) ) |
Alexandre Julliard | c981d0b | 1996-03-31 16:40:13 +0000 | [diff] [blame] | 258 | : GetTaskQueue( 0 ); |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 259 | pTimer->msg = sys ? WM_SYSTIMER : WM_TIMER; |
| 260 | pTimer->id = id; |
| 261 | pTimer->timeout = timeout; |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 262 | pTimer->expires = GetTickCount() + timeout; |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 263 | pTimer->proc = (HWINDOWPROC)0; |
Alexandre Julliard | df2673b | 1997-03-29 17:20:20 +0000 | [diff] [blame] | 264 | if (proc) WINPROC_SetProc( &pTimer->proc, proc, type, WIN_PROC_TIMER ); |
Alexandre Julliard | a69b88b | 1998-03-15 20:29:56 +0000 | [diff] [blame] | 265 | TRACE(timer, "Timer added: %p, %04x, %04x, %04x, %08lx\n", |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 266 | pTimer, pTimer->hwnd, pTimer->msg, pTimer->id, |
| 267 | (DWORD)pTimer->proc ); |
Alexandre Julliard | 5f721f8 | 1994-01-04 20:14:34 +0000 | [diff] [blame] | 268 | TIMER_InsertTimer( pTimer ); |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 269 | if (!id) return TRUE; |
| 270 | else return id; |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 271 | } |
| 272 | |
| 273 | |
| 274 | /*********************************************************************** |
| 275 | * TIMER_KillTimer |
| 276 | */ |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 277 | static BOOL32 TIMER_KillTimer( HWND32 hwnd, UINT32 id, BOOL32 sys ) |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 278 | { |
| 279 | int i; |
| 280 | TIMER * pTimer; |
| 281 | |
Alexandre Julliard | ef702d8 | 1996-05-28 18:54:58 +0000 | [diff] [blame] | 282 | /* Find the timer */ |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 283 | |
| 284 | for (i = 0, pTimer = TimersArray; i < NB_TIMERS; i++, pTimer++) |
| 285 | if ((pTimer->hwnd == hwnd) && (pTimer->id == id) && |
| 286 | (pTimer->timeout != 0)) break; |
| 287 | if (i >= NB_TIMERS) return FALSE; |
| 288 | if (!sys && (i >= NB_TIMERS-NB_RESERVED_TIMERS)) return FALSE; |
| 289 | if (!sys && (pTimer->msg != WM_TIMER)) return FALSE; |
| 290 | else if (sys && (pTimer->msg != WM_SYSTIMER)) return FALSE; |
| 291 | |
Alexandre Julliard | ef702d8 | 1996-05-28 18:54:58 +0000 | [diff] [blame] | 292 | /* Delete the timer */ |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 293 | |
Alexandre Julliard | ef702d8 | 1996-05-28 18:54:58 +0000 | [diff] [blame] | 294 | TIMER_ClearTimer( pTimer ); |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 295 | return TRUE; |
| 296 | } |
| 297 | |
| 298 | |
| 299 | /*********************************************************************** |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 300 | * SetTimer16 (USER.10) |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 301 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 302 | UINT16 WINAPI SetTimer16( HWND16 hwnd, UINT16 id, UINT16 timeout, |
| 303 | TIMERPROC16 proc ) |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 304 | { |
Alexandre Julliard | a69b88b | 1998-03-15 20:29:56 +0000 | [diff] [blame] | 305 | TRACE(timer, "%04x %d %d %08lx\n", |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 306 | hwnd, id, timeout, (LONG)proc ); |
| 307 | return TIMER_SetTimer( hwnd, id, timeout, (WNDPROC16)proc, |
| 308 | WIN_PROC_16, FALSE ); |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 309 | } |
| 310 | |
| 311 | |
| 312 | /*********************************************************************** |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 313 | * SetTimer32 (USER32.510) |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 314 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 315 | UINT32 WINAPI SetTimer32( HWND32 hwnd, UINT32 id, UINT32 timeout, |
| 316 | TIMERPROC32 proc ) |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 317 | { |
Alexandre Julliard | a69b88b | 1998-03-15 20:29:56 +0000 | [diff] [blame] | 318 | TRACE(timer, "%04x %d %d %08lx\n", |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 319 | hwnd, id, timeout, (LONG)proc ); |
| 320 | return TIMER_SetTimer( hwnd, id, timeout, (WNDPROC16)proc, |
| 321 | WIN_PROC_32A, FALSE ); |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 322 | } |
| 323 | |
| 324 | |
| 325 | /*********************************************************************** |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 326 | * SetSystemTimer16 (USER.11) |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 327 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 328 | UINT16 WINAPI SetSystemTimer16( HWND16 hwnd, UINT16 id, UINT16 timeout, |
| 329 | TIMERPROC16 proc ) |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 330 | { |
Alexandre Julliard | a69b88b | 1998-03-15 20:29:56 +0000 | [diff] [blame] | 331 | TRACE(timer, "%04x %d %d %08lx\n", |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 332 | hwnd, id, timeout, (LONG)proc ); |
| 333 | return TIMER_SetTimer( hwnd, id, timeout, (WNDPROC16)proc, |
| 334 | WIN_PROC_16, TRUE ); |
| 335 | } |
| 336 | |
| 337 | |
| 338 | /*********************************************************************** |
| 339 | * SetSystemTimer32 (USER32.508) |
| 340 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 341 | UINT32 WINAPI SetSystemTimer32( HWND32 hwnd, UINT32 id, UINT32 timeout, |
| 342 | TIMERPROC32 proc ) |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 343 | { |
Alexandre Julliard | a69b88b | 1998-03-15 20:29:56 +0000 | [diff] [blame] | 344 | TRACE(timer, "%04x %d %d %08lx\n", |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 345 | hwnd, id, timeout, (LONG)proc ); |
| 346 | return TIMER_SetTimer( hwnd, id, timeout, (WNDPROC16)proc, |
| 347 | WIN_PROC_32A, TRUE ); |
| 348 | } |
| 349 | |
| 350 | |
| 351 | /*********************************************************************** |
| 352 | * KillTimer16 (USER.12) |
| 353 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 354 | BOOL16 WINAPI KillTimer16( HWND16 hwnd, UINT16 id ) |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 355 | { |
Alexandre Julliard | a69b88b | 1998-03-15 20:29:56 +0000 | [diff] [blame] | 356 | TRACE(timer, "%04x %d\n", hwnd, id ); |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 357 | return TIMER_KillTimer( hwnd, id, FALSE ); |
| 358 | } |
| 359 | |
| 360 | |
| 361 | /*********************************************************************** |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 362 | * KillTimer32 (USER32.353) |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 363 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 364 | BOOL32 WINAPI KillTimer32( HWND32 hwnd, UINT32 id ) |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 365 | { |
Alexandre Julliard | a69b88b | 1998-03-15 20:29:56 +0000 | [diff] [blame] | 366 | TRACE(timer, "%04x %d\n", hwnd, id ); |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 367 | return TIMER_KillTimer( hwnd, id, FALSE ); |
| 368 | } |
| 369 | |
| 370 | |
| 371 | /*********************************************************************** |
| 372 | * KillSystemTimer16 (USER.182) |
| 373 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 374 | BOOL16 WINAPI KillSystemTimer16( HWND16 hwnd, UINT16 id ) |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 375 | { |
Alexandre Julliard | a69b88b | 1998-03-15 20:29:56 +0000 | [diff] [blame] | 376 | TRACE(timer, "%04x %d\n", hwnd, id ); |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 377 | return TIMER_KillTimer( hwnd, id, TRUE ); |
| 378 | } |
| 379 | |
| 380 | |
| 381 | /*********************************************************************** |
| 382 | * KillSystemTimer32 (USER32.352) |
| 383 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 384 | BOOL32 WINAPI KillSystemTimer32( HWND32 hwnd, UINT32 id ) |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 385 | { |
Alexandre Julliard | a69b88b | 1998-03-15 20:29:56 +0000 | [diff] [blame] | 386 | TRACE(timer, "%04x %d\n", hwnd, id ); |
Alexandre Julliard | 401710d | 1993-09-04 10:09:32 +0000 | [diff] [blame] | 387 | return TIMER_KillTimer( hwnd, id, TRUE ); |
| 388 | } |