Ever since Windows released the Windows Subsystem for Linux, I’ve found myself relying on the Linux shell and programs for more of my daily tasks. When I could no longer easily clear my storage, I decided it was time to switch operating systems. I had previously been playing with Arch in a virtual machine and had fallen in love with its package manager and the abundance of up-to-date packages in its repository, so I decided to dual boot Arch and Windows and see how things went. This is a write-up of my processes, experiences, and observations for reference for myself and tips for anyone who finds it useful.

First, I’ll start off by posting a screenshot of what my setup currently looks like. Some of the config was adapted from this Reddit post. The wallpaper is by a guy named Johannes Plenio.

My desktop
Yep, that's unfortuantely my desktop

Installing Arch

I decided to partition my 256 GB SSD (well not quite 256 GB) in the following manner:

  • 500 MB for EFI
  • 75 GB for Windows
  • 200 MB for boot
  • 31 GB encrypted LVM partition
    • 8 GB swap partition (in case I do something very RAM-hungry)
    • 25 GB root partition for Arch
  • 10 GB Windows recovery partition
  • 121 GB shared data partition, encrypted with BitLocker

The EFI and recovery partitions were left over from my Windows install, so I didn’t have to touch those. I first shrank my Windows partition after clean-installing Windows and turning off hibernation, paging, and anything else that would be creating files as I shrunk the partition, creating the data partition under Windows. Then I went through the install process after booting into an Arch USB drive. Interestingly, there are a few more Windows partitions that didn’t show up under Windows. Since they are located adjacently, I assume Windows combines them when viewing partitions.

The install process was a fusion of multiple guides, the one which I followed most being this one.

Filesystems

The EFI partition is FAT and Windows partition is NTFS as required. I chose to make the boot partition as well as the Arch root partition EXT4-formatted, and the shared data partition is read/written using dislocker and NTFS-3G.

Mounting

I use a combination of symbolic links and bind mounts to make my Documents, Pictures, and other large directories stored in the shared data partition. The reason I don’t put my full home directory in there is that the NTFS bitlocker partition can’t store Linux permissions, and some tools like gpg enjoy having specific permissions set on their data directories. Bind mounts are nice because they are all described in my fstab file, but programs like Nautilus confuse some of them for external drives.

AUR downloaders

While it is quite easy to build AUR packages with common tools (such as cloning the AUR repository with Git, running makepkg -s, then pacman -U), there exist programs to make this three-step process even easier. Personally, I’ve really liked Aura (which is written in Haskell!) as I can use it to install both official and user packages. There are plenty of others out there though.

Window managers

With the switch I decided to try out i3 (specifically i3-gaps), after realizing my workflow of having 10 command prompt windows open just didn’t work so well. Using i3, I’ve found myself using workspaces a lot more than I used the equivalent tool in Windows (virtual desktops). Plus it’s really fast to switch between windows when using multiple monitors. So thus far I’ve been very happy switching window paradigms.

Sway: HiDPI is not yet polished (as of writing)

Since Wayland seems to be the way of the future, I decided to try out Sway, which is a version of i3 that uses Wayland rather than X. However, both my terminal and browser (urxvt and Firefox) looked blurry under it. Sway must have been trying to scale them by 2x or something.

GNOME + i3 = simpler setup

While I couldn’t find a method using plain i3 to render applications correctly on my HiDPI display (xrandr didn’t seem to do anything), I did find a project, i3-gnome, that solves my problems. After using its desktop file then launching gnome-flashback, applications correctly scale. This method has the side effect of launching many GNOME services, but I find they make the whole setup process easier as I can use the GNOME settings application and the background processes to handle things such as WiFi, Bluetooth, blue light adjustment, color profiles, notifications, etc.

GDM

I also decided to use GDM for login. I needed to do a little extra work to enable tapping to click.

Terminals

Currently I use urxvt, but have not yet found a way to make emoji display correctly (I just get squares). The GNOME terminal displays them correctly though, so I may switch to that. Urxvt also seems to sometimes neglect re-rendering text while scrolling, which is quite strange.

Themes

Arc Dark

Arc Dark is a great dark theme. Normally screenshots of GNOME applications look atrocious, but under Arc Dark everything looks pretty. Not much other explanation is needed.

Arc Icons and Papirus

Initially, I decided to go with the Arc Icon Theme. It’s Arc so it must be great, right? However, I find the Papirus icon theme to have more icons and look nicer and more consistent in my opinion.

Polybar

I’ve been using Polybar to display things such as my i3 windows, time, wifi network, etc.

Fonts (Material Icons + Extended Material)

Since I use a HiDPI display, the siji font Polybar uses (a bitmap font), displays at half the size it should. That makes it half as easy to read. To halve the difficulty in reading the icons, I switched to both the official Material Design Icons (I think I installed that with the AUR package ttf-material-icons?) and an unofficial, extended version. The unofficial version includes all the official icons, but the official ones seem to center better (emphasis on seem). I got the font for the unofficial set via the website. The git repository hosting it also has an SVG version of the font, which embeds both icon names and character codes, that you can pull up in a text editor. This makes finding an icon by its name fairly easy because I can use GNOME’s Character Map application to search for the character code and copy the icon.

My config is below:

font-0 = "DejaVu Sans Mono:pixelsize=18;4.5"
font-1 = Material Design Icons:pixelsize=18;3.5
font-2 = Material Icons:pixelsize=18;5.5
font-3 = Font Awesome 5 Free:pixelsize=14;4
font-4 = Font Awesome 5 Free Solid:pixelsize=14;4

I included the Font Awesome fonts because the Material Design icons do not have a nice set of thermometer icons.

Spotify

There exist many, many scripts to show music player info in polybar. I use a fork I made of this one.

Transparency via Compton

To make polybar transparent, I installed the compositor compton. I could achieve the same effect by giving polybar a background image (not supported but it may be easy to add). But compton also enables nice little flashy animations like windows fading out as they are minimized. So it’s a keeper.

XPS 13 stuff and Arch wiki

The Arch wiki is an amazing resource. A stunning, beautiful, super-useful, ultra-helpful, astoundingly amazing resource. Many programs have pages on the wiki, with example config files and other info their manual pages may leave out. The wiki also happened to have a nice page on my laptop, pointing to wifi driver and bluetooth driver I needed to install to get the Broadcom chip to work, as well as the DisplayLink driver I needed to install to use my HDMI-to-USB dongle.

Rofi and Albert

Albert
Albert with the Papirus icon theme

I’ve always been fascinated by Apple’s Spotlight. Microsoft’s Cortana sufficed, but its file search was slow and never seemed to give me what I wanted. Thus, I played around with both Rofi and Albert. Personally I’ve come to prefer Albert as it displays more information per file, and I couldn’t figure out how to disable the shadows Rofi added to icons.

dict + gnome-dictionary

GNOME Dictionary

Albert has a nice extension to look up words in a dictionary, so I’ve been using GNOME Dictionary a bit. However, the default setup of the app requires internet access. Interestingly, there exists a nice program (dictd) that allows you to set up your own dictionary server compatible with GNOME Dictionary. There exist a plenitude of tutorials on integrating dictd and GNOME Dictionary online, so I won’t write my own here.

AUR dictionaries

It seems all dictd dictionaries are in the AUR. Below are the ones I’ve installed:

  • dict-devils: A dictionary limited in scope but unlimited in wit
  • dict-foldoc: More computing words and acronyms than you thought were possible
  • dict-gcide: The Collaborative International Dictionary of English. This is what most of the GNOME Dictionary searches yield results from.
  • dict-wikt-en-all: The English Wiktionary. Just like Wikipedia, it has a lot of entries. Like everything.
  • dict-wn: Wordnet, another dictionary full of entries

There are likely more, but these cover most words in the English language.

i3 bindings for screenshots

Initially, I made a key binding that used scrot to take screenshots. It took me a little while to find out that I needed to use the --release option with bindsym to make mouse selection (the -s option with scrot) to work. However, scrot’s rectangle selections never turn out to be nice rectangle selections and instead end up as modern art selections. Preferring to avoid artifacts rather than view modern art, I switched to Slop and Maim, which do not have this problem.

Grabc and xzoom

For color picking, my current workflow is to zoom in on the region I want to grab the color of using xzoom, then use grabc to capture the color from the zoom window. It’s not great, but it’s the best I’ve come up with so far.

Firefox mods

I’ve been using Firefox for a variety of reasons, but one of the main ones being the user interface is very customizable through CSS.

Tab bar hiding

One such modification was that I hid the tab bar. Since it takes up valuable space, I memorize my small number of tabs (or forget about them), then use multiple windows and i3’s tabbing system to accommodate more tabs. This is accomplished with the following line, placed inside the userChrome.css file:

#tabbrowser-tabs { visibility: collapse !important; }

Dark theme "support"

With a dark theme, text inputs will sometimes inherit the dark background colors and light text of the GTK theme being used. The Arch Wiki of course documents this problem and gives several solutions. Personally, I launch Firefox with the light Arc theme.

Useful apps

Okular vs. Evince

For viewing PDFs, I’ve tried using the editors from both KDE and GNOME. For annotating, Okular has much greater support (you can draw and edit highlighting colors), while GNOME has much more limitted features in regard to annotating. However, I’m not a big fan of the sidebar and like how many GNOME apps forgo menubars (at least while viewing them in i3).

Kvantum

Being based on KDE platforms (QT to be specific), Okular doesn’t obey GTK themes and does not fit in at all by default. To fix this, I’ve installed the theme manager Kvantum that has an Arc-Dark theme inside of it. This one looks pretty darn close to the GTK theme.

To enable it for all apps, I’ve added the following line to my /etc/environment file along with a few other variables that make Qt scale correctly (credits to the commenters in this GitHub issue for the HiDPI fixes:

QT_STYLE_OVERRIDE=kvantum
QT_SCALE_FACTOR=1
QT_AUTO_SCREEN_SCALE_FACTOR=0
QT_SCREEN_SCALE_FACTORS=2

Festival

Sometimes it’s nice to have text I’m writing read back to me via text-to-speech. Festival is a nice little tool for this purpose, and there’s also an Emacs script that uses festival to read selected text.

Continued over

There’s also a number of programs I used under WSL that I’ve still found super useful. They are listed below.

  1. Fish

    After using bash for some time, I switched to zsh because of the pretty powerline bars and plugins made available by Oh My Zsh. However, it was much slower than bash under the Windows subsystem. So I found the next best thing, fish, and started using it. Soon, I discovered the slightly different syntax didn’t matter too much to me (I can still write shell scripts in bash), and started relying on the history auto-suggestions. So I’ve continued using that.

  2. Weechat

    While Weechat is primarily an IRC client, it has plugins that support things such as Matrix, which I use. I also somewhat recently discovered it has a package for Emacs, so I don’t even need to use the command line interface! Although compared to many other command-line chat applications, weechat’s interface is far, far superior.

  3. Fzf

    In cases that I need to do a fuzzy search over my terminal history, fzf is wonderful. The page also has a nice little script to do a fuzzy search over launched processes then kill the ones you select.

  4. Pass

    Pass is an extremely minimalistic password manager, but it supports syncing with git! This means I can reuse the git server I have at my home to sync my passwords across my laptop and phone! You have no idea how wonderful this has been.

  5. Exa

    I’ve aliased ls to Exa, which provides tree listings and more coloring than the built-in tool. The main reason I use it is for the colors though.

Discurses and Hangups and BitlBee

For two of my three most used chat applications, Discord and Hangouts, I initally used the separate client Discurses and Hangups. However, these applications don’t have an interface as feature-filled as weechat. For example, it’s difficult to navigate through Discurse’s channel list. Eventually, I found an application called BitlBee which spawns an irc server that can proxy my Discord and Hangouts accounts. The Discord plugin for BitlBee was fairly easy to set up, but the Hangouts one was more involved. There are nice instructions here. The only problem is that because I run BitlBee on my laptop, it won’t always be connected to the internet, and may not fetch every message that comes my way. I’ve had to resort to my phone or web applications to look up history, and BitlBee to send messages.

Drawing — still no solution

Drawing with Gromit-MPX
Some flowers I drew with Gromit-MPX on top of pipes.sh

One of the features I most miss from Windows is the Ink Workspace. Unfortunately, I have not found a suitable equivalent for Linux. Krita seems to come the closest, but it uses the touchscreen only for moving the canvas around. A mouse or pen or tablet are needed to do the drawing. GIMP supports touchscreen drawing, but it’s a bit more than a simple drawing application. The best option I’ve found so far is Gromit-MPX, which allows you to draw over your screen, but it’s still far from the Window’s ink workspace.

Touchegg: gestures

There’s a program called Touchegg that allows custom gestures on touchscreens and mice. I haven’t looked into it much, but it seems promising.

Notifications

A notification from Dunst

While GNOME Flashback does display notifications, I wanted a little more control over their appearance. Thus, I use Dunst. Above is how I configured mine.

Battery life

This was one of my biggest worries with Linux. Thus far, it’s been only somewhat worse than Windows. Apparently, people have gotten 20 hours of battery life with Linux and my laptop, but I have yet to achieve that. Maybe one day…

Conclusion

Thus far, things have been looking good. It’s refreshing being able to use a system I can configure with short commands from the terminal. And I’m really liking the tiling window paradigm. It’ll be interesting to see how far this goes.