flatpak: patch electrons under wayland

This commit is contained in:
js0ny 2025-11-21 13:35:32 +00:00
parent 1e55d81961
commit 735935627d
9 changed files with 103 additions and 30 deletions

View file

@ -1,5 +1,30 @@
# https://github.com/gmodena/nix-flatpak
{...}: {
{
config,
lib,
pkgs,
...
}: let
electronApps = [
"com.getpostman.Postman"
# "com.ticktick.TickTick"
];
waylandFlags = "\${NIXOS_OZONE_WL:+\${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true}}";
appWrappers = lib.listToAttrs (map (appid: {
name = "flatpak/exports/bin/${appid}";
value = {
text = ''
#!/bin/sh
exec flatpak run ${appid} ${waylandFlags} "$@"
'';
executable = true;
force = true;
};
})
electronApps);
in {
services.flatpak.enable = true;
services.flatpak.remotes = [
{
@ -23,7 +48,7 @@
# "com.vivaldi.Vivaldi"
"com.getpostman.Postman"
"us.zoom.Zoom"
"com.ticktick.TickTick"
# "com.ticktick.TickTick" # cannot run on wayland under flatpak
];
services.flatpak.overrides = {
global = {
@ -50,8 +75,18 @@
"md.obsidian.Obsidian".Context.sockets = ["wayland"];
"com.ticktick.Ticktick".Context.sockets = ["wayland"];
"com.getpostman.Postman".Context = {
persistent = ["Postman"];
persistent = ["Postman"]; # Don't create `~/Postman` folder under home
sockets = ["wayland"];
};
};
xdg.dataFile = appWrappers;
home.activation.patchFlatpakDesktopFiles = lib.hm.dag.entryAfter ["writeBoundary"] ''
${lib.concatMapStringsSep "\n" (appid: ''
DESKTOP_FILE="${config.xdg.dataHome}/flatpak/exports/share/applications/${appid}.desktop"
if [ -f "$DESKTOP_FILE" ]; then
$DRY_RUN_CMD ${pkgs.gnused}/bin/sed -i "s|^\(Exec=.*${appid}\)|\\1 ${waylandFlags}|g" "$DESKTOP_FILE"
fi
'')
electronApps}
'';
}

View file

@ -3,6 +3,7 @@
lib,
...
}: let
# FIXME: This will block the desktop files
mkFcitxIM = builtins.map (
p:
lib.hiPrio (
@ -16,6 +17,30 @@
''
)
);
# Wrap Electron apps to use Wayland when NIXOS_OZONE_WL is set
# This only works for apps that does not patched by upstream
mkElectronWayland = builtins.map (
p:
lib.hiPrio (
pkgs.runCommand "${p.name}-wrapped"
{
nativeBuildInputs = [pkgs.makeWrapper];
meta = p.meta;
}
''
mkdir -p $out/bin
# ln -s ${p}/share $out/share
makeWrapper ${lib.getExe p} $out/bin/${p.meta.mainProgram or p.pname} \
--inherit-argv0 \
--run '
if [ -n "$NIXOS_OZONE_WL" ] && [ -n "$WAYLAND_DISPLAY" ]; then
NIX_WAYLAND_FLAGS="--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true"
fi
' \
--add-flags "\$NIX_WAYLAND_FLAGS"
''
)
);
in {
home.packages = with pkgs;
[
@ -81,12 +106,15 @@ in {
cider-2
kicad
blender
qmk
logisim-evolution
onlyoffice-desktopeditors
]
++ (mkFcitxIM [
pkgs.neovim-qt
pkgs.anki
])
++ (mkElectronWayland [
pkgs.ticktick
]);
home.sessionVariables = {