295
_gdk_input_window_find(GdkWindow *window)
299
for (tmp_list=_gdk_input_windows; tmp_list; tmp_list=tmp_list->next)
300
if (((GdkInputWindow *)(tmp_list->data))->window == window)
301
return (GdkInputWindow *)(tmp_list->data);
303
return NULL; /* Not found */
306
294
/* FIXME: this routine currently needs to be called between creation
307
295
and the corresponding configure event (because it doesn't get the
308
296
root_relative_geometry). This should work with
309
297
gtk_window_set_extension_events, but will likely fail in other
301
unset_extension_events (GdkWindow *window)
303
GdkWindowObject *window_private;
304
GdkWindowObject *impl_window;
307
window_private = (GdkWindowObject*) window;
308
impl_window = (GdkWindowObject *)_gdk_window_get_impl_window (window);
309
iw = impl_window->input_window;
311
if (window_private->extension_events != 0)
313
g_assert (iw != NULL);
314
g_assert (g_list_find (iw->windows, window) != NULL);
316
iw->windows = g_list_remove (iw->windows, window);
317
if (iw->windows == NULL)
319
impl_window->input_window = NULL;
320
_gdk_input_windows = g_list_remove(_gdk_input_windows,iw);
325
window_private->extension_events = 0;
329
gdk_input_get_root_relative_geometry (HWND w,
337
ClientToScreen (w, &pt);
340
*x_ret = pt.x + _gdk_offset_x;
342
*y_ret = pt.y + _gdk_offset_y;
313
346
gdk_input_set_extension_events (GdkWindow *window, gint mask,
314
347
GdkExtensionMode mode)
316
349
GdkWindowObject *window_private;
350
GdkWindowObject *impl_window;
318
351
GdkInputWindow *iw;
320
353
g_return_if_fail (window != NULL);
324
357
if (GDK_WINDOW_DESTROYED (window))
360
impl_window = (GdkWindowObject *)_gdk_window_get_impl_window (window);
362
if (mode == GDK_EXTENSION_EVENTS_ALL && mask != 0)
363
mask |= GDK_ALL_DEVICES_MASK;
327
365
if (mode == GDK_EXTENSION_EVENTS_NONE)
368
iw = impl_window->input_window;
332
372
_gdk_input_wintab_init_check ();
334
iw = g_new(GdkInputWindow,1);
339
iw->obscuring = NULL;
340
iw->num_obscuring = 0;
343
_gdk_input_windows = g_list_append(_gdk_input_windows,iw);
376
iw = g_new0 (GdkInputWindow,1);
378
iw->impl_window = (GdkWindow *)impl_window;
382
_gdk_input_windows = g_list_append(_gdk_input_windows, iw);
384
gdk_input_get_root_relative_geometry (GDK_WINDOW_HWND (window), &iw->root_x, &iw->root_y);
386
impl_window->input_window = iw;
389
if (window_private->extension_events == 0)
390
iw->windows = g_list_append (iw->windows, window);
344
391
window_private->extension_events = mask;
346
/* Add enter window events to the event mask */
347
if (g_list_length (_gdk_input_devices) > 1)
348
gdk_window_set_events (window,
349
gdk_window_get_events (window) |
350
GDK_ENTER_NOTIFY_MASK);
354
iw = _gdk_input_window_find (window);
357
_gdk_input_windows = g_list_remove(_gdk_input_windows,iw);
361
window_private->extension_events = 0;
364
for (tmp_list = _gdk_input_devices; tmp_list; tmp_list = tmp_list->next)
366
GdkDevicePrivate *gdkdev = tmp_list->data;
368
if (!GDK_IS_CORE (gdkdev))
370
if (mask != 0 && gdkdev->info.mode != GDK_MODE_DISABLED
371
&& (gdkdev->info.has_cursor || mode == GDK_EXTENSION_EVENTS_ALL))
372
_gdk_input_enable_window (window,gdkdev);
374
_gdk_input_disable_window (window,gdkdev);
395
unset_extension_events (window);
398
_gdk_input_select_events ((GdkWindow *)impl_window);
380
402
_gdk_input_window_destroy (GdkWindow *window)
382
GdkInputWindow *input_window;
384
input_window = _gdk_input_window_find (window);
385
g_return_if_fail (input_window != NULL);
387
_gdk_input_windows = g_list_remove (_gdk_input_windows,input_window);
388
g_free(input_window);
404
unset_extension_events (window);
408
_gdk_input_check_proximity (void)
411
gboolean new_proximity = FALSE;
413
if (!_gdk_input_inside_input_window)
415
_gdk_display->ignore_core_events = FALSE;
419
for (l = _gdk_input_devices; l != NULL; l = l->next)
421
GdkDevicePrivate *gdkdev = l->data;
423
if (gdkdev->info.mode != GDK_MODE_DISABLED &&
424
!GDK_IS_CORE (gdkdev))
426
if (_gdk_input_in_proximity)
428
new_proximity = TRUE;
434
_gdk_display->ignore_core_events = new_proximity;
397
#if 0 /* No idea what to do... */
398
443
GdkWindowObject *priv = (GdkWindowObject *)window;
399
444
GdkInputWindow *input_window;
400
445
gint root_x, root_y;
402
gdk_input_check_proximity(display);
447
_gdk_input_inside_input_window = TRUE;
404
449
input_window = priv->input_window;
405
450
if (input_window != NULL)
407
_gdk_input_get_root_relative_geometry (window, &root_x, &root_y);
452
gdk_input_get_root_relative_geometry (GDK_WINDOW_HWND (window),
408
454
input_window->root_x = root_x;
409
455
input_window->root_y = root_y;
414
_gdk_input_ignore_core = FALSE;
418
_gdk_input_exit (void)
421
GdkDevicePrivate *gdkdev;
423
for (tmp_list = _gdk_input_devices; tmp_list; tmp_list = tmp_list->next)
425
gdkdev = (GdkDevicePrivate *)(tmp_list->data);
426
if (!GDK_IS_CORE (gdkdev))
428
gdk_device_set_mode (&gdkdev->info, GDK_MODE_DISABLED);
430
g_free(gdkdev->info.name);
431
g_free(gdkdev->axes);
432
g_free(gdkdev->info.axes);
433
g_free(gdkdev->info.keys);
460
_gdk_input_inside_input_window = FALSE;
438
g_list_free(_gdk_input_devices);
440
for (tmp_list = _gdk_input_windows; tmp_list; tmp_list = tmp_list->next)
441
g_free(tmp_list->data);
443
g_list_free(_gdk_input_windows);
463
_gdk_input_check_proximity ();
484
503
if (device->mode == mode)
487
old_mode = device->mode;
488
506
device->mode = mode;
490
508
if (mode == GDK_MODE_WINDOW)
492
device->has_cursor = FALSE;
493
for (tmp_list = _gdk_input_windows; tmp_list; tmp_list = tmp_list->next)
495
input_window = (GdkInputWindow *)tmp_list->data;
496
if (input_window->mode != GDK_EXTENSION_EVENTS_CURSOR)
497
_gdk_input_enable_window (input_window->window, gdkdev);
499
if (old_mode != GDK_MODE_DISABLED)
500
_gdk_input_disable_window (input_window->window, gdkdev);
509
device->has_cursor = FALSE;
503
510
else if (mode == GDK_MODE_SCREEN)
505
device->has_cursor = TRUE;
506
for (tmp_list = _gdk_input_windows; tmp_list; tmp_list = tmp_list->next)
507
_gdk_input_enable_window (((GdkInputWindow *)tmp_list->data)->window,
510
else /* mode == GDK_MODE_DISABLED */
512
for (tmp_list = _gdk_input_windows; tmp_list; tmp_list = tmp_list->next)
514
input_window = (GdkInputWindow *)tmp_list->data;
515
if (old_mode != GDK_MODE_WINDOW ||
516
input_window->mode != GDK_EXTENSION_EVENTS_CURSOR)
517
_gdk_input_disable_window (input_window->window, gdkdev);
511
device->has_cursor = TRUE;
513
for (tmp_list = _gdk_input_windows; tmp_list; tmp_list = tmp_list->next)
515
input_window = (GdkInputWindow *)tmp_list->data;
516
_gdk_input_select_events (input_window->impl_window);
519
if (!GDK_IS_CORE (gdkdev))
520
_gdk_input_update_for_device_mode (gdkdev);