?? gdkinput-win32.c
字號:
g_print ("...wants ordinary event, ignoring this\n")); return FALSE; } pt.x = x; pt.y = y; ClientToScreen (GDK_WINDOW_HWND (window), &pt); g_object_unref (window); window = (GdkWindow *) obj->parent; obj = GDK_WINDOW_OBJECT (window); g_object_ref (window); ScreenToClient (GDK_WINDOW_HWND (window), &pt); x = pt.x; y = pt.y; GDK_NOTE (EVENTS_OR_INPUT, g_print ("...propagating to %p (%d,%d)\n", GDK_WINDOW_HWND (window), x, y)); goto dijkstra; } input_window = _gdk_input_window_find (window); g_assert (input_window != NULL); if (gdkdev->info.mode == GDK_MODE_WINDOW && input_window->mode == GDK_EXTENSION_EVENTS_CURSOR) return FALSE; event->any.window = window; key_state = get_modifier_key_state (); if (event->any.type == GDK_BUTTON_PRESS || event->any.type == GDK_BUTTON_RELEASE) { event->button.time = _gdk_win32_get_next_tick (msg->time); event->button.device = &gdkdev->info; event->button.axes = g_new(gdouble, gdkdev->info.num_axes); gdk_input_translate_coordinates (gdkdev, input_window, gdkdev->last_axis_data, event->button.axes, &event->button.x, &event->button.y); /* Also calculate root coordinates. Note that input_window->root_x is in GDK root coordinates. */ event->button.x_root = event->button.x + input_window->root_x; event->button.y_root = event->button.y + input_window->root_y; event->button.state = ((gdkdev->button_state << 8) & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK | GDK_BUTTON5_MASK)) | key_state; GDK_NOTE (EVENTS_OR_INPUT, g_print ("WINTAB button %s:%d %g,%g\n", (event->button.type == GDK_BUTTON_PRESS ? "press" : "release"), event->button.button, event->button.x, event->button.y)); } else { event->motion.time = _gdk_win32_get_next_tick (msg->time); event->motion.is_hint = FALSE; event->motion.device = &gdkdev->info; event->motion.axes = g_new(gdouble, gdkdev->info.num_axes); gdk_input_translate_coordinates (gdkdev, input_window, gdkdev->last_axis_data, event->motion.axes, &event->motion.x, &event->motion.y); /* Also calculate root coordinates. Note that input_window->root_x is in GDK root coordinates. */ event->motion.x_root = event->motion.x + input_window->root_x; event->motion.y_root = event->motion.y + input_window->root_y; event->motion.state = ((gdkdev->button_state << 8) & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK | GDK_BUTTON5_MASK)) | key_state; GDK_NOTE (EVENTS_OR_INPUT, g_print ("WINTAB motion: %g,%g\n", event->motion.x, event->motion.y)); /* Check for missing release or press events for the normal * pressure button. At least on my ArtPadII I sometimes miss a * release event? */ if ((gdkdev->pktdata & PK_NORMAL_PRESSURE && (event->motion.state & GDK_BUTTON1_MASK) && packet.pkNormalPressure <= MAX (0, (gint) gdkdev->npbtnmarks[0] - 2)) || (gdkdev->pktdata & PK_NORMAL_PRESSURE && !(event->motion.state & GDK_BUTTON1_MASK) && packet.pkNormalPressure > gdkdev->npbtnmarks[1] + 2)) { GdkEvent *event2 = gdk_event_copy (event); if (event->motion.state & GDK_BUTTON1_MASK) { event2->button.type = GDK_BUTTON_RELEASE; gdkdev->button_state &= ~1; } else { event2->button.type = GDK_BUTTON_PRESS; gdkdev->button_state |= 1; } event2->button.state = ((gdkdev->button_state << 8) & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK | GDK_BUTTON5_MASK)) | key_state; event2->button.button = 1; GDK_NOTE (EVENTS_OR_INPUT, g_print ("WINTAB synthesized button %s: %d %g,%gg\n", (event2->button.type == GDK_BUTTON_PRESS ? "press" : "release"), event2->button.button, event2->button.x, event2->button.y)); _gdk_event_queue_append (display, event2); } } return TRUE; case WT_PROXIMITY: if (LOWORD (msg->lParam) == 0) { event->proximity.type = GDK_PROXIMITY_OUT; set_ignore_core (FALSE); } else { event->proximity.type = GDK_PROXIMITY_IN; set_ignore_core (TRUE); } event->proximity.time = _gdk_win32_get_next_tick (msg->time); event->proximity.device = &gdkdev->info; GDK_NOTE (EVENTS_OR_INPUT, g_print ("WINTAB proximity %s\n", (event->proximity.type == GDK_PROXIMITY_IN ? "in" : "out"))); return TRUE; }#endif return FALSE;}gboolean_gdk_input_enable_window (GdkWindow *window, GdkDevicePrivate *gdkdev){#ifdef HAVE_SOME_XINPUT GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl); impl->extension_events_selected = TRUE;#endif return TRUE;}gboolean_gdk_input_disable_window (GdkWindow *window, GdkDevicePrivate *gdkdev){#ifdef HAVE_SOME_XINPUT GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl); impl->extension_events_selected = FALSE;#endif return TRUE;}gint_gdk_input_grab_pointer (GdkWindow *window, gint owner_events, GdkEventMask event_mask, GdkWindow *confine_to, guint32 time){#ifdef HAVE_SOME_XINPUT GdkInputWindow *input_window, *new_window; gboolean need_ungrab; GdkDevicePrivate *gdkdev; GList *tmp_list; tmp_list = _gdk_input_windows; new_window = NULL; need_ungrab = FALSE; GDK_NOTE (INPUT, g_print ("gdk_input_win32_grab_pointer: %p %d %p\n", GDK_WINDOW_HWND (window), owner_events, (confine_to ? GDK_WINDOW_HWND (confine_to) : 0))); while (tmp_list) { input_window = (GdkInputWindow *)tmp_list->data; if (input_window->window == window) new_window = input_window; else if (input_window->grabbed) { input_window->grabbed = FALSE; need_ungrab = TRUE; } tmp_list = tmp_list->next; } if (new_window) { new_window->grabbed = TRUE; x_grab_window = window; x_grab_mask = event_mask; x_grab_owner_events = owner_events; /* FIXME: Do we need to handle confine_to and time? */ tmp_list = _gdk_input_devices; while (tmp_list) { gdkdev = (GdkDevicePrivate *)tmp_list->data; if (!GDK_IS_CORE (gdkdev) && gdkdev->hctx) {#if 0 /* XXX */ gdk_input_common_find_events (window, gdkdev, event_mask, event_classes, &num_classes); result = XGrabDevice( GDK_DISPLAY(), gdkdev->xdevice, GDK_WINDOW_XWINDOW (window), owner_events, num_classes, event_classes, GrabModeAsync, GrabModeAsync, time); /* FIXME: if failure occurs on something other than the first device, things will be badly inconsistent */ if (result != Success) return result;#endif } tmp_list = tmp_list->next; } } else { x_grab_window = NULL; tmp_list = _gdk_input_devices; while (tmp_list) { gdkdev = (GdkDevicePrivate *)tmp_list->data; if (!GDK_IS_CORE (gdkdev) && gdkdev->hctx && ((gdkdev->button_state != 0) || need_ungrab)) {#if 0 /* XXX */ XUngrabDevice (gdk_display, gdkdev->xdevice, time);#endif gdkdev->button_state = 0; } tmp_list = tmp_list->next; } }#endif return GDK_GRAB_SUCCESS;}void _gdk_input_ungrab_pointer (guint32 time){#ifdef HAVE_SOME_XINPUT GdkInputWindow *input_window; GdkDevicePrivate *gdkdev; GList *tmp_list; GDK_NOTE (INPUT, g_print ("gdk_input_win32_ungrab_pointer\n")); tmp_list = _gdk_input_windows; while (tmp_list) { input_window = (GdkInputWindow *)tmp_list->data; if (input_window->grabbed) break; tmp_list = tmp_list->next; } if (tmp_list) /* we found a grabbed window */ { input_window->grabbed = FALSE; tmp_list = _gdk_input_devices; while (tmp_list) { gdkdev = (GdkDevicePrivate *)tmp_list->data;#if 0 /* XXX */ if (!GDK_IS_CORE (gdkdev) && gdkdev->xdevice) XUngrabDevice (gdk_display, gdkdev->xdevice, time);#endif tmp_list = tmp_list->next; } } x_grab_window = NULL;#endif}gboolean_gdk_device_get_history (GdkDevice *device, GdkWindow *window, guint32 start, guint32 stop, GdkTimeCoord ***events, gint *n_events){ return FALSE;}void gdk_device_get_state (GdkDevice *device, GdkWindow *window, gdouble *axes, GdkModifierType *mask){ g_return_if_fail (device != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); if (GDK_IS_CORE (device)) { gint x_int, y_int; gdk_window_get_pointer (window, &x_int, &y_int, mask); if (axes) { axes[0] = x_int; axes[1] = y_int; } } else { GdkDevicePrivate *gdkdev; GdkInputWindow *input_window; gdkdev = (GdkDevicePrivate *)device; /* For now just use the last known button and axis state of the device. * Since graphical tablets send an insane amount of motion events each * second, the info should be fairly up to date */ if (mask) { gdk_window_get_pointer (window, NULL, NULL, mask); *mask &= 0xFF; /* Mask away core pointer buttons */ *mask |= ((gdkdev->button_state << 8) & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK | GDK_BUTTON5_MASK)); } input_window = _gdk_input_window_find (window); g_return_if_fail (input_window != NULL); /* For some reason, input_window is sometimes NULL when I use The GIMP 2 * (bug #141543?). Avoid crashing if debugging is disabled. */ if (axes && gdkdev->last_axis_data && input_window) gdk_input_translate_coordinates (gdkdev, input_window, gdkdev->last_axis_data, axes, NULL, NULL); }}#ifdef HAVE_WINTABvoid_gdk_input_set_tablet_active (void){ GList *tmp_list; HCTX *hctx; /* Bring the contexts to the top of the overlap order when one of the * application's windows is activated */ if (!wintab_contexts) return; /* No tablet devices found, or Wintab not initialized yet */ GDK_NOTE (INPUT, g_print ("_gdk_input_set_tablet_active: " "Bringing Wintab contexts to the top of the overlap order\n")); tmp_list = wintab_contexts; while (tmp_list) { hctx = (HCTX *) (tmp_list->data); WTOverlap (*hctx, TRUE); tmp_list = tmp_list->next; }}#endif /* HAVE_WINTAB */void _gdk_input_init (GdkDisplay *display){ _gdk_input_ignore_core = FALSE; _gdk_input_devices = NULL; _gdk_init_input_core (display);#ifdef HAVE_WINTAB#ifdef WINTAB_NO_LAZY_INIT /* Normally, Wintab is only initialized when the application performs * an action that requires it, such as enabling extended input events * for a window or enumerating the devices. */ _gdk_input_wintab_init_check ();#endif /* WINTAB_NO_LAZY_INIT */#endif /* HAVE_WINTAB */ _gdk_input_devices = g_list_append (_gdk_input_devices, display->core_pointer);}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -