Mercurial > pidgin
annotate src/win32/IdleTracker/idletrack.c @ 9608:204f5d66a863
[gaim-migrate @ 10451]
" I added two possible commands to gtk-remote: away and back.
away causes the away dialog to appear with the default
message and sets the status to away, back hides the
dialog and sets the status to online.
To implement this, I added to new CUI packet subtypes:
CUI_USER_AWAY and CUI_USER_BACK. This are processed in
core.c by calling do_away_message and do_im_back,
respectively." --Istv?n V?radi
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Wed, 28 Jul 2004 00:29:52 +0000 |
parents | 72013e9ba6d1 |
children | 0e3a84f18467 |
rev | line source |
---|---|
4533
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
1 /* |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
2 * idletrack.c |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
3 * |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
4 * Authors: mrgentry @ http://www.experts-exchange.com |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
5 * Herman Bloggs <hermanator12002@yahoo.com> |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
6 * Date: February, 2003 |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
7 * Description: Track user inactivity. |
9417 | 8 * |
9 * Andrew Whewell <awhewell@users.sourceforge.net> - 25th June 2004. Added | |
10 * support for GetLastInputInfo under Windows 2000 and above. This avoids having | |
11 * IDLETRACK.DLL hook itself into every process on the machine, which makes | |
12 * upgrades easier. The hook mechanism is also used by key loggers, so not | |
13 * using hooks doesn't put the willys up programs that keep an eye out for | |
14 * loggers. | |
15 * | |
9419 | 16 * Windows 9x doesn't have GetLastInputInfo - when Gaim runs on these machines |
9417 | 17 * the code silently falls back onto the old hooking scheme. |
4533
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
18 */ |
9417 | 19 #define _WIN32_WINNT 0x0500 |
4533
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
20 #include <windows.h> |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
21 |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
22 #define EXPORT __declspec(dllexport) |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
23 |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
24 static HANDLE hMapObject = NULL; |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
25 static DWORD *lastTime = NULL; |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
26 static HHOOK keyHook = NULL; |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
27 static HHOOK mouseHook = NULL; |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
28 static HINSTANCE g_hInstance = NULL; |
4548
ae85f27e4948
[gaim-migrate @ 4827]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4533
diff
changeset
|
29 static POINT g_point; |
4533
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
30 |
9418 | 31 /* GetLastInputInfo address and module - if g_GetLastInputInfo == NULL then |
32 * we fall back on the old "hook the world" method. GetLastInputInfo was brought | |
33 * in with Windows 2000 so Windows 9x will still hook everything. | |
34 */ | |
9417 | 35 typedef BOOL (WINAPI *GETLASTINPUTINFO)(LASTINPUTINFO *); |
36 static HMODULE g_user32 = NULL; | |
37 static GETLASTINPUTINFO g_GetLastInputInfo = NULL; | |
38 | |
4533
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
39 static DWORD* setup_shared_mem() { |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
40 BOOL fInit; |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
41 |
9418 | 42 /* Set up the shared memory. */ |
43 /*hMapObject = CreateFileMapping((HANDLE) 0xFFFFFFFF, //use paging file | |
4533
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
44 NULL, // no security attributes |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
45 PAGE_READWRITE, // read/write access |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
46 0, // size: high 32-bits |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
47 sizeof(DWORD), // size: low 32-bits |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
48 "timermem"); // name of map object |
9418 | 49 */ |
50 hMapObject = CreateFileMapping((HANDLE) 0xFFFFFFFF, | |
51 NULL, | |
52 PAGE_READWRITE, | |
53 0, | |
54 sizeof(DWORD), | |
55 "timermem"); | |
56 | |
4533
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
57 if (hMapObject == NULL) |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
58 return NULL; |
9418 | 59 |
60 /* The first process to attach initializes memory. */ | |
4533
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
61 fInit = (GetLastError() != ERROR_ALREADY_EXISTS); |
9418 | 62 |
63 /* Get a pointer to the file-mapped shared memory. */ | |
64 /*lastTime = (DWORD*) MapViewOfFile(hMapObject, // object to map view of | |
65 * FILE_MAP_WRITE, // read/write access | |
66 * 0, // high offset: map from | |
67 * 0, // low offset: beginning | |
68 * 0); // default: map entire file | |
69 */ | |
70 lastTime = (DWORD*) MapViewOfFile(hMapObject, | |
71 FILE_MAP_WRITE, | |
72 0, | |
73 0, | |
74 0); | |
75 | |
4533
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
76 if (lastTime == NULL) |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
77 return NULL; |
9418 | 78 |
4533
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
79 *lastTime = GetTickCount(); |
9418 | 80 |
4533
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
81 return lastTime; |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
82 } |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
83 |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
84 |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
85 LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) { |
6561
33ceba0dfd9b
[gaim-migrate @ 7083]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5336
diff
changeset
|
86 if (!(code < 0)) { |
33ceba0dfd9b
[gaim-migrate @ 7083]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5336
diff
changeset
|
87 if (lastTime == NULL) |
33ceba0dfd9b
[gaim-migrate @ 7083]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5336
diff
changeset
|
88 lastTime = setup_shared_mem(); |
9418 | 89 |
6561
33ceba0dfd9b
[gaim-migrate @ 7083]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5336
diff
changeset
|
90 if (lastTime) |
33ceba0dfd9b
[gaim-migrate @ 7083]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5336
diff
changeset
|
91 *lastTime = GetTickCount(); |
33ceba0dfd9b
[gaim-migrate @ 7083]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5336
diff
changeset
|
92 } |
5336
5480a73b2696
[gaim-migrate @ 5712]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4548
diff
changeset
|
93 return CallNextHookEx(keyHook, code, wParam, lParam); |
4533
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
94 } |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
95 |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
96 |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
97 LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam) { |
4548
ae85f27e4948
[gaim-migrate @ 4827]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4533
diff
changeset
|
98 /* We need to verify that the Mouse pointer has actually moved. */ |
6561
33ceba0dfd9b
[gaim-migrate @ 7083]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5336
diff
changeset
|
99 if(!(code < 0) && |
33ceba0dfd9b
[gaim-migrate @ 7083]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5336
diff
changeset
|
100 !((g_point.x == ((MOUSEHOOKSTRUCT*)lParam)->pt.x) && |
33ceba0dfd9b
[gaim-migrate @ 7083]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5336
diff
changeset
|
101 (g_point.y == ((MOUSEHOOKSTRUCT*)lParam)->pt.y))) { |
33ceba0dfd9b
[gaim-migrate @ 7083]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5336
diff
changeset
|
102 g_point.x = ((MOUSEHOOKSTRUCT*)lParam)->pt.x; |
33ceba0dfd9b
[gaim-migrate @ 7083]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5336
diff
changeset
|
103 g_point.y = ((MOUSEHOOKSTRUCT*)lParam)->pt.y; |
9418 | 104 |
6561
33ceba0dfd9b
[gaim-migrate @ 7083]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5336
diff
changeset
|
105 if (lastTime == NULL) |
33ceba0dfd9b
[gaim-migrate @ 7083]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5336
diff
changeset
|
106 lastTime = setup_shared_mem(); |
9418 | 107 |
6561
33ceba0dfd9b
[gaim-migrate @ 7083]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5336
diff
changeset
|
108 if (lastTime) |
33ceba0dfd9b
[gaim-migrate @ 7083]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5336
diff
changeset
|
109 *lastTime = GetTickCount(); |
33ceba0dfd9b
[gaim-migrate @ 7083]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5336
diff
changeset
|
110 } |
5336
5480a73b2696
[gaim-migrate @ 5712]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4548
diff
changeset
|
111 return CallNextHookEx(mouseHook, code, wParam, lParam); |
4533
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
112 } |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
113 |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
114 |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
115 EXPORT DWORD wgaim_get_lastactive() { |
9417 | 116 DWORD result = 0; |
9418 | 117 |
118 /* If we have GetLastInputInfo then use it, otherwise use the hooks*/ | |
9417 | 119 if (g_GetLastInputInfo != NULL) { |
120 LASTINPUTINFO lii; | |
121 memset(&lii, 0, sizeof(lii)); | |
122 lii.cbSize = sizeof(lii); | |
123 if (g_GetLastInputInfo(&lii)) { | |
124 result = lii.dwTime; | |
125 } | |
126 } else { | |
127 if (lastTime == NULL) | |
128 lastTime = setup_shared_mem(); | |
9418 | 129 |
9417 | 130 if (lastTime) |
131 result = *lastTime; | |
132 } | |
9418 | 133 |
9417 | 134 return result; |
4533
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
135 } |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
136 |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
137 |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
138 EXPORT BOOL wgaim_set_idlehooks() { |
9418 | 139 /* Is GetLastInputInfo available?*/ |
9417 | 140 g_user32 = LoadLibrary("user32.dll"); |
141 if (g_user32) { | |
142 g_GetLastInputInfo = (GETLASTINPUTINFO)GetProcAddress(g_user32, "GetLastInputInfo"); | |
143 } | |
144 | |
9418 | 145 /* If we couldn't find GetLastInputInfo then fall back onto the hooking scheme*/ |
9417 | 146 if (g_GetLastInputInfo == NULL) { |
9418 | 147 /* Set up the shared memory.*/ |
9417 | 148 lastTime = setup_shared_mem(); |
149 if (lastTime == NULL) | |
150 return FALSE; | |
151 *lastTime = GetTickCount(); | |
9418 | 152 |
153 /* Set up the keyboard hook.*/ | |
9417 | 154 keyHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_hInstance, 0); |
155 if (keyHook == NULL) { | |
156 UnmapViewOfFile(lastTime); | |
157 CloseHandle(hMapObject); | |
158 return FALSE; | |
159 } | |
9418 | 160 |
161 /* Set up the mouse hook.*/ | |
9417 | 162 mouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, g_hInstance, 0); |
163 if (mouseHook == NULL) { | |
164 UnhookWindowsHookEx(keyHook); | |
165 UnmapViewOfFile(lastTime); | |
166 CloseHandle(hMapObject); | |
167 return FALSE; | |
168 } | |
4533
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
169 } |
9418 | 170 |
4533
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
171 return TRUE; |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
172 } |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
173 |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
174 |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
175 EXPORT void wgaim_remove_idlehooks() { |
9417 | 176 if (g_user32 != NULL) |
177 FreeLibrary(g_user32); | |
4533
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
178 if (keyHook) |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
179 UnhookWindowsHookEx(keyHook); |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
180 if (mouseHook) |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
181 UnhookWindowsHookEx(mouseHook); |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
182 if (lastTime) |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
183 UnmapViewOfFile(lastTime); |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
184 if (hMapObject) |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
185 CloseHandle(hMapObject); |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
186 } |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
187 |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
188 int WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
189 switch(dwReason) { |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
190 case DLL_PROCESS_ATTACH: |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
191 g_hInstance = hInstance; |
4548
ae85f27e4948
[gaim-migrate @ 4827]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4533
diff
changeset
|
192 g_point.x = 0; |
ae85f27e4948
[gaim-migrate @ 4827]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4533
diff
changeset
|
193 g_point.y = 0; |
4533
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
194 break; |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
195 case DLL_PROCESS_DETACH: |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
196 break; |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
197 } |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
198 return TRUE; |
516061abad03
[gaim-migrate @ 4812]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
diff
changeset
|
199 } |