Missing tray icon on Ubuntu-derived distributions

If you are a MATE desktop user using a Liferea 1.10.xx package installed from the official package repositories of your Linux distribution and since the switch from 1.8.xx the trayicon went missing then the reason is very probably that you are using a package build by Ubuntu for the Unity desktop that strips the trayicon support.

You can verify wether this is the case in the "Preferences" dialog which should look like this

If the trayicon option is not visible than the package doesn't support a trayicon.

This is known to be the case for at least Mint17.

PHP preg_replace() Examples

This post gives some simple examples for using regular expressions with preg_replace() in PHP scripts.

1. Syntax of preg_replace

While full syntax is

mixed preg_replace ( mixed $pattern , mixed 
$replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

2. Simple Replacing with preg_replace()

$result = preg_replace('/abc/', 'def', $string);   # Replace all 'abc' with 'def'
$result = preg_replace('/abc/i', 'def', $string);  # Replace with case insensitive matching
$result = preg_replace('/\s+/', '', $string);      # Strip all whitespaces

3. Advanced Usage of preg_replace()

Multiple replacements:

$result = preg_replace(
    array('/pattern1/', '/pattern2/'),
    array('replace1', 'replace2'),

Replacement Back References:

$result = preg_replace('/abc(def)hij/', '/\\1/', $string);
$result = preg_replace('/abc(def)hij/', '/$1/', $string);
$result = preg_replace('/abc(def)hij/', '/${1}/', $string);

Do only a finite number of replacements:

# Perform maximum of 5 replacements
$result = preg_replace('/abc/', 'def', $string, -1, 5);

Multi-line replacement

# Strip HTML tag
$result = preg_replace('#.*#m', '', $string);

Writing Liferea Plugins Tutorial (Part 1)

Some time ago a fellow Liferea user asked about documentation on writing Liferea plugins. I see the need and the benefit and want to start doing so with a series of blog posts that later can be compiled into a tutorial to be included on the website/sources.

Plugins with GObject Introspection

First it is important to know that Liferea 1.10+ uses GObject Introspection (GI) and libpeas to allow implementing plugins. This quote from the GNOME wiki explain how GI works:

GObject introspection is a middleware layer between C libraries (using GObject) and language bindings. The C library can be scanned at compile time and generate a metadata file, in addition to the actual native C library. Then at runtime, language bindings can read this metadata and automatically provide bindings to call into the C library.

The important point is: by Liferea using GI (as all GNOME applications and many other GTK applications do now) plugins can be written in practically any scripting language. Most users seem to favour Python and all current plugins included with the Liferea sources are in Python. Note that this tutorial will also focus on Python only.

How are plugins triggered from with Liferea?

Ok, I can write a script in Python! How will Liferea run it and when?

This is where libpeas comes in, which is a basic library to implement a plugin system. If you click the preferences dialog and switch to the "Plugins" button you see a dialog provided by the PeasGtkPluginsManager class of libpeas. Detection, activation and configuration of plugins is handled by libpeas.

Now for the "When?" question: To properly allow applications to hook plugins into different parts of the applications libpeas allow an application to define one or more so called "Activatable" interfaces.

For simplicity for Liferea I decided to only support a LifereaShellActivatable interface. This means all plugins are activated together with the LifereaShell instance (src/ui/liferea_shell.c). This class represents the main application window holding all widgets. So when your plugin gets activated all widgets exist and you can access everything like extending or modifying the GUI, changing settings, everything you can think of.

Note: in the code there are two more interfaces:

  • LifereaAuthActivatable
  • LifereaMediaPlayerActivatable

that are used to implement two important features (GNOME keyring support and a simple media player). Feel free to use those two, but be aware that they work differently and activate at other times and not just once as the LifereaShellActivatable.

Using LifereaShellActivatable

If you script in Python using LifereaShellActivatable means simply deriving a new class from it. For example:

from gi.repository import GObject, Peas, PeasGtk, Gtk, Liferea, Gdk
class ExamplePlugin (GObject.Object, Liferea.ShellActivatable):
__gtype_name__ = 'ExamplePlugin'
object = (type=GObject.Object)
shell = (type=Liferea.Shell)
def do_activate (self):
# Do something here...
def do_deactivate (self):
# Maybe do somethin here too...

The activate() and deactivate() methods are required by libpeas and provide you with the starting points to do stuff. By fetching the "Liferea.Shell" instance you gain access to the main window. Using this you can both lookup widgets or other Liferea classes like the Liferea.FeedList to perform actions against business objects of Liferea.

Providing a plugin configuration

Along with the actual plugin code libpeas requires a plugin configuration file defining the language the plugin is implemented with and metadata (name, description, website...) for this plugin. Such a file looks like this:

Name=Example Plugin
Description=Illustrates how to implement plugins in Liferea
Authors=Lars Windolf 
Copyright=Copyright © 2014 Lars Windolf

Most important is the "Loader" setting indicating the correct scripting language and the "Module" setting which together with the "Loader" setting as "python" indicates that or plugin script is to be named "". Both the "" plugin script and it's "example.plugin" config file need to be put into the Liferea plugins directory...

Where to put my plugin script?

There are two possible locations for the plugin script (and it's configuration file):

  • For user provided plugins: usually ~/.config/liferea/plugins
  • For package provided plugins: usually /usr/lib/liferea/plugins

Note that paths can be different with different XDG settings.

When writing and testing don't bother installing the plugin in the package directories. Just put it in ~/.config/liferea/plugins, fire up Liferea.

More about how to check for activation, debug problems and handling enabling/disabling in the next installment of this tutorial!

Getting rid of Bash Ctrl+R

Today was a good day, as I stumbled over this post (at hinting on the following bash key bindings:

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'

It changes the behaviour of the up and down cursor keys to not go blindly through the history but only through items matching the current prompt. Of course at the disadvantage of having to clear the line to go through the full history. But as this can be achieved by a Ctrl-C at any time it is still preferrable to Ctrl+R Ctrl+R Ctrl+R Ctrl+R Ctrl+R Ctrl+R Ctrl+R Ctrl+R Ctrl+R Ctrl+R Ctrl+R Ctrl+R Ctrl+R Ctrl+R Ctrl+R Ctrl+R Ctrl+R Ctrl+R Ctrl+R ....

Liferea 1.10.12 Released

This is a new maintenance release.

The Changes:

	* Fixes Github #86: Support HTTP content negotiation
	  (suggested by DanMan)
	* Fixes Github #98:  Stop calling Atom person constructs w/ URI invalid
	  (patch by Aristotle Pagaltzis)
	* Fixes Github #100: Problems with dark Adwaita theme in GTK 3.14
	  (reported by majutsushi)


You can download the release on Github:

Liferea 1.11.1 Released

There is a new maintenance release for the unstable line: Liferea 1.11.1 with the following changes:

    * Fixes Github #81: Inability to add subscriptions
      (reported by GreenLunar)
    * Fixes Javascript links not opening in new browser tabs

    * Updated Hebrew translation (Genghis Khan)
    * Fixes Github #88: Minor DE translation mistake (moraxy)


You can download the release on Github:

Liferea 1.10.11 Released

This is a new maintenance release.

The Changes:

    * Fixes Github #53: Doesn't automatically update feed name and favicon
      for new feed (reported by asl97)
    * Fixes Github #67: Missing dist files for documentation
      (patch by Mikel Olasagasti)
    * Fixes Javascript links not opening in new browser tabs

    * Updated French translation (Guillaume Bernard)
    * Updated Hebrew translation (Genghis Khan)


You can download the release on Github:

Linux Desktop Feed Reader Usage Declining?

When working on your open source pet project there is always the ego boost of asking yourself how popular is this thing that we are building. Who is using it? Why is there no feedback. Or why are there suddenly so many bug reports? So what is the amount of users of Liferea and other feed readers and how is it changing?


Well for Debian and Ubuntu there is the famous popularity contest which tracks installation and usage count per package. Let's look into the statistics over the years. Note that while the Debian graph is official from the Debian, the Ubuntu graph is from as Ubuntu itself doesn't provide a graphs. Also the Ubuntu graph only covers the time from 2010 to now, while the Debian graph dates back to 2004.

Liferea and Akregator

The two widely used feed readers under Debian/Ubuntu are Liferea (GTK) and Akregator (KDE). While it is possible that more people use Thunderbird or Firefox for feed reading it cannot be measured using popcon as there is no dedicated package for Thunderbird nor Firefox that could indicate the feed reading habits of their users. So we can only look at the standalone feed reader packages.



The graphs indicate a decline from up to over 4000+ users on each distributions which seems to have been peak usage to recently roughly over 1k Debian users and 700 Ubuntu users. Interesting is the difference on Debian with until 2014 more Liferea users vs. Ubuntu which always had more Akregator users.

Other Market Shares

Of course there are several other news readers for Debian and Ubuntu. Note that Ubuntu has RSSOwl which Debian hasn't. Snownews isn't listed in the Debian graph anymore as it was dropped with Wheezy.



All other feed readers on Ubuntu count roughly 250+ votes in 2010 and roughly 80 in 2014.

Installation Base

Usage is falling. Well there are mobile devices and the reduced visibility of syndication techniques in the browser (we do not have the feed button in the browser location bar anymore)... So people might just not install feed readers anymore. Is this the case? Let's limit the analysis just on Liferea and Akregator.


On Debian the install base of Liferea is rapidly declining as it is not in the default desktop selection, while Akregator installations still grow maybe due to the kde-pim integration.


A different situation on Ubuntu. Both feed readers are in the default desktop packages of their respective desktop environments. So installations seem to scale linearly upwards along with the growth of Ubuntu installations. Update: Jeff Fortin hinted on only Akregator being in a default package selection on Ubuntu. This makes the linear growth of the Liferea install base strange.

It looks bleak... Checking the baseline!

Well let do some verification of the results to be sure popcon can be trusted. Let's have a look at a basic Debian package needed during installation like "debianutils" which users do not unselect and which is automatically used. And let's also add a basic GNOME package like "gnome-session" which always will be used if GNOME is used.

Here are the Ubuntu popcon results for both

It looks (most obvious with "debian-utils") that there was a 50% reduction of the popcon votes in over 2013. Please note that the staircase steps in all the Ubuntu curves do probably indicate there are only 2 samples in the given time range! I guess the decline was rather continuous as can be found in the Debian curve. When checking the installations at the same time there is no drop. So some mechanic in the popcon voting counting could have changed. I found no hints online why this is the case so far.


At this point I think the results are too confusing to actually read much into it. I believe all graphs indicate a decline of the feed reader usage over the years, especially after the peak in 2010, and at the same time the graphs indicate changes in the vote counting with differences in Ubuntu and Debian.

Liferea 1.11.0 - New Unstable Line

This is the first release of the new unstable release line. This release line focusses on code maintainability and this sometimes means removing features (like the very desktop environment dependant tray icon and popup notification features). On the other hand it extends support for online accounts with support for InoReader and Reedah. It also introduces label (folder) support for TinyTinyRSS subscriptions.

Change Details

    * Added experimental InoReader support
    * Added experimental Reedah support

    * Fixes SF #1123: Mistakenly claims "TinyTinyRSS source is not self-updating"
      (reported by Dominik Grafenhoher)
    * Fixes SF #1119: Crash on font resize at startup.
      (reported by David Smith)
    * Fixes #1056, #1089, #1098: Honor preferences when opening links
      (patch by Daniel Seither)
    * Fixes #1117: Selecting last unread item in reduced feed list jumps to next feed
      (reported by Bruce Guenter)
    * Fixes missing "Via" metadata type
      (patch by Rich Coe)
    * Fixes incorrect new count reset handling in item_state.c and 
      some of the node source implementations.
    * Fixes SF #1096: missing installation of liferea.convert file
      (reported by stqn) 
    * Fixes SF #1135: liferea-add-feed doesn't process feed:https//
      (patch by Kevin Walke)
    * Fixes SF #1137, #1142: startup race with LifereaHtmlView
      (reported by Yanko Kaneti)
    * Fixes Github #13: Parsing errors not visible with dark themes
      (reported by Steve Kelly)
    * Fixes Github #29: Do not use bold text for feeds/folders with unread items
      in the leftmost treeview (repored by Jeff Fortin)
    * Fixes SF #1141: Liferea does not update feeds with TinyTinyRSS
      (reported by Dominik Grafenhofer, denk_mal, Fabian Henze)
    * Fixes SF #1150: subscription prop/source: not all fields and
      buttons visible (reported by David Smith)
    * Fixes Github #26: RTL comments appear incorrectly
      (reported by yaconf)
    * Fixes Github #27: Images do not autosize to fit the available space
      (reported by Jeff Fortin)
    * Fixes Github #34: Add TinyTinyRSS Enclosure Support
      (reported by Adrixan)
    * Fixes Github #43: "Any of the following" search condition doesn't work
      (reported by Jeff Fortin)
    * Fixes Github #49: Some dialogs scrolling areas do not request enough height
      (reported by Jeff Fortin)
    * Fixes Github #53: Doesn't automatically update feed name and favicon
      for new feed (reported by asl97)
    * Patch SF #224: Update to new libxml2 buffer API
      (Simon Kagedal Reimer)
    * Patch SF #209: Avoid copying list in itemset_merge_items
    * Make Liferea use ETags and send If-None-Match
      (patch by Chris Siebenmann)
    * Support NOCONFIGURE for RPM builds
      (Charles A Edwards)

    * Rename README to
    * Removing libindicate support (to be added as plugin maybe)
    * Removing libnotify support (to be added as plugin maybe)
    * Removing build in tray icon support
    * Added tray icon plugin
    * Added category/folder support for TheOldReader
    * Added folder auto-removal for TinyTinyRSS & TheOldReader

    * Updated README on plugin contribution
    * Updated Arabic translation (Khaled Hosny)

Finally please note that this is an unstable release and might have quite some bugs.

So please help testing!


You can download the release on Github:

Liferea: git master now has TinyTinyRSS podcast support

If you use TinyTinyRSS synchronization and care about podcast try git master (upcoming 1.11.0 unstable release) to also fetch podcasts!

Syndicate content