Language Selection

English French German Italian Portuguese Spanish

Kde Planet

Syndicate content Planet KDE
Planet KDE
Updated: 9 hours 20 min ago

CSD support in KWin

Thursday 23rd of July 2020 08:44:43 PM

If you are a long time Plasma user, you probably remember the times when most GTK applications in KDE Plasma prior to 5.18 were practically unusable due to the lacking support for _GTK_FRAME_EXTENTS. In this blog post, I would like to get a bit technical and walk you through some changes that happened during the 5.18 time frame that made it possible to support _GTK_FRAME_EXTENTS in KWin. I also would like to explain why after so many years of resistance, we had finally added support for client-side decorations. So, buckle up your seat belt!

What is _GTK_FRAME_EXTENTS, anyway?

A window can be viewed as a thing that has some contents and a frame around it with a close button and so on. The “server-side decoration” term is used to refer to a window frame drawn by the window manager (KWin). If the application draws the window frame by itself, then we refer to that window frame as a “client-side decoration.”

An example of a window frame being drawn by the window manager (KWin) An example of a window frame being drawn by the application (gedit)

A cool thing about client-side decorations is that they are very eye candy, but there is also a lot of drawbacks about them, for example if the application hangs, the user won’t be able to close the window by clicking the close button in the window frame. But the biggest issue with client-side decorations is that the window manager has to know the extents of the client-side drop shadow otherwise things such as window snapping and so on won’t work as desired.

_GTK_FRAME_EXTENTS is a proprietary GTK extension that describes the extents of the client-side decoration on each side (left, right, top, and bottom). From the word “proprietary” you have probably already guessed that _GTK_FRAME_EXTENTS is a thing that is not in any spec. We can’t afford implementing a proprietary extension simply because we don’t know whether re-designing KWin will pay off in the end. What if GTK ditches _GTK_FRAME_EXTENTS for something else and our hard work will be for nothing? There were some suggestions to standardize _GTK_FRAME_EXTENTS in the NETWM spec, but it didn’t go well.

So, what did change our minds?

It might come as a surprise, but the reason why we decided to add CSD support after so many years of being reluctant was Wayland. In order to fully implement the xdg-shell protocol (the de-facto protocol for creating desktop-style surfaces), we must support client-side decorated windows. Prior to that, we didn’t have any reason that could possibly somehow justify the changes that we would have to make in code that was battle-tested for many years.

With Wayland, we know what changes have to be done in order to add support for client-side decorated clients. Surprisingly, the geometry abstractions that we chose specifically for client-side decorated Wayland clients turned out to be also pretty good for client-side decorated X11 clients, so we decided to add support for _GTK_FRAME_EXTENTS since it didn’t require any huge changes.

It still means that we will be screwed if GTK switches to something completely different on X11, though. But let’s hope that it won’t happen.

CSD and KDE Plasma

“But Vlad,” you may say. “Does this mean that KDE is going to switch CSD?” No, as far as I know, nothing has changed, we still use server-side decorations. Support for client-side decorations was added because it’s something that we need on Wayland and to make GTK applications usable on X11.

Frame, buffer, and client geometry

Warning: This is a brain dump. Please skip to the next section if you’re not interested in technical stuff.

For an old school window manager such as KWin, client-side decorated windows are troublesome mainly because due to the long history all rendering related code had been written with the assumption that the window frame wraps the window contents. If an application draws the window frame on its own, that’s not the case.

In 5.18, we tackled that problem by introducing two new geometries to separate window management from rendering – the frame geometry and the buffer geometry.

The frame geometry describes a rectangle that bounds the window frame. It doesn’t matter whether the window is client-side decorated or server-side decorated. This kind of geometry is used practically for everything, for example window snapping, resizing, etc. KWin scripts see and operate on this geometry.

The buffer geometry is used primarily during rendering, for example to build window quads, etc.

In 5.20, we introduced yet another new geometry, which existed prior to that in an implicit form – the client geometry. The client geometry indicates where the window contents inside the window frame [1] is on the screen. We use this geometry primarily for configuring windows.

It can be a bit challenging to deal with three different geometries at the same time, but there is not that much we can do about it, unfortunately. Each geometry has its own specific domain where the other geometries are inappropriate to use.


CSD is a rather controversial subject in the KDE community, but it’s here and it’s not going anywhere, anytime soon.

[1] On X11, the client geometry actually corresponds to the geometry of the client window.

All About the Apps Junior Jobs

Thursday 23rd of July 2020 10:09:09 AM

The Ubuntu Podcast did a review in their new edition of the KDE’s Applications site.  Listen from 14 minutes in.  You can hear such quotes as

“It’s pretty neat, It shows the breadth of applications in the KDE universe, tonnes of stuff in here”
“A big green button to install the thing”
“KDE applications are broad and useful”
“They publish a tonne of applications in the Snap store and they are hugely popular”
“Valuable software that people want to install and use irrespective of the desktop they are on”
“They make high quality and useful applications”
“Well done KDE, always very mindful of user experience”

They did suggest adding a featured app, which is a task we also want to do for Discover which has featured apps but they don’t currently change. That feels like an interesting wee task for anyone who wants to help out KDE.

But more easy would be the task of going over all the apps and checking the info on them is up to date, including going over the various app stores we publish on like the Microsoft Store and making sure those links are in the Appstream meta-data files.

Finally, the main task of All About the Apps is getting the apps onto the stores so we need people who can get the apps running on Windows etc and put them on the relevant Stores.  I did an interview asking for this for Flathub in the most recent monthly apps update.

We’re here to help on our Matrix room and my contact is always open.

You can open Mesh Gradients in Krita now!

Thursday 23rd of July 2020 09:47:00 AM
TL;DR: meshgradient get rendered in Krita just like you'd expect them to render in other apps

Well, because I couldn't get Bicubic interpolation fully working by the time of writing and publishing this blog. This part is still in pending state :(
Firstly, here are is a screenshot of a complex meshgradient which I found from Inkscape (I modified it to be Bilinear to get this):


As, there isn't much else to say besides giving out the details, I'll jump straight to the technicalities :-)

Technicalities Rendering (Bilinear) I started with reading the algorithm mentioned in the specs sheet i.e Divide And Conquer. I had some confusions about it, but thanks to my mentors. I got the idea. Then, to implement this algorithm, the idea was to subdivide the patches, until the difference between the corners is small enough.

