1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 2009 Carlos Garnacho <carlosg@gnome.org>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
20 #include <gdk/gdkwindow.h>
26 #include "gdkdevice-wintab.h"
28 static gboolean gdk_device_wintab_get_history (GdkDevice *device,
32 GdkTimeCoord ***events,
34 static void gdk_device_wintab_get_state (GdkDevice *device,
37 GdkModifierType *mask);
38 static void gdk_device_wintab_set_window_cursor (GdkDevice *device,
41 static void gdk_device_wintab_warp (GdkDevice *device,
45 static void gdk_device_wintab_query_state (GdkDevice *device,
47 GdkWindow **root_window,
48 GdkWindow **child_window,
53 GdkModifierType *mask);
54 static GdkGrabStatus gdk_device_wintab_grab (GdkDevice *device,
56 gboolean owner_events,
57 GdkEventMask event_mask,
58 GdkWindow *confine_to,
61 static void gdk_device_wintab_ungrab (GdkDevice *device,
63 static GdkWindow * gdk_device_wintab_window_at_position (GdkDevice *device,
66 GdkModifierType *mask,
67 gboolean get_toplevel);
68 static void gdk_device_wintab_select_window_events (GdkDevice *device,
70 GdkEventMask event_mask);
73 G_DEFINE_TYPE (GdkDeviceWintab, gdk_device_wintab, GDK_TYPE_DEVICE)
76 gdk_device_wintab_class_init (GdkDeviceWintabClass *klass)
78 GdkDeviceClass *device_class = GDK_DEVICE_CLASS (klass);
80 device_class->get_history = gdk_device_wintab_get_history;
81 device_class->get_state = gdk_device_wintab_get_state;
82 device_class->set_window_cursor = gdk_device_wintab_set_window_cursor;
83 device_class->warp = gdk_device_wintab_warp;
84 device_class->query_state = gdk_device_wintab_query_state;
85 device_class->grab = gdk_device_wintab_grab;
86 device_class->ungrab = gdk_device_wintab_ungrab;
87 device_class->window_at_position = gdk_device_wintab_window_at_position;
88 device_class->select_window_events = gdk_device_wintab_select_window_events;
92 gdk_device_wintab_init (GdkDeviceWintab *device_wintab)
96 device = GDK_DEVICE (device_wintab);
100 gdk_device_wintab_get_history (GdkDevice *device,
104 GdkTimeCoord ***events,
110 static GdkModifierType
111 get_current_mask (void)
113 GdkModifierType mask;
116 GetKeyboardState (kbd);
118 if (kbd[VK_SHIFT] & 0x80)
119 mask |= GDK_SHIFT_MASK;
120 if (kbd[VK_CAPITAL] & 0x80)
121 mask |= GDK_LOCK_MASK;
122 if (kbd[VK_CONTROL] & 0x80)
123 mask |= GDK_CONTROL_MASK;
124 if (kbd[VK_MENU] & 0x80)
125 mask |= GDK_MOD1_MASK;
126 if (kbd[VK_LBUTTON] & 0x80)
127 mask |= GDK_BUTTON1_MASK;
128 if (kbd[VK_MBUTTON] & 0x80)
129 mask |= GDK_BUTTON2_MASK;
130 if (kbd[VK_RBUTTON] & 0x80)
131 mask |= GDK_BUTTON3_MASK;
137 gdk_device_wintab_get_state (GdkDevice *device,
140 GdkModifierType *mask)
142 GdkDeviceWintab *device_wintab;
144 device_wintab = GDK_DEVICE_WINTAB (device);
146 /* For now just use the last known button and axis state of the device.
147 * Since graphical tablets send an insane amount of motion events each
148 * second, the info should be fairly up to date */
151 *mask = get_current_mask ();
152 *mask &= 0xFF; /* Mask away core pointer buttons */
153 *mask |= ((device_wintab->button_state << 8)
154 & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK
155 | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK
156 | GDK_BUTTON5_MASK));
159 if (axes && device_wintab->last_axis_data)
160 _gdk_device_wintab_translate_axes (device_wintab, window, axes, NULL, NULL);
164 gdk_device_wintab_set_window_cursor (GdkDevice *device,
171 gdk_device_wintab_warp (GdkDevice *device,
179 gdk_device_wintab_query_state (GdkDevice *device,
181 GdkWindow **root_window,
182 GdkWindow **child_window,
187 GdkModifierType *mask)
189 GdkDeviceWintab *device_wintab;
193 device_wintab = GDK_DEVICE_WINTAB (device);
195 hwnd = GDK_WINDOW_HWND (window);
196 GetCursorPos (&point);
204 ScreenToClient (hwnd, &point);
212 if (window == _gdk_root)
215 *win_x += _gdk_offset_x;
218 *win_y += _gdk_offset_y;
223 hwndc = ChildWindowFromPoint (hwnd, point);
225 if (hwndc && hwndc != hwnd)
226 *child_window = gdk_win32_handle_table_lookup (hwndc);
228 *child_window = NULL; /* Direct child unknown to gdk */
235 screen = gdk_window_get_screen (window);
236 *root_window = gdk_screen_get_root_window (screen);
241 *mask = get_current_mask ();
242 *mask &= 0xFF; /* Mask away core pointer buttons */
243 *mask |= ((device_wintab->button_state << 8)
244 & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK
245 | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK
246 | GDK_BUTTON5_MASK));
252 gdk_device_wintab_grab (GdkDevice *device,
254 gboolean owner_events,
255 GdkEventMask event_mask,
256 GdkWindow *confine_to,
260 return GDK_GRAB_SUCCESS;
264 gdk_device_wintab_ungrab (GdkDevice *device,
270 gdk_device_wintab_window_at_position (GdkDevice *device,
273 GdkModifierType *mask,
274 gboolean get_toplevel)
280 gdk_device_wintab_select_window_events (GdkDevice *device,
282 GdkEventMask event_mask)
287 _gdk_device_wintab_translate_axes (GdkDeviceWintab *device_wintab,
294 GdkWindow *impl_window;
296 gdouble temp_x, temp_y;
299 device = GDK_DEVICE (device_wintab);
300 impl_window = _gdk_window_get_impl_window (window);
303 gdk_window_get_origin (impl_window, &root_x, &root_y);
305 for (i = 0; i < gdk_device_get_n_axes (device); i++)
309 use = gdk_device_get_axis_use (device, i);
315 if (gdk_device_get_mode (device) == GDK_MODE_WINDOW)
316 _gdk_device_translate_window_coord (device, window, i,
317 device_wintab->last_axis_data[i],
320 _gdk_device_translate_screen_coord (device, window,
322 device_wintab->last_axis_data[i],
324 if (use == GDK_AXIS_X)
326 else if (use == GDK_AXIS_Y)
331 _gdk_device_translate_axis (device, i,
332 device_wintab->last_axis_data[i],