A quick bugfix release of i3 – version 4.5.1

This release fixes, among others, a high memory consumption problem in i3 4.5. The issue, as explained by Michael, is a result of a human mistake in the release process. For full details of a bug report, see this. The new release fixes the problem, as well as, introduces a few other changes.

Feel free to use my SlackBuild script to build the latest stable release of i3 including all the bugfixes. The builds for Slackware 14 and the -current branch are available here:

http://slackword.net/files/builds/i3/i3-master/

Enjoy

i3wm 4.5 on Slackware

Having come back from my holiday I found a pleasant surprise in the form of a new i3 release which contains a lot of bug fixes and cleanups. For a list of all the changes in the new version, please refer to the release notes.

As usual, you can grab a SlackBuild for i3wm 4.5 here. As explained in my previous posts, this SlackBuild is aimed at Slackware-current and will NOT work for Slackware 14 or older.

Furthermore, regardless of the Slackware version you use, I’d like to encourage you to use SlackBuilds (Slackware14, Slackware-current) pulling the master branch of the i3 window manager. See the explanation in my previous posts.

Enjoy!

i3 Window Navigation Tips

i3wmNavigating between windows, especially in a multi-monitor environment can pose a real challenge at times.

You work on a very important project and have a number of windows scattered over a few workspaces and monitors. Some of them are just opened for visual reference while others need to be regularly re-visited. An obvious solution would be to group windows in a logical way so that it is easy to switch between them. Depending on the number of windows and your working habits, this might not be enough. Fortunately, i3 offers some shortcuts or easy ways of creating such shortcuts. These might not look like life savers at first but, if used efficiently and on a regular basis, over time they can add hours or even days to you precious coding time. I will present a few tips with the best (IMHO) left till the end: the use of vim-like goto marks.

Going Back and Forth

Imagine you are working on one of your workspaces and you just quickly need to check something on workspace 4 so you press $mod+4 to switch to it. Once you have checked it, you don’t have to remember the number of the previous workspace. You just need to press $mod+4 again and you’ll return to whatever workspace you were working on. To enable this functionality, make sure you have the following line in ~/i3/config:

workspace_auto_back_and_forth yes

But it gets even better. The following key binding lets you switch back and forth between the last two workspaces that you visited pressing the $mod+z key combination.

bindsym $mod+z workspace back_and_forth

Furthermore, you can move windows back and forth with:

bindsym $mod+Shift+z move container to workspace back_and_forth

You could combine the two actions so that you move a window backwards and forwards and follow it.

bindsym $mod+Shift+z move container to workspace back_and_forth; workspace back_and_forth

Configure focus on keybindings;;dfafdad

Sometimes it would make sense to hard-code focusing on certain windows:

bindsym $mod+Shift+b [class="Firefox"] focus
bindsym $mod+Shift+i [class="Terminal" title="weechat"] focus

Using the last key binding will bring focus to an instance of Terminal running the weechat irc client. You can identify particular windows using the xprop client property displayer. Sometimes, however, it might not be easy to identify a client and that’s where vim like goto marks come in handy.

Goto marks in i3

Goto marks let you mark a window on the fly so that you can focus on it at a later time. Please bear in mind that they do not modify your config file so they will be lost if you exit i3. They are meant to be session specific or for windows that are difficult to identify. I will present a few ways you can use them to focus on windows.

The first method is by explicitly naming particular windows and calling them by name.

bindsym $mod+m exec i3-input -F 'mark %s' -P 'Mark name: '
bindsym $mod+Shift+m exec i3-input -F '[con_mark=%s] focus' -P 'Go to mark: '

When the focus is on the window that you’d like to mark, you can press $mod+m and type the mark name, for example: ks (short for the terminal window where you edit kernel source). You can name a few windows that you visit regularly giving them other, ideally short labels and the marks will be stored for the duration of the i3 session.

Then you can immediately access (ie. focus on) them from any workspace or display by pressing $mod+Shift+m and typing an appropriate mark name, eg. ks.

