Compare commits

...
11 Commits
Author SHA1 Message Date
elwrcl b3e875d876 imports 2026-10-11 00:08:18 +03:00
elwrcl 0f83e5841e removed old pins and free up space 2026-10-11 00:08:18 +03:00
elwrcl 7beff3b25f helium & extensions 2026-10-11 00:07:59 +03:00
elwrcl 9c3f671acf device issues 2026-10-11 00:06:54 +03:00
elwrcl b2c3e75171 obsidian 2026-10-11 00:06:14 +03:00
elwrcl 22100c3af9 thunderbird 2026-10-11 00:05:31 +03:00
elwrcl a8ab95f5a0 udev 2026-10-11 00:05:04 +03:00
elwrcl c5caa9e9c5 theme 2026-10-11 00:04:39 +03:00
elwrcl 3e318279b5 flakes 2026-10-11 00:03:46 +03:00
elwrcl 019f49a95d davinci xwayland-satelite fixes 2026-10-10 19:49:38 +03:00
elwrcl 5734dd21b0 opencl davinci color fixes 2026-10-10 19:49:38 +03:00
26 changed files with 805 additions and 225 deletions

No files matched your search

+2 -2
View File
@@ -1,2 +1,2 @@
pocl 844a8c5b9d19 gen7: find libgbe and beignet's library in ../beignet next to the installed driver (relocatable install)
libgbe 79c0fa63bccb backend: llvm.minnum/maxnum/minimum/maximum as compare + select (LLVM folds fmin/fmax into them; DaVinci Resolve)
pocl 40a0f3c94206 gen7: report the GPU's real maximum clock (i915 gt_RP0_freq_mhz of the card with this PCI id) instead of a fixed 1000 MHz
libgbe 4db13eafb096 backend: keep the MAD bank conflict hint (any non-ternary use reset it, so both MAD sources landed in the same GRF bank: +28% float4 MAD throughput on IVB, 166 -> 212 GFLOPS); OCL_OUTPUT_KERNEL_STATS prints per-kernel SIMD width, spill strategy and code size
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Generated
+17
View File
@@ -614,6 +614,7 @@
"noctalia": "noctalia",
"nyi": "nyi",
"scx_soryu": "scx_soryu",
"sidechery": "sidechery",
"theme-assets": "theme-assets",
"themes": "themes",
"valw": "valw",
@@ -639,6 +640,22 @@
"type": "github"
}
},
"sidechery": {
"flake": false,
"locked": {
"lastModified": 1789219073,
"narHash": "sha256-cSLIxv+oJNQNIP754ZELih7UN62dIFbXfI68bhX6lWQ=",
"owner": "teidesu",
"repo": "sidechery",
"rev": "e015b37b16eaef6a6655dd34a46512c8b376b4dc",
"type": "github"
},
"original": {
"owner": "teidesu",
"repo": "sidechery",
"type": "github"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
+4
View File
@@ -55,6 +55,10 @@
url = "github:elwrcl/heliux";
inputs.nixpkgs.follows = "nixpkgs";
};
sidechery = {
url = "github:teidesu/sidechery";
flake = false;
};
theme-assets = {
url = "github:elwrcl/copland-theme";
inputs.nixpkgs.follows = "nixpkgs";
+10
View File
@@ -58,12 +58,16 @@ in
config.flake.homeModules.home-theme-kemuri
config.flake.homeModules.home-theme-gtk
config.flake.homeModules.home-theme-qt
config.flake.homeModules.home-theme-mode-switch
config.flake.homeModules.home-theme-ghostty
config.flake.homeModules.home-theme-helix
config.flake.homeModules.home-theme-zellij
config.flake.homeModules.home-theme-nushell
config.flake.homeModules.home-theme-discord
config.flake.homeModules.home-theme-vscode
config.flake.homeModules.home-theme-stylus
config.flake.homeModules.home-theme-sidechery
config.flake.homeModules.home-theme-obsidian
config.flake.homeModules.home-direnv
config.flake.homeModules.home-jujutsu
config.flake.homeModules.home-jujutsu-difftastic
@@ -80,6 +84,7 @@ in
config.flake.homeModules.home-icons
config.flake.homeModules.home-browser-zen
config.flake.homeModules.home-browser-helium
config.flake.homeModules.home-browser-helium-sidechery
config.flake.homeModules.home-mimeapps
config.flake.homeModules.home-file-manager
config.flake.homeModules.home-file-manager-actions
@@ -88,6 +93,8 @@ in
config.flake.homeModules.home-nyi
config.flake.homeModules.home-valw
config.flake.homeModules.home-discord
config.flake.homeModules.home-thunderbird
config.flake.homeModules.home-obsidian
config.flake.homeModules.home-mpv
config.flake.homeModules.home-mpv-intel-hard
config.flake.homeModules.home-mpv-svp
@@ -123,8 +130,11 @@ in
config.flake.nixosModules.hw-intel-hard
config.flake.nixosModules.hw-ivb-drivers
config.flake.nixosModules.hw-udev
config.flake.nixosModules.hw-keychron
config.flake.nixosModules.net-network-manager
config.flake.nixosModules.net-dpi-evasion
config.flake.nixosModules.net-uxplay
config.flake.nixosModules.net-localsend
config.flake.nixosModules.service-appimage
config.flake.nixosModules.service-flatpak
config.flake.nixosModules.service-fwupd
@@ -0,0 +1,100 @@
{ ... }:
{
# sidechery "sidebery" ported to chromium for helium built from source and side-loaded.
flake.homeModules.home-browser-helium-sidechery =
{
config,
lib,
pkgs,
inputs,
...
}:
let
sidechery = pkgs.stdenv.mkDerivation (finalAttrs: {
pname = "sidechery";
version = (builtins.fromJSON (builtins.readFile "${inputs.sidechery}/package.json")).version;
src = inputs.sidechery;
pnpmDeps = pkgs.fetchPnpmDeps {
inherit (finalAttrs) pname version src;
pnpm = pkgs.pnpm_10;
fetcherVersion = 4;
hash = "sha256-c05e5Wchb3mq45cHcjjiUCAzi9RrhtKWunYJ7QK30wM=";
};
nativeBuildInputs = [
pkgs.nodejs
pkgs.pnpm_10
pkgs.pnpmConfigHook
];
buildPhase = ''
runHook preBuild
pnpm run build:chrome
runHook postBuild
'';
installPhase = ''
runHook preInstall
cp -r .output/chrome-mv3 $out
runHook postInstall
'';
});
panelColors = [
"red"
"orange"
"yellow"
"green"
"cyan"
"purple"
"pink"
];
sidechery-styled = pkgs.runCommand "sidechery-styled" { } ''
cp -r ${sidechery} $out
chmod -R u+w $out
cat ${pkgs.writeText "sidechery-extra.css" config.elars.sidechery.extraCss} >> $out/styles/sidebar.css
'';
in
{
options.elars.sidechery.extraCss = lib.mkOption {
type = lib.types.lines;
default = "";
description = ''
CSS appended to sidechery's sidebar stylesheet at build time, so
styling doesn't depend on the in-extension styles editor.
'';
};
config.xdg.configFile."sidechery/panels.json".text = builtins.toJSON {
ver = sidechery.version;
sidebar = {
panels = lib.genAttrs panelColors (color: {
type = 2; # PanelType.tabs
id = color;
name = color;
inherit color;
iconSVG = "icon_circle";
});
nav = panelColors ++ [
"collapse"
"settings"
"create_snapshot"
];
};
};
config.programs.helium = {
extraFlags = [ "--load-extension=${sidechery-styled}" ];
preferences = {
helium.browser.layout = 2;
extensions.commands."linux:Ctrl+S" = {
command_name = "_execute_action";
extension = "napehjbogfncaoogcckddbidjgcapclg";
global = false;
};
};
};
};
}
+4 -2
View File
@@ -11,6 +11,10 @@
package = inputs.helium.packages.${system}.helium-widevine;
extensions = [
{
id = "clngdbkpkpeebahjckkjfobafhncgmne";
hash = "sha256-82toCWp5v/Crf35et50ISOw2Q66ZhJrCx59rhDVTRPk=";
}
{
id = "dkdnancajokhfclpjpplkhlkbhaeejob";
hash = "sha256-hkEGW2JVQzeRmTpoPrWFoVG3sbCgHohnsr2b12rfeMg=";
@@ -57,7 +61,6 @@
preferences = {
helium.browser = {
layout = 2;
zen_mode = true;
zen_mode_sidebar_pinned = true;
zen_mode_top_chrome_pinned = true;
@@ -65,7 +68,6 @@
minimal_location_bar = true;
rounded_frame = false;
new_tab_next_to_active = false;
vertical_right_aligned = false;
show_back_button = true;
show_extensions_button = true;
show_media_button = true;
+39
View File
@@ -0,0 +1,39 @@
{ ... }:
{
flake.homeModules.home-obsidian =
{ ... }:
{
programs.obsidian = {
enable = true;
defaultSettings = {
app = {
promptDelete = false;
alwaysUpdateLinks = true;
newFileLocation = "current";
attachmentFolderPath = "attachments";
vimMode = false;
};
corePlugins = [
"file-explorer"
"global-search"
"switcher"
"graph"
"backlink"
"outgoing-link"
"tag-pane"
"page-preview"
"daily-notes"
"templates"
"note-composer"
"command-palette"
"editor-status"
"bookmarks"
"outline"
"word-count"
"file-recovery"
];
};
vaults.notes.target = "Documents/Obsidian";
};
};
}
+27
View File
@@ -0,0 +1,27 @@
{ ... }:
{
flake.homeModules.home-thunderbird =
{ ... }:
{
programs.thunderbird = {
enable = true;
profiles.default = {
isDefault = true;
settings = {
"mail.shell.checkDefaultClient" = false;
"mailnews.start_page.enabled" = false;
"mail.provider.enabled" = false;
"mailnews.message_display.disable_remote_image" = true;
"privacy.donottrackheader.enabled" = true;
"datareporting.healthreport.uploadEnabled" = false;
"datareporting.policy.dataSubmissionEnabled" = false;
"toolkit.telemetry.enabled" = false;
"app.update.auto" = false;
"intl.date_time.pattern_override.date_short" = "dd.MM.yyyy";
"ui.systemUsesDarkTheme" = 1;
"font.name.monospace.x-western" = "JetBrainsMono Nerd Font Mono";
};
};
};
};
}
@@ -27,5 +27,29 @@
accent = "cabaaa";
};
elars.theme.paletteLight = inputs.themes.custom {
name = "Kemuri Susu Light";
author = "elars";
base00 = "d4c1a8"; # mSurface
base01 = "c5b29a"; # mSurfaceVariant
base02 = "a89682"; # mOutline
base03 = "736c5f"; # mShadow
base04 = "736b5e"; # mSecondary
base05 = "262524"; # mOnSurface
base06 = "3a3734";
base07 = "1e1d1b";
base08 = "b84242"; # red / mError
base09 = "9c7a4a"; # orange
base0A = "8a7140"; # yellow
base0B = "5e7a5c"; # green
base0C = "4f7a70"; # cyan
base0D = "4f6875"; # blue
base0E = "85606b"; # magenta
base0F = "594f46"; # brown
accent = "262524"; # mPrimary
};
};
}
@@ -0,0 +1,42 @@
{ ... }:
{
flake.homeModules.home-theme-mode-switch =
{
config,
lib,
pkgs,
...
}:
let
variants = "${config.xdg.configHome}/elars-theme";
current = "${config.xdg.stateHome}/elars-theme/current";
switch = pkgs.writeShellScript "elars-theme-mode" ''
mode="''${1:-''${NOCTALIA_THEME_MODE:-dark}}"
[ "$mode" = light ] || mode=dark
${lib.getExe' pkgs.coreutils "mkdir"} -p "$(${lib.getExe' pkgs.coreutils "dirname"} ${lib.escapeShellArg current})"
${lib.getExe' pkgs.coreutils "ln"} -sfn ${lib.escapeShellArg variants}/"$mode" ${lib.escapeShellArg current}
'';
in
{
options.elars.theme.currentVariantDir = lib.mkOption {
type = lib.types.str;
readOnly = true;
default = current;
description = ''
Directory holding the active variant's files; point configs here
instead of at a fixed dark/light file.
'';
};
config = {
programs.noctalia.settings.hooks.theme_mode_changed = "${switch}";
home.activation.elarsThemeMode = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
if [ ! -e ${lib.escapeShellArg current} ]; then
run ${switch} ${config.programs.noctalia.settings.theme.mode or "dark"}
fi
'';
};
};
}
@@ -0,0 +1,63 @@
{ ... }:
{
flake.homeModules.home-theme-obsidian =
{ config, ... }:
let
p = config.elars.theme.palette.withHashtag;
accent = p.accent or p.base06;
in
{
programs.obsidian.defaultSettings = {
appearance = {
theme = "obsidian";
accentColor = accent;
baseFontSize = 15;
monospaceFontFamily = "JetBrainsMono Nerd Font Mono";
enabledCssSnippets = [ "kemuri" ];
};
cssSnippets = [
{
name = "kemuri";
text = ''
/* generated from elars.theme.palette */
.theme-dark {
--background-primary: ${p.base00};
--background-primary-alt: ${p.base01};
--background-secondary: ${p.base01};
--background-secondary-alt: ${p.base02};
--background-modifier-border: ${p.base02};
--background-modifier-hover: ${p.base02};
--text-normal: ${p.base05};
--text-muted: ${p.base04};
--text-faint: ${p.base03};
--text-accent: ${accent};
--text-on-accent: ${p.base00};
--interactive-accent: ${accent};
--text-selection: ${p.base02};
--color-red: ${p.base08};
--color-orange: ${p.base09};
--color-yellow: ${p.base0A};
--color-green: ${p.base0B};
--color-cyan: ${p.base0C};
--color-blue: ${p.base0D};
--color-purple: ${p.base0E};
}
body {
--radius-s: 0px;
--radius-m: 0px;
--radius-l: 0px;
--radius-xl: 0px;
--input-radius: 0px;
--button-radius: 0px;
--checkbox-radius: 0px;
--tab-radius: 0px;
--shadow-s: none;
--shadow-l: none;
}
'';
}
];
};
};
}
+224 -198
View File
@@ -8,109 +8,206 @@
...
}:
let
p = config.elars.theme.palette;
h = p.withHashtag;
rgb = hex: lib.concatMapStringsSep "," toString (config.elars.theme.hexToRgb hex);
accent = p.accent or p.base06;
foregrounds = {
Normal = p.base05;
Inactive = p.base04;
Active = accent;
Link = p.base0C;
Visited = p.base0E;
Negative = p.base08;
Neutral = p.base0A;
Positive = p.base0B;
};
colorSet =
name:
{
background,
alternate,
normal ? foregrounds.Normal,
inactive ? foregrounds.Inactive,
}:
let
fg = foregrounds // {
Normal = normal;
Inactive = inactive;
};
in
''
[Colors:${name}]
BackgroundNormal=${rgb background}
BackgroundAlternate=${rgb alternate}
DecorationFocus=${rgb accent}
DecorationHover=${rgb p.base03}
ForegroundActive=${rgb fg.Active}
ForegroundInactive=${rgb fg.Inactive}
ForegroundLink=${rgb fg.Link}
ForegroundNegative=${rgb fg.Negative}
ForegroundNeutral=${rgb fg.Neutral}
ForegroundNormal=${rgb fg.Normal}
ForegroundPositive=${rgb fg.Positive}
ForegroundVisited=${rgb fg.Visited}
'';
qtctColors =
{
text,
window,
base,
alternateBase,
button,
buttonText,
bright,
shadow,
}:
builtins.concatStringsSep ", " [
text # WindowText
button # Button
h.base03 # Light
h.base02 # Midlight
shadow # Dark
h.base03 # Mid
buttonText # Text
bright # BrightText
buttonText # ButtonText
base # Base
window # Window
shadow # Shadow
h.base03 # Highlight
bright # HighlightedText
h.base0C # Link
h.base0E # LinkVisited
alternateBase # AlternateBase
h.base01 # NoRole
h.base01 # ToolTipBase
text # ToolTipText
h.base04 # PlaceholderText
];
active = qtctColors {
text = h.base05;
window = h.base01;
base = h.base00;
alternateBase = h.base01;
button = h.base02;
buttonText = h.base05;
bright = h.base07;
shadow = h.base00;
};
disabled = qtctColors {
text = h.base04;
window = h.base01;
base = h.base00;
alternateBase = h.base01;
button = h.base01;
buttonText = h.base04;
bright = h.base06;
shadow = h.base00;
};
font = "JetBrainsMono Nerd Font,11,-1,5,50,0,0,0,0,0";
# qt6ct colour scheme + kdeglobals for one palette.
variant =
p:
let
h = p.withHashtag;
selection = if p.isLight then p.base02 else p.base03;
accent = p.accent or p.base06;
foregrounds = {
Normal = p.base05;
Inactive = p.base04;
Active = accent;
Link = p.base0C;
Visited = p.base0E;
Negative = p.base08;
Neutral = p.base0A;
Positive = p.base0B;
};
colorSet =
name:
{
background,
alternate,
normal ? foregrounds.Normal,
inactive ? foregrounds.Inactive,
}:
let
fg = foregrounds // {
Normal = normal;
Inactive = inactive;
};
in
''
[Colors:${name}]
BackgroundNormal=${rgb background}
BackgroundAlternate=${rgb alternate}
DecorationFocus=${rgb accent}
DecorationHover=${rgb p.base03}
ForegroundActive=${rgb fg.Active}
ForegroundInactive=${rgb fg.Inactive}
ForegroundLink=${rgb fg.Link}
ForegroundNegative=${rgb fg.Negative}
ForegroundNeutral=${rgb fg.Neutral}
ForegroundNormal=${rgb fg.Normal}
ForegroundPositive=${rgb fg.Positive}
ForegroundVisited=${rgb fg.Visited}
'';
qtctColors =
{
text,
window,
base,
alternateBase,
button,
buttonText,
bright,
shadow,
}:
builtins.concatStringsSep ", " [
text # WindowText
button # Button
h.base03 # Light
h.base02 # Midlight
shadow # Dark
h.base03 # Mid
buttonText # Text
bright # BrightText
buttonText # ButtonText
base # Base
window # Window
shadow # Shadow
"#${selection}" # Highlight
bright # HighlightedText
h.base0C # Link
h.base0E # LinkVisited
alternateBase # AlternateBase
h.base01 # NoRole
h.base01 # ToolTipBase
text # ToolTipText
h.base04 # PlaceholderText
];
active = qtctColors {
text = h.base05;
window = h.base01;
base = h.base00;
alternateBase = h.base01;
button = h.base02;
buttonText = h.base05;
bright = h.base07;
shadow = h.base00;
};
disabled = qtctColors {
text = h.base04;
window = h.base01;
base = h.base00;
alternateBase = h.base01;
button = h.base01;
buttonText = h.base04;
bright = h.base06;
shadow = h.base00;
};
in
{
qt6ctColors = ''
[ColorScheme]
active_colors=${active}
inactive_colors=${active}
disabled_colors=${disabled}
'';
kdeglobals = ''
[General]
ColorScheme=${p.name}
Name=${p.name}
font=${font}
fixed=${font}
menuFont=${font}
toolBarFont=${font}
smallestReadableFont=JetBrainsMono Nerd Font,9,-1,5,50,0,0,0,0,0
[Icons]
Theme=int_nord
[KDE]
widgetStyle=Fusion
contrast=4
${colorSet "Window" {
background = p.base01;
alternate = p.base02;
}}
${colorSet "View" {
background = p.base00;
alternate = p.base01;
}}
${colorSet "Button" {
background = p.base02;
alternate = p.base01;
}}
${colorSet "Header" {
background = p.base01;
alternate = p.base02;
}}
${colorSet "Header][Inactive" {
background = p.base00;
alternate = p.base01;
normal = p.base04;
}}
${colorSet "Tooltip" {
background = p.base01;
alternate = p.base02;
}}
${colorSet "Complementary" {
background = p.base00;
alternate = p.base01;
}}
${colorSet "Selection" {
background = selection;
alternate = selection;
normal = p.base07;
inactive = p.base06;
}}
[WM]
activeBackground=${rgb p.base02}
activeBlend=${rgb p.base02}
activeForeground=${rgb p.base05}
inactiveBackground=${rgb p.base01}
inactiveBlend=${rgb p.base01}
inactiveForeground=${rgb p.base04}
[ColorEffects:Disabled]
Color=${rgb p.base01}
ColorAmount=0
ColorEffect=0
ContrastAmount=0.65
ContrastEffect=1
IntensityAmount=0.1
IntensityEffect=2
[ColorEffects:Inactive]
ChangeSelectionColor=true
Color=${rgb p.base02}
ColorAmount=0.025
ColorEffect=2
ContrastAmount=0.1
ContrastEffect=2
IntensityAmount=0
IntensityEffect=0
'';
};
dir = config.elars.theme.currentVariantDir;
in
{
qt = {
@@ -122,104 +219,33 @@
pkgs.qt6Packages.qt6ct
];
xdg.configFile."qt6ct/colors/kemuri.conf".text = ''
[ColorScheme]
active_colors=${active}
inactive_colors=${active}
disabled_colors=${disabled}
'';
# Both variants are generated; home-theme-mode-switch picks one.
xdg.configFile = lib.mkMerge [
(lib.concatMapAttrs
(mode: palette: {
"elars-theme/${mode}/qt6ct-colors.conf".text = (variant palette).qt6ctColors;
"elars-theme/${mode}/kdeglobals".text = (variant palette).kdeglobals;
})
{
dark = config.elars.theme.palette;
light = config.elars.theme.paletteLight;
}
)
{
"kdeglobals".source = config.lib.file.mkOutOfStoreSymlink "${dir}/kdeglobals";
"qt6ct/qt6ct.conf".text = ''
[Appearance]
style=Fusion
custom_palette=true
color_scheme_path=${dir}/qt6ct-colors.conf
standard_dialogs=default
xdg.configFile."qt6ct/qt6ct.conf".text = ''
[Appearance]
style=Fusion
custom_palette=true
color_scheme_path=${config.xdg.configHome}/qt6ct/colors/kemuri.conf
standard_dialogs=default
[Fonts]
fixed="${font}"
general="${font}"
'';
}
];
[Fonts]
fixed="${font}"
general="${font}"
'';
xdg.configFile."kdeglobals".text = ''
[General]
ColorScheme=${p.name}
Name=${p.name}
font=${font}
fixed=${font}
menuFont=${font}
toolBarFont=${font}
smallestReadableFont=JetBrainsMono Nerd Font,9,-1,5,50,0,0,0,0,0
[Icons]
Theme=int_nord
[KDE]
widgetStyle=Fusion
contrast=4
${colorSet "Window" {
background = p.base01;
alternate = p.base02;
}}
${colorSet "View" {
background = p.base00;
alternate = p.base01;
}}
${colorSet "Button" {
background = p.base02;
alternate = p.base01;
}}
${colorSet "Header" {
background = p.base01;
alternate = p.base02;
}}
${colorSet "Header][Inactive" {
background = p.base00;
alternate = p.base01;
normal = p.base04;
}}
${colorSet "Tooltip" {
background = p.base01;
alternate = p.base02;
}}
${colorSet "Complementary" {
background = p.base00;
alternate = p.base01;
}}
${colorSet "Selection" {
background = p.base03;
alternate = p.base03;
normal = p.base07;
inactive = p.base06;
}}
[WM]
activeBackground=${rgb p.base02}
activeBlend=${rgb p.base02}
activeForeground=${rgb p.base05}
inactiveBackground=${rgb p.base01}
inactiveBlend=${rgb p.base01}
inactiveForeground=${rgb p.base04}
[ColorEffects:Disabled]
Color=${rgb p.base01}
ColorAmount=0
ColorEffect=0
ContrastAmount=0.65
ContrastEffect=1
IntensityAmount=0.1
IntensityEffect=2
[ColorEffects:Inactive]
ChangeSelectionColor=true
Color=${rgb p.base02}
ColorAmount=0.025
ColorEffect=2
ContrastAmount=0.1
ContrastEffect=2
IntensityAmount=0
IntensityEffect=0
'';
};
}
@@ -0,0 +1,53 @@
{ ... }:
{
# Baked into the sidechery build (see home-browser-helium-sidechery).
flake.homeModules.home-theme-sidechery =
{ config, ... }:
let
p = config.elars.theme.palette.withHashtag;
accent = p.accent or p.base06;
in
{
elars.sidechery.extraCss = ''
/* generated from elars.theme.palette */
#root.root {
--frame-bg: ${p.base00};
--toolbar-bg: ${p.base01};
--s-accent: ${accent};
--nav-btn-active-shadow: inset 0 0 0 1px ${accent};
--nav-btn-len-margin: 2px;
--tabs-border-radius: 0px;
}
[data-color=red] { --color: ${p.base08}; }
[data-color=orange] { --color: ${p.base09}; }
[data-color=yellow] { --color: ${p.base0A}; }
[data-color=green] { --color: ${p.base0B}; }
[data-color=cyan],
[data-color=turquoise] { --color: ${p.base0C}; }
[data-color=blue] { --color: ${p.base0D}; }
[data-color=purple] { --color: ${p.base0E}; }
[data-color=pink] { --color: color-mix(in oklab, white 25%, ${p.base0E}); }
[data-color=gray] { --color: ${p.base04}; }
.Tab[data-pin=false] .fav {
margin: 0 var(--tabs-inner-gap) 0 var(--tabs-inner-gap);
}
.NavigationBar,
.NavigationBar .nav-item {
border-radius: 0px;
}
.top-horizontal-box {
margin-bottom: 2px;
margin-left: 2px;
}
.NavigationBar .nav-item .len {
font-size: .5rem;
}
'';
};
}
@@ -0,0 +1,66 @@
{ ... }:
{
flake.homeModules.home-theme-stylus =
{ config, ... }:
let
p = config.elars.theme.palette.withHashtag;
accent = p.accent or p.base06;
in
{
xdg.configFile."stylus/kemuri.user.css".text = ''
/* ==UserStyle==
@name Kemuri (square)
@namespace copland
@version 1.0.0
@description Square corners, no shadows, kemuri palette. Generated from elars.theme.palette.
@author elars
==/UserStyle== */
@-moz-document regexp(".*") {
* {
border-radius: 0px !important;
box-shadow: none !important;
--dt-black: ${p.base00};
--dt-gray-0: ${p.base00};
--dt-gray-1: ${p.base01};
--dt-gray-2: ${p.base02};
--dt-gray-3: ${p.base03};
--dt-gray-4: ${p.base0F};
--dt-gray-5: ${p.base04};
--dt-gray-6: ${p.base04};
--dt-gray-7: ${p.base06};
--dt-gray-8: ${p.base06};
--dt-gray-9: ${p.base05};
--dt-gray-10: ${p.base05};
--dt-white: ${p.base07};
--dt-red-6: ${p.base08};
--dt-red-7: ${p.base08};
--dt-orange-6: ${p.base09};
--dt-orange-7: ${p.base09};
--dt-yellow: ${p.base0A};
--dt-green-6: ${p.base0B};
--dt-green-7: ${p.base0B};
--dt-cyan-6: ${p.base0C};
--dt-cyan-7: ${p.base0C};
--dt-blue-6: ${p.base0D};
--dt-blue-7: ${p.base0D};
--dt-blue-8: ${p.base0D};
--dt-magenta-7: ${p.base0E};
--dt-magenta-8: ${p.base0E};
}
html {
accent-color: ${accent};
caret-color: ${accent};
scrollbar-color: ${p.base03} transparent;
}
::selection {
background: ${accent};
color: ${p.base00};
}
}
'';
};
}
+8
View File
@@ -39,6 +39,14 @@
'';
};
options.elars.theme.paletteLight = lib.mkOption {
type = lib.types.raw;
description = ''
Light variant of `elars.theme.palette`, used by consumers that
follow the noctalia light/dark mode (see home-theme-mode-switch).
'';
};
options.elars.theme.hexToRgb = lib.mkOption {
type = lib.types.raw;
default =
@@ -7,28 +7,19 @@
system,
...
}:
let
uxplay-fixed = pkgs.uxplay.override {
avahi = pkgs.avahi.override { withLibdnssdCompat = true; };
};
in
{
environment.systemPackages = with pkgs; [
# apps
onlyoffice-desktopeditors
kdePackages.kdenlive
telegram-desktop
prismlauncher
davinci-resolve
gparted-full
moonlight-qt
qbittorrent
obs-studio
spotifast
localsend
picotool
sunshine
zapzap
loupe
gimp
wine
@@ -64,7 +55,6 @@
# phone
libimobiledevice
android-tools
uxplay-fixed
usbmuxd
libmtp
scrcpy
+6 -9
View File
@@ -6,15 +6,12 @@
programs.niri.enable = true;
nixpkgs.overlays = [
(final: prev: {
xwayland-satellite =
if prev.lib.versionOlder prev.xwayland-satellite.version "0.8.3" then
prev.xwayland-satellite.overrideAttrs (old: {
patches = (old.patches or [ ]) ++ [
./xwayland-satellite-no-focus-override-redirect.patch
];
})
else
prev.xwayland-satellite;
xwayland-satellite = prev.xwayland-satellite.overrideAttrs (old: {
patches =
(old.patches or [ ])
++ prev.lib.optional (prev.lib.versionOlder old.version "0.8.3") ./xwayland-satellite-no-focus-override-redirect.patch
++ prev.lib.optional (prev.lib.versionOlder old.version "0.8.4") ./xwayland-satellite-resizable-dialog-toplevel.patch;
});
})
];
@@ -0,0 +1,49 @@
--- a/src/xstate/mod.rs 2026-10-10 02:55:59.663368893 +0300
+++ b/src/xstate/mod.rs 2026-10-10 02:55:59.699369500 +0300
@@ -1189,7 +1189,9 @@
match ty {
x if x == window_atoms.normal => return WindowRole::Toplevel,
x if x == window_atoms.dialog => {
- return WindowRole::new_basic(self.has_transient_for && motif_no_decor);
+ return WindowRole::new_basic(
+ self.has_transient_for && motif_no_decor && forced_size,
+ );
}
x if x == window_atoms.utility => {
return WindowRole::new_basic(motif_no_decor && forced_size);
--- a/src/xstate/tests.rs 2026-10-10 02:55:59.665368927 +0300
+++ b/src/xstate/tests.rs 2026-10-10 02:56:08.382515889 +0300
@@ -473,6 +473,33 @@
assert_eq!(win.guess_window_role(&win_types), WindowRole::Popup);
}
+ // https://github.com/Supreeeme/xwayland-satellite/issues/470
+ // A DIALOG with TRANSIENT_FOR and no Motif decorations which is resizable
+ // (min_size != max_size) should be a top-level, mirroring the UTILITY fix in #383.
+ // Otherwise the popup parent resolves to a hidden WM_CLIENT_LEADER and the
+ // window never appears (e.g. DaVinci Resolve's Project Manager).
+ // Window attributes are taken from the full xprop posted in #470 (DIALOG +
+ // NORMAL window types, _MOTIF_WM_HINTS decorations=0, resizable normal hints).
+ #[test]
+ fn davinci_resolve_project_manager() {
+ let win_types = WindowTypes::new();
+ let wm_normal_hints = WmNormalHints::new()
+ .user_pos(978, 270)
+ .user_size(1884, 1620)
+ .min_size(910, 640)
+ .max_size(2880, 1620)
+ .win_gravity(Gravity::Static);
+ let win = WindowRoleHeuristics {
+ has_transient_for: true,
+ motif_wm_hints: Some(motif::Hints::from([0x2_u32, 0x1, 0, 0, 0].as_slice())),
+ window_types: vec![win_types.dialog, win_types.normal],
+ wm_normal_hints: Some(wm_normal_hints.into()),
+ wm_class: Some("resolve".into()),
+ ..Default::default()
+ };
+ assert_eq!(win.guess_window_role(&win_types), WindowRole::Toplevel);
+ }
+
// https://github.com/Supreeeme/xwayland-satellite/pull/390
// With Motif decorations, even a dialog with TRANSIENT_FOR is better treated as a top-level
#[test]
+12
View File
@@ -0,0 +1,12 @@
{ ... }:
{
flake.nixosModules.hw-keychron =
{ pkgs, ... }:
{
services.udev.packages = [
(pkgs.writeTextDir "lib/udev/rules.d/70-keychron.rules" ''
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="3434", MODE="0660", TAG+="uaccess"
'')
];
};
}
-4
View File
@@ -14,9 +14,5 @@
}
});
'';
services.udev.extraRules = ''
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="3434", ATTRS{idProduct}=="d030", MODE="0660", TAG+="uaccess", TAG+="udev-acl"
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="3434", ATTRS{idProduct}=="0b11", MODE="0660", TAG+="uaccess", TAG+="udev-acl"
'';
};
}
+11
View File
@@ -0,0 +1,11 @@
{ ... }:
{
flake.nixosModules.net-localsend =
{ ... }:
{
programs.localsend = {
enable = true;
openFirewall = true;
};
};
}
+44
View File
@@ -0,0 +1,44 @@
{ ... }:
{
flake.nixosModules.net-uxplay =
{ pkgs, ... }:
let
uxplay = pkgs.uxplay.override {
avahi = pkgs.avahi.override { withLibdnssdCompat = true; };
};
uxplay-fixed-ports = pkgs.symlinkJoin {
name = "uxplay-fixed-ports";
paths = [ uxplay ];
nativeBuildInputs = [ pkgs.makeWrapper ];
postBuild = ''
wrapProgram $out/bin/uxplay --add-flags "-p"
'';
};
in
{
environment.systemPackages = [ uxplay-fixed-ports ];
services.avahi = {
enable = true;
nssmdns4 = true;
openFirewall = true;
publish = {
enable = true;
userServices = true;
};
};
networking.firewall = {
allowedTCPPorts = [
7000
7001
7100
];
allowedUDPPorts = [
6000
6001
7011
];
};
};
}