Initial checkin of Pika from heckimp

This commit is contained in:
2023-09-25 15:35:21 -07:00
commit 891e999216
6761 changed files with 5240685 additions and 0 deletions

View File

@ -0,0 +1,51 @@
From feb4f26b5c643382241aa995034fb36b02a21a4d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1?=
=?UTF-8?q?=D1=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Mon, 8 Mar 2021 14:10:56 +0000
Subject: [PATCH] GDK W32: Use PROCESS_PER_MONITOR_DPI_AWARE
According to Microsoft documentation, PROCESS_SYSTEM_DPI_AWARE, just as
PROCESS_DPI_UNAWARE, allows Windows to scale GTK windows and do all kinds
of stuff. To ensure this doesn't happen, we need to use PROCESS_PER_MONITOR_DPI_AWARE,
even if GTK does not really handle DPI changes dynamically via the WM_DPICHANGED
message.
This completely prevents Windows from scaling GTK windows when they are moved
between screens with different scaling set up.
---
gdk/win32/gdkdisplay-win32.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/gdk/win32/gdkdisplay-win32.c b/gdk/win32/gdkdisplay-win32.c
index c2b572b402..0fa92a7143 100644
--- a/gdk/win32/gdkdisplay-win32.c
+++ b/gdk/win32/gdkdisplay-win32.c
@@ -916,10 +916,10 @@ _gdk_win32_enable_hidpi (GdkWin32Display *display)
/* then make the GDK-using app DPI-aware */
if (display->shcore_funcs.setDpiAwareFunc != NULL)
{
- switch (display->shcore_funcs.setDpiAwareFunc (PROCESS_SYSTEM_DPI_AWARE))
+ switch (display->shcore_funcs.setDpiAwareFunc (PROCESS_PER_MONITOR_DPI_AWARE))
{
case S_OK:
- display->dpi_aware_type = PROCESS_SYSTEM_DPI_AWARE;
+ display->dpi_aware_type = PROCESS_PER_MONITOR_DPI_AWARE;
status = DPI_STATUS_SUCCESS;
break;
case E_ACCESSDENIED:
@@ -1000,10 +1000,10 @@ _gdk_win32_enable_hidpi (GdkWin32Display *display)
/* This most probably means DPI awareness is set through
the manifest, or a DPI compatibility setting is used. */
display->dpi_aware_type = display->user32_dpi_funcs.isDpiAwareFunc () ?
- PROCESS_SYSTEM_DPI_AWARE :
+ PROCESS_PER_MONITOR_DPI_AWARE :
PROCESS_DPI_UNAWARE;
- if (display->dpi_aware_type == PROCESS_SYSTEM_DPI_AWARE)
+ if (display->dpi_aware_type != PROCESS_DPI_UNAWARE)
status = DPI_STATUS_SUCCESS;
else
status = DPI_STATUS_DISABLED;
--
GitLab

View File

@ -0,0 +1,152 @@
From 696a356b14ac2426b8b8176d298f05204751862c Mon Sep 17 00:00:00 2001
From: Luca Bacci <luca.bacci982@gmail.com>
Date: Fri, 11 Jun 2021 19:37:17 +0200
Subject: [PATCH] Wintab: Fix coordinates in mixed-DPI setups
Fixes #753
---
gdk/win32/gdkdevice-wintab.c | 77 +++++++++++++++++++-----------
gdk/win32/gdkdevice-wintab.h | 5 ++
gdk/win32/gdkdevicemanager-win32.c | 5 ++
3 files changed, 59 insertions(+), 28 deletions(-)
diff --git a/gdk/win32/gdkdevice-wintab.c b/gdk/win32/gdkdevice-wintab.c
index 338479db43..0337cc0d42 100644
--- a/gdk/win32/gdkdevice-wintab.c
+++ b/gdk/win32/gdkdevice-wintab.c
@@ -220,18 +220,9 @@ _gdk_device_wintab_translate_axes (GdkDeviceWintab *device_wintab,
gdouble *x,
gdouble *y)
{
- GdkDevice *device;
- GdkWindow *impl_window;
- gint root_x, root_y;
- gdouble temp_x, temp_y;
+ GdkDevice *device = GDK_DEVICE (device_wintab);
gint i;
- device = GDK_DEVICE (device_wintab);
- impl_window = _gdk_window_get_impl_window (window);
- temp_x = temp_y = 0;
-
- gdk_window_get_origin (impl_window, &root_x, &root_y);
-
for (i = 0; i < gdk_device_get_n_axes (device); i++)
{
GdkAxisUse use;
@@ -243,19 +234,55 @@ _gdk_device_wintab_translate_axes (GdkDeviceWintab *device_wintab,
case GDK_AXIS_X:
case GDK_AXIS_Y:
if (gdk_device_get_mode (device) == GDK_MODE_WINDOW)
- _gdk_device_translate_window_coord (device, window, i,
- device_wintab->last_axis_data[i],
- &axes[i]);
+ {
+ _gdk_device_translate_window_coord (device, window, i,
+ device_wintab->last_axis_data[i],
+ &axes[i]);
+
+ if (use == GDK_AXIS_X)
+ {
+ *x = axes[i];
+ }
+ else
+ {
+ *y = axes[i];
+ }
+ }
else
- _gdk_device_translate_screen_coord (device, window,
- root_x, root_y, i,
- device_wintab->last_axis_data[i],
- &axes[i]);
- if (use == GDK_AXIS_X)
- temp_x = axes[i];
- else if (use == GDK_AXIS_Y)
- temp_y = axes[i];
-
+ {
+ GdkAtom label_atom;
+ GdkAxisUse use;
+ double min_value, max_value, resolution;
+ double device_val = device_wintab->last_axis_data[i];
+ double screen_val = 0.0;
+ double window_val = 0.0;
+ POINT client;
+
+ client.x = 0;
+ client.y = 0;
+ ClientToScreen (GDK_WINDOW_HWND (window), &client);
+
+ _gdk_device_get_axis_info (device, i,
+ &label_atom, &use,
+ &min_value, &max_value, &resolution);
+
+ if (use == GDK_AXIS_X)
+ {
+ screen_val = device_wintab->screen_mapping_origin_x +
+ (device_wintab->screen_mapping_width / (max_value - min_value)) *
+ (device_val - min_value);
+ window_val = screen_val - client.x;
+ *x = axes[i] = window_val;
+ }
+ else
+ {
+ screen_val = device_wintab->screen_mapping_origin_y +
+ (device_wintab->screen_mapping_height / (max_value - min_value)) *
+ (device_val - min_value);
+ window_val = screen_val - client.y;
+ *y = axes[i] = window_val;
+ }
+ }
break;
default:
_gdk_device_translate_axis (device, i,
@@ -264,12 +291,6 @@ _gdk_device_wintab_translate_axes (GdkDeviceWintab *device_wintab,
break;
}
}
-
- if (x)
- *x = temp_x;
-
- if (y)
- *y = temp_y;
}
static void
diff --git a/gdk/win32/gdkdevice-wintab.h b/gdk/win32/gdkdevice-wintab.h
index 9431215359..828dd198d6 100644
--- a/gdk/win32/gdkdevice-wintab.h
+++ b/gdk/win32/gdkdevice-wintab.h
@@ -39,6 +39,11 @@ struct _GdkDeviceWintab
{
GdkDevice parent_instance;
+ double screen_mapping_origin_x;
+ double screen_mapping_origin_y;
+ double screen_mapping_width;
+ double screen_mapping_height;
+
gboolean sends_core;
gint *last_axis_data;
gint button_state;
diff --git a/gdk/win32/gdkdevicemanager-win32.c b/gdk/win32/gdkdevicemanager-win32.c
index 34c0083cb3..d22dd3e68d 100644
--- a/gdk/win32/gdkdevicemanager-win32.c
+++ b/gdk/win32/gdkdevicemanager-win32.c
@@ -633,6 +633,11 @@ _wintab_recognize_new_cursors (GdkDeviceManagerWin32 *device_manager,
_gdk_device_add_slave (device_manager->core_pointer, GDK_DEVICE (device));
}
+ device->screen_mapping_origin_x = lc.lcSysOrgX;
+ device->screen_mapping_origin_y = lc.lcSysOrgY;
+ device->screen_mapping_width = lc.lcSysExtX;
+ device->screen_mapping_height = lc.lcSysExtY;
+
device->hctx = hctx;
device->cursor = cursorix;
(*p_WTInfoA) (WTI_CURSORS + cursorix, CSR_PKTDATA, &device->pktdata);
--
GitLab