Now the question was, how am I going to divide the surface. Luckily, there was a paper, one search away, which I picked up. I read it quickly and started writing the algorithm on paper. Somethings didn't quite make sense, but as I later found out that they were probably misprints.

So, as I implemented the algorithm, the first thing that I tried to open was this, to check if the subdivision algorithm was right. Comparing this to Inkscape, it was pretty accurate (not the color, but the surface itself).

Next, get colors for the new corners was simple too. You could get it by dividing it in half (we get this from the fact that the surface is Bilinear). Then just mix them when difference is less than the tolerance and you get this:

Caching Because rendering meshgradients is expensive and anything e.g a simple translation would call for a complete redraw. I had to write a way for poor man's caching. Instead of painting directly on a the canvas. I would first paint on QImage and then paint it on QPainter.

Simple enough! However, there was a problem, rendering on QImage and then on scaled up QPainter made things look very pixelated because of scaling. So, to counteract this, my solution was to paint on scaled up QImage i.e scale it up by the same factor as the QPainter. This made everything a whole lot better.
Rendering (Bicubic Interpolation)This has been the hardest part about this GSoC (till now). The way I usually write code is, I write everything in a bit messy way till I get something running. Then I come back and check if something could be written in a better way (read efficiency and readability). This approach went horribly wrong as I probably had made mistakes and my render was pure chaos and nowhere close to what you call interpolation. Then I git stashed everything and started over in a more manageable way, now the interpolation was working. But turns out, it was an exact replica of the Bilinear interpolation, but slower (because it did actually calculate derivatives and what not).

So, I asked for help. But then I immediately realized that my assumptions were wrong. In short, I was calculating derivatives incorrectly. I quickly modified the code in the dirty way and finally I could see a smooth render with no Mach Banding. Unfortunately, this too is based on an assumption, which is not correct for the all cases. So, Bicubic interpolation works neatly for Mesh Patches which are relatively linear. But falls out of place for a more messy (generic case) ones.
But why? The problem here is with the way I do subdivision, it is only valid for linear Coons patches. I haven't written the code to subdivide a Bicubic surface. That isn't the only problem, subdividing Bicubic surface is an expensive operation as well. So, I'll have to find a middle ground.

SavingSince I spent a lot of time on getting Bicubic Interpolation to work, for a context switch I moved to the next milestone.

So, I tried to implement the saving operation. Thanks to all the abstractions! This was pretty straightforward to implement.
I will now write tests for it and the final rendering :)
That's all I have for now, hopefully I'll post an update when I get the Bicubic shading working :)

Bugs ...while rendering

The superfast Ryzen-powered KDE Slimbook

Thursday 23rd of July 2020 06:01:41 AM

I’ve had the privilege of testing and using the brand-new 15.6″ Ryzen-powered KDE Slimbook laptop for the past month. During that time, I worked with the Slimbook developers to perform QA and polish Plasma for this laptop. They’re awesome people who hosted our Plasma+Usability & Productivity Sprint last year at their offices. I’d like to share my impressions of their latest laptop.

Full disclosure: this laptop was sent to me for free for testing and development, so I have no financial skin in the game. They haven’t asked for it back yet, but I plan to either send it back, or purchase it, if I want to keep it. My configuration retails for 930€ (roughly $1,075), which is a steal for what you get. Regardless, what follows is what I believe to be an honest, unbiased review.

Performance and battery life

Here’s what I know you’re all waiting to hear about, so I’ll just start with it: performance with the 8-core/16-thread Ryzen 4800H CPU is unbelievable!

I can compile KWin in five minutes, compared to over 11 with my top-of-the-line Lenovo ThinkPad X1 Yoga with a 10th generation Intel i7 processor. Everything feels smooth and fast. The power of this machine is awesome, and the Ryzen CPU makes it heaven for people who need to perform processor-heavy tasks on a regular basis.

Despite this, case temperatures remain cool and the fan remains off when the machine is not under heavy load. The thermal management is excellent–far better than on my ThinkPad.

Additionally, battery life is amazing. The machine idles at around 3 watts and goes up to only about 7 or 8 with average tasks that don’t involve compiling KWin.

GSoC Work Status

Thursday 23rd of July 2020 12:00:00 AM

Hey everyone,

In the previous blog I wrote about my GSoC first evaluation. In this blog I have written about activities on which I have worked further to add multiple datasets.

Division memory game

In this sub-activity of memory, the goal is to match a division and its result, until all cards are gone. It helps children to practice division.
The procedure of adding multiple datasets to this activity is the same as of other memory activities. We just need to create different Data.qml files in the resource directory and load the datasets. For this activity, we need to use the function getDivTable() implemented in math_util.js and pass the respective numbers ranging from 1-10 to it.
This activity also has two modes. The first mode is in which the child needs to turn the cards to match to its equivalent division result. The second mode is the one in which the child needs to play with Tux to match the equivalent cards, as this mode is called “with Tux”. I have implemented multiple datasets for both of the modes. The dataset content of the activity Division memory game with Tux is the same as without Tux.

After the addition of multiple datasets to both modes, I tested it manually to make sure it works perfectly without any regression. This activity has been merged into the master branch.

Below image shows the multiple datasets content of this activity

Addition and Subtraction memory game

In this sub-activity of memory, the child needs to turn the cards to match addition and subtraction and its result until all cards are gone.

The level of previous memory activities were based on only a single arithmetic operation as only-addition or only-division, but this memory activities has two different operations for a particular level. As in case of this activity for any level, there would be few cards on addition operation and few of them upon subtraction.
The dataset addition procedure for this activity is also similar to other memory activities. We just need to use the getAddMinusTable() function from math_util.js.
This activity also has two modes as one “with Tux” and another “without Tux”. I have implemented multiple datasets to both modes of the activity.
After the addition of datasets, I tested it manually and made a merge request for it. This activity has been merged into the master branch.

Below image shows the multiple datasets content of this activity


Week 6-7-8

Wednesday 22nd of July 2020 06:30:00 PM
Part 6 -

Hi everyone

This month, I took forward my ongoing project with Gcompris and added Multiple Datasets for Categorisation, Gnumch equality, and Gnumch inequality activities.

If you are unaware of my project, multiple datasets, or Gcompris. I have explained everything in detail in my last post - here


