Skip to content

feat(rdp): skalowanie pulpitu zdalnego poniżej 100% (50–90%) - #188

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

feat(rdp): skalowanie pulpitu zdalnego poniżej 100% (50–90%)#188
FilipB97 merged 1 commit into
masterfrom
claude/resolution-settings-option-yjiqwq

Conversation

@FilipB97

Copy link
Copy Markdown
Owner

Co i dlaczego

Dopełnienie #187: lista skalowania miała tylko 100–200%, bo ulDesktopScaleFactor
(UpdateSessionDisplaySettings) przyjmuje wyłącznie 100..500% — mniejsze wartości serwer
ignoruje, więc „DPI 75%" po prostu nie istnieje w protokole.

Pomniejszenie realizujemy więc drugim mechanizmem: DPI zostaje na 100%, ale klient żąda pulpitu
większego niż panel (dla 75% → 100/75 = 1.33×) i wciska go w okno SmartSizingiem. Efekt jest
ten sam, o który chodzi — więcej pulpitu, drobniejszy interfejs — kosztem lekkiego rozmycia
(skalowanie w dół wygląda znacznie lepiej niż w górę, więc w praktyce jest to znośne).

Nowe pozycje: 50%, 60%, 75%, 80%, 90% obok dotychczasowych 100–200%.

Zmiany

  • Core/RdpDisplay.cs
    • MinScale = 50 (dół suwaka) obok nowego ProtocolMinScale = 100 (dół DPI w protokole).
    • DesktopScaleFactor(scale) — przycina DPI do [100..500], więc dla 75% leci 100%.
    • ResolutionMultiplier(scale)1.0 dla ≥ 100%, 100/scale poniżej.
    • ScaleResolution(w, h, scale) — nakłada mnożnik na bazę i normalizuje. Gdy wynik przekracza
      limit sesji (8192), przycinamy mnożnik, nie pojedynczy wymiar: inaczej pulpit dostałby inne
      proporcje niż okno i obraz byłby rozciągnięty.
  • RdpDynamicResolution — mnożnik nakładany na bazę (piksele panelu albo stałą rozdzielczość)
    w trzech miejscach: Display-Update po resize, ApplyExact (pełny ekran) i ApplyPreConnect.
    SmartSizing wymuszony również dla skali < 100% — tam pomniejszenie na nim polega.
  • Tryb „jak ekran lokalny" nadal nie schodzi poniżej 100%: ekran lokalny < 100% to zwykle artefakt
    pomiaru DPI, a nie życzenie użytkownika. Pomniejszenie wybiera się świadomie z listy.
  • UI/teksty: etykieta bez „(DPI)" (poniżej 100% to nie DPI), podtytuł tłumaczy oba mechanizmy
    i uprzedza o rozmyciu. README + ROADMAP: „50–200%".

Testy

  • RdpDisplayTests rozszerzone: DesktopScaleFactor (50/75 → 100, 150 → 150, 500 → 500),
    ResolutionMultiplier (100/150/0 → 1.0; 50 → 2.0; 75 → 1.33; 80 → 1.25),
    ScaleResolution (1920×1080 @ 75% → 2560×1440, @ 50% → 3840×2160, @ 150% → bez zmian),
    przycinanie mnożnika z zachowaniem proporcji (6000×3000 @ 50% → 8192×4096), odrzucenie zbyt
    małej bazy. Zaktualizowane progi w ParseScale/EffectiveScale (dół 50 zamiast 100).
  • Build i testy: CI (Windows) — środowisko sesji to Linux, projekt net8.0-windows.
  • Bez weryfikacji na żywej sesji: warto sprawdzić 75% na 4K i na małym monitorze (czy tekst nie
    robi się zbyt miękki) oraz pełny ekran przy skali < 100%.

Uwagi

  • Rozmycie przy < 100% jest nieodłączne — obraz jest skalowany po stronie klienta. Nie da się tego
    zrobić „ostro", bo serwer nie potrafi wyrenderować UI mniejszego niż 100% DPI.
  • Skala < 100% mnoży rozdzielczość także w trybie stałej rozdzielczości (1920×1080 @ 75% → sesja
    2560×1440 zmniejszona do okna). Konsekwentne znaczenie („tak duży wygląda interfejs względem
    natywnego"), ale warto o tym pamiętać przy czytaniu ustawień.
  • Drobna zmiana zachowania na skraju: gdy baza ma wymiar poniżej 200 px (patologicznie wąski panel
    podziału), Display-Update jest teraz pomijany zamiast wysyłać zniekształcone 200×200 — sesja
    zostaje na poprzedniej rozdzielczości, a dopasowanie robi SmartSizing (w panelach i tak włączony).

Generated by Claude Code

Protokół zna DPI sesji tylko w zakresie 100..500% (ulDesktopScaleFactor), więc
pomniejszenia nie da się zrobić tą drogą. Realizujemy je drugim mechanizmem:
DPI zostaje na 100%, a klient żąda pulpitu WIĘKSZEGO niż panel (100/75 = 1.33×)
i wciska go SmartSizingiem — więcej pulpitu, drobniejszy interfejs, kosztem
lekkiego rozmycia (skalowanie w dół wygląda znacznie lepiej niż w górę).

- RdpDisplay: MinScale 50, ProtocolMinScale 100, DesktopScaleFactor() przycina
  DPI do zakresu protokołu, ResolutionMultiplier()/ScaleResolution() liczą
  powiększoną rozdzielczość. Przy przekroczeniu limitu sesji (8192) przycinamy
  MNOŻNIK, nie pojedynczy wymiar — proporcje pulpitu muszą zostać jak okna.
- RdpDynamicResolution: mnożnik nakładany na bazę (piksele panelu albo stałą
  rozdzielczość) w Display-Update, ApplyExact (pełny ekran) i przed Connect;
  SmartSizing wymuszony także dla skali < 100%.
- Tryb „jak ekran lokalny" nadal nie schodzi poniżej 100% — pomniejszenie jest
  świadomym wyborem, nie skutkiem dziwnego odczytu DPI.
- UI: pozycje 50/60/75/80/90%; etykieta bez „(DPI)", bo poniżej 100% to nie DPI.

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 09:38
@FilipB97
FilipB97 merged commit 23064db 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