diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2024-03-01 18:30:20 +0100 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2024-03-01 18:30:20 +0100 |
| commit | 34b8801fedba0d9f5ee09c9f08ea56cb9f67a7cc (patch) | |
| tree | 059fb1341ae66b80503da4e4bc3c341e743128b9 /src | |
| parent | cc15700bdb918699b6977140f27f6183efc3ac76 (diff) | |
Windows: fix moving window with Windows+Shift+arrow (#919)
Diffstat (limited to 'src')
| -rw-r--r-- | src/Fl_win32.cxx | 32 |
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; } |
