New config merged!

It's been a long time since the last post here - a new update is way overdue, especially seeing that the new config was merged a week ago!

Apologies for the delay! After my exams and holidays were finished, I worked for another two days full-time (plus some more) last week. Shortly after that I wanted to write this blog post, but I was busy talking to people about their issues with the new config, fixing a lot of little bugs, and opening issues for everything which might take a bit longer.

For everyone wondering about my exams: They went great! It was quite annoying that I had to pause working on qutebrowser before the new config was merged to focus on learning, but it definitely was the right decision.

End of the crowdfunding

Unfortunately, this also means the crowdfunded time of working full-time on qutebrowser is finished (at least for this year!). As usual, I'll work as much as my time permits in my free time on it, though!

Also, I still haven't had the time to take care of t-shirts yet. This is something I plan to look at mainly at weekends, to coordinate with my girlfriend who'll recieve the package (as she's in Austria which is in the EU, and I'm planning to ship them from Germany again. Turns out getting things over the border from Austria to Germany is much easier than Switzerland to Germany).

Back to the good news: I've mentioned it above briefly, the new config is finally merged! Some more details about what that means and what has happened since the last blogpost will follow.

The big merge

I wanted to merge the branch as fast as possible (as pull requests against the master branch started to pile up), but there were still some things I wanted to do before shipping out the new config to everyone:

  • Fixing some bugs which caused the testsuite to fail on the new-config branch.
  • Merging the newest master with the new completion code into new-config and resolving a lot of conflicts (thanks to Ryan Roden-Corrent / @rcorre who did a lot of work on this!)
  • Various changes to the module getting filesystem locations (such as the config dir) in order to move data to more correct locations on macOS and Windows.
  • Removing support for ambiguous keybindings shadowing each other, and the related input.ambiguous_timeout setting which mostly confused people.
  • Changing the JavaScript log level setting (javascript.log) to be able to map JS loglevels to different qutebrowser loglevels on QtWebEngine.
  • Implementing support for a file for manual configuration for advanced users.
  • Improving error handling so all errors happening in get caught properly and displayed combined if possible.
  • Changing the default behavior for Up/Down in command mode to go through the command history, which hopefully makes that more discoverable.
  • Adding a configdiff page which shows changes in the old config compared to the default, to make it easier to migrate. This was surprisingly easy thanks to Python's difflib module.
  • Adding a documentation page for how to configure qutebrowser with the new config.
  • Fixing a bug related to escaping HTML in various prompts, which became visible with the config errors.
  • Many little bugfixes and improvements.

Here's how things looked like right before the merge:

226 files changed, 13144 insertions(+), 14030 deletions(-)

Then on September 16th, I finally merged in all those changes as it was ready to roll out to a bigger amount of people. The feedback I've gotten since then was quite positive, but there was still a lot to do after the merge!

After the merge

With the new config finally merged, I started some additional work and of course acted upon the feedback I got from users.

The first thing I did was adjusting a lot of code to make it possible to initialize the config very early, before Qt's QApplication object exists. This makes it possible to configure things like the backend to use, or what commandline arguments to pass to QtWebEngine/Chromium. There was a bit of work involved as Qt's functions for getting e.g. the user's config dir appends the application name, but Qt doesn't know about that before the QApplication exists. To make this work, qutebrowser now appends the directory if it isn't there yet, and has a test ensuring that those locations match the one Qt would return with a QApplication. With that change, support for migrating data written by QtWebEngine before qutebrowser v0.9.0 was also dropped, in the hope that nobody uses it anymore.

With that done, I was finally able to add a qt_args and backend setting, hopefully making qutebrowser wrapper scripts unnecessary!

Also, I decided it was finally time to drop support for old Qt/Python/QtWebKit versions, like announced some while ago. This meant I could delete almost 1000 lines of code dealing with those old versions (and make other code more readable) - and to my surprise, nobody has complained yet!

That change drops support for Python 3.4, Qt < 5.7.1 and legacy QtWebKit (but not the updated fork). This mainly affects Ubuntu Trusty / Debian Jessie (where you need to get a newer Python from somewhere and install the rest manually) and Gentoo (where you need to install a Python 3.5/3.6 from "unstable" and a newer QtWebKit or QtWebEngine).

I also introduced the attrs library as a new dependency, making writing "data classes" in Python much more easier. A lot of projects started using it recently, as it definitely helps cutting down a lot of boilerplate code (to the point that it's discussed whether Python should add a similar feature to its standard library).

Then I started reviewing crash reports and pull requests I've been ignoring because of my exams, as well as fixing lots of small bugs with the new config (which is still ongoing).

Other work

A quick overview about other things which have happened since the last post on July 7th:

  • The new completion was merged! @rcorre has been working on this for over a year, so we're both glad it was finally finished and merged. This means big speed improvements especially for the :open completion, and easier writing of new completions inside qutebrowser.
  • :download now uses the page title as filename in some cases.
  • The status bar gained a new back/forward indicator.
  • Messages are now shown longer if there are many of them.
  • The PyOpenGL dependency was dropped by using a simpler workaround for OpenGL issues with QtWebEngine.
  • Lots of other smaller work!

Moving on

My studies started again last week, so things are going to be a bit slower again going forward.

After the current smaller issues with the new config are fixed, the next things I want to take care of are what's missing to finally make QtWebEngine the default backend everywhere.

Once that's done, the last important missing bit is per-domain settings. Those will still be some work, but now that the new config is in, it'll be much easier to make it happen.

I'd really like to release v1.0.0 before November 14th, when Firefox 57 will be released (dropping support for legacy addons, and thus Vimperator and Pentadactyl). I think per-domain settings are a feature which definitely should be in v1.0.0, so I'll try my best to make it happen until then.