The first notable change in 46 is that we’re finally delivering on the promise of bringing you a next generation image file format. Lots of performance issues had to be addressed first, apologies for the delay. While efficiency and filesize requirements might not be too high on the list outside of the geek crowd, there is one aspect of JPEG-XL that I am very excited about.
JPEG-XL allows the use of client-side synthesized grain. A method pioneered by Netflix/AV1 I believe. Compression algorithms struggle with high frequency detail, which often introduce visible artifacts. JPEG-XL allows to decouple the grain component from the actual image data. This allows for significantly more efficient compression of images that inherently require noise, such as those in gnome-backgrounds
— smooth gradients that would otherwise be susceptible to color banding. To achieve similar fidelity of the grain if it were baked in, a classic format like JPEG would need an order of magnitude larger filesize. Having the grain in the format itself also allows to skip various techniques in the rendering or compositing in the 3D software.
Instead of compressing a noisy image, JPEG-XL allows to generate film-like grain as part of the decoding process. This synthesized grain combats issues like color banding while allowing a much more efficient compression on the original image data.
In essence, client-side grain in JPEG-XL isn’t simply added noise, but a sophisticated strategy for achieving both efficient compression and visually pleasing image quality, especially for images that would otherwise require inherent noise.
The fresh batch of wallpapers includes evolutions of the existing assets as well as new additions. A few material/shape studies have been added as well as simple 2D shape textures. Thanks to the lovely JPEG-XL grain described earlier, it’s not just Inkscape and Blender that were used.
I hope you’re going to pick at least one of the wallpapers when GNOME 46 releases later next week as your favorite. Let me know on fediverse!
]]>While of course I’m stuck in my young taste like everybody else, I do try to pick up some new music. This year I’ve discovered Venjent doing a silly skit (he’s fully aware of that being how people discover his music and really leans into it). In surreal turn of events I went to see him in a club, looking like a misplaced pensioner at 1am, when he finally spun his set. But I seriously enjoy how he can transform the absolute silliness into a total banger I play on repeat.
I’ve published some music of my own as well. After Desync assembled from material from weeklybeats 22 came Solar Coffee and Take Frequent Breaks right at the end of the year. I doubt I’ll release anything this year, because Weekly Beats 24 will probably suck all my energy for music production. Hopefully I’ll enjoy it as much as the first half of 22 :)
From about 3 videos a week in 2018 I’m down to about 3 a year. One might say I’ve thrown the towel in, but I still enjoy a decent tree surf from time to time.
I’ve completely dropped the ball when it comes to racing though. Didn’t even qualify in Klatovy this year, because absolutely everyone has been training like crazy. It’s been lovely to hang around with the weirdos in the three competitions I attended.
]]>there’s a little trick I learned from razze while working Flathub — a single favicon working in both dark and light mode can be achieved using a single SVG. The SVG doesn’t have inline defined fills, but instead has a simple embedded <style>
that defines the g,path,rect,circle
and whatnot element styles and sets the fill
there. For the dark mode it gets overriden with the @media (prefers-color-scheme: dark){}
rule. While generally favicons are a single color stencil, it can work for fullcolor graphics (and more complex rules):
<style>
rect.fg { fill: #5e5c64; }
path.bg { fill: #fff; }
@media (prefers-color-scheme: dark) {
rect.fg { fill: #fff; }
path.bg { fill: #5e5c64; }
}
</style>
This made me think of a similar approach working for inline images as well. Sadly there’s two obstacles. While the support for inline stylesheets in SVGs seems to be quite wide among browsers, Epiphany only seems to respect prefers-color-scheme
when using the image directly (or the favicon case), but didn’t seem to work when emebded inside and html page as <img>
.
The more severe issue is that producing such SVGs is a little cumbersome as you have to clean up the document generated by Inkscape, which likes to use fill
attribute or inline css in style
. While it generally doesn’t remove markup, it will reformat your markup and you will be fighting with it every time you need to edit the SVG visually rather than inside a text editor.
For inline images, the approach that seems more straight forward and I’ve taken on many occasions is using the HTML5 <picture>
element. It works great for providing dark mode variants using source
with a media
attribute as well as a neat accessibility feature of showing non-animated image variant for people who opt out:
<picture>
<source srcset="static.png"
media="(prefers-reduced-motion: reduce)" />
<img src="animated.gif" />
</picture>
GNOME Human Interface Guidelines are written in restructured text/Sphinx, however. Escaping to html for images/pictures would be quite cumbersome, but luckily dark mode is supported in the furo theme (and derivates) using the only-light
and only-dark
classes. The markup gets a little chatty, but still quite legible. There’s some iterations to be made, but in terms of legibility it’s finally a bit more accessible.
]]>
I’ll start off by mentioning a lovely new addition by David Lapshin, Amber, leaning into Inkscape’s mesh gradients.
The default has shown no dramatic departure from the triangles/hexagons of the previous releases. The on-brand triangle theme has been kept, but the implementation is very different. The wallpaper is a result of a generated mesh using Blender’s geometry nodes and color gradients derived from a pre-existing wallpaper texture. You can check the whole thing out in the provided blender project files in wallpaper-assets.
There have been updates to the existing set, the surprisingly popular Blobs have been tweaked, my personal favorite, Fold crops a bit better at the most common 16:9 aspect and Truchet is round yet again. Pixels have been updated to feature Circle apps.
Weirdly named Morphogenesis is one of my favorite additions this release. Based around a concept of reactive diffusion, described by none other than Allan Turing, features a little easter egg if you’re into chasing those down.
]]>During the lockdown years a good friend of mine became a fulltime game dev and I’ve been getting that sweet sweet smell of pixels in a very high concentration. You probably noticed my fascination for pixel art in recent years.
A couple of weeks ago I was introduced to PICO8. While it’s confusingly identified as a fantasy console, what it really is, is a full blown platform. While writing LUA in a 128x128 screen is not everyone’s thing, I have largely enjoyed the super constrained world of PICO8. Its 16 color palette, 8x8px sprites, a super quick iteration workflow with integrated graphics, sound effects and music editors. To put it in perspective, yes, GNOME icons are exactly the same size as the whole PICO8 environment. But its highly integrated editor allows for a very quick iterative approach and I love that.
You can give the game a shot here. Let me know what you think. Initially the game was pretty easy and approachable, but given how short it is, the final boss stage is now only for the devoted arcade lovers. :)
Let me know what you think of it and post your high scores at me on Mastodon/Fediverse!
I’m not planning to ever make another game, but I will definitely use the PICO8 platform to do some small interactive demos for projects like Weeklybeats. It’s dope!
]]>The little magic box that is the Dirtywave M8 tracker is pretty well supported in Linux. It works great as an audio device (input and output), it does usb midi and you can also use its remote display using laamaa’s m8c which now also does audio monitoring.
M8c isn’t an app, so it’s a bit of a hassle to build it and use it from within a toolbx. Regular Linux distro chore. In addition, to update its firmware, which Timothy pushes very frequently and brings amazing new functionality, requires adding udev rules to have the device writable by a user. Which is what this post is about. I have no clue what I’m doing, but having this config in /etc/udef/rules.d/50-myusb.rules
(first is the regular device for m8c and the latter is the second stage of the firmware update using tytools):
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="048a", GROUP="users", MODE="0666"
KERNEL=="hidraw*", ATTRS{idVendor}=="16c0", GROUP="users", MODE="0666"
Enjoy my last track, Sines of our fathers if you don’t care of any of the above ;)
]]>Thus there is no better time to refresh what has become a little dated, Flathub’s visual identity. It centers around the core of what Flathub is — the apps themselves. The identity isn’t very loud and shouty. The flashy colors and emphasis remains on the apps themselves, Flathub is the neutral platform for the apps to shine.
Take a peek at the brand guidelines to learn more about the new Flathub brand or download the logos in scalable format. The download buttons for app websites are also available.
Building a brand on neutral greys isn’t quite an easy sell, but precisely targets the main point of the Flathub brand. It creates the stage for apps to shine. Flathub isn’t flashy by itself. It allows the apps to be at the center of your attention.
If you’ve read until this point, you deserve a treat! Here’s some eye candy from the early stages of the process. Wallpapers derived from the elemental shapes of the logomark. Clearly off limits now, but can’t just throw them away, can I?
Big shoutout to razze for his ongoing work on the website and implementing the brand so quickly. Many thank yous to Tobias Bernard for significant involvment in this during the Berlin Mini GUADEC and Václav Vančura for sensible feedback.
]]>We’ve made big strides in visual consistency with the growing number of apps that have been ported to gtk4 and libadwaita, embracing the modern look. Sam has also given the high-contrast style in GNOME Shell some love, keeping it in line with gtk’s updates last cycle.
The default wallpaper stays true to our brand, but the supplementary set has undergone some bolder changes. From the popular simple shape blends to a nostalgic nod to the past with keypad and pixel art designs, there’s something for everyone. The pixelized icons made their debut in the last release, but this time we focus on GNOME Circle apps, rather than the core apps.
Another exciting development is the continued use of geometry nodes in Blender. Although the tool has a steep learning curve, I’m starting to enjoy my time with it. I gave a talk on geometry nodes and its use for GNOME wallpaper design at the Fedora Creative Freedom Summit. You can watch the stream archive recording here (and part2).
]]>run button
and voilá.
What has been far from wonderful — doing even one line fixes for the GNOME Shell was very hard to test for anyone not building shell daily. getting the environment ready every release has been a chore. From virtual machines, jhbuild, toolbox, jhbuild in VMs to jhbuild in toolbox there was a dozen of way to fail building the latest shell.
Builder 43, impressively marathoned into perfection, features (among many other things) the ability to target Toolbox/podman containers as development environments. So I was really happy to see Bylan McCall have a nested session going on the run button.
Now I couldn’t get the full detailed receipe out of him, but as they say it’s easier to get the internet prove you wrong than to give you advice, here’s my terrible way (with some help from the most authoritative capacities that probably don’t want anything to do with this pkexec hack):
1) Create a toolbx container and install all gnome-shell dependencies.
toolbox create shell
toolbox enter shell
sudo dnf install gnome-shell mutter ninja-build meson
sudo dnf builddep gnome-shell mutter
While at the beginning of a cycle packages cover most of the dependencies, at the later stages you’ll have to build more things (Usually gsettings-desktop-schemas
, libgweather
, gjs
, gcr
and mutter
). We’re in a container so I just oldschool brute install to --prefix=/usr
. To build mutter for example I’d
mkdir ~/Projects
cd ~/Projects
git clone https://gitlab.gnome.org/GNOME/mutter.git
cd mutter
meson --prefix=/usr build '-Dman=false'
ninja -C build
sudo ninja -C build install
So assuming we have successfuly built shell in the shell
toolbox container, we’ll move over to Builder.
2) In Builder, open the project we cloned to ~/Projects/gnome-shell
. Create a new configuration (Alt+,
) by duplicating the Default
. Change the runtime to shell
(the toolbx containers are below the usual flatpak runtimes). Set the Installation Prefix to /usr
. Don’t forget to make it active (Make Active
).
3) Still in configuration, in the Commands
section, create a new command (call it Run Nested Shell):
dbus-run-session gnome-shell --wayland --nested
At the bottom of the dialog add a Variable
:
MUTTER_DEBUG_DUMMY_MODE_SPECS=1920x1080
This will make the shell run at least in HD, rather than the super tiny default size.
4) In the Application section, change the Run Command
from Automatically Discover to our Run Nested Shell. Now we only need to do the last nasty bit to allow for the install to /usr
to succeed.
5) Open a new runtime terminal (Ctrl+Alt+T
) and replace pkexec with a just-do-it
script. It’s a container, it’s fiiiiine, chill.
cd /usr/bin
mv pkexec pkexec.orig
Now with your preferred CLI editor create the following shell script in place of pkexec:
#!/bin/bash
su -c "$*"
Set it executable with chmod +x pkexec
.
Now pressing the run button should build your shell, install it and run the nested session. Hopefully stylesheet patches will be less painful now, maybe?
Please do not hesistate to toot at me what the proper way is rather than installing to /usr