In Categorization, pupils have to identify and categorize elements into correct and incorrect groups. Whenever we add multiple datasets in any activity, It is mandatory to add Activity Config before (you can see purple color sandwich like button in the above screenshot). Clicking on this button open ups the dialog box for configuring both multiple datasets and activity setting. It’s always easy when activity has no settings and I have to take care only about multiple datasets but In case of categorization, It has both activity settings and a dialog box which appears at starting to asks for downloading missing images and according to my proposal, activity setting should show different options for different datasets. So, for sure this was the most challenging activity for me. I was not very sure on how to test that “Download missing image” dialog box, as it appears only if any image is missing or we never clicked on “never show it again” option. So, as expected I broke it in my first commit :(. Where my mentor Johnny told me the way to test it and fix it :). Later mentors and I discussed and agreed that we don’t need to make activity setting options dependent on selected datasets. So in the end the most challenging activity has been merged into the master branch as any other activity.

Gnumch Equality and Inequality

After completing categorization, I picked Gnumch Equality and Inequality, they are two activities that use the same code. So I am working on both of them together. There are a total of 5 Gnumch based activities that inherits the same code and datasets need to be added in 2 of them. So obviously, I have to take care that my changes wouldn’t lead to any regression in other activities. Besides this, both activities only support addition and subtraction operations at starting, I have added the new functionality to support multiplication and division operations. Gnumch is basically a game, a bit similar to Pacman :). So, It was fun to work on this activity. By the way, I am expert now :) The changes for these activities haven’t merged yet, they are still in review.

The final two activities left are to Build the same model and find the details. I have just started working on Build the same model and most probably I will cover both of them in my next blog.

Have fun!

Going Focal

Wednesday 22nd of July 2020 10:33:26 AM

Here at KDE neon base camp we have been working on moving the base of our system to Focal, Ubuntu 20.04. If you’re interested in the mechanics you can see the status, and indeed help out, on our 20.04 workboard.

But probably you’re more interested in giving it a try. This is in testing mode still and comes with a no money back warranty. Instrucitons are on the testing forum thread. You can either do an upgrade or a full install from the preview ISOs. Let us know how you get on!

My file menu is not full of eels

Wednesday 22nd of July 2020 09:00:26 AM

This is the story of a bug in an open-source project I maintain; as the maintainer I review and sometimes fix bug reports from the community. Last week, a user reported that the ‘File’ menu of the application was not appearing on macOS. Some investigation showed this didn’t happen when using the default translation (i.e English), but a bit more investigation showed that it only happened when the language in use was Dutch.

At this point I’d like to make it clear that I like the Dutch and especially gevulde koeken, a type of almond cookie you can only get in the Netherlands. When passing through Amsterdam Schiphol, I take care to stock up at the supermarket on the main concourse. If you’re passing through Schiphol and wonder why they’ve been cleaned out of cookies, it was me.

Anyway, it was weird that the menu code I had written seemed to dislike the Dutch. Actually, as part of investigating the defect, I needed to switch my system language to Dutch. So I just did that for a week, and got to learn most of the macOS UI in Dutch. Lekker!

It turns out, the File menu (or actually, the ‘Bestand’ menu) was missing for a very sensible reason: it contained zero items. In this particular application, the menu is quite simple and contains:

  • load configuration file…
  • save configuration file…
  • quit

If you’ve used Qt on macOS, you’ll know the ‘Quit’ item is moved to the application menu (the one with name of the software) automatically. What you may not know is that Qt will, by default, move some other items:

  • About
  • Help
  • Preferences

All of these items have special locations on macOS. The default way to detect if a menu item should be moved this way, is based on a heuristic. A heuristic is a rule which works some of the time and goes wrong when your customer / manager is using the software. The default rule is to do this based on a string search of the (translated) menu item name. In this case, the Dutch translation of ‘Preferences’ is … ‘Configuration’. Therefore, both the first and second items in my file menu get treated as the application preferences item. Hence, the file menu ends up empty and is therefore made invisible.

Fortunately, the fix is simple: rather than accepting the default TextHeuristic MenuRole on your QActions, just set a role explicitly, such as Qt::NoRole. This disables the text heuristic and Dutch users can once again see the Bestand menu in all its glory.

QMenuBar* mb = new QMenuBar(); QAction* openAction = new QAction(tr("Open saved configuration...")); openAction->setMenuRole(QAction::NoRole); // change from Qt::TextHeuristicRole QAction* saveAction = new QAction(tr("Save configuration as...")); saveAction->setMenuRole(QAction::NoRole); // change from Qt::TextHeuristicRole QMenu* fileMenu = mb->addMenu(tr("File")); fileMenu->addAction(openAction); fileMenu->addAction(saveAction);

Now I just need to get some more of those cookies.

If you’re confused about the title of this post, kindly Google the ‘Hungarian phrasebook’ sketch by Monty Python — only maybe not on a work computer.

The post My file menu is not full of eels appeared first on KDAB.

KDE Slimbook: Plasma, KDE Apps and the Power of the AMD Ryzen CPU

Wednesday 22nd of July 2020 06:10:17 AM

Today Slimbook and KDE launch the new KDE Slimbook.

The third generation of this popular ultrabook comes in a stylish sleek magnesium alloy case that is less than 20 mms thick, but packs under the hood a powerful AMD Ryzen 7 4800 H processor with 8 cores and 16 threads. On top of that runs KDE's Plasma desktop, complete with a wide range of preinstalled, ready-to-use Open Source utilities and apps.

Both things combined make the KDE Slimbook a one-of-a-kind machine ready for casual, everyday use, gaming and entertainment; design work, animation, and 3D rendering; as well as hardcore software development.

The KDE Slimbook can fit up to 64 GBs of DDR4 RAM in its two memory sockets, and has three USB ports, a USB-C port, an HDMI socket, a RJ45 for wired network connections, as well as support for the new Wifi 6 standard.

It comes in two sizes: the 14-inch screen version weighs 1.07 kg, and the 15.6-inch version weighs 1.49 kg. The screens themselves are Full HD IPS LED and cover 100% the sRGB range, making colors more accurate and life-like, something that designers and photographers will appreciate.

Despite its slim shell, the AMD processor and Plasma software deliver enough power to allow you to deploy a full home office with all the productivity and communications software you need. You can also comfortably browse the web and manage social media, play games, watch videos and listen to music. If you are the creative type, the Ryzen 4800 H CPU is well-equipped to let you express your artistic self, be it with painting apps like Krita, 3D design programs like Blender and FreeCAD, or video-editing software like Kdenlive.

If you are into software development, you are in luck too: KDE provides all the tools you need to code and supports your favorite languages and environments. Meanwhile, Slimbook's hardware is ideal for CPU-intensive tasks and will substantially shorten your build times.

Pricing for the KDE Slimbook starts at approximately € 899 for the 14'' version and at € 929 for the 15.6'', making it more affordable than most similarly-powered laptops. Besides, when you order a KDE Slimbook, you will also be contributing to KDE, as the Slimbook company actively supports and sponsors KDE and donates part of the proceedings back into the Community.

Find out more from the KDE Slimbook page.

Google Summer of Code 2020 - Post 6

Wednesday 22nd of July 2020 01:10:00 AM

I updated the user interface of the Rocs graph layout plugin. Now, each layout algorithm corresponds to a tab. See below the tab for the Radial Tree Layout.

Using the same algorithm, the graph layout plugin can draw rooted trees and free trees (trees without a root). The next two figures show the same tree represented as a free tree and as a rooted tree, respectively.

The root vertex can be selected by the user or determined automatically. Currently, a center of the tree is used for automatic root selection. The user can also control the distance between nodes by changing the node separation. Tomorrow I will finish the tests and add some code to check if the graph being laid out is a tree.

Note: I decided to change the title of my GSoC posts to reflect the fact that I am not being able to follow a weekly schedule.

Improve MAVLink Integration of Kirogi – Progress Report 2

Tuesday 21st of July 2020 06:00:00 PM

Hello everyone!

This is my second progress report about GSoC 2020 project.

Please feel free to notice me if you have any question or idea :D

Kirogi can control multiple vehicles now

I finished implementing basic support for controlling multiple vehicles.

Now Kirogi automatically detects more than one vehicle on network and you can control them selecting each one.

This feature may not seem quite useful now but making Kirogi able to manage more than one vehicle at the same time will be very useful after implementing Mission Planner.

TCP&Serial communication will be supported

Currently class definition for supporting UDP and TCP connection is done.

Demonstration will be possible after implementing UI and class for managing those connections.

After implementing connection manager, overall class structure will be like below.

The UI for managing connections will be loaded at runtime. For QML to determine whether load the UI or not, all vehicle support plugins will have Q_PROPERTY isMultiConnectionSupported.

I think it would be better to have some kind of metadata file rather than adding virtual function that just returns constant value to vehicle support plugins. I think using KPluginMetaData. As I know, it just reads some specific keys from json file so I can't add arbitrary key to use but it seems I can read all keys from json file using  KPluginMetaData::rawData().

Message sequence will be tracked

As I mentioned earlier, MAVLink messages have sequence number.

All three kinds of connection classes parse incoming message using MAVLinkProtocol class. So implementing method for tracking sequence of message will be implemented in it.

Week 7: GSoC Project Report

Tuesday 21st of July 2020 10:53:09 AM

This week I completed unit-tests for interactions between storyboard docker and timeline docker. Also now thumbnails will only be updated when the image is idle, meaning if the image is not painted upon for some time, say a sec, the thumbnail will update. This will improve performance when using the canvas. I also wrote some functions that would help when implementing updating of affected thumbnails.

I wrote unit-tests for the interactions between dockers. Some of these interactions have been implemented and some are yet to be implemented. The planned behavior for various interactions according to tests is :

  • Items in storyboard will have unique and positive frame numbers and they will always remain sorted by the frame number.
  • On adding a keyframe in the timeline an item will be added to storyboard docker, if there is no item for that frame already.
  • On removing a keyframe in the timeline an item will be removed from the storyboard docker if there are no other keyframes at that time in timeline docker.
  • On moving an item in timeline docker,
    • if there is no item for the moved to frame, item is inserted for the “to” keyframe, otherwise not.
    • if there is no other keyframe at the moved from frame, item is removed for the “from” keyframe, otherwise not.
  • Selections in storyboard docker would correspond to the last selected keyframe in timeline docker for which item exists in storyboard docker.
  • Changing duration in storyboard docker for an item would add hold frames right after the keyframes for the item in timeline docker. If there are multiple layers in an image, hold frames should be added to all the layers.
  • Changing fps should conserve number of frames, that means if duration for an item was 2s 4f at 24 fps, and then fps changes to 12, then duration would change to 4s 4f.

Now thumbnails would be updated only when the image idle, that means, while the canvas is being painted upon, thumbnails would remain at the last version, and would update only when painting has stopped. It is similar to the overview docker but with a bit less delay.

This week I would work on implementing the remaining interactions and the update of all affected item on keyframe changes.

Launching Kdenlive Tutorials

Tuesday 21st of July 2020 06:53:00 AM
Many years ago I started writing a number of tutorials about Kdenlive, describing how to achieve visual effects similar to what you can get from commercial software (like the Adobe suite). But I didn't have time to translate my writings in English and format them with HTML. That was, until the last couple of weeks.
Now, I'm ready to release the website

All the contents you'll find on Kdenlive Tutorials are released under Creative Commons Attribution Non Commercial.
At this moment there are 48 different tutorials, I'm working on other two because I like multiples of ten.

All this work has been done in my spare time: I've been using automatic translation, performing some fast manual fixes. The result should be understandable, in the next months I'll fix the text to make it sound better.
I also know that Kdenlive's interface has changed a lot in this years: the functions I use in these tutorials are still available, they might just have a slightly different name or might be placed in a different spot of the GUI. If enough people are interested, I'll consider taking new snapshots and adapting the tutorials to the last version of Kdenlive.

The website's layout is simple, and every screenshot can be zoomed on. Every tutorial comes with a video that shows the results of the procedure. Videos are often raw: they have been made quickly, just to show what could be done in a couple of minutes. Anyway, every tutorial explains also how to improve the result, if you wanna spend more time on it.

Google Summer of Code 2020 - Week 5

Tuesday 21st of July 2020 12:30:00 AM

I finished writing an implementation of a tree layout algorithm for Rocs. After some research, I decided to go with a radial layout. The idea is to select a node to be the placed at the center and place the other nodes in circles of different radius. The layout is computed recursively and the plane is partitioned between sub-trees in order to guarantee that no edge crosses will exist. Some layouts generated by this implementation are shown below. Tomorrow I will finish the user interface and some tests.

FreeBSD Qt WebEngine GPU Acceleration

Monday 20th of July 2020 10:00:00 PM

FreeBSD has a handful of Qt WebEngine-based browsers. Falkon, and Otter-Browser, and qutebrowser and probably others, too. All of them can run into issues on FreeBSD with GPU-accelerated rendering not working. Let’s look at some of the workarounds.

I should mention that I personally have not hit this issue. Maybe I don’t watch enough video’s, or maybe I happen to have the right hardware to avoid the problem.

There are reported cases of Qt WebEngine-based browsers displaying video badly. If I remember correctly there was a mix-up at one point between RGB and BGR, and this bug report specifically mentions “videos with wrong colors”.

Depending on the browser, you may be able to use command-line arguments to affect hardware acceleration. The Qt documentation on WebEngine debugging mentions a number of command-line arguments that can be used to modify WebEngine internals.

Unfortunately, web browsers also parse command-line arguments.

From a little investigation, it turns out that the browsers handle the documented command-line arguments very differently:

  • Falkon accepts the WebEngine-related command-line flags that are documented. I can’t tell if they are effective: passing --no-sandbox still gets me debugging messages from sandboxing code. Oddly enough, falkon --help mentions a --help-all command-line argument, which is totally ignored.
  • qutebrowser has its own special --qt-flag to pass flags on to Qt internals. I suppose that’s because it has Python argument-processing first, followed by handing things off to Qt.
  • Otter supposedly supported --disable-gpu in the past, but now complains that it is an unknown option. Unlike Falkon, it does understand --help-all.

From this collection of inconsistencies, I think the conclusion should be that the environment is a better place to do any settings that should apply to WebEngine internally – the path from command-line argument to Qt internals is too much dependent on where and when processing happens and how “cleanly” the overall command-line arguments are passed on.

The documentation says

Alternatively, the environment variable QTWEBENGINE_CHROMIUM_FLAGS can be set.

and that looks like the best way to consistently affect the behavior of WebEngine inside an application, because it end-runs the command-line processing. After all, far fewer applications mess with the environment (their own environment) before instantiating QApplication.

That means that people using FreeBSD, experiencing video corruption in WebEngine-based browsers, can best put the following (or some csh equivalent) in their .profile:


Media Player Integration into KDE connect SMS App, GSoC 2020

Monday 20th of July 2020 05:31:01 PM

Hello everyone,

It’s been over two weeks since I posted last time. This is the fourth report for my GSoC project. Previous two to three weeks period, I spent working on integrating media player and image viewer into KDE Connect SMS app as well as changed and improved some of my previous implementations as pointed by my mentors. The project has reached the stage where the SMS app is able to receive and display thumbnails in the chat as well as user can request to view any original attachment file just by clicking on that particular attachment thumbnail and it will get opened inside the SMS app as well as user can open it in another multimedia application present on the desktop. Here’s a demonstration video of it’s working.

Now my next step is to enable SMS app to allow users to send supported multimedia files from desktop to android side from where it will be sent to the destination’s phone number. using klinker sms-mms library. In the next post I plan to show you guys a proper working SMS-MMS app which will not only allow users to send plain text messages but multimedia files as well.

Cantor - File Browser Panel

Monday 20th of July 2020 09:28:00 AM
Hello everyone,

this is the fourth post about the progress in my GSoC project and I want to present some user experience improvements related to the handling of panels in Cantor and to present a new panel "File Browser" that I implemented recently.

The status of Cantor's panels was not saved when the user closed the application. Potential rearangements and size changes done on panels were gone and the user had to do the changes again upon the next start. Very bad UX, of course. Now, the state is saved and even more, the state is saved for every backend in Cantor. So, if you have a Python session in Cantor, open some panels and arrange them at your will, close and reopen Cantor with a Python session again - the previous state of the panels appears on start.

The second change is about a new panel - the File Browser Panel:

This panel allows the user to navigate through tje file system and to open files. Files with the file type supported by Cantor (Cantor's native formant and Jupyter's notebooks) will be opened as a new worksheet in Cantor. Files with other types are open in the system's default application assosiated with that type.

In the next post I plan to show a new feature that will help to better structure the worksheet and to define a hierarchical structure of worksheet entries that can be operated on.

GSoC ’ 20 Progress: Week 5 and 6

Monday 20th of July 2020 04:30:59 AM


The Second Phase began with Week 5 of the coding period. The next two weeks involved debugging the previously written code and including necessary connections for it to work. For this, I made use of the signal – slot mechanism of the splendid framework that is Qt.

For those of you who are unfamiliar with this mechanism: a signal is emitted when a particular event occurs. For example, if a new subtitle line is added, i.e., the rows in the list model have changed, the rowMoved signal will be emitted. Similarly, if the model is reset upon startup, the modelReset signal will be emitted.

I added a setup function that would be executed upon model construction, which would connect all these default signals, related to changes made in distinct parts of the Subtitle model, to emit a single modelChanged signal. If a signal, for an event pertaining to the model, is emitted, it will mean that the model has changed.

Next, the modelChanged signal was connected to respective slots in other classes. A slot is a function that is called in response to a specific signal. These slots will execute a particular function every time the subtitle list model is changed.

Once all the necessary connections were made, the parsed subtitles, including the text and its duration; were easily added to the model upon application startup with no errors.

KStars v3.4.3 is Released

Sunday 19th of July 2020 03:27:00 PM
After 3 months of development, we're glad to announce the availability of KStars 3.4.3 for Windows, MacOS and Linux.

Let's check out the highlight of this release!

New Bahtinov Mask Focus Assistant Patrick Molenaar added a long requested feature: The Bahtinov Mask focus assistant tool. Users can activate the new algorithm in the Focus module.
Focus Bahtinov Assistant Tool
It is useful for users who do not have a motorized focuser and prefer to focus manually with the aid of the mask. After capturing an image in the focus module with the Bahtinov mask algorithm selected, Ekos would analyze the images and stars within it.  if Ekos recognizes the Bahtinov star pattern, it will draw lines over the star pattern en circles on the center and on an offset to indicate the focus.

Autofocus on Temperature Change
Florian Signoret added support for triggering autofocus procedure when the temperature exceeds a certain delta threshold in the capture module. The temperature is sourced primarily from the focuser itself, and in unavailable, then it falls back to the weather station, if any.

Focus Logs Doug Summers added a dedicated focus logger to help users analyze their autofocus runs to better understand their behavior and improve them in the future. Camera Driver Restart An experimental camera driver restart feature was added to the capture module. It should be used as a last resort option in case the camera driver is unresponsive. This feature commands the INDI server to only restart the camera driver without affecting any other drivers, so you don't have to shutdown the whole INDI server if one driver misbehaves. 

Restarting a camera driver might lead to quite a few complicated since it interacts with many subsystems in Ekos. Therefore, it is flagged as experimental in this release pending user feedback. Mount Hour Angle Limits
Previously Ekos Mount module supported enforcing Altitude limit for the mount motion. The mount is active stopped if its slew or track past there limits. Chris Rowland added the Hour Angle (HA) limits to prevent limit the mount from slewing and/or tracking past there limits. This can protect the equipment in case of a runaway motion that might lead a pier collision.

Filter Names Editor
A simple, but convenient editor was added in Capture module to edit filter names. Previously, you had to change filter names directly in INDI Control Panel which was not intuitive for quite a few users. Internal Guider Features
Hy Murveint contributed significant new features and improvement to the Ekos Internal Guider.

New Detection Algorithm: SEP MultiStar This is a new guide-star detection, tracking & drift computation algorithm.

You can select this in the Guide options menu (click Options... in the lower right corner of the Guide tab), and then click on "Guide", and then choose from the "algorithm" menu. There choose the guide-star detector. (e.g. there choices include Smart, SEP, Fast, ...). Try SEP MultiStar. It is more stable in all three respects (guide star selection, detection and drift calculation). You may not notice much difference in a normal guiding session when things are going well, except, perhaps, better choice of a guide star.

GPG RA Guiding: New control algorithm for RA guiding.Hy added a new guiding algorithm. This is for RA only--that is, guiding for DEC still happens, but using the existing guiding algorithms. This guider is based on the work in this PhD thesis and is the same as the well-regarded PHD2 guide algorithm known as Predictive PEC. You will see Copyright 2014-2017 Max Planck Society, now in the KStars credits for this system. It estimates the periodic error in the guiding system, and tries to fix it before it happens. This system should perform about the same as the standard guider for the first period or two of your mount's periodic error, then improve. When using this system, it's best to set in advance what your mount's worm-gear period is. For example, the Orion Atlas pro is about 480s. You enable this in the Guide options menu, in the GPG RA tab, and then checking "Enable GPG". There are other parameters you can change, but as indicated earlier, the main one to think about is "Major Period".

Graphics Improvements
  1. Added a guide-star SNR plot. This can be useful, e.g. when the SNR starts taking a dive, you know things aren't going well, perhaps a cloud is passing by.
  2. Added a plot of the RMS error (i.e. RA and/or DEC arc-second error RMS-averaged over the past 50 guiding samples).
  3. Separated the zooming for x and y axes. You can use '+' and '-' buttons below the x-axis to change the time scale of the plot (number of minutes plotted), and you can use the mouse scroll (same as before) to zoom in/out of the Y-axis. When you mouse-over the plot, you can see all the values for the different graphs.BTW, in case you didn't know (this isn't something I changed), you can change the amount of space allocated to the drift plot (the circle) and the drift graph by placing your mouse over the short dotted line between them and dragging left of right.

Calibration Backlash Removal A backlash removal section was added to the "calibration dance". Before it starts calibrating DEC, the Ekos guider will now take 5 DEC steps, without measurement, to make sure there's no backlash in the DEC gears. This should improve the quality of the calibration, however, if you don't like this, you can remove it by unchecking "Remove DEC backlash in guide calibration" in the Guide options menu, in the "Calibration" tab there.

Calibration PlotA Calibration Plot subtab was added to the right right of the Drift Plot.  It shows the mount positions recorded during internal-guider calibration.

Basically, if things are going well, it should display dots in two lines which are at right angles to each other--one when the calibration pushes the mount back and forth along the RA direction, and then when it does the same for the DEC direction. Not a ton of info, but can be useful to see. If the two lines are at a 30-degree angle, something's not going well with your calibration! Here's a picture of it in action using the simulator

The colored dots (same color scheme as the internal guider) shows the RA and DEC samples on their way out, and the small white and yellow circles show their return paths.

PHDLogView compatibility
phdlogview is a program written by Andy Galasso to analyze PHD2 logs. It's very nice. I've tried to have the internal guider output a mostly compatible log file so that if you installed phdlogview, you could use it to also browse your logs from the Ekos internal guider. A few things to note:
The logs are placed in a directory parallel to the standard KStars logs directory. Instead of logs, it is guidelogs. So, for example, on Linux you'd find them in this directory ~/.local/share/kstars/guidelogs/
You can turn on/off this logging by going into the Options menu on the internal guider tab, clicking on the Guide tab on the left and checking/un-checking the box labeled "Save Internal Guider User Log".
There are many features in phdlogview. Explore and look at Galasso's documentation for how to use it.
PHD2 Integration Fixes Eric Dejouhanet significantly improved fault tolerance during PHD2 interactions. This includes the following situations.
  • Star does not move enough for calibration to complete. PHD2 may:
    • be looping instead of calibrating, while still notifying calibration.
    • abort but continue to send guide steps and frames.
    • => Fixed: calibration failures are now properly handled in that situation, and forwarded to Guide module.
  • Star disappears because of a mount glitch. PHD2 may:
    • declare star lost and stop without further notice.
    • => Fixed: star-lost notification is now properly handled, and will time out properly (and not restart).
  • Device disconnects briefly. PHD2 may:
    • declare device unusable, eventually after some time (camera timeout is 15s by default), requiring reconnect.
    • => Fixed: equipment dis/connection is now properly handled from both sides, aborts operations and is robust.
  • KStars/Ekos crashes while guiding and is restarted using the existing indiserver.
    • The currentCCD may be null when restoring connection, upon call to executeOneOperation.
    • AppState has to be taken into consideration to restore state as it was before the crash.
    • => Fixed: app-state polling improves robustness, requires up-to-date INDI build.
  • If Ekos is told the equipment is disconnected, it will consider an external cause and will not attempt to reconnect.
    • Ekos will not reconnect, to allow manual intervention is required on PHD2 side.
    • Ekos will detect reconnection and change state automatically.
  • However PHD2 v2.6.8 crashes when INDI drivers are killed, so no solution except restarting PHD2 in a loop (use systemd).
  • One issue remains in Guide, where the stop button remains enabled sometimes (regression?).
    • May not fix in the context of this MR.
  • One issue remains upon server loss, which triggers perpetual reconnect unless the end-user disconnects manually.
    • Issue related to state kept at disconnected.

New LED indicators were added for each stage as a visual feedback for the user.
Other Fixes
Check out the complete changelog for more details.

Skrooge 2.23.0 released

Sunday 19th of July 2020 10:27:04 AM

The Skrooge Team announces the release 2.23.0 version of its popular Personal Finances Manager based on KDE Frameworks

  • Correction bug 420557: Broken transaction group after CSV import
  • Correction bug 412262: documentation references obsolete "Merge operations" menu item
  • Correction bug 422154: Jumpy tab order in Accounts entry form
  • Correction bug 422155: Skrooge doesn't use per-locale bank icons
  • Correction bug 422311: Tooltip in Operations view is misleading, it only works in Status column
  • Correction bug 423311: Skrooge doesn't show key error message, only summary error
  • Correction: Drag and drop file works only for operations. Not for all other objects.
  • Correction: cryptocompare fails if too many values are requested (>2000)
  • Correction: Change icon for trackers by a "crosshairs"
  • Correction: Source ratesapi doesn't work in appimage 
  • Correction: Add "Settings" description in documentation 
  • Correction: Units list doesn't save font size (see
  • Correction: Update comment of operation when suboperation of a single operation is modified 
  • Correction: Adapt for new svn structure
  • Feature: Add new source ""
  • Feature: In "Search & Process", possibility to search operations by number of spit (ideal to seach simple operations are push suboperation comment on operation comment)
  • Feature: New advice to aligne comment of operation with the comment of suboperation of single operations 
Get it, Try it, Love it...

Grab Skrooge from your distro's packaging system. If it is not yet included in repositories, go get it from our website, and bug your favorite distro for inclusion.

Now, you can try the appimage or the flatpak too !

Get Involved

To enhance Skrooge, we need you ! There are many ways you can help us:

  • Submit bug reports
  • Discuss on the KDE forum
  • Contact us, give us your ideas, explain us where we can improve...
  • Can you design good interfaces ? Can you code ? Have webmaster skills ? Are you a billionaire looking for a worthy investment ? We will be very pleased in welcoming you in the skrooge team, contact us !

More in Tux Machines

Linux Devices and Open Hardware

  • Mini-PC and SBC build on Whiskey Lake

    Supermicro’s 3.5-inch “X11SWN-H-WOHS” SBC and “SYS-E100-9W-H” mini-PC based it feature an 8th Gen UE-series CPU, HDMI and DP, 4x USB 3.1 Gen2, 2x GbE, and 3x M.2. Supermicro has launched a fanless, 8th Gen Whiskey Lake SBC and mini-PC. The SYS-E100-9W-H mini-PC (or SuperServer E100-9W-H), which was reported on by Fanless Tech, is certified only to run Windows 10, but the 3.5-inch X11SWN-H-WOHS SBC supports Ubuntu. Applications include industrial automation, retail, smart medical expert systems, kiosks, interactive info systems, and digital signage.

  • Exor nanoSOM nS02 System-on-Module Features the 800MHz version of STM32MP1 Processor

    Exor provides a Linux RT board support package (BSP) or Android BSP for the module which also fully supports the company’s X Platform including Exor Embedded Open HMI software, Corvina Cloud IIoT platform, and IEC61131 CODESYS or Exor xPLC runtime.

  • Onyx Boox Poke2 Color eReader Launched for $299

    Manga and comics fans, rejoice! After years of getting black & white eReaders, the first commercial color eReaders are coming to market starting with Onyx Boox Poke2 Color eReader sold for $299 (but sadly sold out at the time of writing). The eReader comes with a 6-inch, 1448 x 1072 E-Ink display that supports up to 4096 colors, and runs Android 9.0 on an octa-core processor coupled with 2GB RAM and 32GB storage.

  • xDrill Smart Power Drill Supports Intelligent Speed/Torque, Laser Measuring, Digital Leveling (Crowdfunding)

    Many home appliances now have smart functions, and in my cases, I fail to see the added value, and I’m not sure why I’d want/need a connected refrigerator with a touchscreen display. So when I first saw somebody make a “smart” power drill with a small touchscreen display I laughed. But after having a closer look, Robbox xDrill smart power drill could actually be a very useful device saving you time and helping work better.

  • Raspberry Pi calls out your custom workout routine
  • Odyssey Blue: A powerful x86 and Arduino machine that supports Windows 10 and Linux

    It has been a few months since we reported on the Odyssey, a single-board computer (SBC) designed by Seeedstudio. Unlike many SBCs, the Odyssey, or ODYSSEY-X86J4105800 to give it its full name, supported the x86 instruction set. While the Odyssey can run Windows 10, it is also compatible with the Arduino ecosystem. Now, Seeedstudio has expanded on the design of the Odyssey with the Odyssey Blue.

  • Bring two analog meters out of retirement to display temperature and humidity

    Tom of Build Comics created a unique analog weather station that shows temperature and humidity on a pair of recycled gauges. An Arduino Nano reads the levels using a DHT22 sensor and outputs them in the proper format for each display. Both units have a new printed paper backing to indicate conditions, along with a trimmer pot for calibration. To set the build off nicely, the Nano and other electronics are housed inside a beautiful custom wooden box, to which the antique meters are also affixed.

