# Getting Started with .NET MAUI on Linux

This guide will help you get started with building .NET MAUI applications for Linux.

## Prerequisites

- .NET 9.0 SDK or later
- Linux distribution (Ubuntu 22.04+, Fedora 38+, Arch Linux, etc.)
- X11 or Wayland display server

### Installing Dependencies

**Ubuntu/Debian:**
```bash
sudo apt-get install libx11-dev libxrandr-dev libxcursor-dev libxi-dev libgl1-mesa-dev libfontconfig1-dev
```

**Fedora:**
```bash
sudo dnf install libX11-devel libXrandr-devel libXcursor-devel libXi-devel mesa-libGL-devel fontconfig-devel
```

**Arch Linux:**
```bash
sudo pacman -S libx11 libxrandr libxcursor libxi mesa fontconfig
```

## Creating a New Project

### Using the Template (Recommended)

1. Install the template:
```bash
dotnet new install OpenMaui.Linux.Templates
```

2. Create a new project:
```bash
dotnet new maui-linux -n MyApp
cd MyApp
```

3. Run your application:
```bash
dotnet run
```

### Manual Setup

1. Create a new console application:
```bash
dotnet new console -n MyMauiLinuxApp
cd MyMauiLinuxApp
```

2. Add the NuGet package:
```bash
dotnet add package OpenMaui.Controls.Linux
```

3. Update your `Program.cs`:
```csharp
using Microsoft.Maui.Platform;
using OpenMaui.Platform.Linux;

var app = new LinuxApplication();

app.MainPage = new ContentPage
{
    Content = new VerticalStackLayout
    {
        Children =
        {
            new Label { Text = "Hello, MAUI on Linux!" },
            new Button { Text = "Click Me" }
        }
    }
};

app.Run();
```

## Project Structure

A typical MAUI Linux project has this structure:

```
MyApp/
├── App.cs              # Application entry and configuration
├── MainPage.cs         # Main page of your app
├── Program.cs          # Application bootstrap
├── MyApp.csproj        # Project file
└── Resources/          # Images, fonts, and other assets
    ├── Images/
    └── Fonts/
```

## Basic Controls

All controls use standard .NET MAUI types (Color, Rect, Size, Thickness) for full API compliance.

### Labels
```csharp
using Microsoft.Maui.Graphics;

var label = new Label
{
    Text = "Hello World",
    TextColor = Color.FromRgb(33, 33, 33),  // MAUI Color
    FontSize = 16
};
```

### Buttons
```csharp
var button = new Button
{
    Text = "Click Me",
    BackgroundColor = Color.FromRgb(33, 150, 243)  // MAUI Color
};
button.Clicked += (s, e) => Console.WriteLine("Clicked!");
```

### Text Input
```csharp
var entry = new Entry
{
    Placeholder = "Enter text...",
    MaxLength = 100
};
entry.TextChanged += (s, e) => Console.WriteLine($"Text: {e.NewTextValue}");
```

### Layouts
```csharp
// Vertical stack
var vstack = new VerticalStackLayout
{
    Spacing = 10,
    Children =
    {
        new Label { Text = "Item 1" },
        new Label { Text = "Item 2" }
    }
};

// Horizontal stack
var hstack = new HorizontalStackLayout
{
    Spacing = 8
};
```

## Advanced Controls

### CarouselView
```csharp
var carousel = new CarouselView
{
    Loop = true,
    PeekAreaInsets = new Thickness(20),
    ItemsSource = new[] { "Page 1", "Page 2", "Page 3" },
    ItemTemplate = new DataTemplate(() =>
    {
        var label = new Label();
        label.SetBinding(Label.TextProperty, ".");
        return label;
    })
};
carousel.PositionChanged += (s, e) =>
    Console.WriteLine($"Position: {e.CurrentPosition}");
```

### RefreshView
```csharp
var refreshView = new RefreshView
{
    Content = myScrollableContent,
    RefreshColor = Colors.Blue  // MAUI Color
};
refreshView.Refreshing += async (s, e) =>
{
    await LoadDataAsync();
    refreshView.IsRefreshing = false;
};
```

### SwipeView
```csharp
var swipeView = new SwipeView
{
    Content = new Label { Text = "Swipe me" }
};
swipeView.RightItems = new SwipeItems
{
    new SwipeItem
    {
        Text = "Delete",
        BackgroundColor = Colors.Red  // MAUI Color
    }
};
```

### MenuBar
```csharp
var menuBar = new MenuBar();
var fileMenu = new MenuBarItem { Text = "File" };
fileMenu.Add(new MenuFlyoutItem { Text = "New", KeyboardAccelerators = { new KeyboardAccelerator { Modifiers = KeyboardAcceleratorModifiers.Ctrl, Key = "N" } } });
fileMenu.Add(new MenuFlyoutItem { Text = "Open" });
fileMenu.Add(new MenuFlyoutSeparator());
fileMenu.Add(new MenuFlyoutItem { Text = "Exit" });
menuBar.Add(fileMenu);
```

## Platform Services

### Clipboard
```csharp
var clipboard = new ClipboardService();
await clipboard.SetTextAsync("Copied text");
var text = await clipboard.GetTextAsync();
```

### File Picker
```csharp
var picker = new FilePickerService();
var result = await picker.PickAsync(new PickOptions
{
    FileTypes = new[] { ".txt", ".md" }
});
```

### Notifications
```csharp
var notifications = new NotificationService();
notifications.Show("Title", "Message body", "app-icon");
```

### Global Hotkeys
```csharp
var hotkeys = new GlobalHotkeyService();
hotkeys.Initialize();
int id = hotkeys.Register(HotkeyKey.F1, HotkeyModifiers.Control);
hotkeys.HotkeyPressed += (s, e) =>
{
    if (e.Id == id) Console.WriteLine("Ctrl+F1 pressed!");
};
```

## Accessibility

### High Contrast Mode
```csharp
var highContrast = new HighContrastService();
highContrast.Initialize();
if (highContrast.IsHighContrastEnabled)
{
    var colors = highContrast.GetColors();
    // Apply high contrast colors to your UI
}
```

### HiDPI Support
```csharp
var hidpi = new HiDpiService();
hidpi.Initialize();
float scale = hidpi.ScaleFactor;
// Scale your UI elements accordingly
```

## Building for Release

```bash
dotnet publish -c Release -r linux-x64 --self-contained
```

Or for ARM64:
```bash
dotnet publish -c Release -r linux-arm64 --self-contained
```

## Troubleshooting

### Display Issues
- Ensure X11 or Wayland is running
- Check that SkiaSharp native libraries are installed
- Verify graphics drivers are up to date

### Font Rendering
- Install `fontconfig` and common fonts
- Set the `FONTCONFIG_PATH` environment variable if needed

### Input Method (IME)
- For CJK input, ensure IBus or Fcitx is installed and configured
- Set `GTK_IM_MODULE=ibus` or `QT_IM_MODULE=ibus`

## Next Steps

- Explore the [API Documentation](API.md)
- Check out the [Sample Applications](../samples/)
- Read the [Contributing Guide](../CONTRIBUTING.md)
