Subscribe to Planet KDE feed
Planet KDE - http://planetKDE.org/
Updated: 22 min 48 sec ago

Okular 1.1 released!

Thu, 04/20/2017 - 21:08

Today KDE Applications 17.04 was released.

It includes Okular 1.1, it contains a nice set of features:
* Add annotation resize functionality
* Add support for auto-calculation of form contents via JavaScript
* Allow to rotate the page view using two-finger pinches on a touchscreen
* Change pages in presentation mode by swiping on touch screen
* Added support for Links that change the Optional Content visibility status
* Allow to disable automatic search while typing
* Allow to create bookmarks from the Table Of Contents

This release was brought to you by Albert Astals Cid, Oliver Sander, Luigi Toscano, Martin T. H. Sandsmark, Tobias Deiminger, Antonio Rojas, Burkhard Lück, Christoph Feck, Elvis Angelaccio, Gilbert Assaf, Heiko Becker, Hrvoje Senjan, Marco Scarpetta, Miklós Máté, Pino Toscano, Yuri Chornoivan.

Updates on the KActionRunner thinkering.

Tue, 04/18/2017 - 10:51

First I would like to answer a few questions that I had on my latest entry:

1 – KActionRunner is *not* a unified-menu, and it does not tries to be. It shouldn’t be used to display the menu of the application in a unified way.

2 – Somebody told me that this looked like the Eclipse “Quick Access” feature, and that’s exactly what this is.

Changes in the code currently on my machine, *not merged yet*:

  • Enabled in every K-App that uses KXmlGui
  • ctrl + alt + space triggers the Action Runner
  • Search for the action you wanna trigger
  • Trigger it.

Obligatory Screenshoot running on KDevelop:

I certainly need to iron out a few things before trying to merge this, so I’m not doing a review again this soon (my older review was shut down pretty fast ��

  • Prettier delegate displaying more information about the Action
  • Display the list of actions when you type (currently it completes inline)
  • don’t crash on exit

I’m using it on all my KDE applications locally and this is starting to behave the way I want.

 

Multithreaded Programming with Future & Promise

Tue, 04/18/2017 - 08:19

This is a guest post by 2016 Qt Champion Ben Lau.

Ben has a long history with Qt, and many interesting projects on GitHub.

Here’s an idea from him on making multithreading simpler in some cases.

The Basics

Multithreading programming may not be difficult at the first glance. You have to pay attention to your shared data to avoid race conditions/deadlocks. So you learn mutex and semaphore and do it carefully. The result works perfectly on your machine.

But one day, your program hangs. You spend an hour to trace out the problem and find out the order of code execution is not same as your expectation. So you add a few mode condition checking and fix the problem.

After a few week of development, the program is getting more complicated. And it begins to crash randomly. This time even after a day you still can’t figure out what is wrong and admit that it is totally out of control.

Does that sound like a familiar story? It is not rare to find complaints about random crashes/hangs due to misuse of a thread. Is it really difficult to write multithreaded programs?

The answer is yes and no. It depends on your software requirement and architecture.

In this article, it is going to introduce a lock-free multithreaded programming method by using QtConcurrent and AsyncFuture. These make multithreaded programming easier.

Let’s take an example. The code below shows an asynchronous ImageReader class. The readImageWorker function will be executed on another thread that won’t block the UI. QFuture represents the result of computation and reports the status change.

class ImageReader : public QObject { public:     QFuture<QImage> read(const QString& fileName); }; QFuture<QImage> ImageReader::read(const QString &fileName) {     auto readImageWorker = [](const QString &fileName) {         QImage image;         image.load(fileName);         return image;     };     return QtConcurrent::run(readImageWorker, fileName); }

Example of use

ImageReader reader; QFuture future = reader.read(INPUT); QFutureWatcher *watcher = new QFutureWatcher(); connect(watcher, &QFutureWatcher::finished, [=]() { setImage(future.result()); }); watcher->setFuture(future);

Multithreaded programming with QtConcurrent is pretty easy. It just takes an input, then produce an output later. QtConcurrent handles all of the low-level threading primitives.

But it is limited to the condition that the concurrent function does not access shared data with other threads. If that happens, it may still need a lock in order to maintain a critical session. That will fall back to the old traditional way.

Make it support Image caching

The above example is quite an ideal case. And of course, a real world problem is usually not that simple. Let’s change the requirement – Make it support image caching.

QFuture ImageReader::read(const QString &fileName) { auto readImageWorker = [](const QString &fileName) { QImage image; image.load(fileName); return image; }; QFuture future = QtConcurrent::run(readImageWorker, fileName); QFutureWatcher *watcher = new QFutureWatcher(this); auto updateCache = [=]() { m_cache[fileName] = future.result(); watcher->deleteLater(); }; connect(watcher, &QFutureWatcher::finished, updateCache); watcher->setFuture(future); return future; }

The class declaration:

class ImageReader : public QObject { public: bool isCached(const QString& fileName) const; QImage readCache(const QString& fileName) const; QFuture read(const QString& fileName); private: QMap<QString,QImage> m_cache; }; bool ImageReader::isCached(const QString &fileName) const { return m_cache.contains(fileName); } QImage ImageReader::readCache(const QString &fileName) const { return m_cache[fileName]; }

Before getting an image, you have to query is the cache available:

if (reader.isCached(INPUT)) { setImage(reader.readCache(INPUT)); return; } QFuture future = reader.read(INPUT);

This solution works, but the API is not ideal. Because it would violate the “Tell, don’t ask” principle. The best way is to combine readCache() and read() into a single function that always returns a QFuture object. But there is a problem, QFuture/QtConcurrent can only obtain a result from a thread. It is quite odd to start a thread but the data is already available. To get rid of this problem, we need a 3rd party library.

AsyncFuture

AsyncFuture is a C++ library that could converts a signal into a QFuture type and uses it like a Promise object in Javascript. It provides a unified interface for asynchronous and concurrent tasks. The library only contains a single header file, so that it is very easy to bundle in your source tree. Or you may install it by qpm.

Project Site:
https://github.com/benlau/asyncfuture

Let’s rewrite the above function with AsyncFuture:

QFuture ImageReader::read(const QString &fileName) { if (m_cache.contains(fileName)) { // Cache hit. Return an already finished QFuture object with the image auto defer = AsyncFuture::deferred(); defer.complete(m_cache[fileName]); return defer.future(); } if (m_futures.contains(fileName)) { // It is loading. Return the running QFuture return m_futures[fileName]; } auto readImageWorker = [](const QString &fileName) { QImage image; image.load(fileName); return image; }; auto updateCache = [=](QImage result) { m_cache[fileName] = result; m_futures.remove(fileName); return result; }; QFuture future = AsyncFuture::observe(QtConcurrent::run(readImageWorker, fileName)).context(this, updateCache).future(); m_futures[fileName] = future; return future; }

This time it is almost perfect. The deferred object provides an interface to complete/cancel a QFuture manually. That could replace readCache() by returning an already finished future object.

Moreover, it has added a new feature to avoid duplicated image reading. In case you have made requests to load the same image twice before it is cached, the original design would start two threads which are totally wasting CPU power. This version solves it by keeping all the running future in a future pool and return that future for duplicated read.

Make the example more complicated

Currently the example is very simple. Let’s try to make it more complicated.

Requirements:

  1. Add a readScaled(fileName, size) function that returns an image which is scaled to specific size
  2. Code reuse is a must
  3. The scaling must be done in another thread to emulate a high CPU usage function
  4. Load cached image if available
  5. But scaled image do not need to keep in cache

The most optimistic solution is to make use of the result of read() directly. That mean you have to create a thread that depends on the result of another thread. That is a bit hard to get it works with only QtConcurrent and probably it needs to use a lock. But it can be easy to be done with AsyncFuture’s future chaining feature.

QFuture ImageReader::readScaled(const QString &fileName, const QSize &size) { auto scaleImageWorker = [=](QImage input) { return input.scaled(size); }; auto callback = [=](QImage result) { return QtConcurrent::run(scaleImageWorker, result); }; QFuture input = read(fileName); QFuture output = AsyncFuture::observe(input).context(this, callback).future(); return output; }

First of all, it calls read() function to obtain an image from QFuture. It doesn’t care about the caching mechanism as it is already handled by the read() function.

Then it creates a new future object to represent the whole work flow of the chain:

QFuture output = AsyncFuture::observe(input).context(this, callback).future(); ^^^^^^^^^

A chain begins with a observe() function, then followed by an observer function to bind the callback to the observed future, and that will create a new future object to represent the result of the callback.

auto callback = [=](QImage result) { return QtConcurrent::run(scaleImageWorker, result); };

You may wonder if it is alright to run another worker function within the callback function. In fact, this is a feature of AsyncFuture. It provides a chainable API that works like a Promise object in JavaScript. If the callback returns a QFuture object, it will be added to the chain. Then the final output future will depend on the returned future. Therefore, the output future is in fact represents the result of read() , callback() and scaleImageWorker(). The flow could be visualised by this diagram:

sequence-diagram_promises

Diagram: The workflow of readScaled() – it shows how it uses a single QFuture to represent the result of a multiple steps task.

Conclusion

Using QtConcurrent without sharing data between threads could make multithreaed programming easier because it doesn’t need to manage an access lock. But real world problems are usually more complicated. A task may not be able to complete without interaction from other threads. In this case, it may still need an access lock to protect critical session. But once you have used it, it will fall back to the old traditional way, and probably it may get the same problem mentioned at the beginning.

In this article an alternative solution is presented: Use Concurrent API together with asynchronous callback then chain them into a sequence by a promise like API. It works by breaking down a task into multiple steps. Whanever a concurrent function seeks for extra information from another thread, it should just terminate itself and pass the control back to the main thread. So that it doesn’t need an access lock that may raise issues like deadlocks and race conditions.

The whole workflow could be represented by a QFuture object, a unified interface for all kind of asynchronous workflow.

However, this doesn’t mean we get rid of locks completely. They are still necessary for some scenarios. So choose your solution case by case.

The post Multithreaded Programming with Future & Promise appeared first on Qt Blog.

Uncovering 32 Qt best practices at compile time with clazy

Tue, 04/18/2017 - 08:00

In a previous blog post we introduced clazy, a clang plugin which makes the compiler understand Qt semantics, allowing you to get compile-time warnings about Qt best practices ranging from unneeded memory allocations to misuse of API, including fix-its for automatic refactoring.

Today we’ll do a round-up and present the checks related to connect statements, Qt containers (including QString) and misc Qt facilities.

Connects 1. old-style-connect

Finds connect() statements still using the old SIGNAL()/SLOT() syntax. The Qt …

The post Uncovering 32 Qt best practices at compile time with clazy appeared first on KDAB.

Calligra 3.0.1 update released

Mon, 04/17/2017 - 07:14

We have released a bugfix update of Calligra. The 3.0.1 version contains the following fixes:

General

  • Fix crash in move command when using arrow keys
  • Respect container boundaries when moving shapes by arrow keys
  • Remove shape manipulation handles when the tool is deactivated
  • Always display shapes in the the same order in the ‘Add shape’ docker

Sheets

  • Improve formatting of scientific numbers
  • Fix save/load of cell borders

Plan

  • Bug 376469: Bad month calendar in Work & Vacation
  • Day numbers where not initialized correctly.
  • Manually entered dates where not parsed correctly.
  • Use default currency symbol if the currency symbol is not explicitly set

Chart

  • Fix crash when chart type is changed
  • Fix crash when a chart component is deleted
  • Fix crash when x- or y-axis is removed
  • Fix ui when editing axis label
  • Limit moving chart components to chart boundaries
  • Fix edit font dialog: Keep the axis fonts QFont size in sync with
    KCharts fontSize
  • Fix save/load of axis label font size and font family
  • Save/load legend alignment flags
  • Do not save axis label if it is not visible
  • Always do legend alignment when legend becomes visible.
  • Make axis dimensions translatable
  • Add undo command for hide/show titles
  • Add undo command for add/remove axis
  • Respect margins/spacing
  • Handle resizing in a reasonable way

Kubuntu 17.04 Banner

Sun, 04/16/2017 - 15:48

Hi to everyone!!
I’m really proud to have designed the banner for Kubuntu 17.04.
I used the beautiful Ken Vermette wallpaper as a base. I hope you like it!

rect4147a

You can find it on Kubuntu.org


Kubuntu 17.04 Released!

Thu, 04/13/2017 - 16:19

Codenamed “Zesty Zapus”, Kubuntu 17.04 continues our proud tradition of integrating the latest and greatest open source technologies into a high-quality, easy-to-use Linux distribution.

The team has been hard at work through this cycle, introducing new features and fixing bugs.

Under the hood, there have been updates to many core packages, including a new 4.10-based kernel, KDE Frameworks 5.31, Plasma 5.9.4 and KDE Applications 16.12.3.

The Kubuntu Desktop has seen some exciting improvements, with newer versions of Qt, updates to major packages like Krita, Kdenlive, Firefox and LibreOffice, and stability improvements to the Plasma desktop environment.

For a list of other application updates, upgrading notes and known bugs be sure to read our release notes.

Download 17.04 or read about how to upgrade from 16.10.

Qt 3D Animation Easter Teaser

Thu, 04/13/2017 - 12:32

As an Easter treat here is a quick taster of some of the animation goodies coming to Qt 3D along with Qt 5.9. In this post we will briefly outline the steps needed to create a simple Qt 3D application and the assets it uses to produce this little animation: continue reading

The post Qt 3D Animation Easter Teaser appeared first on KDAB.

Progressive Web App and Planet KDE

Wed, 04/12/2017 - 23:02

Hi! Today I'm here to share an experience and show you an Application that I did last weekend. On the last Saturday, I went to an event called Progressive Web Apps Roadshow made by Google. It's an event that is going around the world, where Googlers talk about Progressive Web Apps and why they are [...]


LibreOffice the better Office

Wed, 04/12/2017 - 20:14
Ideas and Concepts

 

In the last 3 months I played with the awesome feature of Notebookbar. This experimental feature give the user the possibility to use a tabbed toolbar like Microsoft does, but it offers more, much more. I like the idea from the LibreOffice UX team about the context based toolbar. Advantage of the different UI elements:

Toolbar

Toolbars are great to offer the users the most frequently used actions. You can group them and with the Notebookbar you can arrange them in different sizes, with and without labels. The disadvantage is that you can’t show all functions from LibreOffice in the toolbar.

Menubar

The benefit of a menu bar is that you can sort all actions into a useful structure, and the experienced users know where to find actions that they used only from time to time. The disadvantage of a menubar is that you have to navigate through the structure.

Sidebar

The sidebar is great to group sections of actions, and you have a lot of vertical space, so I decided to use some layout examples from the sidebar.

Tabbed Toolbar

The benefit is that you can show all actions within the toolbar because actions are placed on different tabs. The problem is that the user have to know where the actions are.

Grouped Toolbar

The LibreOffice UX team introduced the toolbar with contextual section, that I like much because users can assign actions to different groups and label them. The Notebookbar offers also the option to place button in different sizes onto the canvas, which is used in the variant with contextual section to draw attention to more relevant actions.

Advanced Grouped Toolbar

 

My proposal starts with the variant “contextual sections” and extends it to the menubar. In addition I’m a fan of consistency so this is my idea:

ToolbarLayoutsOrigin.png

Groupedbar full

The idea is to combine the top level structure from the main menu with grouped toolbar sections.Sections always start with one big labeled icon followed by two rows with 24px icons and labels if needed. Next to the section label a menu is placed at bottom right that provides access to less often used functions from this group. Furthermore small buttons open dialogs from the group (e.g. Paragraph settings on the Format section). The label is also a drop down menu like in the menubar.

So I have the benefit of a toolbar where you can show the main actions for different groups by one click. Advanced actions for a group via smaller icons and a group label to support orientation in the UI. With the bottom menu you get all actions for one group with two clicks.

The drawback of this solution is that 10 sections or more exceeds the common width of 1280px. Ribbons solve this problem  with tabs, I’ll do it per contextually showing sections, depending on the screen resolution. he extended grouped toolbar was designed with 1920px (full HD screen resolution) in mind, but will also work on 1280px and on 2560px Screens.

Groupedbar compact

The design is the same as for the extended grouped toolbar but with only one icon row and a second row with the group labels. For users how don’t need the section labels, those can be hidden to save even more space.

What’s done

 

This isn’t just a mockup, it’s a real UI file – you can/should test the extended grouped toolbar and the single line toolbar. Thanks to Szymon Kłos

LibreOffice Theme

Unfortunately there are some open bugs:

  1. Switching section depending on the context is not as smooth and flicker-free as possible (see switch between text view and table view) Bug 107083
  2. The group labels don’t work as known from the menubar. Implemented as just a label makes…, because something like the drop down menubar behavior isn’t available yet. Bug 107084
  3. Theming work now with firefox personas it would be nice if I could define system colors without personas. Bug 107128
  4. Show/hide the label row isn’t possible with a simple action. Bug 107085
  5. There are some missing content views like for print and for insertdraw. This bug is still open for the other content based toolbars. Bug 106505 and 107127
  6. The priority content for the notebookbar need some improvement. Bug 107129
  7. Show/hide button labels depending on the windows size. Bug 106566
  8. The action expander for e.g. Paste, Table, … should be right to the label instead of vertical align. Than the alignment of the labels is perfect. Bug 106564
Download

I’d like to integrate the two layouts into LibreOffice master asap you can download a daily build for your System. You can download the .ui files and move them to <libreoffice>/share/config/soffice.cfg/modules/<module>/ui see „How to create your own Notebookbar“.

Help is very welcome.


WikiToLearn: now available in German!

Wed, 04/12/2017 - 15:12

Thanks to the work of our volunteers, with a special mention to Matthias Heil and Karin Cienkowski, we’re happy to announce the official opening of the German portal of WikiToLearn. We hope it will be of great service to the German community and we’re sure it will help creating even more free textbooks for everyone to use.

If you speak German, we encourage you to become part of it, by using Feynman’s tecnique! Pick a topic you love, and write some chapters on it, explaining it to someone else. You will have a big positive impact on the world, and you will learn the subject with great efficiency.

The homepage of WikiToLearn in GermanThe homepage of WikiToLearn in German

63 pages are already live, including a small course introducing Python programming with Qt and KDE to high school students. What are you waiting for? Start sharing your knowledge: digitize your notes, talk to an institution close to you or just start editing some new content!

And remember:

Nur wenn Wissen geteilt wird, kann neues enstehen

…and of course, if you get stuck, you can always get help on the official Telegram channel or on the community chat.

L'articolo WikiToLearn: now available in German! sembra essere il primo su Blogs from WikiToLearn.

Qt World Summit 2017 Early Bird Tickets Now Available!

Wed, 04/12/2017 - 10:36

qtws_berlin

Build for Tomorrow
Deliver Today

The 14th annual Qt World Summit is returning to Berlin! Be sure to join the Qt event of the year taking place 10-12 of October at bcc, Berlin Congress Center.

Get ready for five tracks of inspiration as we bring the latest details on what is happening with Qt. From innovative demos to expert presentations, inspiring Speakers and the coolest applications imaginable. Whether you’re looking to take a deep technical dive or seeking business insights, we have something for everyone at this year’s Qt World Summit

Designed for business people and developers alike, the Qt event of the year has something for everyone who is envisioning, innovating and implementing tomorrow’s devices and applications.

At Qt World Summit in Berlin, get on the inside track on how software is driving the future of IoT. Learn the secrets to creating user experiences that stand out and are a pleasure to use – and a pleasure to build. See how you can maximize development performance for embedded, desktop, and mobile devices. Be a part of the biggest Qt event in 2017 – check out all the latest demos and Qt applications, meet with other Qt users and developers from all around the world and across multiple industries.

Tickets available now

register_early

Head over to the Qt World Summit website and click Register to make sure you are among the first to get your tickets.

Qt Contributors’ take note

This year we will not hold a separate Qt Contributors’ Summit, but we are inviting all Qt Contributors to a pre-event before Qt World Summit.

So mark your calenders, October 9th and 10th are the days, and the place is bcc.

To register, go to the Qt World Summit website and click Register, Qt Contributors’ Days are included in the ticket list with a nominal fee.

The post Qt World Summit 2017 Early Bird Tickets Now Available! appeared first on Qt Blog.

Disabling narrowing conversions in signal/slot connections

Wed, 04/12/2017 - 08:05

A small new feature that I have added to Qt 5.8 is the possibility of disabling narrowing conversions in the new-style QObject::connect statement. In this short blog post I would like to share with you why I thought this was useful and therefore implemented it.

The problem

Since Qt 5.0, the new-style, PMF-based (pointer to member function-based) QObject::connect will check at compile time if the signal’s signature is compatible with the slot’s one.

For instance, let’s consider these two …

The post Disabling narrowing conversions in signal/slot connections appeared first on KDAB.

ArcGIS Runtime SDK 100.0 by Esri is here

Tue, 04/11/2017 - 21:48

In 100.0, Qt developers have even more capabilities for adding mapping and geographic analysis to native apps than ever before. 3D geographic visualization, 2D vector tiled basemap support, enriched error handling in the API, and additional geoprocessing tools are just a few of the new highlights.

Esri is proud to announce the commercial release of ArcGIS Runtime SDK 100.0 for Qt. This is quite a revolutionary and innovative release for ArcGIS developers. The API architecture is continuing to evolve for those of you who are looking to build great native applications for a wide range of devices and platforms!

In addition, Qt developers have more app deployment and design options. These include the following:

  • Support for writing C++ apps that can target all platforms, including macOS, iOS and Android. Esri is committed to providing as many developer options for Qt developers as possible!
  • Support for separating your QML and C++ business logic. Enabling support for this design pattern frees up the Qt developer to adopt best-design practices while writing great GIS apps!

A few of the highlighted features include, but are definitely not limited to:

  • 3D visualization – On desktop platforms, 3D has been brought to the ArcGIS Runtime for native app development. Build 3D scenes with raster, tiled and vector data sets including 3D specific symbology for enhancing viaualization of your geographic data. 

esri-globe-300

  • Maps and scenes – The Map object has been split out from the view that displays it, to represent the model or viewmodelcomponent in a Model-View-Controller (MVC) or Model-View-ViewModel (MVVM) architecture. This same design is also implemented for Scene objects.

maps-and-scenes-300

  • Military symbology API – On desktop platforms, the API and workflow for using Military symbology has been greatly simplified in this release.

military-symbology-api-200x200

  • Go offline – To make things easy for you, the APIs for common operations such as editing, searching, geocoding or routing are the same whether you are online or offline.

There are too many capabilities to describe in this short post, so go check it out yourself. You’ll be surprised by how much you can achieve with ArcGIS Runtime SDK 100.0 for Qt.

We invite you all to download v100 and get started today!

 

 

The post ArcGIS Runtime SDK 100.0 by Esri is here appeared first on Qt Blog.

KActionRunner

Tue, 04/11/2017 - 16:34

(a bit sick, so I’ll not write too much)

Sometimes I create a small widget for my own usecase and never blog about it, but this one I think it should be pushed upstream. It’s a small KComboBox that uses a KActionCollection based model to display *all* of the actionCollection’s actions.

The use case for me is really straigth forward – a lot of applications have *tons* of menu / toolbar options, sometimes none of them is visible to the user (unless the user knows where to look at), sometimes the user knows that something exists but cannot find it because the menus are huge, but he remembers the name, or parts of it. I know that this is true for me regarding Kate and the amount of possible programming languages it suports:

My idea is simple: if it’s easy for us to search for thousands of applications using a search line, it should also be fine to do the same thing for the possible actions on any application. thus, KActionRunner was programmed (in about an hour, so lot’s of bugs should still be there.)

The same rules apply for all software, default should be simple, but powerfull when required, and I do think this widget adds both things: it will still keep the defaults clean and it will make more power actions more easily discoverable.

I’ll also change the Delegate to make it more friendly to this post win98 era, but for now that’s what I have.

The code is currently in review, and I do belive that in it’s current state it will not pass ;), but it’s a Wip, and a Wip is for that. if there’s enougth love for that idea I’ll polish it.

KDE at the Augsburger Linux-Infotag 2017

Tue, 04/11/2017 - 09:18

In two weeks I’ll be in Augsburg at the 16th Augsburger Linux-Infotag.

Here you’ll have a chance to meet in person, have a look at the latest and greatest Plasma Desktop and see what’s coming up for Plasma 5.10 and other future goodies!

Date: Saturday, 22 April 2017
Time: 9:30 – 17:30
Place: Hochschule Augsburg, Fakultät für Informatik, Friedbergerstr. 2

How input works – touch screen edge swipe gestures

Mon, 04/10/2017 - 20:04

Continuing my series about how input works in KWin/Wayland I want to discuss a brand new feature we implemented for Plasma 5.10. This year we had a developer sprint in Stuttgart and discussed what kind of touchpad and touch screen gestures we want to support and how to implement it. Now the result of this discussion got merged into our master branch and we are currently discussing which actions to use by default.

Gesture Recognizer

Touchpad and touch screen gestures are kind of similar so the approach we took is able to handle both of them. We introduced a GestureRecognizer which is able to recognize gestures (surprise) in a very abstract way. It doesn’t know how the input events look like, whether a touch screen, touchpad, mouse or whatever input device generated the event.

To use the GestureRecognizer a Gesture needs to be registered. The Gesture describes the actual Gesture which needs to be recognized. E.g. how many fingers need to participate in the gesture (for our touch screen gestures it is one, for our touchpad gestures it is four), the direction of the gesture (leftwards, rightwards, downwards, upwards), the minimum distance, the trigger position, etc. etc.

Now input events can be fed into the GestureRecognizer and the GestureRecognizer decides whether a Gesture is active or becomes non-active. As said this is absolutely generic, it doesn’t care how the events are triggered.

This alone does not yet allow to do anything with it, we don’t have any way to use the GestureRecognizer yet.
At this point our implementations for touchpad and touch screen divide. We have different existing implementations which are more suited than trying to have something shared for both.

Touchpad gestures

For touchpad gestures our global shortcuts handling is used. GlobalShortcutsManager is a KWin internal (!) mechanism to register some internal actions to tigger in a global way through input events. The GlobalShortcutsManager gained a GestureRecognizer and various areas in KWin can now register a QAction as a global touchpad gesture.

So far we still haven’t reached the elements we discussed in the previous posts like InputEventFilter. There is of course an InputEventFilter which feeds events into the GlobalShortcutsManager. This filter got extended to support touchpad gestures and now we have the full stack together:

  • libinput reports a touchpad gesture event
  • InputEventFilter passes the touchpad gesture event to the GlobalShortcutsManager
  • The GlobalShortcutsManager passes the information to the GestureRecognizer
  • The GestureRecognizer triggers the QAction
  • something happens

By default the following gestures are supported:

  • 4 finger swipe down: Present Windows
  • 4 finger swipe up: Desktop Grid
  • 4 finger swipe left/right: desktop next/previous
Screen edge support for touch

For touch screen gestures we used a different area in KWin which already provides a fairly similar functionality: Screen edge activation for mouse events.

It’s similar in the way that it activates an action when an input event happens at a screen edge. The main difference is the direction of the input event: for mouse it’s towards the edge, for touch it is from the edge.

The ScreenEdges gained a GestureRecognizer (you see there are two different, independently acting GestureRecognizers) and every Edge defines a Gesture. The Gesture is only passed to the GestureRecognizer if the Edge is reserved for a touch action. Each Edge can have a different action configured and of course you can configure different (or same) action for touch and mouse on the same Edge. When a Gesture for an Edge gets started we provide the same visual feedback as for the edges started through mouse events.

For ScreenEdges there is also a dedicated InputEventFilter which now gained support for touch events and feeds the touch events into the GestureRecognizer.

But there is more to it. This feature got backported to X11. Our X11-standalone platform plugin gained support for XInput 2.2 and touch events. KWin now listens for touch events on X11 and passes these events into the GestureRecognizer of the ScreenEdges. Thus the feature which we implemented on Wayland for Wayland is also available on X11 and directly usable for all users – be it on X11 or on Wayland.

Touchpad gestures are unfortunately only available on Wayland.

Thank you for your love

Mon, 04/10/2017 - 14:47

I just received another anonymous happiness package, this time personal:

You have worn many hats in open source over the years, not just as a contributor, but also as a mentor. I put a lot of high value into your thought-out opinions and insights. You have a unique and open-minded way of thinking about things, in open source and personal things alike. I’m thankful that we have people like you in open source communities to build better software and also to build better communities. I am lucky to have someone like you around. Thanks for being there always.

Lots of love.

What can I say? &#55357;&#56898; I am feeling overwhelmed. Thank you so much to whoever has sent me this bit of love!

 

L'articolo Thank you for your love <3 sembra essere il primo su Blogs from WikiToLearn.

WikiToLearn Happiness Packet received!

Mon, 04/10/2017 - 10:45

Dear anonymous happiness sender,

I woke up this morning to your love message for the WikiToLearn community, sent through happinesspackets.io. The e-mail address used to send the packet is only read by a few people, so I am reposting this love for the whole community to enjoy. Here are the contents of the packet:

I feel totally overwhelmed, excited and very, very grateful. Thank you for caring. You people are just unbelievable. You are a bunch of craziest, most awesome and the most positive people I’ve ever met. You inspire me to give back to the community.

I wish I could express properly what I’m feeling right now.

Thanks for everything guys. Sending hugs, you crazy, amazing people!

What can I say, if not sharing the love for the amazing community that got together? Your words are beautiful and inspiring, and I personally feel extremely happy to have contributed, in my little part, to create such great vibes.

Dear anonymous sender, I do not know who you are, but lots of thanks and love to you too. &#55357;&#56898;

Love only grows if shared.

 

L'articolo WikiToLearn Happiness Packet received! sembra essere il primo su Blogs from WikiToLearn.

Pages