July 24, 2017

Hello, this is the report for the second phase of the GSOC. The last month was not easy. Some things had to be re-written because they were not very well written. For example, I wrote a system of “sensors”, the logic of which was laid in the destructors of objects....

Bienvenidos a la crónica vespertina del segundo día de Akademy-es 2017 de Almería, la segunda parte de una jornada un poco extraña para mi ya que la matinal me la perdí. La razón es que estuve en la Asamblea General de KDE e.V., del cual soy miembro desde hace poco. Por la tarde estuve más activo en Akademy-es, aunque no igual que la primera tarde. Se notó en las redes sociales. Por cierto, la jornada de ayer domingo fue tan intensa que fue imposible hacer una entrada en condiciones y apenas pude publicar una imagen. Mil disculpas.

Crónica vespertina del segundo día de Akademy-es 2017 de Almería

  • Crónica vespertina del segundo día de Akademy-es 2017Traducir para KDE – Adrián Chaves, traductor de KDE al Gallego

Se empieza la jornada con la charla trasladada de la mañana donde Adrián nos explica las bases para empezar la importantísima tarea de traducir, una de las tareas más imporatantes dentro del ecosistema KDE.

No hay que olvidar que KDE está traducido a más de 70 idiomas, siendo uno de los elementos que distingue al sistema de Konqi del resto de sus competidores.


  • Charlas Relámpago

Por motivos de tiempo no se promovió la realización de estas charlas, así que no tuvimos la oportunidad de ver esos pequeños proyectos

  • Cómo empezar a programar usando Qt – Jesús Fernández, desarrollador de The Qt Company

Una de las charlas que más gustó a los programadores fue esta realizada por Jesús, donde de una forma distendida y casi casual fue explicando algunos destalles para aquellos que quieran introducirse en el mundo de la programación Qt.

  • Descanso y foto de grupo

  • 5 maravillas de Plasma 5 – Baltasar Ortega, editor de KDE Blog

Me toca realizar mi segunda charla, una charla demostrativa donde explicar solo 5 cosas que me maravillan de Plasma 5 y de sus aplicaciones KDE: el escritorio, las Preferencias del Sistema, Dolphin y Gwenview… y la quinta que la dejo para cuando cuelgue la presentación.

Lamentablemente, esta charla no se pudo grabar así que pido disculpas de antemano.

  • Como probar aplicaciones sin tener que cambiar de distribución – Aleix Pol, Vicepresidente de KDE eV

Para concluir la serie de charlas potentes, aparece delante del proyector Aleix explicando el camino que ha llegado a crear Flatpak y aspectos de su futuro. Una tecnologia que seguro seguirá dando de hablar en en tiempos venideros.

  •  Lo que nos espera… Akademy 2017 – Rubén Gómez, Organizador de Akademy y Ceremonia de clausura – Antonio Larrosa, Presidente de KDE España

Comento 2 en una ya que tienen poco que comentar. En la primera Rubén nos explicó que nos espera en la casi semana que dura Akademy: dos días de charlas y 4 de hacking, sin olvidar la parte social que empieza esa misma noche.

Por otra parte Antonio se dedica a dar las gracias a los organizadores y patrocinadores del evento las facilidades que han puesto para realizar Akademy-es e invita a los asistentes a Akademy y a volver con nosotros en la edición del 2018.

¡Nos vemos en Akademy-es 2018!


Recuerda: utiliza la etiqueta #akademyes cuando utilices twitter o facebook y hables de nuestro evento.

July 23, 2017

I started to implement multiple cursor and selection support in KDE’s famous text editor kate a while ago, but eventually didn’t quite have the time to finalize it. I am currently at Akademy in Spain, KDE’s annual developer conference, and decided that would be a good time to pick it up again and make it actually work. Here it is in action:

Multiple cursors in kate

What does it do?

It allows you to have an arbitrary amount of cursors and selections in KTextEditor. They all mirror what you do with the primary one — text input, text removal, navigation, text selection, …

Features include:

  • Place any amount of cursors with mouse and keyboard shortcuts.
  • Have any amount of (disconnected, i.e. non-continuous) selections. Each selection has exactly one cursor at either its start or its end, but the selection for a cursor is allowed to be empty. Selections do not need to have the same size.
  • Freeze and unfreeze your secondary cursors, allowing you to move only the primary cursor, or all of them simultaneously.
  • Perform most editing, text selection and text navigation features on all cursors simultaneously.

What is it good for?

You decide.

Multiple selections of different sizes

How do I use it?

Usage is relatively simple; the shortcut for controlling multicursors is currently Ctrl+Meta (Meta is the key with the Windows icon on it). Press Ctrl+Meta and click in your document to place a secondary cursor. Then, just do whatever you would normally do with the keyboard. Press Esc to clear all secondary cursors.

You can place cursors with just the keyboard by pressing Ctrl+Meta+D (“toggle secondary cursor at current position”). Doing that will freeze all secondary cursors, and the keyboard now only moves the primary cursor until you unfreeze them again with Ctrl+Meta+F.

You can also create multiple and additional selections by pressing Ctrl+Meta, and then just using the mouse to select text.

Multiple cursors in a Kate document

What’s the state?

Most things work, there will be some issues I’m not aware of. What is at the moment completely broken is persistent selection, and the block selection mode. Both just do random things. I will need to fix that — or do you want to help? Assistance is very welcome.

If you want to test things, I’m sure you can find issues around static and dynamic word wrap, and folding.

How do I try it?

Check out the “multicursor” branch in the ktexteditor repo and build it, then start kate or any other application using the katepart editor component. Or, get a kate AppImage with multicursor support from here: http://files.svenbrauch.de/kate-linux/multicursor/

Please leave feedback in the comments if you try it out!

Akademy-ES 2017

On the 20th and 21st of July, KDE España held, with the invaluable help of UNIA, HackLab Almería and the University of Almería, and with the sponsorship of Opentia, its 12th annual gathering: Akademy-es 2017.

As it always happens when Akademy takes place in Spain, Akademy-es 2017 became a prelude of the international event and many well-known KDE developers attended.

Throughout two days, talks were offered covering many different topics, including Plasma, programming (C++, Qt, mobile), exciting projects like Kirigami, proposals for the future such as KDE on automobile, encouragement to use KDE software and contribute to KDE, and information about KDE España.

People who could not attend should not be worried as videos of the talks will be available online.

Akademy makes the news

The local newspaper stopped by for a photo shoot and to write a story on the world gathering of KDE developers that was about to happen.

Attendees also got a chance to play around with Slimbook Ultrabooks such as the well-known KDE flavour or their new Pro edition.

As usual, KDE España members gathered to celebrate their AGM. If you wish to find out what goes on in there, or if you wish to help us out organizing events like Akademy-es and getting the word out in Spain about KDE, please consider joining KDE España. It is now easier than ever!

KDE España board, Baltasar, Adrián, Antonio, José commonly knows as Los Guapos

Slimbook Talk by Alejandro

Yesterday I picked up my new KDE Slimbook from the Slimbook.es stand at Akademy.

Photo of slimbook being handed over

First thing I did, of course, was boot it with my FreeBSD 11.0 SD card, to see if it works with my favorite operating system (with Plasma 5 desktop, of course). Nope: 11.0 hangs after finding acpi_ec0, so I will write about that later this week.

Second thing I did was boot KDE Neon (pre-installed) on it, to see how it works out-of-the-box. I collected a bunch of tiny-little-irritations, papercuts if you will, from the basic installation — which have disappeared after an update and reboot.

It’s a really nice and slick machine. I wanted a machine that would still fit in the train or plane, for work, but a little larger than my Thinkpad x121e. I bought that machine in 2012(?) from Hettes, a Dutch shop specializing in hardware with Linux preinstalled (now gone, since they could no longer source hardware without a Windows license). So I’m really happy to buy a new machine from a Free Software supporting shop in 2017.

There’s a bit of a weird-ass dongle in the box for wired ethernet, SD card slot, HDMI and two USB ports on the sides, and a DC in — I don’t think I will miss USB-C at all, although that would be neat for a refresh. I have not tried the webcam, which is in the bezel at the top of the screen (no nostril shots like some Dell machines). Speaking of bezels, they’re pretty wide compared to current “design” laptops, Not any wider than the x121e, so relatively more narrow.

The touchpad is a big change for me personally, since I am — or shortly will have been — an IBM TrackPoint™ fan. On the other hand, the touchpad is solid and clicky. The keyboard is nice, with perhaps a little too much flex in the right-hand alt and delete keys. The arrow keys are arrowy, not the fat-left-and-right that (I think) HP uses.


