Skip to content

feat(rdp): wybór rozdzielczości i skalowania (DPI) sesji w Ustawieniach - #187

Merged
FilipB97 merged 1 commit into
masterfrom
claude/resolution-settings-option-yjiqwq
Jul 29, 2026
Merged

feat(rdp): wybór rozdzielczości i skalowania (DPI) sesji w Ustawieniach#187
FilipB97 merged 1 commit into
masterfrom
claude/resolution-settings-option-yjiqwq

Conversation

@FilipB97

Copy link
Copy Markdown
Owner

Co i dlaczego

Sesja RDP zawsze dostawała natywne piksele panelu przy skali 100/100
(UpdateSessionDisplaySettings(..., 100u, 100u)), więc na ekranie 4K/HiDPI zdalny pulpit
renderował się 1:1 przy 100% DPI — ostro, ale tak drobno, że „ciężko cokolwiek wyczytać".
Nie było też żadnego sposobu wybrania rozdzielczości ręcznie.

Ustawienia → PołączenieDomyślne RDP dostają dwa pokrętła:

  • Rozdzielczość sesji RDP — „Dopasuj do okna" (dotychczasowe zachowanie, domyślne) albo
    stała wartość z listy (1024×768 … 3840×2160). Stała jest raz negocjowana i rozciągana do okna
    SmartSizingiem; nie zmienia jej ani zmiana rozmiaru okna, ani pełny ekran.
  • Skalowanie pulpitu zdalnego (DPI) — „Jak ekran lokalny" (domyślne) albo 100–200%.
    Trafia w ulDesktopScaleFactor, więc zdalny Windows rysuje interfejs większy, bez rozmycia
    (odwrotnie niż SmartSizing). To właściwe lekarstwo na 4K.

Domyślne „jak ekran lokalny" bierze mnożnik DPI okna — dokładnie tak zachowuje się mstsc,
więc na laptopie 150% sesja startuje od razu czytelna. Kto woli gęsty obraz jak dotąd, wybiera 100%.

Zmiany

  • Core/RdpDisplay.cs (nowe) — czyste, testowalne przeliczenia: parsowanie/format tagów
    rozdzielczości, normalizacja (parzyste, [200..8192]), skala efektywna z przycięciem do
    [100..500] i zaokrągleniem do 5%, stała DeviceScaleFactor = 100 (dozwolone tylko 100/140/180).
  • AppSettingsRdpDesktopWidth/RdpDesktopHeight (0×0 = dopasuj do okna) i RdpScalePercent
    (0 = jak ekran lokalny). Stare pliki settings.json wczytują się bez migracji.
  • RdpDynamicResolution — honoruje oba ustawienia: stała rozdzielczość omija pomiar panelu i
    wymusza SmartSizing (także w ApplyExact, czyli w pełnym ekranie), skala jedzie w każdym
    Display-Update. Gdy host odrzuci skalę (starsze serwery znają tylko 100/100), ponawiamy bez niej —
    resize nigdy nie przepada. Nowe ApplyPreConnect() ustawia rozmiar i DPI jeszcze przed
    Connect() (DesktopWidth/DesktopHeight + DesktopScaleFactor/DeviceScaleFactor przez
    IMsRdpExtendedSettings), żeby pierwsza klatka sesji była już poprawna.
  • ApplyDisplaySettings() — zapis w Ustawieniach renegocjuje otwarte sesje bez ponownego łączenia;
    wołane dla kart i dla sesji w osobnych oknach (SessionWindow).
  • UI: dwie listy rozwijane w karcie „Połączenie" + teksty PL/EN; helpery ComboTag/ComboSelectTag
    (odpowiednik SegTag/SegSet dla ComboBoxa). Wyszukiwarka Ustawień łapie je bez zmian.
  • README + ROADMAP: wzmianka o nowej opcji.

Testy

  • tests/RdpManager.Tests/RdpDisplayTests.cs — 40+ przypadków: parsowanie tagów (1920x1080,
    1920×1080, śmieci → auto), normalizacja nieparzystych i przekroczonych wymiarów, round-trip
    format↔parse, przycinanie skali, skala „auto" wg DPI (1.5 → 150%, 1.4999 → 150%, 0/NaN → 100%).
  • Reszta suity bez zmian; build i testy weryfikuje CI (Windows) — środowisko tej sesji to Linux,
    a projekt jest net8.0-windows, więc lokalnie nie dało się zbudować.
  • Nie sprawdzone ręcznie na żywej sesji RDP (brak Windows/serwera w tym środowisku) — warto
    przeklikać: stała rozdzielczość + pełny ekran, skala 150% na Server 2016+ i na starszym hoście
    (powinien zadziałać fallback do 100%), oraz zmianę ustawienia przy otwartej sesji.

Uwagi

  • Zmiana domyślnego zachowania na ekranach HiDPI: przy RdpScalePercent = 0 sesja dostaje
    teraz skalę DPI ekranu lokalnego zamiast twardych 100%. Rozdzielczość zostaje bez zmian
    („dopasuj do okna"), więc obraz jest nadal ostry — zmienia się tylko rozmiar UI w sesji.
    Kto chce starego wyglądu, wybiera 100%.
  • DesktopScaleFactor przed połączeniem ustawiamy późno-wiążąco (InvokeMember), bo w
    wygenerowanym MSTSCLib para get_Property/set_Property wychodzi jako akcesory właściwości,
    a tych C# nie pozwala wywołać wprost (CS0571). Całość w try/catch — starsza kontrolka po
    prostu dostanie DPI dopiero z Display-Update.
  • Ustawienie jest globalne (jak głębia kolorów), nie per-serwer. Per-serwer nadpisanie to naturalny
    następny krok, jeśli będzie potrzebne.

Generated by Claude Code

Sesja RDP zawsze dostawała natywne piksele panelu przy skali 100/100, więc na
ekranach 4K/HiDPI interfejs zdalnego pulpitu wychodził nieczytelny. Ustawienia →
Połączenie → Domyślne RDP dostają dwa pokrętła:

- Rozdzielczość sesji: „Dopasuj do okna" (jak dotąd) albo stała wartość z listy;
  stała jest rozciągana do okna SmartSizingiem i nie zmienia jej pełny ekran.
- Skalowanie pulpitu zdalnego (DPI): „Jak ekran lokalny" (domyślnie, tak robi
  mstsc) albo 100–200%. Jedzie w ulDesktopScaleFactor, więc serwer RYSUJE
  interfejs większy — bez rozmycia. Gdy host odrzuci skalę, ponawiamy bez niej.

Przeliczenia siedzą w Core/RdpDisplay (czyste, testowalne); zapis w Ustawieniach
działa na żywo na otwartych sesjach — w kartach i w osobnych oknach.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G2BeQc7J3e3NosuC3vvoGi
@FilipB97
FilipB97 marked this pull request as ready for review July 29, 2026 08:25
@FilipB97
FilipB97 merged commit aff8cfc into master Jul 29, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants