vidbinaβs dotfiles
These dotfiles make my life slightly more convenient. Not promising theyβll do the same for yours though. π
My configuration is currently managed with home-manager for the better DX or UX. Before using home-manager, I manually managed symlinks from my config directory to this dotfiles repo. The use of GNU Stow was considered for a brief moment until I realized that Stow was written in Perl and I came to terms with my unwillingness to have a critical part of my stack based on tooling that brings me no joy π (on account of my troubled personal history with Perl).
# Tangled from README.org
{ config, lib, pkgs, ... }:
# TODO: Config mutt
let
inherit (pkgs) stdenv;
pathIfExists = (p: if (builtins.pathExists p) then [ p ] else [ ]);
sources = import ./nix/sources.nix;
<<common-packages-let>>
in
{
imports = [
<<common-imports>>
]
++ (pathIfExists ./personal.nix);
home.packages = [
<<common-packages>>
<<desktop-packages>>
];
home.file = {
<<common-home-files>>
};
#home.file.".profile".text = ''
# PATH=${toString ./bin}:$HOME/.nix-profile/bin:$PATH
# export PATH
#'';
home.sessionPath = [
(toString ./bin)
];
nix = {
extraOptions = ''
experimental-features = nix-command flakes
'';
};
nixpkgs = {
overlays = [
(self: super: {
<<common-overlays>>
})
];
config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
<<nixpkgs-unfree>>
];
};
<<common-programs>>
}
".config/ranger".source = config.lib.file.mkOutOfStoreSymlink ./ranger;
# TODO: Remove, likely not necessary
".direnvrc".source = config.lib.file.mkOutOfStoreSymlink ./direnv/direnvrc;
programs.bat = {
enable = true;
config = {
theme = "base16";
};
};
# Let Home Manager install and manage itself.
programs.home-manager.enable = true;
programs.direnv = {
enable = true;
nix-direnv = {
enable = true;
};
};
programs.tmux = {
enable = true;
extraConfig = builtins.readFile (./. + "/tmux.conf");
};
Disabled because of validation errors.
error: builder for '/nix/store/1f5lhdhsj2lf090pbxbvpmp3nijmzpy6-manual-combined.drv' failed with exit code 3;
last 10 log lines:
> /nix/store/vlpr4h1k43rbr5gpb3zrphq8gn6l4n4l-manual-combined/manual-combined.xml:1336: element variablelist: Relax-NG validity error : Did not expect element variablelist there
> 1332 </section>
> 1333 </chapter>
> 1334 <appendix xml:id="ch-options">
> 1335 <title>Configuration Options</title>
> 1336 <variablelist xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="home-manager-options" xml:base="nmd-result/home-manager-options.xml"><varlistentry><term xlink:href="#opt-_module.args" xml:id="opt-_module.args"><option>_module.args</option></term><listitem><para/><para><emphasis>Type:</emphasis> lazy attribute set of raw value</para><para><emphasis>Declared by:</emphasis></para><simplelist><member><filename xlink:href="https://github.com/nix-community/home-manager/blob/master/lib/modules.nix#blob-path">
> 1337 <home-manager/lib/modules.nix>
> 1338 </filename></member></simplelist></listitem></varlistentry><varlistentry><term xlink:href="#opt-accounts.email.accounts" xml:id="opt-accounts.email.accounts"><option>accounts.email.accounts</option></term><listitem><para>List of email accounts.</para><para><emphasis>Type:</emphasis> attribute set of (submodule)</para><para><emphasis>Default:</emphasis> <literal>
>
> /nix/store/vlpr4h1k43rbr5gpb3zrphq8gn6l4n4l-manual-combined/manual-combined.xml fails to validate
manual = {
# Use `home-manager-help`
html.enable = false;
# Use `man home-configuration.nix`
manpages.enable = false;
};
programs.zsh = {
enable = true;
enableAutosuggestions = false;
enableSyntaxHighlighting = true;
defaultKeymap = "viins";
initExtraBeforeCompInit = ''
<<zsh-init-before-compinit>>
'';
initExtra = ''
<<zsh-init-extra>>
'';
};
setopt histignorespace # keeps lines preceded with SPACE out of history
setopt INTERACTIVE_COMMENTS # allow inline comments like this one
Define helper functions to allow us to jump between prompts in vterm in Emacs.
Shell function: vterm_printfSee https://github.com/akermu/emacs-libvterm#shell-side-configuration
# https://github.com/akermu/emacs-libvterm#directory-tracking-and-prompt-tracking
vterm_printf(){
if [ -n "$TMUX" ] && ([ "''${TERM%%-*}" = "tmux" ] || [ "''${TERM%%-*}" = "screen" ] ); then
# Tell tmux to pass the escape sequences through
printf "\ePtmux;\e\e]%s\007\e\\" "$1"
elif [ "''${TERM%%-*}" = "screen" ]; then
# GNU screen (screen, screen-256color, screen-256color-bce)
printf "\eP\e]%s\007\e\\" "$1"
else
printf "\e]%s\e\\" "$1"
fi
}
For bash and zsh.
Prep for Elisp: vterm-clear-scrollbackSee https://github.com/akermu/emacs-libvterm#vterm-clear-scrollback
if [[ "$INSIDE_EMACS" = 'vterm' ]]; then
alias clear='vterm_printf "51;Evterm-clear-scrollback";tput clear'
fi
See https://github.com/akermu/emacs-libvterm#vterm-buffer-name-string
autoload -U add-zsh-hook
add-zsh-hook -Uz chpwd (){ print -Pn "\e]2;%m:%2~\a" }
See https://github.com/akermu/emacs-libvterm#directory-tracking-and-prompt-tracking
vterm_prompt_end() {
vterm_printf "51;A";
}
setopt PROMPT_SUBST
PROMPT="βͺ %(?.%F{green}β.%F{red}%?)%f" # error state
PROMPT="$PROMPT β %F{yellow}%~%f" # pwd
PROMPT="$PROMPT @ %F{magenta}%D{%Y.%m.%d} %B%F{blue}%T%f%b" # date/time
PROMPT="$PROMPT"$'\n'
PROMPT="$PROMPT%F{green}>%f " # prompt
PROMPT=$PROMPT'%{$(vterm_prompt_end)%}'
See https://github.com/akermu/emacs-libvterm#message-passing
vterm_cmd() {
local vterm_elisp
vterm_elisp=""
while [ $# -gt 0 ]; do
vterm_elisp="$vterm_elisp""$(printf '"%s" ' "$(printf "%s" "$1" | sed -e 's|\\|\\\\|g' -e 's|"|\\"|g')")"
shift
done
vterm_printf "51;E$vterm_elisp"
}
Read https://scriptingosx.com/2019/07/moving-to-zsh-part-5-completions/
# enable bash completion
autoload -U +X bashcompinit && \
bashcompinit
The complist module allows completion lists to be color-coded.
zmodload -i zsh/complist
#source ${./zsh/zstyle.zsh}
The fzf (GitHub) fuzzy finder utility, is reported to be blazingly fast. It was commented out of the configuration a while back because of some memory-allocation issue way back but it is hard to live without any form of reverse search help in bash.
source ${pkgs.fzf}/share/fzf/completion.zsh
source ${pkgs.fzf}/share/fzf/key-bindings.zsh
fatal error: mallocgc called without a P or outside bootstrapping
runtime: panic before malloc heap initialized
# enable gh completion
eval "$(gh completion -s zsh)"
For Linux, we install pywal through the programs
attribute:
programs.pywal = {
enable = true;
};
For Darwin, we currently install Pywal with home-manager:
pywal
- Ensure Nix is installed as outlined in https://github.com/NixOS/nix#installation
curl -L https://nixos.org/nix/install | sh
- Optionally install homebrew as outlined on https://brew.sh in case you want to manage some of your brew packages with Nix as well. Note that you may not need to manually add homebrew to your path if you use nix-darwin as the homebrew activationScript will take care of it.
- Optionally install Rosetta 2 for the case where it may be necessary since tools like Docker may rely on for some of their capability.
softwareupdate --install-rosetta
- Setup nix-darwin and apply the configuration as outlined in https://github.com/LnL7/nix-darwin/#step-2-installing-nix-darwin
nix run nix-darwin -- switch --flake . --show-trace
On systems, where
darwin-rebuild
has already been installed, run the following command instead:darwin-rebuild switch --flake .
In case of
error: experimental Nix feature 'nix-command' is disabled; use '--extra-experimental-features nix-command' to override
errors, try to run:nix --extra-experimental-features nix-command --extra-experimental-features flakes run nix-darwin -- switch --flake . --show-trace
- Update the nix flakes using
nix flake update
and if you just want to upgrade packages managed by brew, run:
brew upgrade
- In order to debug the config enter a Nix REPL and inspect the inputs and outputs by using tab-completion on the variables
inputs
andoutputs
after loading the Flake.Enter the REPL with the following command:
nix repl
Bring the input and output variables into the REPL scope by loading the Flake as follows:
:lf .
See relevant help information by running:
:?
See the nix-darwin configuration section for configuration/implementation details.
On my old MacBook Pro, I started by installing and using home-manager first before deciding to use nix-darwin. This has created some nix-related configuration on my machine that nix-darwin did not fully overwrite when I applied that change. Because of this imperative change nonesense, I had latent QEMU and Emacs packages in my nix path (observeable through running tree -L 2 ~/.nix-profile
).
I attempted to resolve this by removing the home-manager package from my profile:
> nix profile list
0 - - /nix/store/8s1b5c5w06yxxqba1zkv8yvlcyjhr6y6-password-store-1.7.4
1 flake:nixpkgs#legacyPackages.x86_64-darwin.cachix github:NixOS/nixpkgs/1697b7d480449b01111e352021f46e5879e47643#legacyPackages.x86_64-darwin.cachix /nix/store/7hmy1x2ca3gdfkvm029qg5074xby10pi-cachix-1.6
2 flake:nixpkgs#legacyPackages.x86_64-darwin.cachix github:NixOS/nixpkgs/1697b7d480449b01111e352021f46e5879e47643#legacyPackages.x86_64-darwin.cachix /nix/store/7hmy1x2ca3gdfkvm029qg5074xby10pi-cachix-1.6
3 - - /nix/store/7z9x0izk35yzggjhlnvsmv3y4sahijmh-home-manager-path
and then rebuilding the config.
With this, I believe I messed up my config even more, so I had to uninstall nix-darwin altogether https://github.com/LnL7/nix-darwin#uninstalling and then remove all nix-related folders as outlined in https://nixos.org/manual/nix/stable/installation/uninstall#macos.
Pay attention to trigger the correct disk identifier (note that the numbers in the first column and the IDENTIFIER column may not be similar in terms of numbers.
/dev/disk0 (internal, physical):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *1.0 TB disk0
1: EFI EFI 314.6 MB disk0s1
2: Apple_APFS Container disk1 1.0 TB disk0s2
/dev/disk1 (synthesized):
#: TYPE NAME SIZE IDENTIFIER
0: APFS Container Scheme - +1.0 TB disk1
Physical Store disk0s2
1: APFS Volume Macintosh HD - Data 354.1 GB disk1s1
2: APFS Volume Preboot 1.9 GB disk1s2
3: APFS Volume Recovery 1.2 GB disk1s3
4: APFS Volume VM 20.5 KB disk1s4
5: APFS Volume Macintosh HD 9.2 GB disk1s5
6: APFS Snapshot com.apple.os.update-... 9.2 GB disk1s5s1
7: APFS Volume Nix Store 11.0 GB disk1s6
sudo rm -rf /etc/nix /var/root/.nix-profile /var/root/.nix-defexpr /var/root/.nix-channels ~/.nix-profile ~/.nix-defexpr ~/.nix-channels
After this, I restart the installation process.
Reading a comment on jmatsushitaβs config led me to believe that the removal of ~/.nix-profile may have broken my system further but then it seems that nix-darwin uses global profiles instead of user-based profiles, which suggests that the existence of ~/.nix-profile may have been a remnant of my pre-nix-darwin use of home-manager. For now it seems that enabling the emacs service in nix-darwin does not immediately expose a CLI-accessible command. Iβve resorted to enabling the service along with installing emacs as a systemPackage but I have to first confirm if the emacs service alone yields a system that exposes the emacs command in a standard shell.
On a completely fresh macOS machine you may encounter ls: .: Operation not permitted
errors if Terminal has not been granted prior access to the full disk.
Navigate to the βFull Disk Accessβ setting and enable access for the Terminal.
# Tangled from README.org
{ config, pkgs, lib, ... }:
{
imports = [
<<common-imports-darwin>>
];
<<home-darwin>>
}
- State βTODOβ from [2023-10-04 Wed 14:20]
Refactor to reuse the shared hm and programs configurations that weβve used for the Linux config earlier. We want to DRY the overal config up.
home.stateVersion = "23.05";
home.packages = with pkgs; [
<<darwin-home-packages>>
];
# NOTE: Copied from dev.nix
# TODO: Figure out how to re-use dev.nix config for Darwin and Linux
home.file = {
<<home-darwin-files>>
};
# No corresponding option in nix-darwin, so we config this with hm
programs.git = {
enable = true;
<<nix-devtools-git>>
};
# NOTE: Copied from common.nix
programs.direnv = {
enable = true;
nix-direnv = {
enable = true;
};
};
# NOTE: Enabling zsh also in hm in order to bring direnv bootstrap into scope
# See https://gist.github.com/jmatsushita/5c50ef14b4b96cb24ae5268dab613050?permalink_comment_id=4205285#gistcomment-4205285
programs.zsh.enable = true;
<<home-darwin-config>>
./vim.nix
The use of home-manager is pretty straightforward especially with the convenient nix shell and the Makefile that make usage even easier. The general idea is as follows:
- shell.nix defines a shell environment that contains all packages needed to install or apply a configuration. The packages include niv which helps us manage versions of our packages, home-manager which actually manages our home environments (hence the name) and and some utils.
- Makefile contains some rules to simplify how we call home-manager inside of the nix-shell since it effectively reduces the UX down to
make
ormake test
calls as opposed tohome-manager -f ./home.nix -v -n build
andhome-manager -f ./home.nix switch
respectively (which you donβt want to have to remember π€·πΏββοΈ).
Typical use will be as follows:
- Enter the nix-shell using
nix-shell --pure
- Configure your personal.nix to specify
home.username
,home.homeDirectory
andhome.stateVersion
for your system - Optionally, update niv-managed packages by running
niv update
to update the sources files (nix/sources.json and nix/sources.nix), as demonstrated below:niv update home-manager niv update nixpkgs
- Run
make test
to test the home-manager configuration ormake
to install the configuration - Optionally, if package update step was completed (step 2 above), commit the changes made to the niv sources files
- Profit π°
π‘ Note that home-manager generated configuration files will be written somewhere to ~~/.config~, e.g.: ~~/.config/git/config~ for git.
We use niv to manage our dependencies and manage this throught the pkgs-bleeding
which we set up in let blocks of shell.nix and common.nix:
nixpkgs-bleeding-src = sources."nixpkgs-bleeding";
pkgs-bleeding = import nixpkgs-bleeding-src { };
For home-manager to work, we define a nix-shell that we creates a controlled environment for our Makefile to work.
# Tangled from README.org
# From https://github.com/ryantm/home-manager-template
let
sources = import ./nix/sources.nix;
nixpkgs-src = sources."nixpkgs";
pkgs = import nixpkgs-src { };
hm-src = sources."home-manager";
nur-src = sources."NUR";
<<common-packages-let>>
in
pkgs.mkShell rec {
name = "home-manager-shell";
buildInputs = with pkgs; [
<<shell-build-inputs>>
];
<<shell-hook>>
}
The build inputs for our shell are:
<<common-packages>>
(import hm-src { inherit pkgs; }).home-manager
cacert # to resolve CA cert issue
hello
git
ncurses # to resolve tput issue
which
For the shell environment to be portable enough to run on both Linux and Darwin (macOS) systems, we define a shell hook that will export a few environment variables into existence depending on the system.
export NIX_PATH="nixpkgs=${nixpkgs-src}:home-manager=${hm-src}:NUR=${nur-src}"
export HOME_MANAGER_CONFIG=${system}
The above snippet is a bit of a cheat because weβve formatted it as bash but some of the variable expansion work is being done by Nix and not Bash. π
We wrap the shell expressions into the following Nix statement to set system
(see the cheat in the snippet above) and we basically pull in the sources through our niv sources file which is defined at the start of our shell.nix file.
shellHook = with pkgs; let
system = (
if stdenv.isLinux
then "./home-linux.nix"
else
(if stdenv.isDarwin
then "./home-darwin.nix"
else "./home.nix")
);
in
''
<<shell-hook-src>>
'';
With all of this out of the way, running make
should just drop us into a Nix shell with everything preconfigured and then run some incantation of home-manager switch
in order to switch our home-manager-managed, pun intended, environment.
Enter a REPL by entering the nix-shell first (to set up the env var NIX_PATH
) and then run the following statement to obtain a reference to the home-manager configuration:
hm = import <home-manager/modules> { inherit pkgs; configuration = ./home-linux.nix; }
# Tangled from README.org
{ lib, pkgs, ... }:
{
imports = [
./common.nix
./doc.nix
./browser.nix
./x.nix
./multimedia.nix
./emacs
];
fonts.fontconfig.enable = true;
home.packages = with pkgs; [
vokoscreen
montserrat
<<home-linux-packages>>
];
<<home-linux-services>>
}
# Tangled from README.org
{ config, pkgs, lib, options, ... }:
{
imports = [
<<x-imports>>
];
home.packages = with pkgs; [
<<x-packages>>
];
xdg.mimeApps.defaultApplications = {
"text/html" = [ "xsel-copy-url.desktop" ];
"x-scheme-handler/about" = [ "xsel-copy-url.desktop" ];
"x-scheme-handler/ftp" = [ "xsel-copy-url.desktop" ];
"x-scheme-handler/http" = [ "xsel-copy-url.desktop" ];
"x-scheme-handler/https" = [ "xsel-copy-url.desktop" ];
"x-scheme-handler/unknown" = [ "xsel-copy-url.desktop" ];
};
nixpkgs.overlays = [
(self: super: {
<<linux-overlays>>
})
];
xdg.mimeApps = {
enable = true;
};
xsession = {
enable = true;
initExtra = ''
setxkbmap -option -model dell -layout us -variant intl -option lv3:caps_switch
'';
profileExtra = ''
hsetroot -solid '#ff9800'
'';
};
home.pointerCursor = {
name = "Vanilla-DMZ";
package = pkgs.vanilla-dmz;
size = 64;
x11 = {
enable = true;
defaultCursor = "tcross";
};
};
<<x-programs>>
services = {
<<x-services>>
};
}
brightnessctl
neofetch
peek
screenkey
xdotool
btop
(writeScriptBin "colors" ''
# https://askubuntu.com/questions/27314/script-to-display-all-terminal-colors
for x in {0..8}; do
for i in {30..37}; do
for a in {40..47}; do
echo -ne "\e[$x;$i;$a""m\\\e[$x;$i;$a""m\e[0;37;40m "
done
echo
done
done
echo ""
'')
We define an overlay in which we build an env that contains a script and the desktop item that our mimehandler can resolve to for the appropriate mimetypes.
xsel-copy-url = pkgs.buildEnv (
let
script = pkgs.writeScriptBin "xsel-copy-url" ''
url=$1
echo "$url" | ${pkgs.xsel}/bin/xsel -ib
${pkgs.libnotify}/bin/notify-send \
--category=url \
--urgency=low \
"π Link Copied" "Paste to enter $url"
'';
in
{
name = "xsel-copy-url";
paths = [
script
(pkgs.makeDesktopItem {
name = "xsel-copy-url";
exec = "${script}/bin/xsel-copy-url %U";
comment = "Open link by copying it into the clipboard with xsel";
desktopName = "xsel-copy-url";
type = "Application";
categories = [
"Network"
"WebBrowser"
];
mimeTypes = [
"text/html"
"x-scheme-handler/http"
"x-scheme-handler/https"
"x-scheme-handler/ftp"
];
})
];
}
);
We add our previously added xsel-copy-url
βpackageβ to our configuration:
xsel-copy-url
programs.urxvt = {
enable = true;
package = pkgs.rxvt-unicode;
<<urxvt-config>>
extraConfig = {
<<urxvt-extra>>
};
fonts = [
<<urxvt-fonts>>
];
keybindings = {
<<urxvt-keybindings>>
};
scroll = {
<<urxvt-scroll>>
};
};
"xft:DejaVu Sans Mono:pixelsize=28:antialias=true"
"xft:Fira Code:size=28:antialias=true"
"xft:Iosevka:size=28:antialias=true"
iso14755 = false;
"C-minus" = "perl:font-size:decrease";
"C-plus" = "perl:font-size:increase";
"C-=" = "perl:font-size:reset";
"M-u" = "perl:url-select:select_next";
"M-C-n" = "perl:color-themes:next";
"M-C-p" = "perl:color-themes:prev";
"M-C-l" = "perl:color-themes:load-state";
"M-C-s" = "perl:color-themes:save-state";
bar.enable = false;
"geometry" = "128x32";
"perl-lib" = "${pkgs.rxvt-unicode}/lib/urxvt/perl";
"perl-ext-common" = builtins.concatStringsSep "," [
"default"
"font-size"
"url-select"
"color-themes"
];
"url-select.autocopy" = true;
"url-select.launcher" = "${pkgs.xsel-copy-url}/bin/xsel-copy-url";
"url-select.underline" = true;
"color-themes.themedir" = "${pkgs.vidbina-urxvt-themes}/share";
"color-themes.state-file" = "${config.home.homeDirectory}/.urxvt-theme";
"color-themes.autosave" = 1;
vidbina-urxvt-themes =
let
readTheme = x:
let
text = builtins.readFile (./. + "/Xresources.d/themes/${x}");
in
pkgs.writeTextDir "share/${x}" text;
in
pkgs.symlinkJoin {
name = "vidbina-urxvt-themes";
paths = map readTheme [
"vidbina-dark.Xresources"
"vidbina-light.Xresources"
];
};
In order to simplify screen management, we can use the autorandr utility.
For the first time using a configuration, we use the arandr
utility to graphically align the screens in the formation that we want after which we can save and name the configuration using the following command (where CONFIGNAME
is the name that we want to save the configuration as):
autorandr --save CONFIGNAME
A configuration can be autoloaded by running the following command:
autorandr --change
β οΈ With the autorandr tool, we have to plug screens into the same ports as we used when configuring the setup. In the case of my newer laptop where I have a bunch of USB C ports with the risk of pluggin monitors in different configurations between docking attempts, I just connect the monitor in every likely configuration, configure my setup witharandr
and then save it withautorandr --save
to ensure that autorandr will have seen that configuration before. π
programs.autorandr = {
enable = true;
};
The slock package is a simple X screen locker by the suckless.org team.
Installing slock through systemPackages causes the unable to disable the OOM killer. Make sure to suid or sgid slock
, see https://nixos.wiki/wiki/Slock.
We therefore install slock in the nixos-configuration.
Autolockscreen-locker = {
enable = true;
lockCmd = "/run/wrappers/bin/slock";
};
Use darkman to manage dark/light theme switching for GTK and Qt.
darkman
Run darkman set light
or darkman set dark
or just run darkman toggle
.
- State βTODOβ from [2023-10-03 Tue 17:30]
Update config to work for Linux. common.nix is no used between darwin and linux and rofi is no relevant for darwin systems.
We import the previous rofi configuration and have removed the programs.rofi.theme
option because Pywal is currently managing this.
./rofi/default.nix
When producing the Rofi modals/prompts, we have some readability issues are some bits are not legible (dark text on dark bg).
services.blueman-applet.enable = true;
services.network-manager-applet.enable = true;
The next thing after redshift.
services.gammastep = {
enable = true;
<<home-linux-services-gammastep>>
temperature = {
# https://www.eizo.com/library/basics/color_temperature_on_an_LCD_monitor/
day = 6500;
night = 2500;
};
tray = true;
};
dawnTime = "5:00-6:00";
duskTime = "17:35-19:00";
latitude = 52.5;
longitude = 13.4;
services.gpg-agent = {
enable = true;
enableSshSupport = true;
};
services.trayer = {
enable = true;
settings = {
align = "right";
alpha = 0;
edge = "top";
height = 20;
monitor = "primary";
tint = "0x00000000";
transparent = true;
width = 250;
widthtype = "pixel";
};
};
The tedious way basically requires one to make symlinks from the needed locations into this dotfiles repository. There are a number of ways how one can simplify this experience ranging from manually symlinking everything that you would need all the way up to using a home-manager alternative like GNU Stow to manage these symlinks for you (and minimize the toil on your end).
This is a listing of the symlinks that I could track in my home directory right before moving over to home-manager. I may have missed some, but largely this covers much of what I have packaged in this repository so it should be relatively complete.
~/.Xmodmap -> ~/dotfiles/xmodmap ~/.coloritrc -> ~/dotfiles/colorit/coloritrc ~/.conkyrc -> ~/dotfiles/conky.conf ~/.emacs.d -> ~/dotfiles/emacs ~/.lein -> ~/dotfiles/lein ~/.octaverc -> ~/dotfiles/octave/.octaverc ~/.tmux.conf -> ~/dotfiles/tmux.conf ~/.xsession -> ~/dotfiles/xsession ~/.config/asciinema -> ~/dotfiles/asciinema ~/.config/ghorg -> ~/dotfiles/ghorg ~/.config/redshift.conf -> ~/dotfiles/redshift.conf ~/.config/rofi -> ~/dotfiles/rofi ~/.config/starship.toml -> ~/dotfiles/starship.toml ~/.config/termite -> ~/dotfiles/termite ~/.direnvrc -> ~/dotfiles/direnv/direnvrc
ln -s ${PATH_TO_DOTFILES}/direnv ${HOME}/.direnv
ln -s ${PATH_TO_DOTFILES}/xsession ${HOME}/.xsession
- sets the background (I just set a background color, but use
feh
to set a wallpaper) - loads .Xmodmap to load custom keyboard bindings
- start WM
β οΈ managed with nix home-manager?
ln -s ${PATH_TO_DOTFILES}/Xresources.d ${HOME}/.Xresources.d
ln -s ${PATH_TO_DOTFILES}/Xmodmap ${HOME}/.Xmodmap
- disables caps lock
- remaps tilde and grave to capslock+[shift]+z in an effort to minimise finger travel (the macbook has a narrower left shift and places the tilde/grave button between the left shift and the Z key)
ln -s ${PATH_TO_DOTFILE}/tmux.conf ${HOME}/.config/tmux.conf
- sets up vi key bindings in tmux
- remaps colors
β οΈ I havenβt relied on init.nvim for a while since I broke my configuration a little while ago in my attempts to pull vim-plug with Nix and then manage all my other plugins through the init.nvim file. As a lazypersonβs way out, I have simply given up and started managing my entire nvim configuration in nix.[2024-02-19 Mon]: Tangling init.vim from the same snippets that I use in nix. Only difference is that init.vim contains the packages that are being installed through Pathogen, while the nix config handles package management for vim itself.
ln -s ${PATH_TO_DOTFILE}/nvim ${HOME}/.config/nvim
- [X] set tabbing behavior (expand tabs to 2 spaces)
set tabstop=2 " tab stop to 2 spaces set shiftwidth=2 " shift width by 2 spaces set expandtab " expand tabs to spaces
- [X] enable mouse in all modes
set mouse=a set number ":map <ScrollWheelUp> <C-Y> ":map <ScrollWheelDown> <C-E>
- [X] define Plug extensions
call plug#begin("~/.local/share/nvim/plugged") Plug 'neovim/nvim-lspconfig' Plug 'airblade/vim-gitgutter' Plug 'aklt/plantuml-syntax' Plug 'dense-analysis/ale' Plug 'derekwyatt/vim-scala' Plug 'ElmCast/elm-vim' Plug 'godlygeek/tabular' Plug 'hashicorp/sentinel.vim' Plug 'hashivim/vim-terraform' "Plug 'https://github.com/hrother/offlineimaprc.vim.git' Plug 'https://github.com/junegunn/goyo.vim.git' Plug 'https://github.com/plasticboy/vim-markdown.git' Plug 'isRuslan/vim-es6' Plug 'jparise/vim-graphql' Plug 'leafgarland/typescript-vim', { 'for': 'typescript' } Plug 'LnL7/vim-nix' Plug 'majutsushi/tagbar' "https://github.com/neoclide/coc.nvim "Load VSCode extensions and host language servers "Plug 'neoclide/coc.nvim', { 'branch': 'release' } Plug 'preservim/nerdtree' Plug 'prettier/vim-prettier' Plug 'purescript-contrib/purescript-vim' Plug 'saltstack/salt-vim' "Plug 'sbdchd/neoformat' Plug 'sigmike/vim-taskjuggler' Plug 'tomlion/vim-solidity' Plug 'tpope/vim-fugitive' Plug 'vim-airline/vim-airline' Plug 'vim-scripts/openvpn' Plug 'wannesm/wmgraphviz.vim' Plug 'jeffkreeftmeijer/vim-dim', { 'branch': 'main' } call plug#end()
- [X] Set remaining vim settings
colorscheme dim " https://vi.stackexchange.com/a/45130 set notermguicolors set t_Co=16 let g:vim_markdown_frontmatter = 1 let g:vim_markdown_math = 1 let g:vim_markdown_fenced_languages = ['nix=nix', 'Dockerfile=dockerfile'] let g:vim_markdown_new_list_item_indent = 2 let g:vim_markdown_auto_insert_bullets = 0 set wrap set ignorecase set nofoldenable
We compose the different settings into init.vim and tangle the non-Pathogen-related stuff into our nix config (where we define vim packages through nix and therefore wonβt need Pathogen).
" Tangled from README.org
<<neovim-plugged>>
<<neovim-config>>
ln -s ${PATH_TO_DOTFILE}/termite ${HOME}/.config/termite
ln -s ${PATH_TO_DOTFILE}/starship.toml ${HOME}/.config/starship.toml
ln -s ${PATH_TO_DOTFILE}/rofi ${HOME}/.config/rofi
ln -s ${PATH_TO_DOTFILE}/redshift ${HOME}/.config/redshift
ln -s ${PATH_TO_DOTFILE}/ghorg ${HOME}/.config/ghorg
ln -s ${PATH_TO_DOTFILE}/asciinema ${HOME}/.config/asciinema
ln -s ${PATH_TO_DOTFILE}/compton/compton.conf ${HOME}/.config/compton.conf
ln -s ${PATH_TO_DOTFILE}/octave/.octaverc ${HOME}/.config/.octaverc
TODO: Rename hidden file to more visible file
Package manager and build tool for Clojure. The .lein dotfile lists convenience plugins for development.
ln -s ${PATH_TO_DOTFILE}/lein ${HOME}/.lein
https://linux.die.net/man/1/colorit
Colorit is a script for markup-ing text input which is used in my setup by dict.
ln -s ${PATH_TO_DOTFILE}/colorit/coloritrc ${HOME}/.coloritrc
https://github.com/brndnmtthws/conky
Conky is a system monitoring tool which allows the presentation of system metrics in a GUI.
ln -s ${PATH_TO_DOTFILE}/conky.conf ${HOME}/.conkyrc
ln -s ${PATH_TO_DOTFILE}/emacs ${HOME}/.emacs.d
For developer tooling, we define our userName
and userEmail
which we will rely on in configuring git, for example.
userName = "David Asabina";
userEmail = "[email protected]";
We all have parts of our configs that are for our eyes only and the personal.nix file can be populated to contain sensitive and private parts of your configuration. This home-configuration will load a personal.nix file if found so the use of this file is optional (your configuration should work without it).
Observe the snippet below for an example of a valid personal.nix file.
{ config, pkgs, lib, options, ... }:
{
# Home Manager needs a bit of information about you and the
# paths it should manage.
home.username = "vidbina";
home.homeDirectory = "/home/vidbina";
# This value determines the Home Manager release that your
# configuration is compatible with. This helps avoid breakage
# when a new Home Manager release introduces backwards
# incompatible changes.
# You can update Home Manager without changing this value. See
# the Home Manager release notes for a list of state version
# changes in each release.
home.stateVersion = "21.05";
home.packages = [ ];
}
Note that the same configuration above is adapted for macOS by setting home.homeDirectory
to a valid macOS home path like /Users/vidbina
.
On macOS, nix-darwin provides the most batteries included nix experience. We can manage services (through launchd), home-manager and homebrew all through a nix configuration.
# This is a nix-darwin config
{ pkgs, lib, inputs, config, username, ... }: {
imports = [
# import modules into our nix-darwin config
<<nix-darwin-imports>>
./emacs/nix-darwin.nix
./system/darwin
];
# List packages installed in system profile. To search by name, run:
# $ nix-env -qaP | grep wget
environment.systemPackages = with pkgs; [
<<nix-darwin-packages-common>>
] ++ (if system == "aarch64-darwin" then [
# ARM-only packages
<<nix-darwin-packages-arm>>
] else [
# Intel-only packages
<<nix-darwin-packages-intel>>
]);
environment.interactiveShellInit = lib.strings.concatStrings [
<<nix-darwin-interactive-shellinit>>
];
# General nix-darwin settings
<<nix-darwin>>
}
Read the Apple Daemons and Service Programming Guide for some basic information on how to work with launchd. Keep in mind that launchd isnβt systemd and sucks in the sense that starting/stopping services doesnβt seem to do the obvious things that their names imply and as one has grown familiar to with systemd.
Furthermore read https://www.launchd.info/ for more information on the launchd system. I have for a long time misunderstood it as an init system hut it is more of a job manager.
All packages that are architecture agnostic are installed in all of our macOS machines.
# common Darwin packages
asciinema
bat
checkmake
exercism
gh
gleam
gnumake
gnupg
gotop
hexyl
html-tidy
htop
httpie
httplab
jq
kakoune
nodePackages.typescript-language-server
nodejs
pass
pqrs
nixpkgs-fmt
redis
shell-gpt
shellcheck
shfmt
sqlite-interactive
tree
tree-sitter
vim
xxd
yq
inputs.devenv.packages.${system}.default
# Darwin packages for home-manager (i.e.: nix-darwin)
alacritty
Intel-only packages are listed separately such that we can use them on the macOS machine that still has a x86-based Intel chip but avoid trying to install them on ARM-based Apple machines.
# Darwin packages for Intel-only
gdb
ghidra-bin
It follows that the amount of Intel-only packages will decrease as developers make their applications more readily available (also for Apple Silicon).
- [X] Make the first snippets comment snippets (for explanation)
- [ ] move the code out to the tool-specific section.
''
eval "''$(${config.homebrew.brewPrefix}/brew shellenv)";
''
# Auto upgrade nix package and the daemon service.
services.nix-daemon.enable = true;
nix.package = pkgs.nix;
# Necessary for using flakes on this system.
nix.settings.experimental-features = "nix-command flakes";
# Adding trusted users for devenv to use Cachix
nix.settings.trusted-users = [
"root"
"vidbina"
];
# NOTE: Copied from home-linux.nix
programs.gnupg.agent = {
enable = true;
enableSSHSupport = true;
};
# Create /etc/zshrc that loads the nix-darwin environment.
# NOTE: Copied from common.nix
programs.zsh = {
enable = true; # default shell on catalina
enableSyntaxHighlighting = true;
# Used to be initExtraBeforeCompInit
# in nix-darwin, interactiveShellInit is called before compinit
# see https://github.com/LnL7/nix-darwin/blob/80bb201f4925cdda5a7a3c7b1900fb26bb2af2e8/modules/programs/zsh/default.nix#L168-L176
promptInit = ''
setopt histignorespace # keeps lines preceded with SPACE out of history
setopt INTERACTIVE_COMMENTS # allow inline comments like this one
# https://github.com/akermu/emacs-libvterm#directory-tracking-and-prompt-tracking
vterm_printf(){
if [ -n "$TMUX" ] && ([ "''${TERM%%-*}" = "tmux" ] || [ "''${TERM%%-*}" = "screen" ] ); then
# Tell tmux to pass the escape sequences through
printf "\ePtmux;\e\e]%s\007\e\\" "$1"
elif [ "''${TERM%%-*}" = "screen" ]; then
# GNU screen (screen, screen-256color, screen-256color-bce)
printf "\eP\e]%s\007\e\\" "$1"
else
printf "\e]%s\e\\" "$1"
fi
}
if [[ "$INSIDE_EMACS" = 'vterm' ]]; then
alias clear='vterm_printf "51;Evterm-clear-scrollback";tput clear'
fi
vterm_prompt_end() {
vterm_printf "51;A";
}
setopt PROMPT_SUBST
PROMPT="βͺ %(?.%F{green}β.%F{red}%?)%f" # error state
PROMPT="$PROMPT β %F{yellow}%~%f" # pwd
PROMPT="$PROMPT @ %F{magenta}%D{%Y.%m.%d} %B%F{blue}%T%f%b" # date/time
PROMPT="$PROMPT"$'\n'
PROMPT="$PROMPT%F{green}>%f " # prompt
PROMPT=$PROMPT'%{$(vterm_prompt_end)%}'
vterm_cmd() {
local vterm_elisp
vterm_elisp=""
while [ $# -gt 0 ]; do
vterm_elisp="$vterm_elisp""$(printf '"%s" ' "$(printf "%s" "$1" | sed -e 's|\\|\\\\|g' -e 's|"|\\"|g')")"
shift
done
vterm_printf "51;E$vterm_elisp"
}
# Workaround to open new tab at pwd
# See https://apple.stackexchange.com/a/340778
# http://superuser.com/a/315029/4952
# Set Apple Terminal.app to resume directory... still necessary 2018-10-26
if [[ $TERM_PROGRAM == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]] {
function chpwd {
local SEARCH=' '
local REPLACE='%20'
local PWD_URL="file://$HOSTNAME''${PWD//$SEARCH/$REPLACE}"
printf '\e]7;%s\a' "$PWD_URL"
}
chpwd
}
# Use vim bindings in zsh
bindkey -v
# https://unix.stackexchange.com/a/30169
bindkey '^R' history-incremental-search-backward
'';
};
# Set Git commit hash for darwin-version.
system.configurationRevision = inputs.self.rev or inputs.self.dirtyRev or null;
system.keyboard.enableKeyMapping = true;
system.keyboard.remapCapsLockToControl = true;
# Used for backwards compatibility, please read the changelog before changing.
# $ darwin-rebuild changelog
system.stateVersion = 4;
system = {
<<darwin-system>>
};
users.users.vidbina = {
home = "/Users/vidbina";
};
homebrew = {
enable = true;
global = {
autoUpdate = false;
};
onActivation = {
autoUpdate = false;
cleanup = "uninstall";
extraFlags = [
"--verbose"
];
};
brews = [
<<homebrew-brews>>
];
casks = [
<<homebrew-casks>>
];
masApps = {
<<homebrew-masapps>>
};
};
As outlined in this StackExchange answer, brew prefers pre-compiled binaries (so called bottles). CLI tools are typically installed through the standard homebrews **brews** facility.
"smudge/smudge/nightlight"
"pidof"
Graphical tools which are typically installed through the drag icon to Applications mess, can be installed in a more automated fashion through the use of the homebrew casks extension.
# Software Development
"iterm2"
"kitty"
# Design
"figma"
"drawio"
# Containerization & Virtualization
"docker"
"utm"
# Productivity
"anytype" # in beta, not very feature-complete imo
"google-drive"
"linear-linear"
"logseq" # FLOSS (compared to Obsidian) but no mobile app
"microsoft-teams"
"notion"
"obsidian" # best-in-class with mobile app support
"raycast"
"zoom"
# Android
"android-file-transfer"
# Devtools
# Go to top-right Settings gear > VSCode Import > Start Import
"cursor"
"warp"
# Entertainment
"steam"
"tidal"
# Social
"discord"
"signal"
"slack"
"telegram"
"whatsapp"
Install apps from the Apple App Store through the mas CLI tool for which the nix-darwin homebrew config provides the =masApps= attribute.
π‘ Remember to go through the list of all masApps in your file:configuration-darwin.nix and make sure to at least manually install them into your Apple account once to avoid the this βRedownload Unavailable with this Apple IDβ issue.
Resolve: Redownload Unavailable with This Apple ID: This redownload is not available for this Apple ID either because it was bought by a different user or the item was refunded or cancelled.
Apps need to already be in a userβs Purchased list before mas can install them. For any new tools, just make sure that you install it on one machine at least manually in order to add it to your Purchased list as documented in GH mas-cli issue 85. In my case, I didnβt even complete the installation, I just started it to add it to the list and then prematurely stopped it in order to continue the installation through nix-darwin.
Keep in mind to authorize your device as documented in https://support.apple.com/en-us/HT201251 and which can be done through the following steps:
- Open Apple Music
- Navigate to Account > Authorisations > Authorise this computer
- provide credentials to Apple account.
You can review your current computerβs authorisation status by opening the App Store app and opening the Account Settings modal.
Computer authorisation status did not have any bearing on this issue but it seems a good practice to ocassionally verify that all the authorised devices in an account are still in your possession.
nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
<<darwin-unfree>>
];
nixpkgs.overlays = [
(self: super: {
# nix-darwin overlays
<<darwin-overlays>>
})
];
I use Hammerspoon for some OSX-specific automations which can be scripted through Lua. Like mapping keybindings to open specific locations in Finder, opening specific apps within a workstation or rendering notification or alerts with some useful information and more.
We link the hammerspoon directory into our homedir in order to set up the necessary Spoons and the init.lua:
home.file.".hammerspoon".source = config.lib.file.mkOutOfStoreSymlink ./hammerspoon;
We load the Spoons and define our own bindings and more in the init.lua file that we symlinked into our homedir previously:
-- Tangled from README.org
hsBaseBinding = {"alt", "cmd", "ctrl"}
strBaseBinding = "ββ₯β"
cheatsheet = "π‘"
-- A dummy binding for Hammerspoon
hs.hotkey.bind(
hsBaseBinding,
"H",
function()
hs.alert.show(cheatsheet)
hs.notify.new({title="Hammerspoon", informativeText=cheatsheet}):send()
end
)
cheatsheet = cheatsheet .. "\n" .. strBaseBinding .. " H = help"
-- https://www.hammerspoon.org/go/#simple-configuration-reloading
hs.hotkey.bind(
hsBaseBinding,
"R",
function()
hs.alert.show("Reloading Hammerspoon config")
hs.reload()
end
)
cheatsheet = cheatsheet .."\n" .. strBaseBinding .. " R = reload"
-- https://www.hammerspoon.org/go/#drawing-on-the-screen
mouseCircle = nil
mouseCircleTimer = nil
function mouseHighlight()
-- Delete an existing highlight if it exists
if mouseCircle then
mouseCircle:delete()
if mouseCircleTimer then
mouseCircleTimer:stop()
end
end
-- Get the current co-ordinates of the mouse pointer
mousepoint = hs.mouse.absolutePosition()
-- Prepare a big red circle around the mouse pointer
mouseCircle = hs.drawing.circle(hs.geometry.rect(mousepoint.x-40, mousepoint.y-40, 80, 80))
mouseCircle:setStrokeColor({["red"]=1,["blue"]=0,["green"]=0,["alpha"]=1})
mouseCircle:setFill(false)
mouseCircle:setStrokeWidth(5)
mouseCircle:show()
-- Set a timer to delete the circle after 3 seconds
mouseCircleTimer = hs.timer.doAfter(
1,
function()
mouseCircle:delete()
mouseCircle = nil
end
)
end
hs.hotkey.bind(hsBaseBinding, "D", mouseHighlight)
cheatsheet = cheatsheet .. "\n" .. strBaseBinding .. " D = mouse highlight"
hs.loadSpoon("Caffeine")
isCaffeinated = false
hs.hotkey.bind(
hsBaseBinding,
"Z",
function()
if not isCaffeinated then
hs.alert.show("Buzzed! Flattie mode! β")
spoon.Caffeine:start()
else
hs.alert.show("Letting that buzz wear off. π₯±")
spoon.Caffeine:stop()
end
isCaffeinated = not isCaffeinated
end
)
cheatsheet = cheatsheet .. "\n" .. strBaseBinding .. " Z = β"
hs.loadSpoon("KSheet")
spoon.KSheet:bindHotkeys(
{
toggle = {hsBaseBinding, "K"}
}
)
cheatsheet = cheatsheet .. "\n" .. strBaseBinding .. " K = KSheet"
hs.loadSpoon("HSKeybindings")
isShowingHSKeybindings = false
hs.hotkey.bind(
hsBaseBinding,
"/",
function()
if not isShowingHSKeybindings then
hs.alert.show("Showing HSKeybindings")
spoon.HSKeybindings:show()
else
hs.alert.show("Hiding HSKeybindings")
spoon.HSKeybindings:hide()
end
isShowingHSKeybindings = not isShowingHSKeybindings
end
)
cheatsheet = cheatsheet .. "\n" .. strBaseBinding .. " K = HSKeybindings"
hs.hotkey.bind(
hsBaseBinding,
".",
function()
hs.alert.show("Inspecting Hammerspoon")
hs.alert.show("displayIdle: " .. (hs.caffeinate.get("displayIdle") and "On" or "Off"))
hs.alert.show("systemIdle: " .. (hs.caffeinate.get("systemIdle") and "On" or "Off"))
hs.alert.show("system: " .. (hs.caffeinate.get("system") and "On" or "Off"))
end
)
hs.hotkey.bind(
hsBaseBinding,
"return",
function()
if hs.application.find("iTerm") then
hs.osascript.applescript([[
<<applescript-open-iterm>>
]])
else
hs.application.open("iTerm")
end
end
)
cheatsheet = cheatsheet .. "\n" .. strBaseBinding .. " β = iTerm2 π¨πΏβπ»"
For our iTerm2 function, we define the AppleScript separately:
tell application "iTerm"
create window with default profile
end tell
See zzamboniβs config for inspiration.
We will be tangling this literate configuration into the needed dev.nix file.
./dev.nix
For starters, we stub the general structure of the nix file and define the <<nix-devtools>>
reference for us to direct our tool-specific configs into.
# Tangled from README.org
# Please modify by editing README.org and re-tangling to generate this nix file.
{ config, lib, pkgs, options, ... }:
{
<<nix-devtools>>
home.packages = [
<<dev-packages>>
] ++ (if pkgs.stdenv.isLinux then [
<<dev-packages-linux>>
] else [ ]);
}
As an example, you can observe how we direct some comments into the previously defined reference. In the following sections, we will use this mechanism to tangle (basically βwriteβ) into parts of the dev.nix file.
# Tangling individual dev tools through nix-devtools noweb reference
We tangle the git-related configuration into dev.nix but if you want to manually set things up, check out the manual git instructions.
<<manual-git>> Configure your gitconfig by symlinking the gitconfig file in this repository into the home directory.ln -s ./git/gitconfig ~/gitconfig
The global excludes file defaults to ./config/git/ignore
so weβre linking our ignore go-to into this path for convenience.
ln -s ./git/ignore ~/.config/git/ignore
programs.git = {
enable = true;
<<nix-devtools-git>>
};
".config/git/ignore".source = ./git/ignore;
".wezterm.lua".source = ./wezterm/wezterm.lua;
For convenience we define git/ignore which we want to automatically want to honor in every repo. Based on the instructions in man gitignore
we stub the XDG_HOME_CONFIG/.config/git/ignore
and the ~/.gitignore
files to reflect the content of git/ignore.
# Set global gitignore
home.file = {
".config/git/ignore".source = config.lib.file.mkOutOfStoreSymlink ./git/ignore;
};
We want LFS enabled.
lfs.enable = true;
aliases = {
wdiff = "diff --word-diff --word-diff-regex='\\w+'";
glog = "log --oneline --graph --all --decorate";
};
Letβs opt for naming our default branch βmainβ, using nvim as our editor, using gpg2 are our GPG tool and setting git up to send patches by mail.
extraConfig = {
init = {
defaultBranch = "main";
};
core = {
editor = "nvim";
};
gpg = {
program = "gpg2";
};
sendemail = {
annotate = true;
smtpServer = "msmtp";
smtpServerOption = "-a vidbina";
};
<<nix-devtools-git-conf>>
};
For readabilityβs sake, we set the colors that we display git diffs, greps and status payloads in.
color = {
ui = true;
diff = {
meta = "yellow bold";
frag = "magenta bold";
old = "red";
new = "green";
};
grep = {
match = "yellow";
filename = "blue";
linenumber = "brightblack";
};
status = {
added = "yellow";
changed = "green";
untracked = "brightblack";
};
};
Since we are using pywal to sync terminal themes with Emacs, we set some baseline colors in git to harmonise these.
pkgs.gh
Sometimes we need GNU CLI utils, such as for dired in Emacs which expects the GNU ls variant which offers the --dired
option. Install coreutils coreutils for this capability and note that for all utils that already have MacOS-native equivalents the GNU-equivalent will be prefixed with g
such that the GNU ls
tool is now accessed through gls
:
"coreutils"
Use Devbox for isolated dev envs without having to write Nix. π
We install it by listing it in the nix-darwin config file:
devbox
Find out if the devenv install is moveable. The env.nix file does not have the inputs
variable as an input so weβll either have to pass it along or find a different way to bring these packages into scope within dev.nix.
See Packages for the current installation of devenv.
WezTerm is a terminal emulator and multiplexer written in Rust, with hyperlink support, emoji support and since itβs written in Rustβ¦ probably as blazingly fast as it gets.
"wezterm"
Ollama is a convenient CLI tool to spin up LLMs locally for inference anad and to spawn local APIs that can be used with locally running tools. This should come in handy for offline LLM access and the general development of LLM-powered builds⦠even when the internet is down or when flying.
On MacOS, we install Ollama using the brew:
"ollama"
With LM Studio, one can easily inference against LLMs, spin up an API to allow other tools to access locally-served LLMs and compute embeddings locally⦠all through a convenient GUI.
On MacOS, we install LM Studio using the cask:
"lm-studio"
Install Wireguard tools https://github.com/WireGuard/wireguard-tools on your MacOS.
"wireguard-tools"
pkgs.xxd
pkgs.hexyl
pkgs.ghidra-bin
pkgs.kakoune
pkgs.shellcheck
pkgs.shfmt
pkgs.asciinema
pkgs.exercism
pkgs.html-tidy
pkgs.httpie
pkgs.httplab
- State βTODOβ from [2023-10-03 Tue 18:17]
Verify that glibc is not available for Darwin and merge the separated configs or provide explanation.
pkgs.gdb
pkgs.checkmake
#pkgs.cmakeCurses
pkgs.gnumake
For now, isolate the Linux-specific dev packages from the more general dev packages but we should be able to install glibc on macOS.
pkgs.glibc
pkgs.gleam
pkgs.nodePackages.typescript-language-server
pkgs.tree-sitter
pkgs.jq
pkgs.yq
pkgs.sqlite-interactive
pkgs.redis
I have issues with my touchpad often enough and also have issues with Chromium hanging here and there. Itβs time that I learned to dig into some of the Linux innards and do some good kernel watching.
See https://lwn.net/Articles/658948/
- List xinputs
xinput --list
- Show properties for device
xinput show-props ID
https://www.freedesktop.org/wiki/Evemu/ https://wiki.ubuntu.com/Multitouch/Testing/Evemu
pkgs.evemu
- evemu-describe
- evemu-device
- evemu-event
- evemu-play
- evemu-record
evemu-record /dev/input/event13 touchpad-debug.evemu
Recorded some data while I was observing the choppy behavior
evemu-record /dev/input/event13 touchpad-debug.evemu
Then replayed the recording to confirm choppiness in the recorded output
evemu-play touchpad-debug.evemu
According to ChatGPT:
If the recording from evemu-record is already choppy, the problem is likely at a lower level than libinput. Libinput processes the events given by the kernel, so if the kernel events are choppy, libinput will also see choppy data.
Here are some steps you can take to debug the issue:
- Check the Kernel Version: As mentioned before, the issue may lie within the kernel. If youβre using an old version of the kernel, consider updating it.
- Check for Hardware Issues: If possible, test the trackpad in a different operating system (like Windows or a different Linux distribution) to rule out hardware issues.
- Check for Dropped Events: The evemu-record tool records events as they come from the kernel. If events are being dropped, that might cause choppy input. Use the evtest tool to check if any events are being dropped.
- Check for Firmware Issues: It might be possible that your laptopβs firmware is causing issues. Check the manufacturerβs website for any firmware updates.
- Check dmesg for Errors: Run dmesg | grep -i error to check for any hardware errors related to the touchpad.
- Contact the libinput Community: If youβre unable to resolve the issue yourself, consider reaching out to the libinput community for help. They might be able to provide more specific guidance.
- Remember, always be careful when upgrading the kernel or firmware, or changing system settings. Always backup your data before making significant changes to your system.
Reading https://www.dell.com/support/kbdoc/de-de/000150104/precision-xps-allgemeine-problemloesung-f-uuml-er-touchpad-maus-in-ubuntu and concluding that dmesg needs to be monitored for kernel events
dmesg -H --follow
[May24 10:26] systemd-gpt-auto-generator[83303]: EFI loader partition unknown, exiting.
[ +0.000006] systemd-gpt-auto-generator[83303]: (The boot loader did not set EFI variable LoaderDevicePartUUID.)
[May24 11:04] input: DLL0945:00 04F3:311C Touchpad as /devices/virtual/input/input70
[May24 11:07] input: DLL0945:00 04F3:311C Touchpad as /devices/virtual/input/input71
Is the touchpad being reconnected over different ports?
> xinput --list
β‘ Virtual core pointer id=2 [master pointer (3)]
β β³ Virtual core XTEST pointer id=4 [slave pointer (2)]
β β³ ELAN2D24:00 04F3:2D24 id=11 [slave pointer (2)]
β β³ DLL0945:00 04F3:311C Mouse id=12 [slave pointer (2)]
β β³ PS/2 Generic Mouse id=18 [slave pointer (2)]
β β³ DLL0945:00 04F3:311C Touchpad id=13 [slave pointer (2)]
β£ Virtual core keyboard id=3 [master keyboard (2)]
β³ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
β³ Video Bus id=6 [slave keyboard (3)]
β³ Video Bus id=7 [slave keyboard (3)]
β³ Power Button id=8 [slave keyboard (3)]
β³ Integrated_Webcam_HD: Integrate id=9 [slave keyboard (3)]
β³ Integrated_Webcam_HD: Integrate id=10 [slave keyboard (3)]
β³ Intel HID events id=14 [slave keyboard (3)]
β³ Intel HID 5 button array id=15 [slave keyboard (3)]
β³ Dell WMI hotkeys id=16 [slave keyboard (3)]
β³ AT Translated Set 2 keyboard id=17 [slave keyboard (3)]
Searching for DLL0945:00 04F3:311C on Google yields https://www.dell.com/community/XPS/XPS-15-9510-Touchpad-Intermittent-touchpad-lag/td-p/8012567/page/4 where the following comment is posted:
I can also reproduce that this is related to the palm rejection on the side of the touchpad. Usually the cursor does not move when I move the finger on the very right side of the touchpad. Every time the cursor is laggy, the palm rejection does not work and I can move the cursor by touching the pad on the very right side.
I also tried out the mtouch drivers instead of libinput but the problem persists. so I suppose that the problem is related to the firmware of the touchpad.
https://github.com/bentiss/mtdiag-qt
https://github.com/whot/mtview
The pcalc util can come in handy when one needs to conduct conversions between bases (Like octal to binary, hex to binary, etc) and calculate operations (ADD, MOD, XOR, etc.) between different operands. I initially set out to install the PCalc calculation util https://pcalc.com/ to calculate logs and work with other advanced math functions, but somehow I hit a name collision here and ended up realising that the other pcalc may be useful to me tooβ¦ someday, so, weβre keeping it.
For MacOS, we just install pcalc using the brew:
"pcalc"
Visual Studio Code is unfree software and needs to be added to the list of unfree packages that we want to tolerate:
"vscode"
Our vscode configuration declaratively manages soem extensions, keybindings and user settings:
programs.vscode = {
enable = true;
extensions = with pkgs.my-vscode-extensions.vscode-marketplace; [
<<vscode-extensions>>
];
keybindings = [
<<vscode-keybindings>>
];
userSettings = {
<<vscode-settings>>
};
};
We get our vscode extensions from the nix-community nix-vscode-extensions package which we alias to the reference my-vscode-extensions
for internal use:
my-vscode-extensions = inputs.vscode-extensions.extensions.${pkgs.system};
The extensions that we are interested in are the following:
bbenoist.nix
be5invis.toml
elmtooling.elm-ls-vscode # depends on hbenl.vscode-test-explorer
github.copilot
github.copilot-chat
hbenl.vscode-test-explorer
hediet.vscode-drawio
mkhl.direnv
ms-azuretools.vscode-docker
ms-playwright.playwright
ms-python.python
ms-vscode-remote.remote-containers
tomoki1207.pdf
vscode-org-mode.org-mode
vscodevim.vim
Outline comment tags like TODO
and FIXME
in a todo tree for quick access.
gruntfuggly.todo-tree
The keybindings that we want are as follows:
{
"key" = "ctrl+tab";
"command" = "workbench.action.nextEditorInGroup";
}
{
"key" = "ctrl+shift+tab";
"command" = "workbench.action.previousEditorInGroup";
}
In order to enable long-presses to register multiple entries we need the ApplePressAndHoldEnabled
OSX setting, otherwise, we have to manually depress a key multiple times in order to have multiple entries.
defaults.CustomUserPreferences = {
"com.microsoft.VSCode" = {
"ApplePressAndHoldEnabled" = false;
};
};
Define parts of the VsCode-specific fields are defined in the JSON format as follows:
"editor.cursorSurroundingLines" = 8;
# https://code.visualstudio.com/docs/editor/extension-marketplace#_can-i-stop-vs-code-from-providing-extension-recommendations
"extensions.ignoreRecommendations" = true;
"extensions.showRecommendationsOnlyOnDemand" = true;
# https://code.visualstudio.com/docs/editor/extension-marketplace#_can-i-stop-vs-code-from-providing-extension-recommendations
"telemetry.telemetryLevel" = "off";
"vim.highlightedyank.enable" = true;
"window.autoDetectColorScheme" = true;
# https://www.roboleary.net/2021/11/06/vscode-you-dont-need-that-extension2.html#3-indentation-guides-colorization
"editor.guides.bracketPairs" = true;
"editor.guides.highlightActiveIndentation" = true;
"workbench.colorTheme" = "Default High Contrast Light";
"workbench.preferredDarkColorTheme" = "Default High Contrast";
"workbench.preferredLightColorTheme" = "Default High Contrast Light";
For Neovim, remember that CoC completions basically work through use of the C-n
and C-p
binding to cycle through next and previous items in the completion listing.
./vim.nix
https://developpaper.com/complete-guide-to-getting-started-with-coc-nvim/
# Tangled from README.org
{ config, pkgs, ... }:
{
home.sessionVariables.EDITOR = "nvim";
programs.neovim = {
enable = true;
plugins = with pkgs.vimPlugins; [
<<nvim-packages>>
];
vimdiffAlias = true;
withRuby = true;
extraConfig = ''
<<neovim-config>>
'';
extraLuaConfig = ''
<<neovim-lua-config>>
'';
};
}
# deoplete-notmuch
goyo-vim
neoformat
nerdtree
tabular
tagbar
vim-airline
vim-dim
vim-fugitive
vim-gitgutter
Install the nvim-lspconfig package for the LSP client configurations for various languages:
nvim-lspconfig
Configure lspconfig for the languages we have an interest in:
require'lspconfig'.gleam.setup{}
We map backslack + i (for info) to float the diagnostics window:
-- Float diagnostics window through custom mapping
vim.keymap.set('n', '<Leader>i', function() vim.diagnostic.open_float(nil, {focus=false, scope='cursor'}) end)
See :h mapleader
for info on the leader key which is set to backslack (\
) by default. When different, try to run :echo mapleader
from inside of vim to find out.
nvim-treesitter.withAllGrammars
See https://github.com/nvim-treesitter/nvim-treesitter?tab=readme-ov-file#highlight
require'nvim-treesitter.configs'.setup{
highlight = {
enable = true,
-- Setting this to true will run `:h syntax` and tree-sitter at the same time.
-- Set this to `true` if you depend on 'syntax' being enabled (like for indentation).
-- Using this option may slow down your editor, and you may see some duplicate highlights.
-- Instead of true it can also be a list of languages
additional_vim_regex_highlighting = false,
},
}
# home.file.".emacs.d".source = config.lib.file.mkOutOfStoreSymlink ./emacs;
# TODO: Fix hack of hardcoded dotfiles path
# NOTE: This repo must be checked out to ~/Code/vidbina/dotfiles
# A hardcoded .emacs.d source is used because mkOutOfStoreSymlink ./emacs
# does not seem to work on macOS.
# See https://discourse.nixos.org/t/accessing-home-manager-config-in-flakes/19864/8
# See https://github.com/nix-community/home-manager/issues/2085#issuecomment-861427318
home.file.".emacs.d".source = config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/Code/vidbina/dotfiles/emacs";
At the moment we import our nix configs for Emacs into our configuration-darwin.nix file and for Linux we havenβt really considered how to do this since we donβt actively use Linux atm. Weβll have to fix this at some point.
For now, I symlink ~/.xmonad to ~/src/vidbina/xmonad-config and run xmonad --recompile
to produce the Xmonad binary.
Hidden Bar
On MacOS, we use hidden Bar to work around the issue that MacOS doesnβt natively provide mechanisms for seeing the menubar items that are hidden when the icon count gets too large or when the focused application menu entries are too many (like with Emacs which has menu entries crossing the camera notch).
"Hidden Bar" = 1452453066;
Navigate to Syncthing portal to configure your setup. As per [2022-05-05 Thu 12:08], the syncthing service in home-manager is only declarative to the extend of turning it on and providing extra CLI options to start the service with.
Consult the Getting Started guide to learn how to set it up βimperativelyβ (i.e.: setting up peers and generating their IDs and copying the needed information over to the other syncthing peers to establish connections) through the portal.
services.syncthing = {
enable = true;
};
[2024-02-07 Wed] On macOS, the syncthing service isnβt running which was confirmed by running:
launchctl list org.nix-community.home.syncthing
where the output is
{
"LimitLoadToSessionType" = "Aqua";
"Label" = "org.nix-community.home.syncthing";
"OnDemand" = true;
"LastExitStatus" = 19968;
"Program" = "/nix/store/rnigg5xf6n2jxda3ivscrn0yzw474dq4-syncthing-1.26.1/bin/syncthing";
"ProgramArguments" = (
"/nix/store/rnigg5xf6n2jxda3ivscrn0yzw474dq4-syncthing-1.26.1/bin/syncthing";
"-no-browser";
"-no-restart";
"-logflags=0";
);
};
which seems at odds with the nix definition for syncthing
launchd.agents.syncthing = {
enable = true;
config = {
ProgramArguments = syncthingArgs;
KeepAlive = {
Crashed = true;
SuccessfulExit = false;
};
ProcessType = "Background";
};
};
as KeepAlive
is defined in the nix config, but missing in the observed launch output, furthermore OnDemand
isnβt mentioned at all in the nix config. π€·πΏ
It seems that the OnDemand option is a pre macOS 10.5 key which has been superceded by KeepAlive.
Just to confirm, Syncthing really isnβt running, I have checked the process list for a corresponding entry:
ps aux | grep syncthing
Trying to start syncthing through
launchctl start org.nix-community.home.syncthing
yields status 134 (SIGABRT) and 139 (SIGSEGV). Retrying with sudo
fails with status 3.
Attempts to kickstart with
launchctl kickstart gui/501/org.nix-community.home.syncthing
also fail with 139: Service cannot presently execute
but of course I donβt have any freaking logs.
π I just ran the
launchctl list
andps
commands on my personal MacBook and found that syncthing is running as a daemon there. Perhaps I need a system restart. I recall that starting/stopping logic with launchd is quite different in terms of UX to systemd and likely the start/stop commands just donβt do the same thing.
As a fallback, just start syncthing
through a terminal with the temporary added benefit of having a log/trace of Syncthingβs actions. This needs further exploration.
A deeper dive, leads me through https://www.launchd.info/ which outlines where the different files for job definitions are stored. For me ~/Library/LaunchAgents/org.nix-community.home.syncthing.plist seems to match the definition in the home-manager codebase, unlike the output I was seeing from launchctl list
earlier.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<dict>
<key>Crashed</key>
<true/>
<key>SuccessfulExit</key>
<false/>
</dict>
<key>Label</key>
<string>org.nix-community.home.syncthing</string>
<key>ProcessType</key>
<string>Background</string>
<key>ProgramArguments</key>
<array>
<string>/nix/store/rnigg5xf6n2jxda3ivscrn0yzw474dq4-syncthing-1.26.1/bin/syncthing</string>
<string>-no-browser</string>
<string>-no-restart</string>
<string>-logflags=0</string>
</array>
</dict>
</plist>
Perhaps the new job definition has simply not been loaded, which would be a failing of the darwin-rebuild switch
run we did earlier. So, for next time, I should remember to try the following:
sudo launchctl load ~/Library/LaunchAgents/org.nix-community.home.syncthing.plist
sudo launchctl enable gui/501/org.nix-community.home.syncthing
but for now, I just try a restart and see what happens. π€πΏ
Especially for things link mail indices and Org-roam databases, I may need to do this.
# Tangled from README.org
{ config, pkgs, lib, options, ... }:
{
home.packages = with pkgs; [
<<multimedia-packages>>
];
}
On MacOS, we just install OBS with homebrew:
"obs" # for streaming
https://guvcview.sourceforge.net/
guvcview
https://linuxtv.org/projects.php
v4l-utils
# Tangled from README.org
{ config, pkgs, lib, options, ... }:
let
# TODO: Find a cleaner implementation, like an pkgs overlay at shell.nix?!?
nur = import <NUR> { inherit pkgs; };
sources = import ./nix/sources.nix;
nixpkgs-bleeding-src = sources."nixpkgs-bleeding";
pkgs-bleeding = import nixpkgs-bleeding-src { };
in
{
home.packages = with pkgs; [
<<browser-packages>>
];
<<browser-chromium>>
<<browser-firefox>>
}
Output of starting chromium on [2023-03-04 Sat 16:51]
libva error: /run/opengl-driver/lib/dri/iHD_drv_video.so has no function __vaDriverInit_1_0
libva error: /run/opengl-driver/lib/dri/i965_drv_video.so has no function __vaDriverInit_1_0
[5045:5178:0304/164722.289526:ERROR:object_proxy.cc(623)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/UPower: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UPower was not provided by any .service files
[5045:5178:0304/164722.289875:ERROR:object_proxy.cc(623)] Failed to call method: org.freedesktop.UPower.GetDisplayDevice: object_path= /org/freedesktop/UPower: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UPower was not provided by any .service files
[5045:5178:0304/164722.290266:ERROR:object_proxy.cc(623)] Failed to call method: org.freedesktop.UPower.EnumerateDevices: object_path= /org/freedesktop/UPower: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UPower was not provided by any .service files
pFontconfig error: Cannot load default config file: No such file: (null)
Note that the content of the object file has a different init func:
nm -gD /run/opengl-driver/lib/dri/iHD_drv_video.so | grep __vaDriverInit
Searching through the other files object files in file:/run/opengl-driver/lib/dri, I noticed that a few do list a v1.0 init function.
nm -gD /run/opengl-driver/lib/dri/nvidia_drv_video.so | grep __vaDriverInit
So, we need to clean up some of the drivers if Chromium is trying to resolve which init function to calld dynamically.
Also vainfo
communicates the version to be beyond 1.0, 1.17 to be precise.
Output of chrome://gpu on [2023-02-11 Sat 23:55]
Graphics Feature Status
Canvas: Hardware accelerated
Canvas out-of-process rasterization: Disabled
Direct Rendering Display Compositor: Disabled
Compositing: Hardware accelerated
Multiple Raster Threads: Enabled
OpenGL: Enabled
Rasterization: Hardware accelerated
Raw Draw: Disabled
Video Decode: Hardware accelerated
Video Encode: Software only. Hardware acceleration disabled
Vulkan: Disabled
WebGL: Hardware accelerated
WebGL2: Hardware accelerated
WebGPU: Disabled
Driver Bug Workarounds
clear_uniforms_before_first_program_use
count_all_in_varyings_packing
disable_post_sub_buffers_for_onscreen_surfaces
enable_webgl_timer_query_extensions
exit_on_context_lost
rely_on_implicit_sync_for_swap_buffers
disabled_extension_GL_KHR_blend_equation_advanced
disabled_extension_GL_KHR_blend_equation_advanced_coherent
disabled_extension_GL_MESA_framebuffer_flip_y
Problems Detected
WebGPU has been disabled via blocklist or the command line.
Disabled Features: webgpu
Accelerated video encode has been disabled, either via blocklist, about:flags or the command line.
Disabled Features: video_encode
Clear uniforms before first program use on all platforms: 124764, 349137
Applied Workarounds: clear_uniforms_before_first_program_use
Mesa drivers in Linux handle varyings without static use incorrectly: 333885
Applied Workarounds: count_all_in_varyings_packing
Disable partial swaps on Mesa drivers (detected with GL_RENDERER): 339493
Applied Workarounds: disable_post_sub_buffers_for_onscreen_surfaces
Disable partial swaps on Mesa drivers (detected with GL_VERSION): 339493
Applied Workarounds: disable_post_sub_buffers_for_onscreen_surfaces
Disable KHR_blend_equation_advanced until cc shaders are updated: 661715
Applied Workarounds: disable(GL_KHR_blend_equation_advanced), disable(GL_KHR_blend_equation_advanced_coherent)
Expose WebGL's disjoint_timer_query extensions on platforms with site isolation: 808744, 870491
Applied Workarounds: enable_webgl_timer_query_extensions
Some drivers can't recover after OUT_OF_MEM and context lost: 893177
Applied Workarounds: exit_on_context_lost
Avoid waiting on a egl fence before swapping buffers and rely on implicit sync on Intel GPUs: 938286
Applied Workarounds: rely_on_implicit_sync_for_swap_buffers
Disable GL_MESA_framebuffer_flip_y for desktop GL: 964010
Applied Workarounds: disable(GL_MESA_framebuffer_flip_y)
ANGLE Features
allowCompressedFormats (Frontend workarounds): Enabled: true
Allow compressed formats
cacheCompiledShader (Frontend features) anglebug:7036: Disabled
Enable to cache compiled shaders
disableAnisotropicFiltering (Frontend workarounds): Disabled
Disable support for anisotropic filtering
disableDrawBuffersIndexed (Frontend features) anglebug:7724: Disabled
Disable support for OES_draw_buffers_indexed and EXT_draw_buffers_indexed
disableProgramBinary (Frontend features) anglebug:5007: Disabled: IsPowerVrRogue(functions)
Disable support for GL_OES_get_program_binary
disableProgramCachingForTransformFeedback (Frontend workarounds): Disabled: IsAndroid() && isQualcomm
On some GPUs, program binaries don't contain transform feedback varyings
emulatePixelLocalStorage (Frontend features) anglebug:7279: Disabled: false
Emulate ANGLE_shader_pixel_local_storage using shader images
enableCaptureLimits (Frontend features) anglebug:5750: Disabled
Set the context limits like frame capturing was enabled
enableCompressingPipelineCacheInThreadPool (Frontend workarounds) anglebug:4722: Disabled: false
Enable compressing pipeline cache in thread pool.
enableProgramBinaryForCapture (Frontend features) anglebug:5658: Disabled
Even if FrameCapture is enabled, enable GL_OES_get_program_binary
forceDepthAttachmentInitOnClear (Frontend workarounds) anglebug:7246: Disabled
Force depth attachment initialization on clear ops
forceGlErrorChecking (Frontend features) https://issuetracker.google.com/220069903: Disabled
Force GL error checking (i.e. prevent applications from disabling error checking
forceInitShaderVariables (Frontend features): Disabled
Force-enable shader variable initialization
forceRobustResourceInit (Frontend features) anglebug:6041: Disabled
Force-enable robust resource init
loseContextOnOutOfMemory (Frontend workarounds): Enabled: true
Some users rely on a lost context notification if a GL_OUT_OF_MEMORY error occurs
scalarizeVecAndMatConstructorArgs (Frontend workarounds) 1165751: Disabled: false
Always rewrite vec/mat constructors to be consistent
RGBA4IsNotSupportedForColorRendering (OpenGL workarounds): Enabled: functions->standard == STANDARD_GL_DESKTOP && isIntel
GL_RGBA4 is not color renderable
RGBDXT1TexturesSampleZeroAlpha (OpenGL workarounds) anglebug:3729: Disabled: IsApple()
Sampling BLACK texels from RGB DXT1 textures returns transparent black on Mac.
addAndTrueToLoopCondition (OpenGL workarounds): Disabled: IsApple() && isIntel
Calculation of loop conditions in for and while loop has bug
adjustSrcDstRegionForBlitFramebuffer (OpenGL workarounds) 830046: Enabled: IsLinux() || (IsAndroid() && isNvidia) || (IsWindows() && isNvidia) || (IsApple() && functions->standard == STANDARD_GL_ES)
Many platforms have issues with blitFramebuffer when the parameters are large.
allowAstcFormats (OpenGL workarounds): Disabled: !isMesa || isIntel && (Is9thGenIntel(device) || IsGeminiLake(device) || IsCoffeeLake(device) || Is11thGenIntel(device) || Is12thGenIntel(device))
Enable ASTC on desktop OpenGL
allowClearForRobustResourceInit (OpenGL workarounds) 848952: Disabled: IsApple()
Using glClear for robust resource initialization is buggy on some drivers and leads to texture corruption. Default to data uploads except on MacOS where it is very slow.
allowETCFormats (OpenGL workarounds): Enabled: isIntel && !IsSandyBridge(device) && !IsIvyBridge(device) && !IsHaswell(device)
Enable ETC2/EAC on desktop OpenGL
alwaysCallUseProgramAfterLink (OpenGL workarounds) 110263: Enabled: true
Always call useProgram after a successful link to avoid a driver bug
alwaysUnbindFramebufferTexture2D (OpenGL workarounds) anglebug:5536: Disabled: isNvidia && (IsWindows() || IsLinux())
Force unbind framebufferTexture2D before binding renderbuffer to work around driver bug.
avoid1BitAlphaTextureFormats (OpenGL workarounds): Disabled: functions->standard == STANDARD_GL_DESKTOP && isAMD
Issue with 1-bit alpha framebuffer formats
bindTransformFeedbackBufferBeforeBindBufferRange (OpenGL workarounds) anglebug:5140: Disabled: IsApple()
Bind transform feedback buffers to the generic binding point before calling glBindBufferBase or glBindBufferRange.
clampArrayAccess (OpenGL workarounds) anglebug:2978: Disabled: IsAndroid() || isAMD || !functions->hasExtension("GL_KHR_robust_buffer_access_behavior")
Clamp uniform array access to avoid reading invalid memory.
clampFragDepth (OpenGL workarounds): Disabled: isNvidia
gl_FragDepth is not clamped correctly when rendering to a floating point depth buffer
clampMscRate (OpenGL workarounds) 1042393: Disabled: IsLinux() && IsWayland()
Some drivers return bogus values for GetMscRate, so we clamp it to 30Hz
clampPointSize (OpenGL workarounds): Disabled: IsAndroid() || isNvidia
The point size range reported from the API is inconsistent with the actual behavior
clearToZeroOrOneBroken (OpenGL workarounds) 710443: Disabled: IsApple() && isIntel && GetMacOSVersion() < OSVersion(10, 12, 6)
Clears when the clear color is all zeros or ones do not work.
clipSrcRegionForBlitFramebuffer (OpenGL workarounds) 830046: Disabled: IsApple() || (IsLinux() && isAMD)
Issues with blitFramebuffer when the parameters don't match the framebuffer size.
decodeEncodeSRGBForGenerateMipmap (OpenGL workarounds) anglebug:4646: Disabled: IsApple()
Decode and encode before generateMipmap for srgb format textures.
disableBlendFuncExtended (OpenGL workarounds) anglebug:1085: Enabled: isAMD || isIntel
ARB_blend_func_extended does not pass the tests
disableDrawBuffersIndexed (OpenGL workarounds): Disabled: IsWindows() && isAMD
Disable OES_draw_buffers_indexed extension.
disableGPUSwitchingSupport (OpenGL workarounds) 1091824: Disabled: isDualGPUMacWithNVIDIA
Disable GPU switching support (use only the low-power GPU) on older MacBook Pros.
disableMultisampledRenderToTexture (OpenGL workarounds) anglebug:2894: Disabled: isAdreno4xxOnAndroidLessThan51 || isAdreno4xxOnAndroid70 || isAdreno5xxOnAndroidLessThan70 || isAdreno5xxOnAndroid71 || isLinuxVivante
Many drivers have bugs when using GL_EXT_multisampled_render_to_texture
disableNativeParallelCompile (OpenGL workarounds) 1094869: Disabled: isTSANBuild && IsLinux() && isNvidia
Do not use native KHR_parallel_shader_compile even when available.
disableSemaphoreFd (OpenGL workarounds) 1046462: Disabled: IsLinux() && isAMD && isMesa && mesaVersion < (std::array<int, 3>{19, 3, 5})
Disable GL_EXT_semaphore_fd extension
disableSyncControlSupport (OpenGL workarounds) 1137851: Disabled: IsLinux() && isIntel && isMesa && mesaVersion[0] == 20
Speculative fix for issues on Linux/Wayland where exposing GLX_OML_sync_control renders Chrome unusable
disableTextureClampToBorder (OpenGL workarounds) anglebug:7405: Disabled: isImagination
Imagination devices generate INVALID_ENUM when setting the texture border color.
disableTimestampQueries (OpenGL workarounds) 811661: Disabled: (IsLinux() && isVMWare) || (IsAndroid() && isNvidia) || (IsAndroid() && GetAndroidSdkLevel() < 27 && IsAdreno5xxOrOlder(functions)) || (IsAndroid() && IsMaliT8xxOrOlder(functions)) || (IsAndroid() && IsMaliG31OrOlder(functions))
Disable GL_EXT_disjoint_timer_query extension
disableWorkerContexts (OpenGL workarounds) 849576: Disabled: (IsWindows() && (isIntel || isAMD)) || (IsLinux() && isNvidia) || IsIOS() || IsAndroid() || IsAndroidEmulator(functions)
Some tests have been seen to fail using worker contexts
doWhileGLSLCausesGPUHang (OpenGL workarounds) 644669: Disabled: IsApple() && functions->standard == STANDARD_GL_DESKTOP && GetMacOSVersion() < OSVersion(10, 11, 0)
Some GLSL constructs involving do-while loops cause GPU hangs
doesSRGBClearsOnLinearFramebufferAttachments (OpenGL workarounds): Enabled: isIntel || isAMD
Issue clearing framebuffers with linear attachments when GL_FRAMEBUFFER_SRGB is enabled
dontInitializeUninitializedLocals (OpenGL workarounds) anglebug:2046: Disabled: IsAndroid() && isQualcomm
Initializing uninitialized locals caused odd behavior in a few WebGL 2 tests
dontRelinkProgramsInParallel (OpenGL workarounds) anglebug:3045: Disabled: IsAndroid() || (IsWindows() && isIntel)
Relinking a program in parallel is buggy
dontUseLoopsToInitializeVariables (OpenGL workarounds) 809422: Disabled: (IsAndroid() && isQualcomm) || (isIntel && IsApple())
For loops used to initialize variables hit native GLSL compiler bugs
emulateAbsIntFunction (OpenGL workarounds) 642227: Disabled: IsApple() && isIntel
abs(i) where i is an integer returns unexpected result
emulateAtan2Float (OpenGL workarounds) 672380: Disabled: isNvidia
atan(y, x) may return a wrong answer
emulateCopyTexImage2D (OpenGL workarounds): Disabled: isApple
Replace CopyTexImage2D with TexImage2D + CopyTexSubImage2D.
emulateCopyTexImage2DFromRenderbuffers (OpenGL workarounds) anglebug:4674: Disabled: IsApple() && functions->standard == STANDARD_GL_ES && !(isAMD && IsWindows())
CopyTexImage2D spuriously returns errors on iOS when copying from renderbuffers.
emulateImmutableCompressedTexture3D (OpenGL workarounds) 1060012: Disabled: isQualcomm
Use non-immutable texture allocation to work around a driver bug.
emulateIsnanFloat (OpenGL workarounds) 650547: Disabled: isIntel && IsApple() && IsSkylake(device) && GetMacOSVersion() < OSVersion(10, 13, 2)
Using isnan() on highp float will get wrong answer
emulateMaxVertexAttribStride (OpenGL workarounds) anglebug:1936: Disabled: IsLinux() && functions->standard == STANDARD_GL_DESKTOP && isAMD
Some drivers return 0 when MAX_VERTEX_ATTRIB_STRIED queried
emulatePackSkipRowsAndPackSkipPixels (OpenGL workarounds) anglebug:4849: Disabled: IsApple()
GL_PACK_SKIP_ROWS and GL_PACK_SKIP_PIXELS are ignored in Apple's OpenGL driver.
emulatePrimitiveRestartFixedIndex (OpenGL workarounds) anglebug:3997: Disabled: functions->standard == STANDARD_GL_DESKTOP && functions->isAtLeastGL(gl::Version(3, 1)) && !functions->isAtLeastGL(gl::Version(4, 3))
When GL_PRIMITIVE_RESTART_FIXED_INDEX is not available, emulate it with GL_PRIMITIVE_RESTART and glPrimitiveRestartIndex.
emulateRGB10 (OpenGL workarounds) 1300575: Enabled: functions->standard == STANDARD_GL_DESKTOP
Emulate RGB10 support using RGB10_A2.
finishDoesNotCauseQueriesToBeAvailable (OpenGL workarounds): Disabled: functions->standard == STANDARD_GL_DESKTOP && isNvidia
glFinish doesn't cause all queries to report available result
flushBeforeDeleteTextureIfCopiedTo (OpenGL workarounds) anglebug:4267: Disabled: IsApple() && isIntel
Some drivers track CopyTex{Sub}Image texture dependencies incorrectly. Flush before glDeleteTextures in this case
flushOnFramebufferChange (OpenGL workarounds) 1181068: Disabled: IsApple() && Has9thGenIntelGPU(systemInfo)
Switching framebuffers without a flush can lead to crashes on Intel 9th Generation GPU Macs.
initFragmentOutputVariables (OpenGL workarounds) 1171371: Disabled: IsAdreno42xOr3xx(functions)
No init gl_FragColor causes context lost
initializeCurrentVertexAttributes (OpenGL workarounds): Disabled: isNvidia
During initialization, assign the current vertex attributes to the spec-mandated defaults
keepBufferShadowCopy (OpenGL workarounds): Disabled: !CanMapBufferForRead(functions)
Maintain a shadow copy of buffer data when the GL API does not permit reading data back.
limitMax3dArrayTextureSizeTo1024 (OpenGL workarounds) 927470: Disabled: limitMaxTextureSize
Limit max 3d texture size and max array texture layers to 1024 to avoid system hang
limitMaxMSAASamplesTo4 (OpenGL workarounds) 797243: Disabled: IsAndroid() || (IsApple() && (isIntel || isAMD || isNvidia))
Various rendering bugs have been observed when using higher MSAA counts
limitWebglMaxTextureSizeTo4096 (OpenGL workarounds) 927470: Disabled: IsAndroid() || limitMaxTextureSize
Limit webgl max texture size to 4096 to avoid frequent out-of-memory errors
packLastRowSeparatelyForPaddingInclusion (OpenGL workarounds) anglebug:1512: Disabled: IsApple() || isNvidia
When uploading textures from an pack buffer, some drivers count an extra row padding
packOverlappingRowsSeparatelyPackBuffer (OpenGL workarounds): Disabled: isNvidia
In the case of packing to a pixel pack buffer, pack overlapping rows row by row
passHighpToPackUnormSnormBuiltins (OpenGL workarounds) anglebug:7527: Disabled: isQualcomm
packUnorm4x8 fails on Pixel 4 if it is not passed a highp vec4.
preAddTexelFetchOffsets (OpenGL workarounds) 642605: Disabled: IsApple() && isIntel
Intel Mac drivers mistakenly consider the parameter position of nagative vaule as invalid even if the sum of position and offset is in range, so we need to add workarounds by rewriting texelFetchOffset(sampler, position, lod, offset) into texelFetch(sampler, position + offset, lod).
promotePackedFormatsTo8BitPerChannel (OpenGL workarounds) anglebug:5469: Disabled: IsApple() && hasAMD
Packed color formats are buggy on Macs with AMD GPUs
queryCounterBitsGeneratesErrors (OpenGL workarounds) anglebug:3027: Disabled: IsNexus5X(vendor, device)
Drivers generate errors when querying the number of bits in timer queries
readPixelsUsingImplementationColorReadFormatForNorm16 (OpenGL workarounds) anglebug:4214: Disabled: !isIntel && functions->standard == STANDARD_GL_ES && functions->isAtLeastGLES(gl::Version(3, 1)) && functions->hasGLESExtension("GL_EXT_texture_norm16")
Quite some OpenGL ES drivers don't implement readPixels for RGBA/UNSIGNED_SHORT from EXT_texture_norm16 correctly
reapplyUBOBindingsAfterUsingBinaryProgram (OpenGL workarounds) anglebug:1637: Disabled: isAMD || IsAndroid()
Some drivers forget about UBO bindings when using program binaries
regenerateStructNames (OpenGL workarounds) 403957: Disabled: IsApple()
All Mac drivers do not handle struct scopes correctly. This workaround overwrites a structname with a unique prefix.
removeDynamicIndexingOfSwizzledVector (OpenGL workarounds) 709351: Disabled: IsApple() || IsAndroid() || IsWindows()
Dynamic indexing of swizzled l-values doesn't work correctly on various platforms.
removeInvariantAndCentroidForESSL3 (OpenGL workarounds): Disabled: functions->isAtMostGL(gl::Version(4, 1)) || (functions->standard == STANDARD_GL_DESKTOP && isAMD)
Fix spec difference between GLSL 4.1 or lower and ESSL3
resetTexImage2DBaseLevel (OpenGL workarounds) 705865: Disabled: IsApple() && isIntel && GetMacOSVersion() >= OSVersion(10, 12, 4)
Reset texture base level before calling glTexImage2D to work around pixel comparison failure.
rewriteFloatUnaryMinusOperator (OpenGL workarounds) 308366: Disabled: IsApple() && isIntel && GetMacOSVersion() < OSVersion(10, 12, 0)
Using '-<float>' will get wrong answer
rewriteRepeatedAssignToSwizzled (OpenGL workarounds): Disabled: isNvidia
Repeated assignment to swizzled values inside a GLSL user-defined function have incorrect results
rewriteRowMajorMatrices (OpenGL workarounds) anglebug:2273: Disabled: false
Rewrite row major matrices in shaders as column major as a driver bug workaround
sanitizeAMDGPURendererString (OpenGL workarounds) 1181193: Disabled: IsLinux() && hasAMD
Strip precise kernel and DRM version information from amdgpu renderer strings.
setPrimitiveRestartFixedIndexForDrawArrays (OpenGL workarounds) anglebug:3997: Disabled: features->emulatePrimitiveRestartFixedIndex.enabled && IsApple() && isIntel
Some drivers discard vertex data in DrawArrays calls when the fixed primitive restart index is within the number of primitives being drawn.
setZeroLevelBeforeGenerateMipmap (OpenGL workarounds): Disabled: IsApple()
glGenerateMipmap fails if the zero texture level is not set on some Mac drivers.
shiftInstancedArrayDataWithOffset (OpenGL workarounds) 1144207: Disabled: IsApple() && IsIntel(vendor) && !IsHaswell(device)
glDrawArraysInstanced is buggy on certain new Mac Intel GPUs
supportsFragmentShaderInterlockARB (OpenGL features) anglebug:7279: Enabled: functions->isAtLeastGL(gl::Version(4, 5)) && functions->hasGLExtension("GL_ARB_fragment_shader_interlock")
Backend GL context supports ARB_fragment_shader_interlock extension
supportsFragmentShaderInterlockNV (OpenGL features) anglebug:7279: Enabled: functions->isAtLeastGL(gl::Version(4, 3)) && functions->hasGLExtension("GL_NV_fragment_shader_interlock")
Backend GL context supports NV_fragment_shader_interlock extension
supportsFragmentShaderOrderingINTEL (OpenGL features) anglebug:7279: Disabled: functions->isAtLeastGL(gl::Version(4, 4)) && functions->hasGLExtension("GL_INTEL_fragment_shader_ordering")
Backend GL context supports GL_INTEL_fragment_shader_ordering extension
supportsShaderFramebufferFetchEXT (OpenGL features) anglebug:7279: Disabled: functions->hasGLESExtension("GL_EXT_shader_framebuffer_fetch")
Backend GL context supports EXT_shader_framebuffer_fetch extension
supportsShaderFramebufferFetchNonCoherentEXT (OpenGL features) anglebug:7279: Disabled: functions->hasGLESExtension("EXT_shader_framebuffer_fetch_non_coherent")
Backend GL context supports EXT_shader_framebuffer_fetch_non_coherent extension
syncVertexArraysToDefault (OpenGL workarounds) anglebug:5577: Disabled: !nativegl::SupportsVertexArrayObjects(functions)
Only use the default VAO because of missing support or driver bugs
unbindFBOBeforeSwitchingContext (OpenGL workarounds) 1181193: Disabled: IsPowerVR(vendor)
Imagination GL drivers are buggy with context switching.
unfoldShortCircuits (OpenGL workarounds) anglebug:482: Disabled: IsApple()
Mac incorrectly executes both sides of && and || expressions when they should short-circuit.
unpackLastRowSeparatelyForPaddingInclusion (OpenGL workarounds) anglebug:1512: Disabled: IsApple() || isNvidia
When uploading textures from an unpack buffer, some drivers count an extra row padding
unpackOverlappingRowsSeparatelyUnpackBuffer (OpenGL workarounds): Disabled: isNvidia
In the case of unpacking from a pixel unpack buffer, unpack overlapping rows row by row
unsizedSRGBReadPixelsDoesntTransform (OpenGL workarounds) 550292: Disabled: IsAndroid() && isQualcomm
Drivers returning raw sRGB values instead of linearized values when calling glReadPixels on unsized sRGB texture formats
uploadTextureDataInChunks (OpenGL workarounds) 1181068: Disabled: IsApple()
Upload texture data in <120kb chunks to work around Mac driver hangs and crashes.
useUnusedBlocksWithStandardOrSharedLayout (OpenGL workarounds): Disabled: (IsApple() && functions->standard == STANDARD_GL_DESKTOP) || (IsLinux() && isAMD)
Unused std140 or shared uniform blocks will be treated as inactive
vertexIDDoesNotIncludeBaseVertex (OpenGL workarounds): Disabled: IsApple() && isAMD
gl_VertexID in GLSL vertex shader doesn't include base vertex value
DAWN Info
<CPU> Vulkan backend - SwiftShader Device (Subzero)
[Default Toggle Names]
lazy_clear_resource_on_first_use: https://crbug.com/dawn/145: Clears resource to zero on first usage. This initializes the resource so that no dirty bits from recycled memory is present in the new resource.
use_temporary_buffer_in_texture_to_texture_copy: https://crbug.com/dawn/42: Split texture-to-texture copy into two copies: copy from source texture into a temporary buffer, and copy from the temporary buffer into the destination texture when copying between compressed textures that don't have block-aligned sizes. This workaround is enabled by default on all Vulkan drivers to solve an issue in the Vulkan SPEC about the texture-to-texture copies with compressed formats. See #1005 (https://github.com/KhronosGroup/Vulkan-Docs/issues/1005) for more details.
vulkan_use_d32s8: https://crbug.com/dawn/286: Vulkan mandates support of either D32_FLOAT_S8 or D24_UNORM_S8. When available the backend will use D32S8 (toggle to on) but setting the toggle to off will make it use the D24S8 format when possible.
vulkan_use_s8: https://crbug.com/dawn/666: Vulkan has a pure stencil8 format but it is not universally available. When this toggle is on, the backend will use S8 for the stencil8 format, otherwise it will fallback to D32S8 or D24S8.
disallow_unsafe_apis: http://crbug.com/1138528: Produces validation errors on API entry points or parameter combinations that aren't considered secure yet.
use_vulkan_zero_initialize_workgroup_memory_extension: https://crbug.com/dawn/1302: Initialize workgroup memory with OpConstantNull on Vulkan when the Vulkan extension VK_KHR_zero_initialize_workgroup_memory is supported.
[WebGPU Forced Toggles - enabled]
disallow_spirv: https://crbug.com/1214923: Disallow usage of SPIR-V completely so that only WGSL is used for shader modules. This is useful to prevent a Chromium renderer process from successfully sending SPIR-V code to be compiled in the GPU process.
[Supported Features]
texture-compression-bc
texture-compression-etc2
texture-compression-astc
timestamp-query
depth-clip-control
depth32float-stencil8
indirect-first-instance
rg11b10ufloat-renderable
dawn-internal-usages
dawn-native
Version Information
Data exported
2023-02-11T23:53:25.967Z
Chrome version
Chrome/108.0.5359.98
Operating system
Linux 5.15.81
Software rendering list URL
https://chromium.googlesource.com/chromium/src/+/aa99c50ebc03bd334a4a8f11e99ab6fb5e0adf78/gpu/config/software_rendering_list.json
Driver bug list URL
https://chromium.googlesource.com/chromium/src/+/aa99c50ebc03bd334a4a8f11e99ab6fb5e0adf78/gpu/config/gpu_driver_bug_list.json
ANGLE commit id
unknown hash
2D graphics backend
Skia/108 7c55be996a81ff9c5c66984c9d4ef85d12a44c8c
Command Line
/nix/store/nq2g91pahhdvyw99kb18s9dh3csqg9my-chromium-unwrapped-108.0.5359.98/libexec/chromium/chromium --flag-switches-begin --flag-switches-end
Driver Information
Initialization time
235
In-process GPU
false
Passthrough Command Decoder
true
Sandboxed
false
GPU0
VENDOR= 0x0000 [Google Inc. (Intel)], DEVICE=0x0000 [ANGLE (Intel, Mesa Intel(R) UHD Graphics (TGL GT1), OpenGL 4.6 (Core Profile) Mesa 22.2.4)], DRIVER_VENDOR=Mesa, DRIVER_VERSION=22.2.4 *ACTIVE*
Optimus
false
AMD switchable
false
GPU CUDA compute capability major version
0
Pixel shader version
1.00
Vertex shader version
1.00
Max. MSAA samples
16
Machine model name
Machine model version
GL_VENDOR
Google Inc. (Intel)
GL_RENDERER
ANGLE (Intel, Mesa Intel(R) UHD Graphics (TGL GT1), OpenGL 4.6 (Core Profile) Mesa 22.2.4)
GL_VERSION
OpenGL ES 2.0.0 (ANGLE 2.1.0 git hash: unknown hash)
GL_EXTENSIONS
GL_AMD_performance_monitor GL_ANGLE_base_vertex_base_instance GL_ANGLE_base_vertex_base_instance_shader_builtin GL_ANGLE_client_arrays GL_ANGLE_compressed_texture_etc GL_ANGLE_depth_texture GL_ANGLE_framebuffer_blit GL_ANGLE_framebuffer_multisample GL_ANGLE_get_serialized_context_string GL_ANGLE_get_tex_level_parameter GL_ANGLE_instanced_arrays GL_ANGLE_logic_op GL_ANGLE_memory_size GL_ANGLE_multi_draw GL_ANGLE_program_cache_control GL_ANGLE_provoking_vertex GL_ANGLE_request_extension GL_ANGLE_robust_client_memory GL_ANGLE_texture_compression_dxt3 GL_ANGLE_texture_compression_dxt5 GL_ANGLE_texture_external_update GL_ANGLE_texture_rectangle GL_ANGLE_translated_shader_source GL_APPLE_clip_distance GL_ARB_sync GL_CHROMIUM_bind_generates_resource GL_CHROMIUM_bind_uniform_location GL_CHROMIUM_color_buffer_float_rgb GL_CHROMIUM_color_buffer_float_rgba GL_CHROMIUM_copy_texture GL_CHROMIUM_lose_context GL_CHROMIUM_sync_query GL_EXT_base_instance GL_EXT_blend_minmax GL_EXT_color_buffer_half_float GL_EXT_compressed_ETC1_RGB8_sub_texture GL_EXT_debug_label GL_EXT_debug_marker GL_EXT_discard_framebuffer GL_EXT_disjoint_timer_query GL_EXT_draw_buffers GL_EXT_draw_elements_base_vertex GL_EXT_float_blend GL_EXT_frag_depth GL_EXT_instanced_arrays GL_EXT_map_buffer_range GL_EXT_memory_object GL_EXT_memory_object_fd GL_EXT_multi_draw_indirect GL_EXT_multisample_compatibility GL_EXT_occlusion_query_boolean GL_EXT_read_format_bgra GL_EXT_robustness GL_EXT_sRGB GL_EXT_sRGB_write_control GL_EXT_semaphore GL_EXT_semaphore_fd GL_EXT_shader_texture_lod GL_EXT_shadow_samplers GL_EXT_texture_compression_bptc GL_EXT_texture_compression_dxt1 GL_EXT_texture_compression_rgtc GL_EXT_texture_compression_s3tc_srgb GL_EXT_texture_filter_anisotropic GL_EXT_texture_format_BGRA8888 GL_EXT_texture_norm16 GL_EXT_texture_rg GL_EXT_texture_sRGB_decode GL_EXT_texture_storage GL_EXT_texture_type_2_10_10_10_REV GL_EXT_unpack_subimage GL_KHR_debug GL_KHR_parallel_shader_compile GL_MESA_framebuffer_flip_y GL_NV_depth_buffer_float2 GL_NV_fence GL_NV_framebuffer_blit GL_NV_pack_subimage GL_NV_pixel_buffer_object GL_NV_read_depth GL_NV_read_stencil GL_OES_compressed_EAC_R11_signed_texture GL_OES_compressed_EAC_R11_unsigned_texture GL_OES_compressed_EAC_RG11_signed_texture GL_OES_compressed_EAC_RG11_unsigned_texture GL_OES_compressed_ETC1_RGB8_texture GL_OES_compressed_ETC2_RGB8_texture GL_OES_compressed_ETC2_RGBA8_texture GL_OES_compressed_ETC2_punchthroughA_RGBA8_texture GL_OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture GL_OES_compressed_ETC2_sRGB8_alpha8_texture GL_OES_compressed_ETC2_sRGB8_texture GL_OES_depth24 GL_OES_depth32 GL_OES_depth_texture GL_OES_draw_elements_base_vertex GL_OES_element_index_uint GL_OES_fbo_render_mipmap GL_OES_get_program_binary GL_OES_mapbuffer GL_OES_packed_depth_stencil GL_OES_rgb8_rgba8 GL_OES_standard_derivatives GL_OES_surfaceless_context GL_OES_texture_3D GL_OES_texture_border_clamp GL_OES_texture_float GL_OES_texture_float_linear GL_OES_texture_half_float GL_OES_texture_half_float_linear GL_OES_texture_npot GL_OES_texture_stencil8 GL_OES_vertex_array_object GL_WEBGL_video_texture
Disabled Extensions
GL_KHR_blend_equation_advanced GL_KHR_blend_equation_advanced_coherent GL_MESA_framebuffer_flip_y
Disabled WebGL Extensions
Window system binding vendor
Google Inc. (Intel)
Window system binding version
1.5 (ANGLE 2.1.0 git hash: unknown hash)
Window system binding extensions
EGL_KHR_create_context EGL_KHR_get_all_proc_addresses EGL_ANGLE_create_context_webgl_compatibility EGL_CHROMIUM_create_context_bind_generates_resource EGL_CHROMIUM_sync_control EGL_ANGLE_sync_control_rate EGL_EXT_pixel_format_float EGL_KHR_surfaceless_context EGL_ANGLE_display_texture_share_group EGL_ANGLE_display_semaphore_share_group EGL_ANGLE_create_context_client_arrays EGL_ANGLE_program_cache_control EGL_ANGLE_robust_resource_initialization EGL_ANGLE_create_context_extensions_enabled EGL_ANDROID_blob_cache EGL_ANDROID_recordable EGL_ANGLE_create_context_backwards_compatible EGL_KHR_create_context_no_error EGL_NOK_texture_from_pixmap EGL_KHR_reusable_sync
XDG_CURRENT_DESKTOP
none+xmonad
XDG_SESSION_TYPE
x11
GDMSESSION
none+xmonad
Ozone platform
x11
Direct rendering version
unknown
Reset notification strategy
0x8261
GPU process crash count
0
gfx::BufferFormats supported for allocation and texturing
R_8: not supported, R_16: not supported, RG_88: not supported, RG_1616: not supported, BGR_565: not supported, RGBA_4444: not supported, RGBX_8888: not supported, RGBA_8888: not supported, BGRX_8888: not supported, BGRA_1010102: not supported, RGBA_1010102: not supported, BGRA_8888: not supported, RGBA_F16: not supported, YVU_420: not supported, YUV_420_BIPLANAR: not supported, P010: not supported
Compositor Information
Tile Update Mode
One-copy
Partial Raster
Enabled
GpuMemoryBuffers Status
R_8
Software only
R_16
Software only
RG_88
Software only
RG_1616
Software only
BGR_565
Software only
RGBA_4444
Software only
RGBX_8888
Software only
RGBA_8888
Software only
BGRX_8888
Software only
BGRA_1010102
Software only
RGBA_1010102
Software only
BGRA_8888
Software only
RGBA_F16
Software only
YVU_420
Software only
YUV_420_BIPLANAR
Software only
P010
Software only
Display(s) Information
Info
Display[21691165392764996] bounds=[0,0 3840x2400], workarea=[0,0 3840x2400], scale=1, rotation=0, panel_rotation=0 internal.
Color space (all)
{primaries:BT709, transfer:SRGB, matrix:RGB, range:FULL}
Buffer format (all)
BGRA_8888
Color volume
{name:'srgb', r:[0.6400, 0.3300], g:[0.3000, 0.6000], b:[0.1500, 0.3300], w:[0.3127, 0.3290]}
SDR white level in nits
203
HDR relative maximum luminance
1
Bits per color component
8
Bits per pixel
24
Refresh Rate in Hz
59
Video Acceleration Information
Decoding
Decode h264 baseline
16x16 to 4096x4096 pixels
Decode h264 main
16x16 to 4096x4096 pixels
Decode h264 high
16x16 to 4096x4096 pixels
Decode vp8
16x16 to 4096x4096 pixels
Decode vp9 profile0
16x16 to 16384x16384 pixels
Decode vp9 profile2
16x16 to 16384x16384 pixels
Decode hevc main
16x16 to 16384x16384 pixels
Decode hevc main 10
16x16 to 16384x16384 pixels
Decode hevc main still-picture
16x16 to 16384x16384 pixels
Decode av1 profile main
16x16 to 16384x16384 pixels
Encoding
Vulkan Information
Device Performance Information
Log Messages
[1858585:1858585:0211/232104.502857:WARNING:sandbox_linux.cc(380)] : InitializeSandbox() called with multiple threads in process gpu-process.
[1858585:1858585:0211/234145.374942:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234145.375064:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/234145.472058:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.472574:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.472770:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.472972:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.473111:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.473964:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.474153:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.474295:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.474451:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.474599:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.474739:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.474874:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.475011:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.475147:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.475869:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.476784:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.476967:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.477109:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.477248:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.477397:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.477564:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.477712:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.477858:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.478010:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.478149:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.479018:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.479208:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.479354:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.479524:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.479681:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.479829:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.479983:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.480136:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.480280:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.480443:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.481307:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.481504:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.481657:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.481805:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.481998:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.482229:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.482413:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.482587:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.482722:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.482859:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.483817:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.484022:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.484169:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.484315:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.484488:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.484623:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.484775:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.484887:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.485001:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.485104:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.486015:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.486163:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.486267:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.486377:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.486519:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.486642:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.486747:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.486840:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.486941:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.487083:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.487998:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.488196:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.488343:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.488500:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.488637:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.488785:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.489265:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.489548:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.489796:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.490028:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.491453:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.491695:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.491918:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.492140:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.492362:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.492624:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.492927:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.493165:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.493355:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.493516:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.494795:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.495075:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.495280:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.495463:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.495620:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.495771:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.497542:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.497807:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.498098:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.498257:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.631943:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234145.632070:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/234146.170252:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234146.170355:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/234146.523490:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234146.523599:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/234146.560416:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234150.723272:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234150.723417:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/234150.737067:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234207.688807:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234207.688946:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/234213.092461:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234213.092595:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/234213.123400:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234218.292369:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234218.292525:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/234218.305831:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234222.073241:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234222.073365:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/234223.812997:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234223.813131:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/234240.669524:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234240.669723:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/235218.585448:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/235218.585586:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/235222.337372:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/235222.337522:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/235222.339168:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235222.350324:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235222.367798:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235222.385180:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235222.402502:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235222.419584:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235222.421363:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235222.422162:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235222.422436:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235222.422755:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235226.230783:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/235226.230894:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/235307.724218:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/235307.724384:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/235307.752809:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235307.754053:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235307.754875:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235307.755625:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235307.756357:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235307.757201:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235307.757925:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235308.645226:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/235308.645332:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
https://www.lifewire.com/hardware-acceleration-in-chrome-4125122
Somehow resolved after disabling offloading. Also running chrome as DISABLE_LAYER_AMD_SWITCHABLE_GRAPHICS_1=1 chromium
.
libGL error: MESA-LOADER: failed to open iris: /nix/store/lqz6hmd86viw83f9qll2ip87jhb7p1ah-glibc-2.35-224/lib/libc.so.6: version `GLIBC_2.36' not found (required by /nix/store/hvi95rrzrnqqhwvfn5b10l5c3f2lhr0h-llvm-15.0.7-lib/lib/libLLVM-15.so) (search paths /run/opengl-driver/lib/dri, suffix _dri)
libGL error: failed to load driver: iris
libGL error: MESA-LOADER: failed to open iris: /nix/store/lqz6hmd86viw83f9qll2ip87jhb7p1ah-glibc-2.35-224/lib/libc.so.6: version `GLIBC_2.36' not found (required by /nix/store/hvi95rrzrnqqhwvfn5b10l5c3f2lhr0h-llvm-15.0.7-lib/lib/libLLVM-15.so) (search paths /run/opengl-driver/lib/dri, suffix _dri)
libGL error: failed to load driver: iris
libGL error: MESA-LOADER: failed to open swrast: /nix/store/lqz6hmd86viw83f9qll2ip87jhb7p1ah-glibc-2.35-224/lib/libc.so.6: version `GLIBC_2.36' not found (required by /nix/store/hvi95rrzrnqqhwvfn5b10l5c3f2lhr0h-llvm-15.0.7-lib/lib/libLLVM-15.so) (search paths /run/opengl-driver/lib/dri, suffix _dri)
libGL error: failed to load driver: swrast
[3436:3436:0622/194103.267052:ERROR:angle_platform_impl.cc(43)] Display.cpp:1014 (initialize): ANGLE Display::initialize error 12289: Could not create a backing OpenGL context.
ERR: Display.cpp:1014 (initialize): ANGLE Display::initialize error 12289: Could not create a backing OpenGL context.
[3436:3436:0622/194103.268458:ERROR:gl_display.cc(504)] EGL Driver message (Critical) eglInitialize: Could not create a backing OpenGL context.
[3436:3436:0622/194103.268557:ERROR:gl_display.cc(917)] eglInitialize OpenGL failed with error EGL_NOT_INITIALIZED, trying next display type
[3436:3436:0622/194103.271814:ERROR:angle_platform_impl.cc(43)] Display.cpp:1014 (initialize): ANGLE Display::initialize error 12289: Could not create a backing OpenGL context.
ERR: Display.cpp:1014 (initialize): ANGLE Display::initialize error 12289: Could not create a backing OpenGL context.
[3436:3436:0622/194103.271908:ERROR:gl_display.cc(504)] EGL Driver message (Critical) eglInitialize: Could not create a backing OpenGL context.
Resolved by disabling offloading.
programs.chromium = {
enable = true;
package = pkgs-bleeding.chromium;
commandLineArgs = [
# https://www.linuxuprising.com/2018/08/how-to-enable-hardware-accelerated.html
"--enable-accelerated-video-decode"
"--enable-logging=stderr"
"--ignore-gpu-blocklist"
"--use-gl=desktop"
"--enable-features=VaapiVideoEncoder,VaapiVideoDecoder"
"--disable-features=UseChromeOSDirectVideoDecoder"
# https://github.com/NixOS/nixpkgs/issues/209101
"--disable-gpu-vsync"
"--disable-frame-rate-limit"
# https://wiki.archlinux.org/title/chromium
"--ignore-gpu-blocklist"
"--enable-gpu-rasterization"
"--enable-zero-copy"
];
extensions = [
<<browser-chromium-extensions>>
];
};
See https://chromium.googlesource.com/chromium/src/+/refs/heads/main/chrome/common/chrome_switches.cc and https://source.chromium.org/search?q=file:switches.cc&ss=chromium%2Fchromium%2Fsrc for some switches that we can use according to the commandLineArgs
option in programs/chromium.nix.
Note how NixOS/nixpkgs#211408 outlines a fix regarding graphics switching/offloading:
DISABLE_LAYER_AMD_SWITCHABLE_GRAPHICS_1=1
We set this through the home.sessionVariables
option, so we can just run chromium
to keep things simple:
home.sessionVariables.DISABLE_LAYER_AMD_SWITCHABLE_GRAPHICS_1 = 1;
https://www.chromium.org/developers/how-tos/run-chromium-with-flags/
chrome://version chrome://flags chrome://gpu
vi-like navigation of the browser
{
# Vimium
# https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb
id = "dbepggeogbaibhgnhhndojpepiihcmeb";
}
c
- enter caret mode from either of the visual modes (
v
visual mode,V
visual line mode)
vi-editor for input controls
- enter with
C-RET
, exit with:q
(typical vi exit command)
{
# wasavi
# https://chrome.google.com/webstore/detail/wasavi/dgogifpkoilgiofhhhodbodcfgomelhe
# see https://github.com/philc/vimium/issues/2564
id = "dgogifpkoilgiofhhhodbodcfgomelhe";
}
β οΈ In order to get the extensions in Firefox to work, you may have to first manually enable the extensions.
programs.firefox = {
enable = true;
<<browser-firefox-profiles>>
};
# NOTE: Extensions need firefox.profiles to be defined
profiles.personal.extensions =
# https://nur.nix-community.org/repos/rycee/
with nur.repos.rycee.firefox-addons; [
<<browser-firefox-extensions>>
];
Tridactyl is the extension introducing the vim bindings into Firefox. It will hijack the body of your new tabs which can bit a bit disruptive to your workflow as it will present a Tridactyl start page which is visually quite busy therefore running :set newtab about:blank
to clear the body of the new tab can improve the UX and run :set theme dark
to switch to a dark theme if new tabs are blasting you with white light.
multi-account-containers # needed by tridactyl
tridactyl
Remember that <C-,>
(as described in the Tridactyl documentation which would be C-,
in Emacs bindings notation or more simply but Ctrl
+ ,β
) is the Tridactyl escape hatch that gets you into a part within the page view of the browser where you can use the vi-like bindings to navigate or do this.
π‘ This is convenient because loading some pages will leave the focus on the URL bar or the search bar and tabbing through may be a tedious way to get to the page view.
Remember that Shift
+ Insert
(or Ctrl
+ Alt
+ Escape
but Iβm refusing to learn that one because it is quite a dragon of a maneuver to efficiently pull of) will toggle to ignore mode in which all keypresses are passed-through to the web application.
π‘ This is convenient for applications that have their own bindings that may conflict with Tridactyl.
Use /
to enter a search query and use Ctrl
+ g
or Ctrl
+ G
to cycle through search results.
π‘ The search cycling binding is a bit differnet to what vi-bindings users may expect so just pay attention to keep C-g
and C-G
(expressed in Emacs notation) within (muscle) memory.
Use GhostText to edit text in the browser through a text editor.
just trying this out to edit text in browser in Emacs
https://chrome.google.com/webstore/detail/ghosttext/godiecgffnchndlihlpaajjcplehddca/related
{
# GhostText
# https://chrome.google.com/webstore/detail/ghosttext/godiecgffnchndlihlpaajjcplehddca
# see https://ghosttext.fregante.com/
id = "godiecgffnchndlihlpaajjcplehddca";
}
{
# Darkreader
# https://chrome.google.com/webstore/detail/dark-reader/eimadpbcbfnmbkopoojfekhnkhdbieeh
id = "eimadpbcbfnmbkopoojfekhnkhdbieeh";
}
darkreader
/html/body/div[1]/div/div/svg/g[2]/rect #entity-Document-5b2ba057-c937-56df-837d-8bac67f835ce > rect
GitHub wraps mermaid diagrams in a div with the .mermaid class:
div.mermaid svg#diagram rect.er.entityBox {
fill: transparent !important;
}
More generally and for the Mermaid Live editor the following applies added up top:
<<darkreader-mermaid>>
We fix the navigation controls for embedded mermaid diagrams by setting the fill and background clors on the control-panel buttons:
div.mermaid-viewer-control-panel .btn {
fill: var(--darkreader-neutral-text);
background-color: var(--darkreader-neutral-background);
}
For the ER diagrams:
svg g rect.er {
fill: var(--darkreader-neutral-background) !important;
}
svg g rect.er.entityBox {
fill: var(--darkreader-neutral-background) !important;
}
svg g rect.er.attributeBoxOdd {
fill: var(--darkreader-neutral-background) !important;
}
svg g rect.er.attributeBoxEven {
fill-opacity: 0.8 !important;
fill: var(--darkreader-selection-background);
}
svg rect.er.relationshipLabelBox {
fill: var(--darkreader-neutral-background) !important;
}
For the Flow diagrams:
svg g g.nodes rect, svg g g.nodes polygon {
fill: var(--darkreader-neutral-background) !important;
}
For Gantt diagrams:
svg g rect.task {
fill: var(--darkreader-selection-background) !important;
}
For Sequence diagrams:
svg line.messageLine0, svg line.messageLine1 {
stroke: var(--darkreader-neutral-text) !important;
}
div.mermaid .actor {
fill: var(--darkreader-neutral-background) !important;
}
div.mermaid .sequenceNumber {
color: var(--darkreader-selection-text) !important;
}
Filed into darkreader/darkreader#11108
.sidebar {
background: var(--darkreader-neutral-background) !important;
}
Using Slack from the browser is a shitty experience because one has to keep so many tabs open for the different workspaces. Iβm finally budging and installing the official client.
pkgs.slack
"slack"
pkgs.discord
"discord"
"discord-ptb"
"discord-canary"
# Tangled from README.org
{ config, pkgs, ... }:
let
<<doc-let-bindings>>
in
{
home.packages = with pkgs; [
<<doc-packages>>
];
}
texlive-asabina = with pkgs; (texlive.combine {
inherit (texlive)
scheme-medium
luatex
atenddvi
background
bashful
capt-of
collection-basic
collection-fontsrecommended
collection-langeuropean
collection-langgerman
collection-latexrecommended
datetime
draftwatermark
enumitem
eso-pic
etoolbox
everypage
fmtcount
koma-script
lastpage
latexdiff
mdframed
needspace
numprint
paracol
pdfcrop
pgfgantt
soul
svg
tableof
titlepic
tocloft
transparent
trimspaces
ulem
wrapfig
xargs
xetex
xstring
xtab
;
});
biber
bibtex2html
texlive-asabina
We install pdftk into our common config.
pdftk
And relist it for the Darwin config
pdftk
until Iβve had some time to properly abstract this mess of a config. I have my Linux machine back, so high-time to test that tux config again.
pandoc
evince
okular
xournal
zathura
aspell
aspellDicts.de
aspellDicts.en
aspellDicts.nl
sc-im
visidata
qrencode
libreoffice
We previously installed the reMarkable app for OSX through homebrew casks but are now following the recommendation from the app itself to install it from the App Store.
https://apps.apple.com/us/app/remarkable-desktop/id1276493162
"Remarkable Desktop" = 1276493162;
Refer to emacs/README.org for an example of a literate config that tangles into multiple output files.
- [-] configuration-darwin.nix
- [ ] emacs/home.nix
- [ ] system/darwin.nix
- [ ] direnv
- [ ] .xsession
- [ ] .Xresources.d
- [ ] .Xmodmap
- [ ] tmux
- [ ] Neovim
- [ ] Termite
- [ ] Starship
- [X] Rofi (handled through Pywal since [2023-07-03 Mon])
- [ ] Redshift (or Gammastep)
- [ ] Ghorg
- [ ] Asciinema
- [ ] Compton
- [ ] Octave
- [ ] Lein
- [ ] Colorit
- [ ] Conky
- [X] Emacs
- [X] Git
application/pdf=org.pwmt.zathura-pdf-mupdf.desktop;okularApplication_pdf.desktop; application/octet-stream=emacsclient.desktop;
For convenience, we call delete-trailing-whitespace
as outlined in an emacs-orgmode mailing thread to automatically clean up trailing whitespaces that may be artifact from tangling noweb refs that
- contain line-breaks and are being indented or
- have no noweb-ref writes
;;; Local Variables: ;;; eval: (add-hook βorg-babel-post-tangle-hook #βdelete-trailing-whitespace) ;;; eval: (add-hook βorg-babel-post-tangle-hook #βsave-buffer :append) ;;; End: