Skip to content

Instantly share code, notes, and snippets.

@KreerC
Last active Aug 27, 2022
Embed
What would you like to do?
i3wm settings for low vision users

My preferences for low vision i3wm usage

This piece documents my personal settings for the i3 window manager (i3wm.org) ecosystem that make it (somewhat) usable for me as a low-vision power user. Please note that I have ditched linux and i3wm as my daily drivers in favor of macOS in June 2022. There may be better options available now.

How I use i3

First of all, I don't use i3 for the tiling, but for the efficient ways to start/close applications and the painless workspace experience instead. I rarely have more than one window per workspace, and when I do, I use tabbed mode (I consider this sub-workspaces) so each of them is in fullscreen.

Currently I use a 42 Inch 1920x1080 Samsung TV as my monitor, with a viewing distance of around 40cm. For smaller devices I definitely suggest picking different numbers and even scaling down the resolution entirely. For my 13 Inch Laptop, I use a resolution of 1280x720 and slightly smaller font sizes.

In general I would recommend choosing a full-blown desktop environment that features fullscreen zoom for most everyday tasks, for which I found the Cinnamon desktop quite pleasant.

This is not at all ideal and could certainly be much more comfortable if there was the possibility for fullscreen zoom in i3wm. But for now I enjoy i3's sheer speed and navigate my way around the system mostly by knowledge about the way I set it up. I know where I put my stuff without having to click. Also, keyboard shortcuts are a blessing.

Additional tools

I use my screenzoom.sh script for fullscreen magnification that is sadly not live-updating, but it is good enough to read small static text.

A while ago I also made a script that uses TTS to announce when the focused window in i3 changes. I am planning to redo this with sounds, and also for other (perhaps configurable) events. This will again greatly improve the experience.

Settings I apply with additional tools

As I mostly use Linux Mint, which comes with the Cinnamon Desktop and some utilities, I use those to select a dark theme (which is bundled with the system and applied to both GTK and Qt applications automatically). Firefox will even display dark-mode websites if that is supported.

Settings I do for X11

I usually create an .Xresources file in my home directory, with the following contents:

Xcursor.size: 50

This increases the cursor size so that is more visible. Sometimes I also swap the default X11 cursor theme with a white one bundled with Mint. I would love to have a simpler way for this.

This requires a restart of X11 to take effect.

Settings I do to i3 directly

Most changes (besides my higher-contrast color scheme) affect the font sizes:

# Window title font
font pango:DejaVu Sans Mono 22

For dmenu I use the monospace-36 font and for i3status, I use pango:DejaVu Sans Mono 24.

Only the dmenu font is big enough so I can somewhat read it from my normal viewing distance, and only when I know what to expect (which I usually do when I launch dmenu). For the other elements, I need to lean forward quite a bit to assume what they read, but making them any bigger would take away lots of screen estate.

I also create shortcuts to launch and terminate the orca screen reader, so it's always there when I need it.

I decided against documenting my current color scheme here. You should pick colors that fit your situation and I change mine around frequently. There's a tool to accomplish changing the colors more easily, but frankly, it's not very accessible.

Notifications

I use dunst for desktop notifications. The default however, is tiny, and configuring dunst is kinda difficult. So here's my ~/.config/dunst/dunstrc:

[global]
  font = DejaVu Sans Mono 36
  geometry = "500x5-30-20"
  word_wrap = true
  separator_height = 10
  padding = 20
  frame_width = 5
  frame_color = "#aaaaaa"
  separator_color = frame
  sort = yes
  markup = full
  format = "<b>%s %p</b>\n%b"
  alignment = left
  icon_position = left
  max_icon_size = 128
  icon_path = /usr/share/icons/gnome/32x32/status/:/usr/share/icons/gnome/32x32/devices/
  text_icon_padding = 15
  monitor = mouse
  progress_bar = true  
  progress_bar_height = 30
  progress_bar_max_width = 500

[urgency_low]
  background = "#333333"
  foreground = "#ffffff"
[urgency_normal]
  background = "#222222"
  foreground = "#ffffff"
[urgency_critical]
  background = "#000000"
  foreground = "#ffffff"

This increases font size and color contrast and puts the notifications in the bottom right corner. It also enables icons so you can more easily distinguish where they are coming from.

Application launcher

