| 219 } |
223 } |
| 220 |
224 |
| 221 return win_hwnd; |
225 return win_hwnd; |
| 222 } |
226 } |
| 223 |
227 |
| |
228 static int |
| |
229 halt_flash_filter(GtkWidget *widget, GdkEventFocus *event, gpointer data) { |
| |
230 if(MyFlashWindowEx) { |
| |
231 HWND hWnd = data; |
| |
232 FLASHWINFO info; |
| |
233 |
| |
234 if(!IsWindow(hWnd)) |
| |
235 return 0; |
| |
236 |
| |
237 memset(&info, 0, sizeof(FLASHWINFO)); |
| |
238 info.cbSize = sizeof(FLASHWINFO); |
| |
239 info.hwnd = hWnd; |
| |
240 info.dwFlags = FLASHW_STOP; |
| |
241 info.dwTimeout = 0; |
| |
242 MyFlashWindowEx(&info); |
| |
243 } |
| |
244 return 0; |
| |
245 } |
| |
246 |
| |
247 void |
| |
248 gtkwgaim_conv_blink(GaimConversation *conv, GaimMessageFlags flags) { |
| |
249 GaimGtkWindow *win; |
| |
250 GtkWidget *window; |
| |
251 |
| |
252 /* Don't flash for our own messages or system messages */ |
| |
253 if(flags & GAIM_MESSAGE_SEND || flags & GAIM_MESSAGE_SYSTEM) |
| |
254 return; |
| |
255 |
| |
256 if(conv == NULL) { |
| |
257 gaim_debug_info("gtkwgaim", "No conversation found to blink.\n"); |
| |
258 return; |
| |
259 } |
| |
260 |
| |
261 win = gaim_gtkconv_get_window(GAIM_GTK_CONVERSATION(conv)); |
| |
262 if(win == NULL) { |
| |
263 gaim_debug_info("gtkwgaim", "No conversation windows found to blink.\n"); |
| |
264 return; |
| |
265 } |
| |
266 |
| |
267 window = win->window; |
| |
268 |
| |
269 if(MyFlashWindowEx) { |
| |
270 FLASHWINFO info; |
| |
271 /* Don't flash if we have the window focused */ |
| |
272 if(GetForegroundWindow() == GDK_WINDOW_HWND(window->window)) |
| |
273 return; |
| |
274 |
| |
275 memset(&info, 0, sizeof(FLASHWINFO)); |
| |
276 info.cbSize = sizeof(FLASHWINFO); |
| |
277 info.hwnd = GDK_WINDOW_HWND(window->window); |
| |
278 info.dwFlags = FLASHW_ALL | FLASHW_TIMER; |
| |
279 info.dwTimeout = 0; |
| |
280 MyFlashWindowEx(&info); |
| |
281 /* Stop flashing when window receives focus */ |
| |
282 g_signal_connect(G_OBJECT(window), "focus-in-event", |
| |
283 G_CALLBACK(halt_flash_filter), info.hwnd); |
| |
284 } |
| |
285 } |
| |
286 |
| |
287 static gboolean |
| |
288 gtkwgaim_conv_im_blink(GaimAccount *account, const char *who, char **message, |
| |
289 GaimConversation *conv, GaimMessageFlags flags, void *data) |
| |
290 { |
| |
291 gtkwgaim_conv_blink(conv, flags); |
| |
292 return FALSE; |
| |
293 } |
| 224 |
294 |
| 225 void gtkwgaim_init(HINSTANCE hint) { |
295 void gtkwgaim_init(HINSTANCE hint) { |
| |
296 |
| 226 gaim_debug_info("gtkwgaim", "gtkwgaim_init start\n"); |
297 gaim_debug_info("gtkwgaim", "gtkwgaim_init start\n"); |
| 227 |
298 |
| 228 gaimexe_hInstance = hint; |
299 gaimexe_hInstance = hint; |
| 229 |
300 |
| 230 /* IdleTracker Initialization */ |
301 /* IdleTracker Initialization */ |
| 231 if(!wgaim_set_idlehooks()) |
302 if(!wgaim_set_idlehooks()) |
| 232 gaim_debug_error("gtkwgaim", "Failed to initialize idle tracker\n"); |
303 gaim_debug_error("gtkwgaim", "Failed to initialize idle tracker\n"); |
| 233 |
304 |
| 234 wgaim_gtkspell_init(); |
305 wgaim_gtkspell_init(); |
| 235 gaim_debug_info("gtkwgaim", "GTK+ :%u.%u.%u\n", |
306 gaim_debug_info("gtkwgaim", "GTK+ :%u.%u.%u\n", |
| 236 gtk_major_version, gtk_minor_version, gtk_micro_version); |
307 gtk_major_version, gtk_minor_version, gtk_micro_version); |
| 237 |
308 |
| 238 messagewin_hwnd = wgaim_message_window_init(); |
309 messagewin_hwnd = wgaim_message_window_init(); |
| 239 |
310 |
| |
311 MyFlashWindowEx = (LPFNFLASHWINDOWEX) wgaim_find_and_loadproc("user32.dll", "FlashWindowEx"); |
| |
312 |
| 240 gaim_debug_info("gtkwgaim", "gtkwgaim_init end\n"); |
313 gaim_debug_info("gtkwgaim", "gtkwgaim_init end\n"); |
| |
314 } |
| |
315 |
| |
316 void gtkwgaim_post_init(void) { |
| |
317 |
| |
318 gaim_signal_connect(gaim_gtk_conversations_get_handle(), |
| |
319 "displaying-im-msg", >kwin32_handle, GAIM_CALLBACK(gtkwgaim_conv_im_blink), |
| |
320 NULL); |
| |
321 |
| 241 } |
322 } |
| 242 |
323 |
| 243 /* Windows Cleanup */ |
324 /* Windows Cleanup */ |
| 244 |
325 |
| 245 void gtkwgaim_cleanup(void) { |
326 void gtkwgaim_cleanup(void) { |