Major production merge: GTK support, context menus, and dispatcher fixes
Core Infrastructure:
- Add Dispatching folder with LinuxDispatcher, LinuxDispatcherProvider, LinuxDispatcherTimer
- Add Native folder with P/Invoke wrappers (GTK, GLib, GDK, Cairo, WebKit)
- Add GTK host window system with GtkHostWindow and GtkSkiaSurfaceWidget
- Update LinuxApplication with GTK mode, theme handling, and icon support
- Fix duplicate LinuxDispatcher in LinuxMauiContext
Handlers:
- Add GtkWebViewManager and GtkWebViewPlatformView for GTK WebView
- Add FlexLayoutHandler and GestureManager
- Update multiple handlers with ToViewHandler fix and missing mappers
- Add MauiHandlerExtensions with ToViewHandler extension method
Views:
- Add SkiaContextMenu with hover, keyboard, and dark theme support
- Add LinuxDialogService with context menu management
- Add SkiaFlexLayout for flex container support
- Update SkiaShell with RefreshTheme, MauiShell, ContentRenderer
- Update SkiaWebView with SetMainWindow, ProcessGtkEvents
- Update SkiaImage with LoadFromBitmap method
Services:
- Add AppInfoService, ConnectivityService, DeviceDisplayService, DeviceInfoService
- Add GtkHostService, GtkContextMenuService, MauiIconGenerator
Window:
- Add CursorType enum and GtkHostWindow
- Update X11Window with SetIcon, SetCursor methods
Build: SUCCESS (0 errors)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 11:19:58 -05:00
|
|
|
using Microsoft.Maui.Controls;
|
|
|
|
|
using Microsoft.Maui.Handlers;
|
|
|
|
|
using Microsoft.Maui.Layouts;
|
|
|
|
|
|
|
|
|
|
namespace Microsoft.Maui.Platform.Linux.Handlers;
|
|
|
|
|
|
|
|
|
|
public class FlexLayoutHandler : LayoutHandler
|
|
|
|
|
{
|
|
|
|
|
public new static IPropertyMapper<FlexLayout, FlexLayoutHandler> Mapper = new PropertyMapper<FlexLayout, FlexLayoutHandler>(LayoutHandler.Mapper)
|
|
|
|
|
{
|
|
|
|
|
["Direction"] = MapDirection,
|
|
|
|
|
["Wrap"] = MapWrap,
|
|
|
|
|
["JustifyContent"] = MapJustifyContent,
|
|
|
|
|
["AlignItems"] = MapAlignItems,
|
|
|
|
|
["AlignContent"] = MapAlignContent
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
public FlexLayoutHandler() : base(Mapper)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override SkiaLayoutView CreatePlatformView()
|
|
|
|
|
{
|
|
|
|
|
return new SkiaFlexLayout();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void MapDirection(FlexLayoutHandler handler, FlexLayout layout)
|
|
|
|
|
{
|
|
|
|
|
if (handler.PlatformView is SkiaFlexLayout flexLayout)
|
|
|
|
|
{
|
|
|
|
|
flexLayout.Direction = layout.Direction switch
|
|
|
|
|
{
|
|
|
|
|
Microsoft.Maui.Layouts.FlexDirection.Row => FlexDirection.Row,
|
|
|
|
|
Microsoft.Maui.Layouts.FlexDirection.RowReverse => FlexDirection.RowReverse,
|
|
|
|
|
Microsoft.Maui.Layouts.FlexDirection.Column => FlexDirection.Column,
|
|
|
|
|
Microsoft.Maui.Layouts.FlexDirection.ColumnReverse => FlexDirection.ColumnReverse,
|
|
|
|
|
_ => FlexDirection.Row,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void MapWrap(FlexLayoutHandler handler, FlexLayout layout)
|
|
|
|
|
{
|
|
|
|
|
if (handler.PlatformView is SkiaFlexLayout flexLayout)
|
|
|
|
|
{
|
|
|
|
|
flexLayout.Wrap = layout.Wrap switch
|
|
|
|
|
{
|
|
|
|
|
Microsoft.Maui.Layouts.FlexWrap.NoWrap => FlexWrap.NoWrap,
|
|
|
|
|
Microsoft.Maui.Layouts.FlexWrap.Wrap => FlexWrap.Wrap,
|
|
|
|
|
Microsoft.Maui.Layouts.FlexWrap.Reverse => FlexWrap.WrapReverse,
|
|
|
|
|
_ => FlexWrap.NoWrap,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void MapJustifyContent(FlexLayoutHandler handler, FlexLayout layout)
|
|
|
|
|
{
|
|
|
|
|
if (handler.PlatformView is SkiaFlexLayout flexLayout)
|
|
|
|
|
{
|
|
|
|
|
flexLayout.JustifyContent = layout.JustifyContent switch
|
|
|
|
|
{
|
|
|
|
|
Microsoft.Maui.Layouts.FlexJustify.Start => FlexJustify.Start,
|
|
|
|
|
Microsoft.Maui.Layouts.FlexJustify.Center => FlexJustify.Center,
|
|
|
|
|
Microsoft.Maui.Layouts.FlexJustify.End => FlexJustify.End,
|
|
|
|
|
Microsoft.Maui.Layouts.FlexJustify.SpaceBetween => FlexJustify.SpaceBetween,
|
|
|
|
|
Microsoft.Maui.Layouts.FlexJustify.SpaceAround => FlexJustify.SpaceAround,
|
|
|
|
|
Microsoft.Maui.Layouts.FlexJustify.SpaceEvenly => FlexJustify.SpaceEvenly,
|
|
|
|
|
_ => FlexJustify.Start,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void MapAlignItems(FlexLayoutHandler handler, FlexLayout layout)
|
|
|
|
|
{
|
|
|
|
|
if (handler.PlatformView is SkiaFlexLayout flexLayout)
|
|
|
|
|
{
|
|
|
|
|
flexLayout.AlignItems = layout.AlignItems switch
|
|
|
|
|
{
|
|
|
|
|
Microsoft.Maui.Layouts.FlexAlignItems.Start => FlexAlignItems.Start,
|
|
|
|
|
Microsoft.Maui.Layouts.FlexAlignItems.Center => FlexAlignItems.Center,
|
|
|
|
|
Microsoft.Maui.Layouts.FlexAlignItems.End => FlexAlignItems.End,
|
|
|
|
|
Microsoft.Maui.Layouts.FlexAlignItems.Stretch => FlexAlignItems.Stretch,
|
|
|
|
|
_ => FlexAlignItems.Stretch,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void MapAlignContent(FlexLayoutHandler handler, FlexLayout layout)
|
|
|
|
|
{
|
|
|
|
|
if (handler.PlatformView is SkiaFlexLayout flexLayout)
|
|
|
|
|
{
|
|
|
|
|
flexLayout.AlignContent = layout.AlignContent switch
|
|
|
|
|
{
|
|
|
|
|
Microsoft.Maui.Layouts.FlexAlignContent.Start => FlexAlignContent.Start,
|
|
|
|
|
Microsoft.Maui.Layouts.FlexAlignContent.Center => FlexAlignContent.Center,
|
|
|
|
|
Microsoft.Maui.Layouts.FlexAlignContent.End => FlexAlignContent.End,
|
|
|
|
|
Microsoft.Maui.Layouts.FlexAlignContent.Stretch => FlexAlignContent.Stretch,
|
|
|
|
|
Microsoft.Maui.Layouts.FlexAlignContent.SpaceBetween => FlexAlignContent.SpaceBetween,
|
|
|
|
|
Microsoft.Maui.Layouts.FlexAlignContent.SpaceAround => FlexAlignContent.SpaceAround,
|
2026-01-17 00:46:27 +00:00
|
|
|
Microsoft.Maui.Layouts.FlexAlignContent.SpaceEvenly => FlexAlignContent.SpaceEvenly,
|
Major production merge: GTK support, context menus, and dispatcher fixes
Core Infrastructure:
- Add Dispatching folder with LinuxDispatcher, LinuxDispatcherProvider, LinuxDispatcherTimer
- Add Native folder with P/Invoke wrappers (GTK, GLib, GDK, Cairo, WebKit)
- Add GTK host window system with GtkHostWindow and GtkSkiaSurfaceWidget
- Update LinuxApplication with GTK mode, theme handling, and icon support
- Fix duplicate LinuxDispatcher in LinuxMauiContext
Handlers:
- Add GtkWebViewManager and GtkWebViewPlatformView for GTK WebView
- Add FlexLayoutHandler and GestureManager
- Update multiple handlers with ToViewHandler fix and missing mappers
- Add MauiHandlerExtensions with ToViewHandler extension method
Views:
- Add SkiaContextMenu with hover, keyboard, and dark theme support
- Add LinuxDialogService with context menu management
- Add SkiaFlexLayout for flex container support
- Update SkiaShell with RefreshTheme, MauiShell, ContentRenderer
- Update SkiaWebView with SetMainWindow, ProcessGtkEvents
- Update SkiaImage with LoadFromBitmap method
Services:
- Add AppInfoService, ConnectivityService, DeviceDisplayService, DeviceInfoService
- Add GtkHostService, GtkContextMenuService, MauiIconGenerator
Window:
- Add CursorType enum and GtkHostWindow
- Update X11Window with SetIcon, SetCursor methods
Build: SUCCESS (0 errors)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 11:19:58 -05:00
|
|
|
_ => FlexAlignContent.Stretch,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|