* Fix working area changed on windows platform won't trigger screens changed
* Fix ScreensPage on IntegrationTestApp won't remove Screens.Changed listener
* Add SystemParametersInfo.SPI_SETWORKAREA to Win32 UnmanagedMethods class
* Move notify screen working area changed to Win32Platform.WndProc instead of WindowImpl.AppWndProc
* Notify working area changed to screens without check PlatformSettings is Win32PlatformSettings
* Fix SelectableTextBlock selection offset with InlineUIContainer (#15880)
EmbeddedControlRun inherits TextRun.DefaultTextSourceLength = 1, so each
InlineUIContainer occupies one position in TextLayout. However,
InlineUIContainer.AppendText was a no-op, causing Inlines.Text to have
zero characters for each embedded control. This made TextLayout.HitTestPoint
return positions that were ahead of Inlines.Text indices by one per
InlineUIContainer, breaking SelectedText for any text after an embedded
control.
Fix: append the Unicode Object Replacement Character (U+FFFC) — the
standard placeholder for embedded objects — in AppendText so that
Inlines.Text character offsets stay in sync with the TextLayout positions.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Expand InlineUIContainer selection tests with fencepost cases
Replace single assertion with a [Theory] covering all boundary positions
around the embedded control in 'foo\uFFFCbar':
- entirely before the container
- exactly the container character
- up to and including the container
- starting exactly after the container
- container through end
- one character either side of the container
- entire content
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix inter-word justification distribution and safety
TextAlignment.Justify was incorrect or a no-op in several common cases.
This corrects glyph targeting, buffer safety, run partitioning, the fill
target, and which lines get justified.
- Target the glyph ending each break boundary; step zero-width breaks
(CJK/Korean ideograph boundaries, hyphens) back one so the widened gap
sits on the break and the last visible glyph is never stretched.
- Copy-on-write the shaped buffer before adjusting advances and swap in a
fresh run, so justification never mutates glyph storage shared with a
TextRunCache entry, a Split sibling or a WithBidiLevel alias. Adds
ShapedBuffer.CloneWritable and TextLineImpl.ReplaceTextRun, which also
repoints the bidi-reordered runs used by draw and hit-test.
- Consume break opportunities per run instead of draining the whole queue
against the first run.
- Fill the visible Width to the paragraph width rather than the width
including trailing whitespace, so wrapped lines with trailing whitespace
justify instead of being left un-justified.
- Target MaxWidth for wrapped text rather than the widest produced line.
- Skip the last line, newline-terminated lines and hard-break lines.
Adds justification test coverage: CJK, mixed Latin+CJK, Arabic buffer
integrity, Latin wrapping, trailing whitespace and multi-run lines.
* Add failing test for trailing-whitespace overcount across runs
- TextLineImpl.CreateLineMetrics walks a line's runs backward to
compute trailing whitespace, stopping only when a run has none of
its own - not when a run is only partly whitespace.
- On a multi-run line where an interior run also ends in a space
(common at a script boundary, since each script run tends to end at
the following space), that space gets wrongly counted as trailing
too, even though visible content follows it later in the line.
- This shrinks Width, which InterWordJustification uses to decide how
much space a line still needs to reach the target width.
* Fix trailing-whitespace overcount across runs
- Only continue accumulating trailing whitespace from an earlier run
when the current run is entirely whitespace; otherwise the current
run's own visible content is the line's true end, and an earlier
run's trailing space is interior, not trailing.
- Width now correctly includes interior, non-trailing whitespace, so
wrapped multi-run lines (e.g. mixed-script text) no longer get
stretched past the target width when justified.
* Ignore CLAUDE.md
* Generate a CycloneDX SBOM per published NuGet package
GitHub's dependency-graph SBOM export reports unresolved version ranges
for most packages and can't see which source projects get merged into
which final package by Numerge. Add a CreateSbom Nuke target that runs
CycloneDX against each project's already-restored assets, reassembles
the Numerge merge groups from numerge.json, and publishes one accurate
SBOM per shipped package as a pipeline artifact.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* Fix SBOM dependency graph merge and cover bundled npm packages
The per-package SBOM merge only kept the dependency-graph (dependsOn)
edges from the first-scanned constituent project, so the flagship
Avalonia package listed 38 components but wired only 3 into its graph.
Union dependsOn edges by ref (each constituent's -sn/-sv override makes
its root collapse onto the shared final-package ref) so all edges are
retained - the Avalonia root now reports 17 direct dependencies.
cyclonedx-dotnet only walks the NuGet graph, so JS that ships inside a
package via a Bun/npm-built webapp was invisible: Avalonia.Browser's
staticwebassets and Avalonia.DesignerSupport's embedded previewer (which
merges into Avalonia). Scan each constituent's webapp/package.json
production dependencies, resolving versions from the installed
node_modules (git-pinned deps become pkg:github purls), so those shipped
components appear in the SBOM.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Enrich npm SBOM components to match NuGet component fidelity
Previously the bundled-webapp npm packages were added as bare inventory
entries: no bom-ref, no license, no hashes, direct-only, and orphaned
from the dependency graph - second-class next to the fully-formed NuGet
components cyclonedx-dotnet emits.
Walk the installed node_modules transitively so npm depth matches the
NuGet side (e.g. react-dom now pulls in scheduler, loose-envify,
object-assign; loose-envify pulls in js-tokens), assign each component a
bom-ref, resolve its license from the installed package.json (SPDX id or
expression, with legacy license/licenses object fallback), and wire the
whole tree into the CycloneDX dependency graph - the shipped package now
declares its direct npm deps and every transitive edge below them.
Hashes are intentionally omitted for npm: the verifiable integrity
hashes live in bun's binary lockfile, not the installed tree, and a hash
of the unpacked directory couldn't be checked against a registry.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Enrich SBOM root component and verify package contents
Two gaps remained after the npm work. First, cyclonedx-dotnet emits only
type/name/version for the root metadata.component - no manufacturer,
license, or provenance, which a CRA-facing SBOM is expected to carry.
Read the shipped .nuspec and fill in purl, publisher/supplier (also set
as the document-level manufacturer), SPDX license, description,
copyright, and website/vcs external references.
Second, nothing checked what the package actually ships against the
components derived from the dependency graph. Scan the final .nupkg's
binaries: Avalonia's own Numerge-merged modules (e.g. Avalonia.Base,
Avalonia.Controls folded into Avalonia; Avalonia.Win32.Automation into
Avalonia.Win32) are recorded as manufacturer-supplied components with a
SHA-512 of the shipped bytes, and any third-party binary that no
restored dependency accounts for is added and flagged - a regression
guard so bundled binaries can't silently escape the SBOM. Reference
assemblies under ref/ and the package's own primary assembly are skipped.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Exclude type-only @types/* packages from the SBOM
The DesignerSupport previewer's package.json lists @types/react and
@types/react-dom under "dependencies" rather than "devDependencies", so
they were being scanned in. TypeScript declaration packages are stripped
by esbuild and never appear in the shipped bytes, so they fall outside
the SBOM's scope of delivery. Skip @types/* at both the direct and
transitive level (which also drops csstype, only reachable via
@types/react), leaving the SBOM listing exactly the npm packages that
are actually bundled and delivered.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Add SBOM coverage rules to Copilot review instructions
Instruct code review to flag two cases that would otherwise let a
package ship without accurate SBOM coverage (EU CRA): a newly published
NuGet package not covered by CreateSbom, and a change to what
dependencies are delivered with a component - notably adding npm/JS to a
previously .NET-only component, bundling third-party binaries directly,
or new Numerge merge groups - without a corresponding update to
nukebuild/SbomGenerator.cs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Link package-content binaries into the dependency graph
The binary:* components from the .nupkg content scan were added to
components but had no dependency node or root edge, leaving them
unreachable for SBOM consumers that traverse the graph from the root -
so the shipped merged modules (and any flagged third-party binary)
didn't appear in the delivered dependency tree. Give each its own leaf
node and a dependsOn edge from the root component.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Prune dangling dependency edges from generated SBOMs
cyclonedx-dotnet leaves dependsOn edges pointing at packages it excluded
as dev dependencies (e.g. analyzers stripped by -ed), so after exclusion
the graph references components that aren't in the SBOM. Drop any
dependsOn target that doesn't resolve to a present component, keeping the
dependency graph internally consistent - consistent with treating those
build-only dev dependencies as out of scope of delivery.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Reference upstream issue for dangling-edge prune
Cite CycloneDX/cyclonedx-dotnet#761 in the PruneDanglingDependencyEdges
comment so a future reader knows the dangling dependsOn edges are an
upstream bug (still reproducing in 6.2.0), not something introduced here.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Resolve CycloneDX via NuGetPackage instead of a global tool install
`dotnet tool update --global CycloneDX` mutated the developer's (and CI
agent's) global tool set as a side effect of running the build. Follow the
same pattern as the other build tools (ApiCompat, ApiDiff, ilrepack): pin
the package via PackageDownload in _build.csproj and resolve it through a
[NuGetPackage] Tool, passed into SbomGenerator.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Reuse existing nuspec/numerge parsing helpers in the SBOM generator
Drop the hand-rolled Numerge* POCOs in favour of Numerge.MergeConfiguration.
LoadFile (already used by CreateNugetPackages), and have BuildToNuGetCache
call SbomGenerator.ReadPackageId instead of duplicating the nuspec-id
extraction inline, so the two can't drift.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Resolve each package's nupkg from a prebuilt id->path map
GenerateForPackage's fallback re-globbed and re-parsed every nupkg in the
output directory once per final package whenever the versioned-filename glob
missed - O(n^2) archive reads. Build the id->path map once in Generate
(reading each nupkg's id a single time) and look each package up in it.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Degrade unrecognised git/URL npm specifiers instead of throwing
ResolveNpmComponent routed any git/URL dependency range to a GitHub-only
parser that threw NotSupportedException on anything else (GitLab/Bitbucket,
a raw tarball URL, ...). Because CreateSbom is a hard release dependency,
one such spec would fail the whole build. Fall back to a generic component
(preferring the installed on-disk version) with a warning instead.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Guard against an npm package.json with no version field
A package.json without a "version" (valid for private packages) made the
null-forgiving ["version"]! throw an NRE, aborting the build. Fall back to
the declared range with a warning instead.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Don't emit a file-license path as an SPDX id
A nuspec <license type="file"> (from PackageLicenseFile) stores a file path,
not an SPDX id. It was being fed to SpdxToLicenses and emitted as
{license:{id:"licenses/LICENSE"}}, an invalid SPDX id that can fail license
validation. Map type="file" to a license name instead. (Avalonia's own
packages all use PackageLicenseExpression=MIT, so this is a latent-correctness
fix rather than a live bug.)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Generate and publish SBOMs from the macOS CI job too
CreateSbom was only wired into CiAzureWindows, so the macOS job's NuGetOSX
artifact - which carries the real macOS-native binaries the Windows build
can't produce - shipped without matching SBOMs. Wire CreateSbom into
CiAzureOSX and publish its output as a SBOMOSX artifact.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Embed each package's CycloneDX SBOM inside its .nupkg
The SBOM previously existed only as a detached build artifact. Also embed
it at _manifest/cyclonedx/bom.cdx.json inside the shipped .nupkg so it
travels with the package, mirroring the _manifest/ layout Microsoft.Sbom.
Targets uses for SPDX. A .nupkg is an OPC package, so [Content_Types].xml
gains a json default or strict OPC readers (including NuGet signature
verification) would reject the modified package. Skips already-signed
packages to avoid invalidating their signature.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Address Copilot review: SBOM zip ordering, nuspec read, component key
- Order ZipFiles after CreateSbom so zipped NuGet artifacts include the
embedded SBOM.
- Read the .nuspec entry with an ordinal EndsWith and dispose its stream.
- Key components by purl/bom-ref, falling back to name+version so distinct
versions sharing a name aren't de-duplicated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Model bundled assemblies as a composition, not dependencies
The numerge-folded first-party assemblies (Avalonia.Base, Avalonia.Controls,
etc.) are constituents of the package, not dependencies of it. Represent them
as a CycloneDX "assembly" via a top-level compositions entry with
aggregate=complete instead of drawing dependsOn edges from the root - contains
and depends-on are distinct relationships. They stay flat top-level components
so their per-assembly hashes remain visible to scanners that ignore nested
components, and the dependency graph is left holding only genuine dependencies.
Also carry the package's licence onto these first-party components, which
previously came out blank (cyclonedx-dotnet only sets it on the root).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
* Fix: TalkBack should highlight controls instead of their ancestors
* Fix: make parent controls navigable for specific types
---------
Co-authored-by: Julien Lebosquain <julien@lebosquain.net>
* Add tests around skipping controls for FocusManager #21620
* Return false by default in CanHaveFocusableChildren #21620
Importantly, this will return false for controls that are not focusable (e.g. TextBlock) or that have no focusable childen (e.g. an empty StackPanel)
* Add skip tests for FindFirstFocusableElement and FindLastFocusableElement #21620
* win32: let GraphicsAdapterSelectionCallback see unfiltered adapters on ARM64
The ARM64 Adreno blocklist in AngleWin32EglDisplay removed every Adreno
adapter from the list before it was handed to GraphicsAdapterSelectionCallback,
so an application had no way to opt back into hardware acceleration and no
indication that WARP (the Microsoft Basic Render Driver) was being forced.
Stop mutating the adapter list. The blocklist now only moves the *default*
selection to the first non-Adreno adapter when no callback is supplied, and
logs a warning about the CPU-usage impact and the available workarounds. When
a callback is present it receives the full, unfiltered adapter list and its
choice is used as-is.
As a side effect this also removes a latent IndexOutOfRange: the old code
could empty the list when every enumerated adapter was Adreno.
Refs #21689
* Update src/Windows/Avalonia.Win32/OpenGl/Angle/AngleWin32EglDisplay.cs
Co-authored-by: Max Katz <maxkatz6@outlook.com>
---------
Co-authored-by: nickna <nick@nassiri.xyz>
Co-authored-by: Max Katz <maxkatz6@outlook.com>
* Skia: avoid SKBitmap.Copy when creating ImmutableBitmap from pixels
The pixel-data ImmutableBitmap constructor used by LoadBitmap(IntPtr) wrapped
the caller's buffer with InstallPixels and then called SKBitmap.Copy() to get
an owned copy. SKBitmap.Copy() internally spins up an SKCanvas and draws the
source via an SKPaint shader, which is far more expensive than a memory blit.
Instead, allocate the destination with Marshal.AllocHGlobal, blit the pixels
span-to-span, and hand ownership to Skia via InstallPixels with a release proc
that frees the buffer. This is dramatically faster (~6x at 4096x4096, 50-80x at
small/medium sizes) and allocates less managed memory.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Skia: back ImmutableBitmap-from-pixels with BitmapMemory + shared per-row copy
Follow-up to the previous change. Two corrections/improvements:
* Use BitmapMemory as the backing storage instead of a bare Marshal.AllocHGlobal
buffer, so allocation/lifetime (incl. GC memory pressure) is managed in one
place. Ownership is handed to Skia via InstallPixels with a release proc that
disposes the BitmapMemory.
* The previous single contiguous blit was incorrect: the source stride is allowed
to be negative (bottom-up layouts). Copy row by row instead, which also handles
the backing store's row alignment differing from the source stride.
To avoid duplicating the row-copy logic, Bitmap.CopyPixelsCore is now an
internal static helper taking the source as raw (address, rowBytes, format),
reused by both Bitmap/WriteableBitmap.CopyPixels and ImmutableBitmap. Source-rect
validation moves to the (instance) call sites.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Skia: keep a self-contained instance CopyPixelsCore for inheritors
Re-add the instance CopyPixelsCore(..., ILockedFramebuffer fb) overload that
validates the source rect and delegates to the static raw-buffer core. Inheritors
(WriteableBitmap) and the framebuffer-based CopyPixels paths use this self-contained
overload again, while ImmutableBitmap keeps using the static raw overload directly.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Bitmap: add contiguous fast-path to CopyPixelsCore
When the source and destination layouts are identical, tightly-packed and forward
(no row padding, no X offset, positive stride == minStride), the whole region is
contiguous in both buffers, so copy it with a single blit instead of the per-row
loop. Measured up to ~5x faster for small images and ~30% for large ones; requiring
stride == minStride also guarantees we never read past the source's last row.
Negative strides, sub-rect copies and padded layouts still take the per-row path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Address code-review findings on the ImmutableBitmap pixel path
* BitmapMemory: make ReleaseUnmanagedResources idempotent (zero Address after
FreeHGlobal). SKBitmap.InstallPixels invokes the release proc even when it
returns false, so the failure branch in ImmutableBitmap could dispose the same
BitmapMemory twice -> double free / heap corruption. Idempotency also guards any
other native-handoff consumer that double-disposes.
* Bitmap.CopyPixelsCore: compute minBufferSize in 64-bit so a very large
stride*height can't overflow the buffer-size guard and let the new contiguous
blit (or the per-row loop) run past the buffers.
* ImmutableBitmap: dispose the SKBitmap if SKImage.FromBitmap returns null so the
backing memory is freed promptly via the release proc instead of waiting for the
finalizer.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* BitmapMemory: free the buffer atomically with Interlocked.Exchange
Back Address with a field and claim it via Interlocked.Exchange in
ReleaseUnmanagedResources, so the buffer is freed exactly once even if an
explicit Dispose() races with the finalizer or a native release callback running
on another thread.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* BitmapMemory: drop redundant Interlocked comment
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Skia: let SKBitmap own its pixels in ImmutableBitmap, drop BitmapMemory
Since CopyPixelsCore copies into the destination, ImmutableBitmap can simply
TryAllocPixels a Skia-owned SKBitmap and blit into it, instead of allocating a
separate BitmapMemory and handing it to InstallPixels with a release proc. This
removes the manual unmanaged-memory lifetime management (and the
release-proc/double-dispose hazard along with it). SKBitmap frees its own pixels
on Dispose.
Reverts the now-unneeded BitmapMemory idempotency/Interlocked change too, since
that code path no longer exists.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* comments
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Add GlyphTypeface.CanShapeScript(Script), backed by a lazy read of the GSUB/GPOS ScriptList via the new ScriptListTable parser.
Add FontFallbackScriptHints.TryGetComplexShapingTags, which maps 17 complex scripts to the OpenType script tag(s) a font must declare to shape them.
Thread a Script shapingScript constraint through FontManager.TryMatchCharacter and FontCollectionBase.TryMatchCharacter as internal overloads, leaving the public signatures untouched.
Rework TextCharacters.CreateShapeableRun into a capability preference: a complex script tries shaping-capable fonts first (tier 0), then cmap-only coverage (tier 1); simple scripts keep the single historical tier.
Replace the NUL placeholder U+200B (ZERO WIDTH SPACE) with U+2060 (WORD JOINER) so the substitution introduces no line-break opportunity.
Suppress previous-run font reuse across a culture change for locale-sensitive scripts, so a zh run's font no longer pins following ja text.
Add 3 subset test fonts and 3 new test files (7 new tests) and fix 2 stale doc-comment crefs.
* Fix comments
* Fix font fallback reusing the wrong cached face from the script bucket
FontCollectionBase.TryMatchCharacter caches a resolved fallback family per
(script, culture) bucket. Two bugs let that bucket hand back a face that does
not match the request:
- A positive bucket entry suppressed the Tier D platform lookup for any later
codepoint, even one the bucket family cannot cover. A CJK run left the
Simplified-only U+534E unmatched (tofu) because the bucket resolved to a
Japanese font that lacks it, while another installed font could place it.
Tier D now treats only a negative (null) entry as "platform already
attempted"; a positive entry no longer blocks the platform, since that
family may not cover this codepoint.
- A cached covering match of a neighbouring FontCollectionKey was reused for a
different requested key. After a Bold run cached a face, a following Normal
run reused it and rendered bold (and the symmetric style and stretch cases).
Tier A, B and C now keep the exact key: when the cached covering match is a
neighbouring key, the exact-key face of the same family is resolved from the
platform via TryMatchCharacterFromPlatform, falling back to the neighbour
only when the platform has no exact face. Collections without a platform are
unchanged.
Add regression tests for both: a bucket whose font lacks a later same-script
codepoint, and weight and style leaks resolved through Tier B (script cache)
and Tier C (the sweep, exercised via a non-locale-sensitive script with no
culture).
NumericUpDown.Value is a decimal?, so changing it while a UI Automation
client is attached raised an automation property-changed event whose boxed
decimal hit no case in ComVariant.Create and threw an unhandled
ArgumentException that crashed the process. The event only fires when a UIA
client is listening, so it reproduced only on "some machines".
Mirror the BCL System.Runtime.InteropServices.Marshalling.ComVariant (which
this type is based on): overlay a decimal field on the variant, write it
before setting the VT_DECIMAL discriminator in Create (the discriminator
overlaps the decimal's unused leading bytes), and clear that discriminator on
a copy before reading the value back in AsObject.
Fixes#21491
* check permissions before reading or writing to clipboard
* throw UnauthorizedAccessException when permission is not granted for clipboard
* handle unauthorized access exceptions for clipboard in textbox
* check only for denied errors on clipboard
* addressed review
* wasm - use marshal methods instead when reading clipboard
* log unauthorized read clipboard error
* Improve logging
* Also log in MaskedTextBox
---------
Co-authored-by: Julien Lebosquain <julien@lebosquain.net>
* AT-SPI: add to the selection in Selection.SelectChild instead of replacing it
* AT-SPI: expose list item containers as accessible children
Index selectable items directly under the selection container so the
Selection interface's SelectChild/DeselectChild address them by index.
* Expose ListBox selection to accessibility via a selection peer
ListBox used ItemsControlAutomationPeer, which is not an ISelectionProvider,
so it never exposed the Selection interface (AT-SPI) for multi-select.
* Address review: expose item containers from the base ItemsControl peer
Move the GetChildrenCore container override down to ItemsControlAutomationPeer so every ItemsControl returns its containers, and return null directly when there are no items instead of calling the base algorithm.
* Use file-scoped namespace in ListBoxAutomationPeer
* Fix cross-platform regression: move child flattening from the peer to the AT-SPI selection handler
* Trigger rebuild
* AT-SPI: flatten selection container item children in the node layer, not the shared peer
Present a SelectingItemsControl's realized item containers as its direct AT-SPI children inside AtSpiNode so SelectChild-by-index and a selectable item's parent lookup resolve to the Selection container. Doing this in the FreeDesktop AT-SPI layer keeps the macOS AX and Windows UIA peer trees intact, avoiding the item-frame and tree-collapse regressions the shared ItemsControlAutomationPeer override caused.
* Fix TopMost handling for Popups on Windows
* Properly handle TopMost property changes
* Call SetTopMost in PopupRoot constructor (similar to SetWindowManagerAddShadowHint)
* Make sure the parent is focused when the popup is clicked directly to activate the app.
* Move PopupsPage to IntegrationTestApp
* Move Popup code to the XAML, making visual/logical management implicit
* Add popup integration tests
* Fix MenuTests+Default.Click_Grandchild by delaying popup activation
* Kill input focus when input element on popup is focused element
* try to fix tests
* try to fix test v2
* Integration tests: ensure menus get closed after testing
* run popup tests only on windows
* WIP: Removing the hack to see if anything changes.
* WIP: Removing the second hack.
I'm guessing this will fix it.
* fix to make transparent window integration app work on macOS
* fix menu tests
* Fix warning in MenuTests
* Add a background to integration test popup
---------
Co-authored-by: Maxwell Katz <maxkatz6@outlook.com>
Co-authored-by: Steven Kirk <grokys@users.noreply.github.com>
Co-authored-by: Julien Lebosquain <julien@lebosquain.net>
* Use CompiledBinding.Create where possible in sample code
* Avoid "FullyQualifiedName" hacks, use AppContext.BaseDirectory
* Avoid ambigious binding to methods in the sample code
* Use ProcessPath, there are no "dll" in aot
* Disable devtools in release
* Remove "DefineDynamicAssembly" used for persistent assemblies output, we don't target net framework anymore
* Add RequiresDynamicCode to the runtime XAML loader
* Bump XAML
* Bump XAML
* Adding TransparencyLevel property to CompositionTarget
* Try to pass the WindowTransparencyLevel to surface
* Enable change the AlphaMode in WinUI window.
* Support disable transparency explicitly;
* Adding the test demo code.
* Fix ICompositionDrawingSurfaceInterop.BeginDraw fail. Because the surface do not set size.
* Merge the same code
* Fix compile
* Add test demo code
* Put the re create surface to trycatch block.
Solve the `transaction` do not be disposed when CreateSurface exception.
* Add the dynamic Transparency alpha mode support to DirectComposited
* Revert "Adding TransparencyLevel property to CompositionTarget"
This reverts commit da0af790b1.
* Adding TransparencyLevel property to CompositionTarget
* Adding TransparencyLevel to RenderTargetSceneInfo
* Try remove the pass level
* Finish pass RenderTargetSceneInfo to create surface.
* Remove the unuse argument
* Remove the unuse code
* Bring the comments closer to the code
* Revert sort using
* Remove the unuse using
* Try fix compile error
* Remove the unuse namespace using.
* Try fix API changed
* Try fix compile
* Update api