Skip to content

Commit

Permalink
Dpi unaware placement bug (#2121)
Browse files Browse the repository at this point in the history
Fix for bug when placing dpi unaware window such as Notepad++ in left of right part of monitor. In that application gap of about 7px was left or right.
This fixes only single-monitor scenario
It skips correction for dpi unaware window that leaves a gap
  • Loading branch information
PrzemyslawTusinski committed Apr 15, 2020
1 parent 87fb6fc commit 2077cd4
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 7 deletions.
5 changes: 5 additions & 0 deletions src/common/monitors.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ std::vector<MonitorInfo> MonitorInfo::GetMonitors(bool include_toolbar)
return monitors;
}

int MonitorInfo::GetMonitorsCount()
{
return GetMonitors(true).size();
}

static BOOL CALLBACK get_primary_display_enum_cb(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM data)
{
MONITORINFOEX monitor_info;
Expand Down
1 change: 1 addition & 0 deletions src/common/monitors.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ struct MonitorInfo : ScreenSize

// Returns monitor rects ordered from left to right
static std::vector<MonitorInfo> GetMonitors(bool include_toolbar);
static int GetMonitorsCount();
// Return primary display
static MonitorInfo GetPrimaryMonitor();
// Return monitor on which hwnd window is displayed
Expand Down
18 changes: 11 additions & 7 deletions src/modules/fancyzones/lib/Zone.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
#include "Settings.h"
#include "util.h"

#include "common/monitors.h"

struct Zone : winrt::implements<Zone, IZone>
{
public:
Expand Down Expand Up @@ -78,14 +80,15 @@ RECT Zone::ComputeActualZoneRect(HWND window, HWND zoneWindow) noexcept

const auto level = DPIAware::GetAwarenessLevel(GetWindowDpiAwarenessContext(window));
const bool accountForUnawareness = level < DPIAware::PER_MONITOR_AWARE;

if (SUCCEEDED(DwmGetWindowAttribute(window, DWMWA_EXTENDED_FRAME_BOUNDS, &frameRect, sizeof(frameRect))))
{
const auto left_margin = frameRect.left - windowRect.left;
const auto right_margin = frameRect.right - windowRect.right;
const auto bottom_margin = frameRect.bottom - windowRect.bottom;
newWindowRect.left -= left_margin;
newWindowRect.right -= right_margin;
newWindowRect.bottom -= bottom_margin;
LONG leftMargin = frameRect.left - windowRect.left;
LONG rightMargin = frameRect.right - windowRect.right;
LONG bottomMargin = frameRect.bottom - windowRect.bottom;
newWindowRect.left -= leftMargin;
newWindowRect.right -= rightMargin;
newWindowRect.bottom -= bottomMargin;
}

// Map to screen coords
Expand All @@ -97,7 +100,8 @@ RECT Zone::ComputeActualZoneRect(HWND window, HWND zoneWindow) noexcept
const auto taskbar_left_size = std::abs(mi.rcMonitor.left - mi.rcWork.left);
const auto taskbar_top_size = std::abs(mi.rcMonitor.top - mi.rcWork.top);
OffsetRect(&newWindowRect, -taskbar_left_size, -taskbar_top_size);
if (accountForUnawareness)

if (accountForUnawareness && MonitorInfo::GetMonitorsCount() > 1)
{
newWindowRect.left = max(mi.rcMonitor.left, newWindowRect.left);
newWindowRect.right = min(mi.rcMonitor.right - taskbar_left_size, newWindowRect.right);
Expand Down

0 comments on commit 2077cd4

Please sign in to comment.