Release 0.3.0
[wine] / windows / timer.c
1 /*
2  * Timer functions
3  *
4  * Copyright 1993 Alexandre Julliard
5  */
6
7 static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
8
9 #include <X11/Intrinsic.h>
10
11 #include "windows.h"
12
13 extern XtAppContext XT_app_context;
14
15
16 typedef struct
17 {
18     HWND          hwnd;
19     WORD          msg;  /* WM_TIMER or WM_SYSTIMER */
20     WORD          id;
21     WORD          timeout;
22     FARPROC       proc;
23     XtIntervalId  xtid;
24 } TIMER;
25
26 #define NB_TIMERS            34
27 #define NB_RESERVED_TIMERS    2  /* for SetSystemTimer */
28
29 static TIMER TimersArray[NB_TIMERS];
30
31
32 /***********************************************************************
33  *           TIMER_callback
34  */
35 static void TIMER_callback( XtPointer data, XtIntervalId * xtid )
36 {
37     TIMER * pTimer = (TIMER *) data;
38     
39     pTimer->xtid = 0;  /* In case the timer procedure calls KillTimer */
40     
41     if (pTimer->proc)
42     {
43         CallWindowProc(pTimer->proc, pTimer->hwnd, pTimer->msg, 
44                        pTimer->id, GetTickCount());
45     }
46     else 
47         PostMessage( pTimer->hwnd, pTimer->msg, pTimer->id, 0 );
48
49       /* If timeout == 0, the timer has been removed by KillTimer */
50     if (pTimer->timeout)
51         pTimer->xtid = XtAppAddTimeOut( XT_app_context, pTimer->timeout,
52                                         TIMER_callback, pTimer );
53 }
54
55
56 /***********************************************************************
57  *           TIMER_SetTimer
58  */
59 WORD TIMER_SetTimer( HWND hwnd, WORD id, WORD timeout, FARPROC proc, BOOL sys )
60 {
61     int i;
62     TIMER * pTimer;
63     
64     if (!timeout) return 0;
65     if (!hwnd && !proc) return 0;
66     
67       /* Find a free timer */
68     
69     for (i = 0, pTimer = TimersArray; i < NB_TIMERS; i++, pTimer++)
70         if (!pTimer->timeout) break;
71
72     if (i >= NB_TIMERS) return 0;
73     if (!sys && (i >= NB_TIMERS-NB_RESERVED_TIMERS)) return 0;
74     if (!hwnd) id = i + 1;
75     
76       /* Add the timer */
77
78     pTimer->hwnd    = hwnd;
79     pTimer->msg     = sys ? WM_SYSTIMER : WM_TIMER;
80     pTimer->id      = id;
81     pTimer->timeout = timeout;
82     pTimer->proc    = proc;
83     pTimer->xtid    = XtAppAddTimeOut( XT_app_context, timeout,
84                                        TIMER_callback, pTimer );
85     return id;
86 }
87
88
89 /***********************************************************************
90  *           TIMER_KillTimer
91  */
92 BOOL TIMER_KillTimer( HWND hwnd, WORD id, BOOL sys )
93 {
94     int i;
95     TIMER * pTimer;
96     
97       /* Find the timer */
98     
99     for (i = 0, pTimer = TimersArray; i < NB_TIMERS; i++, pTimer++)
100         if ((pTimer->hwnd == hwnd) && (pTimer->id == id) &&
101             (pTimer->timeout != 0)) break;
102     if (i >= NB_TIMERS) return FALSE;
103     if (!sys && (i >= NB_TIMERS-NB_RESERVED_TIMERS)) return FALSE;
104     if (!sys && (pTimer->msg != WM_TIMER)) return FALSE;
105     else if (sys && (pTimer->msg != WM_SYSTIMER)) return FALSE;    
106
107       /* Delete the timer */
108
109     if (pTimer->xtid) XtRemoveTimeOut( pTimer->xtid );
110     pTimer->hwnd    = 0;
111     pTimer->msg     = 0;
112     pTimer->id      = 0;
113     pTimer->timeout = 0;
114     pTimer->proc    = 0;
115     pTimer->xtid    = 0;
116     return TRUE;
117 }
118
119
120 /***********************************************************************
121  *           SetTimer   (USER.10)
122  */
123 WORD SetTimer( HWND hwnd, WORD id, WORD timeout, FARPROC proc )
124 {
125 #ifdef DEBUG_TIMER    
126     printf( "SetTimer: %d %d %d %08x\n", hwnd, id, timeout, proc );
127 #endif
128     return TIMER_SetTimer( hwnd, id, timeout, proc, FALSE );
129 }
130
131
132 /***********************************************************************
133  *           SetSystemTimer   (USER.11)
134  */
135 WORD SetSystemTimer( HWND hwnd, WORD id, WORD timeout, FARPROC proc )
136 {
137 #ifdef DEBUG_TIMER    
138     printf( "SetSystemTimer: %d %d %d %08x\n", hwnd, id, timeout, proc );
139 #endif
140     return TIMER_SetTimer( hwnd, id, timeout, proc, TRUE );
141 }
142
143
144 /***********************************************************************
145  *           KillTimer   (USER.12)
146  */
147 BOOL KillTimer( HWND hwnd, WORD id )
148 {
149 #ifdef DEBUG_TIMER
150     printf( "KillTimer: %d %d\n", hwnd, id );
151 #endif
152     return TIMER_KillTimer( hwnd, id, FALSE );
153 }
154
155
156 /***********************************************************************
157  *           KillSystemTimer   (USER.182)
158  */
159 BOOL KillSystemTimer( HWND hwnd, WORD id )
160 {
161 #ifdef DEBUG_TIMER
162     printf( "KillSystemTimer: %d %d\n", hwnd, id );
163 #endif
164     return TIMER_KillTimer( hwnd, id, TRUE );
165 }