summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2024-03-01 18:30:20 +0100
committerManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2024-03-01 18:30:20 +0100
commit34b8801fedba0d9f5ee09c9f08ea56cb9f67a7cc (patch)
tree059fb1341ae66b80503da4e4bc3c341e743128b9 /src
parentcc15700bdb918699b6977140f27f6183efc3ac76 (diff)
Windows: fix moving window with Windows+Shift+arrow (#919)
Diffstat (limited to 'src')
-rw-r--r--src/Fl_win32.cxx32
1 files changed, 23 insertions, 9 deletions
diff --git a/src/Fl_win32.cxx b/src/Fl_win32.cxx
index 1e5beb9ff..ecc186d7f 100644
--- a/src/Fl_win32.cxx
+++ b/src/Fl_win32.cxx
@@ -1209,16 +1209,30 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar
case WM_DPICHANGED: { // 0x02E0, after display re-scaling and followed by WM_DISPLAYCHANGE
if (is_dpi_aware && !Fl_WinAPI_Window_Driver::data_for_resize_window_between_screens_.busy) {
- RECT r;
+ RECT r, *lParam_rect = (RECT*)lParam;
Fl_WinAPI_Screen_Driver *sd = (Fl_WinAPI_Screen_Driver*)Fl::screen_driver();
- int ns = Fl_Window_Driver::driver(window)->screen_num();
- sd->dpi[ns][0] = sd->dpi[ns][1] = HIWORD(wParam);
- float f = HIWORD(wParam) / 96.f;
- GetClientRect(hWnd, &r);
- float old_f = float(r.right) / window->w();
- Fl::screen_driver()->scale(ns, f);
- Fl_Window_Driver::driver(window)->resize_after_scale_change(ns, old_f, f);
- sd->update_scaling_capability();
+ int centerX = (lParam_rect->left + lParam_rect->right)/2;
+ int centerY = (lParam_rect->top + lParam_rect->bottom)/2;
+ int ns = sd->screen_num_unscaled(centerX, centerY);
+ int old_ns = Fl_Window_Driver::driver(window)->screen_num();
+ if (sd->dpi[ns][0] != HIWORD(wParam) && ns == old_ns) { // change DPI of a screen
+ sd->dpi[ns][0] = sd->dpi[ns][1] = HIWORD(wParam);
+ float f = HIWORD(wParam) / 96.f;
+ GetClientRect(hWnd, &r);
+ float old_f = float(r.right) / window->w();
+ Fl::screen_driver()->scale(ns, f);
+ Fl_Window_Driver::driver(window)->resize_after_scale_change(ns, old_f, f);
+ sd->update_scaling_capability();
+ } else if (ns != old_ns) {
+ // jump window with Windows+Shift+L|R-arrow to other screen with other DPI
+ float scale = Fl::screen_driver()->scale(ns);
+ int bt, bx, by;
+ Fl_WinAPI_Window_Driver *wdr = (Fl_WinAPI_Window_Driver*)Fl_Window_Driver::driver(window);
+ wdr->border_width_title_bar_height(bx, by, bt);
+ window->position(int(round(lParam_rect->left/scale)),
+ int(round((lParam_rect->top + bt)/scale)));
+ wdr->resize_after_scale_change(ns, scale, scale);
+ }
}
return 0;
}