Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions .github/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

# LinuxFiles

LinuxFiles is an independent Linux-only file manager built with C#/.NET 10 and Uno Platform's Skia desktop host. Alpha7 prefers native Wayland through the forked Uno 6.7.135-wayland.6 packages and falls back to X11/XWayland, without Windows or Wine.
LinuxFiles is an independent Linux-only file manager built with C#/.NET 10 and Uno Platform's Skia desktop host. Alpha8 prefers native Wayland through the forked Uno 6.7.135-wayland.7 packages and falls back to X11/XWayland, without Windows or Wine.

Based on [Files](https://github.com/files-community/Files) by the [Files Community](https://github.com/files-community) and its [contributors](https://github.com/files-community/Files/graphs/contributors), this fork is not affiliated with or endorsed by the Files Community. LinuxFiles has no Windows support or upstream sync. Individual upstream fixes may be brought over selectively with attribution; see the [upstream policy](../docs/linux-port/upstream-policy.md).

Expand All @@ -23,21 +23,21 @@ See the [showcase](../docs/linux-port/SHOWCASE.md) for screenshots and [packagin

## Known limits

- The native Wayland host is new; please report compositor, scaling, input or packaging issues. Embedded web/media views are unsupported on Wayland: HTML previews show text with "Open with default app", audio/video shows a thumbnail and details with Open, and release notes open in the browser. X11 keeps embedded views and its existing outgoing drag path. Touch-started drags are untested; Wayland has no "link" drag action. Force X11/XWayland with `UNO_SKIA_HOST=x11`; see [Troubleshooting](#troubleshooting).
- AT-SPI accessibility is not implemented. X11/XWayland fallback can show soft text under fractional compositor scaling.
- The native Wayland host is new; please report compositor, scaling, input or packaging issues. Audio/video previews on Wayland and X11 need optional `mpv` (libmpv), with play/pause, seek and volume; nothing is decoded until Play, and network, scripts and playlists are disabled. HTML previews need optional `webkit2gtk-4.1` for scrollable snapshots in WebKit's bubblewrap sandbox, with JavaScript off and no network; without the sandbox they fall back to text ([#198](https://github.com/MemerGamer/LinuxFiles/pull/198)). NixOS packages lack mpv/WebKitGTK and use fallbacks; the release notes page still uses the fallback. Touch-started drags are untested; Wayland has no "link" drag action. X11 drag and drop with other apps: Uno's X11 host now starts drags itself with a drag icon and cursors, and drops from Wayland apps such as Dolphin on KDE arrive on XWayland ([#197](https://github.com/MemerGamer/LinuxFiles/pull/197)). Force X11/XWayland with `UNO_SKIA_HOST=x11`; see [Troubleshooting](#troubleshooting).
- AT-SPI accessibility is not implemented. X11/XWayland fallback can show soft text under fractional compositor scaling. LCD text needs opaque windows and a known subpixel order: compositor monitor info, then fontconfig, KDE `kdeglobals` `XftSubPixel` or GNOME settings; otherwise text stays grayscale, as does rotated text. Set `UNO_SKIA_TEXT_LCD=auto|on|off` (default `auto`) or `UNO_SKIA_TEXT_RGBA=rgb|bgr|vrgb|vbgr|none`. Works with the alpha6 gamma fix (`UNO_SKIA_TEXT_GAMMA=skia` restores the previous gamma rendering); see [Uno 6.7.135-wayland.7](https://github.com/MemerGamer/uno/releases/tag/uno-wayland-6.7.135-wayland.7).
- Select-all in folders with around 10,000 items remains slow because of Uno selection handling.
- Tags use Linux extended attributes and a local database. Extended-attribute writes can fail on read-only files or unsupported filesystems; alpha4 preserves edits in the database across reloads and restarts, but those edits cannot be written back to the file when xattrs fail.
- Release packages target x86_64. arm64 publishing is wired but untested. Network/MTP browsing requires a working GVfs session.
- AppImage, Flatpak and plain Nix installs disable root actions; see [Root actions](#root-actions).

## Install

[![Latest release](https://img.shields.io/github/v/release/MemerGamer/LinuxFiles?include_prereleases&filter=linux-v*&label=release)](https://github.com/MemerGamer/LinuxFiles/releases/tag/linux-v0.1.0-alpha7)
[![Latest release](https://img.shields.io/github/v/release/MemerGamer/LinuxFiles?include_prereleases&filter=linux-v*&label=release)](https://github.com/MemerGamer/LinuxFiles/releases/tag/linux-v0.1.0-alpha8)

> [!NOTE]
> **0.1.0-alpha7 is the seventh public alpha release.** Expect rough edges and missing features, and keep backups of anything you care about. Please report problems in the [issue tracker](https://github.com/MemerGamer/LinuxFiles/issues).
> **0.1.0-alpha8 is the eighth public alpha release.** Expect rough edges and missing features, and keep backups of anything you care about. Please report problems in the [issue tracker](https://github.com/MemerGamer/LinuxFiles/issues).

Grab the assets from the [0.1.0-alpha7 release page](https://github.com/MemerGamer/LinuxFiles/releases/tag/linux-v0.1.0-alpha7). Requirements: x86_64 Linux with Wayland or X11/XWayland; the packages are self-contained, so no .NET install is needed.
Grab the assets from the [0.1.0-alpha8 release page](https://github.com/MemerGamer/LinuxFiles/releases/tag/linux-v0.1.0-alpha8). Requirements: x86_64 Linux with Wayland or X11/XWayland; the packages are self-contained, so no .NET install is needed.

### Arch Linux (AUR)

Expand All @@ -64,12 +64,12 @@ programs.linuxfiles = {
};
```

This installs a patched helper, a matching polkit action and trusted deployment manifest, and enables the pkexec wrapper. A session authentication agent is required. The flake pins alpha7, which supports this opt-in. A runtime-capability assertion rejects incompatible or unmarked package overrides. See [Nix packaging details](../docs/linux-port/packaging.md#nix-flake).
This installs a patched helper, a matching polkit action and trusted deployment manifest, and enables the pkexec wrapper. A session authentication agent is required. The flake currently pins alpha7, which supports this opt-in; it will be updated to alpha8 after the release assets and hashes are published. A runtime-capability assertion rejects incompatible or unmarked package overrides. See [Nix packaging details](../docs/linux-port/packaging.md#nix-flake).

### AppImage

```sh
curl -LO https://github.com/MemerGamer/LinuxFiles/releases/download/linux-v0.1.0-alpha7/Files-x86_64.AppImage
curl -LO https://github.com/MemerGamer/LinuxFiles/releases/download/linux-v0.1.0-alpha8/Files-x86_64.AppImage
chmod +x Files-x86_64.AppImage
./Files-x86_64.AppImage
```
Expand All @@ -79,7 +79,7 @@ Root actions remain disabled in the AppImage. Administrators can separately [pro
### Flatpak bundle

```sh
curl -LO https://github.com/MemerGamer/LinuxFiles/releases/download/linux-v0.1.0-alpha7/Files-x86_64.flatpak
curl -LO https://github.com/MemerGamer/LinuxFiles/releases/download/linux-v0.1.0-alpha8/Files-x86_64.flatpak
flatpak install --user ./Files-x86_64.flatpak
flatpak run io.github.memergamer.LinuxFiles
```
Expand All @@ -89,7 +89,7 @@ The bundle needs the `org.freedesktop.Platform//25.08` runtime and a configured
### Tarball

```sh
curl -LO https://github.com/MemerGamer/LinuxFiles/releases/download/linux-v0.1.0-alpha7/files-linux-x64.tar.gz
curl -LO https://github.com/MemerGamer/LinuxFiles/releases/download/linux-v0.1.0-alpha8/files-linux-x64.tar.gz
tar xzf files-linux-x64.tar.gz
./linux-x64/Files # run it in place
```
Expand Down Expand Up @@ -138,7 +138,7 @@ curl -LO https://github.com/MemerGamer/LinuxFiles/releases/download/nightly/Linu

## Troubleshooting

**Choose a host (alpha7):** `UNO_SKIA_HOST=x11 files` forces X11/XWayland; `UNO_SKIA_HOST=wayland files` requires native Wayland. The default chooses Wayland when available and falls back to X11 when Wayland host probing fails or `WAYLAND_DISPLAY` is unset. Restart Files when switching. See [host and package details](../docs/linux-port/wayland-packages.md).
**Choose a host (alpha8):** `UNO_SKIA_HOST=x11 files` forces X11/XWayland; `UNO_SKIA_HOST=wayland files` requires native Wayland. The default chooses Wayland when available and falls back to X11 when Wayland host probing fails or `WAYLAND_DISPLAY` is unset. Restart Files when switching. See [host and package details](../docs/linux-port/wayland-packages.md).

**Soft text or icons with X11/XWayland fallback on niri / xwayland-satellite:** Enable **Detect display scale from the compositor (experimental)** in Settings > Appearance and restart Files to use niri's focused output scale when no Uno, Xft, GDK or Qt scale hint is present and both `NIRI_SOCKET` and `WAYLAND_DISPLAY` are set. Check stderr for `[display-scale]` to see whether IPC or CLI detection succeeded. Detection defaults off and may double-scale on some setups. `FILES_NIRI_SCALE=1` forces it on and `FILES_NIRI_SCALE=0` forces it off, overriding the saved preference. Launch with `UNO_DISPLAY_SCALE_OVERRIDE=1.25 files` to select a scale manually (replace `1.25` with your output scale). The scale is chosen at startup. See [display scale details](../docs/linux-port/appearance-transparency.md#display-scale-on-niri).

Expand Down
22 changes: 22 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,28 @@ LinuxFiles is an independent Linux-only fork of [Files](https://github.com/files

## Unreleased

## 0.1.0-alpha8 - 2026-10-16

Eighth public alpha, focused on sharper text and real media/HTML previews on Wayland and X11. Expect rough edges and keep backups. Report issues at
https://github.com/MemerGamer/LinuxFiles/issues.

### Highlights

- Sharper text on opaque windows with subpixel (LCD) antialiasing ([Uno 6.7.135-wayland.7](https://github.com/MemerGamer/uno/releases/tag/uno-wayland-6.7.135-wayland.7)). Subpixel order comes from compositor monitor info, then fontconfig, KDE `kdeglobals` `XftSubPixel` or GNOME settings; otherwise text stays grayscale. Rotated text stays grayscale. Set `UNO_SKIA_TEXT_LCD=auto|on|off` (default `auto`) or override the order with `UNO_SKIA_TEXT_RGBA=rgb|bgr|vrgb|vbgr|none`. Works alongside the alpha6 gamma fix; set `UNO_SKIA_TEXT_GAMMA=skia` to restore the previous gamma rendering.
- Real previews on Wayland and X11 ([#198](https://github.com/MemerGamer/LinuxFiles/pull/198)): audio/video plays via libmpv (optional `mpv` dependency), with play/pause, seek and volume. Nothing is decoded until Play; no network, scripts or playlists. HTML renders as a scrollable snapshot via optional `webkit2gtk-4.1`, with JavaScript off and no network in WebKit's bubblewrap sandbox; without the sandbox it falls back to text. The release notes page still uses the fallback. NixOS packages do not include mpv/WebKitGTK yet, so previews fall back there.
- X11 drag and drop with other apps: Uno's X11 host now starts drags itself (drag icon, copy/move/link cursors, Shift/Escape), and drops from Wayland apps such as Dolphin on KDE arrive on XWayland; before, such a drop was lost and could leave KWin's drag bridge stuck. `UNO_X11_DND_LOG=<file>` traces XDND messages ([#197](https://github.com/MemerGamer/LinuxFiles/pull/197)).
- Uses the forked Uno **6.7.135-wayland.7** packages ([Uno 6.7.135-wayland.7](https://github.com/MemerGamer/uno/releases/tag/uno-wayland-6.7.135-wayland.7)), verified against committed SHA-256 pins. The Nix flake currently pins alpha7; it will be updated after the alpha8 release assets and hashes are published.

### Known limitations

- The native Wayland host is new; please report compositor, scaling, input or packaging issues. X11/XWayland remains available with `UNO_SKIA_HOST=x11`.
- Resizing is smoother but not yet perfectly fluid; layout still keeps the UI thread busy during a drag.
- LCD antialiasing needs an opaque window and a known subpixel order; other text, including rotated text, stays grayscale. Some toolbar glyphs have thin strokes that can look soft. Icons at display scales above 100 percent may still be soft.
- Preview backends are optional: audio/video needs mpv, and HTML needs WebKitGTK 4.1 with its bubblewrap sandbox. NixOS packages still use fallbacks, as does the release notes page. Touch-started drags are untested, and Wayland has no "link" drag action.
- Select-all in folders with 10,000 items is still slow due to Uno selection handling.
- AT-SPI accessibility is not implemented. Mica/Acrylic is not implemented on Linux.
- The Nix flake pins alpha7 until the alpha8 release assets and hashes are published. Plain Nix installs, AppImage and Flatpak keep root actions disabled.

## 0.1.0-alpha7 - 2026-10-15

Seventh public alpha, focused on file drag-and-drop and preview fallbacks on Wayland. Expect rough edges and keep backups. Report issues at
Expand Down
6 changes: 3 additions & 3 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@
</ItemGroup>
<!-- Native Wayland host from the MemerGamer/uno fork; see docs/linux-port/wayland-packages.md -->
<PropertyGroup>
<UnoWaylandVersion Condition="'$(UnoWaylandVersion)' == ''">6.7.135-wayland.6</UnoWaylandVersion>
<UnoWaylandVersion Condition="'$(UnoWaylandVersion)' == ''">6.7.135-wayland.7</UnoWaylandVersion>
<!-- Set to true with the first UnoWaylandVersion whose X11 host drags to other apps itself (wayland/host-x11dnd); Files then stops starting its own X11 drag source. -->
<FilesUnoX11NativeDrag Condition="'$(FilesUnoX11NativeDrag)' == ''">false</FilesUnoX11NativeDrag>
<FilesUnoX11NativeDrag Condition="'$(FilesUnoX11NativeDrag)' == ''">true</FilesUnoX11NativeDrag>
</PropertyGroup>
<PropertyGroup Condition="'$(FilesUseUnoWayland)' == 'true'">
<RestoreConfigFile Condition="'$(RestoreConfigFile)' == ''">$(MSBuildThisFileDirectory)nuget.wayland.config</RestoreConfigFile>
Expand All @@ -65,7 +65,7 @@
</ItemGroup>
<!-- Uno.Sdk rejects any Uno.WinUI other than its own release (UNOB0005); allow only the reviewed fork cohort with its unchanged 6.7.135 SDK base.
Runs before UnoSdkVersionCheck evaluates its condition, which is the only user of PkgUno_WinUI. -->
<Target Name="_FilesAllowUnoWaylandPackages" BeforeTargets="BeforeBuild;ResolveReferences" Condition="'$(FilesUseUnoWayland)' == 'true' And '$(UnoWaylandVersion)' == '6.7.135-wayland.6' And '$(UnoVersion)' == '6.7.135' And $([System.IO.Path]::GetFileName($(PkgUno_WinUI))) == '$(UnoWaylandVersion)'">
<Target Name="_FilesAllowUnoWaylandPackages" BeforeTargets="BeforeBuild;ResolveReferences" Condition="'$(FilesUseUnoWayland)' == 'true' And '$(UnoWaylandVersion)' == '6.7.135-wayland.7' And '$(UnoVersion)' == '6.7.135' And $([System.IO.Path]::GetFileName($(PkgUno_WinUI))) == '$(UnoWaylandVersion)'">
<PropertyGroup>
<PkgUno_WinUI />
</PropertyGroup>
Expand Down
8 changes: 8 additions & 0 deletions build/uno-wayland-packages.sha256
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,11 @@
6.7.135-wayland.6 16830c4efaccdd6dc25bc2904775251d5155d40e49f76115d7f79b674809518e Uno.WinUI.Runtime.Skia.6.7.135-wayland.6.nupkg
6.7.135-wayland.6 840cbb2211ad5a6fec08b67db7a41ad8b2d84892864746dbd3e1cc525a97509d Uno.WinUI.Runtime.Skia.X11.6.7.135-wayland.6.nupkg
6.7.135-wayland.6 2612263e7e88efec40621fbc549f51e1710df41a0a6d391428a019b6cd2c5283 Uno.WinUI.Runtime.Skia.Wayland.6.7.135-wayland.6.nupkg
6.7.135-wayland.7 746a9d0a120fe4fb238980d4da5bb0043a573845908c5eda8b11734a5cd06631 Uno.WinUI.6.7.135-wayland.7.nupkg
6.7.135-wayland.7 4e3b230eac79efcc9fe66b033ff72a0e35c41f307bd220766721a24793c5c608 Uno.WinRT.6.7.135-wayland.7.nupkg
6.7.135-wayland.7 79ca29212d0f3599ca449af1e0f99c1ccba74597bc6c1cdec34bdf74f84c16e2 Uno.Foundation.6.7.135-wayland.7.nupkg
6.7.135-wayland.7 e2275b6721d4edd41531ce6122d99e3424c61f12abc23b28c918e91825ca1986 Uno.Foundation.Logging.6.7.135-wayland.7.nupkg
6.7.135-wayland.7 b16cdff7b4750de38f3914bcb6b8b6d0c1b18b0e71e1d8f99b8ceb7bbf646d90 Uno.UI.Adapter.Microsoft.Extensions.Logging.6.7.135-wayland.7.nupkg
6.7.135-wayland.7 9dc61cd23f0fe2553e388abbd677cf26098a2ce5d085494fdfadb396a02c13b3 Uno.WinUI.Runtime.Skia.6.7.135-wayland.7.nupkg
6.7.135-wayland.7 9c16928041cfb1622529107c7c9a274ffc456dea63e55d7f473b7b15bd85c3b1 Uno.WinUI.Runtime.Skia.X11.6.7.135-wayland.7.nupkg
6.7.135-wayland.7 6f23e3182482caf78734ec5ce7651f9c17b8a356186f68af670ec74eea51c130 Uno.WinUI.Runtime.Skia.Wayland.6.7.135-wayland.7.nupkg
14 changes: 7 additions & 7 deletions docs/linux-port/dnd.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# Clipboard and drag & drop of files (W-CLIP)

Uno 6.7's X11 host cannot publish file lists on the clipboard (`X11ClipboardExtension` offers text, URI and HTML only) and
`X11DragDropExtension.StartNativeDrag` throws `NotImplementedException`. Files works around both on its own X connection.
`X11DragDropExtension.StartNativeDrag` throws `NotImplementedException`. Files uses its own X connection for clipboard file lists, and
for outgoing drags when `FilesUnoX11NativeDrag=false` (the fork packages from `6.7.135-wayland.7` have Uno's own source, below).

## Pieces

Expand Down Expand Up @@ -36,7 +37,7 @@ and runs a copy or move (cut) through `IFilesystemHelpers.CopyItemsAsync` / `Mov

## Outbound drag (XDND source, version 5)

`BaseLayoutPage.FileList_DragItemsStarting` calls `DesktopFileDragHelper.StartExternalDrag`. The host then follows the pointer with
On X11 with `FilesUnoX11NativeDrag=false`, `BaseLayoutPage.FileList_DragItemsStarting` calls `DesktopFileDragHelper.StartExternalDrag`. The host then follows the pointer with
`XQueryPointer` (Uno's window keeps the implicit pointer grab, so no second grab is needed), finds the deepest XDND-aware window under
it (skipping windows of this process, where Uno handles the drag), and sends `XdndEnter`, `XdndPosition`, `XdndDrop`/`XdndLeave`.
Data is served from the `XdndSelection` selection (`text/uri-list`, `text/plain`). Action is copy, or move while Shift is held; the
Expand All @@ -54,10 +55,9 @@ X connection (drag icon window from the DragView snapshot, copy/move/link/no-dro
grab), routes the pointer back into Uno while it is over the window the drag started in, and offers `text/uri-list` plus the text
targets. Files then only has to put the file list into `e.Data`, as on Wayland (`DesktopFileDragHelper.StartDrag`).

Released packages up to `6.7.135-wayland.6` do not contain it, so `FilesUnoX11NativeDrag` (Directory.Packages.props) defaults to
`false` and Files keeps starting its own X11 drag source. Set it to `true` together with the first `UnoWaylandVersion` that includes
the branch; `UNO_X11_NATIVE_DRAG` then skips `StartExternalDrag` on X11. The old source and `DesktopRuntimeGuards` stay as the path
for packages without it.
Packages from `6.7.135-wayland.7` (alpha8) contain it, and `FilesUnoX11NativeDrag` (Directory.Packages.props) defaults to
`true`: `UNO_X11_NATIVE_DRAG` skips `StartExternalDrag` on X11. Build with `-p:FilesUnoX11NativeDrag=false` against older packages
(up to `6.7.135-wayland.6`); Files then starts its own X11 drag source, and that path and `DesktopRuntimeGuards` stay for them.

Verified with a LinuxFiles build using `-p:FilesUnoX11NativeDrag=true` and the branch's `Uno.UI.Runtime.Skia.X11.dll`:
- private Xvfb with a GTK3 drop target: copy, Shift move, Escape, a rejecting target (no-drop cursor), drop onto a folder in the
Expand Down Expand Up @@ -114,7 +114,7 @@ under `dbus-run-session` with a private `XDG_RUNTIME_DIR` (the socket path must

## LINUX-TODO

- `LINUX-TODO(dnd)`: (fixed by Uno's X11 source once `FilesUnoX11NativeDrag` is on) no drag icon or cursor feedback outside the window (the pointer is grabbed by Uno's window; changing it needs
- `LINUX-TODO(dnd)`: (fixed by Uno's X11 source since alpha8, `FilesUnoX11NativeDrag`) no drag icon or cursor feedback outside the window (the pointer is grabbed by Uno's window; changing it needs
`XChangeActivePointerGrab` on that connection, or the Uno extension point). Dropping on a window that answers `XdndStatus` with
"reject" silently does nothing.
- `LINUX-TODO(dnd)`: the guard only covers file lists (`FileList_DragItemsStarting`). Drags from the sidebar, tabs and the shelf leave
Expand Down
Loading
Loading