Having discovered that the machine is shiny and nice and fast and works well .. my next step is to try to break it. With the blessing of Alejandro and César — it’s good to have the best possible tech support right at hand.

(Oh, I forgot to mention: I’m pleased as punch with the ordering process, too, for instance the special “deliver to Akademy” shipping option, and the fact that I got email informing me of progress as the laptop was assembled and installed.)

Hey people,

The second phase of Google summer of code evaluation is near!!. And I have started to work on the second part of my project. That is, I have completed the first part of my project. Yeayy!

What’s on hand right now?

Started working on the Bundle Manager, creating the UI which was decided to be done. Creating addition features like deleting the bundles created and creating a search functionality too at the moment.

Deleting the bundles

In Krita, we cannot delete the bundle created just like that. The Bundles created are saved as the KisResource in a QList. We have to remove it from that list, then obviously, we have to remove it from the list widget where this bundle is shown. Then we have to BlackList the file. Then from there, we can remove the blacklisted bundles as we empty a recycle bin ;).

Searching the bundles.

I was reading the code of tag management most of the time, So I haven’t gone deep, this week coding. Other than these two functionalities. But I have a mere idea how to do this, Since this is a QList, I would think of implementing some search algorithms based on the bundle’s name. Or else, I will be tracing a way out using Hashing method.

I was reading the code for the tagging management and have to look out for things which need fixes. After understanding the codebase I will start implementing features and fixing bugs.

Planned works for next week.

  • Get Second phase review done.
  • Implement features/fix bugs of Tag management.
  • Fix bugs/Implement features of Resource Manager.
  • Document/test if necessary.
  • Get more inputs on the tag management from the community.

Hope to hack in again in better ways.


Docker can help you to quickly set up a development environment for working on a software project. This is great for getting new contributors up to speed quickly. I've recently discovered how nice this is and want to share how I use Docker.

KDE projects often have desktop services, mimetypes and plugins. Ideally, these are installed system-wide. During development it is not convenient to change your main environment just to test your software. This is where Docker comes in. Docker is the most popular Linux container system. It gives you a system that is separate from your main system and which you can rewind when you break it.

Dolphin in KDE neon

The simplest way to get going is to run a fresh Plasma system. KDE neon provides Docker images.

After installing Docker, you can get a system going like this;

# give local (non-network) clients access to your X session
xhost local:+
# run a throwaway session with dolphin
docker run --rm \
    -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix \
    -ti \
    kdeneon/plasma:dev-stable dolphin


cleans up the container after use.


makes the session interactive.

-e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix

gives the container access to your X session.

an empty home Dolphin running in a throwaway Docker container. No home directory was set up.

Dolphin in openSUSE

Instead of kdeneon/plasma:dev-stable you might want to use a different distribution. You can build you own images by creating your own Dockerfile. Here is a simple Dockerfile for a Docker image for dolphin based on openSUSE.

FROM opensuse

# opensuse image is minimal, so add plasma and dolphin
RUN zypper --non-interactive install plasma5-desktop dolphin \
  && zypper clean

# set up an environment for a user
RUN useradd --create-home user
USER user
WORKDIR /home/user

CMD ["bash", "-l"]

To create a docker image, write this text into a file name Dockerfile and run

xhost local:+
docker build -t opensuse-dolphin .
docker run --rm \
    -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix \
    -ti \
    opensuse-dolphin dolphin

Now a docker image called opensuse-dolphin was created and run. At each uppercased commands like RUN a snapshot is created. The last step is to tag the final snapshot with the name opensuse-dolphin. That name can be used to run a throwaway container with dolphin.

dolphin running in an openSUSE container Dolphin running in a throwaway Docker container based on openSUSE.

Adding a home

To do any coding, you'd like to provide files to your container and have the ability to store files. This is possible. You can give a container access to a local folder with the -v flag, for example -v $HOME/calligra-dev/home:/home/user which mounts your folder $HOME/calligra-dev/home to the folder /home/user in the container.

I like to manage this container home with git, so I can start with a clean folder by running git clean -fd.

mkdir -p $HOME/calligra-dev/home
cd $HOME/calligra-dev/home
git init
echo 'git clean -fd\n' > .bash_profile
echo -e 'src\nbuild\ninstall' > .gitignore
git commit .bash_profile .gitignore -m 'Initial commit'

So the development environment is managed by Docker on the system level and by git on the level of work directory.

Developing Calligra in Docker

After this introduction, I'm showing the Dockerfile that I'm using for Calligra with QtCreator or KDevelop and the clazy quality checker. Clazy has not been packaged so the Dockerfile needs to have a build step for it.

FROM kdeneon/plasma:dev-stable

USER root

RUN apt-get update && apt-get dist-upgrade -y

RUN apt-get install -y --no-install-recommends \
  cmake extra-cmake-modules g++ gettext git kdoctools-dev kross-dev \
  libboost-all-dev libeigen3-dev libetonyek-dev libfontconfig1-dev \
  libfreetype6-dev libgit2-dev libgsl-dev libkf5activities-dev \
  libkf5archive-dev libkf5kcmutils-dev libkf5kdelibs4support-dev \
  libkf5notifications-dev libkf5notifyconfig-dev libkf5parts-dev \
  libkf5wallet-dev libkf5xmlgui-dev libodfgen-dev libpoppler-qt5-dev \
  libqca-qt5-2-dev libqt5opengl5-dev libqt5svg5-dev libqt5x11extras5-dev \
  librevenge-dev libwpd-dev libwpg-dev libwps-dev ninja-build pkg-config \

# requirements for clazy
RUN apt-get install -y --no-install-recommends \
  clang llvm-dev libclang-3.8-dev

# build and install clazy
RUN git clone git://anongit.kde.org/clazy \
  && cd clazy \
  && cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -GNinja \
  && ninja install

# dependencies for development
RUN apt-get install -y --no-install-recommends \
  cmake-curses-gui \
  less vim strace qtcreator kdevelop valgrind gdb

USER neon
CMD ["/bin/bash", "-l"]
docker run -v $HOME/calligra-dev/home:/home/neon \
  -v /tmp/.X11-unix:/tmp/.X11-unix \
  --network none \
  -ti calligra-clazy

Parallel development environments

Docker is easy to set up and lets you have tight control over your development and testing environment. You can have many environments present on your system and reset and start and stop them quickly. Finally, here is a screenshot of my desktop running development environments for Calligra 2 and Calligra 3 in parallel. Both are running in QtCreator. This is a screenshot from my Akademy presentation on Calligra.

Two versions of Calligra running in Docker containers Two versions of Calligra running in Docker containers.

Helping contributors to get started

Getting started in KDE can be challenging. Docker images or Dockerfiles for complete development environments can get new contributors started more quickly. In KDE, neon already uses Docker images. Jonathan Riddell is giving a presentation about that this Akademy. Because this is so easy, I predict that we'll see more Dockerfiles being published by KDE projects.

July 22, 2017

During the first day at the Akademy, everything went according to plan and nearly everything was on time. Kudos to the organisers.

The weather was balmy at the beginning of the day and, although Aleix Pol said it was not hotter than a hot day in Barcelona, many of the Scandinavian and Scottish attendees were visibly wilting under the sun. Fortunately for them, the venue is equipped with air-conditioning.

Little known fact about Almería: it is situated in the biggest desert in Europe, the Desert of Tabernas. A better known fact is that that same desert has been used as a location for many spaghetti westerns, including the seminal Sergio Leone movies "For A Fistful of Dollars" and "The Good, the Bad and the Ugly". What is more interesting for some KDE members is that Tabernas has also been used in the filming of at least one Doctor Who episode ("A Town Called Mercy"). Unsurprisingly, the whovians amongst us quickly got busy and organised a trip to the place of the shoot for later in the week.

The Talks

Robert Kaye has managed to woo both an active
community of volunteers and the industry with MusicBrainz.

Robert Kaye did not disappoint and delivered an entertaining keynote on how MusicBrainz, a community-powered non-profit, has managed to be THE database of musical metadata. MusicBrainz's data is used by Google, the BBC, YouTube, Amazon, and nearly everyone else (including most FLOSS media players).

Jean-Baptiste Mardelle introduced us to the new features, back end and interface of Kdenlive, KDE's video editing software. Apart from having cleaner code and being more stable, upcoming versions of Kdenlive will sport intelligent clip cutting, resizing and inserting, making life for video editors much easier.

As expected Aditya Mehra's talk on the Mycroft plasmoid was another of the highlights of the day. The topic, after all, is intrinsically interesting -- there is something about issuing voice commands to an AI assistant on your desktop that appeals to everybody.

During the mid-afternoon Ask Us Anything session, attendees had the chance to... well, ask anything to the KDE e.V. board members. Questions ranged from governance to how donations were used, passing through the process of getting elected to the board. Talking of which, it was a chance to properly meet the new board member, Eike Hein, who stepped in for Marta Rybczynska.

Eike, among other things, maintains and develops Konversation, a user-friendly IRC client for KDE. He is also in charge of Yakuake, an original spin on the traditional terminal. Yakuake sits hidden at the top of your desktop and you can unfold it like a blind when you need it. He discovered KDE when test running Corel Linux (does anybody else remember that rather bizarre distro?) back in the 90s and started contributing in 2005.

In the evening, Timothée Giet gave us an update on GCompris, the suite of educational activities and games for young children. The improvements in design and to the number of features are turning GCompris into a free, safe and privacy-protecting suite of educational programs as opposed to some of the proprietary alternatives out there.

Eike, the new member of the KDE e.V. board,
answering attendees' questions.

Agustín Benito, on the other hand, pointed to new sectors KDE should probably be looking into. Agustín has been working on Free Software on embedded devices for the automotive industry for some time now and reckons this is an area in which KDE could grow and even become a mainstream technology.

At the very end of the day, in the very last session, there was a lively debate on writing and how developers could better describe their projects to a larger audience. The discussion was animated enough to make us forget the time and, finally, we were all thrown out.

Day 2 promises to be equally fun.

About Akademy

For most of the year, KDE—one of the largest free and open software communities in the world—works on-line by email, IRC, forums and mailing lists. Akademy provides all KDE contributors the opportunity to meet in person to foster social bonds, work on concrete technology issues, consider new ideas, and reinforce the innovative, dynamic culture of KDE. Akademy brings together artists, designers, developers, translators, users, writers, sponsors and many other types of KDE contributors to celebrate the achievements of the past year and help determine the direction for the next year. Hands-on sessions offer the opportunity for intense work bringing those plans to reality. The KDE Community welcomes companies building on KDE technology, and those that are looking for opportunities. Join us by registering for the 2017 edition of Akademy today.

For more information, please contact the Akademy Team.

I've used ngrx/store and ngrx/effects for a while, and like the pattern. The new version has been released, and here are some of the changes I had to make in my code.

Pre v4 you built your reducers as follows, passing an object with

stateslice: reducerfunction.

const productionReducer = combineReducers(reducers);
export function reducers(state: any, action: any) {
    return productionReducer(state, action);}

With the new version, don't use combineReducers. I was running into the situation where the reducers weren't being initialized and the state was null.

Now you create your object of reducers:

