Files
DodoSSH/src/DodoSSH.Client.App/DodoSSH.Client.App.csproj
T
jaap-jan c7c844f7bd Give the desktop head the mark the phone has carried all along
The window had no icon and the executable had no icon, so Windows drew its
generic one in the taskbar, in alt-tab and in Explorer, next to an application
that draws its own titlebar precisely so that nothing about it looks borrowed.

The geometry is the launcher vector's, mapped so the middle 72 of its 108-unit
viewport fills the canvas: that 72 is what an adaptive icon actually shows, and
rendering the full 108 would draw the mark at 39% of the width. Nine sizes,
because Windows asks for several and downsamples unkindly when one is missing,
and a floor of one pixel on the strokes so 16px is a mark rather than a smudge.

Windows takes an .ico and nothing else, so the raster the phone does not need
exists here. dodossh-icon.ps1 sits beside it and draws it from those same
numbers, so the two heads still have one geometry between them.
2026-08-03 14:34:39 +02:00

73 lines
3.2 KiB
XML

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<ApplicationManifest>app.manifest</ApplicationManifest>
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
<!--
The icon on the executable itself — what Explorer, the Start menu and a pinned taskbar button
draw, all of which read it from the PE resource and never start the process. Window.Icon in
MainWindow.axaml is a separate thing that only exists once the application is running; both are
needed, and both point at this file.
-->
<ApplicationIcon>Assets/dodossh.ico</ApplicationIcon>
<!--
False here, unlike every server project. The root Directory.Build.props sets it true because
the API is container-hosted, UTC-only and has no business formatting anything for a human.
This process does: it shows timestamps and host names to a person who expects their own
locale's conventions. Invariant globalization would quietly render every date in a format
that is correct for nobody.
-->
<InvariantGlobalization>false</InvariantGlobalization>
</PropertyGroup>
<ItemGroup>
<!--
Named rather than globbed as Assets/**, because the folder also holds the script that draws the
icon and a build has no reason to carry a copy of it around inside the binary.
-->
<AvaloniaResource Include="Assets/dodossh.ico" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Avalonia" />
<PackageReference Include="Avalonia.Desktop" />
<PackageReference Include="Avalonia.Themes.Fluent" />
<PackageReference Include="Avalonia.Fonts.Inter" />
<PackageReference Include="Avalonia.Controls.WebView" />
<PackageReference Include="CommunityToolkit.Mvvm" />
</ItemGroup>
<ItemGroup>
<!--
The shell's view models, the terminal renderer's files and the palette, all shared with the Android
head. This project is now the desktop *views* and the desktop platform integration, and nothing else.
-->
<ProjectReference Include="../DodoSSH.Client.Shell/DodoSSH.Client.Shell.csproj" />
<ProjectReference Include="../DodoSSH.Client.Import/DodoSSH.Client.Import.csproj" />
<ProjectReference Include="../DodoSSH.Client.Session/DodoSSH.Client.Session.csproj" />
<ProjectReference Include="../DodoSSH.Client.Ssh/DodoSSH.Client.Ssh.csproj" />
<ProjectReference Include="../DodoSSH.Client.ObjectStore/DodoSSH.Client.ObjectStore.csproj" />
<ProjectReference Include="../DodoSSH.Client.Terminal/DodoSSH.Client.Terminal.csproj" />
<ProjectReference Include="../DodoSSH.Client.Transfer/DodoSSH.Client.Transfer.csproj" />
</ItemGroup>
<ItemGroup>
<!--
The view models are plain CommunityToolkit.Mvvm objects and need no Avalonia to run, so the shell's
state machine is testable as ordinary code. That is the whole reason the sign-in step is a delegate.
-->
<InternalsVisibleTo Include="DodoSSH.Client.App.Tests" />
<!--
The layout harness needs the views and the application class themselves, not just the view models:
its whole job is to lay out the real XAML and measure it.
-->
<InternalsVisibleTo Include="DodoSSH.Client.App.Layout.Tests" />
</ItemGroup>
</Project>