Programming Leftovers

  • Engineer Your Own Electronics With PCB Design Software

    A lot of self-styled geeks out there tend to like to customize their own programs, devices, and electronics. And for the true purists, that can mean building from the ground up (you know, like Superman actor Henry Cavill building a gaming PC to the delight of the entire internet). Building electronics from the ground up can mean a lot of different things: acquiring parts, sometimes from strange sources; a bit of elbow grease on the mechanical side of things; and today, even taking advantage of the 3D printing revolution that’s finally enabling people to manufacture customized objects in their home. Beyond all of these things though, engineering your own devices can also mean designing the underlying electronics — beginning with printed circuit boards, also known as PCBs. [...] On the other hand, there are also plenty of just-for-fun options to consider. For example, consider our past buyer’s guide to the best Linux laptop, in which we noted that you can always further customize your hardware. With knowledge of PCB design, that ability to customize even a great computer or computer setup is further enhanced. You might, for instance, learn how to craft PCBs and devices amounting to your own mouse, gaming keyboard, or homemade speakers — all of which can make your hardware more uniquely your own. All in all, PCB design is a very handy skill to have in 2020. It’s not typically necessary, in that there’s usually a device or some light customization that can give you whatever you want or need out of your electronics. But for “geeks” and tech enthusiasts, knowledge of PCB design adds another layer to the potential to customize hardware.

  • Programming pioneer Fran Allen dies aged 88 after a career of immense contributions to compilers

    Frances Allen, one of the leading computer scientists of her generation and a pioneer of women in tech, died last Tuesday, her 88th birthday. Allen is best known for her work on compiler organisation and optimisation algorithms. Together with renowned computer scientist John Cocke, she published a series of landmark papers in the late '60s and '70s that helped to lay the groundwork for modern programming. In recognition of her efforts, in 2006 Allen became the first woman to be awarded the AM Turing Award, often called the Nobel Prize of computing.

  • Excellent Free Tutorials to Learn ECMAScript

    ECMAScript is an object‑oriented programming language for performing computations and manipulating computational objects within a host environment. The language was originally designed as a scripting language, but is now often used as a general purpose programming language. ECMAScript is best known as the language embedded in web browsers but has also been widely adopted for server and embedded applications.

  • Alexander Larsson: Compatibility in a sandboxed world

    Compatibility has always been a complex problems in the Linux world. With the advent of containers/sandboxing it has become even more complicated. Containers help solve compatibility problems, but there are still remaining issues. Especially on the Linux desktop where things are highly interconnected. In fact, containers even create some problems that we didn’t use to have. Today I’ll take a look at the issues in more details and give some ideas on how to best think of compatibility in this post-container world, focusing on desktop use with technologies like flatpak and snap. [...] Another type of compatibility is that of communication protocols. Two programs that talk to each other using a networking API (which could be on two different machines, or locally on the same machine) need to use a protocol to understand each other. Changes to this protocol need to be carefully considered to ensure they are compatible. In the remote case this is pretty obvious, as it is very hard to control what software two different machines use. However, even for local communication between processes care has to be taken. For example, a local service could be using a protocol that has several implementations and they all need to stay compatible. Sometimes local services are split into a service and a library and the compatibility guarantees are defined by the library rather than the service. Then we can achieve some level of compatibility by ensuring the library and the service are updated in lock-step. For example a distribution could ship them in the same package.

  • GXml-0.20 Released

    GXml is an Object Oriented implementation of DOM version 4, using GObject classes and written in Vala. Has a fast and robust serialization implementation from GObject to XML and back, with a high degree of control. After serialization, provides a set of collections where you can get access to child nodes, using lists or hash tables. New 0.20 release is the first step toward 1.0. It provides cleaner API and removes old unmaintained implementations. GXml is the base of other projects depending on DOM4, like GSVG an engine to read SVG documents based on its specificacion 1.0. GXml uses a method to set properties and fill declared containers for child nodes, accessing GObject internals directly, making it fast. A libxml-2.0 engine is used to read sequentially each node, but is prepared to implement new ones in the future.

  • Let Mom Help You With Object-Oriented Programming

    Mom is a shortcut for creating Moo classes (and roles). It allows you to define a Moo class with the brevity of Class::Tiny. (In fact, Mom is even briefer.) A simple example: Mom allows you to use Moo features beyond simply declaring Class::Tiny-like attributes though. You can choose whether attributes are read-only, read-write, or read-write-private, whether they're required or optional, specify type constraints, defaults, etc.

  • Perl Weekly Challenge 73: Min Sliding Window and Smallest Neighbor

    These are some answers to the Week 73 of the Perl Weekly Challenge organized by Mohammad S. Anwar. Spoiler Alert: This weekly challenge deadline is due in a few days from now (on Aug. 16, 2020). This blog post offers some solutions to this challenge, please don’t read on if you intend to complete the challenge on your own.

  • [rakulang] 2020.32 Survey, Please

    The TPF Marketing Committee wants to learn more about how you perceive “The Perl Foundation” itself, and asks you to fill in this survey (/r/rakulang, /r/perl comments). Thank you!

Hardware With Linux Support: NUVIA and AMD Wraith Prism

  • Performance Delivered a New Way

    The server CPU has evolved at an incredible pace over the last two decades. Gone are the days of discrete CPUs, northbridges, southbridges, memory controllers, other external I/O and security chips. In today’s modern data center, the SoC (System On A Chip) does it all. It is the central point of coordination for virtually all workloads and the main hub where all the fixed-function accelerators connect, such as AI accelerators, GPUs, network interface controllers, storage devices, etc.

  • NUVIA Published New Details On Their Phoenix CPU, Talks Up Big Performance/Perf-Per-Watt

    Since leaving stealth last year and hiring some prominent Linux/open-source veterans to complement their ARM processor design experts, we have been quite eager to hear more about this latest start-up aiming to deliver compelling ARM server products. Today they shared some early details on their initial "Phoenix" processor that is coming within their "Orion" SoC. The first-generation Phoenix CPU is said to have a "complete overhaul" of the CPU pipeline and is a custom core based on the ARM architecture. They believe that Phoenix+Orion will be able to take on Intel/AMD x86_64 CPUs not only in raw performance but also in performance-per-Watt.

  • Take control of your AMD Wraith Prism RGB on Linux with Wraith Master

    Where the official vendor doesn't bother with supporting Linux properly, once again the community steps in to provide. If you want to tweak your AMD Wraith Prism lighting on Linux, check out Wraith Master. It's a similar project to CM-RGB that we previously highlighted. With the Wraith Master project, they provide a "feature-complete" UI and command-line app for controlling the fancy LED system on AMD's Wraith Prism cooler with eventual plans to support more.

The Massive Privacy Loopholes in School Laptops

It’s back to school time and with so many school districts participating in distance learning, many if not most are relying on computers and technology more than ever before. Wealthier school districts are providing their students with laptops or tablets, but not all schools can afford to provide each student with a computer which means that this summer parents are scrambling to find a device for their child to use for school. Geoffery Fowler wrote a guide in the Washington Post recently to aid parents in sourcing a computer or tablet for school. Given how rough kids can be with their things, many people are unlikely to give their child an expensive, premium laptop. The guide mostly focuses on incredibly low-cost, almost-disposable computers, so you won’t find a computer in the list that has what I consider a critical feature for privacy in the age of video conferencing: hardware kill switches. Often a guide like this would center on Chromebooks as Google has invested a lot of resources to get low-cost Chromebooks into schools yet I found Mr. Fowler’s guide particularly interesting because of his opinion on Chromebooks in education... Read more Also: Enabling Dark Mode on a Chromebook (Do not try this at home)