Add 5 verified files from decompiled production code
Changes: - GtkWebViewHandler.cs - New native WebKit handler - GtkWebViewProxy.cs - New proxy for WebView positioning - WebViewHandler.cs - Fixed navigation event handling - PageHandler.cs - Added MapBackgroundColor - SkiaView.cs - Made Arrange() virtual Also adds CLAUDE.md (instructions) and MERGE_TRACKING.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
273
CLAUDE.md
273
CLAUDE.md
@@ -1,64 +1,251 @@
|
|||||||
# CLAUDE.md - CRITICAL INSTRUCTIONS
|
# CLAUDE.md - OpenMaui Linux Recovery Instructions
|
||||||
|
|
||||||
## CRITICAL: SOURCE OF TRUTH
|
## READ THIS FIRST
|
||||||
|
|
||||||
**DECOMPILED CODE = PRODUCTION VERSION (with all fixes/changes)**
|
This file contains critical instructions for restoring lost production code. **Read this entire file before doing ANY work.**
|
||||||
**MAIN BRANCH = OUTDATED VERSION**
|
|
||||||
|
|
||||||
The decompiled code in `/Users/nible/Documents/GitHub/recovered/source/OpenMaui/` represents the PRODUCTION version that was actually running. It contains all fixes and changes that were made during development. We don't know exactly what was fixed or changed - that work was LOST.
|
---
|
||||||
|
|
||||||
The main branch is OUTDATED and missing those production fixes.
|
## Background
|
||||||
|
|
||||||
DO NOT assume main is correct. DO NOT skip files because "they already exist in main". Compare EVERYTHING and apply the differences from decompiled to bring main up to the production state.
|
Production code was lost. The only surviving copy was recovered by decompiling production DLLs. The decompiled code has ugly syntax but represents the **actual working production code**.
|
||||||
|
|
||||||
## Merge Process
|
---
|
||||||
|
|
||||||
1. **For EVERY file in decompiled**: Compare with main and APPLY THE FIXES
|
## The Core Rule
|
||||||
2. **Embedded classes**: Files like `LayoutHandler.cs` contain multiple classes (GridHandler, StackLayoutHandler, etc.) - these ALL need to be compared and updated with decompiled fixes
|
|
||||||
3. **Do not skip**: Even if a class "exists" in main, it's likely BROKEN and needs the decompiled version
|
**DECOMPILED CODE = SOURCE OF TRUTH**
|
||||||
|
|
||||||
|
The decompiled code in the `recovered` folder is what was actually running in production. Your job is to:
|
||||||
|
|
||||||
|
1. Read the decompiled file
|
||||||
|
2. Understand the LOGIC (ignore ugly syntax)
|
||||||
|
3. Write that same logic in clean, maintainable C#
|
||||||
|
4. Save it to the `final` branch
|
||||||
|
|
||||||
|
**Do NOT:**
|
||||||
|
- Skip files because "main looks fine"
|
||||||
|
- Assume main is correct
|
||||||
|
- Change the logic from decompiled
|
||||||
|
- Stub out code with comments
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## File Locations
|
||||||
|
|
||||||
|
| What | Path |
|
||||||
|
|------|------|
|
||||||
|
| **Target (write here)** | `/Users/nible/Documents/GitHub/maui-linux-main/` |
|
||||||
|
| **Decompiled Views** | `/Users/nible/Documents/GitHub/recovered/source/OpenMaui/Microsoft.Maui.Platform/` |
|
||||||
|
| **Decompiled Handlers** | `/Users/nible/Documents/GitHub/recovered/source/OpenMaui/Microsoft.Maui.Platform.Linux.Handlers/` |
|
||||||
|
| **Decompiled Services** | `/Users/nible/Documents/GitHub/recovered/source/OpenMaui/Microsoft.Maui.Platform.Linux.Services/` |
|
||||||
|
| **Decompiled Hosting** | `/Users/nible/Documents/GitHub/recovered/source/OpenMaui/Microsoft.Maui.Platform.Linux.Hosting/` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Branch
|
## Branch
|
||||||
|
|
||||||
- Work on `final` branch only
|
**Work on `final` branch ONLY.**
|
||||||
- User will review and merge to main
|
|
||||||
|
|
||||||
## Decompiled Code Location
|
The user will review all changes before merging to main. Always verify you're on `final`:
|
||||||
|
```bash
|
||||||
|
git branch # Should show * final
|
||||||
|
```
|
||||||
|
|
||||||
- `/Users/nible/Documents/GitHub/recovered/source/OpenMaui/Microsoft.Maui.Platform/` - Views, Types
|
---
|
||||||
- `/Users/nible/Documents/GitHub/recovered/source/OpenMaui/Microsoft.Maui.Platform.Linux.Handlers/` - Handlers
|
|
||||||
- `/Users/nible/Documents/GitHub/recovered/source/OpenMaui/Microsoft.Maui.Platform.Linux.Hosting/` - Hosting
|
|
||||||
- `/Users/nible/Documents/GitHub/recovered/source/OpenMaui/Microsoft.Maui.Platform.Linux.Services/` - Services
|
|
||||||
|
|
||||||
## Tracking
|
## How to Process Each File
|
||||||
|
|
||||||
Update `/Users/nible/Documents/GitHub/maui-linux-main/MERGE_TRACKING.md` after EVERY change.
|
### Step 1: Read the decompiled version
|
||||||
|
```
|
||||||
|
Read /Users/nible/Documents/GitHub/recovered/source/OpenMaui/[path]/[FileName].cs
|
||||||
|
```
|
||||||
|
|
||||||
## What Was INCORRECTLY Skipped (Must Be Fixed)
|
### Step 2: Read the current main version
|
||||||
|
```
|
||||||
|
Read /Users/nible/Documents/GitHub/maui-linux-main/[path]/[FileName].cs
|
||||||
|
```
|
||||||
|
|
||||||
These were skipped because I wrongly assumed main was correct:
|
### Step 3: Compare the LOGIC
|
||||||
|
- Ignore syntax differences (decompiler artifacts)
|
||||||
|
- Look for: missing methods, different behavior, missing properties, different logic flow
|
||||||
|
|
||||||
### Type files deleted (need to compare and update inline versions):
|
### Step 4: If logic differs, update main with clean version
|
||||||
- All event args in SkiaView.cs, SkiaCheckBox.cs, etc.
|
Write the decompiled logic using clean C# syntax.
|
||||||
- GridLength, GridPosition, AbsoluteLayoutBounds in SkiaLayoutView.cs
|
|
||||||
- MenuItem, MenuBarItem in SkiaMenuBar.cs
|
|
||||||
- ShellSection, ShellContent in SkiaShell.cs
|
|
||||||
- Many more...
|
|
||||||
|
|
||||||
### Handler files not compared:
|
### Step 5: Build and verify
|
||||||
- GridHandler (in LayoutHandler.cs) - NEEDS FIXES FROM DECOMPILED
|
```bash
|
||||||
- StackLayoutHandler (in LayoutHandler.cs) - NEEDS FIXES FROM DECOMPILED
|
dotnet build
|
||||||
- ContentPageHandler (in PageHandler.cs) - NEEDS FIXES FROM DECOMPILED
|
```
|
||||||
|
|
||||||
### View files not compared:
|
### Step 6: Report what changed
|
||||||
- SkiaGrid (in SkiaLayoutView.cs) - NEEDS FIXES FROM DECOMPILED
|
Tell the user specifically what was different, not just "looks equivalent."
|
||||||
- SkiaStackLayout (in SkiaLayoutView.cs) - NEEDS FIXES FROM DECOMPILED
|
|
||||||
- SkiaAbsoluteLayout (in SkiaLayoutView.cs) - NEEDS FIXES FROM DECOMPILED
|
|
||||||
- SkiaContentPage (in SkiaPage.cs) - NEEDS FIXES FROM DECOMPILED
|
|
||||||
- SkiaFrame (in SkiaBorder.cs) - NEEDS FIXES FROM DECOMPILED
|
|
||||||
|
|
||||||
## Clean Code Rule
|
---
|
||||||
|
|
||||||
When copying from decompiled, clean up decompiler artifacts:
|
## Cleaning Decompiled Code
|
||||||
- `_002Ector` → constructor
|
|
||||||
- `((Type)(ref var))` patterns → clean casting
|
### Decompiler artifacts to fix:
|
||||||
- IL comments → remove
|
|
||||||
|
| Ugly (decompiled) | Clean (what you write) |
|
||||||
|
|-------------------|------------------------|
|
||||||
|
| `((ViewHandler<T, U>)(object)handler).PlatformView` | `handler.PlatformView` |
|
||||||
|
| `((BindableObject)this).GetValue(X)` | `GetValue(X)` |
|
||||||
|
| `(Type)(object)((x is Type) ? x : null)` | `x as Type` or `x is Type t ? t : null` |
|
||||||
|
| `//IL_xxxx: Unknown result type` | Delete these comments |
|
||||||
|
| `_002Ector` | Constructor call |
|
||||||
|
| `(BindingMode)2` | `BindingMode.TwoWay` |
|
||||||
|
| `(WebNavigationEvent)3` | `WebNavigationEvent.NewPage` |
|
||||||
|
| `((Thickness)(ref padding)).Left` | `padding.Left` |
|
||||||
|
| `((SKRect)(ref bounds)).Width` | `bounds.Width` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Using Agents (Task Tool)
|
||||||
|
|
||||||
|
Agents work fine IF you give them the right instructions. Previous failures happened because the agent prompts didn't include the critical rules.
|
||||||
|
|
||||||
|
### Required Agent Prompt Template
|
||||||
|
|
||||||
|
When spawning an agent, ALWAYS include this in the prompt:
|
||||||
|
|
||||||
|
```
|
||||||
|
## CRITICAL RULES - READ FIRST
|
||||||
|
|
||||||
|
1. DECOMPILED CODE = PRODUCTION (source of truth)
|
||||||
|
2. MAIN BRANCH = OUTDATED (needs to be updated)
|
||||||
|
3. Do NOT skip files
|
||||||
|
4. Do NOT assume main is correct
|
||||||
|
5. Do NOT say "equivalent" or "no changes needed" without listing every method/property you compared
|
||||||
|
|
||||||
|
## Your Task
|
||||||
|
|
||||||
|
Compare these two files:
|
||||||
|
- DECOMPILED (truth): [full path to decompiled file]
|
||||||
|
- MAIN (to update): [full path to main file]
|
||||||
|
|
||||||
|
For each method/property in decompiled:
|
||||||
|
1. Check if it exists in main
|
||||||
|
2. Check if the LOGIC is the same (ignore syntax differences)
|
||||||
|
3. Report: "METHOD X: [exists/missing] [logic same/different]"
|
||||||
|
|
||||||
|
If ANY logic differs or methods are missing, write the clean version to main.
|
||||||
|
|
||||||
|
## Decompiler Syntax to Clean Up
|
||||||
|
- `((ViewHandler<T,U>)(object)handler).PlatformView` → `handler.PlatformView`
|
||||||
|
- `//IL_xxxx:` comments → delete
|
||||||
|
- `(BindingMode)2` → `BindingMode.TwoWay`
|
||||||
|
- `((Thickness)(ref x)).Left` → `x.Left`
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example Agent Call
|
||||||
|
|
||||||
|
```
|
||||||
|
Task tool prompt:
|
||||||
|
"Compare ButtonHandler files.
|
||||||
|
|
||||||
|
CRITICAL RULES:
|
||||||
|
1. DECOMPILED = PRODUCTION (truth)
|
||||||
|
2. MAIN = OUTDATED
|
||||||
|
3. Do NOT skip or say 'equivalent' without proof
|
||||||
|
|
||||||
|
DECOMPILED: /Users/nible/Documents/GitHub/recovered/source/OpenMaui/Microsoft.Maui.Platform.Linux.Handlers/ButtonHandler.cs
|
||||||
|
MAIN: /Users/nible/Documents/GitHub/maui-linux-main/Handlers/ButtonHandler.cs
|
||||||
|
|
||||||
|
List every method in decompiled. For each one, confirm it exists in main with same logic. If different, write the fix."
|
||||||
|
```
|
||||||
|
|
||||||
|
### Why Previous Agents Failed
|
||||||
|
|
||||||
|
The prompts said things like "compare these files" without:
|
||||||
|
- Stating which file is the source of truth
|
||||||
|
- Requiring method-by-method comparison
|
||||||
|
- Forbidding "no changes needed" shortcuts
|
||||||
|
|
||||||
|
Agents took shortcuts because the prompts allowed it.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Event Args - Use MAUI's Directly
|
||||||
|
|
||||||
|
**Do NOT create custom event args that duplicate MAUI's types.**
|
||||||
|
|
||||||
|
The codebase currently has custom `WebNavigatingEventArgs` and `WebNavigatedEventArgs` at the bottom of `Views/SkiaWebView.cs`. These are unnecessary and should be removed. Use MAUI's versions directly:
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
// WRONG - custom event args (remove these)
|
||||||
|
public class WebNavigatingEventArgs : EventArgs { ... } // in SkiaWebView.cs
|
||||||
|
|
||||||
|
// RIGHT - use MAUI's directly
|
||||||
|
Microsoft.Maui.Controls.WebNavigatingEventArgs
|
||||||
|
Microsoft.Maui.Controls.WebNavigatedEventArgs
|
||||||
|
```
|
||||||
|
|
||||||
|
### TODO: Cleanup needed
|
||||||
|
|
||||||
|
1. Remove custom event args from `Views/SkiaWebView.cs` (lines 699-726)
|
||||||
|
2. Update `SkiaWebView` to fire MAUI's event args
|
||||||
|
3. Update handlers to use MAUI's event args directly (no translation layer)
|
||||||
|
|
||||||
|
### Types that exist in both namespaces
|
||||||
|
|
||||||
|
These MAUI types also exist in our `Microsoft.Maui.Platform` namespace - use MAUI's:
|
||||||
|
|
||||||
|
| Use This (MAUI) | Not This (ours) |
|
||||||
|
|-----------------|-----------------|
|
||||||
|
| `Microsoft.Maui.Controls.WebNavigatingEventArgs` | `Microsoft.Maui.Platform.WebNavigatingEventArgs` |
|
||||||
|
| `Microsoft.Maui.Controls.WebNavigatedEventArgs` | `Microsoft.Maui.Platform.WebNavigatedEventArgs` |
|
||||||
|
| `Microsoft.Maui.TextAlignment` | `Microsoft.Maui.Platform.TextAlignment` |
|
||||||
|
| `Microsoft.Maui.LineBreakMode` | `Microsoft.Maui.Platform.LineBreakMode` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Build Command
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /Users/nible/Documents/GitHub/maui-linux-main
|
||||||
|
dotnet build
|
||||||
|
```
|
||||||
|
|
||||||
|
Build after completing a batch of related changes, not after every single file.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## What Was Already Done (This Session)
|
||||||
|
|
||||||
|
Files modified in this session:
|
||||||
|
- `Handlers/GtkWebViewHandler.cs` - Added (new file from decompiled)
|
||||||
|
- `Handlers/GtkWebViewProxy.cs` - Added (new file from decompiled)
|
||||||
|
- `Handlers/WebViewHandler.cs` - Fixed navigation event handling
|
||||||
|
- `Handlers/PageHandler.cs` - Added MapBackgroundColor
|
||||||
|
- `Views/SkiaView.cs` - Made Arrange() virtual
|
||||||
|
|
||||||
|
Build status: **SUCCEEDS** as of last check.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Files Still To Process
|
||||||
|
|
||||||
|
The following decompiled files need to be compared with main:
|
||||||
|
- All files in `Microsoft.Maui.Platform/` (Views)
|
||||||
|
- All files in `Microsoft.Maui.Platform.Linux.Handlers/` (Handlers)
|
||||||
|
- All files in `Microsoft.Maui.Platform.Linux.Services/` (Services)
|
||||||
|
- All files in `Microsoft.Maui.Platform.Linux.Hosting/` (Hosting)
|
||||||
|
|
||||||
|
Use this to list decompiled files:
|
||||||
|
```bash
|
||||||
|
ls /Users/nible/Documents/GitHub/recovered/source/OpenMaui/Microsoft.Maui.Platform/*.cs
|
||||||
|
ls /Users/nible/Documents/GitHub/recovered/source/OpenMaui/Microsoft.Maui.Platform.Linux.Handlers/*.cs
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Summary for New Session
|
||||||
|
|
||||||
|
1. You're restoring production code from decompiled DLLs
|
||||||
|
2. Decompiled = truth, main = outdated
|
||||||
|
3. Clean up syntax, preserve logic
|
||||||
|
4. Work on `final` branch
|
||||||
|
5. Build after every change
|
||||||
|
6. Agents work - but MUST include the critical rules in every prompt (see "Using Agents" section)
|
||||||
|
7. Don't skip files or say "equivalent" without listing every method compared
|
||||||
|
|||||||
233
Handlers/GtkWebViewHandler.cs
Normal file
233
Handlers/GtkWebViewHandler.cs
Normal file
@@ -0,0 +1,233 @@
|
|||||||
|
// Licensed to the .NET Foundation under one or more agreements.
|
||||||
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
|
|
||||||
|
using Microsoft.Maui.Controls;
|
||||||
|
using Microsoft.Maui.Handlers;
|
||||||
|
using Microsoft.Maui.Platform.Linux.Native;
|
||||||
|
using Microsoft.Maui.Platform.Linux.Services;
|
||||||
|
using SkiaSharp;
|
||||||
|
|
||||||
|
namespace Microsoft.Maui.Platform.Linux.Handlers;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handler for WebView using native GTK WebKitGTK widget.
|
||||||
|
/// </summary>
|
||||||
|
public class GtkWebViewHandler : ViewHandler<IWebView, GtkWebViewProxy>
|
||||||
|
{
|
||||||
|
private GtkWebViewPlatformView? _platformWebView;
|
||||||
|
private bool _isRegisteredWithHost;
|
||||||
|
private SKRect _lastBounds;
|
||||||
|
|
||||||
|
public static IPropertyMapper<IWebView, GtkWebViewHandler> Mapper = new PropertyMapper<IWebView, GtkWebViewHandler>(ViewHandler.ViewMapper)
|
||||||
|
{
|
||||||
|
[nameof(IWebView.Source)] = MapSource,
|
||||||
|
};
|
||||||
|
|
||||||
|
public static CommandMapper<IWebView, GtkWebViewHandler> CommandMapper = new(ViewHandler.ViewCommandMapper)
|
||||||
|
{
|
||||||
|
[nameof(IWebView.GoBack)] = MapGoBack,
|
||||||
|
[nameof(IWebView.GoForward)] = MapGoForward,
|
||||||
|
[nameof(IWebView.Reload)] = MapReload,
|
||||||
|
};
|
||||||
|
|
||||||
|
public GtkWebViewHandler() : base(Mapper, CommandMapper)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public GtkWebViewHandler(IPropertyMapper? mapper = null, CommandMapper? commandMapper = null)
|
||||||
|
: base(mapper ?? Mapper, commandMapper ?? CommandMapper)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override GtkWebViewProxy CreatePlatformView()
|
||||||
|
{
|
||||||
|
_platformWebView = new GtkWebViewPlatformView();
|
||||||
|
return new GtkWebViewProxy(this, _platformWebView);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void ConnectHandler(GtkWebViewProxy platformView)
|
||||||
|
{
|
||||||
|
base.ConnectHandler(platformView);
|
||||||
|
if (_platformWebView != null)
|
||||||
|
{
|
||||||
|
_platformWebView.NavigationStarted += OnNavigationStarted;
|
||||||
|
_platformWebView.NavigationCompleted += OnNavigationCompleted;
|
||||||
|
}
|
||||||
|
Console.WriteLine("[GtkWebViewHandler] ConnectHandler - WebView ready");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void DisconnectHandler(GtkWebViewProxy platformView)
|
||||||
|
{
|
||||||
|
if (_platformWebView != null)
|
||||||
|
{
|
||||||
|
_platformWebView.NavigationStarted -= OnNavigationStarted;
|
||||||
|
_platformWebView.NavigationCompleted -= OnNavigationCompleted;
|
||||||
|
UnregisterFromHost();
|
||||||
|
_platformWebView.Dispose();
|
||||||
|
_platformWebView = null;
|
||||||
|
}
|
||||||
|
base.DisconnectHandler(platformView);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnNavigationStarted(object? sender, string uri)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"[GtkWebViewHandler] Navigation started: {uri}");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
GLibNative.IdleAdd(() =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (VirtualView is IWebViewController controller)
|
||||||
|
{
|
||||||
|
var args = new Microsoft.Maui.Controls.WebNavigatingEventArgs(
|
||||||
|
WebNavigationEvent.NewPage, null, uri);
|
||||||
|
controller.SendNavigating(args);
|
||||||
|
Console.WriteLine("[GtkWebViewHandler] Sent Navigating event to VirtualView");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"[GtkWebViewHandler] Error in SendNavigating: {ex.Message}");
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"[GtkWebViewHandler] Error dispatching navigation started: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnNavigationCompleted(object? sender, (string Url, bool Success) e)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"[GtkWebViewHandler] Navigation completed: {e.Url} (Success: {e.Success})");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
GLibNative.IdleAdd(() =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (VirtualView is IWebViewController controller)
|
||||||
|
{
|
||||||
|
var result = e.Success ? WebNavigationResult.Success : WebNavigationResult.Failure;
|
||||||
|
var args = new Microsoft.Maui.Controls.WebNavigatedEventArgs(
|
||||||
|
WebNavigationEvent.NewPage, null, e.Url, result);
|
||||||
|
controller.SendNavigated(args);
|
||||||
|
|
||||||
|
bool canGoBack = _platformWebView?.CanGoBack() ?? false;
|
||||||
|
bool canGoForward = _platformWebView?.CanGoForward() ?? false;
|
||||||
|
controller.CanGoBack = canGoBack;
|
||||||
|
controller.CanGoForward = canGoForward;
|
||||||
|
Console.WriteLine($"[GtkWebViewHandler] Sent Navigated, CanGoBack={canGoBack}, CanGoForward={canGoForward}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"[GtkWebViewHandler] Error in SendNavigated: {ex.Message}");
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"[GtkWebViewHandler] Error dispatching navigation completed: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void RegisterWithHost(SKRect bounds)
|
||||||
|
{
|
||||||
|
if (_platformWebView == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var hostService = GtkHostService.Instance;
|
||||||
|
if (hostService.HostWindow == null || hostService.WebViewManager == null)
|
||||||
|
{
|
||||||
|
Console.WriteLine("[GtkWebViewHandler] Warning: GTK host not initialized, cannot register WebView");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int x = (int)bounds.Left;
|
||||||
|
int y = (int)bounds.Top;
|
||||||
|
int width = (int)bounds.Width;
|
||||||
|
int height = (int)bounds.Height;
|
||||||
|
|
||||||
|
if (width <= 0 || height <= 0)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"[GtkWebViewHandler] Skipping invalid bounds: {bounds}");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_isRegisteredWithHost)
|
||||||
|
{
|
||||||
|
hostService.HostWindow.AddWebView(_platformWebView.Widget, x, y, width, height);
|
||||||
|
_isRegisteredWithHost = true;
|
||||||
|
Console.WriteLine($"[GtkWebViewHandler] Registered WebView at ({x}, {y}) size {width}x{height}");
|
||||||
|
}
|
||||||
|
else if (bounds != _lastBounds)
|
||||||
|
{
|
||||||
|
hostService.HostWindow.MoveResizeWebView(_platformWebView.Widget, x, y, width, height);
|
||||||
|
Console.WriteLine($"[GtkWebViewHandler] Updated WebView to ({x}, {y}) size {width}x{height}");
|
||||||
|
}
|
||||||
|
|
||||||
|
_lastBounds = bounds;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UnregisterFromHost()
|
||||||
|
{
|
||||||
|
if (_isRegisteredWithHost && _platformWebView != null)
|
||||||
|
{
|
||||||
|
var hostService = GtkHostService.Instance;
|
||||||
|
if (hostService.HostWindow != null)
|
||||||
|
{
|
||||||
|
hostService.HostWindow.RemoveWebView(_platformWebView.Widget);
|
||||||
|
Console.WriteLine("[GtkWebViewHandler] Unregistered WebView from host");
|
||||||
|
}
|
||||||
|
_isRegisteredWithHost = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void MapSource(GtkWebViewHandler handler, IWebView webView)
|
||||||
|
{
|
||||||
|
if (handler._platformWebView == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var source = webView.Source;
|
||||||
|
Console.WriteLine($"[GtkWebViewHandler] MapSource: {source?.GetType().Name ?? "null"}");
|
||||||
|
|
||||||
|
if (source is UrlWebViewSource urlSource)
|
||||||
|
{
|
||||||
|
var url = urlSource.Url;
|
||||||
|
if (!string.IsNullOrEmpty(url))
|
||||||
|
{
|
||||||
|
handler._platformWebView.Navigate(url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (source is HtmlWebViewSource htmlSource)
|
||||||
|
{
|
||||||
|
var html = htmlSource.Html;
|
||||||
|
if (!string.IsNullOrEmpty(html))
|
||||||
|
{
|
||||||
|
handler._platformWebView.LoadHtml(html, htmlSource.BaseUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void MapGoBack(GtkWebViewHandler handler, IWebView webView, object? args)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"[GtkWebViewHandler] MapGoBack called, CanGoBack={handler._platformWebView?.CanGoBack()}");
|
||||||
|
handler._platformWebView?.GoBack();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void MapGoForward(GtkWebViewHandler handler, IWebView webView, object? args)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"[GtkWebViewHandler] MapGoForward called, CanGoForward={handler._platformWebView?.CanGoForward()}");
|
||||||
|
handler._platformWebView?.GoForward();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void MapReload(GtkWebViewHandler handler, IWebView webView, object? args)
|
||||||
|
{
|
||||||
|
Console.WriteLine("[GtkWebViewHandler] MapReload called");
|
||||||
|
handler._platformWebView?.Reload();
|
||||||
|
}
|
||||||
|
}
|
||||||
83
Handlers/GtkWebViewProxy.cs
Normal file
83
Handlers/GtkWebViewProxy.cs
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
// Licensed to the .NET Foundation under one or more agreements.
|
||||||
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
|
|
||||||
|
using Microsoft.Maui.Platform;
|
||||||
|
using SkiaSharp;
|
||||||
|
|
||||||
|
namespace Microsoft.Maui.Platform.Linux.Handlers;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Proxy view that bridges SkiaView layout to GTK WebView positioning.
|
||||||
|
/// </summary>
|
||||||
|
public class GtkWebViewProxy : SkiaView
|
||||||
|
{
|
||||||
|
private readonly GtkWebViewHandler _handler;
|
||||||
|
private readonly GtkWebViewPlatformView _platformView;
|
||||||
|
|
||||||
|
public GtkWebViewPlatformView PlatformView => _platformView;
|
||||||
|
public bool CanGoBack => _platformView.CanGoBack();
|
||||||
|
public bool CanGoForward => _platformView.CanGoForward();
|
||||||
|
|
||||||
|
public GtkWebViewProxy(GtkWebViewHandler handler, GtkWebViewPlatformView platformView)
|
||||||
|
{
|
||||||
|
_handler = handler;
|
||||||
|
_platformView = platformView;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Arrange(SKRect bounds)
|
||||||
|
{
|
||||||
|
base.Arrange(bounds);
|
||||||
|
var windowBounds = TransformToWindow(bounds);
|
||||||
|
_handler.RegisterWithHost(windowBounds);
|
||||||
|
}
|
||||||
|
|
||||||
|
private SKRect TransformToWindow(SKRect localBounds)
|
||||||
|
{
|
||||||
|
float x = localBounds.Left;
|
||||||
|
float y = localBounds.Top;
|
||||||
|
|
||||||
|
for (var parent = Parent; parent != null; parent = parent.Parent)
|
||||||
|
{
|
||||||
|
x += parent.Bounds.Left;
|
||||||
|
y += parent.Bounds.Top;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new SKRect(x, y, x + localBounds.Width, y + localBounds.Height);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Draw(SKCanvas canvas)
|
||||||
|
{
|
||||||
|
// Draw transparent placeholder - actual WebView is rendered by GTK
|
||||||
|
using var paint = new SKPaint
|
||||||
|
{
|
||||||
|
Color = new SKColor(0, 0, 0, 0),
|
||||||
|
Style = SKPaintStyle.Fill
|
||||||
|
};
|
||||||
|
canvas.DrawRect(Bounds, paint);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Navigate(string url)
|
||||||
|
{
|
||||||
|
_platformView.Navigate(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LoadHtml(string html, string? baseUrl = null)
|
||||||
|
{
|
||||||
|
_platformView.LoadHtml(html, baseUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void GoBack()
|
||||||
|
{
|
||||||
|
_platformView.GoBack();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void GoForward()
|
||||||
|
{
|
||||||
|
_platformView.GoForward();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Reload()
|
||||||
|
{
|
||||||
|
_platformView.Reload();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -22,6 +22,7 @@ public partial class PageHandler : ViewHandler<Page, SkiaPage>
|
|||||||
[nameof(Page.BackgroundImageSource)] = MapBackgroundImageSource,
|
[nameof(Page.BackgroundImageSource)] = MapBackgroundImageSource,
|
||||||
[nameof(Page.Padding)] = MapPadding,
|
[nameof(Page.Padding)] = MapPadding,
|
||||||
[nameof(IView.Background)] = MapBackground,
|
[nameof(IView.Background)] = MapBackground,
|
||||||
|
[nameof(VisualElement.BackgroundColor)] = MapBackgroundColor,
|
||||||
};
|
};
|
||||||
|
|
||||||
public static CommandMapper<Page, PageHandler> CommandMapper =
|
public static CommandMapper<Page, PageHandler> CommandMapper =
|
||||||
@@ -101,6 +102,18 @@ public partial class PageHandler : ViewHandler<Page, SkiaPage>
|
|||||||
handler.PlatformView.BackgroundColor = solidBrush.Color.ToSKColor();
|
handler.PlatformView.BackgroundColor = solidBrush.Color.ToSKColor();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void MapBackgroundColor(PageHandler handler, Page page)
|
||||||
|
{
|
||||||
|
if (handler.PlatformView is null) return;
|
||||||
|
|
||||||
|
var backgroundColor = page.BackgroundColor;
|
||||||
|
if (backgroundColor != null && backgroundColor != Colors.Transparent)
|
||||||
|
{
|
||||||
|
handler.PlatformView.BackgroundColor = backgroundColor.ToSKColor();
|
||||||
|
Console.WriteLine($"[PageHandler] MapBackgroundColor: {backgroundColor}");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -54,29 +54,63 @@ public partial class WebViewHandler : ViewHandler<IWebView, SkiaWebView>
|
|||||||
base.DisconnectHandler(platformView);
|
base.DisconnectHandler(platformView);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnNavigating(object? sender, WebNavigatingEventArgs e)
|
private void OnNavigating(object? sender, Microsoft.Maui.Platform.WebNavigatingEventArgs e)
|
||||||
{
|
{
|
||||||
// Forward to virtual view if needed
|
IWebView virtualView = VirtualView;
|
||||||
|
IWebViewController? controller = virtualView as IWebViewController;
|
||||||
|
if (controller != null)
|
||||||
|
{
|
||||||
|
var args = new Microsoft.Maui.Controls.WebNavigatingEventArgs(
|
||||||
|
WebNavigationEvent.NewPage,
|
||||||
|
null,
|
||||||
|
e.Url);
|
||||||
|
controller.SendNavigating(args);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnNavigated(object? sender, WebNavigatedEventArgs e)
|
private void OnNavigated(object? sender, Microsoft.Maui.Platform.WebNavigatedEventArgs e)
|
||||||
{
|
{
|
||||||
// Forward to virtual view if needed
|
IWebView virtualView = VirtualView;
|
||||||
|
IWebViewController? controller = virtualView as IWebViewController;
|
||||||
|
if (controller != null)
|
||||||
|
{
|
||||||
|
WebNavigationResult result = e.Success ? WebNavigationResult.Success : WebNavigationResult.Failure;
|
||||||
|
var args = new Microsoft.Maui.Controls.WebNavigatedEventArgs(
|
||||||
|
WebNavigationEvent.NewPage,
|
||||||
|
null,
|
||||||
|
e.Url,
|
||||||
|
result);
|
||||||
|
controller.SendNavigated(args);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void MapSource(WebViewHandler handler, IWebView webView)
|
public static void MapSource(WebViewHandler handler, IWebView webView)
|
||||||
{
|
{
|
||||||
if (handler.PlatformView == null) return;
|
Console.WriteLine("[WebViewHandler] MapSource called");
|
||||||
|
if (handler.PlatformView == null)
|
||||||
|
{
|
||||||
|
Console.WriteLine("[WebViewHandler] PlatformView is null!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var source = webView.Source;
|
var source = webView.Source;
|
||||||
|
Console.WriteLine($"[WebViewHandler] Source type: {source?.GetType().Name ?? "null"}");
|
||||||
|
|
||||||
if (source is UrlWebViewSource urlSource)
|
if (source is UrlWebViewSource urlSource)
|
||||||
{
|
{
|
||||||
|
Console.WriteLine($"[WebViewHandler] Loading URL: {urlSource.Url}");
|
||||||
handler.PlatformView.Source = urlSource.Url ?? "";
|
handler.PlatformView.Source = urlSource.Url ?? "";
|
||||||
}
|
}
|
||||||
else if (source is HtmlWebViewSource htmlSource)
|
else if (source is HtmlWebViewSource htmlSource)
|
||||||
{
|
{
|
||||||
|
Console.WriteLine($"[WebViewHandler] Loading HTML ({htmlSource.Html?.Length ?? 0} chars)");
|
||||||
|
Console.WriteLine($"[WebViewHandler] HTML preview: {htmlSource.Html?.Substring(0, Math.Min(100, htmlSource.Html?.Length ?? 0))}...");
|
||||||
handler.PlatformView.Html = htmlSource.Html ?? "";
|
handler.PlatformView.Html = htmlSource.Html ?? "";
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("[WebViewHandler] Unknown source type or null");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void MapGoBack(WebViewHandler handler, IWebView webView, object? args)
|
public static void MapGoBack(WebViewHandler handler, IWebView webView, object? args)
|
||||||
|
|||||||
@@ -1,426 +1,206 @@
|
|||||||
# OpenMaui Linux - Recovery Merge Tracking
|
# OpenMaui Linux - Recovery Merge Tracking
|
||||||
|
|
||||||
## Executive Summary
|
**Branch:** `final`
|
||||||
|
|
||||||
| Category | In Main | In Decompiled | New to Add | To Compare | Completed |
|
|
||||||
|----------|---------|---------------|------------|------------|-----------|
|
|
||||||
| Handlers | 44 | 48 | 13 | 35 | 23 |
|
|
||||||
| Views/Types | 41 | 118 | 77 | 41 | 10 |
|
|
||||||
| Services | 33 | 103 | 70 | 33 | 7 |
|
|
||||||
| Hosting | 5 | 12 | 7 | 5 | 2 |
|
|
||||||
| Dispatching | 0 | 3 | 3 | 0 | 3 |
|
|
||||||
| Native | 0 | 5 | 5 | 0 | 5 |
|
|
||||||
| Window | 2 | 3 | 1 | 2 | 3 |
|
|
||||||
| Rendering | 1 | 2 | 1 | 1 | 1 |
|
|
||||||
| **TOTAL** | **123** | **289** | **175** | **114** | **54** |
|
|
||||||
|
|
||||||
**Branch:** `main`
|
|
||||||
**Base:** Clean main (builds with 0 errors)
|
|
||||||
**Status:** In progress - BUILD SUCCEEDS
|
|
||||||
**Last Updated:** 2026-01-01
|
**Last Updated:** 2026-01-01
|
||||||
|
**Build Status:** SUCCEEDS
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## HANDLERS
|
## HANDLERS
|
||||||
|
|
||||||
### New Handlers (13 files) - TO ADD
|
| File | Status | Notes |
|
||||||
|
|------|--------|-------|
|
||||||
- [ ] ContentPageHandler.cs - EXISTS IN PageHandler.cs, needs comparison
|
| ActivityIndicatorHandler.cs | [ ] | |
|
||||||
- [x] FlexLayoutHandler.cs - ADDED
|
| ApplicationHandler.cs | [ ] | |
|
||||||
- [x] GestureManager.cs - ADDED (tap, pan, swipe, pointer gesture processing)
|
| BorderHandler.cs | [ ] | |
|
||||||
- [ ] GridHandler.cs - EXISTS IN LayoutHandler.cs, needs comparison
|
| BoxViewHandler.cs | [ ] | |
|
||||||
- [ ] GtkWebViewHandler.cs
|
| ButtonHandler.cs | [ ] | Contains TextButtonHandler |
|
||||||
- [x] GtkWebViewManager.cs - ADDED
|
| CheckBoxHandler.cs | [ ] | |
|
||||||
- [x] GtkWebViewPlatformView.cs - ADDED
|
| CollectionViewHandler.cs | [ ] | |
|
||||||
- [ ] GtkWebViewProxy.cs
|
| DatePickerHandler.cs | [ ] | |
|
||||||
- [ ] LayoutHandlerUpdate.cs - EXISTS IN LayoutHandler.cs
|
| EditorHandler.cs | [ ] | |
|
||||||
- [ ] LinuxApplicationContext.cs
|
| EntryHandler.cs | [ ] | |
|
||||||
- [ ] RelayCommand.cs - EXISTS IN NavigationPageHandler.cs
|
| FlexLayoutHandler.cs | [ ] | |
|
||||||
- [ ] SizeChangedEventArgs.cs
|
| FlyoutPageHandler.cs | [ ] | |
|
||||||
- [ ] SkiaWindow.cs
|
| FrameHandler.cs | [ ] | |
|
||||||
- [ ] StackLayoutHandler.cs - EXISTS IN LayoutHandler.cs, needs comparison
|
| GestureManager.cs | [ ] | |
|
||||||
- [ ] TextButtonHandler.cs - EXISTS IN ButtonHandler.cs
|
| GraphicsViewHandler.cs | [ ] | |
|
||||||
|
| GtkWebViewHandler.cs | [x] | Added new file from decompiled |
|
||||||
### Existing Handlers (35 files) - TO COMPARE
|
| GtkWebViewManager.cs | [ ] | |
|
||||||
|
| GtkWebViewPlatformView.cs | [ ] | |
|
||||||
- [ ] ActivityIndicatorHandler.cs
|
| GtkWebViewProxy.cs | [x] | Added new file from decompiled |
|
||||||
- [ ] ActivityIndicatorHandler.Linux.cs
|
| ImageButtonHandler.cs | [ ] | |
|
||||||
- [ ] ApplicationHandler.cs
|
| ImageHandler.cs | [ ] | |
|
||||||
- [x] BorderHandler.cs - Updated to use ToViewHandler
|
| ItemsViewHandler.cs | [ ] | |
|
||||||
- [ ] BoxViewHandler.cs
|
| LabelHandler.cs | [ ] | |
|
||||||
- [ ] ButtonHandler.cs
|
| LayoutHandler.cs | [ ] | Contains GridHandler, StackLayoutHandler, LayoutHandlerUpdate |
|
||||||
- [ ] ButtonHandler.Linux.cs
|
| NavigationPageHandler.cs | [ ] | Contains RelayCommand |
|
||||||
- [x] CheckBoxHandler.cs - Updated with missing mappers
|
| PageHandler.cs | [x] | Added MapBackgroundColor |
|
||||||
- [ ] CheckBoxHandler.Linux.cs
|
| PickerHandler.cs | [ ] | |
|
||||||
- [x] CollectionViewHandler.cs - Updated to use ToViewHandler
|
| ProgressBarHandler.cs | [ ] | |
|
||||||
- [x] DatePickerHandler.cs - Updated with missing mappers
|
| RadioButtonHandler.cs | [ ] | |
|
||||||
- [ ] EditorHandler.cs
|
| ScrollViewHandler.cs | [ ] | |
|
||||||
- [x] EntryHandler.cs - Updated with missing mappers
|
| SearchBarHandler.cs | [ ] | |
|
||||||
- [ ] EntryHandler.Linux.cs
|
| ShellHandler.cs | [ ] | |
|
||||||
- [ ] FlyoutPageHandler.cs
|
| SliderHandler.cs | [ ] | |
|
||||||
- [x] FrameHandler.cs - Updated to use ToViewHandler
|
| StepperHandler.cs | [ ] | |
|
||||||
- [ ] GraphicsViewHandler.cs
|
| SwitchHandler.cs | [ ] | |
|
||||||
- [ ] ImageButtonHandler.cs
|
| TabbedPageHandler.cs | [ ] | |
|
||||||
- [x] ImageHandler.cs - Updated with LoadFromBitmap support
|
| TimePickerHandler.cs | [ ] | |
|
||||||
- [ ] ItemsViewHandler.cs
|
| WebViewHandler.cs | [x] | Fixed namespace-qualified event args |
|
||||||
- [x] LabelHandler.cs - Added ConnectHandler, DisconnectHandler, OnPlatformViewTapped, MapFormattedText
|
| WindowHandler.cs | [ ] | Contains SkiaWindow, SizeChangedEventArgs, LinuxApplicationContext |
|
||||||
- [ ] LabelHandler.Linux.cs
|
|
||||||
- [x] LayoutHandler.cs - Updated to use ToViewHandler
|
|
||||||
- [x] LayoutHandler.Linux.cs - Updated to use ToViewHandler
|
|
||||||
- [x] NavigationPageHandler.cs - Updated to use ToViewHandler
|
|
||||||
- [x] PageHandler.cs - Updated to use ToViewHandler
|
|
||||||
- [x] PickerHandler.cs - Updated with missing mappers
|
|
||||||
- [x] ProgressBarHandler.cs - Updated with missing mappers
|
|
||||||
- [ ] ProgressBarHandler.Linux.cs
|
|
||||||
- [ ] RadioButtonHandler.cs
|
|
||||||
- [x] ScrollViewHandler.cs - Updated to use ToViewHandler
|
|
||||||
- [ ] SearchBarHandler.cs
|
|
||||||
- [ ] SearchBarHandler.Linux.cs
|
|
||||||
- [ ] ShellHandler.cs
|
|
||||||
- [ ] SliderHandler.cs
|
|
||||||
- [ ] SliderHandler.Linux.cs
|
|
||||||
- [ ] StepperHandler.cs
|
|
||||||
- [x] SwitchHandler.cs - Updated with missing mappers
|
|
||||||
- [ ] SwitchHandler.Linux.cs
|
|
||||||
- [ ] TabbedPageHandler.cs
|
|
||||||
- [ ] TimePickerHandler.cs
|
|
||||||
- [ ] WebViewHandler.cs
|
|
||||||
- [ ] WebViewHandler.Linux.cs
|
|
||||||
- [ ] WindowHandler.cs
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## VIEWS & TYPES
|
## VIEWS
|
||||||
|
|
||||||
### New Types (77 files) - TO ADD
|
| File | Status | Notes |
|
||||||
|
|------|--------|-------|
|
||||||
- [ ] AbsoluteLayoutBounds.cs - EXISTS IN SkiaLayoutView.cs
|
| SkiaActivityIndicator.cs | [ ] | |
|
||||||
- [ ] AbsoluteLayoutFlags.cs - EXISTS IN SkiaLayoutView.cs
|
| SkiaAlertDialog.cs | [ ] | |
|
||||||
- [ ] CheckedChangedEventArgs.cs
|
| SkiaBorder.cs | [ ] | Contains SkiaFrame |
|
||||||
- [ ] CollectionSelectionChangedEventArgs.cs
|
| SkiaBoxView.cs | [ ] | |
|
||||||
- [ ] ColorExtensions.cs
|
| SkiaButton.cs | [ ] | |
|
||||||
- [ ] ContextMenuItem.cs - EXISTS IN Types/
|
| SkiaCarouselView.cs | [ ] | |
|
||||||
- [ ] FlexAlignContent.cs - EXISTS IN Types/
|
| SkiaCheckBox.cs | [ ] | |
|
||||||
- [ ] FlexAlignItems.cs - EXISTS IN Types/
|
| SkiaCollectionView.cs | [ ] | |
|
||||||
- [ ] FlexAlignSelf.cs - EXISTS IN Types/
|
| SkiaContentPresenter.cs | [ ] | |
|
||||||
- [ ] FlexBasis.cs - EXISTS IN Types/
|
| SkiaContextMenu.cs | [ ] | |
|
||||||
- [ ] FlexDirection.cs - EXISTS IN Types/
|
| SkiaDatePicker.cs | [ ] | |
|
||||||
- [ ] FlexJustify.cs - EXISTS IN Types/
|
| SkiaEditor.cs | [ ] | |
|
||||||
- [ ] FlexWrap.cs - EXISTS IN Types/
|
| SkiaEntry.cs | [ ] | |
|
||||||
- [ ] FlyoutLayoutBehavior.cs
|
| SkiaFlexLayout.cs | [ ] | |
|
||||||
- [ ] FontExtensions.cs
|
| SkiaFlyoutPage.cs | [ ] | |
|
||||||
- [ ] GridLength.cs - EXISTS IN SkiaLayoutView.cs
|
| SkiaGraphicsView.cs | [ ] | |
|
||||||
- [ ] GridPosition.cs - EXISTS IN SkiaLayoutView.cs
|
| SkiaImage.cs | [ ] | |
|
||||||
- [ ] GridUnitType.cs - EXISTS IN SkiaLayoutView.cs
|
| SkiaImageButton.cs | [ ] | |
|
||||||
- [ ] ImageLoadingErrorEventArgs.cs
|
| SkiaIndicatorView.cs | [ ] | |
|
||||||
- [ ] IndicatorShape.cs
|
| SkiaItemsView.cs | [ ] | |
|
||||||
- [ ] ISkiaQueryAttributable.cs - EXISTS IN Types/
|
| SkiaLabel.cs | [ ] | |
|
||||||
- [ ] ItemsLayoutOrientation.cs
|
| SkiaLayoutView.cs | [ ] | Contains SkiaGrid, SkiaStackLayout, SkiaAbsoluteLayout, GridLength, GridPosition |
|
||||||
- [ ] ItemsScrolledEventArgs.cs
|
| SkiaMenuBar.cs | [ ] | Contains MenuItem, MenuBarItem |
|
||||||
- [ ] ItemsViewItemTappedEventArgs.cs
|
| SkiaNavigationPage.cs | [ ] | |
|
||||||
- [ ] Key.cs - EXISTS IN SkiaView.cs
|
| SkiaPage.cs | [ ] | Contains SkiaContentPage, SkiaToolbarItem |
|
||||||
- [ ] KeyEventArgs.cs - EXISTS IN SkiaView.cs
|
| SkiaPicker.cs | [ ] | |
|
||||||
- [ ] KeyModifiers.cs - EXISTS IN SkiaView.cs
|
| SkiaProgressBar.cs | [ ] | |
|
||||||
- [ ] LayoutAlignment.cs
|
| SkiaRadioButton.cs | [ ] | |
|
||||||
- [ ] LineBreakMode.cs
|
| SkiaRefreshView.cs | [ ] | |
|
||||||
- [ ] LinuxDialogService.cs
|
| SkiaScrollView.cs | [ ] | |
|
||||||
- [ ] MenuBarItem.cs - EXISTS IN SkiaMenuBar.cs
|
| SkiaSearchBar.cs | [ ] | |
|
||||||
- [ ] MenuItem.cs - EXISTS IN SkiaMenuBar.cs
|
| SkiaShell.cs | [ ] | Contains ShellSection, ShellContent |
|
||||||
- [ ] MenuItemClickedEventArgs.cs - EXISTS IN SkiaMenuBar.cs
|
| SkiaSlider.cs | [ ] | |
|
||||||
- [ ] NavigationEventArgs.cs - EXISTS IN SkiaNavigationPage.cs
|
| SkiaStepper.cs | [ ] | |
|
||||||
- [ ] PointerButton.cs - EXISTS IN SkiaView.cs
|
| SkiaSwipeView.cs | [ ] | |
|
||||||
- [ ] PointerEventArgs.cs - EXISTS IN SkiaView.cs
|
| SkiaSwitch.cs | [ ] | |
|
||||||
- [ ] PositionChangedEventArgs.cs
|
| SkiaTabbedPage.cs | [ ] | |
|
||||||
- [ ] ProgressChangedEventArgs.cs
|
| SkiaTemplatedView.cs | [ ] | |
|
||||||
- [ ] ScrollBarVisibility.cs - EXISTS IN SkiaScrollView.cs
|
| SkiaTimePicker.cs | [ ] | |
|
||||||
- [ ] ScrolledEventArgs.cs - EXISTS IN SkiaScrollView.cs
|
| SkiaView.cs | [x] | Made Arrange() virtual |
|
||||||
- [ ] ScrollEventArgs.cs - EXISTS IN SkiaView.cs
|
| SkiaVisualStateManager.cs | [ ] | |
|
||||||
- [ ] ScrollOrientation.cs - EXISTS IN SkiaScrollView.cs
|
| SkiaWebView.cs | [ ] | Contains WebNavigatingEventArgs, WebNavigatedEventArgs (TO REMOVE - use MAUI's) |
|
||||||
- [ ] ShellContent.cs - EXISTS IN SkiaShell.cs
|
|
||||||
- [ ] ShellFlyoutBehavior.cs - EXISTS IN SkiaShell.cs
|
|
||||||
- [ ] ShellNavigationEventArgs.cs - EXISTS IN SkiaShell.cs
|
|
||||||
- [ ] ShellSection.cs - EXISTS IN SkiaShell.cs
|
|
||||||
- [ ] SkiaAbsoluteLayout.cs - EXISTS IN SkiaLayoutView.cs
|
|
||||||
- [ ] SkiaContentPage.cs - EXISTS IN SkiaPage.cs
|
|
||||||
- [ ] SkiaContextMenu.cs
|
|
||||||
- [x] SkiaFlexLayout.cs - ADDED
|
|
||||||
- [ ] SkiaFrame.cs - EXISTS IN SkiaBorder.cs
|
|
||||||
- [ ] SkiaGrid.cs - EXISTS IN SkiaLayoutView.cs
|
|
||||||
- [ ] SkiaMenuFlyout.cs
|
|
||||||
- [ ] SkiaSelectionMode.cs
|
|
||||||
- [ ] SkiaStackLayout.cs - EXISTS IN SkiaLayoutView.cs
|
|
||||||
- [ ] SkiaTextAlignment.cs
|
|
||||||
- [ ] SkiaTextSpan.cs - EXISTS IN Types/
|
|
||||||
- [ ] SkiaToolbarItem.cs - EXISTS IN SkiaPage.cs
|
|
||||||
- [ ] SkiaToolbarItemOrder.cs - EXISTS IN SkiaPage.cs
|
|
||||||
- [ ] SkiaVerticalAlignment.cs
|
|
||||||
- [ ] SkiaVisualState.cs
|
|
||||||
- [ ] SkiaVisualStateGroup.cs
|
|
||||||
- [ ] SkiaVisualStateGroupList.cs
|
|
||||||
- [ ] SkiaVisualStateSetter.cs
|
|
||||||
- [ ] SliderValueChangedEventArgs.cs
|
|
||||||
- [ ] StackOrientation.cs - EXISTS IN SkiaLayoutView.cs
|
|
||||||
- [ ] SwipeDirection.cs
|
|
||||||
- [ ] SwipeEndedEventArgs.cs
|
|
||||||
- [ ] SwipeItem.cs
|
|
||||||
- [ ] SwipeMode.cs
|
|
||||||
- [ ] SwipeStartedEventArgs.cs
|
|
||||||
- [ ] SystemClipboard.cs
|
|
||||||
- [ ] TabItem.cs
|
|
||||||
- [ ] TextAlignment.cs
|
|
||||||
- [ ] TextChangedEventArgs.cs
|
|
||||||
- [ ] TextInputEventArgs.cs - EXISTS IN SkiaView.cs
|
|
||||||
- [ ] ThicknessExtensions.cs
|
|
||||||
- [ ] ToggledEventArgs.cs
|
|
||||||
- [ ] WebNavigatedEventArgs.cs
|
|
||||||
- [ ] WebNavigatingEventArgs.cs
|
|
||||||
|
|
||||||
### Existing Views (41 files) - TO COMPARE
|
|
||||||
|
|
||||||
- [ ] LinuxWebView.cs
|
|
||||||
- [ ] SkiaActivityIndicator.cs
|
|
||||||
- [ ] SkiaAlertDialog.cs
|
|
||||||
- [ ] SkiaBorder.cs
|
|
||||||
- [ ] SkiaBoxView.cs
|
|
||||||
- [ ] SkiaButton.cs
|
|
||||||
- [ ] SkiaCarouselView.cs
|
|
||||||
- [ ] SkiaCheckBox.cs
|
|
||||||
- [ ] SkiaCollectionView.cs
|
|
||||||
- [ ] SkiaContentPresenter.cs
|
|
||||||
- [ ] SkiaDatePicker.cs
|
|
||||||
- [ ] SkiaEditor.cs
|
|
||||||
- [x] SkiaEntry.cs - Added context menu support
|
|
||||||
- [ ] SkiaFlyoutPage.cs
|
|
||||||
- [ ] SkiaGraphicsView.cs
|
|
||||||
- [x] SkiaImage.cs - Added LoadFromBitmap method
|
|
||||||
- [ ] SkiaImageButton.cs
|
|
||||||
- [ ] SkiaIndicatorView.cs
|
|
||||||
- [ ] SkiaItemsView.cs
|
|
||||||
- [x] SkiaLabel.cs - Added FormattedSpans, Tapped event, formatted text rendering
|
|
||||||
- [ ] SkiaLayoutView.cs
|
|
||||||
- [ ] SkiaMenuBar.cs
|
|
||||||
- [ ] SkiaNavigationPage.cs
|
|
||||||
- [ ] SkiaPage.cs
|
|
||||||
- [ ] SkiaPicker.cs
|
|
||||||
- [ ] SkiaProgressBar.cs
|
|
||||||
- [ ] SkiaRadioButton.cs
|
|
||||||
- [ ] SkiaRefreshView.cs
|
|
||||||
- [ ] SkiaScrollView.cs
|
|
||||||
- [ ] SkiaSearchBar.cs
|
|
||||||
- [x] SkiaShell.cs - Added MauiShell, ContentRenderer, ColorRefresher, RefreshTheme()
|
|
||||||
- [ ] SkiaSlider.cs
|
|
||||||
- [ ] SkiaStepper.cs
|
|
||||||
- [ ] SkiaSwipeView.cs
|
|
||||||
- [ ] SkiaSwitch.cs
|
|
||||||
- [ ] SkiaTabbedPage.cs
|
|
||||||
- [ ] SkiaTemplatedView.cs
|
|
||||||
- [ ] SkiaTimePicker.cs
|
|
||||||
- [x] SkiaView.cs - Added MauiView, CursorType, transforms (Scale/Rotation/Translation/Anchor), GestureManager integration, enhanced Invalidate/Draw
|
|
||||||
- [ ] SkiaVisualStateManager.cs
|
|
||||||
- [x] SkiaWebView.cs - Added SetMainWindow, ProcessGtkEvents static methods
|
|
||||||
|
|
||||||
### New Views Added This Session
|
|
||||||
|
|
||||||
- [x] SkiaContextMenu.cs - ADDED (context menu with hover, keyboard, dark theme support)
|
|
||||||
- [x] LinuxDialogService.cs - ADDED (dialog and context menu management)
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## SERVICES
|
## SERVICES
|
||||||
|
|
||||||
### New Services (70 files) - TO ADD
|
| File | Status | Notes |
|
||||||
|
|------|--------|-------|
|
||||||
- [ ] AccessibilityServiceFactory.cs
|
| AppActionsService.cs | [ ] | |
|
||||||
- [ ] AccessibleAction.cs
|
| AppInfoService.cs | [ ] | |
|
||||||
- [ ] AccessibleProperty.cs
|
| AtSpi2AccessibilityService.cs | [ ] | |
|
||||||
- [ ] AccessibleRect.cs
|
| BrowserService.cs | [ ] | |
|
||||||
- [ ] AccessibleRole.cs
|
| ClipboardService.cs | [ ] | |
|
||||||
- [ ] AccessibleState.cs
|
| ConnectivityService.cs | [ ] | |
|
||||||
- [ ] AccessibleStates.cs
|
| DeviceDisplayService.cs | [ ] | |
|
||||||
- [ ] AnnouncementPriority.cs
|
| DeviceInfoService.cs | [ ] | |
|
||||||
- [x] AppInfoService.cs - ADDED
|
| DisplayServerFactory.cs | [ ] | |
|
||||||
- [ ] ColorDialogResult.cs
|
| DragDropService.cs | [ ] | |
|
||||||
- [x] ConnectivityService.cs - ADDED
|
| EmailService.cs | [ ] | |
|
||||||
- [ ] DesktopEnvironment.cs - EXISTS IN SystemThemeService.cs
|
| Fcitx5InputMethodService.cs | [ ] | |
|
||||||
- [x] DeviceDisplayService.cs - ADDED
|
| FilePickerService.cs | [ ] | |
|
||||||
- [x] DeviceInfoService.cs - ADDED
|
| FolderPickerService.cs | [ ] | |
|
||||||
- [ ] DisplayServerType.cs - EXISTS IN LinuxApplication.cs
|
| FontFallbackManager.cs | [ ] | |
|
||||||
- [ ] DragAction.cs
|
| GlobalHotkeyService.cs | [ ] | |
|
||||||
- [ ] DragData.cs
|
| Gtk4InteropService.cs | [ ] | |
|
||||||
- [ ] DragEventArgs.cs
|
| GtkHostService.cs | [ ] | |
|
||||||
- [ ] DropEventArgs.cs
|
| HardwareVideoService.cs | [ ] | |
|
||||||
- [ ] FileDialogResult.cs
|
| HiDpiService.cs | [ ] | |
|
||||||
- [ ] FolderPickerOptions.cs
|
| HighContrastService.cs | [ ] | |
|
||||||
- [ ] FolderPickerResult.cs
|
| IAccessibilityService.cs | [ ] | |
|
||||||
- [ ] FolderResult.cs
|
| IBusInputMethodService.cs | [ ] | |
|
||||||
- [ ] GtkButtonsType.cs
|
| IInputMethodService.cs | [ ] | |
|
||||||
- [ ] GtkContextMenuService.cs
|
| InputMethodServiceFactory.cs | [ ] | |
|
||||||
- [ ] GtkFileChooserAction.cs
|
| LauncherService.cs | [ ] | |
|
||||||
- [x] GtkHostService.cs - ADDED
|
| LinuxResourcesProvider.cs | [ ] | |
|
||||||
- [ ] GtkMenuItem.cs
|
| NotificationService.cs | [ ] | |
|
||||||
- [ ] GtkMessageType.cs
|
| PortalFilePickerService.cs | [ ] | |
|
||||||
- [ ] GtkResponseType.cs
|
| PreferencesService.cs | [ ] | |
|
||||||
- [ ] HighContrastChangedEventArgs.cs
|
| SecureStorageService.cs | [ ] | |
|
||||||
- [ ] HighContrastColors.cs
|
| ShareService.cs | [ ] | |
|
||||||
- [ ] HighContrastTheme.cs
|
| SystemThemeService.cs | [ ] | |
|
||||||
- [ ] HotkeyEventArgs.cs
|
| SystemTrayService.cs | [ ] | |
|
||||||
- [ ] HotkeyKey.cs
|
| VersionTrackingService.cs | [ ] | |
|
||||||
- [ ] HotkeyModifiers.cs
|
| VirtualizationManager.cs | [ ] | |
|
||||||
- [ ] IAccessible.cs
|
| X11InputMethodService.cs | [ ] | |
|
||||||
- [ ] IAccessibleEditableText.cs
|
|
||||||
- [ ] IAccessibleText.cs
|
|
||||||
- [ ] IDisplayWindow.cs
|
|
||||||
- [ ] IInputContext.cs
|
|
||||||
- [ ] KeyModifiers.cs
|
|
||||||
- [ ] LinuxFileResult.cs
|
|
||||||
- [x] MauiIconGenerator.cs - ADDED (PNG icon generator, no Svg.Skia dependency)
|
|
||||||
- [ ] NotificationAction.cs
|
|
||||||
- [ ] NotificationActionEventArgs.cs
|
|
||||||
- [ ] NotificationClosedEventArgs.cs
|
|
||||||
- [ ] NotificationCloseReason.cs
|
|
||||||
- [ ] NotificationContext.cs
|
|
||||||
- [ ] NotificationOptions.cs
|
|
||||||
- [ ] NotificationUrgency.cs
|
|
||||||
- [ ] NullAccessibilityService.cs
|
|
||||||
- [ ] NullInputMethodService.cs
|
|
||||||
- [ ] PortalFolderPickerService.cs
|
|
||||||
- [ ] PreEditAttribute.cs
|
|
||||||
- [ ] PreEditAttributeType.cs
|
|
||||||
- [ ] PreEditChangedEventArgs.cs
|
|
||||||
- [ ] ScaleChangedEventArgs.cs
|
|
||||||
- [ ] SystemColors.cs
|
|
||||||
- [ ] SystemTheme.cs
|
|
||||||
- [ ] TextCommittedEventArgs.cs
|
|
||||||
- [ ] TextRun.cs
|
|
||||||
- [ ] ThemeChangedEventArgs.cs
|
|
||||||
- [ ] TrayMenuItem.cs
|
|
||||||
- [ ] VideoAccelerationApi.cs
|
|
||||||
- [ ] VideoFrame.cs
|
|
||||||
- [ ] VideoProfile.cs
|
|
||||||
- [ ] VirtualizationExtensions.cs
|
|
||||||
- [ ] WaylandDisplayWindow.cs
|
|
||||||
- [ ] X11DisplayWindow.cs
|
|
||||||
|
|
||||||
### Existing Services (33 files) - TO COMPARE
|
|
||||||
|
|
||||||
- [ ] AppActionsService.cs
|
|
||||||
- [ ] AtSpi2AccessibilityService.cs
|
|
||||||
- [ ] BrowserService.cs
|
|
||||||
- [ ] ClipboardService.cs
|
|
||||||
- [ ] DisplayServerFactory.cs
|
|
||||||
- [ ] DragDropService.cs
|
|
||||||
- [ ] EmailService.cs
|
|
||||||
- [ ] Fcitx5InputMethodService.cs
|
|
||||||
- [ ] FilePickerService.cs
|
|
||||||
- [ ] FolderPickerService.cs
|
|
||||||
- [ ] FontFallbackManager.cs
|
|
||||||
- [ ] GlobalHotkeyService.cs
|
|
||||||
- [ ] Gtk4InteropService.cs
|
|
||||||
- [ ] HardwareVideoService.cs
|
|
||||||
- [ ] HiDpiService.cs
|
|
||||||
- [ ] HighContrastService.cs
|
|
||||||
- [ ] IAccessibilityService.cs
|
|
||||||
- [ ] IBusInputMethodService.cs
|
|
||||||
- [ ] IInputMethodService.cs
|
|
||||||
- [ ] InputMethodServiceFactory.cs
|
|
||||||
- [ ] LauncherService.cs
|
|
||||||
- [ ] LinuxResourcesProvider.cs
|
|
||||||
- [ ] NotificationService.cs
|
|
||||||
- [ ] PortalFilePickerService.cs
|
|
||||||
- [ ] PreferencesService.cs
|
|
||||||
- [ ] SecureStorageService.cs
|
|
||||||
- [ ] ShareService.cs
|
|
||||||
- [ ] SystemClipboard.cs
|
|
||||||
- [ ] SystemThemeService.cs
|
|
||||||
- [ ] SystemTrayService.cs
|
|
||||||
- [ ] VersionTrackingService.cs
|
|
||||||
- [ ] VirtualizationManager.cs
|
|
||||||
- [ ] X11InputMethodService.cs
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## HOSTING
|
## HOSTING
|
||||||
|
|
||||||
### New Hosting (7 files) - TO ADD
|
| File | Status | Notes |
|
||||||
|
|------|--------|-------|
|
||||||
- [ ] GtkMauiContext.cs
|
| LinuxMauiAppBuilderExtensions.cs | [ ] | |
|
||||||
- [ ] HandlerMappingExtensions.cs
|
| LinuxMauiContext.cs | [ ] | |
|
||||||
- [ ] LinuxAnimationManager.cs - EXISTS IN LinuxMauiContext.cs
|
| LinuxProgramHost.cs | [ ] | |
|
||||||
- [ ] LinuxDispatcher.cs - EXISTS IN LinuxMauiContext.cs
|
| LinuxViewRenderer.cs | [ ] | |
|
||||||
- [ ] LinuxDispatcherTimer.cs - EXISTS IN LinuxMauiContext.cs
|
| MauiAppBuilderExtensions.cs | [ ] | |
|
||||||
- [ ] LinuxTicker.cs - EXISTS IN LinuxMauiContext.cs
|
| MauiHandlerExtensions.cs | [ ] | |
|
||||||
- [x] MauiHandlerExtensions.cs - ADDED (critical ToViewHandler fix)
|
|
||||||
- [ ] ScopedLinuxMauiContext.cs - EXISTS IN LinuxMauiContext.cs
|
|
||||||
|
|
||||||
### Existing Hosting (5 files) - TO COMPARE
|
|
||||||
|
|
||||||
- [ ] LinuxMauiAppBuilderExtensions.cs
|
|
||||||
- [ ] LinuxMauiContext.cs
|
|
||||||
- [ ] LinuxProgramHost.cs
|
|
||||||
- [ ] LinuxViewRenderer.cs
|
|
||||||
- [ ] MauiAppBuilderExtensions.cs
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## NEW FOLDERS
|
## DISPATCHING
|
||||||
|
|
||||||
### Dispatching (3 files) - TO ADD
|
| File | Status | Notes |
|
||||||
|
|------|--------|-------|
|
||||||
|
| LinuxDispatcher.cs | [ ] | |
|
||||||
|
| LinuxDispatcherProvider.cs | [ ] | |
|
||||||
|
| LinuxDispatcherTimer.cs | [ ] | |
|
||||||
|
|
||||||
- [ ] LinuxDispatcher.cs
|
---
|
||||||
- [ ] LinuxDispatcherProvider.cs
|
|
||||||
- [ ] LinuxDispatcherTimer.cs
|
|
||||||
|
|
||||||
### Native (5 files) - TO ADD
|
## NATIVE
|
||||||
|
|
||||||
- [ ] CairoNative.cs
|
| File | Status | Notes |
|
||||||
- [ ] GdkNative.cs
|
|------|--------|-------|
|
||||||
- [ ] GLibNative.cs
|
| CairoNative.cs | [ ] | |
|
||||||
- [ ] GtkNative.cs
|
| GdkNative.cs | [ ] | |
|
||||||
- [ ] WebKitNative.cs
|
| GLibNative.cs | [ ] | |
|
||||||
|
| GtkNative.cs | [ ] | |
|
||||||
|
| WebKitNative.cs | [ ] | |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## WINDOW
|
## WINDOW
|
||||||
|
|
||||||
### Window Files - TO COMPARE/ADD
|
| File | Status | Notes |
|
||||||
|
|------|--------|-------|
|
||||||
- [x] CursorType.cs - ADDED (Arrow, Hand, Text cursor types)
|
| CursorType.cs | [ ] | |
|
||||||
- [x] X11Window.cs - Added SetIcon, SetCursor methods, cursor initialization
|
| GtkHostWindow.cs | [ ] | |
|
||||||
- [x] GtkHostWindow.cs - ADDED (GTK-based host window with overlay support)
|
| X11Window.cs | [ ] | |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## RENDERING
|
## RENDERING
|
||||||
|
|
||||||
### Rendering Files - TO COMPARE/ADD
|
| File | Status | Notes |
|
||||||
|
|------|--------|-------|
|
||||||
- [x] GtkSkiaSurfaceWidget.cs - ADDED (GTK drawing area for Skia)
|
| GtkSkiaSurfaceWidget.cs | [ ] | |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## CORE FILES
|
## CORE
|
||||||
|
|
||||||
### Core (2 files) - TO COMPARE
|
| File | Status | Notes |
|
||||||
|
|------|--------|-------|
|
||||||
- [x] LinuxApplication.cs - Massive update: GTK mode, Dispatcher init, theme handling, icon support, GTK events
|
| LinuxApplication.cs | [ ] | |
|
||||||
- [ ] LinuxApplicationOptions.cs
|
| LinuxApplicationOptions.cs | [ ] | |
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## HOSTING
|
|
||||||
|
|
||||||
### Hosting Files - TO COMPARE/ADD
|
|
||||||
|
|
||||||
- [x] LinuxMauiContext.cs - Fixed duplicate LinuxDispatcher, uses Dispatching namespace
|
|
||||||
- [x] MauiHandlerExtensions.cs - ADDED (ToViewHandler extension)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Process
|
|
||||||
|
|
||||||
1. **DECOMPILED = PRODUCTION (source of truth)**
|
|
||||||
2. **MAIN = OUTDATED (needs updates)**
|
|
||||||
3. **For EVERY file in decompiled**: Compare with main and apply differences
|
|
||||||
4. **Even "existing" files**: Must be compared - they likely have production fixes missing
|
|
||||||
5. **Update this document** after each file
|
|
||||||
6. **Build frequently** to catch errors early
|
|
||||||
|
|||||||
@@ -926,7 +926,7 @@ public abstract class SkiaView : BindableObject, IDisposable
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Arranges this view within the given bounds.
|
/// Arranges this view within the given bounds.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void Arrange(SKRect bounds)
|
public virtual void Arrange(SKRect bounds)
|
||||||
{
|
{
|
||||||
Bounds = ArrangeOverride(bounds);
|
Bounds = ArrangeOverride(bounds);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user