An alternative approach would be to use numbers or letters with Emacs-like modes.

mode "mark_window" {
                bindsym 1 mark m1
                bindsym 2 mark m2
                bindsym 3 mark m3
                bindsym 4 mark m4
                bindsym 5 mark m5
                bindsym a mark ma
                bindsym b mark mb
                bindsym c mark mc
                bindsym d mark md
                bindsym e mark me

                bindsym Return mode "default"
                bindsym Escape mode "default"
}

mode "go_to_window" {

                bindsym 1 [con_mark="m1"] focus
                bindsym 2 [con_mark="m2"] focus
                bindsym 3 [con_mark="m3"] focus
                bindsym 4 [con_mark="m4"] focus
                bindsym 5 [con_mark="m5"] focus
                ...
                                                                                           
                bindsym Return mode "default"
                bindsym Escape mode "default"

}

bindsym $mod+g mode "go_to_window"
bindsym $mod+m mode "mark_window"

Pressing $mod+g you enter the mark_window mode where a new set of keybindings (defined above) applies. Please note that it’s essential that you specify a way of returning to the default mode. Otherwise, you might get stuck as standard i3 keybinding do not work inside modes unless explicitly set. After you’ve entered the “mark_window” mode, you can press, eg. 1 to set a mark on the currently focused window and press Esc or Enter/Return to exit to the default mode. Now whenever you want to jump to window marked as 1, you’d go to the go_to_window mode, press 1 and exit the mode: $mod+g 1 Esc.

All-in-one approach using an i3 mode

The most optimal option, however, could be combining all the above mentioned tips under one mode where you could define your hard coded keybindings, leave an option for adding on-the-fly window labels, as well as use numbers for tagging windows.

mode "focused" {

                # hardcoded focus keybindings
                bindsym b [class="(?i)firefox"] focus
                bindsym w [class="(?i)terminal" title="weechat"] focus
                bindsym m [class="(?i)thunderbird"] focus
                bindsym f [class="(?i)terminal" title="mc"] focus
                bindsym z [class="(?i)zathura"] focus

                # keybindings for marking and jumping to clients
                bindsym a exec i3-input -F 'mark %s' -P 'Mark name: '
                bindsym g exec i3-input -F '[con_mark=%s] focus' -P 'Go to mark: '

                # Assign marks to keys 1-5
                bindsym Shift+1 mark mark1
                bindsym Shift+2 mark mark2
                bindsym Shift+3 mark mark3
                bindsym Shift+4 mark mark4
                bindsym Shift+5 mark mark5

                # Jump to clients marked 1-5
                bindsym 1 [con_mark="mark1"] focus
                bindsym 2 [con_mark="mark2"] focus
                bindsym 3 [con_mark="mark3"] focus
                bindsym 4 [con_mark="mark4"] focus
                bindsym 5 [con_mark="mark5"] focus

                # Exit to the default mode
                bindsym Return mode "default"
                bindsym Escape mode "default"
}

bindsym $mod+n mode "focused"

Enjoy!

i3 4.4 on Slackware (available for -current)

Today’s batch of updates in the -current branch of Slackware has brought some interesting changes. If you have been following this blog, you may have guessed that what was particularly interesting to me was the inclusion of cairo-1.12.14 which ships with the XCB backend enabled by default:

Fri Feb 22 01:09:25 UTC 2013
Lots of X updates in this batch! We were finally able to upgrade to the
latest cairo (including the long-requested XCB backend), as the text
corruption bug that was preventing that was fixed in the upstream X server.

This update makes it possible to build the latest version (ie. 4.4) of the i3 window manager without disabling Pango. For more details, see this post. I have updated my SlackBuilds for i3-4.4 (or to be specific the master branch, which contains the latest stable release + bug fixes). The SlackBuilds are available for downloads from here:

http://slackword.net/files/builds/i3/i3-master/

or from github:

https://github.com/mherda/slackbuilds/tree/master/i3/i3-master

Enjoy and let me know of any problems you might have. On a separate note, thank you Patrick for so many goodies in this batch of updates.

i3 4.4 on Slackware

i3wmEverybody knows that tiling window managers are the cure to all the world’s problems.

…and with the recent release of i3 v. 4.4, the world should sigh with relief. Having thoroughly inspected i3 source code, I can assure everyone that the world is NOT going to end tomorrow or any time soon.

Now that I have hopefully put your mind at rest, we can focus on the new i3 release. As I blogged a few months ago, the 4.3 introduced the pango support for rendering text which resulted in the package not compiling on the stock Slackware installation (see details). The situation has not changed with the release 4.4. At the moment of writing this, Slackbuilds.org offers i3 4.2 which is the last version that works flawlessly without any hacks. If you would, however, like to run i3 4.3+ you can either recompile the stock Slackware cairo package with enabled xcb support or disable pango support in i3. Again, I have chosen the latter option as being less intrusive on a Slackware system.

Below are my updated SlackBuilds scripts for the most recent stable version of i3. The Slackbuild is not written for any particular version of i3, such as 4.3 or 4.4. It automatically pulls the source from the ‘master’ branch of i3 git repository, which is the most recent “stable” release + any bug fixes.

i3 master branch SlackBuilds

One of the new features included in this release is i3-dmenu-desktop, a dmenu wrapper for .desktop files. The feature was discussed in one of the threads of i3 mailing list. To see the full list of changes and bug fixes, please visit 4.4 release notes.

Update: See the update to this article here.
Happy tiling!!!

i3 4.3 on Slackware

I welcomed yesterday’s release of i3 4.3 with excitement. Having been busy elsewhere, I did not follow the ‘next’ branch of i3 git repository and, therefore, was not aware of what’s cooking. The moment I started building a new shiny package, my excitement somewhat subsided.

Pango support

Version 4.3 introduces pango support for rendering text, which would be a great news if not for the fact that an XCB backend support was still an experimental feature (and, therefore, disabled by default) in cairo 1.10.2, the version that Slackware (14rc5) ships with. In consequence, for i3 >= 4.3 to build on Slackware, one would have to upgrade the stock cairo package. The XCB backend has apparently reached a stable status and is enabled by default in cairo version 1.12.2+. As always, Pat is the person to decide whether it is mature enough for Slackware. Hopefully, it is and it’ll enter the -current branch of Slackware in the next development cycle. (Update: See Pat’s comments on the issue).

An alternative solution (which I have chosen) was to disable pango support in i3 4.3. As this feature is an integral part of i3wm 4.3, disabling it is not recommended by Michael Stapelberg, i3 author and main developer (4.3 release notes):

Another very important change is that we now support pango for rendering text. The default is still to use misc-fixed (X core fonts), but you can use a font specification starting with “xft:” now, such as “xft:DejaVu Sans Mono 10″ and i3 will use pango. The sole motivation for this is NOT to have fancier window decorations, but to support fonts which have more glyphs (think Japanese for example) and to support right-to-left rendering (open http://www.ftpal.net/ for an example). Supporting users from all over the planet is important, and as such I would strongly advise distribution packagers to leave pango support enabled. In case you are working on a very low-spec embedded device, it is easy enough to disable pango support, see common.mk.

Personally I do not need it so am going to run 4.3 (pango disabled) until cairo gets upgraded in Slackware (I’m not in a hurry:)). You can do the same but don’t say you haven’t been warned!!!

Here is my SlackBuild script for i3 v 4.3 (pango disabled). Please note that I pointed it to the master branch of i3′s git repository which basically is the latest stable release + bug fixes, which at the moment of writing is 4.3. Should a new version be released, eg. 4.4, the script will automatically pull it from the git repository. Unlike with standard SlackBuilds there’s no need to manually download the source code.

Feel free to use it but bear in mind that, at the moment of writing it, a recommended version of i3 to be run on Slackware is i3 4.2 which is available from SlackBuilds.org so if you don’t like living on the edge, please stop reading now and stay with 4.2!

Now for the fun part.

What’s new?

Apart from the above mentioned pango support (which we have disabled) there are lots of bug fixes and some new features available with this release. I particularly like the ability to specify the layout for the parent split container:

 for_window [class="XTerm"] layout tabbed

When I start i3 both Firefox and Thunderbird start on Window 2. Up until now it was not possible (or easy) to make them automatically open in a tabbed mode. This ensures that Window 2 (and only 2) starts in a tabbed mode.

assign [class="Firefox"] 2
assign [class="Thunderbird"] 2
for_window [class="Firefox"] layout tabbed
exec firefox
exec thunderbird

Layout toggle

In 4.3 you can still use the old “split h” and “split v” commands. On top of that, the old “layout default” command has been replaced with “layout toggle split”, which changes the orientation (horizontal/vertical) of windows. If you have an old config file, find “layout default” and change it to “layout toggle split”. On my system it’s bound to “Mod1+e”. Open a few terminal windows and play with this command changing the focused window from time to time.

Thunar doesn’t automount usb drives in i3 (Slackware-current)

Monitoring Slackware’s irc channel has always been a pleasurable experience. Most of the time it is also extremely informative. Yesterday on #slackware someone reported that Thunar doesn’t automount usb drives under i3 any longer. It also applies to some other window managers. The solution involves adding dbus-launch –exit-with-session to your .xinitrc:

# Start the window manager:
if [ -z "$DESKTOP_SESSION" -a -x /usr/bin/ck-launch-session ]; then
  exec ck-launch-session dbus-launch --exit-with-session /usr/bin/i3
else
  exec /usr/bin/i3
fi

Task integration into the i3 statusbar

Recently I have been playing with TaskWarrior which is a very powerful command line todo list manager. I’ve decided to integrate it with my i3 statusbar and enable key bindings for some basic list management.

Here’s a very basic sample of Task’s output:

[sycamorex]~% task ls

ID Project Pri Description
4         H   Create a blog post
1             Configure Mutt
2             id3 tags
3             Email Linus T.
5             zsh prompt

5 tasks

i3status bar configuration
I’ve added some customised code to the i3statusbar.conf file to display the most urgent task in the statusbar.

Please note that the LG line below might safely be removed as it’s responsible for printing they current keyboard layout.

#!/bin/sh
i3status | while :
do
    read line
    echo "TODO:$(task ls | sed -n '4s/[[:blank:]]\+/ /pg' )\
| LG: $(setxkbmap -print | grep xkb_symbols | awk -F"+" '{print $2}') \
| $line" || exit 1
done

The above file will be executed from i3′s main config file ~/i3/config:

bar {
        status_command ~/.i3/i3status.sh
}

i3statusbar

As you can see from the screenshot, it is task number 4. The H letter after the task number indicates that the task is of a high priority which results in it being displayed at the top.

Furthermore, you can use some keybindings to mark the task completed and therefore remove it from the status bar displaying another task in the queue.

bindsym $ms+Shift+D exec task $(task ls | awk 'NR==4  { print $1 }') done
bindsym $ms+t exec urxvt -title taskwin -e sh ~/.i3/display_tasks.sh
for_window [title="taskwin"] floating enable

As you can see, I have also created a keybinding (MS + t) to quickly view all my task in a floating window. It works similarly to i3′s idea of scratchpad and I might actually have used it here. Below is the contents of display_tasks.sh:

#!/bin/sh
task ls
read -p "Press Enter to close the window."

It all works fine if you use a simple and linear structure of todo lists. If, on the other hand, they include a number of projects/categories with each of them having their own set of priorities, you could modify the task command. The following command will display the most urgent task from the “work” project/category.

task project:work ls | sed -n '4s/[[:blank:]]\+/ /pg'

A better approach would be to be able to switch between categories using keys but that’s not what I personally need.

HTH

Installing i3 wm 4.2 on Slackware

Update: I’ve taken over the maintenance of i3 and i3status on SlackBuilds.org so the scripts there have been updated and ready for you to use.

Everybody knows that tiling window managers are the cure to all the world’s problems. Not everybody knows, though, that i3 windows manager offers much more than that. It additionally offers a highly customisable working environment that lets you effectively do your work without any distractions. Both happiness and a productive working environment are just a few keystrokes away. Follow the next few paragraphs to reach the state of programming nirvana.

As SlackBuilds.org still offers version 3.x of i3 window manager, I decided to write a SlackBuild for version 4.2. Despite the fact that there are some fundamental configuration differences between versions 3.x and 4.x, the installation processes are almost identical. For that reason I decided to adapt the official i3 slackbuild to work with 4.2 (the latest stable release as of the moment of writing.)

i3wm Installation Process

The installation process is pretty straightforward. First of all, you need to install necessary dependencies: libev, yajl and dmenu (all of them available on slackbuilds.org). There are also optional dependencies that will greatly improve i3′s functionality (I’ll cover them in a separate section as they can be installed later.)

Having installed the required dependencies, you can either download my updated installation scripts and i3 source code or a precompiled binary package (x86_64 only):

Update: Please do not use the scripts below. They are only here for archival reasons. Please visit the SlackBuilds website for the latest versions of the scripts.
i3-4.2 source
i3 slackbuild
i3 package (64-bit)

Optional dependencies (highly recommended – especially i3status)

Optional dependencies include i3lock (a screen locker) and i3status (a status bar generator.)

i3lock

As far as i3lock is concerned, I didn’t bother even trying to install it as it requires PAM which is not included in Slackware. Instead I use slock (available from slackbuilds). The usage of slock is amazingly simple: run it (through dmenu, terminal or previously assigned keybindings) to lock the screen, and type your password to unlock it (if you mistype your password, press Esc to clear it and type the password again.)

i3status

i3status is a status bar generator which will help you display all sorts of information. You could stick to version 2.1 which is available from slackbuilds.org.
In that case you might need to set the option: output_format = none. Otherwise I’d recommend installing i3status 2.5.1. Regardless of the version you choose, you need to install ‘confuse’ (available from slackbuilds.org). Please note that you don’t have to install dzen2 with the latest versions of i3/i3status. If you decide to install v. 2.5.1, you can use my slackbuild scripts or a precompiled package (64-bit only):

Update: Please do not use the scripts below. They are only here for archival reasons. Please visit the SlackBuilds website for the latest versions of the scripts.
i3status source
i3status slackbuild
i3status slackware package (64-bit)

Once you’ve installed all the packages, you can set up the default X environment by issuing xwconfig as a standard user and run startx. If no previous i3 configuration is present, you’ll go through a short configuration wizard. You can accept the default settings. They are reasonable and a great starting point for your customisations. The project website offers great documentation (link), as well as a recently opened stackexchange-like FAQ section.

You should see a status bar at the bottom of the screen. To start your modifications, copy /etc/i3status.conf to ~/.i3status.conf where you can place your changes.

A new release of i3 window manager

Last week the i3 development team released version 4.2 of their superb tiling window manager. Among a number of new features, there was one that particularly caught my attention, a scratchpad command. The command creates a scratchpad container where any of your windows can be placed and displayed on demand. The scratchpad container gets displayed in the centre of a window in a floating mode. It’s a convenient place for windows that you do not want displayed all the time. Personally, I can think of the following uses of the scratchpad container: ncmpcpp, mc, bash prompt, email, REPL, or simply, as the name suggests, a scratchpad with emacs inside. Yes, you can have more than one scratchpad container.

How to use the scratchpad

First you need to edit your i3 config file (~/.i3/config)

# Make the currently focused window a scratchpad
bindsym $mod+o move scratchpad
# Show the first scratchpad window
bindsym $mod+i scratchpad show

First you move a currently focused window to a scratchpad with Alt+o, then you can toggle show/hide with Alt+i to see how it works. You can move more windows to the scratchpad. If you work on a dual-monitor setup, you can move the scratchpad between the screens with the standard move command as well as bring a window back to a normal tiling flow by disabling a floating mode on it.