export const reducer: ActionReducerMap = {
contactprimary: fromPrimary.reducer
contactselection: fromSelectionList.reducer
contactlist: undoable(fromContactList.reducer),
relations: relationUndoable(fromRelations.reducer),...

and in your app.module imports: [] section


The second big change is the Action type has been redefined.

export interface Action {
  type: string;

This breaks any of your code where you use action.payload. To fix it you have to define Action in each reducer. First define your action classes.

import {Action} from "@ngrx/store";
import {PrintItem} from "../../../models/print.model";

export const ADD_TO_QUEUE = '[Printing] Add to queue';
export const REMOVE_FROM_QUEUE = '[Printing] Remove from queue';
export const MARK_STATUS = '[Printing] mark status';

export class Print implements Action {
    type = ADD_TO_QUEUE;    
constructor(public payload: PrintItem) {}

export class PrintDone implements Action {
    type = REMOVE_FROM_QUEUE;    
constructor(public payload: PrintItem) {}

export class PrintStatus implements Action {
    type = MARK_STATUS;    
constructor(public payload: PrintItem) {}

export type Actions
    = Print
    | PrintStatus
    | PrintDone;

Note that the payload has a type in each one, and it is the same. You can call it whatever you like, or have multiple properties. The type Actions is exported.

Then in your reducer.

import {PrintState} from "../../../models/print.model";import {ActionReducer} from "@ngrx/store";import * as printingActionTypes from "../actions/printing.actions";

export type Action = printingActionTypes.Actions;
const initialState: PrintState = {
    queue: []
export const reducer: ActionReducer = (
    state = initialState, action: Action) => {
    switch (action.type) {

In this reducer, action is of the type defined in your action classes. The same action needs to be defined in the Effects as well.

This requires refactoring much of your reducers and effects. If you have different payloads for each of your defined action classes, lots of changes.

The advantage is strict typing of the data being passed around. It caught a couple minor flaws in my code, and I will be rewriting some reducers to take advantage of the added protection.

Otherwise it all works. The documentation is very helpful, especially with the specific initialization requirements.

I will update this blog after I have refactored the feature module reducers. There are also some improvements in the way selectors can be grouped.

In this article, I am outlining an idea for an improved process of deploying software to Linux systems. It combined advantages of traditional, package mangement based systems with containerized software through systems such as Flatpak, Snap, or AppImage. An improved process allows us to make software deployment more efficient across the whole Free software community, have better supported software on users systems and allow for better quality at the same time.

Where we are goingWhere we are going
In today’s Linux and Free software ecosystems, users usually receive all their software from one source. It usually means that software is well integrated with the system, can be tested in combination with each other and support comes from a single vendor. Compared to systems, in which single software packages are downloaded from their individual vendors and then installed manually, this has huge advantages, as it makes it easy to get updates for everything installed on your system with a single command. The base system and the software comes from the same hands and can be tested as a whole. This ease of upgrading is almost mind-boggling to people who are used to a Windows world, where you’d download 20 .exe installer files post-OS-install and have to update them individually, a hugely time-consuming process and at time outright dangerous as software easily gets out of date.

Traditional model of software deploymentTraditional model of software deployment
There are also downsides to how we handle software deployment and installation currently, most of them revolve around update cycles. There is always a middle man who decides when and what to upgrade. This results in applications getting out of date, which is bad in reality and leads to a number of problems, as security and bug fixes are not making it to users in a timely fashion,

  • It’s not unusual that software installed on a “supported” Linux system is outdated and not at all supported upstream anymore on the day it reaches the user. Worse, policies employed by distributions (or more generally, operating system vendors) will prevent some software packages from ever getting an update other than the most critical security fix within the whole support cycle.
  • Software out in the wild with its problems isn’t supported upstream, bug reports reaching the upstream developers are often invalid and have been fixed in newer versions, or users are asked to test the latest version, which most of the time isn’t available for their OS — this makes it harder to address problems with the software and it’s frustrating for both, users and developers.
  • Even if bugs are fixed in a timely fashion, the likelihood of users of traditional distributions actually receiving these updates without manually installing them is small, especially if users are not aware of it.
  • Packaging software for a variety of different distributions is a huge waste of time. While this can be automated to some extent, it’s still less than ideal as work is duplicated, packaging bugs do happen simply because distribution packagers do not fully understand how a specific piece of software is built and best deployed (there’s a wide variety of software after all) and software stacks aren’t often well-aligned. (More on that later!)
  • Support cycles differ, leading to two problems:
  • Distros need to guarantee support for software they didn’t produce
  • Developers are not sure how much value there is in shipping a release and subsequent bugfix releases, since it takes usually at least months until many users upgrade their OS and receive the new version.
  • Related to that, it can take a long time until a user confirms a bug fix.
  • There is only a small number of distributions who can package every single piece of useful software available. This essentially limits the user’s choice because his niche distro of choice may simply not have all needed software available.

The value of downstreams

One argument that has been made is that downstreams do important work, too. An example for that legal or licensing problems are often found during reviews at SUSE, one of KDE’s downstream partners. These are often fed back to KDE’s developers where the problems can be fixed and be made part of upstream. This doesn’t have to change at all, in fact, with a quicker deployment process, we’re actually able to ship these fixes quicker to users. Likewise, QA that currently happens downstream should actually shift more to upstream so fixes get integrated and deployed quicker.

One big problem that we are currently facing is the variety of software stacks our downstreams use. An example that often bites us is that Linux distributions are combining applications with different versions of Qt. This is not only problematic on desktop form-factors, but has been a significant problem on mobile as well. Running an application against the same version of Qt that developers developed or tested it against means fewer bugs due to a smaller matrix of software stacks, resulting in less user-visible bugs.

In short: We’d be better off if work happening downstream happens more upstream, anyway.

Upstream as software distributor

Software directly from its sourceSoftware directly from its source
So, what’s the idea? Let me explain what I have in mind. This is a bit of a radical idea, but given my above train of thoughts, it may well solve a whole range of problems that I’ve explained.

Linux distributors supply a base system, but most of the UI layers, so the user-visible parts come from downstream KDE (or other vendors, but let’s assume KDE for now). The user gets to run a stable base that boots a system that supports all his hardware and gets updated according to the user’s flavor, but the apps and relevant libraries come from upstream KDE, are maintained, tested and deployed from there. For many of the applications, the middle-man is cut out.

This leads to

  • vastly reduced packaging efforts of distros as apps are only packaged once, not once per distro.
  • much, much shorter delays until a bug fix reaches the user
  • stacks that are carefully put together by those that know the apps’ requirements best

Granted, for a large part of the user’s system that stays relatively static, the current way of using packaged software works just fine. What I’m talking about are the bits and pieces that the users relies on for her productivity, the apps that are fast moving, where fixes are more critical to the user’s productivity, or simply where the user wants to stay more up to date.

Containerization allows systemic improvements

In practice, this can be done by making containerized applications more easily available to the users. Discover, Plasma’s software center, can allow the user to install software directly supplied by KDE and allow to keep it up to date. Users can pick where to get software from, but distros can make smart choices for users as well. Leaner distros could even entirely rely on KDE (or other upstreams) shipping applications and fully concentrate on the base system and advancing that part.

Luckily, containerization technologies now allow us to rethink how we supply users with our software and provide opportunities to let native apps on Linux systems catch up with much shorter deployment cycles and less variety in the stack, resulting in higher quality software on our users’ systems.

Bienvenidos a la crónica matinal del segundo día de Akademy-es 2017 de Almería, una jornada un poco extraña para mi ya que solo estuve la mitad de ella, la vespertina. La razón es que por la mañana estuve en la Asamblea General de KDE e.V., del cual soy miembro desde hace poco. No obstante, mi pajaritos me han informado con solvencia de lo ocurrido. Espero no que notéis la diferencia.

Crónica matinal del segundo del día de Akademy-es 2017 de Almería


  • 10:00 – 11:00 Mi primera Aplicación KDE para Android – Albert Astals, desarrollador de KDE

Rompe el hielo Albert Astals, uno de los desarrolladores con más experiencia de la Comunidad KDE, que nos explica de forma práctica como crear una aplicación para el sistema dominante en los smartphone.

Concretamente, vemos como Albert creta un aplicación Qt para Android + PC usando QtQuick para la UI y KDE Frameworks.

Crónica matinal del segundo del día de Akademy-es 2017

  • 11:05 – 11:40 La importancia de la promoción: podcasts de KDE España – Ruben Gómez, coordinador de Podcasts de KDE España

Llega el momento de una charla centrada en la promoción de KDE España y el proyecto KDE. El gran comunicador Rubén nos cuenta la experiencia de la realización de los Podcast de KDE España, los cuales han sufrido un gran empuje desde que él se subió al equipo.

Además, mostró las estadísticas sobre las visitas y las  interacciones que están recibiendo los vídeo-podcast.

Aprovecho la ocasión para invitaros a seguirnos en los canales habituales:


  • 12:00 – 12:35 Modern C++ – Jesús Fernández, desarrollador de The Qt Company

Vuelven las charlas técnicas de la mano del nuevo miembro de KDE España, Jesús Fernández, que se estrena hablando del lenguaje de programación C++. En ella nos muestra un par de ejemplos que comenta detenidamente.



  • 12:40 – 13:25 Portátiles Slimbook y KDE – Alejandro López, Slimbook Team

Para cerrar la mañana se decidió parar con esta charla, y así coincidir con la gente de KDE e.V. en la comida. Entra en juego, Alejandro López, miembro del equipo de Slimbook, que nos habla de su gama de ordenadores compatibles 100% con Linux y de su producto nacido de la unión de los esfuerzos con el proyecto KDE, el famoso KDE Slimbook.

No obstante, el centro de su charla son las motivaciones de la empresa por introducirse en el apasionante y apenas explorado mundo de la unión de Hardware y Software Libre en un solo producto.

Recuerda: utiliza la etiqueta #akademyes cuando utilices twitter o facebook y hables de nuestro evento.

We’re releasing the second beta for Krita 3.2.0 today! These beta builds contain the following fixes, compared to the first 3.2.0 beta release. Keep in mind that this is a beta: you’re supposed to help the development team out by testing it, and reporting issues on bugs.kde.org.

  • There are still problems on Windows with the integration with the gmic-qt plugin, but several lockups have been fixed.
  • The smart patch tool merge was botched: this is fixed now.
  • It wasn’t possible anymore to move vector objects with the mouse (finger and tablet worked fine). This is fixed now.
  • Fixed the size and flow sliders
  • Fixes to saving jpg or png images without a transparency channel


The KDE download site has been updated to support https now.


Note for Windows users: if you encounter crashes, please follow these instructions to use the debug symbols so we can figure out where Krita crashes.


(If, for some reason, Firefox thinks it needs to load this as text: to download, right-click on the link.)

A snap image for the Ubuntu App Store will be available from the Ubuntu application store. When it is updated, you can also use the Krita Lime PPA to install Krita 3.2.0-beta.2 on Ubuntu and derivatives.


Source code


For all downloads:


The Linux appimage and the source tarball are signed. You can retrieve the public key over https here:
. The signatures are here.

Support Krita

Krita is a free and open source project. Please consider supporting the project with donations or by buying training videos or the artbook! With your support, we can keep the core team working on Krita full-time.

Hey Community!

Long time no see, huh? Yes, I neglected my blog and as such didn't post anything since Akademy 2014... Interestingly this is the last one where my dear Paul Adams held a famous talk. Talk he is referring to in his latest piece. Since his blog aggregation to Planet KDE is broken, I thought it would be a good idea to relay it on my own blog to give it more exposure. It is reproduced below, if you want to read it in its original form, click through the title.

Paul, the mic is yours now!

Retired From KDE, by Paul Adams

Many of you reading this are probably already aware, long-time maintainer of glibc Roland McGrath has recently retired from maintaining that project. Inspired by his words, I wanted to say a few things about why I no longer contribute to KDE; a project I “retired” from some time ago now.

Recently two very good friends of mine, both long-term KDE contributors, inquired if I was going to be attending this year’s Akademy (the annual KDE conference). Neither were particularly surprised when I said I wasn’t.

I was surprised that they asked.

Getting Into KDE

My first experiences of KDE were many moons ago; sometime in the very early 00s I guess. I had installed Linux on an old machine and was not particularly enjoying the desktop experience.

There wasn’t a desktop.

I cannot remember which distro this was. It had come off some magazine’s cover CD. There was X. And the tiling window manager which allowed me to fill my screen with x-term. This, for a long time, was just how I got stuff done. Emacs, Mutt, Lynx and some weird terminal-based MP3 player were my jam.

Some time later I was reading another magazine (Linux Format?) and it had a review of a recent beta of KDE 2. The sources were included on the cover CD. KDE looked kinda nice. Less boxy and purple than the only other *nix desktop I had seen, CDE. Until I finished my undergraduate degree KDE was my go-to desktop.

Getting Deeper

For a while I had reverted to using a tiling window manager and a screenful of x-term. This was just a convenient way for me to get through my PhD and my day job.

During my PhD I was studying Free Software community productivity metrics. I was also working on research into software quality funded by the European Commission. KDE eV (the governance body1 for KDE) was also taking part in that project. At this time KDE was almost ready to release KDE 4. It was an exciting time to get involved.

So I installed whatever the Debian stable KDE desktop (3.1021933933923932) of the time and really enjoyed the experience. Having rediscovered my love for KDE and having met some of the active community, I dived in deeper.

KDE became high on my list of projects to study during my PhD. The community was going through major changes: not only was KDE 4 on its way in, but KDE SVN was on its way out.

Gitting Ready For Change

Around 2006 I discovered Ade de Groot’s tool for visualising contributions to SVN; it was part of the English Breakfast Network3. His version of this tool utilised Python’s SVN bindings to read the repo data. Git instinct told me this tool would work faster if it parsed SVN logs rather than read the repo data through a library. I turned out to be right and this was a formative moment in my career.

I created a generic SVN log parser for use by this visualisation tool and used the same parser for other purposes; mostly other visualisations and data plotting. The ultimate aim was to expose to the KDE community what we could learn about social interactions within the community from, arguably, its most important communication tool: the version control system.

KDE SVN was4 truly enormous. It was pretty much the largest SVN repo in the wild. One very large central repo which represented the entire body of KDE code/artefacts. Around this time the strains of using such a repo with such a huge (and growing) community were prompting discussion about distributed VCS.

These were remarkably mature and structured discussions. Git was, by no means, a foregone conclusion. Other distributed VCS were given headroom and this was the first (and, basically, last) time I played with Mercurial and Bazaar. The discussions were, for the most part, very technical. I raised my voice to talk about the potential social impacts of switching from SVN to distributed VCS. Any distributed VCS.

Joining KDE eV

I spoke at Akademy and other KDE events (including the KDE 4 launch at the Googleplex) about the research I was doing; either my PhD or the EC-funded stuff. I blogged. I dented5. My work was positively received and gearheads would actively reach out to me for more-detailed analysis of their corner of KDE.

I was encouraged to join KDE eV and I did. Given that I had made precisely 0 code contributions6 to KDE this, to me, felt like an achievement.

Since day one of my involvement, KDE eV had somewhat of an identity crisis. It was really not 100% clear what it did… but anyone who had been involved with KDE for more than 6 months was highly encouraged to join. Before long it had become bloated; lots of members contributing almost nothing and the few people wanting to do something not getting enough support to do it.

KDE has switched to Git and the social changes were a-happenin’. The KDE project was starting to lose its social cohesion. Post KDE 4.0-release blues, the switch to GIT and a lack of care from KDE eV all contributed here. Other things, too. No one thing started the KDE community’s cohesion degradation. But we felt it. We even went though a rebranding… KDE was not a desktop project, it had become a suite of projects and the desktop was just one of them.

KDE had evolved and I had not.

Cohesion Degredation?

One of the metrics I worked on during my PhD was a simple use of graph theory to measure how well-connected a community is. The contribution I made here was intriguing: as project get bigger they become less cohesive, but through careful community management, luck and clever structure, KDE avoided this.

The last time I properly attended Akademy (the KDE community conference) was back in 2014. I’d been frustrated for some time with my inability to drive home the message that the switch to GIT had o be managed properly. I’d been frustrated that nobody seemed to have noticed that my warnings were coming true.

So I gave a talk that year.

Deep down, I knew this was my last public outing on behalf of KDE. It was. After my talk a lot of people came up to discuss the mic I had just dropped. But as the days and weeks passed after the event, the message disappeared. And so did I.

So Why Are You Telling Us This Now?

This year’s KDE conference starts tomorrow. Two of my all-time best buddy KDE community members reached out to see if I was turning up.

They knew I wasn’t.

While we briefly reminisced by email, one of them pointed out that my talk from 2014 had recently come up in conversation on a KDE mailing list. That, 3 years later, the talk was being used as part of a great discussion about change in the project.

I’m really not sure what my emotion about that was. But, I did not feel compelled to join the discussion. I did not feel a need to remind people about what I was trying to achieve all that time ago. Nope. Instead, I went and pushed some changes to a core plan I had been working on for Habitat, the new home for my free time.

The Thanks

To all my friends in KDE:

Enjoy Akademy. Enjoy the opportunity to do some navel gazing. Enjoy the food, the drinks, the sun. Hack. Break shit and put it back together again. Remind yourselves of why KDE is special. Remind yourselves of why it is important. Very important.

I thank you all for the time we spent together.

We were all part of the solution.


  1. Countdown to flamewar… 3… 2… 1… I know many will object to me calling KDE eV a “governance body” but, no matter how you cut it, that is what it is. At least it should be, imo. 

  2. There were approximately this number of KDE 3 releases. 

  3. Is the EBN still a thing? 

  4. Is? 

  5. Is identi.ca still a thing? 

  6. Thanks to the EBN, I did actually fix a spelling error in a comment in a .h file for Marble7

  7. This makes me a true C++ h4xX0r, right? 

  • otherwise throw away no feature branches needed when:
  • focused team
  • effort predictability

experiments and collaboration implies quantum effect branches

in any case lifetime upper bound

July 21, 2017

I planned on writing about the Present extension this week, but I’ll postpone this since I’m currently strongly absorbed into finding the last rough edges of a first patch I can show off. I then hope to get some feedback on this from other developers in the xorg-devel mailing list.

Another reason is that I stalled my work on the Present extension for now and try to get first my Xwayland code working. My mentor Daniel recommended that to me since the approach I pursued in my work on Present might be more difficult than I first assessed. At least it is something similar to what other way more experienced developers than myself tried in the past and weren’t able to do according to Daniel. My idea was to make Present flip per CRTC only, but this would clash with Pixmaps being linked to the whole screen only. There are no Pixmaps only for CRTCs in X.

On the other hand when accepting the restriction of only being able to flip one window at a time my code already works quite good. The flipping is smooth and at least in a short test also improved the frame rate. But the main problem I had and still to some degree have, is that stopping the flipping can fail. The reason seems to be that the Present extension sets always the Screen Pixmap on flips. But when I test my work with KWin, it drives Xwayland in rootless mode, i.e. without a Screen Pixmap and only the Window Pixmaps. I’m currently looking into how to circumvent this in Xwayland. I think it’s possible, but I need to look very carefully on how to change the process in order to not forget necessary cleanups on the flipped Pixmaps. I hope though that I’m able to solve these issues already this weekend and then get some feedback on the xorg-devel mailing list.

As always you can find my latest work on my working branch on GitHub.

KDE Chartered Flight to Almería

We have travelled from across the globe to meet for our annual gathering where we plan and discuss the next year's activities creating free software to share with the world. Almería is in the south east of Spain, a country which has long been a supporter of free software and collaboration with its creators. The sun here is hot but the water is also warm for those who make it to the beach to discuss their work with a pina colada and a swim. Over the last year KDE has run conferences in Brazil, India, Spain, Germany and sprints in Randa in Switzerland, Krita in the Netherlands, Marble in Germany, GSoC in the US, WikiToLearn in India, Plasma in Germany, Kontact in France, and sent representatives to OSCAL in Albania, FOSSASIA in Singapore, FUDCON in Cambodia, HKOSCon in Hong Kong and more.

Tapas y Sangria

Today we meet from around the globe, KDE contributors have flown in from Taiwan, US, all over Europe and British Isles, India, Brazil, Canada.

We have completed Akademy España, talks in Spanish to the community.

We also met for the formality of KDE e.V. Annual General Meeting.

The Community Working Group reviewed issues they had to deal with and were pleased there were fewer firefighting issues than in previous years and they could concentrate on gardening community.

We are KDE

Our outgoing treasurer Marta reported on the year's finances which were pleasingly balanced and with ample reserves. The Financial Working Group reported how they had supported this and that their main task is to support the incoming new treasurer.

The Sysadmin Working Group reported on the pleasing developments retiring old machines, old software such as Drupal 6 and old operating systems. They are moving towards Ansible for system deployment and were pleased at the new multi-platform CI system which is now running.

We heard from the Advisory Board Working Group who now have regular meetings with representatives from supporting companies and large deployments of KDE software.

The KDE Free Qt Foundation controls the licencing of Qt with representatives from both KDE and Qt company. In the last year they have concluded the relicensing of all Qt parts as Free Software. All parts of Qt are available under the GPLv3 or under a compatible license. Most parts are also available under the LGPLv3 and under the GPLv2. The last remaining code to be relicensed was the Qt Quick Compiler. This is now deprecated and replaced with an open source solution since the release of Qt 5.9.

Your new KDE e.V. board

Finally we voted on replacement board members for the three who's terms came to an end. Marta the treasurer did not renew her term. Holding one of the most important but least thanked tasks in KDE we owe her much gratitude for keeping out books balanced and our payments prompt. Lydia Pintcher and Aleix Pol i Gonzàlez both stood for the board again and were re-elected for another three years. And long term KDE developer Eike Hein was elected as a new board member, hoping to bring in more representation to the community from Korea where he lives. We thanked the outgoing and new board members with the traditional thanks of a fancy dinner.

Tonight we drink sangria and wine under the stars at a welcome party meeting old friends and new, eating tapas of salmorejo, croquetas, tortillas and rice, looking forward to the week ahead.

It's with all the joy in my heart that I share with you this amazing notice: AtCore was officially moved today to KDE Extragear by my favorite sysadmin Ben Cooksley after more than a month on KDE Review. This is the first huge milestone that we achieve on this 11 months of team work made [...]

July 20, 2017

This release includes all the feature-enhancements the Linux version has received (frameworks announcements for 5.36.0)

– Actually working spell-checking.
– Possibility to switch interface language.

EDIT: Adding an extra fall-back UI language does not wok properly yet.

Kate in SweedishKate in Sweedish

Grab it now at download.kde.org:  Kate-setup-17.04.3-KF5.36-32bit or Kate-setup-17.04.3-KF5.36-64bit

When I released Brooklyn v0.1 complaints arose from the fact that it is written in Java.
A lot of criticisms come from users that probably wrote Java code when it was born.
The language is constantly changing and I decided to use Java 8 as the primary language for Brooklyn.
I'm writing this blog post because while I was learning new features I realized that there is an enormous difference between studying something and applying what you have studied in a practical scenario.
I'll keep writing posts like that, and I want to write much more if I receive a good feedback!

Avoid null pointer exceptions
Imagine that you've a Bot interface with a method sendMessage and three classes that implements that: IrcBot, TelegramBot and RocketChatBot.
sendMessage returns a string which contains the messageId returned from the bot; the main problem is that there are bots like IrcBot which can send messages to IRC, but the protocol doesn't support messages identification.

What should you do? The first thing you can come to your mind is to return a null:

public interface Bot {
String sendMessage(...);

public final class TelegramBot implements Bot {
public String sendMessage(...) {
// Message is sent here

return msgId;

public final class IrcBot implements Bot {
public String sendMessage(...) {
// Message is sent here

return null;
The main problem is that if your code somewhere stores the string and use it without checking if it is null, the application will crash because of a NullPointerException.

A good solution is to use the class Optional. Let's see how to use it:
public interface Bot {
Optional<String> sendMessage(...);

public final class TelegramBot implements Bot {
public String sendMessage(...) {
// Message is sent here

return Optional.of(msgId);

public final class IrcBot implements Bot {
public String sendMessage(...) {
// Message is sent here

return Optional.empty();
Imagine now that you've sent a message with a Bot bot = new ...(); and you want to use the result of Optional<String> result = bot.sendMessage(...).
First of all, you can check if it is empty or not, and then you can do something (in this case, print the message id):

if(result.isPresent()) {
String msgId = result.get();
You can also rewrite it with Lambda Expressions:
result.ifPresent(msgId -> System.out.println(msgId));
or more simply with Method References:

There are cases when you don't know if a function returns a null or not.
Let's imagine that you've a static method from a library x called getFile() which returns a File object or null.
Instead of checking if it is null, you can simply write Optional<File> file = Optional.ofNullable(x.getFile());which is the equivalent of:

Optional<File> file;
File fileNull = x.getFile();
if(null == fileNull)
file = Optional.empty();
file = Optional.of(fileNull);

Time to fly off to the sun to meet KDE friends old and new and plan out the next year of freedom fighting. See you in Almería!


Facebooktwittergoogle_pluslinkedinby feather

We are happy to announce the release of Qt Creator 4.4 Beta!



This version of Qt Creator features optional inline annotations for warnings and errors from the Clang code model and for bookmark comments (Options > Text Editor > Display > Display annotation behind lines). This way, you can easily see the details of issues while you type, without the need to hover your mouse over underlined text or the marker on the left side.


When you rename a symbol, you are now offered to also rename files with the same name. Just trigger the renaming and check “Rename N files” (where “N” will be the number of files with the same base name) in the search results panel before pressing the actual “Replace” button.

If you have the Clang code model enabled, this is now also used for the highlighting of the identifier at the text cursor, which was previously still using the built-in model in any case.

There have been many bug fixes as well. C++ and Qt keywords are no longer wrongly considered keywords in C files, the function signature hint will now work when completing constructors with the Clang code model, and many more.


We were pretty busy fixing issues already in the 4.3 line of Qt Creator, but there are some improvements in 4.4 as well. We added a filter to the CMake variables setting in build configurations, fixed that headers from the top level directory were not shown in the project tree when using server-mode and improved the handling of CMAKE_RUNTIME_OUTPUT_DIRECTORY in CMake project files.

Other changes

We removed the non-maintained support for Window CE, and changed the ClearCase integration to be disabled by default.

This is just a small selection of the changes and improvements done in 4.4. Please have a look at our change log for a more detailed overview.

Known Issues

QML Profiler can currently get into invalid state. Stopping the application before stopping profiling currently does not work.

Get Qt Creator 4.4 Beta

The opensource version is available on the Qt download page, and you find commercially licensed packages on the Qt Account Portal. Please post issues in our bug tracker. You can also find us on IRC on #qt-creator on chat.freenode.net, and on the Qt Creator mailing list.

The post Qt Creator 4.4 Beta released appeared first on Qt Blog.

I completed the Oware two player mode as described in my previous blog post GSoC-First month analysis. This month was the time for the single player mode. So well it started well, I implemented the alpha beta pruning for the AI mode.

The levels are structured in the following way:

  1. For the initial levels the AI is random which sows randomly from its houses. But if the computer gets in a bad position or is losing badly then it switches to AI mode. A maxDiff is maintained for each level, for example level 1 has maxDiff = 20, level 2 has maxDiff = 15 and so on. So as soon as the computer/AI is behind the player by maxDiff it switches to AI mode.
  2. For the last levels there is no random selection so basically maxDiff = 0.

I also had been working on the animation of seeds which involves movement of the seeds from one house to another. It still has some issues left involving the animation being triggered at each step.

There are also some changes in my GSoC plan. I thought of working on computer activity after oware earlier when I made my proposal but with discussions with my mentors we came to a conclusion that musical activities are more important for a child. So I would be working on musical activities now which includes play piano and note names activity which were started in the branch Play piano and were earlier to be done in my last month. My aim would be to complete both these activities.

I planned to go to Akademy this week and meet everyone but well my visa got refused :( I will try to be a part next year and I hope I get the chance of meeting everyone (especially my mentors soon). I will cover more about the musical activities and my progress in my next blog post :)

July 19, 2017

I’m currently in my final preparations for this year’s Akademy.

For people unaware of this conference, it is the annual conference of KDE contributors.

We tend to have a few dozen of high quality talks on various topics ranging from art and community building, to hard-core Qt and C++ talks.

This year, I’m going to have two talks. One on (obviously :) ) functional programming in C++, and one on C++17 and 20. The later one will be a bit self-serving because I’d like us to raise the compiler requirements for our software so that we could enjoy working in KDE even more.

The only thing more important than talks is the period after where the different teams within KDE meet-up to discuss the future plans. While we do it all the time on IRC and on the mailing lists, having face-to-face meetings is irreplaceable.

If you are near Almeria, join us – the conference is free for attendance!

Going to Akademy


Hi everyone!
As the title of this blog post suggests, the first evaluation has been successfully passed, the project accomplishing all the proposed goals. Thus, let me present you the progress I’ve done for the first evaluation.

  • The very first thing I’ve took care was allowing multiple-instrument visualization framework, by modifying the old core architecture of Minuet. Instead of the one and only keyboard instrument, Minuet is now providing an instrument tab bar, enabling the end user select the desired instrument. The tab bar is currently loading the instrument within the first tab as default. After I’ve discussed with my mentor, Sandro, I decided to keep the piano keyboard as the default instrument contained by the first tab. In order to keep all the functionalities available and a simple architecture at the same time, I’ve created an InstrumentView wrapper above all the instruments. Its methods are called by the core ExerciseView, calling in turn the methods that each instrument should implement.


  • After changing the Minuet’s core in order to provide a multi-instrument framework, I started refactoring the piano keyboard view as a separate plug-in. Basically, for Minuet, a plug-in is nothing more than a bunch of QML files and a simple JSON file parsed in order to learn about the QML files’ location and load them dynamically in the instrument tab bar.


The next goal was to install each instrument separately as a plug-in, besides all other Minuet’s plug-ins. Like any other KDE application, Minuet, keeps its data files into /usr/share/ file-system directory. Thus, this was the place where our plug-ins had to be installed; actually, the exact path is /usr/share/minuet/plugins/. Installing a plug-in is simply done by using a CMakeLists.txt file telling the build system where the plug-in files should be installed.

Plug-ins are loaded as follows: firstly Minuet searches for plug-ins location and if the search succeeds, it will iterate through each instrument’s JSON file, building a QJsonArray containing the plugin name and path. This QJsonArray is passed to the InstrumentView, setting the contents of the Instrument Tab Bar. Having all the tabs ready, the TabBar will just wait for a tab to be selected and a QML file to be loaded.

  • Having the multiple instruments framework and piano plug-in ready, the next step was to test and analyze the code for possible technical issues or bugs. Also, a general clean-up was required before submitting the code for the review and first Google Summer of Code evaluation.


These are the achievements I’ve met for the first evaluation. Let’s discuss now about the current progress for the next evaluation:

  • I wrote a proper and comprehensive documentation for the piano plug-in, enabling anyone to create his/her own instruments plug-ins and loading them dynamically into Minuet.
  • I started implementing a new instrument from scratch. As I am very passionate about guitar, I chose to integrate it into Minuet’s instruments suite. Thus, I have already designed the visuals for the Guitar plug-in and added it into Minuet’s instrument tab bar. Now, I need to link the GUI to the core, work on the guitar’s specifics and make the plug-in fully functional.


In conclusion, GSoC proves to be a great experience thus far, being a pleasure to work on a project focused mainly on a subject I’m in love with: music. For further cool news, stay tuned!


A lot of implementation changes were introduced

  • Selection highlights depends upon the items selected in the model.
    • Previously, the selection higlights toggled when the SelectionButton for an image was clicked
    • Now the higlighted images are shown according to the items selected and stored in the selection model

  • Completely removed baloo dependency

  • For “By Folder” filter KIO based model is used for folder representation of images.
    • It shows the mixed images and folders in the AlbumView.
    • It shows the images in hierarchical structure, as they are represented in the memory. Just like a file manager would represent, but just the images and folders.

      Folder Structure

  • Adds a new ImageListModel
    • This model would just store the image list irrespective of whether they are from ImageLocationModel or ImageTimeModel.
    • This made the representation of images in the GridView and the ImageViewer a lot more easier

  • Better implementation of ImageViewer done by Marco Martin
    • Better animations for ImageViewer to appear and disappear.
    • Pinch zoom for the single Image appearing in the ImageViewer.
    • Zoom animations for the images in ImageViewer. Zoom on double clicking the image as well as on Ctrl + wheel action

      Normal Image Zero Zoom

      Zoom on Double Click Double Click Zoom

      Ctrl + wheel Zoom Ctrl + Wheel Zoom

  • Automatic updation of the currentIndex for the GridView if the index changes in the ImageViewer.

  • Makes the thumbnailer code common to all the models.
    • Faster loading of thumbnails for the GridView.

  • Totally removed the old code base qml implementation.

  • Adds KDirNotify and KDirWatch to support live updates of the data in the time and location collections as well.
    • We don’t need to add KDirNotify and KDirWatch to the ImageFolderModel since it subclasses KDirModel which already takes care of the changes.
    • KDirWatch uses the concept of singleton object ie we can use just a single instance of the KDirWatch class for the entire application.

  • Makes the enums common for all the models.

  • i18n’z all the text elements.

  • Creates a different SortModel for the ImageViewer to apply sort as well as the filter to show just the images.

  • Adds contextualActions to the AlbumView.
    • For now three actions are added Select all, Deselect all and Delete selections.
    • These actions can just be applied on the images and not on the collections or folders.

  • Selectively loads desktop and mobile user interface depending upon whether the environment variable QT_QUICK_CONTROLS_MOBILE is set or not.

    • There is just single difference between mobile UI and desktop UI, that is of the contextualActions. For desktop version these appear on the toolbar and for mobile version these appear in the contextDrawer.
    • Rest of the changes are handled brilliantly by the Kirigami.

      Desktop UI Desktop UI

      Mobile UI Mobile UI

  • Adds a selection mode for mobiles that is activated on pressAndHold.

    On PressAndHold Tap and Hold

  • Opens a specific image via the commandline.
    • That allows us to open the image from the file manager also.
    • It takes you directly to the single image in the ImageViewer
    • It also pushes the intermediate folders into the pageStack(that contains AlbumView) starting from the standard Pictures location to the folder containing the image, for the “By Folder” filter.
    • If the image is not in the Pictures location then it just pushes the folder into the pageStack(that contains AlbumView).
    • Though this is not perfect yet. The problem is that the SortModel(QSortFilterProxyModel) in the ImageViewer is populating in pieces that is first when the sourceModel for the model in ImageViewer is set to specific ImageFolderModel with empty data (I think) and then again the rowsInserted signal is emitted and the model is populated again and thus making the rowCount to double of the actual number of images, which then makes the currentIndex in the ImageViewer invalid(-1) at the beginning and hence the navigation starts from the first image in the list instead of the selected image. Searching for the alternatives :)

  • PS: The background shown in the application is theme dependent. This is Breeze-dark theme


In my last post, I talked about adding a grid layout to the activity. The inspiration of this layout was to remove the trial and error method of selecting (x,y) positions of a node and to implement a more efficient method of positioning the nodes. Along with that, the distance between two generations and nodes could also be maintained in a homogeneous manner, keeping the layout similar throughout the activity.

As it also turned out, the grid layout along with knowing the width and height of the node also helped in accurately positioning the edges, the effect of which will be shown in a few before-after screenshots later in this post


Vertically, the screen is divided into three equal parts (representing three generations), represented as:

readonly property real gen_1: 0.10
readonly property real gen_2: 0.40
readonly property real gen_3: 0.70

Here, gen_1, gen_2 and gen_3 represent 1st, 2nd and 3rd generation.

Horizontally, the area was originally divided into three parts:

readonly property real left: 0.2
readonly property real center: 0.4
readonly property real right: 0.6


Aside from this, we also divided the horizontal area into four other slots, which will be necessary as it turned out later:

readonly property real left_ext: 0.1
readonly property real left_int: 0.3
readonly property real right_int: 0.5
readonly property real right_ext: 0.7

Here, left_int and right_int represent left and right on the interior side compared to left and right respectively. Similarly, right_ext and left_ext represent left and right exterior, compared to left and right respectively.

The nodes

The arrangement of the nodes are very simple, in which we are avoiding the problem of arranging the nodes via trial and error of the (x,y) position. The x-coordinate can be determined by selecting the best among left, right and center or among left_x or right_x (where x = 1, 2) as mentioned above and the y-coordinate can be determined via selecting the best among gen_1, gen_2 or gen_3, depending on the generation of the node.

As an example, for level 11, we define the nodePositions as follow:

nodePositions: [
        [center, gen_1],
        [left, gen_2],
        [right, gen_2],
        [left, gen_3]

As we can see from the level, it can be seen that it is very intuitive to determine the node positions for a given level, once we know the type of the node.

The edges

The start-end position of the edges can also be determined via the properties mentioned above along with the nodeWidth and nodeHeight properties mentioned in the previous blog post. For level 11, we calculate the edge positions as:

edgeList: [
        [center + nodeWidth / 2, gen_1 + nodeHeight, center + nodeWidth / 2, gen_2 + nodeHeight / 2],
        [rightXEdge(left), nodeMidPointY(gen_2), right, nodeMidPointY(gen_2)],
        [left + nodeWidth / 2, gen_2 + nodeHeight, left + nodeWidth / 2, gen_3]

As a result of these, level 11 turned out to be like this:


How it all turned up

The layout has come a long way since it was started from the beginning of the second phase of GSoC, and here are the before and after screenshots of the family activity

level_18_before Initial layout of level 18

level_18_after Current layout of level 18

level_6_before Initial layout of level 6

level_6_after Current layout of level 6

What’s Next

I have started working on the extension of the Family activity, the goal of which is: given a relation, the user will have to find the pair that demonstrate the given relation. I will be documenting the progress of the activity once that is near completion, hopefully by the end of this week.

When using Qt’s model/view framework, filtering has always been very easy with QSortFilterProxyModel. To filter a list using text typed by the user in a line-edit, you have certainly been applying the standard recipe:

  1. instantiate the proxy;
  2. insert it between view and source model;
  3. connect the lineedit’s textChanged signal to the proxy’s setFilterFixedString slot; done!

But what if the model is a tree rather than a flat list?

Let’s use the tree below as an example. As you can …

The post New in Qt 5.10: recursive filtering for QSortFilterProxyModel appeared first on KDAB.

July 18, 2017

In the past there were two versions of LabPlot. The first one was based on Qt4 and KDE4 libraries. The second one uses Qt 5 and KDE frameworks 5. The development was done mainly in the Qt4-based branch which was merged from time to time to the Qt5/frameworks branch where the porting to Qt5/frameworks, if required, was done after the merge. Clearly, this caused a lot of additional work, was very time consuming sometimes and distracted us too often from the actual development – the development mostly done in our very limited spare time.

After long internal discussions we decided to stop developing and releasing the Qt4-version of LabPlot. It should be an exception nowadays to find a distribution without a reasonable support for Qt5 and KDE frameworks. So, starting from the next release, LabPlot 2.5, there will only be the Qt5/kf5-based release. We still can decide to provide fixes to the Qt4-based version, but there definitely won’t be any new features for this release anymore.

Working on one release only will allow us to concentrate more on the application itself and to increase the development speed. Our master branch is now on Qt5/frameworks since couple of weeks already with a lot of great new stuff being developed for the next release.

Having mentioned the next release, couple of words more about this. We plan to release closer to the end of this year. A lot of new features are already developed for the next release. Among them we want to mention the import of data from SQL databases as well as the import of Origin’s project files. Data fitting has got a lot of attention recently and the next release will allow the user to do more advanced fitting and to obtain much better representation of the results of the fitting procedure. Also, we improved a lot the user experience – the creation of multiple plots and data curves as well as performing of data analisis can be carried out more comfortable now and we’ll improve more in this direction soon. More on the new features will come in the next couple of blogs.

LabPlot’s GSoC2017 project makes also good progress and if everything goes well and as expected, the next release of LabPlot will provide support for live data coming from usual files, pipes, sockets and serial port.

Still, a lot of polishment has to be done until the release. Everybody who is interested in testing the new features, please don’t hesitate to build the current version of LabPlot from sources and to provide some feedback!


TIL the Rust compiler panics. A lot. Okay, it wasn't today, it was last week. Still. At this point I feel bad because I feel like I'm constantly coming out with something bad to say about Rust. I swear, I love the language. So I'm just going to point it out and move on: libsyntax panics on a lot of lexing and parsing errors. There. Moving on...

I have to admit, I spent too much time thinking of something interesting and engaging to write in this blog post but unfortunately it's just going to be a small progress report. You know the famous saying, a gif is worth a thousand words...


In my last post I showed highlighting done for declarations, but uses were not highlighted. Lo and behold...

Video should appear here; if it doesn't click here

This also means that go-to-declaration works as well. You might notice the uses aren't highlighted the same color as the declarations. That's a mistake on my part and I'm working to fix that.


As I've said before, KDevelop does a lot of things out-of-the-box if it has the Declaration-Use chain for a project. Renaming declarations is one of them.

Video should appear here; if it doesn't click here

Very basic code completion

In the spirit of short recordings, here's another one.

Video should appear here; if it doesn't click here

(yes, the cursor is slightly off in all of these; blame the recording software)
(((also if the videos aren't loading, you can view them here, here and here)))

Up next

Some more interesting things for code completion are coming up. Also, the Rust compiler has amazing error messages and I'm currently looking into getting the diagnostics out of libsyntax and show them in KDevelop. I'm looking into parsing imported modules as well, starting with libstd. All exciting stuff.

I'll also be speaking at KDE's Akademy this weekend, so if you're there, please feel free to drop by and say hi. I won't bite. :)

I'm going to Akademy

There's less than a week until the beginning of Akademy 2017 (if you still haven’t registered, do so now) and this is what you can expect from your first day at the event:

Keynotes and Master Talks

Akademy opens on Saturday, July 22 at 10 am with Robert Kaye, the brains behind Musicbrainz. We talked with Robert a few days ago, and he will tell us all about his projects and how he managed to marry FLOSS activism with the pragmatism of having to make money in order to keep them alive.

Sebastian Kügler will follow with an overview of the most important things that happened over the last year in the development of Plasma. He will talk about current features, future plans and goals, what to expect on your desktop over the next year, and how to help and get involved.

Meanwhile, in the next room, Jos van den Oever will examine Calligra and its native support for ODF. He'll look at a number of areas of ODF and see how well they are supported compared to other office suites.

At 11:50, Mirko Boehm will review the governance norms applied in FSFE, KDE and Wikimedia in his talk Why we Fight. He will examine how the norms developed over time and how current debates reflect their evolution.

Kdenlive, KDE's video editor, now comes with a new, re-vamped user interface.

At the same time, Volker Krause will present the UserFeedback framework, which provides ways to engage users from inside the application itself, including the collection of system or usage statistics, as well as asking an interested set of users that match a specific set of criteria to participate in an online survey.

Continuing on with a similar topic, at 12:30 Aleix Pol will talk about the challenge of developing for users employing bundled systems. We'll see what impact shortening the path between the development and users being able to run the software will have.

At the same time, Emma Gospodinova will tell us how she plans to add support for Rust, the promisingly popular programming language, to KDevelop during her Google Summer of Code project. Emma plans to include standard features any IDE should support for a language, such as semantic highlighting, code completion, refactoring, debugging and project management.

From there, we will move onto the light entertainment, which is movies. Or more like movie-editing. In Kdenlive, rewriting the timeline, Jean-Baptiste Mardelle will show us the new, polished Kdenlive 17.08, which now uses QML for many parts of the UI.

On a more technical note, Ivan Čukić will talk about how functional programming can improve our day-to-day work, make our code safer, cleaner and more correct.

Lightning Talks

After lunch, at 15:30, we'll have a bunch of lightning talks. The first one will be about Mycroft, the Alexa-like AI, and Aditya Mehra will explain how you can turn it into a Plasma widget and really enhance your life by having something you can boss about.

Volker Krause will then take the stage and tell us all about KF5::SyntaxHighlighting, a syntax highlighting engine that was originally tied to Kate, but can now be used anywhere.

Then Albert Astals Cid is up, and he will explain the work being carried out on Clazy, a compiler plugin which allows Clang to understand Qt semantics.

Marco Martin will then have ten minutes to explain how the feedback generated from the design and implementation of applications significantly improved the quality of Kirigami, KDE's user interface framework for developing applications that work both on mobile and desktop computers.

Finally, Vasudha Mathur will talk about Ruqola, the first generic chat application based on Rocket.Chat. Ruqola is a Qt/QML/C++ app and provides multi-platform portability. Ruqola will currently run on both desktop and mobile (Android) platforms.

... Back to Regular Talks

At 16:30, Sandro Andrade will be talking about preliminary implementation of a modular and flexible framework for building Qt mobile applications. He will also explain how you can use code generators and a plugin-based architecture to automate the implementation of recurrent tasks.

Babe allows you to add music from multiple sources, including YouTube.

At the same time and next door, Camilo Higuita will be introducing Babe, a contextual multimedia desktop app. Babe uses online resources and AI to find relationships between the music metadata and its context in order to generate personalized queries and suggestions.

Lydia Pintscher and the rest of the KDE e.V. Board will then sit down for an Ask Us Anything session with the audience at 17:10. If you want to find out what the board really gets up to and hear the plans for KDE as a community moving forward, here's your chance.

Meanwhile, Dmitri Popov will be teaching you how to take your digiKam skills to the next level by mastering its advanced functionality. Dmitri's talk will introduce several useful features and tools, such as filtering, batch processing, and curve presets.

At 17:55, John Samuel will be talking about Wikidata and how it can play an important role for the visibility of KDE applications. He will show how developers can build tools to integrate their applications with Wikidata to present an up-to-date view of their applications and their cool features.

At the same time, Arnav Dhamija will introduce you to the KIO (KDE Input Output) library. KIO is what allows your KDE apps to access data from a number of different protocols, such as local file systems, ssh, https, samba shares, ftp, and network file systems. Arnav will explain the need for KIO, how KIO works, KIO slaves, and how to develop for the same.

At 18:35 Timothée Giet will be taking us down the long road to GCompris-qt 1.0. GCompris, the collection of educational games and activities for children, has finally officially released the new Qt-based version. Timothée will show us the progress the team has made to get there, as well as some shiny new activities.

In the next room, David Edmundson will be explaining the Binding loop detected for property "title"" error, an annoying and cryptic error everyone developing QML has experienced at some point or another. He will talk about what this warning really means and how you can tackle even the most complicated loops.

... And a last Blast of Lightning Talks

At 19:15 we'll have the last three Lightning talks of the day. First up will be Agustín Benito with his Opening new doors presentation, in which Agustín will explain why he thinks KDE should jump into the embedded-for-automotive fray. Should he have called his talk Opening car doors? Definitely.

Then Annu Mittal will talk about all the application domains and various programs currently running in KDE, namely: Season of KDE, Summer of Code, and Outreach Program for Women. She will follow up by explaining the various ways you can get involved with KDE, both from the technical and non-technical point of view.

Finally, yours truly will help you look for love (for your projects) by explaining in ten minutes flat three simple steps that will improve your communication and increase your audience's appreciation for your project.

... And that is just day one.

Register here and don't miss Akademy 2017, one of the most important Free Software conferences this year.

Dot Categories:

Older blog entries

Planet KDE is made from the blogs of KDE's contributors. The opinions it contains are those of the contributor. This site is powered by Rawdog and Rawdog RSS. Feed readers can read Planet KDE with RSS, FOAF or OPML.