Recently I've come to like the rofi application launcher over dmenu. I use the included Monokai theme with a huge font and five lines shown. These options can be changed after generating the default rofi configuration file and running rofi-theme-selector.

configuration {
	modi: "window,drun,run,ssh,combi";
/*	width: 50;*/
	lines: 5;
/*	columns: 1;*/
	font: "mono 28";
/*	bw: 1;*/
/*	location: 0;*/
/*	padding: 5;*/
/*	yoffset: 0;*/
/*	xoffset: 0;*/
/*	fixed-num-lines: true;*/
	show-icons: true;
/*	terminal: "rofi-sensible-terminal";*/
/*	ssh-client: "ssh";*/
/*	ssh-command: "{terminal} -e {ssh-client} {host} [-p {port}]";*/
/*	run-command: "{cmd}";*/
/*	run-list-command: "";*/
/*	run-shell-command: "{terminal} -e {cmd}";*/
/*	window-command: "wmctrl -i -R {window}";*/
/*	window-match-fields: "all";*/
/*	icon-theme: ;*/
/*	drun-match-fields: "name,generic,exec,categories";*/
/*	drun-show-actions: false;*/
/*	drun-display-format: "{name} [<span weight='light' size='small'><i>({generic})</i></span>]";*/
	disable-history: true;
/*	ignored-prefixes: "";*/
/*	sort: false;*/
/*	sorting-method: ;*/
/*	case-sensitive: false;*/
/*	cycle: true;*/
/*	sidebar-mode: false;*/
/*	eh: 1;*/
/*	auto-select: false;*/
/*	parse-hosts: false;*/
/*	parse-known-hosts: true;*/
	combi-modi: "window,ssh,run,drun";
/*	matching: "normal";*/
/*	tokenize: true;*/
/*	m: "-5";*/
/*	line-margin: 2;*/
/*	line-padding: 1;*/
/*	filter: ;*/
/*	separator-style: "dash";*/
/*	hide-scrollbar: false;*/
/*	fullscreen: false;*/
/*	fake-transparency: false;*/
/*	dpi: -1;*/
/*	threads: 0;*/
/*	scrollbar-width: 8;*/
/*	scroll-method: 0;*/
/*	fake-background: "screenshot";*/
/*	window-format: "{w}    {c}   {t}";*/
/*	click-to-exit: true;*/
/*	show-match: true;*/
/*	theme: ;*/
/*	color-normal: ;*/
/*	color-urgent: ;*/
/*	color-active: ;*/
/*	color-window: ;*/
/*	max-history-size: 25;*/
/*	combi-hide-mode-prefix: false;*/
/*	matching-negate-char: '-' /* unsupported */;*/
/*	cache-dir: ;*/
/*	pid: "/run/user/1000/rofi.pid";*/
/*	display-window: ;*/
/*	display-windowcd: ;*/
/*	display-run: ;*/
/*	display-ssh: ;*/
/*	display-drun: ;*/
/*	display-combi: ;*/
/*	display-keys: ;*/
/*	kb-primary-paste: "Control+V,Shift+Insert";*/
/*	kb-secondary-paste: "Control+v,Insert";*/
/*	kb-clear-line: "Control+w";*/
/*	kb-move-front: "Control+a";*/
/*	kb-move-end: "Control+e";*/
/*	kb-move-word-back: "Alt+b,Control+Left";*/
/*	kb-move-word-forward: "Alt+f,Control+Right";*/
/*	kb-move-char-back: "Left,Control+b";*/
/*	kb-move-char-forward: "Right,Control+f";*/
/*	kb-remove-word-back: "Control+Alt+h,Control+BackSpace";*/
/*	kb-remove-word-forward: "Control+Alt+d";*/
/*	kb-remove-char-forward: "Delete,Control+d";*/
/*	kb-remove-char-back: "BackSpace,Shift+BackSpace,Control+h";*/
/*	kb-remove-to-eol: "Control+k";*/
/*	kb-remove-to-sol: "Control+u";*/
/*	kb-accept-entry: "Control+j,Control+m,Return,KP_Enter";*/
/*	kb-accept-custom: "Control+Return";*/
/*	kb-accept-alt: "Shift+Return";*/
/*	kb-delete-entry: "Shift+Delete";*/
/*	kb-mode-next: "Shift+Right,Control+Tab";*/
/*	kb-mode-previous: "Shift+Left,Control+ISO_Left_Tab";*/
/*	kb-row-left: "Control+Page_Up";*/
/*	kb-row-right: "Control+Page_Down";*/
/*	kb-row-up: "Up,Control+p,ISO_Left_Tab";*/
/*	kb-row-down: "Down,Control+n";*/
/*	kb-row-tab: "Tab";*/
/*	kb-page-prev: "Page_Up";*/
/*	kb-page-next: "Page_Down";*/
/*	kb-row-first: "Home,KP_Home";*/
/*	kb-row-last: "End,KP_End";*/
/*	kb-row-select: "Control+space";*/
/*	kb-screenshot: "Alt+S";*/
/*	kb-ellipsize: "Alt+period";*/
/*	kb-toggle-case-sensitivity: "grave,dead_grave";*/
/*	kb-toggle-sort: "Alt+grave";*/
/*	kb-cancel: "Escape,Control+g,Control+bracketleft";*/
/*	kb-custom-1: "Alt+1";*/
/*	kb-custom-2: "Alt+2";*/
/*	kb-custom-3: "Alt+3";*/
/*	kb-custom-4: "Alt+4";*/
/*	kb-custom-5: "Alt+5";*/
/*	kb-custom-6: "Alt+6";*/
/*	kb-custom-7: "Alt+7";*/
/*	kb-custom-8: "Alt+8";*/
/*	kb-custom-9: "Alt+9";*/
/*	kb-custom-10: "Alt+0";*/
/*	kb-custom-11: "Alt+exclam";*/
/*	kb-custom-12: "Alt+at";*/
/*	kb-custom-13: "Alt+numbersign";*/
/*	kb-custom-14: "Alt+dollar";*/
/*	kb-custom-15: "Alt+percent";*/
/*	kb-custom-16: "Alt+dead_circumflex";*/
/*	kb-custom-17: "Alt+ampersand";*/
/*	kb-custom-18: "Alt+asterisk";*/
/*	kb-custom-19: "Alt+parenleft";*/
/*	kb-select-1: "Super+1";*/
/*	kb-select-2: "Super+2";*/
/*	kb-select-3: "Super+3";*/
/*	kb-select-4: "Super+4";*/
/*	kb-select-5: "Super+5";*/
/*	kb-select-6: "Super+6";*/
/*	kb-select-7: "Super+7";*/
/*	kb-select-8: "Super+8";*/
/*	kb-select-9: "Super+9";*/
/*	kb-select-10: "Super+0";*/
/*	ml-row-left: "ScrollLeft";*/
/*	ml-row-right: "ScrollRight";*/
/*	ml-row-up: "ScrollUp";*/
/*	ml-row-down: "ScrollDown";*/
/*	me-select-entry: "MousePrimary";*/
/*	me-accept-entry: "MouseDPrimary";*/
/*	me-accept-custom: "Control+MouseDPrimary";*/
}
@import "/usr/share/rofi/themes/Monokai.rasi"

Browser setup

I set up my browsers (primarily firefox) with a default zoom level of 170% but increase well beyond that frequently. Most websites are pretty responsive nowadays so that is rarely an issue. This also applies to the Electron apps I use most: Discord, Spotify, Ferdi and VS Code.

Other tools

As my terminal, I use gnome-terminal. I create two color profiles (one bright & one dark) and give each of them an i3 shortcut so I have both immediately available, depending on what fits the current lighting situation best.

Problems with my setup

I use my monitor in "Gaming mode" to reduce latency as I found that to be very annoying. Sadly though, this only works in the TV's "standard" color profile, which makes lots of colors (like lighter greys) completely invisible. So for graphics work (or when testing applications with changed colors) I have a secondary monitor on hand that doesn't have these issues or I just look at the stuff on my phone.

Also, some configuration I'd like to make cannot even be made as the tools don't support them (yet). There are also things for which I can't be bothered, like the i3 nagbar. I barely use that anyhow and screenzoom.sh is fine for when it's critical.

This "guide" isn't complete. It is meant to give a quick overview of how I use my i3wm system and what basic configuration I make so it works for me. If you happen to know any better solutions, solutions to my problems or have any comments, please reach out via hallo@nwng.eu and let me know! Thank you. :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment