Add support for Windows Pointer Input Stack
https://gitlab.gnome.org/GNOME/gtk/-/merge_requests/1563
This commit is contained in:
parent
01eb5d41cf
commit
712721b60a
77
README.win32
77
README.win32
@ -15,6 +15,8 @@ the same compiler is used for at least GDK-Pixbuf, Pango, atk and glib
|
|||||||
so that crashes and errors caused by different CRTs can be avoided. Currently
|
so that crashes and errors caused by different CRTs can be avoided. Currently
|
||||||
building with Visual Studio 2008 or later is supported, either via Visual Studio
|
building with Visual Studio 2008 or later is supported, either via Visual Studio
|
||||||
project files or via the Meson build system, as described in the below sections.
|
project files or via the Meson build system, as described in the below sections.
|
||||||
|
For Visual Studio 2008, 2010, a special setup making use of the Windows 8.0 SDK
|
||||||
|
is required, see at the bottom of this document for guidance.
|
||||||
Interchanging between Visual Studio 2015, 2017 and 2019 builds should be fine
|
Interchanging between Visual Studio 2015, 2017 and 2019 builds should be fine
|
||||||
as they use the same CRT (UCRT) DLLs.
|
as they use the same CRT (UCRT) DLLs.
|
||||||
|
|
||||||
@ -286,6 +288,73 @@ If you are building with Visual Studio 2008, note the following items as well:
|
|||||||
- The more modern visual style for the print dialog is not applied for Visual
|
- The more modern visual style for the print dialog is not applied for Visual
|
||||||
Studio 2008 builds. Any solutions to this is really appreciated.
|
Studio 2008 builds. Any solutions to this is really appreciated.
|
||||||
|
|
||||||
|
Support for pre-2012 Visual Studio
|
||||||
|
==================================
|
||||||
|
|
||||||
|
This release of GTK+ requires at least the Windows 8.0 SDK in order to be built
|
||||||
|
successfully using Visual Studio, which means that building with Visual Studio
|
||||||
|
2008 or 2010 is possible only with a special setup and must be done in the
|
||||||
|
command line with Ninja. Please see
|
||||||
|
https://devblogs.microsoft.com/cppblog/using-the-windows-software-development-kit-sdk-for-windows-8-consumer-preview-with-visual-studio-2010/
|
||||||
|
for references; basically, assuming that your Windows 8.0 SDK is installed in
|
||||||
|
`C:\Program Files (x86)\Windows Kits\8.0` (`$(WIN8SDKDIR)` in short), you need
|
||||||
|
to ensure the following before invoking Meson to configure the build:
|
||||||
|
|
||||||
|
- Your `%INCLUDE%` must not include the Windows 7.0/7.1 SDK include directories,
|
||||||
|
and `$(WIN8SDKDIR)\include\um`, `$(WIN8SDKDIR)\include\um\share` and
|
||||||
|
`$(WIN8SDKDIR)\include\winrt` (in this order) must be before your stock
|
||||||
|
Visual Studio 2008/2010 header directories. If you have the DirectX SDK installed,
|
||||||
|
you should remove its include directory from your `%INCLUDE%` as well.
|
||||||
|
- You must replace the Windows 7.0/7.1 SDK library directory in `%LIB%` with the
|
||||||
|
Windows 8.0 SDK library directory, i.e. `$(WIN8SDKDIR)\lib\win8\um\[x86|x64]`.
|
||||||
|
If you have the DirectX SDK installed, you should remove its library directory
|
||||||
|
from your `%INCLUDE%` as well.
|
||||||
|
- You must replace the Windows 7.0/7.1 SDK tools directory from your `%PATH%` with
|
||||||
|
the Windows 8.0 SDK tools directory, i.e. `$(WIN8SDKDIR)\bin\[x86|x64]`.
|
||||||
|
If you have the DirectX SDK installed, you should remove its utility directory
|
||||||
|
from your `%PATH%` as well.
|
||||||
|
|
||||||
|
The Windows 8.0 SDK headers may contain an `roapi.h` that cannot be used under plain
|
||||||
|
C, so to remedy that, change the following lines (around lines 55-57):
|
||||||
|
|
||||||
|
// RegisterActivationFactory/RevokeActivationFactory registration cookie
|
||||||
|
typedef struct {} *RO_REGISTRATION_COOKIE;
|
||||||
|
// RegisterActivationFactory/DllGetActivationFactory callback
|
||||||
|
|
||||||
|
to
|
||||||
|
|
||||||
|
// RegisterActivationFactory/RevokeActivationFactory registration cookie
|
||||||
|
#ifdef __cplusplus
|
||||||
|
typedef struct {} *RO_REGISTRATION_COOKIE;
|
||||||
|
#else
|
||||||
|
typedef struct _RO_REGISTRATION_COOKIE *RO_REGISTRATION_COOKIE; /* make this header includable in C files */
|
||||||
|
#endif
|
||||||
|
// RegisterActivationFactory/DllGetActivationFactory callback
|
||||||
|
|
||||||
|
This follows what is done in the Windows 8.1 SDK, which contains an `roapi.h`
|
||||||
|
that is usable under plain C. Please note that you might need to copy that file
|
||||||
|
into a location that is in your `%INCLUDE%` which precedes the include path for the
|
||||||
|
Windows 8.0 SDK headers, if you do not have administrative privileges.
|
||||||
|
|
||||||
|
Visual Studio 2008 hacks
|
||||||
|
========================
|
||||||
|
|
||||||
|
- You need to run the following lines from your build directory, to embed the
|
||||||
|
manifests that are generated during the build, assuming the built binaries
|
||||||
|
are installed to `$(PREFIX)`, after a successful build/installation:
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
> for /r %f in (*.dll.manifest) do if exist $(PREFIX)\bin\%~nf mt /manifest %f (PREFIX)\bin\%~nf;2
|
||||||
|
> for /r %f in (*.exe.manifest) do if exist $(PREFIX)\bin\%~nf mt /manifest %f (PREFIX)\bin\%~nf;1
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
- If building for amd64/x86_64/x64, sometimes the compilation of sources may seem to hang, which
|
||||||
|
is caused by an optimization issue in the 2008 x64 compiler. You need to use Task Manager to
|
||||||
|
remove all running instances of `cl.exe`, which will cause the build process to terminate. Update
|
||||||
|
the build flags of the sources that hang on compilation by changing its `"/O2"` flag to `"/O1"`
|
||||||
|
in `build.ninja`, and retry the build, where things should continue to build normally.
|
||||||
|
|
||||||
Using GTK+ on Win32
|
Using GTK+ on Win32
|
||||||
===================
|
===================
|
||||||
|
|
||||||
@ -302,13 +371,5 @@ cases, but not in general. Sorry. If you have all GTK+ and GDK calls
|
|||||||
in the same thread, it might work. Otherwise, probably not at
|
in the same thread, it might work. Otherwise, probably not at
|
||||||
all. Possible ways to fix this are being investigated.
|
all. Possible ways to fix this are being investigated.
|
||||||
|
|
||||||
Wintab
|
|
||||||
======
|
|
||||||
|
|
||||||
The tablet support uses the Wintab API. The Wintab development kit is
|
|
||||||
no longer required. The wintab.h header file is bundled with GTK+
|
|
||||||
sources. Unfortunately it seems that only Wacom tablets come with
|
|
||||||
support for the Wintab API nowadays.
|
|
||||||
|
|
||||||
--Tor Lillqvist <tml@iki.fi>, <tml@novell.com>
|
--Tor Lillqvist <tml@iki.fi>, <tml@novell.com>
|
||||||
--Updated by Fan, Chun-wei <fanc999@yahoo.com.tw>
|
--Updated by Fan, Chun-wei <fanc999@yahoo.com.tw>
|
||||||
|
@ -21,7 +21,10 @@ if WIN32_GLES
|
|||||||
AM_CPPFLAGS += "-DGDK_WIN32_ENABLE_EGL=1"
|
AM_CPPFLAGS += "-DGDK_WIN32_ENABLE_EGL=1"
|
||||||
endif #WIN32_GLES
|
endif #WIN32_GLES
|
||||||
|
|
||||||
LDADDS = $(GDK_DEP_LIBS)
|
libgdk_win32_DEP_LIBS = \
|
||||||
|
hid.lib
|
||||||
|
|
||||||
|
LDADDS = $(libgdk_win32_DEP_LIBS) $(GDK_DEP_LIBS)
|
||||||
|
|
||||||
noinst_LTLIBRARIES = libgdk-win32.la
|
noinst_LTLIBRARIES = libgdk-win32.la
|
||||||
|
|
||||||
@ -40,6 +43,8 @@ libgdk_win32_la_SOURCES = \
|
|||||||
gdkdevice-virtual.h \
|
gdkdevice-virtual.h \
|
||||||
gdkdevice-win32.c \
|
gdkdevice-win32.c \
|
||||||
gdkdevice-win32.h \
|
gdkdevice-win32.h \
|
||||||
|
gdkdevice-winpointer.c \
|
||||||
|
gdkdevice-winpointer.h \
|
||||||
gdkdevice-wintab.c \
|
gdkdevice-wintab.c \
|
||||||
gdkdevice-wintab.h \
|
gdkdevice-wintab.h \
|
||||||
gdkdisplay-win32.c \
|
gdkdisplay-win32.c \
|
||||||
|
@ -117,7 +117,7 @@ gdk_device_win32_query_state (GdkDevice *device,
|
|||||||
impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
|
impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
|
||||||
|
|
||||||
hwnd = GDK_WINDOW_HWND (window);
|
hwnd = GDK_WINDOW_HWND (window);
|
||||||
GetCursorPos (&point);
|
_gdk_win32_get_cursor_pos (&point);
|
||||||
|
|
||||||
if (root_x)
|
if (root_x)
|
||||||
*root_x = point.x / impl->window_scale;
|
*root_x = point.x / impl->window_scale;
|
||||||
@ -215,7 +215,7 @@ _gdk_device_win32_window_at_position (GdkDevice *device,
|
|||||||
HWND hwnd;
|
HWND hwnd;
|
||||||
RECT rect;
|
RECT rect;
|
||||||
|
|
||||||
if (!GetCursorPos (&screen_pt))
|
if (!_gdk_win32_get_cursor_pos (&screen_pt))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
hwnd = WindowFromPoint (screen_pt);
|
hwnd = WindowFromPoint (screen_pt);
|
||||||
|
321
gdk/win32/gdkdevice-winpointer.c
Normal file
321
gdk/win32/gdkdevice-winpointer.c
Normal file
@ -0,0 +1,321 @@
|
|||||||
|
/* GDK - The GIMP Drawing Kit
|
||||||
|
* Copyright (C) 2020 the GTK team
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <gdk/gdkwindow.h>
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#include "gdkwin32.h"
|
||||||
|
#include "gdkdevice-winpointer.h"
|
||||||
|
|
||||||
|
G_DEFINE_TYPE (GdkDeviceWinpointer, gdk_device_winpointer, GDK_TYPE_DEVICE)
|
||||||
|
|
||||||
|
static GdkModifierType
|
||||||
|
get_keyboard_mask (void)
|
||||||
|
{
|
||||||
|
GdkModifierType mask;
|
||||||
|
BYTE kbd[256];
|
||||||
|
|
||||||
|
GetKeyboardState (kbd);
|
||||||
|
mask = 0;
|
||||||
|
if (kbd[VK_SHIFT] & 0x80)
|
||||||
|
mask |= GDK_SHIFT_MASK;
|
||||||
|
if (kbd[VK_CAPITAL] & 0x80)
|
||||||
|
mask |= GDK_LOCK_MASK;
|
||||||
|
if (kbd[VK_CONTROL] & 0x80)
|
||||||
|
mask |= GDK_CONTROL_MASK;
|
||||||
|
if (kbd[VK_MENU] & 0x80)
|
||||||
|
mask |= GDK_MOD1_MASK;
|
||||||
|
|
||||||
|
return mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gdk_device_winpointer_get_history (GdkDevice *device,
|
||||||
|
GdkWindow *window,
|
||||||
|
guint32 start,
|
||||||
|
guint32 stop,
|
||||||
|
GdkTimeCoord ***events,
|
||||||
|
gint *n_events)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gdk_device_winpointer_get_state (GdkDevice *device,
|
||||||
|
GdkWindow *window,
|
||||||
|
gdouble *axes,
|
||||||
|
GdkModifierType *mask)
|
||||||
|
{
|
||||||
|
GdkDeviceWinpointer *device_winpointer = GDK_DEVICE_WINPOINTER (device);
|
||||||
|
|
||||||
|
if (mask)
|
||||||
|
{
|
||||||
|
*mask = get_keyboard_mask ();
|
||||||
|
*mask |= device_winpointer->last_button_mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (axes)
|
||||||
|
{
|
||||||
|
gsize size = sizeof (double) * device_winpointer->num_axes;
|
||||||
|
memcpy (axes, device_winpointer->last_axis_data, size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gdk_device_winpointer_set_window_cursor (GdkDevice *device,
|
||||||
|
GdkWindow *window,
|
||||||
|
GdkCursor *cursor)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gdk_device_winpointer_warp (GdkDevice *device,
|
||||||
|
GdkScreen *screen,
|
||||||
|
gdouble x,
|
||||||
|
gdouble y)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gdk_device_winpointer_query_state (GdkDevice *device,
|
||||||
|
GdkWindow *window,
|
||||||
|
GdkWindow **root_window,
|
||||||
|
GdkWindow **child_window,
|
||||||
|
gdouble *root_x,
|
||||||
|
gdouble *root_y,
|
||||||
|
gdouble *win_x,
|
||||||
|
gdouble *win_y,
|
||||||
|
GdkModifierType *mask)
|
||||||
|
{
|
||||||
|
GdkDeviceWinpointer *device_winpointer = GDK_DEVICE_WINPOINTER (device);
|
||||||
|
GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
|
||||||
|
GdkScreen *screen = gdk_window_get_screen (window);
|
||||||
|
HWND hwnd = GDK_WINDOW_HWND (window);
|
||||||
|
HWND hwndc = NULL;
|
||||||
|
POINT point;
|
||||||
|
|
||||||
|
_gdk_win32_get_cursor_pos (&point);
|
||||||
|
|
||||||
|
if (root_x)
|
||||||
|
*root_x = point.x / impl->window_scale;
|
||||||
|
|
||||||
|
if (root_y)
|
||||||
|
*root_y = point.y / impl->window_scale;
|
||||||
|
|
||||||
|
ScreenToClient (hwnd, &point);
|
||||||
|
|
||||||
|
if (win_x)
|
||||||
|
*win_x = point.x / impl->window_scale;
|
||||||
|
|
||||||
|
if (win_y)
|
||||||
|
*win_y = point.y / impl->window_scale;
|
||||||
|
|
||||||
|
if (window == gdk_screen_get_root_window (screen))
|
||||||
|
{
|
||||||
|
if (win_x)
|
||||||
|
*win_x += _gdk_offset_x;
|
||||||
|
|
||||||
|
if (win_y)
|
||||||
|
*win_y += _gdk_offset_y;
|
||||||
|
|
||||||
|
if (root_x)
|
||||||
|
*root_x += _gdk_offset_x;
|
||||||
|
|
||||||
|
if (root_y)
|
||||||
|
*root_y += _gdk_offset_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (child_window)
|
||||||
|
{
|
||||||
|
if (window == gdk_screen_get_root_window (screen))
|
||||||
|
{
|
||||||
|
/* Always use WindowFromPoint when searching from the root window.
|
||||||
|
* Only WindowFromPoint is able to look through transparent
|
||||||
|
* layered windows.
|
||||||
|
*/
|
||||||
|
hwndc = GetAncestor (WindowFromPoint (point), GA_ROOT);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hwndc = ChildWindowFromPoint (hwnd, point);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hwndc && hwndc != hwnd)
|
||||||
|
*child_window = gdk_win32_handle_table_lookup (hwndc);
|
||||||
|
else
|
||||||
|
*child_window = NULL; /* Direct child unknown to gdk */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (root_window)
|
||||||
|
*root_window = gdk_screen_get_root_window (screen);
|
||||||
|
|
||||||
|
if (mask)
|
||||||
|
{
|
||||||
|
*mask = get_keyboard_mask ();
|
||||||
|
*mask |= device_winpointer->last_button_mask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static GdkGrabStatus
|
||||||
|
gdk_device_winpointer_grab (GdkDevice *device,
|
||||||
|
GdkWindow *window,
|
||||||
|
gboolean owner_events,
|
||||||
|
GdkEventMask event_mask,
|
||||||
|
GdkWindow *confine_to,
|
||||||
|
GdkCursor *cursor,
|
||||||
|
guint32 time_)
|
||||||
|
{
|
||||||
|
return GDK_GRAB_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gdk_device_winpointer_ungrab (GdkDevice *device,
|
||||||
|
guint32 time_)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
screen_to_client (HWND hwnd, POINT screen_pt, POINT *client_pt)
|
||||||
|
{
|
||||||
|
*client_pt = screen_pt;
|
||||||
|
ScreenToClient (hwnd, client_pt);
|
||||||
|
}
|
||||||
|
|
||||||
|
GdkWindow *
|
||||||
|
_gdk_device_winpointer_window_at_position (GdkDevice *device,
|
||||||
|
gdouble *win_x,
|
||||||
|
gdouble *win_y,
|
||||||
|
GdkModifierType *mask,
|
||||||
|
gboolean get_toplevel)
|
||||||
|
{
|
||||||
|
GdkDeviceWinpointer *device_winpointer = GDK_DEVICE_WINPOINTER (device);
|
||||||
|
GdkWindow *window = NULL;
|
||||||
|
GdkWindowImplWin32 *impl = NULL;
|
||||||
|
POINT screen_pt, client_pt;
|
||||||
|
HWND hwnd;
|
||||||
|
RECT rect;
|
||||||
|
|
||||||
|
if (!_gdk_win32_get_cursor_pos (&screen_pt))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
hwnd = WindowFromPoint (screen_pt);
|
||||||
|
|
||||||
|
if (get_toplevel)
|
||||||
|
{
|
||||||
|
/* Use WindowFromPoint instead of ChildWindowFromPoint(Ex).
|
||||||
|
* Only WindowFromPoint is able to look through transparent
|
||||||
|
* layered windows.
|
||||||
|
*/
|
||||||
|
hwnd = GetAncestor (hwnd, GA_ROOT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Verify that we're really inside the client area of the window */
|
||||||
|
GetClientRect (hwnd, &rect);
|
||||||
|
screen_to_client (hwnd, screen_pt, &client_pt);
|
||||||
|
if (!PtInRect (&rect, client_pt))
|
||||||
|
hwnd = NULL;
|
||||||
|
|
||||||
|
if (!get_toplevel && hwnd == NULL)
|
||||||
|
{
|
||||||
|
/* If we didn't hit any window, return the root window */
|
||||||
|
/* note that the root window ain't a toplevel window */
|
||||||
|
window = gdk_get_default_root_window ();
|
||||||
|
impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
|
||||||
|
|
||||||
|
if (win_x)
|
||||||
|
*win_x = (screen_pt.x + _gdk_offset_x) / impl->window_scale;
|
||||||
|
if (win_y)
|
||||||
|
*win_y = (screen_pt.y + _gdk_offset_y) / impl->window_scale;
|
||||||
|
|
||||||
|
return window;
|
||||||
|
}
|
||||||
|
|
||||||
|
window = gdk_win32_handle_table_lookup (hwnd);
|
||||||
|
|
||||||
|
if (window && (win_x || win_y))
|
||||||
|
{
|
||||||
|
impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
|
||||||
|
|
||||||
|
if (win_x)
|
||||||
|
*win_x = client_pt.x / impl->window_scale;
|
||||||
|
if (win_y)
|
||||||
|
*win_y = client_pt.y / impl->window_scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mask)
|
||||||
|
{
|
||||||
|
*mask = get_keyboard_mask ();
|
||||||
|
*mask |= device_winpointer->last_button_mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
return window;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gdk_device_winpointer_select_window_events (GdkDevice *device,
|
||||||
|
GdkWindow *window,
|
||||||
|
GdkEventMask event_mask)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gdk_device_winpointer_init (GdkDeviceWinpointer *device_winpointer)
|
||||||
|
{
|
||||||
|
device_winpointer->device_handle = NULL;
|
||||||
|
device_winpointer->start_cursor_id = 0;
|
||||||
|
device_winpointer->end_cursor_id = 0;
|
||||||
|
|
||||||
|
device_winpointer->origin_x = 0;
|
||||||
|
device_winpointer->origin_y = 0;
|
||||||
|
device_winpointer->scale_x = 0.0;
|
||||||
|
device_winpointer->scale_y = 0.0;
|
||||||
|
|
||||||
|
device_winpointer->last_axis_data = NULL;
|
||||||
|
device_winpointer->num_axes = 0;
|
||||||
|
device_winpointer->last_button_mask = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gdk_device_winpointer_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
GdkDeviceWinpointer *device_winpointer = GDK_DEVICE_WINPOINTER (object);
|
||||||
|
|
||||||
|
g_free (device_winpointer->last_axis_data);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (gdk_device_winpointer_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gdk_device_winpointer_class_init (GdkDeviceWinpointerClass *klass)
|
||||||
|
{
|
||||||
|
GdkDeviceClass *device_class = GDK_DEVICE_CLASS (klass);
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
object_class->finalize = gdk_device_winpointer_finalize;
|
||||||
|
device_class->get_history = gdk_device_winpointer_get_history;
|
||||||
|
device_class->get_state = gdk_device_winpointer_get_state;
|
||||||
|
device_class->set_window_cursor = gdk_device_winpointer_set_window_cursor;
|
||||||
|
device_class->warp = gdk_device_winpointer_warp;
|
||||||
|
device_class->query_state = gdk_device_winpointer_query_state;
|
||||||
|
device_class->grab = gdk_device_winpointer_grab;
|
||||||
|
device_class->ungrab = gdk_device_winpointer_ungrab;
|
||||||
|
device_class->window_at_position = _gdk_device_winpointer_window_at_position;
|
||||||
|
device_class->select_window_events = gdk_device_winpointer_select_window_events;
|
||||||
|
}
|
64
gdk/win32/gdkdevice-winpointer.h
Normal file
64
gdk/win32/gdkdevice-winpointer.h
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/* GDK - The GIMP Drawing Kit
|
||||||
|
* Copyright (C) 2020 the GTK team
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __GDK_DEVICE_WINPOINTER_H__
|
||||||
|
#define __GDK_DEVICE_WINPOINTER_H__
|
||||||
|
|
||||||
|
#include <gdk/gdkdeviceprivate.h>
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
#define GDK_TYPE_DEVICE_WINPOINTER (gdk_device_winpointer_get_type ())
|
||||||
|
#define GDK_DEVICE_WINPOINTER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDK_TYPE_DEVICE_WINPOINTER, GdkDeviceWinpointer))
|
||||||
|
#define GDK_DEVICE_WINPOINTER_CLASS(c) (G_TYPE_CHECK_CLASS_CAST ((c), GDK_TYPE_DEVICE_WINPOINTER, GdkDeviceWinpointerClass))
|
||||||
|
#define GDK_IS_DEVICE_WINPOINTER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDK_TYPE_DEVICE_WINPOINTER))
|
||||||
|
#define GDK_IS_DEVICE_WINPOINTER_CLASS(c) (G_TYPE_CHECK_CLASS_TYPE ((c), GDK_TYPE_DEVICE_WINPOINTER))
|
||||||
|
#define GDK_DEVICE_WINPOINTER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDK_TYPE_DEVICE_WINPOINTER, GdkDeviceWinpointerClass))
|
||||||
|
|
||||||
|
typedef struct _GdkDeviceWinpointer GdkDeviceWinpointer;
|
||||||
|
typedef struct _GdkDeviceWinpointerClass GdkDeviceWinpointerClass;
|
||||||
|
|
||||||
|
struct _GdkDeviceWinpointer
|
||||||
|
{
|
||||||
|
GdkDevice parent_instance;
|
||||||
|
|
||||||
|
HANDLE device_handle;
|
||||||
|
UINT32 start_cursor_id;
|
||||||
|
UINT32 end_cursor_id;
|
||||||
|
|
||||||
|
int origin_x;
|
||||||
|
int origin_y;
|
||||||
|
double scale_x;
|
||||||
|
double scale_y;
|
||||||
|
|
||||||
|
double *last_axis_data;
|
||||||
|
unsigned num_axes;
|
||||||
|
GdkModifierType last_button_mask;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _GdkDeviceWinpointerClass
|
||||||
|
{
|
||||||
|
GdkDeviceClass parent_class;
|
||||||
|
};
|
||||||
|
|
||||||
|
GType gdk_device_winpointer_get_type (void) G_GNUC_CONST;
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
|
#endif /* __GDK_DEVICE_WINPOINTER_H__ */
|
@ -128,7 +128,7 @@ gdk_device_wintab_query_state (GdkDevice *device,
|
|||||||
impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
|
impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
|
||||||
|
|
||||||
hwnd = GDK_WINDOW_HWND (window);
|
hwnd = GDK_WINDOW_HWND (window);
|
||||||
GetCursorPos (&point);
|
_gdk_win32_get_cursor_pos (&point);
|
||||||
|
|
||||||
if (root_x)
|
if (root_x)
|
||||||
*root_x = point.x / impl->window_scale;
|
*root_x = point.x / impl->window_scale;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -41,6 +41,8 @@ struct _GdkDeviceManagerWin32
|
|||||||
/* Fake slave devices */
|
/* Fake slave devices */
|
||||||
GdkDevice *system_pointer;
|
GdkDevice *system_pointer;
|
||||||
GdkDevice *system_keyboard;
|
GdkDevice *system_keyboard;
|
||||||
|
|
||||||
|
GList *winpointer_devices;
|
||||||
GList *wintab_devices;
|
GList *wintab_devices;
|
||||||
|
|
||||||
/* Bumped up every time a wintab device enters the proximity
|
/* Bumped up every time a wintab device enters the proximity
|
||||||
@ -57,11 +59,31 @@ struct _GdkDeviceManagerWin32Class
|
|||||||
|
|
||||||
GType gdk_device_manager_win32_get_type (void) G_GNUC_CONST;
|
GType gdk_device_manager_win32_get_type (void) G_GNUC_CONST;
|
||||||
|
|
||||||
void _gdk_input_set_tablet_active (void);
|
typedef void
|
||||||
gboolean gdk_input_other_event (GdkDisplay *display,
|
(*crossing_cb_t)(GdkDisplay *display,
|
||||||
GdkEvent *event,
|
GdkDevice *device,
|
||||||
MSG *msg,
|
GdkWindow *window,
|
||||||
GdkWindow *window);
|
POINT *screen_pt,
|
||||||
|
guint32 time_);
|
||||||
|
|
||||||
|
void gdk_winpointer_initialize_window (GdkWindow *window);
|
||||||
|
gboolean gdk_winpointer_should_forward_message (MSG *msg);
|
||||||
|
void gdk_winpointer_input_events (GdkDisplay *display,
|
||||||
|
GdkWindow *window,
|
||||||
|
crossing_cb_t crossing_cb,
|
||||||
|
MSG *msg);
|
||||||
|
gboolean gdk_winpointer_get_message_info (GdkDisplay *display,
|
||||||
|
MSG *msg,
|
||||||
|
GdkDevice **device,
|
||||||
|
guint32 *time_);
|
||||||
|
void gdk_winpointer_interaction_ended (MSG *msg);
|
||||||
|
void gdk_winpointer_finalize_window (GdkWindow *window);
|
||||||
|
|
||||||
|
void _gdk_wintab_set_tablet_active (void);
|
||||||
|
gboolean gdk_wintab_input_events (GdkDisplay *display,
|
||||||
|
GdkEvent *event,
|
||||||
|
MSG *msg,
|
||||||
|
GdkWindow *window);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
@ -54,6 +54,7 @@
|
|||||||
#include "gdkglcontext-win32.h"
|
#include "gdkglcontext-win32.h"
|
||||||
#include "gdkdevicemanager-win32.h"
|
#include "gdkdevicemanager-win32.h"
|
||||||
#include "gdkdeviceprivate.h"
|
#include "gdkdeviceprivate.h"
|
||||||
|
#include "gdkdevice-virtual.h"
|
||||||
#include "gdkdevice-wintab.h"
|
#include "gdkdevice-wintab.h"
|
||||||
#include "gdkwin32dnd.h"
|
#include "gdkwin32dnd.h"
|
||||||
#include "gdkdisplay-win32.h"
|
#include "gdkdisplay-win32.h"
|
||||||
@ -61,6 +62,8 @@
|
|||||||
#include "gdkdndprivate.h"
|
#include "gdkdndprivate.h"
|
||||||
|
|
||||||
#include <windowsx.h>
|
#include <windowsx.h>
|
||||||
|
#include <tpcshrd.h>
|
||||||
|
#include "winpointer.h"
|
||||||
|
|
||||||
#ifdef G_WITH_CYGWIN
|
#ifdef G_WITH_CYGWIN
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
@ -153,6 +156,10 @@ static int both_shift_pressed[2]; /* to store keycodes for shift keys */
|
|||||||
static HHOOK keyboard_hook = NULL;
|
static HHOOK keyboard_hook = NULL;
|
||||||
static UINT aerosnap_message;
|
static UINT aerosnap_message;
|
||||||
|
|
||||||
|
static gboolean pen_touch_input;
|
||||||
|
static POINT pen_touch_cursor_position;
|
||||||
|
static LONG last_digitizer_time;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
track_mouse_event (DWORD dwFlags,
|
track_mouse_event (DWORD dwFlags,
|
||||||
HWND hwnd)
|
HWND hwnd)
|
||||||
@ -187,6 +194,18 @@ _gdk_win32_get_next_tick (gulong suggested_tick)
|
|||||||
return cur_tick = suggested_tick;
|
return cur_tick = suggested_tick;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
_gdk_win32_get_cursor_pos (LPPOINT lpPoint)
|
||||||
|
{
|
||||||
|
if (pen_touch_input)
|
||||||
|
{
|
||||||
|
*lpPoint = pen_touch_cursor_position;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return GetCursorPos (lpPoint);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
generate_focus_event (GdkDeviceManager *device_manager,
|
generate_focus_event (GdkDeviceManager *device_manager,
|
||||||
GdkWindow *window,
|
GdkWindow *window,
|
||||||
@ -228,6 +247,7 @@ generate_grab_broken_event (GdkDeviceManager *device_manager,
|
|||||||
{
|
{
|
||||||
device = GDK_DEVICE_MANAGER_WIN32 (device_manager)->core_pointer;
|
device = GDK_DEVICE_MANAGER_WIN32 (device_manager)->core_pointer;
|
||||||
source_device = GDK_DEVICE_MANAGER_WIN32 (device_manager)->system_pointer;
|
source_device = GDK_DEVICE_MANAGER_WIN32 (device_manager)->system_pointer;
|
||||||
|
_gdk_device_virtual_set_active (device, source_device);
|
||||||
}
|
}
|
||||||
|
|
||||||
event->grab_broken.window = window;
|
event->grab_broken.window = window;
|
||||||
@ -1237,6 +1257,7 @@ do_show_window (GdkWindow *window, gboolean hide_window)
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
send_crossing_event (GdkDisplay *display,
|
send_crossing_event (GdkDisplay *display,
|
||||||
|
GdkDevice *source_device,
|
||||||
GdkWindow *window,
|
GdkWindow *window,
|
||||||
GdkEventType type,
|
GdkEventType type,
|
||||||
GdkCrossingMode mode,
|
GdkCrossingMode mode,
|
||||||
@ -1271,7 +1292,7 @@ send_crossing_event (GdkDisplay *display,
|
|||||||
event = gdk_event_new (type);
|
event = gdk_event_new (type);
|
||||||
event->crossing.window = window;
|
event->crossing.window = window;
|
||||||
event->crossing.subwindow = subwindow;
|
event->crossing.subwindow = subwindow;
|
||||||
event->crossing.time = _gdk_win32_get_next_tick (time_);
|
event->crossing.time = time_;
|
||||||
event->crossing.x = pt.x / impl->window_scale;
|
event->crossing.x = pt.x / impl->window_scale;
|
||||||
event->crossing.y = pt.y / impl->window_scale;
|
event->crossing.y = pt.y / impl->window_scale;
|
||||||
event->crossing.x_root = (screen_pt->x + _gdk_offset_x) / impl->window_scale;
|
event->crossing.x_root = (screen_pt->x + _gdk_offset_x) / impl->window_scale;
|
||||||
@ -1283,9 +1304,11 @@ send_crossing_event (GdkDisplay *display,
|
|||||||
event->crossing.focus = FALSE;
|
event->crossing.focus = FALSE;
|
||||||
event->crossing.state = mask;
|
event->crossing.state = mask;
|
||||||
gdk_event_set_device (event, device_manager->core_pointer);
|
gdk_event_set_device (event, device_manager->core_pointer);
|
||||||
gdk_event_set_source_device (event, device_manager->system_pointer);
|
gdk_event_set_source_device (event, source_device);
|
||||||
gdk_event_set_seat (event, gdk_device_get_seat (device_manager->core_pointer));
|
gdk_event_set_seat (event, gdk_device_get_seat (device_manager->core_pointer));
|
||||||
|
|
||||||
|
_gdk_device_virtual_set_active (device_manager->core_pointer, source_device);
|
||||||
|
|
||||||
_gdk_win32_append_event (event);
|
_gdk_win32_append_event (event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1336,6 +1359,7 @@ find_common_ancestor (GdkWindow *win1,
|
|||||||
|
|
||||||
void
|
void
|
||||||
synthesize_crossing_events (GdkDisplay *display,
|
synthesize_crossing_events (GdkDisplay *display,
|
||||||
|
GdkDevice *source_device,
|
||||||
GdkWindow *src,
|
GdkWindow *src,
|
||||||
GdkWindow *dest,
|
GdkWindow *dest,
|
||||||
GdkCrossingMode mode,
|
GdkCrossingMode mode,
|
||||||
@ -1370,6 +1394,7 @@ synthesize_crossing_events (GdkDisplay *display,
|
|||||||
else
|
else
|
||||||
notify_type = GDK_NOTIFY_ANCESTOR;
|
notify_type = GDK_NOTIFY_ANCESTOR;
|
||||||
send_crossing_event (display,
|
send_crossing_event (display,
|
||||||
|
source_device,
|
||||||
a, GDK_LEAVE_NOTIFY,
|
a, GDK_LEAVE_NOTIFY,
|
||||||
mode,
|
mode,
|
||||||
notify_type,
|
notify_type,
|
||||||
@ -1389,6 +1414,7 @@ synthesize_crossing_events (GdkDisplay *display,
|
|||||||
while (win != c && win->window_type != GDK_WINDOW_ROOT)
|
while (win != c && win->window_type != GDK_WINDOW_ROOT)
|
||||||
{
|
{
|
||||||
send_crossing_event (display,
|
send_crossing_event (display,
|
||||||
|
source_device,
|
||||||
win, GDK_LEAVE_NOTIFY,
|
win, GDK_LEAVE_NOTIFY,
|
||||||
mode,
|
mode,
|
||||||
notify_type,
|
notify_type,
|
||||||
@ -1431,6 +1457,7 @@ synthesize_crossing_events (GdkDisplay *display,
|
|||||||
next = b;
|
next = b;
|
||||||
|
|
||||||
send_crossing_event (display,
|
send_crossing_event (display,
|
||||||
|
source_device,
|
||||||
win, GDK_ENTER_NOTIFY,
|
win, GDK_ENTER_NOTIFY,
|
||||||
mode,
|
mode,
|
||||||
notify_type,
|
notify_type,
|
||||||
@ -1450,6 +1477,7 @@ synthesize_crossing_events (GdkDisplay *display,
|
|||||||
notify_type = GDK_NOTIFY_INFERIOR;
|
notify_type = GDK_NOTIFY_INFERIOR;
|
||||||
|
|
||||||
send_crossing_event (display,
|
send_crossing_event (display,
|
||||||
|
source_device,
|
||||||
b, GDK_ENTER_NOTIFY,
|
b, GDK_ENTER_NOTIFY,
|
||||||
mode,
|
mode,
|
||||||
notify_type,
|
notify_type,
|
||||||
@ -1459,6 +1487,27 @@ synthesize_crossing_events (GdkDisplay *display,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
make_crossing_event (GdkDisplay *display,
|
||||||
|
GdkDevice *device,
|
||||||
|
GdkWindow *window,
|
||||||
|
POINT *screen_pt,
|
||||||
|
guint32 time_)
|
||||||
|
{
|
||||||
|
GDK_NOTE (EVENTS, g_print (" mouse_window %p -> %p",
|
||||||
|
mouse_window ? GDK_WINDOW_HWND (mouse_window) : NULL,
|
||||||
|
window ? GDK_WINDOW_HWND (window) : NULL));
|
||||||
|
synthesize_crossing_events (display,
|
||||||
|
device,
|
||||||
|
mouse_window, window,
|
||||||
|
GDK_CROSSING_NORMAL,
|
||||||
|
screen_pt,
|
||||||
|
0, /* TODO: Set right mask */
|
||||||
|
time_,
|
||||||
|
FALSE);
|
||||||
|
g_set_object (&mouse_window, window);
|
||||||
|
}
|
||||||
|
|
||||||
/* The check_extended flag controls whether to check if the windows want
|
/* The check_extended flag controls whether to check if the windows want
|
||||||
* events from extended input devices and if the message should be skipped
|
* events from extended input devices and if the message should be skipped
|
||||||
* because an extended input device is active
|
* because an extended input device is active
|
||||||
@ -1861,6 +1910,8 @@ generate_button_event (GdkEventType type,
|
|||||||
gdk_event_set_source_device (event, device_manager->system_pointer);
|
gdk_event_set_source_device (event, device_manager->system_pointer);
|
||||||
gdk_event_set_seat (event, gdk_device_get_seat (device_manager->core_pointer));
|
gdk_event_set_seat (event, gdk_device_get_seat (device_manager->core_pointer));
|
||||||
|
|
||||||
|
_gdk_device_virtual_set_active (device_manager->core_pointer, device_manager->system_pointer);
|
||||||
|
|
||||||
_gdk_win32_append_event (event);
|
_gdk_win32_append_event (event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2104,6 +2155,8 @@ gdk_event_translate (MSG *msg,
|
|||||||
GdkDeviceGrabInfo *pointer_grab = NULL;
|
GdkDeviceGrabInfo *pointer_grab = NULL;
|
||||||
GdkWindow *grab_window = NULL;
|
GdkWindow *grab_window = NULL;
|
||||||
|
|
||||||
|
crossing_cb_t crossing_cb = NULL;
|
||||||
|
|
||||||
gint button;
|
gint button;
|
||||||
GdkAtom target;
|
GdkAtom target;
|
||||||
|
|
||||||
@ -2600,6 +2653,8 @@ gdk_event_translate (MSG *msg,
|
|||||||
g_print (" (%d,%d)",
|
g_print (" (%d,%d)",
|
||||||
GET_X_LPARAM (msg->lParam), GET_Y_LPARAM (msg->lParam)));
|
GET_X_LPARAM (msg->lParam), GET_Y_LPARAM (msg->lParam)));
|
||||||
|
|
||||||
|
pen_touch_input = FALSE;
|
||||||
|
|
||||||
g_set_object (&window, find_window_for_mouse_event (window, msg));
|
g_set_object (&window, find_window_for_mouse_event (window, msg));
|
||||||
/* TODO_CSW?: there used to some synthesize and propagate */
|
/* TODO_CSW?: there used to some synthesize and propagate */
|
||||||
if (GDK_WINDOW_DESTROYED (window))
|
if (GDK_WINDOW_DESTROYED (window))
|
||||||
@ -2639,6 +2694,8 @@ gdk_event_translate (MSG *msg,
|
|||||||
g_print (" (%d,%d)",
|
g_print (" (%d,%d)",
|
||||||
GET_X_LPARAM (msg->lParam), GET_Y_LPARAM (msg->lParam)));
|
GET_X_LPARAM (msg->lParam), GET_Y_LPARAM (msg->lParam)));
|
||||||
|
|
||||||
|
pen_touch_input = FALSE;
|
||||||
|
|
||||||
g_set_object (&window, find_window_for_mouse_event (window, msg));
|
g_set_object (&window, find_window_for_mouse_event (window, msg));
|
||||||
|
|
||||||
if (pointer_grab != NULL && pointer_grab->implicit)
|
if (pointer_grab != NULL && pointer_grab->implicit)
|
||||||
@ -2665,11 +2722,12 @@ gdk_event_translate (MSG *msg,
|
|||||||
}
|
}
|
||||||
|
|
||||||
synthesize_crossing_events (display,
|
synthesize_crossing_events (display,
|
||||||
|
device_manager_win32->system_pointer,
|
||||||
native_window, new_window,
|
native_window, new_window,
|
||||||
GDK_CROSSING_UNGRAB,
|
GDK_CROSSING_UNGRAB,
|
||||||
&msg->pt,
|
&msg->pt,
|
||||||
0, /* TODO: Set right mask */
|
0, /* TODO: Set right mask */
|
||||||
msg->time,
|
_gdk_win32_get_next_tick (msg->time),
|
||||||
FALSE);
|
FALSE);
|
||||||
g_set_object (&mouse_window, new_window);
|
g_set_object (&mouse_window, new_window);
|
||||||
mouse_window_ignored_leave = NULL;
|
mouse_window_ignored_leave = NULL;
|
||||||
@ -2695,6 +2753,13 @@ gdk_event_translate (MSG *msg,
|
|||||||
(gpointer) msg->wParam,
|
(gpointer) msg->wParam,
|
||||||
GET_X_LPARAM (msg->lParam), GET_Y_LPARAM (msg->lParam)));
|
GET_X_LPARAM (msg->lParam), GET_Y_LPARAM (msg->lParam)));
|
||||||
|
|
||||||
|
if (_gdk_win32_tablet_input_api == GDK_WIN32_TABLET_INPUT_API_WINPOINTER &&
|
||||||
|
( (msg->time - last_digitizer_time) < 200 ||
|
||||||
|
-(msg->time - last_digitizer_time) < 200 ))
|
||||||
|
break;
|
||||||
|
|
||||||
|
pen_touch_input = FALSE;
|
||||||
|
|
||||||
new_window = window;
|
new_window = window;
|
||||||
|
|
||||||
if (pointer_grab != NULL)
|
if (pointer_grab != NULL)
|
||||||
@ -2722,15 +2787,16 @@ gdk_event_translate (MSG *msg,
|
|||||||
|
|
||||||
if (mouse_window != new_window)
|
if (mouse_window != new_window)
|
||||||
{
|
{
|
||||||
GDK_NOTE (EVENTS, g_print (" mouse_sinwod %p -> %p",
|
GDK_NOTE (EVENTS, g_print (" mouse_window %p -> %p",
|
||||||
mouse_window ? GDK_WINDOW_HWND (mouse_window) : NULL,
|
mouse_window ? GDK_WINDOW_HWND (mouse_window) : NULL,
|
||||||
new_window ? GDK_WINDOW_HWND (new_window) : NULL));
|
new_window ? GDK_WINDOW_HWND (new_window) : NULL));
|
||||||
synthesize_crossing_events (display,
|
synthesize_crossing_events (display,
|
||||||
|
device_manager_win32->system_pointer,
|
||||||
mouse_window, new_window,
|
mouse_window, new_window,
|
||||||
GDK_CROSSING_NORMAL,
|
GDK_CROSSING_NORMAL,
|
||||||
&msg->pt,
|
&msg->pt,
|
||||||
0, /* TODO: Set right mask */
|
0, /* TODO: Set right mask */
|
||||||
msg->time,
|
_gdk_win32_get_next_tick (msg->time),
|
||||||
FALSE);
|
FALSE);
|
||||||
g_set_object (&mouse_window, new_window);
|
g_set_object (&mouse_window, new_window);
|
||||||
mouse_window_ignored_leave = NULL;
|
mouse_window_ignored_leave = NULL;
|
||||||
@ -2782,6 +2848,8 @@ gdk_event_translate (MSG *msg,
|
|||||||
gdk_event_set_source_device (event, device_manager_win32->system_pointer);
|
gdk_event_set_source_device (event, device_manager_win32->system_pointer);
|
||||||
gdk_event_set_seat (event, gdk_device_get_seat (device_manager_win32->core_pointer));
|
gdk_event_set_seat (event, gdk_device_get_seat (device_manager_win32->core_pointer));
|
||||||
|
|
||||||
|
_gdk_device_virtual_set_active (device_manager_win32->core_pointer, device_manager_win32->system_pointer);
|
||||||
|
|
||||||
_gdk_win32_append_event (event);
|
_gdk_win32_append_event (event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2792,12 +2860,17 @@ gdk_event_translate (MSG *msg,
|
|||||||
GDK_NOTE (EVENTS,
|
GDK_NOTE (EVENTS,
|
||||||
g_print (" (%d,%d)",
|
g_print (" (%d,%d)",
|
||||||
GET_X_LPARAM (msg->lParam), GET_Y_LPARAM (msg->lParam)));
|
GET_X_LPARAM (msg->lParam), GET_Y_LPARAM (msg->lParam)));
|
||||||
|
|
||||||
|
pen_touch_input = FALSE;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_MOUSELEAVE:
|
case WM_MOUSELEAVE:
|
||||||
GDK_NOTE (EVENTS, g_print (" %d (%ld,%ld)",
|
GDK_NOTE (EVENTS, g_print (" %d (%ld,%ld)",
|
||||||
HIWORD (msg->wParam), msg->pt.x, msg->pt.y));
|
HIWORD (msg->wParam), msg->pt.x, msg->pt.y));
|
||||||
|
|
||||||
|
pen_touch_input = FALSE;
|
||||||
|
|
||||||
new_window = NULL;
|
new_window = NULL;
|
||||||
hwnd = WindowFromPoint (msg->pt);
|
hwnd = WindowFromPoint (msg->pt);
|
||||||
ignore_leave = FALSE;
|
ignore_leave = FALSE;
|
||||||
@ -2823,11 +2896,12 @@ gdk_event_translate (MSG *msg,
|
|||||||
|
|
||||||
if (!ignore_leave)
|
if (!ignore_leave)
|
||||||
synthesize_crossing_events (display,
|
synthesize_crossing_events (display,
|
||||||
|
device_manager_win32->system_pointer,
|
||||||
mouse_window, new_window,
|
mouse_window, new_window,
|
||||||
GDK_CROSSING_NORMAL,
|
GDK_CROSSING_NORMAL,
|
||||||
&msg->pt,
|
&msg->pt,
|
||||||
0, /* TODO: Set right mask */
|
0, /* TODO: Set right mask */
|
||||||
msg->time,
|
_gdk_win32_get_next_tick (msg->time),
|
||||||
FALSE);
|
FALSE);
|
||||||
g_set_object (&mouse_window, new_window);
|
g_set_object (&mouse_window, new_window);
|
||||||
mouse_window_ignored_leave = ignore_leave ? new_window : NULL;
|
mouse_window_ignored_leave = ignore_leave ? new_window : NULL;
|
||||||
@ -2836,6 +2910,215 @@ gdk_event_translate (MSG *msg,
|
|||||||
return_val = TRUE;
|
return_val = TRUE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WM_POINTERDOWN:
|
||||||
|
if (_gdk_win32_tablet_input_api != GDK_WIN32_TABLET_INPUT_API_WINPOINTER ||
|
||||||
|
gdk_winpointer_should_forward_message (msg))
|
||||||
|
{
|
||||||
|
return_val = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IS_POINTER_PRIMARY_WPARAM (msg->wParam))
|
||||||
|
{
|
||||||
|
current_root_x = pen_touch_cursor_position.x = GET_X_LPARAM (msg->lParam);
|
||||||
|
current_root_y = pen_touch_cursor_position.y = GET_Y_LPARAM (msg->lParam);
|
||||||
|
pen_touch_input = TRUE;
|
||||||
|
last_digitizer_time = msg->time;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pointer_grab != NULL &&
|
||||||
|
!pointer_grab->implicit &&
|
||||||
|
!pointer_grab->owner_events)
|
||||||
|
g_set_object (&window, pointer_grab->native_window);
|
||||||
|
|
||||||
|
if (IS_POINTER_PRIMARY_WPARAM (msg->wParam) && mouse_window != window)
|
||||||
|
crossing_cb = make_crossing_event;
|
||||||
|
|
||||||
|
gdk_winpointer_input_events (display, window, crossing_cb, msg);
|
||||||
|
|
||||||
|
*ret_valp = 0;
|
||||||
|
return_val = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_POINTERUP:
|
||||||
|
if (_gdk_win32_tablet_input_api != GDK_WIN32_TABLET_INPUT_API_WINPOINTER ||
|
||||||
|
gdk_winpointer_should_forward_message (msg))
|
||||||
|
{
|
||||||
|
return_val = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IS_POINTER_PRIMARY_WPARAM (msg->wParam))
|
||||||
|
{
|
||||||
|
current_root_x = pen_touch_cursor_position.x = GET_X_LPARAM (msg->lParam);
|
||||||
|
current_root_y = pen_touch_cursor_position.y = GET_Y_LPARAM (msg->lParam);
|
||||||
|
pen_touch_input = TRUE;
|
||||||
|
last_digitizer_time = msg->time;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pointer_grab != NULL &&
|
||||||
|
!pointer_grab->implicit &&
|
||||||
|
!pointer_grab->owner_events)
|
||||||
|
g_set_object (&window, pointer_grab->native_window);
|
||||||
|
|
||||||
|
gdk_winpointer_input_events (display, window, NULL, msg);
|
||||||
|
|
||||||
|
impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
|
||||||
|
if (impl->drag_move_resize_context.op != GDK_WIN32_DRAGOP_NONE)
|
||||||
|
{
|
||||||
|
gdk_win32_window_end_move_resize_drag (window);
|
||||||
|
}
|
||||||
|
|
||||||
|
*ret_valp = 0;
|
||||||
|
return_val = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_POINTERUPDATE:
|
||||||
|
if (_gdk_win32_tablet_input_api != GDK_WIN32_TABLET_INPUT_API_WINPOINTER ||
|
||||||
|
gdk_winpointer_should_forward_message (msg))
|
||||||
|
{
|
||||||
|
return_val = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IS_POINTER_PRIMARY_WPARAM (msg->wParam))
|
||||||
|
{
|
||||||
|
current_root_x = pen_touch_cursor_position.x = GET_X_LPARAM (msg->lParam);
|
||||||
|
current_root_y = pen_touch_cursor_position.y = GET_Y_LPARAM (msg->lParam);
|
||||||
|
pen_touch_input = TRUE;
|
||||||
|
last_digitizer_time = msg->time;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pointer_grab != NULL &&
|
||||||
|
!pointer_grab->implicit &&
|
||||||
|
!pointer_grab->owner_events)
|
||||||
|
g_set_object (&window, pointer_grab->native_window);
|
||||||
|
|
||||||
|
if (IS_POINTER_PRIMARY_WPARAM (msg->wParam) && mouse_window != window)
|
||||||
|
crossing_cb = make_crossing_event;
|
||||||
|
|
||||||
|
impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
|
||||||
|
|
||||||
|
if (impl->drag_move_resize_context.op != GDK_WIN32_DRAGOP_NONE)
|
||||||
|
{
|
||||||
|
gdk_win32_window_do_move_resize_drag (window, current_root_x, current_root_y);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gdk_winpointer_input_events (display, window, crossing_cb, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
*ret_valp = 0;
|
||||||
|
return_val = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_NCPOINTERUPDATE:
|
||||||
|
if (_gdk_win32_tablet_input_api != GDK_WIN32_TABLET_INPUT_API_WINPOINTER ||
|
||||||
|
gdk_winpointer_should_forward_message (msg))
|
||||||
|
{
|
||||||
|
return_val = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IS_POINTER_PRIMARY_WPARAM (msg->wParam))
|
||||||
|
{
|
||||||
|
current_root_x = pen_touch_cursor_position.x = GET_X_LPARAM (msg->lParam);
|
||||||
|
current_root_y = pen_touch_cursor_position.y = GET_Y_LPARAM (msg->lParam);
|
||||||
|
pen_touch_input = TRUE;
|
||||||
|
last_digitizer_time = msg->time;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IS_POINTER_PRIMARY_WPARAM (msg->wParam) &&
|
||||||
|
!IS_POINTER_INCONTACT_WPARAM (msg->wParam) &&
|
||||||
|
mouse_window != NULL)
|
||||||
|
{
|
||||||
|
GdkDevice *event_device = NULL;
|
||||||
|
guint32 event_time = 0;
|
||||||
|
|
||||||
|
if (gdk_winpointer_get_message_info (display, msg, &event_device, &event_time))
|
||||||
|
{
|
||||||
|
make_crossing_event(display,
|
||||||
|
event_device,
|
||||||
|
NULL,
|
||||||
|
&pen_touch_cursor_position,
|
||||||
|
event_time);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return_val = FALSE; /* forward to DefWindowProc */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_POINTERENTER:
|
||||||
|
if (_gdk_win32_tablet_input_api != GDK_WIN32_TABLET_INPUT_API_WINPOINTER ||
|
||||||
|
gdk_winpointer_should_forward_message (msg))
|
||||||
|
{
|
||||||
|
return_val = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IS_POINTER_PRIMARY_WPARAM (msg->wParam))
|
||||||
|
{
|
||||||
|
current_root_x = pen_touch_cursor_position.x = GET_X_LPARAM (msg->lParam);
|
||||||
|
current_root_y = pen_touch_cursor_position.y = GET_Y_LPARAM (msg->lParam);
|
||||||
|
pen_touch_input = TRUE;
|
||||||
|
last_digitizer_time = msg->time;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pointer_grab != NULL &&
|
||||||
|
!pointer_grab->implicit &&
|
||||||
|
!pointer_grab->owner_events)
|
||||||
|
g_set_object (&window, pointer_grab->native_window);
|
||||||
|
|
||||||
|
if (IS_POINTER_NEW_WPARAM (msg->wParam))
|
||||||
|
{
|
||||||
|
gdk_winpointer_input_events (display, window, NULL, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
*ret_valp = 0;
|
||||||
|
return_val = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_POINTERLEAVE:
|
||||||
|
if (_gdk_win32_tablet_input_api != GDK_WIN32_TABLET_INPUT_API_WINPOINTER ||
|
||||||
|
gdk_winpointer_should_forward_message (msg))
|
||||||
|
{
|
||||||
|
return_val = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IS_POINTER_PRIMARY_WPARAM (msg->wParam))
|
||||||
|
{
|
||||||
|
current_root_x = pen_touch_cursor_position.x = GET_X_LPARAM (msg->lParam);
|
||||||
|
current_root_y = pen_touch_cursor_position.y = GET_Y_LPARAM (msg->lParam);
|
||||||
|
pen_touch_input = TRUE;
|
||||||
|
last_digitizer_time = msg->time;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!IS_POINTER_INRANGE_WPARAM (msg->wParam))
|
||||||
|
{
|
||||||
|
gdk_winpointer_input_events (display, window, NULL, msg);
|
||||||
|
}
|
||||||
|
else if (IS_POINTER_PRIMARY_WPARAM (msg->wParam) && mouse_window != NULL)
|
||||||
|
{
|
||||||
|
GdkDevice *event_device = NULL;
|
||||||
|
guint32 event_time = 0;
|
||||||
|
|
||||||
|
if (gdk_winpointer_get_message_info (display, msg, &event_device, &event_time))
|
||||||
|
{
|
||||||
|
make_crossing_event(display,
|
||||||
|
event_device,
|
||||||
|
NULL,
|
||||||
|
&pen_touch_cursor_position,
|
||||||
|
event_time);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gdk_winpointer_interaction_ended (msg);
|
||||||
|
|
||||||
|
*ret_valp = 0;
|
||||||
|
return_val = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
case WM_MOUSEWHEEL:
|
case WM_MOUSEWHEEL:
|
||||||
case WM_MOUSEHWHEEL:
|
case WM_MOUSEHWHEEL:
|
||||||
GDK_NOTE (EVENTS, g_print (" %d", (short) HIWORD (msg->wParam)));
|
GDK_NOTE (EVENTS, g_print (" %d", (short) HIWORD (msg->wParam)));
|
||||||
@ -2914,6 +3197,8 @@ gdk_event_translate (MSG *msg,
|
|||||||
gdk_event_set_seat (event, gdk_device_get_seat (device_manager_win32->core_pointer));
|
gdk_event_set_seat (event, gdk_device_get_seat (device_manager_win32->core_pointer));
|
||||||
gdk_event_set_pointer_emulated (event, FALSE);
|
gdk_event_set_pointer_emulated (event, FALSE);
|
||||||
|
|
||||||
|
_gdk_device_virtual_set_active (device_manager_win32->core_pointer, device_manager_win32->system_pointer);
|
||||||
|
|
||||||
_gdk_win32_append_event (gdk_event_copy (event));
|
_gdk_win32_append_event (gdk_event_copy (event));
|
||||||
|
|
||||||
/* Append the discrete version too */
|
/* Append the discrete version too */
|
||||||
@ -2932,44 +3217,6 @@ gdk_event_translate (MSG *msg,
|
|||||||
return_val = TRUE;
|
return_val = TRUE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_HSCROLL:
|
|
||||||
/* Just print more debugging information, don't actually handle it. */
|
|
||||||
GDK_NOTE (EVENTS,
|
|
||||||
(g_print (" %s",
|
|
||||||
(LOWORD (msg->wParam) == SB_ENDSCROLL ? "ENDSCROLL" :
|
|
||||||
(LOWORD (msg->wParam) == SB_LEFT ? "LEFT" :
|
|
||||||
(LOWORD (msg->wParam) == SB_RIGHT ? "RIGHT" :
|
|
||||||
(LOWORD (msg->wParam) == SB_LINELEFT ? "LINELEFT" :
|
|
||||||
(LOWORD (msg->wParam) == SB_LINERIGHT ? "LINERIGHT" :
|
|
||||||
(LOWORD (msg->wParam) == SB_PAGELEFT ? "PAGELEFT" :
|
|
||||||
(LOWORD (msg->wParam) == SB_PAGERIGHT ? "PAGERIGHT" :
|
|
||||||
(LOWORD (msg->wParam) == SB_THUMBPOSITION ? "THUMBPOSITION" :
|
|
||||||
(LOWORD (msg->wParam) == SB_THUMBTRACK ? "THUMBTRACK" :
|
|
||||||
"???")))))))))),
|
|
||||||
(LOWORD (msg->wParam) == SB_THUMBPOSITION ||
|
|
||||||
LOWORD (msg->wParam) == SB_THUMBTRACK) ?
|
|
||||||
(g_print (" %d", HIWORD (msg->wParam)), 0) : 0));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_VSCROLL:
|
|
||||||
/* Just print more debugging information, don't actually handle it. */
|
|
||||||
GDK_NOTE (EVENTS,
|
|
||||||
(g_print (" %s",
|
|
||||||
(LOWORD (msg->wParam) == SB_ENDSCROLL ? "ENDSCROLL" :
|
|
||||||
(LOWORD (msg->wParam) == SB_BOTTOM ? "BOTTOM" :
|
|
||||||
(LOWORD (msg->wParam) == SB_TOP ? "TOP" :
|
|
||||||
(LOWORD (msg->wParam) == SB_LINEDOWN ? "LINDOWN" :
|
|
||||||
(LOWORD (msg->wParam) == SB_LINEUP ? "LINEUP" :
|
|
||||||
(LOWORD (msg->wParam) == SB_PAGEDOWN ? "PAGEDOWN" :
|
|
||||||
(LOWORD (msg->wParam) == SB_PAGEUP ? "PAGEUP" :
|
|
||||||
(LOWORD (msg->wParam) == SB_THUMBPOSITION ? "THUMBPOSITION" :
|
|
||||||
(LOWORD (msg->wParam) == SB_THUMBTRACK ? "THUMBTRACK" :
|
|
||||||
"???")))))))))),
|
|
||||||
(LOWORD (msg->wParam) == SB_THUMBPOSITION ||
|
|
||||||
LOWORD (msg->wParam) == SB_THUMBTRACK) ?
|
|
||||||
(g_print (" %d", HIWORD (msg->wParam)), 0) : 0));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_MOUSEACTIVATE:
|
case WM_MOUSEACTIVATE:
|
||||||
{
|
{
|
||||||
if (gdk_window_get_window_type (window) == GDK_WINDOW_TEMP
|
if (gdk_window_get_window_type (window) == GDK_WINDOW_TEMP
|
||||||
@ -2988,6 +3235,17 @@ gdk_event_translate (MSG *msg,
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WM_POINTERACTIVATE:
|
||||||
|
if (gdk_window_get_window_type (window) == GDK_WINDOW_TEMP ||
|
||||||
|
!window->accept_focus ||
|
||||||
|
_gdk_modal_blocked (gdk_window_get_toplevel (window)))
|
||||||
|
{
|
||||||
|
*ret_valp = PA_NOACTIVATE;
|
||||||
|
return_val = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
case WM_KILLFOCUS:
|
case WM_KILLFOCUS:
|
||||||
if (keyboard_grab != NULL &&
|
if (keyboard_grab != NULL &&
|
||||||
!GDK_WINDOW_DESTROYED (keyboard_grab->window) &&
|
!GDK_WINDOW_DESTROYED (keyboard_grab->window) &&
|
||||||
@ -3566,6 +3824,14 @@ gdk_event_translate (MSG *msg,
|
|||||||
return_val = TRUE;
|
return_val = TRUE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WM_DESTROY:
|
||||||
|
/* we have to call RemoveProp before the window is destroyed */
|
||||||
|
if (_gdk_win32_tablet_input_api == GDK_WIN32_TABLET_INPUT_API_WINPOINTER)
|
||||||
|
gdk_winpointer_finalize_window (window);
|
||||||
|
|
||||||
|
return_val = FALSE;
|
||||||
|
break;
|
||||||
|
|
||||||
case WM_NCDESTROY:
|
case WM_NCDESTROY:
|
||||||
if ((pointer_grab != NULL && pointer_grab -> window == window) ||
|
if ((pointer_grab != NULL && pointer_grab -> window == window) ||
|
||||||
(keyboard_grab && keyboard_grab -> window == window))
|
(keyboard_grab && keyboard_grab -> window == window))
|
||||||
@ -3735,7 +4001,10 @@ gdk_event_translate (MSG *msg,
|
|||||||
* instead
|
* instead
|
||||||
*/
|
*/
|
||||||
if (LOWORD(msg->wParam) != WA_INACTIVE)
|
if (LOWORD(msg->wParam) != WA_INACTIVE)
|
||||||
_gdk_input_set_tablet_active ();
|
{
|
||||||
|
if (_gdk_win32_tablet_input_api == GDK_WIN32_TABLET_INPUT_API_WINTAB)
|
||||||
|
_gdk_wintab_set_tablet_active ();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_ACTIVATEAPP:
|
case WM_ACTIVATEAPP:
|
||||||
@ -3775,17 +4044,30 @@ gdk_event_translate (MSG *msg,
|
|||||||
HIWORD (msg->lParam)));
|
HIWORD (msg->lParam)));
|
||||||
/* Fall through */
|
/* Fall through */
|
||||||
wintab:
|
wintab:
|
||||||
|
if (_gdk_win32_tablet_input_api != GDK_WIN32_TABLET_INPUT_API_WINTAB)
|
||||||
|
break;
|
||||||
|
|
||||||
event = gdk_event_new (GDK_NOTHING);
|
event = gdk_event_new (GDK_NOTHING);
|
||||||
event->any.window = window;
|
event->any.window = window;
|
||||||
g_object_ref (window);
|
g_object_ref (window);
|
||||||
|
|
||||||
if (gdk_input_other_event (display, event, msg, window))
|
if (gdk_wintab_input_events (display, event, msg, window))
|
||||||
_gdk_win32_append_event (event);
|
_gdk_win32_append_event (event);
|
||||||
else
|
else
|
||||||
gdk_event_free (event);
|
gdk_event_free (event);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WM_TABLET_QUERYSYSTEMGESTURESTATUS:
|
||||||
|
|
||||||
|
*ret_valp = TABLET_DISABLE_PRESSANDHOLD |
|
||||||
|
TABLET_DISABLE_PENTAPFEEDBACK |
|
||||||
|
TABLET_DISABLE_PENBARRELFEEDBACK |
|
||||||
|
TABLET_DISABLE_FLICKS |
|
||||||
|
TABLET_DISABLE_FLICKFALLBACKKEYS;
|
||||||
|
|
||||||
|
return_val = TRUE;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
@ -36,12 +36,12 @@ HINSTANCE _gdk_dll_hinstance;
|
|||||||
HINSTANCE _gdk_app_hmodule;
|
HINSTANCE _gdk_app_hmodule;
|
||||||
|
|
||||||
gint _gdk_input_ignore_core;
|
gint _gdk_input_ignore_core;
|
||||||
|
GdkWin32TabletInputAPI _gdk_win32_tablet_input_api;
|
||||||
|
|
||||||
HKL _gdk_input_locale;
|
HKL _gdk_input_locale;
|
||||||
gboolean _gdk_input_locale_is_ime = FALSE;
|
gboolean _gdk_input_locale_is_ime = FALSE;
|
||||||
UINT _gdk_input_codepage;
|
UINT _gdk_input_codepage;
|
||||||
|
|
||||||
gint _gdk_input_ignore_wintab = FALSE;
|
|
||||||
gint _gdk_max_colors = 0;
|
gint _gdk_max_colors = 0;
|
||||||
|
|
||||||
GdkWin32ModalOpKind _modal_operation_in_progress = GDK_WIN32_MODAL_OP_NONE;
|
GdkWin32ModalOpKind _modal_operation_in_progress = GDK_WIN32_MODAL_OP_NONE;
|
||||||
|
@ -49,23 +49,6 @@
|
|||||||
|
|
||||||
static gboolean gdk_synchronize = FALSE;
|
static gboolean gdk_synchronize = FALSE;
|
||||||
|
|
||||||
static gboolean dummy;
|
|
||||||
|
|
||||||
const GOptionEntry _gdk_windowing_args[] = {
|
|
||||||
{ "sync", 0, 0, G_OPTION_ARG_NONE, &gdk_synchronize,
|
|
||||||
/* Description of --sync in --help output */ N_("Don't batch GDI requests"), NULL },
|
|
||||||
{ "no-wintab", 0, 0, G_OPTION_ARG_NONE, &_gdk_input_ignore_wintab,
|
|
||||||
/* Description of --no-wintab in --help output */ N_("Don't use the Wintab API for tablet support"), NULL },
|
|
||||||
{ "ignore-wintab", 0, 0, G_OPTION_ARG_NONE, &_gdk_input_ignore_wintab,
|
|
||||||
/* Description of --ignore-wintab in --help output */ N_("Same as --no-wintab"), NULL },
|
|
||||||
{ "use-wintab", 0, 0, G_OPTION_ARG_NONE, &dummy,
|
|
||||||
/* Description of --use-wintab in --help output */ N_("Do use the Wintab API [default]"), NULL },
|
|
||||||
{ "max-colors", 0, 0, G_OPTION_ARG_INT, &_gdk_max_colors,
|
|
||||||
/* Description of --max-colors=COLORS in --help output */ N_("Size of the palette in 8 bit mode"),
|
|
||||||
/* Placeholder in --max-colors=COLORS in --help output */ N_("COLORS") },
|
|
||||||
{ NULL }
|
|
||||||
};
|
|
||||||
|
|
||||||
BOOL WINAPI
|
BOOL WINAPI
|
||||||
DllMain (HINSTANCE hinstDLL,
|
DllMain (HINSTANCE hinstDLL,
|
||||||
DWORD dwReason,
|
DWORD dwReason,
|
||||||
@ -81,11 +64,6 @@ _gdk_win32_windowing_init (void)
|
|||||||
{
|
{
|
||||||
gchar buf[10];
|
gchar buf[10];
|
||||||
|
|
||||||
if (getenv ("GDK_IGNORE_WINTAB") != NULL)
|
|
||||||
_gdk_input_ignore_wintab = TRUE;
|
|
||||||
else if (getenv ("GDK_USE_WINTAB") != NULL)
|
|
||||||
_gdk_input_ignore_wintab = FALSE;
|
|
||||||
|
|
||||||
if (gdk_synchronize)
|
if (gdk_synchronize)
|
||||||
GdiSetBatchLimit (1);
|
GdiSetBatchLimit (1);
|
||||||
|
|
||||||
|
@ -163,10 +163,18 @@ struct _GdkColormapPrivateWin32
|
|||||||
GdkColorInfo *info;
|
GdkColorInfo *info;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
GDK_WIN32_TABLET_INPUT_API_NONE = 0,
|
||||||
|
GDK_WIN32_TABLET_INPUT_API_WINTAB,
|
||||||
|
GDK_WIN32_TABLET_INPUT_API_WINPOINTER
|
||||||
|
} GdkWin32TabletInputAPI;
|
||||||
|
|
||||||
GType _gdk_gc_win32_get_type (void);
|
GType _gdk_gc_win32_get_type (void);
|
||||||
|
|
||||||
gulong _gdk_win32_get_next_tick (gulong suggested_tick);
|
gulong _gdk_win32_get_next_tick (gulong suggested_tick);
|
||||||
|
|
||||||
|
BOOL _gdk_win32_get_cursor_pos (LPPOINT lpPoint);
|
||||||
|
|
||||||
void _gdk_window_init_position (GdkWindow *window);
|
void _gdk_window_init_position (GdkWindow *window);
|
||||||
void _gdk_window_move_resize_child (GdkWindow *window,
|
void _gdk_window_move_resize_child (GdkWindow *window,
|
||||||
gint x,
|
gint x,
|
||||||
@ -262,6 +270,8 @@ void _gdk_other_api_failed (const gchar *where,
|
|||||||
#define WIN32_GDI_FAILED(api) WIN32_API_FAILED (api)
|
#define WIN32_GDI_FAILED(api) WIN32_API_FAILED (api)
|
||||||
#define OTHER_API_FAILED(api) _gdk_other_api_failed (G_STRLOC, api)
|
#define OTHER_API_FAILED(api) _gdk_other_api_failed (G_STRLOC, api)
|
||||||
|
|
||||||
|
#define WIN32_API_FAILED_LOG_ONCE(api) G_STMT_START { static gboolean logged = 0; if (!logged) { _gdk_win32_api_failed (G_STRLOC , api); logged = 1; }} G_STMT_END
|
||||||
|
|
||||||
/* These two macros call a GDI or other Win32 API and if the return
|
/* These two macros call a GDI or other Win32 API and if the return
|
||||||
* value is zero or NULL, print a warning message. The majority of GDI
|
* value is zero or NULL, print a warning message. The majority of GDI
|
||||||
* calls return zero or NULL on failure. The value of the macros is nonzero
|
* calls return zero or NULL on failure. The value of the macros is nonzero
|
||||||
@ -287,6 +297,7 @@ extern HINSTANCE _gdk_dll_hinstance;
|
|||||||
extern HINSTANCE _gdk_app_hmodule;
|
extern HINSTANCE _gdk_app_hmodule;
|
||||||
|
|
||||||
extern gint _gdk_input_ignore_core;
|
extern gint _gdk_input_ignore_core;
|
||||||
|
extern GdkWin32TabletInputAPI _gdk_win32_tablet_input_api;
|
||||||
|
|
||||||
/* These are thread specific, but GDK/win32 works OK only when invoked
|
/* These are thread specific, but GDK/win32 works OK only when invoked
|
||||||
* from a single thread anyway.
|
* from a single thread anyway.
|
||||||
@ -326,7 +337,6 @@ void _gdk_win32_end_modal_call (GdkWin32ModalOpKind kind);
|
|||||||
|
|
||||||
|
|
||||||
/* Options */
|
/* Options */
|
||||||
extern gboolean _gdk_input_ignore_wintab;
|
|
||||||
extern gint _gdk_max_colors;
|
extern gint _gdk_max_colors;
|
||||||
|
|
||||||
#define GDK_WIN32_COLORMAP_DATA(cmap) ((GdkColormapPrivateWin32 *) GDK_COLORMAP (cmap)->windowing_data)
|
#define GDK_WIN32_COLORMAP_DATA(cmap) ((GdkColormapPrivateWin32 *) GDK_COLORMAP (cmap)->windowing_data)
|
||||||
|
@ -975,6 +975,9 @@ _gdk_win32_display_create_window_impl (GdkDisplay *display,
|
|||||||
if (attributes_mask & GDK_WA_CURSOR)
|
if (attributes_mask & GDK_WA_CURSOR)
|
||||||
gdk_window_set_cursor (window, attributes->cursor);
|
gdk_window_set_cursor (window, attributes->cursor);
|
||||||
|
|
||||||
|
if (_gdk_win32_tablet_input_api == GDK_WIN32_TABLET_INPUT_API_WINPOINTER)
|
||||||
|
gdk_winpointer_initialize_window (window);
|
||||||
|
|
||||||
_gdk_win32_window_enable_transparency (window);
|
_gdk_win32_window_enable_transparency (window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,9 +30,13 @@ all: \
|
|||||||
gdk-win32.lib \
|
gdk-win32.lib \
|
||||||
gdk.res
|
gdk.res
|
||||||
|
|
||||||
|
gdk_win32_DEPS = \
|
||||||
|
hid.lib
|
||||||
|
|
||||||
gdk_win32_OBJECTS = \
|
gdk_win32_OBJECTS = \
|
||||||
gdkcursor-win32.obj \
|
gdkcursor-win32.obj \
|
||||||
gdkdevice-win32.obj \
|
gdkdevice-win32.obj \
|
||||||
|
gdkdevice-winpointer.obj \
|
||||||
gdkdevice-wintab.obj \
|
gdkdevice-wintab.obj \
|
||||||
gdkdevicemanager-win32.obj \
|
gdkdevicemanager-win32.obj \
|
||||||
gdkdnd-win32.obj \
|
gdkdnd-win32.obj \
|
||||||
@ -61,7 +65,7 @@ gdk.res : rc\gdk.rc
|
|||||||
rc -DBUILDNUMBER=0 -r -fo gdk.res rc\gdk.rc
|
rc -DBUILDNUMBER=0 -r -fo gdk.res rc\gdk.rc
|
||||||
|
|
||||||
gdk-win32.lib : $(gdk_win32_OBJECTS)
|
gdk-win32.lib : $(gdk_win32_OBJECTS)
|
||||||
lib -out:gdk-win32.lib $(gdk_win32_OBJECTS)
|
lib -out:gdk-win32.lib $(gdk_win32_DEPS) $(gdk_win32_OBJECTS)
|
||||||
|
|
||||||
clean::
|
clean::
|
||||||
del *.obj
|
del *.obj
|
||||||
|
@ -3,6 +3,7 @@ gdk_win32_sources = files(
|
|||||||
'gdkdevicemanager-win32.c',
|
'gdkdevicemanager-win32.c',
|
||||||
'gdkdevice-virtual.c',
|
'gdkdevice-virtual.c',
|
||||||
'gdkdevice-win32.c',
|
'gdkdevice-win32.c',
|
||||||
|
'gdkdevice-winpointer.c',
|
||||||
'gdkdevice-wintab.c',
|
'gdkdevice-wintab.c',
|
||||||
'gdkdisplay-win32.c',
|
'gdkdisplay-win32.c',
|
||||||
'gdkdisplaymanager-win32.c',
|
'gdkdisplaymanager-win32.c',
|
||||||
@ -47,7 +48,8 @@ install_headers(gdk_win32_public_headers, subdir: 'gtk-3.0/gdk/win32')
|
|||||||
install_headers('gdkwin32.h', subdir: 'gtk-3.0/gdk')
|
install_headers('gdkwin32.h', subdir: 'gtk-3.0/gdk')
|
||||||
|
|
||||||
gdk_win32_deps = [ # FIXME
|
gdk_win32_deps = [ # FIXME
|
||||||
pangowin32_dep
|
pangowin32_dep,
|
||||||
|
meson.get_compiler('c').find_library('hid')
|
||||||
]
|
]
|
||||||
|
|
||||||
libgdk_win32 = static_library('gdk-win32',
|
libgdk_win32 = static_library('gdk-win32',
|
||||||
|
320
gdk/win32/winpointer.h
Normal file
320
gdk/win32/winpointer.h
Normal file
@ -0,0 +1,320 @@
|
|||||||
|
/* GDK - The GIMP Drawing Kit
|
||||||
|
* Copyright (C) 2021 the GTK team
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* This code is derived from portions provided by the mingw-w64 project
|
||||||
|
* (mingw-w64.org), originally licensed under the Zope Public License
|
||||||
|
* (ZPL) version 2.1, with modifications made on May 12, 2021.
|
||||||
|
* Legal notice of the Zope Public License version 2.1 follows:
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions in source code must retain the accompanying copyright
|
||||||
|
* notice, this list of conditions, and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the accompanying
|
||||||
|
* copyright notice, this list of conditions, and the following disclaimer
|
||||||
|
* in the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* 3. Names of the copyright holders must not be used to endorse or promote
|
||||||
|
* products derived from this software without prior written permission
|
||||||
|
* from the copyright holders.
|
||||||
|
* 4. The right to distribute this software or to use it for any purpose does
|
||||||
|
* not give you the right to use Servicemarks (sm) or Trademarks (tm) of
|
||||||
|
* the copyright holders. Use of them is covered by separate agreement
|
||||||
|
* with the copyright holders.
|
||||||
|
* 5. If any files are modified, you must cause the modified files to carry
|
||||||
|
* prominent notices stating that you changed the files and the date of
|
||||||
|
* any change.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef POINTER_FLAG_NONE
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <tchar.h>
|
||||||
|
|
||||||
|
#define WM_POINTERDEVICECHANGE 0x238
|
||||||
|
#define WM_POINTERDEVICEINRANGE 0x239
|
||||||
|
#define WM_POINTERDEVICEOUTOFRANGE 0x23a
|
||||||
|
|
||||||
|
#define WM_NCPOINTERUPDATE 0x0241
|
||||||
|
#define WM_NCPOINTERDOWN 0x0242
|
||||||
|
#define WM_NCPOINTERUP 0x0243
|
||||||
|
#define WM_POINTERUPDATE 0x0245
|
||||||
|
#define WM_POINTERDOWN 0x0246
|
||||||
|
#define WM_POINTERUP 0x0247
|
||||||
|
#define WM_POINTERENTER 0x0249
|
||||||
|
#define WM_POINTERLEAVE 0x024a
|
||||||
|
#define WM_POINTERACTIVATE 0x024b
|
||||||
|
#define WM_POINTERCAPTURECHANGED 0x024c
|
||||||
|
#define WM_TOUCHHITTESTING 0x024d
|
||||||
|
#define WM_POINTERWHEEL 0x024e
|
||||||
|
#define WM_POINTERHWHEEL 0x024f
|
||||||
|
#define DM_POINTERHITTEST 0x0250
|
||||||
|
#define WM_POINTERROUTEDTO 0x0251
|
||||||
|
#define WM_POINTERROUTEDAWAY 0x0252
|
||||||
|
#define WM_POINTERROUTEDRELEASED 0x0253
|
||||||
|
|
||||||
|
#define POINTER_FLAG_NONE 0x00000000
|
||||||
|
#define POINTER_FLAG_NEW 0x00000001
|
||||||
|
#define POINTER_FLAG_INRANGE 0x00000002
|
||||||
|
#define POINTER_FLAG_INCONTACT 0x00000004
|
||||||
|
#define POINTER_FLAG_FIRSTBUTTON 0x00000010
|
||||||
|
#define POINTER_FLAG_SECONDBUTTON 0x00000020
|
||||||
|
#define POINTER_FLAG_THIRDBUTTON 0x00000040
|
||||||
|
#define POINTER_FLAG_FOURTHBUTTON 0x00000080
|
||||||
|
#define POINTER_FLAG_FIFTHBUTTON 0x00000100
|
||||||
|
#define POINTER_FLAG_PRIMARY 0x00002000
|
||||||
|
#define POINTER_FLAG_CONFIDENCE 0x00004000
|
||||||
|
#define POINTER_FLAG_CANCELED 0x00008000
|
||||||
|
#define POINTER_FLAG_DOWN 0x00010000
|
||||||
|
#define POINTER_FLAG_UPDATE 0x00020000
|
||||||
|
#define POINTER_FLAG_UP 0x00040000
|
||||||
|
#define POINTER_FLAG_WHEEL 0x00080000
|
||||||
|
#define POINTER_FLAG_HWHEEL 0x00100000
|
||||||
|
#define POINTER_FLAG_CAPTURECHANGED 0x00200000
|
||||||
|
#define POINTER_FLAG_HASTRANSFORM 0x00400000
|
||||||
|
|
||||||
|
#define POINTER_MOD_SHIFT (0x0004)
|
||||||
|
#define POINTER_MOD_CTRL (0x0008)
|
||||||
|
|
||||||
|
#define TOUCH_FLAG_NONE 0x00000000
|
||||||
|
|
||||||
|
#define TOUCH_MASK_NONE 0x00000000
|
||||||
|
#define TOUCH_MASK_CONTACTAREA 0x00000001
|
||||||
|
#define TOUCH_MASK_ORIENTATION 0x00000002
|
||||||
|
#define TOUCH_MASK_PRESSURE 0x00000004
|
||||||
|
|
||||||
|
#define PEN_FLAG_NONE 0x00000000
|
||||||
|
#define PEN_FLAG_BARREL 0x00000001
|
||||||
|
#define PEN_FLAG_INVERTED 0x00000002
|
||||||
|
#define PEN_FLAG_ERASER 0x00000004
|
||||||
|
|
||||||
|
#define PEN_MASK_NONE 0x00000000
|
||||||
|
#define PEN_MASK_PRESSURE 0x00000001
|
||||||
|
#define PEN_MASK_ROTATION 0x00000002
|
||||||
|
#define PEN_MASK_TILT_X 0x00000004
|
||||||
|
#define PEN_MASK_TILT_Y 0x00000008
|
||||||
|
|
||||||
|
#define POINTER_MESSAGE_FLAG_NEW 0x00000001
|
||||||
|
#define POINTER_MESSAGE_FLAG_INRANGE 0x00000002
|
||||||
|
#define POINTER_MESSAGE_FLAG_INCONTACT 0x00000004
|
||||||
|
#define POINTER_MESSAGE_FLAG_FIRSTBUTTON 0x00000010
|
||||||
|
#define POINTER_MESSAGE_FLAG_SECONDBUTTON 0x00000020
|
||||||
|
#define POINTER_MESSAGE_FLAG_THIRDBUTTON 0x00000040
|
||||||
|
#define POINTER_MESSAGE_FLAG_FOURTHBUTTON 0x00000080
|
||||||
|
#define POINTER_MESSAGE_FLAG_FIFTHBUTTON 0x00000100
|
||||||
|
#define POINTER_MESSAGE_FLAG_PRIMARY 0x00002000
|
||||||
|
#define POINTER_MESSAGE_FLAG_CONFIDENCE 0x00004000
|
||||||
|
#define POINTER_MESSAGE_FLAG_CANCELED 0x00008000
|
||||||
|
|
||||||
|
#define GET_POINTERID_WPARAM(wParam) (LOWORD (wParam))
|
||||||
|
#define IS_POINTER_FLAG_SET_WPARAM(wParam, flag) (((DWORD)HIWORD (wParam) &(flag)) == (flag))
|
||||||
|
#define IS_POINTER_NEW_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_NEW)
|
||||||
|
#define IS_POINTER_INRANGE_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_INRANGE)
|
||||||
|
#define IS_POINTER_INCONTACT_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_INCONTACT)
|
||||||
|
#define IS_POINTER_FIRSTBUTTON_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_FIRSTBUTTON)
|
||||||
|
#define IS_POINTER_SECONDBUTTON_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_SECONDBUTTON)
|
||||||
|
#define IS_POINTER_THIRDBUTTON_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_THIRDBUTTON)
|
||||||
|
#define IS_POINTER_FOURTHBUTTON_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_FOURTHBUTTON)
|
||||||
|
#define IS_POINTER_FIFTHBUTTON_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_FIFTHBUTTON)
|
||||||
|
#define IS_POINTER_PRIMARY_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_PRIMARY)
|
||||||
|
#define HAS_POINTER_CONFIDENCE_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_CONFIDENCE)
|
||||||
|
#define IS_POINTER_CANCELED_WPARAM(wParam) IS_POINTER_FLAG_SET_WPARAM (wParam, POINTER_MESSAGE_FLAG_CANCELED)
|
||||||
|
|
||||||
|
#define PA_ACTIVATE MA_ACTIVATE
|
||||||
|
#define PA_NOACTIVATE MA_NOACTIVATE
|
||||||
|
|
||||||
|
typedef DWORD POINTER_INPUT_TYPE;
|
||||||
|
typedef UINT32 POINTER_FLAGS;
|
||||||
|
typedef UINT32 TOUCH_FLAGS;
|
||||||
|
typedef UINT32 TOUCH_MASK;
|
||||||
|
typedef UINT32 PEN_FLAGS;
|
||||||
|
typedef UINT32 PEN_MASK;
|
||||||
|
|
||||||
|
enum tagPOINTER_INPUT_TYPE {
|
||||||
|
PT_POINTER = 0x00000001,
|
||||||
|
PT_TOUCH = 0x00000002,
|
||||||
|
PT_PEN = 0x00000003,
|
||||||
|
PT_MOUSE = 0x00000004,
|
||||||
|
PT_TOUCHPAD = 0x00000005
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef enum tagFEEDBACK_TYPE {
|
||||||
|
FEEDBACK_TOUCH_CONTACTVISUALIZATION = 1,
|
||||||
|
FEEDBACK_PEN_BARRELVISUALIZATION = 2,
|
||||||
|
FEEDBACK_PEN_TAP = 3,
|
||||||
|
FEEDBACK_PEN_DOUBLETAP = 4,
|
||||||
|
FEEDBACK_PEN_PRESSANDHOLD = 5,
|
||||||
|
FEEDBACK_PEN_RIGHTTAP = 6,
|
||||||
|
FEEDBACK_TOUCH_TAP = 7,
|
||||||
|
FEEDBACK_TOUCH_DOUBLETAP = 8,
|
||||||
|
FEEDBACK_TOUCH_PRESSANDHOLD = 9,
|
||||||
|
FEEDBACK_TOUCH_RIGHTTAP = 10,
|
||||||
|
FEEDBACK_GESTURE_PRESSANDTAP = 11,
|
||||||
|
FEEDBACK_MAX = 0xffffffff
|
||||||
|
} FEEDBACK_TYPE;
|
||||||
|
|
||||||
|
typedef enum tagPOINTER_BUTTON_CHANGE_TYPE {
|
||||||
|
POINTER_CHANGE_NONE,
|
||||||
|
POINTER_CHANGE_FIRSTBUTTON_DOWN,
|
||||||
|
POINTER_CHANGE_FIRSTBUTTON_UP,
|
||||||
|
POINTER_CHANGE_SECONDBUTTON_DOWN,
|
||||||
|
POINTER_CHANGE_SECONDBUTTON_UP,
|
||||||
|
POINTER_CHANGE_THIRDBUTTON_DOWN,
|
||||||
|
POINTER_CHANGE_THIRDBUTTON_UP,
|
||||||
|
POINTER_CHANGE_FOURTHBUTTON_DOWN,
|
||||||
|
POINTER_CHANGE_FOURTHBUTTON_UP,
|
||||||
|
POINTER_CHANGE_FIFTHBUTTON_DOWN,
|
||||||
|
POINTER_CHANGE_FIFTHBUTTON_UP,
|
||||||
|
} POINTER_BUTTON_CHANGE_TYPE;
|
||||||
|
|
||||||
|
typedef struct tagPOINTER_INFO {
|
||||||
|
POINTER_INPUT_TYPE pointerType;
|
||||||
|
UINT32 pointerId;
|
||||||
|
UINT32 frameId;
|
||||||
|
POINTER_FLAGS pointerFlags;
|
||||||
|
HANDLE sourceDevice;
|
||||||
|
HWND hwndTarget;
|
||||||
|
POINT ptPixelLocation;
|
||||||
|
POINT ptHimetricLocation;
|
||||||
|
POINT ptPixelLocationRaw;
|
||||||
|
POINT ptHimetricLocationRaw;
|
||||||
|
DWORD dwTime;
|
||||||
|
UINT32 historyCount;
|
||||||
|
INT32 InputData;
|
||||||
|
DWORD dwKeyStates;
|
||||||
|
UINT64 PerformanceCount;
|
||||||
|
POINTER_BUTTON_CHANGE_TYPE ButtonChangeType;
|
||||||
|
} POINTER_INFO;
|
||||||
|
|
||||||
|
typedef struct tagPOINTER_TOUCH_INFO {
|
||||||
|
POINTER_INFO pointerInfo;
|
||||||
|
TOUCH_FLAGS touchFlags;
|
||||||
|
TOUCH_MASK touchMask;
|
||||||
|
RECT rcContact;
|
||||||
|
RECT rcContactRaw;
|
||||||
|
UINT32 orientation;
|
||||||
|
UINT32 pressure;
|
||||||
|
} POINTER_TOUCH_INFO;
|
||||||
|
|
||||||
|
typedef struct tagPOINTER_PEN_INFO {
|
||||||
|
POINTER_INFO pointerInfo;
|
||||||
|
PEN_FLAGS penFlags;
|
||||||
|
PEN_MASK penMask;
|
||||||
|
UINT32 pressure;
|
||||||
|
UINT32 rotation;
|
||||||
|
INT32 tiltX;
|
||||||
|
INT32 tiltY;
|
||||||
|
} POINTER_PEN_INFO;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
POINTER_FEEDBACK_DEFAULT = 1,
|
||||||
|
POINTER_FEEDBACK_INDIRECT = 2,
|
||||||
|
POINTER_FEEDBACK_NONE = 3
|
||||||
|
} POINTER_FEEDBACK_MODE;
|
||||||
|
|
||||||
|
typedef struct tagUSAGE_PROPERTIES {
|
||||||
|
USHORT level;
|
||||||
|
USHORT page;
|
||||||
|
USHORT usage;
|
||||||
|
INT32 logicalMinimum;
|
||||||
|
INT32 logicalMaximum;
|
||||||
|
USHORT unit;
|
||||||
|
USHORT exponent;
|
||||||
|
BYTE count;
|
||||||
|
INT32 physicalMinimum;
|
||||||
|
INT32 physicalMaximum;
|
||||||
|
} USAGE_PROPERTIES, *PUSAGE_PROPERTIES;
|
||||||
|
|
||||||
|
typedef struct tagPOINTER_TYPE_INFO {
|
||||||
|
POINTER_INPUT_TYPE type;
|
||||||
|
union {
|
||||||
|
POINTER_TOUCH_INFO touchInfo;
|
||||||
|
POINTER_PEN_INFO penInfo;
|
||||||
|
} DUMMYUNIONNAME;
|
||||||
|
} POINTER_TYPE_INFO, *PPOINTER_TYPE_INFO;
|
||||||
|
|
||||||
|
#define POINTER_DEVICE_PRODUCT_STRING_MAX 520
|
||||||
|
#define PDC_ARRIVAL 0x001
|
||||||
|
#define PDC_REMOVAL 0x002
|
||||||
|
#define PDC_ORIENTATION_0 0x004
|
||||||
|
#define PDC_ORIENTATION_90 0x008
|
||||||
|
#define PDC_ORIENTATION_180 0x010
|
||||||
|
#define PDC_ORIENTATION_270 0x020
|
||||||
|
#define PDC_MODE_DEFAULT 0x040
|
||||||
|
#define PDC_MODE_CENTERED 0x080
|
||||||
|
#define PDC_MAPPING_CHANGE 0x100
|
||||||
|
#define PDC_RESOLUTION 0x200
|
||||||
|
#define PDC_ORIGIN 0x400
|
||||||
|
#define PDC_MODE_ASPECTRATIOPRESERVED 0x800
|
||||||
|
|
||||||
|
typedef enum tagPOINTER_DEVICE_TYPE {
|
||||||
|
POINTER_DEVICE_TYPE_INTEGRATED_PEN = 0x00000001,
|
||||||
|
POINTER_DEVICE_TYPE_EXTERNAL_PEN = 0x00000002,
|
||||||
|
POINTER_DEVICE_TYPE_TOUCH = 0x00000003,
|
||||||
|
POINTER_DEVICE_TYPE_TOUCH_PAD = 0x00000004,
|
||||||
|
POINTER_DEVICE_TYPE_MAX = 0xffffffff
|
||||||
|
} POINTER_DEVICE_TYPE;
|
||||||
|
|
||||||
|
typedef struct tagPOINTER_DEVICE_INFO {
|
||||||
|
DWORD displayOrientation;
|
||||||
|
HANDLE device;
|
||||||
|
POINTER_DEVICE_TYPE pointerDeviceType;
|
||||||
|
HMONITOR monitor;
|
||||||
|
ULONG startingCursorId;
|
||||||
|
USHORT maxActiveContacts;
|
||||||
|
WCHAR productString[POINTER_DEVICE_PRODUCT_STRING_MAX];
|
||||||
|
} POINTER_DEVICE_INFO;
|
||||||
|
|
||||||
|
typedef struct tagPOINTER_DEVICE_PROPERTY {
|
||||||
|
INT32 logicalMin;
|
||||||
|
INT32 logicalMax;
|
||||||
|
INT32 physicalMin;
|
||||||
|
INT32 physicalMax;
|
||||||
|
UINT32 unit;
|
||||||
|
UINT32 unitExponent;
|
||||||
|
USHORT usagePageId;
|
||||||
|
USHORT usageId;
|
||||||
|
} POINTER_DEVICE_PROPERTY;
|
||||||
|
|
||||||
|
typedef enum tagPOINTER_DEVICE_CURSOR_TYPE {
|
||||||
|
POINTER_DEVICE_CURSOR_TYPE_UNKNOWN = 0x00000000,
|
||||||
|
POINTER_DEVICE_CURSOR_TYPE_TIP = 0x00000001,
|
||||||
|
POINTER_DEVICE_CURSOR_TYPE_ERASER = 0x00000002,
|
||||||
|
POINTER_DEVICE_CURSOR_TYPE_MAX = 0xffffffff
|
||||||
|
} POINTER_DEVICE_CURSOR_TYPE;
|
||||||
|
|
||||||
|
typedef struct tagPOINTER_DEVICE_CURSOR_INFO {
|
||||||
|
UINT32 cursorId;
|
||||||
|
POINTER_DEVICE_CURSOR_TYPE cursor;
|
||||||
|
} POINTER_DEVICE_CURSOR_INFO;
|
||||||
|
|
||||||
|
#endif /* POINTER_FLAG_NONE */
|
||||||
|
|
||||||
|
#if WINVER < 0x0601
|
||||||
|
|
||||||
|
typedef struct tagGESTURECONFIG {
|
||||||
|
DWORD dwID;
|
||||||
|
DWORD dwWant;
|
||||||
|
DWORD dwBlock;
|
||||||
|
} GESTURECONFIG,*PGESTURECONFIG;
|
||||||
|
|
||||||
|
#endif /* WINVER < 0x0601 */
|
||||||
|
|
||||||
|
#ifndef MICROSOFT_TABLETPENSERVICE_PROPERTY
|
||||||
|
#define MICROSOFT_TABLETPENSERVICE_PROPERTY _T("MicrosoftTabletPenServiceProperty")
|
||||||
|
#endif
|
@ -15,7 +15,7 @@
|
|||||||
<GtkDefines>GTK_COMPILATION;G_LOG_DOMAIN="Gtk";GTK_HOST="$(GtkHostMachine)-pc-vs$(VSVer)";GTK_PRINT_BACKENDS="file";GTK_PRINT_BACKEND_ENABLE_UNSUPPORTED;$(GtkIncludedImmodulesDefines);GTK_LIBDIR="$(GtkDummyPrefix)/lib";GTK_DATADIR="$(GtkDummyPrefix)/share";GTK_DATA_PREFIX="$(GtkDummyPrefix)";GTK_SYSCONFDIR="$(GtkDummyPrefix)/etc";MULTIPRESS_CONFDIR="$(GtkDummyPrefix)/etc/gtk-$(ApiVersion)";MULTIPRESS_LOCALEDIR="$(GtkDummyPrefix)/share/locale";GTK_VERSION="$(GtkVersion)/etc";GTK_BINARY_VERSION="$(GtkBinaryVersion)/etc";GDK_DISABLE_DEPRECATED;ISOLATION_AWARE_ENABLED</GtkDefines>
|
<GtkDefines>GTK_COMPILATION;G_LOG_DOMAIN="Gtk";GTK_HOST="$(GtkHostMachine)-pc-vs$(VSVer)";GTK_PRINT_BACKENDS="file";GTK_PRINT_BACKEND_ENABLE_UNSUPPORTED;$(GtkIncludedImmodulesDefines);GTK_LIBDIR="$(GtkDummyPrefix)/lib";GTK_DATADIR="$(GtkDummyPrefix)/share";GTK_DATA_PREFIX="$(GtkDummyPrefix)";GTK_SYSCONFDIR="$(GtkDummyPrefix)/etc";MULTIPRESS_CONFDIR="$(GtkDummyPrefix)/etc/gtk-$(ApiVersion)";MULTIPRESS_LOCALEDIR="$(GtkDummyPrefix)/share/locale";GTK_VERSION="$(GtkVersion)/etc";GTK_BINARY_VERSION="$(GtkBinaryVersion)/etc";GDK_DISABLE_DEPRECATED;ISOLATION_AWARE_ENABLED</GtkDefines>
|
||||||
<CommonARM64SystemLibs Condition="'$(VisualStudioVersion)|$(Platform)' == '15.0|arm64'">ole32.lib;advapi32.lib;shell32.lib;gdi32.lib</CommonARM64SystemLibs>
|
<CommonARM64SystemLibs Condition="'$(VisualStudioVersion)|$(Platform)' == '15.0|arm64'">ole32.lib;advapi32.lib;shell32.lib;gdi32.lib</CommonARM64SystemLibs>
|
||||||
<GtkGdkCommonLibs>pangowin32-1.0.lib;fribidi.lib;imm32.lib;$(CommonARM64SystemLibs)</GtkGdkCommonLibs>
|
<GtkGdkCommonLibs>pangowin32-1.0.lib;fribidi.lib;imm32.lib;$(CommonARM64SystemLibs)</GtkGdkCommonLibs>
|
||||||
<GdkAdditionalLibs>winmm.lib;dwmapi.lib;setupapi.lib;$(GtkGdkCommonLibs)</GdkAdditionalLibs>
|
<GdkAdditionalLibs>winmm.lib;dwmapi.lib;setupapi.lib;hid.lib;$(GtkGdkCommonLibs)</GdkAdditionalLibs>
|
||||||
<GdkBroadwayAdditionalLibs>ws2_32.lib</GdkBroadwayAdditionalLibs>
|
<GdkBroadwayAdditionalLibs>ws2_32.lib</GdkBroadwayAdditionalLibs>
|
||||||
<GtkAdditionalLibs>atk-1.0.lib;winspool.lib;comctl32.lib;$(GtkGdkCommonLibs)</GtkAdditionalLibs>
|
<GtkAdditionalLibs>atk-1.0.lib;winspool.lib;comctl32.lib;$(GtkGdkCommonLibs)</GtkAdditionalLibs>
|
||||||
<GtkIntrospectNMakeCmd>cd ..
|
<GtkIntrospectNMakeCmd>cd ..
|
||||||
|
@ -57,7 +57,7 @@
|
|||||||
/>
|
/>
|
||||||
<UserMacro
|
<UserMacro
|
||||||
Name="GdkAdditionalLibs"
|
Name="GdkAdditionalLibs"
|
||||||
Value="winmm.lib dwmapi.lib setupapi.lib $(GtkGdkCommonLibs)"
|
Value="winmm.lib dwmapi.lib setupapi.lib hid.lib $(GtkGdkCommonLibs)"
|
||||||
/>
|
/>
|
||||||
<UserMacro
|
<UserMacro
|
||||||
Name="GtkAdditionalLibs"
|
Name="GtkAdditionalLibs"
|
||||||
|
Loading…
Reference in New Issue
Block a user