40 #include "d:\development\wtkit\include\wintab.h"
41 #define PACKETDATA (PK_CONTEXT | PK_CURSOR | PK_BUTTONS | PK_X | PK_Y | PK_NORMAL_PRESSURE | PK_ORIENTATION)
42 #define PACKETMODE (PK_BUTTONS)
43 #include "d:\development\wtkit\include\pktdef.h"
48 struct _GdkDevicePrivate {
77 AXIS orientation_axes[2];
82 #define G_PI 3.14159265358979323846
89 #define USE_SYSCONTEXT 1
94 #define DEBUG_WINTAB 1
97 #define TWOPI (2.*G_PI)
119 static void gdk_input_win32_get_pointer(
GdkWindow * window,
132 static void gdk_input_win32_ungrab_pointer(
guint32 time);
137 static gint gdk_input_win32_other_event(
GdkEvent * event, MSG * xevent);
138 static gint gdk_input_win32_enable_window(
GdkWindow * window,
140 static gint gdk_input_win32_disable_window(
GdkWindow * window,
183 static void print_lc(LOGCONTEXT * lc)
185 g_print(
"lcName = %s\n", lc->lcName);
187 if (lc->lcOptions & CXO_SYSTEM)
189 if (lc->lcOptions & CXO_PEN)
191 if (lc->lcOptions & CXO_MESSAGES)
193 if (lc->lcOptions & CXO_MARGIN)
195 if (lc->lcOptions & CXO_MGNINSIDE)
197 if (lc->lcOptions & CXO_CSRMESSAGES)
199 if (lc->lcOptions & CXO_CSRMESSAGES)
203 if (lc->lcStatus & CXS_DISABLED)
205 if (lc->lcStatus & CXS_OBSCURED)
207 if (lc->lcStatus & CXS_ONTOP)
211 if (lc->lcLocks & CXL_INSIZE)
213 if (lc->lcLocks & CXL_INASPECT)
215 if (lc->lcLocks & CXL_SENSITIVITY)
217 if (lc->lcLocks & CXL_MARGIN)
220 g_print(
"lcMsgBase = %#x, lcDevice = %#x, lcPktRate = %d\n",
221 lc->lcMsgBase, lc->lcDevice, lc->lcPktRate);
223 if (lc->lcPktData & PK_CONTEXT)
225 if (lc->lcPktData & PK_STATUS)
227 if (lc->lcPktData & PK_TIME)
229 if (lc->lcPktData & PK_CHANGED)
231 if (lc->lcPktData & PK_SERIAL_NUMBER)
233 if (lc->lcPktData & PK_CURSOR)
235 if (lc->lcPktData & PK_BUTTONS)
237 if (lc->lcPktData & PK_X)
239 if (lc->lcPktData & PK_Y)
241 if (lc->lcPktData & PK_Z)
243 if (lc->lcPktData & PK_NORMAL_PRESSURE)
244 g_print(
" PK_NORMAL_PRESSURE");
245 if (lc->lcPktData & PK_TANGENT_PRESSURE)
246 g_print(
" PK_TANGENT_PRESSURE");
247 if (lc->lcPktData & PK_ORIENTATION)
249 if (lc->lcPktData & PK_ROTATION)
253 if (lc->lcPktMode & PK_CONTEXT)
255 if (lc->lcPktMode & PK_STATUS)
257 if (lc->lcPktMode & PK_TIME)
259 if (lc->lcPktMode & PK_CHANGED)
261 if (lc->lcPktMode & PK_SERIAL_NUMBER)
263 if (lc->lcPktMode & PK_CURSOR)
265 if (lc->lcPktMode & PK_BUTTONS)
267 if (lc->lcPktMode & PK_X)
269 if (lc->lcPktMode & PK_Y)
271 if (lc->lcPktMode & PK_Z)
273 if (lc->lcPktMode & PK_NORMAL_PRESSURE)
274 g_print(
" PK_NORMAL_PRESSURE");
275 if (lc->lcPktMode & PK_TANGENT_PRESSURE)
276 g_print(
" PK_TANGENT_PRESSURE");
277 if (lc->lcPktMode & PK_ORIENTATION)
279 if (lc->lcPktMode & PK_ROTATION)
283 if (lc->lcMoveMask & PK_CONTEXT)
285 if (lc->lcMoveMask & PK_STATUS)
287 if (lc->lcMoveMask & PK_TIME)
289 if (lc->lcMoveMask & PK_CHANGED)
291 if (lc->lcMoveMask & PK_SERIAL_NUMBER)
293 if (lc->lcMoveMask & PK_CURSOR)
295 if (lc->lcMoveMask & PK_BUTTONS)
297 if (lc->lcMoveMask & PK_X)
299 if (lc->lcMoveMask & PK_Y)
301 if (lc->lcMoveMask & PK_Z)
303 if (lc->lcMoveMask & PK_NORMAL_PRESSURE)
304 g_print(
" PK_NORMAL_PRESSURE");
305 if (lc->lcMoveMask & PK_TANGENT_PRESSURE)
306 g_print(
" PK_TANGENT_PRESSURE");
307 if (lc->lcMoveMask & PK_ORIENTATION)
309 if (lc->lcMoveMask & PK_ROTATION)
312 g_print(
"lcBtnDnMask = %#x, lcBtnUpMask = %#x\n",
313 lc->lcBtnDnMask, lc->lcBtnUpMask);
314 g_print(
"lcInOrgX = %d, lcInOrgY = %d, lcInOrgZ = %d\n",
315 lc->lcInOrgX, lc->lcInOrgY, lc->lcInOrgZ);
316 g_print(
"lcInExtX = %d, lcInExtY = %d, lcInExtZ = %d\n",
317 lc->lcInExtX, lc->lcInExtY, lc->lcInExtZ);
318 g_print(
"lcOutOrgX = %d, lcOutOrgY = %d, lcOutOrgZ = %d\n",
319 lc->lcOutOrgX, lc->lcOutOrgY, lc->lcOutOrgZ);
320 g_print(
"lcOutExtX = %d, lcOutExtY = %d, lcOutExtZ = %d\n",
321 lc->lcOutExtX, lc->lcOutExtY, lc->lcOutExtZ);
322 g_print(
"lcSensX = %g, lcSensY = %g, lcSensZ = %g\n",
323 lc->lcSensX / 65536., lc->lcSensY / 65536.,
324 lc->lcSensZ / 65536.);
325 g_print(
"lcSysMode = %d\n", lc->lcSysMode);
326 g_print(
"lcSysOrgX = %d, lcSysOrgY = %d\n",
327 lc->lcSysOrgX, lc->lcSysOrgY);
328 g_print(
"lcSysExtX = %d, lcSysExtY = %d\n",
329 lc->lcSysExtX, lc->lcSysExtY);
330 g_print(
"lcSysSensX = %g, lcSysSensY = %g\n",
331 lc->lcSysSensX / 65536., lc->lcSysSensY / 65536.);
343 LOGCONTEXT defcontext;
345 UINT ndevices, ncursors, ncsrtypes, firstcsr, hardware;
347 AXIS axis_x, axis_y, axis_npressure, axis_or[3];
350 char devname[100], csrname[100];
352 gdk_input_devices =
NULL;
353 wintab_contexts =
NULL;
355 if (!gdk_input_ignore_wintab && WTInfo(0, 0,
NULL)) {
356 WTInfo(WTI_INTERFACE, IFC_SPECVERSION, &specversion);
358 HIBYTE(specversion), LOBYTE(specversion)));
360 WTInfo(WTI_DEFSYSCTX, 0, &defcontext);
365 WTInfo(WTI_DEFCONTEXT, 0, &defcontext);
370 WTInfo(WTI_INTERFACE, IFC_NDEVICES, &ndevices);
371 WTInfo(WTI_INTERFACE, IFC_NCURSORS, &ncursors);
374 ndevices, ncursors));
386 g_warning(
"gdk_input_init: gdk_window_new failed");
391 for (devix = 0; devix < ndevices; devix++) {
394 WTInfo(WTI_DEVICES + devix, DVC_NAME, devname);
396 WTInfo(WTI_DEVICES + devix, DVC_NCSRTYPES, &ncsrtypes);
397 WTInfo(WTI_DEVICES + devix, DVC_FIRSTCSR, &firstcsr);
398 WTInfo(WTI_DEVICES + devix, DVC_HARDWARE, &hardware);
399 WTInfo(WTI_DEVICES + devix, DVC_X, &axis_x);
400 WTInfo(WTI_DEVICES + devix, DVC_Y, &axis_y);
401 WTInfo(WTI_DEVICES + devix, DVC_NPRESSURE, &axis_npressure);
402 WTInfo(WTI_DEVICES + devix, DVC_ORIENTATION, axis_or);
404 if (HIBYTE(specversion) > 1 || LOBYTE(specversion) >= 1) {
405 WTInfo(WTI_DDCTXS + devix, CTX_NAME, lc.lcName);
406 WTInfo(WTI_DDCTXS + devix, CTX_OPTIONS, &lc.lcOptions);
407 lc.lcOptions |= CXO_MESSAGES;
409 lc.lcOptions |= CXO_SYSTEM;
412 WTInfo(WTI_DDCTXS + devix, CTX_LOCKS, &lc.lcLocks);
413 lc.lcMsgBase = WT_DEFBASE;
416 lc.lcPktData = PACKETDATA;
417 lc.lcPktMode = PK_BUTTONS;
418 lc.lcMoveMask = PACKETDATA;
419 lc.lcBtnDnMask = lc.lcBtnUpMask = ~0;
420 WTInfo(WTI_DDCTXS + devix, CTX_INORGX, &lc.lcInOrgX);
421 WTInfo(WTI_DDCTXS + devix, CTX_INORGY, &lc.lcInOrgY);
422 WTInfo(WTI_DDCTXS + devix, CTX_INORGZ, &lc.lcInOrgZ);
423 WTInfo(WTI_DDCTXS + devix, CTX_INEXTX, &lc.lcInExtX);
424 WTInfo(WTI_DDCTXS + devix, CTX_INEXTY, &lc.lcInExtY);
425 WTInfo(WTI_DDCTXS + devix, CTX_INEXTZ, &lc.lcInExtZ);
426 lc.lcOutOrgX = axis_x.axMin;
427 lc.lcOutOrgY = axis_y.axMin;
428 lc.lcOutExtX = axis_x.axMax - axis_x.axMin;
429 lc.lcOutExtY = axis_y.axMax - axis_y.axMin;
430 lc.lcOutExtY = -lc.lcOutExtY;
431 WTInfo(WTI_DDCTXS + devix, CTX_SENSX, &lc.lcSensX);
432 WTInfo(WTI_DDCTXS + devix, CTX_SENSY, &lc.lcSensY);
433 WTInfo(WTI_DDCTXS + devix, CTX_SENSZ, &lc.lcSensZ);
434 WTInfo(WTI_DDCTXS + devix, CTX_SYSMODE, &lc.lcSysMode);
435 lc.lcSysOrgX = lc.lcSysOrgY = 0;
436 WTInfo(WTI_DDCTXS + devix, CTX_SYSEXTX, &lc.lcSysExtX);
437 WTInfo(WTI_DDCTXS + devix, CTX_SYSEXTY, &lc.lcSysExtY);
438 WTInfo(WTI_DDCTXS + devix, CTX_SYSSENSX, &lc.lcSysSensX);
439 WTInfo(WTI_DDCTXS + devix, CTX_SYSSENSY, &lc.lcSysSensY);
442 lc.lcOptions |= CXO_MESSAGES;
443 lc.lcMsgBase = WT_DEFBASE;
445 lc.lcPktData = PACKETDATA;
446 lc.lcPktMode = PACKETMODE;
447 lc.lcMoveMask = PACKETDATA;
448 lc.lcBtnUpMask = lc.lcBtnDnMask = ~0;
450 lc.lcOutExtY = -lc.lcOutExtY;
452 lc.lcOutOrgX = axis_x.axMin;
453 lc.lcOutOrgY = axis_y.axMin;
454 lc.lcOutExtX = axis_x.axMax - axis_x.axMin;
455 lc.lcOutExtY = axis_y.axMax - axis_y.axMin;
456 lc.lcOutExtY = -lc.lcOutExtY;
463 hctx =
g_new(HCTX, 1);
467 g_warning(
"gdk_input_init: WTOpen failed");
476 WTEnable(*hctx,
TRUE);
478 WTOverlap(*hctx,
TRUE);
482 (
g_print(
"context for device %d after WTOpen:\n", devix),
485 for (cursorix = firstcsr; cursorix < firstcsr + ncsrtypes;
488 WTInfo(WTI_CURSORS + cursorix, CSR_ACTIVE, &active);
492 WTInfo(WTI_CURSORS + cursorix, CSR_NAME, csrname);
494 gdkdev->info.deviceid = deviceid_counter++;
498 gdkdev->info.has_cursor =
TRUE;
500 gdkdev->info.has_cursor =
FALSE;
502 gdkdev->hctx = *hctx;
503 gdkdev->cursor = cursorix;
504 WTInfo(WTI_CURSORS + cursorix, CSR_PKTDATA, &gdkdev->pktdata);
505 gdkdev->info.num_axes = 0;
506 if (gdkdev->pktdata & PK_X)
507 gdkdev->info.num_axes++;
508 if (gdkdev->pktdata & PK_Y)
509 gdkdev->info.num_axes++;
510 if (gdkdev->pktdata & PK_NORMAL_PRESSURE)
511 gdkdev->info.num_axes++;
517 if ((gdkdev->pktdata & PK_ORIENTATION)
518 && axis_or[0].axResolution == 0)
519 gdkdev->pktdata &= ~PK_ORIENTATION;
521 if (gdkdev->pktdata & PK_ORIENTATION)
522 gdkdev->info.num_axes += 2;
523 WTInfo(WTI_CURSORS + cursorix, CSR_NPBTNMARKS,
524 &gdkdev->npbtnmarks);
527 gdkdev->last_axis_data =
g_new(
gint, gdkdev->info.num_axes);
530 gdkdev->axis_for_use[k] = -1;
533 if (gdkdev->pktdata & PK_X) {
534 gdkdev->axes[k].xresolution =
535 gdkdev->axes[k].resolution =
536 axis_x.axResolution / 65535.;
537 gdkdev->axes[k].xmin_value = gdkdev->axes[k].min_value =
539 gdkdev->axes[k].xmax_value = gdkdev->axes[k].max_value =
545 if (gdkdev->pktdata & PK_Y) {
546 gdkdev->axes[k].xresolution =
547 gdkdev->axes[k].resolution =
548 axis_y.axResolution / 65535.;
549 gdkdev->axes[k].xmin_value = gdkdev->axes[k].min_value =
551 gdkdev->axes[k].xmax_value = gdkdev->axes[k].max_value =
557 if (gdkdev->pktdata & PK_NORMAL_PRESSURE) {
558 gdkdev->axes[k].xresolution =
559 gdkdev->axes[k].resolution =
560 axis_npressure.axResolution / 65535.;
561 gdkdev->axes[k].xmin_value = gdkdev->axes[k].min_value =
562 axis_npressure.axMin;
563 gdkdev->axes[k].xmax_value = gdkdev->axes[k].max_value =
564 axis_npressure.axMax;
569 if (gdkdev->pktdata & PK_ORIENTATION) {
572 gdkdev->orientation_axes[0] = axis_or[0];
573 gdkdev->orientation_axes[1] = axis_or[1];
578 gdkdev->axes[k].xresolution =
579 gdkdev->axes[k].resolution = 1000;
580 gdkdev->axes[k].xmin_value =
581 gdkdev->axes[k].min_value = -1000;
582 gdkdev->axes[k].xmax_value =
583 gdkdev->axes[k].max_value = 1000;
584 gdkdev->info.axes[k] = axis;
585 gdkdev->axis_for_use[axis] = k;
589 gdkdev->info.num_keys = 0;
590 gdkdev->info.keys =
NULL;
592 (
g_print(
"device: %d (%d) %s axes: %d\n",
593 gdkdev->info.deviceid, cursorix,
595 gdkdev->info.num_axes),
596 g_print(
"axes: X:%d, Y:%d, PRESSURE:%d, "
597 "XTILT:%d, YTILT:%d\n",
603 for (i = 0; i < gdkdev->info.num_axes; i++)
605 g_print(
"...axis %d: %d--%d@%d (%d--%d@%d)\n",
607 gdkdev->axes[i].xmin_value,
608 gdkdev->axes[i].xmax_value,
609 gdkdev->axes[i].xresolution,
610 gdkdev->axes[i].min_value,
611 gdkdev->axes[i].max_value,
612 gdkdev->axes[i].resolution));
613 gdk_input_devices =
g_list_append(gdk_input_devices, gdkdev);
619 if (deviceid_counter > 0) {
621 gdk_input_vtable.
set_mode = gdk_input_win32_set_mode;
625 gdk_input_vtable.
get_pointer = gdk_input_win32_get_pointer;
626 gdk_input_vtable.
grab_pointer = gdk_input_win32_grab_pointer;
629 gdk_input_vtable.
enter_event = gdk_input_win32_enter_event;
630 gdk_input_vtable.
other_event = gdk_input_win32_other_event;
631 gdk_input_vtable.
enable_window = gdk_input_win32_enable_window;
636 gdk_input_ignore_core =
FALSE;
653 gdk_input_ignore_core =
FALSE;
666 return gdk_input_vtable.
set_mode(deviceid, mode);
681 gdkdev->axis_for_use[i] = -1;
684 for (i = 0; i < gdkdev->info.num_axes; i++) {
685 gdkdev->info.axes[i] = axes[i];
686 gdkdev->axis_for_use[axes[i]] = i;
727 gint x_axis, y_axis, pressure_axis, xtilt_axis, ytilt_axis;
728 gdouble device_width, device_height;
729 gdouble x_offset, y_offset, x_scale, y_scale;
739 device_width = gdkdev->axes[x_axis].max_value -
740 gdkdev->axes[x_axis].min_value;
741 device_height = gdkdev->axes[y_axis].max_value -
742 gdkdev->axes[y_axis].min_value;
745 x_scale = gdk_input_root_width / device_width;
746 y_scale = gdk_input_root_height / device_height;
748 x_offset = -input_window->
root_x;
749 y_offset = -input_window->
root_y;
752 double device_aspect =
753 (device_height * gdkdev->axes[y_axis].resolution) /
754 (device_width * gdkdev->axes[x_axis].resolution);
756 if (device_aspect * window_private->
width >= window_private->
height) {
758 x_scale = window_private->
width / device_width;
759 y_scale = (x_scale * gdkdev->axes[x_axis].resolution)
760 / gdkdev->axes[y_axis].resolution;
763 y_offset = -(device_height * y_scale -
764 window_private->
height) / 2;
767 y_scale = window_private->
height / device_height;
768 x_scale = (y_scale * gdkdev->axes[y_axis].resolution)
769 / gdkdev->axes[x_axis].resolution;
772 x_offset = -(device_width * x_scale - window_private->
width) / 2;
777 *x = x_offset + x_scale * axis_data[x_axis];
779 *y = y_offset + y_scale * axis_data[y_axis];
782 if (pressure_axis != -1)
783 *pressure = ((
double) axis_data[pressure_axis]
784 - gdkdev->axes[pressure_axis].min_value)
785 / (gdkdev->axes[pressure_axis].max_value
786 - gdkdev->axes[pressure_axis].min_value);
792 if (xtilt_axis != -1) {
793 *xtilt = 2. * (
double) (axis_data[xtilt_axis] -
794 (gdkdev->axes[xtilt_axis].min_value +
795 gdkdev->axes[xtilt_axis].max_value) /
796 2) / (gdkdev->axes[xtilt_axis].max_value -
797 gdkdev->axes[xtilt_axis].min_value);
803 if (ytilt_axis != -1) {
804 *ytilt = 2. * (
double) (axis_data[ytilt_axis] -
805 (gdkdev->axes[ytilt_axis].min_value +
806 gdkdev->axes[ytilt_axis].max_value) /
807 2) / (gdkdev->axes[ytilt_axis].max_value -
808 gdkdev->axes[ytilt_axis].min_value);
815 gdk_input_win32_get_pointer(
GdkWindow * window,
850 gdk_input_translate_coordinates(gdkdev, input_window,
851 gdkdev->last_axis_data,
852 x, y, pressure, xtilt, ytilt);
855 *mask |= ((gdkdev->last_buttons & 0x1F) << 8);
861 gdk_input_get_root_relative_geometry(HWND w,
int *x_ret,
int *y_ret)
865 GetWindowRect(w, &rect);
885 old_mode = gdkdev->info.mode;
887 if (old_mode == mode)
890 gdkdev->info.mode = mode;
893 gdkdev->info.has_cursor =
FALSE;
894 for (tmp_list = gdk_input_windows; tmp_list;
895 tmp_list = tmp_list->next) {
898 gdk_input_win32_enable_window(input_window->
window, gdkdev);
900 gdk_input_win32_disable_window(input_window->
window, gdkdev);
903 gdkdev->info.has_cursor =
TRUE;
904 for (tmp_list = gdk_input_windows; tmp_list;
905 tmp_list = tmp_list->next)
907 data)->window, gdkdev);
910 for (tmp_list = gdk_input_windows; tmp_list;
911 tmp_list = tmp_list->next) {
915 gdk_input_win32_disable_window(input_window->
window, gdkdev);
932 gdk_input_get_root_relative_geometry
935 input_window->
root_x = root_x;
936 input_window->
root_y = root_y;
948 gdk_input_get_root_relative_geometry
951 input_window->
root_x = root_x;
952 input_window->
root_y = root_y;
955 static void decode_tilt(
gint * axis_data, AXIS * axes, PACKET * packet)
963 az =
TWOPI * packet->pkOrientation.orAzimuth /
964 (axes[0].axResolution / 65536.);
965 el =
TWOPI * packet->pkOrientation.orAltitude /
966 (axes[1].axResolution / 65536.);
969 axis_data[0] =
cos(az) *
cos(el) * 1000;
971 axis_data[1] =
sin(az) *
cos(el) * 1000;
982 if (gdkdev->hctx == hctx && gdkdev->cursor == cursor)
984 tmp_list = tmp_list->next;
989 static gint gdk_input_win32_other_event(
GdkEvent * event, MSG * xevent)
1002 if (event->
any.
window != wintab_window) {
1003 g_warning(
"gdk_input_win32_other_event: not wintab_window?");
1014 g_print(
"gdk_input_win32_other_event: window=%#x (%d,%d)\n",
1020 if (current_window ==
NULL)
1023 input_window = gdk_input_window_find_within(current_window);
1024 if (input_window ==
NULL)
1028 if (xevent->message == WT_PACKET) {
1029 if (!WTPacket((HCTX) xevent->lParam, xevent->wParam, &packet))
1033 switch (xevent->message) {
1040 if ((gdkdev = gdk_input_find_dev_from_ctx((HCTX) xevent->lParam,
1041 packet.pkCursor)) ==
NULL)
1048 if (gdkdev->pktdata & PK_X)
1049 gdkdev->last_axis_data[k++] = packet.pkX;
1050 if (gdkdev->pktdata & PK_Y)
1051 gdkdev->last_axis_data[k++] = packet.pkY;
1052 if (gdkdev->pktdata & PK_NORMAL_PRESSURE)
1053 gdkdev->last_axis_data[k++] = packet.pkNormalPressure;
1054 if (gdkdev->pktdata & PK_ORIENTATION) {
1055 decode_tilt(gdkdev->last_axis_data + k,
1056 gdkdev->orientation_axes, &packet);
1060 g_assert(k == gdkdev->info.num_axes);
1062 if (HIWORD(packet.pkButtons) != TBN_NONE) {
1064 event->button.button = 1 + LOWORD(packet.pkButtons);
1066 if (HIWORD(packet.pkButtons) == TBN_UP) {
1069 gdkdev->button_state &= ~(1 << LOWORD(packet.pkButtons));
1073 gdkdev->button_state |= 1 << LOWORD(packet.pkButtons);
1078 if (gdkdev->button_state & (1 << 0))
1080 if (gdkdev->button_state & (1 << 1))
1082 if (gdkdev->button_state & (1 << 2))
1120 event->any.window = window;
1124 event->button.time = xevent->time;
1125 event->button.source = gdkdev->info.source;
1126 last_moved_cursor_id =
1127 event->button.deviceid = gdkdev->info.deviceid;
1136 gdk_input_translate_coordinates(gdkdev, input_window,
1137 gdkdev->last_axis_data,
1144 event->button.state = ((gdkdev->button_state << 8)
1149 g_print(
"WINTAB button %s: %d %d %g,%g %g %g,%g\n",
1157 event->motion.time = xevent->time;
1158 last_moved_cursor_id =
1159 event->motion.deviceid = gdkdev->info.deviceid;
1160 event->motion.is_hint =
FALSE;
1161 event->motion.source = gdkdev->info.source;
1163 gdk_input_translate_coordinates(gdkdev, input_window,
1164 gdkdev->last_axis_data,
1171 event->motion.state = ((gdkdev->button_state << 8)
1187 if ((gdkdev->pktdata & PK_NORMAL_PRESSURE
1189 && packet.pkNormalPressure <=
MAX(0,
1190 gdkdev->npbtnmarks[0] - 2))
1191 || (gdkdev->pktdata & PK_NORMAL_PRESSURE
1193 && packet.pkNormalPressure > gdkdev->npbtnmarks[1] + 2)) {
1197 gdkdev->button_state &= ~1;
1200 gdkdev->button_state |= 1;
1202 event2->
button.
state = ((gdkdev->button_state << 8)
1210 (
"WINTAB synthesized button %s: %d %d %g,%g %g\n",
1222 if (LOWORD(xevent->lParam) == 0) {
1224 gdk_input_ignore_core =
FALSE;
1227 gdk_input_ignore_core =
TRUE;
1229 event->proximity.time = xevent->time;
1242 gdk_input_win32_enable_window(
GdkWindow * window,
1250 gdk_input_win32_disable_window(
GdkWindow * window,
1258 gdk_input_win32_grab_pointer(
GdkWindow * window,
1271 need_ungrab =
FALSE;
1282 if (input_window->
window == window)
1283 new_window = input_window;
1284 else if (input_window->
grabbed) {
1289 tmp_list = tmp_list->next;
1301 gdk_input_find_events(window, gdkdev,
1302 event_mask, event_classes, &num_classes);
1303 result = XGrabDevice(
GDK_DISPLAY(), gdkdev->xdevice,
1305 owner_events, num_classes, event_classes,
1306 GrabModeAsync, GrabModeAsync, time);
1314 tmp_list = tmp_list->next;
1321 ((gdkdev->button_state != 0) || need_ungrab)) {
1324 XUngrabDevice(gdk_display, gdkdev->xdevice, time);
1326 gdkdev->button_state = 0;
1329 tmp_list = tmp_list->next;
1337 static void gdk_input_win32_ungrab_pointer(
guint32 time)
1350 tmp_list = tmp_list->next;
1362 XUngrabDevice(gdk_display, gdkdev->xdevice, time);
1364 tmp_list = tmp_list->next;
1381 gdkdev->info.source = source;
1389 gdk_input_vtable.
set_key(deviceid, index, keyval, modifiers);
1401 *nevents_return = 0;
1428 for (tmp_list = gdk_input_windows; tmp_list; tmp_list = tmp_list->next)
1443 for (list = gdk_input_windows; list !=
NULL; list = list->next) {
1505 for (tmp_list = gdk_input_devices; tmp_list; tmp_list = tmp_list->next) {
1510 && (gdkdev->info.has_cursor
1526 gdk_input_windows =
g_list_remove(gdk_input_windows, input_window);
1536 for (tmp_list = gdk_input_devices; tmp_list; tmp_list = tmp_list->next) {
1539 gdk_input_win32_set_mode(gdkdev->info.deviceid,
1541 g_free(gdkdev->info.name);
1542 g_free(gdkdev->last_axis_data);
1543 g_free(gdkdev->info.axes);
1544 g_free(gdkdev->info.keys);
1552 for (tmp_list = gdk_input_windows; tmp_list; tmp_list = tmp_list->next) {
1556 gdk_input_windows =
NULL;
1559 wintab_window =
NULL;
1562 for (tmp_list = wintab_contexts; tmp_list; tmp_list = tmp_list->next) {
1563 HCTX *hctx = (HCTX *) tmp_list->data;
1575 WTEnable(*hctx,
FALSE);
1577 result = WTClose(*hctx);
1580 EXCEPTION_EXECUTE_HANDLER
1585 g_warning(
"gdk_input_exit: Closing Wintab context %#x failed",
1592 wintab_contexts =
NULL;
1603 if (gdkdev->info.deviceid ==
id)
1605 tmp_list = tmp_list->next;
1620 gdk_input_vtable.
get_pointer(window, deviceid, x, y, pressure,
1621 xtilt, ytilt, mask);
#define GDK_DRAWABLE_DESTROYED(d)
void g_list_free(GList *list)
GdkWindow * gdk_parent_root
#define g_return_val_if_fail(expr, val)
GdkEventMask gdk_window_get_events(GdkWindow *window)
#define GDK_NOTE(type, action)
#define GDK_WINDOW_WIN32DATA(win)
GdkWindow * gdk_window_new(GdkWindow *parent, GdkWindowAttr *attributes, gint attributes_mask)
void gdk_event_queue_append(GdkEvent *event)
if(pyself &&pyself!=Py_None)
gint gdk_screen_height(void)
GList * g_list_append(GList *list, gpointer data)
#define GDK_WINDOW_XWINDOW
#define g_return_if_fail(expr)
#define g_new(struct_type, n_structs)
typedef BOOL(WINAPI *PFN_TrackMouseEvent)(LPTRACKMOUSEEVENT)
#define g_assert_not_reached()
GdkWindow * gdk_window_at_pointer(gint *win_x, gint *win_y)
gchar * g_strconcat(const gchar *string1,...)
void g_free(gpointer mem)
GdkDrawableType window_type
typedefG_BEGIN_DECLS struct _GList GList
GdkEventProximity proximity
#define gdk_window_lookup(xid)
GdkEvent * gdk_event_copy(GdkEvent *event)
GList * g_list_remove(GList *list, gconstpointer data)
static void g_warning(const gchar *format,...)
void gdk_window_set_events(GdkWindow *window, GdkEventMask event_mask)
#define GDK_DRAWABLE_XID(win)
void g_print(const gchar *format,...)
GdkWindow * gdk_window_get_pointer(GdkWindow *window, gint *x, gint *y, GdkModifierType *mask)
gint gdk_screen_width(void)