<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:planet="http://planet.intertwingly.net/" xmlns:indexing="urn:atom-extension:indexing" indexing:index="no"><access:restriction xmlns:access="http://www.bloglines.com/about/specs/fac-1.0" relationship="deny"/>
  <title>Planet GNOME</title>
  <updated>2024-10-17T00:04:45Z</updated>
  <generator uri="http://intertwingly.net/code/venus/">Venus</generator>
  <author>
    <name>GNOME Sysadmin Team</name>
    <email>gnome-sysadmin@gnome.org</email>
  </author>
  <id>https://planet.gnome.org/atom.xml</id>
  <link href="https://planet.gnome.org/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="http://pubsubhubbub.appspot.com/" rel="hub"/>
  <link href="https://planet.gnome.org/" rel="alternate"/>

  <entry xml:lang="en">
    <id>http://samthursfield.wordpress.com/?p=2565</id>
    <link href="https://samthursfield.wordpress.com/2024/10/16/status-update-16-10-2024/" rel="alternate" type="text/html"/>
    <title>Status update, 16/10/2024</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I’ve participated in two internships this year, and interns — who are usually busy full-time students — often ask “How do you get time to contribute to open source?”. And the truth is that there’s no secret formula. It’s tricky to get paid to work on something that you give away for free, isn’t it? … <a class="more-link" href="https://samthursfield.wordpress.com/2024/10/16/status-update-16-10-2024/">Continue reading <span class="screen-reader-text">Status update, 16/10/2024</span></a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I’ve participated in two internships this year, and interns — who are usually busy full-time students — often ask “How do you get time to contribute to open source?”.<br/></p>



<p>And the truth is that there’s no secret formula. It’s tricky to get paid to work on something that you give away for free, isn’t it? Mostly I contribute to open source in free time, either after work hours, or occasionally during periods of downtime. <br/><br/>To my complete surprise I managed to buy a house this year and so I suddenly don’t have any time after work. During the day most of my time is spent on proprietary customer-specific work, and after work I go to look at the house and try to figure out where to start with the whole thing. (By the way, does anyone around Santiago need a load of 1980s-style furniture made from chipboard?).<br/><br/>I’ll still be participating in GNOME around desktop search and the openQA tests, answering questions and triaging bug reports, but I won’t be driving any new stuff forwards.<br/><br/>Anyway, why is it interesting to blog about things I’m not doing?<br/><br/>I read this quote in <a href="https://lwn.net/">LWN</a> the other day:<br/></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Make it easy to</strong> <strong>quit – </strong>Actively celebrate people who step back from maintainer positions. Celebrate what they accomplished and what they are moving on to. Don’t punish or otherwise shame quitting. This also incentivizes other people to step up, knowing that they don’t necessarily have to do it forever. <br/><br/>— <a href="https://drbacchus.com/open-source-summit-vienna-2024/">Rich Bowen</a>, “Open Source Summit Vienna 2024”</p>
</blockquote>



<p>At least in GNOME, we often don’t do this. We don’t celebrate what people *have achieved*, with I think one exception (the legendary <a href="https://wiki.gnome.org/Pants">“Pants of Thanks” ceremony</a>).</p>



<p>We should do better at this. It’s not that we don’t appreciate each others work. But mostly we require the person doing the work to also be the one shouting loudly about it, before we notice.  Is there a better way?<br/><br/>Another thing we don’t do, by the way, is celebrate corporate participation. The great exception to this is the STF grant, and everyone involved in that did an excellent job of highlighting work which the STF grant enabled. We’re less good at crediting all the work that happens thanks to paid engineers from Red Hat, Endless, Canonical, SUSE, and so on. </p>



<p>Another quote from this article:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Each generation of a project</strong> (ie open source but not only open source) <strong>is responsible for mentoring the next generation</strong>. When you mentor someone, spend time emphasizing that it’s their job to mentor the next person, otherwise they will assume that it’s your job. A failure to commuincate this will result in the eventual attrition and death of the community.</p>



<p>— <a href="https://drbacchus.com/open-source-summit-vienna-2024/">Rich Bowen</a>, “Open Source Summit Vienna 2024”</p>
</blockquote>



<p/>



<p>I quite like giving conference talks and I’ve been wondering what I could speak about, if I’m not driving any new development myself.<br/><br/>We now have 25 years of history in GNOME and it would be nice to give some talks about “How $thing works.” Desktop search comes to mind here, of course. I also learned (against my will) a lot about initial-setup this year. So I might propose some talks along these lines. It seems like also a nice way to look back at work that’s been done over the years, and give credit the people who have worked on these things over time, doing stuff that’s often invisible.<br/><br/>On that topic, I want to highlight the excellent work done over the summer by our two GSoC interns Divyansh Jain and Rachel Tam, adding a web-based IDE to TinySPARQL that can run queries against the GNOME search database. You can read more about that both on <a href="https://rachleona.wordpress.com/2024/08/24/wrapping-up-my-gsoc-project/">Rachel’s blog</a> and on <a href="https://demiigood.wordpress.com/2024/08/26/tinysparql-gsoc-final-report/">Demigod’s blog</a>. The idea behind this was making it easier to visualize how the LocalSearch index actually works, what is stored there, and what you can do with it. Hopefully this can lead into some interesting talks about search!<br/></p>



<p><em>If you like this post, please leave a comment! You use the form below, or reply on the Fediverse to <a class="__p2-hovercard mention" href="https://samthursfield.wordpress.com/mentions/samthursfield/"><span class="mentions-prefix">@</span>samthursfield</a>.wordpress.com<a class="__p2-hovercard mention" href="https://samthursfield.wordpress.com/mentions/samthursfield/"><span class="mentions-prefix">@</span>samthursfield</a>.wordpress.com. I’m also on <a href="https://www.linkedin.com/in/sam-thursfield/">LinkedIn</a>.</em></p>



<p/></div>
    </content>
    <updated>2024-10-16T11:00:10Z</updated>
    <published>2024-10-16T11:00:10Z</published>
    <category term="General"/>
    <category term="gnome"/>
    <author>
      <name>Sam Thursfield</name>
    </author>
    <source>
      <id>https://samthursfield.wordpress.com</id>
      <logo>https://samthursfield.wordpress.com/wp-content/uploads/2020/10/cropped-favicon.png?w=32</logo>
      <link href="https://samthursfield.wordpress.com/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://samthursfield.wordpress.com" rel="alternate" type="text/html"/>
      <link href="https://samthursfield.wordpress.com/osd.xml" rel="search" title="Sam Thursfield" type="application/opensearchdescription+xml"/>
      <link href="https://samthursfield.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Software and technology from Galicia, Spain</subtitle>
      <title>Sam Thursfield</title>
      <updated>2024-10-16T13:33:06Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://enblog.eischmann.cz/?p=1851</id>
    <link href="https://enblog.eischmann.cz/2024/10/15/fedora-at-linuxdays-2024/" rel="alternate" type="text/html"/>
    <title>Fedora at LinuxDays 2024</title>
    <summary>Last weekend I went to Prague to represent Fedora at LinuxDays 2024. It’s the biggest Linux event in the country with more than a thousand attendees and the Fedora booth is busy there every year.</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Last weekend I went to Prague to represent Fedora at <a href="https://www.linuxdays.cz/2024/">LinuxDays 2024</a>. It’s the biggest Linux event in the country with more than a thousand attendees and the Fedora booth is busy there every year.</p>



<p>Like last year the Fedora booth was colocated with the Red Hat booth. It made sense not only because there is a relationship between the two, but it had very practical reasons: I was the only person representing and staffing the Fedora booth and I appreciated help from my colleagues who watch over the Fedora booth when I took a break to have a meal or give a talk.</p>



<blockquote class="mastodon-embed" style="border-radius: 8px; margin: 0; overflow: hidden; padding: 0;"> <a href="https://floss.social/@fedoracz/113293241548795657" rel="noopener" target="_blank"> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="32" viewBox="0 0 79 75" width="32"><path d="M74.7135 16.6043C73.6199 8.54587 66.5351 2.19527 58.1366 0.964691C56.7196 0.756754 51.351 0 38.9148 0H38.822C26.3824 0 23.7135 0.756754 22.2966 0.964691C14.1319 2.16118 6.67571 7.86752 4.86669 16.0214C3.99657 20.0369 3.90371 24.4888 4.06535 28.5726C4.29578 34.4289 4.34049 40.275 4.877 46.1075C5.24791 49.9817 5.89495 53.8251 6.81328 57.6088C8.53288 64.5968 15.4938 70.4122 22.3138 72.7848C29.6155 75.259 37.468 75.6697 44.9919 73.971C45.8196 73.7801 46.6381 73.5586 47.4475 73.3063C49.2737 72.7302 51.4164 72.086 52.9915 70.9542C53.0131 70.9384 53.0308 70.9178 53.0433 70.8942C53.0558 70.8706 53.0628 70.8445 53.0637 70.8179V65.1661C53.0634 65.1412 53.0574 65.1167 53.0462 65.0944C53.035 65.0721 53.0189 65.0525 52.9992 65.0371C52.9794 65.0218 52.9564 65.011 52.9318 65.0056C52.9073 65.0002 52.8819 65.0003 52.8574 65.0059C48.0369 66.1472 43.0971 66.7193 38.141 66.7103C29.6118 66.7103 27.3178 62.6981 26.6609 61.0278C26.1329 59.5842 25.7976 58.0784 25.6636 56.5486C25.6622 56.5229 25.667 56.4973 25.6775 56.4738C25.688 56.4502 25.7039 56.4295 25.724 56.4132C25.7441 56.397 25.7678 56.3856 25.7931 56.3801C25.8185 56.3746 25.8448 56.3751 25.8699 56.3816C30.6101 57.5151 35.4693 58.0873 40.3455 58.086C41.5183 58.086 42.6876 58.086 43.8604 58.0553C48.7647 57.919 53.9339 57.6701 58.7591 56.7361C58.8794 56.7123 58.9998 56.6918 59.103 56.6611C66.7139 55.2124 73.9569 50.665 74.6929 39.1501C74.7204 38.6967 74.7892 34.4016 74.7892 33.9312C74.7926 32.3325 75.3085 22.5901 74.7135 16.6043ZM62.9996 45.3371H54.9966V25.9069C54.9966 21.8163 53.277 19.7302 49.7793 19.7302C45.9343 19.7302 44.0083 22.1981 44.0083 27.0727V37.7082H36.0534V27.0727C36.0534 22.1981 34.124 19.7302 30.279 19.7302C26.8019 19.7302 25.0651 21.8163 25.0617 25.9069V45.3371H17.0656V25.3172C17.0656 21.2266 18.1191 17.9769 20.2262 15.568C22.3998 13.1648 25.2509 11.9308 28.7898 11.9308C32.8859 11.9308 35.9812 13.492 38.0447 16.6111L40.036 19.9245L42.0308 16.6111C44.0943 13.492 47.1896 11.9308 51.2788 11.9308C54.8143 11.9308 57.6654 13.1648 59.8459 15.568C61.9529 17.9746 63.0065 21.2243 63.0065 25.3172L62.9996 45.3371Z" fill="currentColor"/></svg> <div style="color: #787588; margin-top: 16px;">Post by @fedoracz@floss.social</div> <div style="font-weight: 500;">View on Mastodon</div> </a> </blockquote> 



<p>The biggest magnet at our booth was again a macbook running Fedora Asahi Remix. I gave <a href="https://youtu.be/LH16IqFxLzw?feature=shared">a talk</a> about it which was only 20 minutes long and was intended as a teaser: here is an overview of the project and if you’d like to know and see more, come to your booth.</p>



<p>Fortunately just two days before the conference, the Asahi Linux project announced support for Steam via the Fex/muvm emulation, so I could utilize a large library of games <a href="https://www.digitaltrends.com/gaming/valve-steam-california-law-dont-own-games/"><s>I own</s> have a license</a> for on Steam. During the talk someone asked if it could run the <a href="https://www.factorio.com/">Factorio</a> game and it could, indeed.</p>



<blockquote class="mastodon-embed" style="border-radius: 8px; margin: 0; overflow: hidden; padding: 0;"> <a href="https://floss.social/@fedoracz/113294834510943273" rel="noopener" target="_blank"> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="32" viewBox="0 0 79 75" width="32"><path d="M74.7135 16.6043C73.6199 8.54587 66.5351 2.19527 58.1366 0.964691C56.7196 0.756754 51.351 0 38.9148 0H38.822C26.3824 0 23.7135 0.756754 22.2966 0.964691C14.1319 2.16118 6.67571 7.86752 4.86669 16.0214C3.99657 20.0369 3.90371 24.4888 4.06535 28.5726C4.29578 34.4289 4.34049 40.275 4.877 46.1075C5.24791 49.9817 5.89495 53.8251 6.81328 57.6088C8.53288 64.5968 15.4938 70.4122 22.3138 72.7848C29.6155 75.259 37.468 75.6697 44.9919 73.971C45.8196 73.7801 46.6381 73.5586 47.4475 73.3063C49.2737 72.7302 51.4164 72.086 52.9915 70.9542C53.0131 70.9384 53.0308 70.9178 53.0433 70.8942C53.0558 70.8706 53.0628 70.8445 53.0637 70.8179V65.1661C53.0634 65.1412 53.0574 65.1167 53.0462 65.0944C53.035 65.0721 53.0189 65.0525 52.9992 65.0371C52.9794 65.0218 52.9564 65.011 52.9318 65.0056C52.9073 65.0002 52.8819 65.0003 52.8574 65.0059C48.0369 66.1472 43.0971 66.7193 38.141 66.7103C29.6118 66.7103 27.3178 62.6981 26.6609 61.0278C26.1329 59.5842 25.7976 58.0784 25.6636 56.5486C25.6622 56.5229 25.667 56.4973 25.6775 56.4738C25.688 56.4502 25.7039 56.4295 25.724 56.4132C25.7441 56.397 25.7678 56.3856 25.7931 56.3801C25.8185 56.3746 25.8448 56.3751 25.8699 56.3816C30.6101 57.5151 35.4693 58.0873 40.3455 58.086C41.5183 58.086 42.6876 58.086 43.8604 58.0553C48.7647 57.919 53.9339 57.6701 58.7591 56.7361C58.8794 56.7123 58.9998 56.6918 59.103 56.6611C66.7139 55.2124 73.9569 50.665 74.6929 39.1501C74.7204 38.6967 74.7892 34.4016 74.7892 33.9312C74.7926 32.3325 75.3085 22.5901 74.7135 16.6043ZM62.9996 45.3371H54.9966V25.9069C54.9966 21.8163 53.277 19.7302 49.7793 19.7302C45.9343 19.7302 44.0083 22.1981 44.0083 27.0727V37.7082H36.0534V27.0727C36.0534 22.1981 34.124 19.7302 30.279 19.7302C26.8019 19.7302 25.0651 21.8163 25.0617 25.9069V45.3371H17.0656V25.3172C17.0656 21.2266 18.1191 17.9769 20.2262 15.568C22.3998 13.1648 25.2509 11.9308 28.7898 11.9308C32.8859 11.9308 35.9812 13.492 38.0447 16.6111L40.036 19.9245L42.0308 16.6111C44.0943 13.492 47.1896 11.9308 51.2788 11.9308C54.8143 11.9308 57.6654 13.1648 59.8459 15.568C61.9529 17.9746 63.0065 21.2243 63.0065 25.3172L62.9996 45.3371Z" fill="currentColor"/></svg> <div style="color: #787588; margin-top: 16px;">Post by @fedoracz@floss.social</div> <div style="font-weight: 500;">View on Mastodon</div> </a> </blockquote> 



<p>We also had a Fedora conference box which includes a <a href="https://slimbook.com/en/fedora">Fedora Slimbook</a> laptop. It was a nice contrast to the Macbook because Slimbook focuses on Linux whereas Apple doesn’t care about Linux at all.</p>



<p>The booth was so busy that I was making a post about our presence for 2 hours because I couldn’t find even a few minutes to finish it.</p>



<p>I also did a bit of user support. An older gentleman approached our booth stating that he had traveled 100km to get help. He had a dual boot of Fedora and Ubuntu and an Ubuntu update had broken the bootloader. Regenerating the GRUB resolved the issue.</p>



<p>Pavel Píša, a doctor from Czech University of Technology, invited me to their booth to check out Fedora Linux running on a Milk-V box with a RISC-V CPU. I left a flyer regarding an open Fedora QA position for RISC-V because Red Hat is currently looking for someone to test Fedora Linux on RISC-V.</p>



<figure class="wp-block-image aligncenter size-large is-resized has-custom-border"><img alt="" class="wp-image-1854" height="1024" src="https://enblog.eischmann.cz/wp-content/uploads/2024/10/linuxdays-riscv-923x1024.webp" style="border-width: 1px; width: 497px; height: auto;" width="923"/><figcaption class="wp-element-caption">Me with the RISC-V box. <a href="https://social.kernel.org/notice/AmwQGHTzXDHiAigpAO">Original post</a>.</figcaption></figure>



<p>Overall, the conference was a great experience, albeit tiring. I hope to attend next year again.</p></div>
    </content>
    <updated>2024-10-15T15:44:32Z</updated>
    <published>2024-10-15T15:44:32Z</published>
    <category term="Fedora"/>
    <category term="Linux"/>
    <category term="AsahiLinux"/>
    <category term="fedora"/>
    <category term="linux"/>
    <category term="LinuxDays"/>
    <category term="RISCV"/>
    <category term="Slimbook"/>
    <author>
      <name>eischmann</name>
    </author>
    <source>
      <id>https://enblog.eischmann.cz</id>
      <logo>https://enblog.eischmann.cz/wp-content/uploads/2023/10/me-mastodon-circle-150x150.webp</logo>
      <link href="https://enblog.eischmann.cz/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://enblog.eischmann.cz" rel="alternate" type="text/html"/>
      <subtitle>Jiri Eischmann's Blog</subtitle>
      <title>Brno Hat</title>
      <updated>2024-10-15T15:47:18Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blogs.gnome.org/chergert/?p=12655</id>
    <link href="https://blogs.gnome.org/chergert/2024/10/11/debuginfod-enabled-sysprof/" rel="alternate" type="text/html"/>
    <title>debuginfod-enabled Sysprof</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Based on some initial work by Barnabás Pőcze Sysprof gained support for symbolizing stack traces using debuginfod. If you don’t want to install debuginfo packages for your entire system but still want really useful function names, this is for you. The system-configured debuginfod servers will provide you access to those debuginfo-enabled ELF binaries so that … <a class="more-link" href="https://blogs.gnome.org/chergert/2024/10/11/debuginfod-enabled-sysprof/">Continue reading <span class="screen-reader-text">debuginfod-enabled Sysprof</span></a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Based on some initial <a href="https://gitlab.gnome.org/GNOME/sysprof/-/merge_requests/107">work by Barnabás Pőcze</a> Sysprof gained support for symbolizing stack traces using <a href="https://developers.redhat.com/blog/2019/10/14/introducing-debuginfod-the-elfutils-debuginfo-server">debuginfod</a>.</p>
<p>If you don’t want to install debuginfo packages for your entire system but still want really useful function names, this is for you. The system-configured debuginfod servers will provide you access to those debuginfo-enabled ELF binaries so that we can discover the appropriate symbol names.</p>
<p>Much like in gdb, you can cancel them if you don’t care and those symbols will fallback to the “In File lib.so+offset” you’re used to.</p>
<p><a href="http://blogs.gnome.org/chergert/files/2024/10/Screenshot-From-2024-10-11-16-12-26.png"><img alt="A screenshot showing a popover of symbols being downloaded." class="aligncenter size-full wp-image-12664" height="261" src="http://blogs.gnome.org/chergert/files/2024/10/Screenshot-From-2024-10-11-16-12-26.png" width="709"/></a></p>
<p>I expect a bit more UI work around this before GNOME 48 like preferences to disable it or configure alternate debuginfod servers.</p>
<p>Happy profiling!</p></div>
    </content>
    <updated>2024-10-11T23:15:15Z</updated>
    <published>2024-10-11T23:15:15Z</published>
    <author>
      <name>chergert</name>
    </author>
    <source>
      <id>https://blogs.gnome.org/chergert</id>
      <link href="https://blogs.gnome.org/chergert/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blogs.gnome.org/chergert" rel="alternate" type="text/html"/>
      <subtitle>Details of Christian's work on GNOME</subtitle>
      <title>Happenings in GNOME</title>
      <updated>2024-10-11T23:15:15Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blogs.gnome.org/hughsie/?p=9937</id>
    <link href="https://blogs.gnome.org/hughsie/2024/10/11/making-it-easy-to-generate-fwupd-device-emulation-data/" rel="alternate" type="text/html"/>
    <title>Making it easy to generate fwupd device emulation data</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">We’re trying to increase the fwupd coverage score, so we can mercilessly refactor and improve code upstream without risks of regressions. To do this we run thousands of unit tests for each part of the libfwupd public API and libfwupdplugin private API. This gets us a long way, but what we really want to do … <a class="more-link" href="https://blogs.gnome.org/hughsie/2024/10/11/making-it-easy-to-generate-fwupd-device-emulation-data/">Continue reading <span class="screen-reader-text">Making it easy to generate fwupd device emulation data</span></a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>We’re trying to increase the <a href="https://coveralls.io/jobs/154047459">fwupd coverage score</a>, so we can mercilessly refactor and improve code upstream without risks of regressions. To do this we run thousands of unit tests for each part of the <code>libfwupd</code> <a href="https://fwupd.github.io/libfwupd/index.html">public API</a> and <code>libfwupdplugin</code> <a href="https://fwupd.github.io/libfwupdplugin/index.html">private API</a>. This gets us a long way, but what we really want to do is emulate the end-to-end firmware update of every real device we support.</p>
<p>It’s not trivial (or quick) connecting hundreds of devices to a specific CI machine, and so for some time we’ve supported recording USB device enumeration, <strong>re</strong>-plug, firmware write, <strong>re</strong>–<strong>re</strong>-plug and <strong>re</strong>-enumeration. For <a href="https://blogs.gnome.org/hughsie/2024/10/04/fwupd-2-0-0/">fwupd 2.0.0</a> we added support for all <code>sysfs</code>-based devices too, which allows us emulate a real world NVMe disk doing actual <code>ioctls()</code> and <code>reads()</code> in every submitted CI job. We’re now going to ask vendors to record emulations for existing plugins of the firmware update so we can run those in CI too.</p>
<p>The device emulation docs are complicated and there’s <a href="https://raw.githubusercontent.com/fwupd/fwupd/refs/heads/main/docs/device-emulation.md">lots of things that the user can do wrong</a>. What I really wanted was a “<em>click, click, save-as, click</em>” user experience that doesn’t need to use the command line. The <code>tl;dr:</code> is that we’ve now added the needed async API in fwupd 2.0.1 (<em>probably</em> going to be released on Monday) and <a href="https://gitlab.gnome.org/World/gnome-firmware/-/merge_requests/123">added the click, click UI to gnome-firmware</a>:</p>
<p><a href="https://blogs.gnome.org/hughsie/files/2024/10/Screenshot-from-2024-10-11-15-00-23.png"><img alt="" class="aligncenter size-medium wp-image-9943" height="204" src="https://blogs.gnome.org/hughsie/files/2024/10/Screenshot-from-2024-10-11-15-00-23-300x204.png" width="300"/></a></p>
<p>There’s a slight niggle when the user starts recording the first “<em>internal</em>” device (e.g. a NVMe disk) that we need to ask the user to restart the daemon or the computer. This is because we can’t just hotplug the internal non-removable device, and need to “<em>start recording</em>” then “<em>enumerate device(s)</em>” rather than the other way around. Recording all the device enumeration isn’t free in CPU or RAM (and is possibly a security problem too), and so we don’t turn it on by default. All the emulation is also all controlled using polkit now, so you need the root password to do anything remotely interesting.</p>
<p><a href="https://blogs.gnome.org/hughsie/files/2024/10/Screenshot-from-2024-10-11-11-04-06.png"><img alt="" class="aligncenter size-medium wp-image-9940" height="99" src="https://blogs.gnome.org/hughsie/files/2024/10/Screenshot-from-2024-10-11-11-04-06-300x99.png" width="300"/></a></p>
<p>Some of the strings are a bit unhelpful, and some a bit clunky, so if you see anything that doesn’t look awesome or is hard to translate please tell us and we can fix it up. Of course, even better would be a <a href="https://gitlab.gnome.org/World/gnome-firmware/-/merge_requests">merge request</a> with a better string.</p>
<p>If you want to try it out there’s a COPR <a href="https://copr.fedorainfracloud.org/coprs/rhughes/fwupd">with all the right bits for Fedora 41</a>. It’ll might also work on Fedora 40 if you remove gnome-software. I’ll probably switch the Flathub build to 48.alpha when fwupd 2.0.1 is released too. Feedback welcome.</p></div>
    </content>
    <updated>2024-10-11T15:48:32Z</updated>
    <published>2024-10-11T15:48:32Z</published>
    <category term="Uncategorized"/>
    <author>
      <name>hughsie</name>
    </author>
    <source>
      <id>https://blogs.gnome.org/hughsie</id>
      <link href="https://blogs.gnome.org/hughsie/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blogs.gnome.org/hughsie" rel="alternate" type="text/html"/>
      <subtitle>Blog about geeky stuff</subtitle>
      <title>Technical Blog of Richard Hughes</title>
      <updated>2024-10-11T15:48:32Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://thisweek.gnome.org/posts/2024/10/twig-169/</id>
    <link href="https://thisweek.gnome.org/posts/2024/10/twig-169/" rel="alternate" type="text/html"/>
    <title>#169 Wrapped Boxes</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Update on what happened across the GNOME project in the week from October 04 to October 11.</p>
<h1 id="gnome-core-apps-and-libraries">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#gnome-core-apps-and-libraries"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>GNOME Core Apps and Libraries
</h1>

<h3 id="libadwaita">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#libadwaita"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>Libadwaita <a href="https://gitlab.gnome.org/GNOME/libadwaita"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#link"/></svg></a>
</h3><p>Building blocks for modern GNOME apps using GTK4.</p>
<p><a href="https://matrix.to/#/@alexm:gnome.org">Alice (she/her)</a> announces</p>
<blockquote>
<p>libadwaita got another new widget - <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.WrapBox.html"><code>AdwWrapBox</code></a> - similar to <code>GtkBox</code>, but wrapping children when they can’t fit onto the same line. This can be useful for e.g. displaying tag pills

<img alt="" src="https://thisweek.gnome.org/posts/2024/10/twig-169/f667cd3295f967fa96b0138310654037798a36741843679746462842880.png"/>
</p>
</blockquote>


<h1 id="gnome-circle-apps-and-libraries">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#gnome-circle-apps-and-libraries"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>GNOME Circle Apps and Libraries
</h1>

<h3 id="hieroglyphic">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#hieroglyphic"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>Hieroglyphic <a href="https://github.com/FineFindus/Hieroglyphic"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#link"/></svg></a>
</h3><p>Find LaTeX symbols</p>
<p><a href="https://matrix.to/#/@finefindus:matrix.org">FineFindus</a> announces</p>
<blockquote>
<p>A new Hieroglyphic update has just been released. The classification backend is now powered by a machine learning model trained on the previously used classification data, improving classification speed and accuracy. However, due to a lack of good training data, some symbols are now less accurately classified.
To improve the training data/accuracy, users can now optionally submit their recognized symbols.

<img alt="" src="https://thisweek.gnome.org/posts/2024/10/twig-169/IEaQMofsLUQaZAcDcQwMofdR.png"/>
</p>
</blockquote>


<h3 id="gaphor">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#gaphor"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>Gaphor <a href="https://gaphor.org"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#link"/></svg></a>
</h3><p>A simple UML and SysML modeling tool.</p>
<p><a href="https://matrix.to/#/@amolenaar:matrix.org">Arjan</a> announces</p>
<blockquote>
<p>This week @danyeaw released Gaphor 2.27.0.</p>
<p>Highlights of this release include
lots of small improvements and usability fixes:</p>
<ul>
<li>Export all diagrams easily from the GUI</li>
<li>New elements: Trigger and Actions for state machine transitions</li>
<li>Improved Picture selection and provide a default name</li>
<li>A macOS ARM (Apple Silicon) version</li>
<li>Flatpak version uses GNOME 47

<img alt="" src="https://thisweek.gnome.org/posts/2024/10/twig-169/zeVEvvXHHDARFcrqOJFiGiNm.png"/>
</li>
</ul>
</blockquote>


<h1 id="events">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#events"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>Events
</h1><p><a href="https://matrix.to/#/@pabloyoyoista:matrix.org">Pablo Correa Gomez</a> announces</p>
<blockquote>
<p>the GNOME Foundation is looking for volunteers to help organize and be at the GNOME stand during FOSDEM: <a href="https://discourse.gnome.org/t/call-for-help-for-a-fosdem-stand/24432">https://discourse.gnome.org/t/call-for-help-for-a-fosdem-stand/24432</a> If you want to help with Outreach, this is your opportunity! If we don’t get enough people to sign up, we will not be able to apply to the stand</p>
</blockquote>


<h1 id="gnome-foundation">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#gnome-foundation"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>GNOME Foundation
</h1><p><a href="https://matrix.to/#/@aday:gnome.org">Allan Day</a> announces</p>
<blockquote>
<p>The GNOME Foundation Board published its minutes for the past four months this week. These can be found in two Discourse posts, <a href="https://discourse.gnome.org/t/foundation-board-minutes-for-2024-06-24-2024-06-13-2024-06-06/24405">one for June</a>, and the <a href="https://discourse.gnome.org/t/foundation-board-minutes-for-july-september-2024/24466">other for July–September</a>. This means that the board is now up to date with publishing its minutes.
The board also published its board responsibilities, ethical conduct, and confidentiality policies for the first time. These were included in a new <a href="https://gitlab.gnome.org/Teams/Board/-/wikis/Policies">policies wiki page</a>, which was created as part of the board’s migration off <a href="https://wiki.gnome.org/">wiki.gnome.org</a> (which is planned for retirement).</p>
</blockquote>
<p><a href="https://matrix.to/#/@pabloyoyoista:matrix.org">Pablo Correa Gomez</a> says</p>
<blockquote>
<p>as promised in our communication last week, the GNOME Foundation Board of Directors has written an update on the financial status and budget approved between October 2024 and September 2025: <a href="https://discourse.gnome.org/t/foundation-2024-2025-budget-and-economic-review/24436">https://discourse.gnome.org/t/foundation-2024-2025-budget-and-economic-review/24436</a>. We hope to continue providing regular updates on financial work</p>
</blockquote>


<h1 id="thats-all-for-this-week">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#thats-all-for-this-week"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>That’s all for this week!
</h1><p>See you next week, and be sure to stop by <a href="https://matrix.to/#/#thisweek:gnome.org">#thisweek:gnome.org</a> with updates on your own projects!</p></div>
    </summary>
    <updated>2024-10-11T00:00:00Z</updated>
    <published>2024-10-11T00:00:00Z</published>
    <source>
      <id>https://thisweek.gnome.org/</id>
      <author>
        <name>This Week in GNOME</name>
      </author>
      <link href="https://thisweek.gnome.org/" rel="alternate" type="text/html"/>
      <link href="https://thisweek.gnome.org/index.xml" rel="self" type="application/rss+xml"/>
      <subtitle>Recent content on This Week in GNOME</subtitle>
      <title>This Week in GNOME</title>
      <updated>2024-10-11T00:00:00Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://foundation.gnome.org/?p=19340</id>
    <link href="https://foundation.gnome.org/2024/10/10/budget-and-economic-review/" rel="alternate" type="text/html"/>
    <title>2024-2025 budget and economic review</title>
    <summary>Dear community members, As promised in the previous communication the Board would like to share some more details on our current financial situation and the budget for our 2024-2025 financial year, which runs from 1st October 2024 to 30th September 2025. Background So, let’s dig into the details: Income Expenditures Balance Conclusion With limited time […]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Dear community members,</p>



<p>As promised in the previous communication the Board would like to share some more details on our current financial situation and the budget for our 2024-2025 financial year, which runs from 1st October 2024 to 30th September 2025.</p>



<h3 class="wp-block-heading"><a href="https://discourse.gnome.org/t/foundation-2024-2025-budget-and-economic-review/24436#p-105440-background-1"/>Background</h3>



<ul class="wp-block-list">
<li>The Foundation needs an approved budget in place because our spending policies use the budget to authorise what staff and committees are allowed to spend money on. This year we passed the budget on time for the start of the financial year, which was thanks to a lot of detailed and particularly challenging work by Richard, which the board is grateful for.</li>



<li>We consider the budget in 2 distinct parts:
<ul class="wp-block-list">
<li>Budget for our fiscally-sponsored projects. We consider their income, but not their expenses. The reason for that is that the Foundation takes a small part of the income as the fiscal sponsorship fee, supporting our administrative and operating costs. Funds received on behalf of other projects are tracked separately, called “reserved funds”, and the Foundation cannot spend money that belongs to the other projects.</li>



<li>General operating budget for the GNOME Foundation, which is what this post is all about! At any later point, when talking about the budget, we’re talking about the general/unrestricted operating funds and it is safe to assume that income for fiscally-sponsored projects is not included.</li>
</ul>
</li>



<li>The budget for the previous 2023-2024 fiscal year was presented to the board as a roughly balanced break-even budget, anticipating $1.201M of revenue and $1.195M of expenses. The board considered two fundraising scenarios proposed by our previous ED, with the most ambitious scenario planning to raise an additional $2M for the Foundation, and one more conservative which anticipated an additional $475k of revenue from various sources (donations, grants, event sponsorship). This more conservative scenario was included in the budget, but in practice things did not work out as planned. This additional funding was not raised, meaning that in practice the Foundation once again ran at a deficit over the past year and used funds from our reserves.</li>



<li>The new 2024-2025 budget considers a total income of $586k, and total expense of $550k. Two things are clearly different from last year: the expenses have been greatly reduced, and we have aimed for a surplus instead of the deficit we ended up with last year. Both things were a consequence of the budget from previous year not being executed as expected. Since our reserve policy requires us to retain enough money to sustain core operations without income for another year (specifically, 1.1 times core spending), we’ve had to reduce expenses to save money and restore our reserves.</li>
</ul>



<p>So, let’s dig into the details:</p>



<h3 class="wp-block-heading"><a href="https://discourse.gnome.org/t/foundation-2024-2025-budget-and-economic-review/24436#p-105440-income-2"/>Income</h3>



<ul class="wp-block-list">
<li>$205,100 in donations. This number is based on previous years income, of individual contributions ($75,000), Advisory Board fees ($105,800), and other small contributions ($7,800) like matching donations (where companies double what employees donate). It also includes $16,500 currently pending from Wau Holland Stiftung, an organization we had a historic agreement with to collect funds from European donors that is tax deductible. We believe that there is a great potential for the GNOME Foundation to increase the amount of individual contributions received, and this has been included in the Strategic Plan and many board discussions. Unfortunately, without a permanent Executive Director, we cannot guarantee that we will be able to establish a program to do so in the short-term, so we have decided to budget conservatively to ensure economic sustainability.</li>



<li>$64,500 from event sponsorship. Most of that money comes from GUADEC ($61,000), with some from LAS and GNOME Asia, which is one of the main reasons why we are able to maintain our events: because they are sponsored separately, they are mostly self-sustaining.</li>



<li>$65,500 in fiscal sponsorship fees. This is based on a % fee the GNOME Foundation takes for our operational costs from hosting GIMP and Black Python Devs. This number is uncommonly high due as we have been workng with the GIMP on financial and legal arrangements to receive approx $1M of historical Bitcoin donations. (And sell them immediately – holding Bitcoin assets creates a regulatory/reporting problem for US nonprofits and our accountants have advised us against it.)</li>



<li>$1,000 in interest from money in the bank account. This is budgeted higher than previous years, as work is already in progress to change bank accounts to increase this income, as recommended by our auditors.</li>



<li>$500 profit from selling T-shirts and other goods ($2,500 income, $2,000 in expenses).</li>



<li>$250,000 from the 2nd year of an Endless grant that was approved last year. This grant provides $50,000 for general funds that the Foundation can use at its discretion, and $200,000 that need to be spent on specific tasks. Currently, those are assigned to Flathub, Parental Controls, GNOME Software maintenance, and internships. Some of those will be detailed in the expense section.</li>
</ul>



<h3 class="wp-block-heading"><a href="https://discourse.gnome.org/t/foundation-2024-2025-budget-and-economic-review/24436#p-105440-expenditures-3"/>Expenditures</h3>



<ul class="wp-block-list">
<li>$10,000 interim ED salary. This is to be able to pay Richard to continue managing the Foundation and staff team until 10th December.</li>



<li>$100,000 for development contractors for work associated with the Endless grant. This work includes improvements in Parental Controls and GNOME Software, and is being executed by Philip Withnall (development), Sam Hewitt (design) and potentially one more developer over the coming year. Philip gave an update on the work in <a href="https://www.youtube.com/watch?v=PZ5chQpxlQ0">his presentation at GUADEC</a>.</li>



<li>$110,600 in contractor costs for program staff, including events and infrastructure. This covers Kristi’s work which is the backbone of events such as GUADEC, LAS and GNOME.Asia, and Bart’s work running GNOME and Flathub infrastructure. The Flathub portion of this work is funded by the Endless grant.</li>



<li>$32,000 in Outreachy interships. This is a long-term partnership with Conservancy and commitment by the GNOME Foundation as the original birthplace of the Outreachy initiative. They are supported this year by reallocating some of the Endless grant, with their permission. This will pay for a total 4 interns between the winter and summer cohort.</li>



<li>$20,000 in contractor support. This is allocated for part-time contracting of Thibault Martin and Dawid Jankowiak to support the STF team and work on a crowdfunding platform for our development fundraising. Some of this is funded by the Endless grant and will be spent on coordinating the next steps of the Flathub payments/donations launch.</li>



<li>$158,000 in employment/contractor costs for operations and admin staff, supporting the GNOME Foundation across finances, events and community initiatives.</li>



<li>$47,500 in professional services, ie legal and accounting. These include a reserve for legal fees ($10,000), an external accounts audit for the previous financial year ($17,500), which is required due to our income (mostly due to STF) being over the $2M threshold, and accounting fees ($20,000). Some of the financial and legal costs are driven by work setting up Flathub LLC and are covered by the Endless grant.</li>



<li>$3,200 in office expenses, mostly related to postal expenses required for sending material between contractors, staff, and event organisers.</li>



<li>$54,000 in conferences and travel. These include the budget for the conferences themselves ($30,000), which includes GUADEC, GNOME Asia, and hackathons around the globe, but also travel for staff ($12,000) and community ($12,000). Travel particularly has been significantly reduced from previous year, but should still allow for staff/organisers to attend our events, and for the travel committee to support some community travel to GUADEC and GNOME Asia.</li>



<li>$15,000 in other fees. These include banking costs for sending money from the US to Europe, PayPal fees, and insurance. They might seem high, but are in total less than 1.5% of the cash flow of the Foundation, which is within the expected value for any organization.</li>
</ul>



<h3 class="wp-block-heading"><a href="https://discourse.gnome.org/t/foundation-2024-2025-budget-and-economic-review/24436#p-105440-balance-4"/>Balance</h3>



<ul class="wp-block-list">
<li>As of the preparation of this budget, we have approx $140,000 in GNOME Foundation reserves. There’s a lot more money in the bank, but they are reserved funds held for GIMP and BPD.</li>



<li>We need to ensure that we meet our reserve policy of retaining 1.1 times core spending. Unfortunately, core spending is fairly loosely defined. This year, we have considered: Events and minimal staff travel, part-time infrastructure support, minimal staff, and some fees and professional services. In total, we accounted that we would need at least $158,000 at the end of the year to be able meet the policy.</li>



<li>The approved budget should put our reserves around $176,000 at the year end, which is slightly above our reserve policy. Considering we used a very limited interpretation of the reserves policy, it’s better to include a small safety margin for any unanticipated costs.</li>
</ul>



<h3 class="wp-block-heading"><a href="https://discourse.gnome.org/t/foundation-2024-2025-budget-and-economic-review/24436#p-105440-conclusion-5"/>Conclusion</h3>



<p>With limited time from our interim Executive Director (ED), Richard Littauer, who is working part-time, the board is prioritising: recruiting our new ED, delivering our current project/grant commitments (to STF and to Endless), and fundraising for development work. This includes working with the community to launch our development fund crowdfunder/platform and plan a follow-up project for STF grant, so that the GNOME Foundation can support and grow its direct investment in project development.</p>



<p>Keen readers will note that there is nothing in the current budget for the ED’s salary. We are in discussions with a potential donor to see whether we can find support for the salary for the ED for the first year. In any case, transparently sharing our financial situation and fundraising needs is an essential part of any ED recruitment process, so we could still recruit somebody with “raise money for your own salary” being their first priority.</p>



<p>Hopefully this additional detail helps to show the challenges of our current situation, and why we had to make really tough decisions, like parting ways with some greatly appreciated members of our staff team. We hope this sheds some more light on why those decisions were taken, provides confidence on the work done by the board and the ED, and where we currently stand. We are also very relieved to be able to provide a surplus budget for the first time in many years, and doing so while still being able to support the community: events, infrastructure, internships, travel funding, and meeting our commitment to donors for work done in some parts of the stack, e.g.: Flathub, parental controls and GNOME Software.</p>



<p>We welcome any <a href="https://discourse.gnome.org/t/foundation-2024-2025-budget-and-economic-review/24436">feedback and questions</a> from the GNOME community. Thanks to all of our GNOME members, contributors, donors, sponsors and advisory board members!</p>



<p>The GNOME Foundation Board of Directors</p>



<p/></div>
    </content>
    <updated>2024-10-10T07:45:39Z</updated>
    <published>2024-10-10T07:45:39Z</published>
    <category term="News"/>
    <category term="GNOME Foundation"/>
    <author>
      <name>Robert McQueen</name>
    </author>
    <source>
      <id>https://foundation.gnome.org</id>
      <logo>https://foundation.gnome.org/wp-content/uploads/sites/12/2020/08/cropped-icon-32x32.jpg</logo>
      <link href="https://foundation.gnome.org/news/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://foundation.gnome.org" rel="alternate" type="text/html"/>
      <subtitle>Building a diverse and sustainable free software ecosystem</subtitle>
      <title>News – The GNOME Foundation</title>
      <updated>2024-10-10T07:45:40Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blogs.gnome.org/chergert/?p=12625</id>
    <link href="https://blogs.gnome.org/chergert/2024/10/10/gcc-clang-indirect-functions/" rel="alternate" type="text/html"/>
    <title>GCC/Clang Indirect Functions</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">There is this extremely neat feature in GCC 10+ and Clang 9+ that allows you to determine which function should be patched in at runtime. Procress startup code will call your user-defined function to figure out which function should be used for the environment. For example, take the following This can be handy when you’re … <a class="more-link" href="https://blogs.gnome.org/chergert/2024/10/10/gcc-clang-indirect-functions/">Continue reading <span class="screen-reader-text">GCC/Clang Indirect Functions</span></a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>There is this extremely neat feature in GCC 10+ and Clang 9+ that allows you to determine which function should be patched in at runtime. Procress startup code will call your user-defined function to figure out which function should be used for the environment.</p>
<p>For example, take the following</p>
<pre class="brush: cpp; title: ; notranslate">static gboolean (*choose_utf8_impl (void)) (const char *, gssize, const char **)
{
  if (go_fast)
    return fast_version;
  else
    return slow_version;
}

gboolean
g_utf8_validate (const char  *str,
                 gssize       len,
                 const char **end)
  __attribute__((ifunc("choose_utf8_impl")));
</pre>
<p>This can be handy when you’re dealing with complex branching based on the system. For example, imagine you need to check if you’re running under Valgrind <a href="https://gitlab.gnome.org/GNOME/glib/-/issues/3493">as one does</a> occasionally to satisfy an incorrect assumption about accessing past heap boundaries.</p>
<p>The typical way to handle this is to <code>#include "valgrind.h"</code> and branch based on <code>if (RUNNING_ON_VALGRIND) ...</code>.</p>
<p>However, that inlines a bunch of assembly you probably don’t want in your ultra-fast new utf8-validation implementation. It might be better to just <a href="https://gitlab.gnome.org/GNOME/glib/-/merge_requests/4344">do that once at process startup</a> and save yourself a bunch of CPU cycles.</p></div>
    </content>
    <updated>2024-10-10T00:18:01Z</updated>
    <published>2024-10-10T00:18:01Z</published>
    <author>
      <name>chergert</name>
    </author>
    <source>
      <id>https://blogs.gnome.org/chergert</id>
      <link href="https://blogs.gnome.org/chergert/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blogs.gnome.org/chergert" rel="alternate" type="text/html"/>
      <subtitle>Details of Christian's work on GNOME</subtitle>
      <title>Happenings in GNOME</title>
      <updated>2024-10-11T23:15:15Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://samthursfield.wordpress.com/?p=2554</id>
    <link href="https://samthursfield.wordpress.com/2024/10/09/pycon-espana-2024/" rel="alternate" type="text/html"/>
    <title>PyCon España 2024</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This year PyCon Spain happened just down the road from me in Vigo, and I was able to attend with a few folk from Codethink. Python conferences are usually great as there’s so much variety in the talks and the bar for quality is also quite high. I’m not sure when the videos will be … <a class="more-link" href="https://samthursfield.wordpress.com/2024/10/09/pycon-espana-2024/">Continue reading <span class="screen-reader-text">PyCon España 2024</span></a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>This year <a href="https://2024.es.pycon.org/">PyCon Spain</a> happened just down the road from me in Vigo, and I was able to attend with a few folk from <a href="https://www.codethink.co.uk/">Codethink</a>. Python conferences are usually great as there’s so much variety in the talks and the bar for quality is also quite high.</p>



<p>I’m not sure when the videos will be out and they’ll anyway be in Spanish, but here are some notes for the talks I found most interesting. (Codethink sponsors our attendence to conferences on the basis that we write an internal report afterwards, which is where most of these notes came from). </p>



<h2 class="wp-block-heading">Mapping illegal tourist apartments with Python</h2>



<p><a href="https://pretalx.com/pycones-2024/talk/PWEFGB/">https://pretalx.com/pycones-2024/talk/PWEFGB/</a></p>



<p>Presented by <a href="https://social.coop/@astrojuanlu">Juan Luis Cano Rodríguez</a>, who is a co-founder of Python España and PyCon ES. This talk was activism with some data engineering, in the context of the housing crisis that’s affecting most Spanish cities and tourist destinations.</p>



<p>This talk is the story of how he accidentally got involved as an activist after he noticed someone in his own appt building in Madrid was doing short-term rents to tourists, and wondered whether they had a license.</p>



<p>He started by asking the audience to guess how many long-term rental properties are available on <a href="https://www.idealista.com/">Idealista</a> for Madrid. Is it 7,000, 21,000 or 43,000? Then he asked to guess how many short-term rentals are available on AirBnB.</p>



<p>Tourist apartments in Madrid are licensed only after a professional inspection. The council publish data on how many licenses they’ve issued, and there are 1008 properties listed. Meanwhile the property register, which doesn’t require any inspection, lists 11,000 short-term rental properties. AirBnB meanwhile has 26,000 offers in Madrid. He realized that illegal apartment rentals are far worse than he had imagined.</p>



<p>He used Python (of course) to compare the register of properties against the license data to identify which properties were unlicensed, and participated in a group effort to send 10,000 individual reports to the council in one day. This made the national news back in June. The mayor of Madrid even praised this “citizens effort”.</p>



<p/>



<figure class="wp-block-image size-large is-style-rounded"><a href="https://samthursfield.wordpress.com/wp-content/uploads/2024/10/img_20241005_113729.jpg"><img alt="" class="wp-image-2562" height="1024" src="https://samthursfield.wordpress.com/wp-content/uploads/2024/10/img_20241005_113729.jpg?w=768" tabindex="0" width="768"/></a></figure>



<p>AirBnB has a “license” field for short-term rentals in Spain, but they don’t do any checking of whether it’s valid. He experimented with their “Report” button with an apartment he knew was unlicensed, and AirBnB’s internal “investigation team” reported back a couple of days later that they had found nothing wrong.</p>



<p>Towards the end of the talk he offered the audience a choice, he could explain the data wrangling with Python in more detail, or give his thoughts on the housing crisis. The vote was around 90% for the latter, and his message was that (unsurprisingly) a lot more pressure is needed before anything is going to change. He finished by announcing a protest happening on the 13th October in Madrid.</p>



<p>The talk was very well received and could probably have filled 3 hours instead of 35 minutes. </p>



<h2 class="wp-block-heading">How we are removing the GIL in Python</h2>



<p><a href="https://pretalx.com/pycones-2024/talk/ESYBVA/">https://pretalx.com/pycones-2024/talk/ESYBVA/</a></p>



<p>Presented by Pablo Galindo Salgado, a Python core developer and Bloomberg engineer, this was a summary of the incredible work going on to remove CPython’s “Global Interpeter Lock” or GIL. The full technical details of this are in <a href="https://peps.python.org/pep-0703/">PEP 703</a>, this is my short summary.</p>



<p>Again this talk could have been a full-day workshop but Pablo packed a lot of details into the time, using the simple of trick of talking incredibly fast.</p>



<p>CPython’s global lock means that writing multithreaded Python code is a waste of time, as the threads just get stuck waiting for the global lock. Today people use horrible  workarounds such as the ‘multiprocessing’ library.</p>



<p>However, the GIL has advantages too, mainly its simplicitly. Deadlocks are a common problem in multithreaded code but currently CPython is immune to all that — a deadlock is caused when two mutexes block each other, but of course CPython only has the one lock.</p>



<p>So the big challenge is replacing the GIL with many separate locks, without making CPython slower, and avoiding deadlocks. CPython uses reference counting to manage memory, and this is the hardest piece of the puzzle as sharing objects between threads means every refcount change must be atomic and this can require locking, which limits throughput.</p>



<p>People have been trying to solve this since the mid 1990s and noone has yet succeeded, but the work here is actually being released this week in Python 3.13. It’s behind a compile-time configure flag, and the expectation is to spent around 5 years testing this before it’s enabled by default for everyone.</p>



<p>A minimal overview of how they’ve done it:</p>



<ul class="wp-block-list">
<li>switch to <em>biased ref counting</em> for Python objects: this means there are now two refcounts per object, a thread-local refcount and a global refcount. The global one can be slow to access, but most of the time a local refcount is good enough and this is a fast path.</li>



<li>make common objects <em>immortal</em>: remember Python dates from the golden age of object-oriented programming, and everything is an object including <code>True</code>, <code>False</code>, <code>None</code>, the number 4 and so on. By setting the highest 2 bits of the refcount, these are now marked as immortal.</li>



<li>fast locking: using spinlocks from WebKit (the excellently named <a href="https://webkit.org/blog/6161/locking-in-webkit/">WTF::Lock</a>) where possible</li>



<li>new memory allocator: use <a href="https://github.com/microsoft/mimalloc">mimalloc</a>, which allows linked list segments to be allocated contiguously instead of all over the place.</li>
</ul>



<p>It seems a lot of this work has been funded by corporations, mainly Meta as noted in the <a href="https://docs.python.org/3/whatsnew/3.13.html">Python 3.13 release notes</a>, and we can assume Bloomberg are somewhat involved as well.<br/><br/>I hope Pablo does the same talk in English at some point because it was excellent. In the meantime you can <a href="https://changelog.com/podcast/611">hear him on the Changelog podcast</a>: </p>



<h2 class="wp-block-heading">The tsunami of disinformation: how Generative AI can help us in the fight against Fake News.</h2>



<p><a href="https://pretalx.com/pycones-2024/talk/8ZXZ8Z/">https://pretalx.com/pycones-2024/talk/8ZXZ8Z/</a></p>



<p>Presented by Rubén Míguez and Agustín Cañas from <a href="http://newtral.es">Newtral</a>, a fact-checking organization in Spain.</p>



<p>There are many bullshit talks around about how generative AI will magically solve some or other intractable problem, as if a text synthesis machine built from Reddit comments is somehow going to succeed where our best scientists and leaders have so far failed. I recommend reading <a href="https://pivot-to-ai.com/">https://pivot-to-ai.com/</a> on that topic, but let me get back to<br/>the talk.</p>



<p>The talk began with an overview of fake news, which I’m sure I don’t need to repeat here, except the excellent statistic taken from Washington Post fact-checkers that during 2016-2020, the then US president made around 30,000 provably false statements, which works out at 21 lies a day, every day for four years including Sundays and bank holidays. So it’s been an interesting time in the world of fact-checkers.</p>



<p>Newtral exists since 2013 and began in a very analogue way: human fact checkers watching news programs with big notebooks and writing down things to be verified. The goal of the small technology team was not to replace the human fact checkers but to build tools that could make them work 30x as fast.</p>



<p>(So if you were wondering how generative AI tools could possibly detect fake news, when Google’s “state of the art” AI is <a href="https://www.wired.com/story/google-ai-overviews-broken-how-ai-works/">telling people to throw car batteries into the ocean and put glue on pizza</a>, the answer is of course: it’s not going to, there will still be a human fact<br/>checker in the loop).</p>



<p>The fact checking process is roughly as follows:</p>



<ol class="wp-block-list">
<li>Monitor media </li>



<li>Spot facts </li>



<li>Verify them </li>



<li>Publish (“exploit”) the result</li>
</ol>



<p>The talk detailed some tools to automate the first two parts: using speech-to-text models to transcribe political speeches and so on as they happen, and then text analysis tools to identify potentially “verifiable” statements. As well as deciding whether a statement can be<br/>verified, they have to analyse whether it matters, whether the misinformation could be dangerous, whether it’s a joke, and so on. There wasn’t much detail how they do this in the talk, unfortunately.</p>



<p>Then they mentioned a multimodal model named ClaimCheck which has run as a WhatsApp bot since 2020 where people can send forwarded messages to see if they are true. This works using RAG (Retrieval Augmented Generation) to search an existing database of human-verified facts. Again I’d have loved more details on how this works.</p>



<p>Finally they mentioned that Newtral will be launching a technology-focused spinoff named Trueflag, aiming to build the existing tech into a software-as-a-service tool for fact checking that can be used by news organisations, social media platforms and so on.</p>



<p>I found this article online which gives some more info:</p>



<ul class="wp-block-list">
<li><a href="https://www.wired.com/story/fact-checkers-ai-chatgpt-misinformation/">https://www.wired.com/story/fact-checkers-ai-chatgpt-misinformation/</a></li>
</ul>



<p>I’m still very curious about how far they can get with this tech and will be following closely.</p>



<h2 class="wp-block-heading">Other note</h2>



<p>There was some talks I didn’t enjoy so much. One about using <a href="http://www.pyomo.org/">Pyomo</a> to model the game Age of Empires 2, delivered by some mathmeticians who unfortunately didn’t actually hook up their model to the real game, and the second half the talk was just graphs when what we obviously wanted was footage from actual Age of Empires 2 games. Pyomo looks interesting though.</p>



<p>I also saw a talk on the Robot Framework for testing. The talk was well delivered but I fundamentally disagree with the premise that by hiding Python code behind a bunch of free form text, “non-programmers” will be able to write and adapt test suites. The tool itself looks fine, but I wonder when we’ll learn that there’s no tool that can magically make testing easy, people just have to learn to write excellent test suites using code, and that’s the only way anyone will be able to produce a good test suite. (I’m considering doing a talk myself called “How to write a good test suite using regular programming tools”.)</p>



<p>Vigo was of course fantastic despite the intermittent rain, minor travel issues and increasingly strange procedures for checking in to tourist apartments. (This is the first time I’ve stayed in a place with a “Virtual key”, a web page linked to a smart lock on the apartment door which means you need working internet to enter the place). At least the rental apartment did have a license.</p>



<p>I’d recommend Python community events to everyone. People use Python for all kinds of different things – science, journalism, art, activism, and so on – you always get an interesting mix of talks and not just dry technical presentations of screenshots of code. Even the very technical talk on the GIL was not dry at all. Wherever you live you probably have a local Python community and they may well organize an annual conference, worth investigating.Those of us outside the UK no doubt also have a national Python<br/>community who probably hold a conference from time to time. Get<br/>involved!</p>



<p>Thanks as always to Codethink for sponsoring accommodation, food and sponsoring the event itself.</p></div>
    </content>
    <updated>2024-10-09T10:08:15Z</updated>
    <published>2024-10-09T10:08:15Z</published>
    <category term="Conferences"/>
    <category term="python"/>
    <author>
      <name>Sam Thursfield</name>
    </author>
    <source>
      <id>https://samthursfield.wordpress.com</id>
      <logo>https://samthursfield.wordpress.com/wp-content/uploads/2020/10/cropped-favicon.png?w=32</logo>
      <link href="https://samthursfield.wordpress.com/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://samthursfield.wordpress.com" rel="alternate" type="text/html"/>
      <link href="https://samthursfield.wordpress.com/osd.xml" rel="search" title="Sam Thursfield" type="application/opensearchdescription+xml"/>
      <link href="https://samthursfield.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Software and technology from Galicia, Spain</subtitle>
      <title>Sam Thursfield</title>
      <updated>2024-10-16T13:33:06Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://www.figuiere.net/hub/wlog/dev-log-september-2024/</id>
    <link href="https://www.figuiere.net/hub/wlog/dev-log-september-2024/" rel="alternate" type="text/html"/>
    <title xml:lang="en">Dev Log September 2024</title>
    <summary type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>A long overdue dev log. The last one was for September 2023. That's a
year. Stuff in life has happened.</p>
<h1 id="compiano">Compiano</h1>
<p>In November I switched Compiano to use pipewire directly for
sound. This mean removing bits of UI too.</p>
<p>I should look at a release, but I have a few blockers I need to
tackle. One key element is that there is a mechanism to download the
soundbanks and for now it doesn't ask consent to do so. I don't want a
release without this.</p>
<h1 id="raw-thumbnailer">Raw thumbnailer</h1>
<p>I already <a href="https://www.figuiere.net/hub/wlog/new-raw-thumbnailer/">posted about it</a>.</p>
<h1 id="libopenraw">libopenraw</h1>
<p>Lot has happened on that front. I want it to be a foundation of Niepce
and others.</p>
<p>First adding it to glycin triggered an alpha release on
crates.io. There started a long cycle of alpha release, we are at
alpha 8 as of now. Various changes:</p>
<ul>
<li>Added the mp4parse crate directly as a module. A key reason is that
I already used a fork so it complicate things. Maybe I should make
these few bits upstreamable and use upstream.</li>
<li>Added a mime types API</li>
<li>Save up a lot of RAM when doing colour interpolation: it's done in
place instead of allocating a new buffer. This is significant as
this is done using a 64-bit float per component.</li>
<li>Fixed the rendering in many ways. The only thing it needs it to
apply the colour balance.</li>
<li>Fixed unpack or decompression of Olympus and Fuji files.</li>
<li>Got an external contribution: <a href="https://gitlab.freedesktop.org/libopenraw/libopenraw/-/merge_requests/3">Panasonic
decompression</a>. This
made me fix the loading of uncompressed Panasonic raw too. The more
recent Panasonic cameras are still failing though, there is a subtle
variant that needs to be handled.</li>
</ul>
<p>Still missing from rendering: recent Nikon and all their exotic
variants and compression scheme, Canon CR3, GoPro, Sony.</p>
<h1 id="niepce">Niepce</h1>
<p>Not so much work directly done on Niepce in the last few month, but
still.</p>
<h2 id="ongoing-features">Ongoing features</h2>
<p>Started a while ago some work towards the import and a rework of the
catalog (the main data storage).</p>
<p>The former is the implementation of a workflow that allow immporting
images into the catalog.</p>
<p>The latter involve reworking the catalog to become a self contained
storage as a sqlite3 database. One step I already did was to use it to
store the catalog preferences instead of a separate file. This should
also include fixing the UI open, creating, switching.</p>
<p>This big two things are user visible and are a stop forward what I
want to happen as an internal milestone. Then I can start pluging the
library import and maybe import my picture vault. A good starting
point towards managing the collection, but not really for photo
editing yet. Gotta make choices.</p>
<h2 id="images">Images</h2>
<p>Implemented support for HEIF which is being adopted by camera
manufacturers.</p>
<p>I updated the RT engine to 5.11 which came with RawTherapee 5.11. This
is still a soft work of the code base to use strip out Gtk3 and a more
recent version of glibmm. The latter patch might no longer be needed
as I have since removed gtkmm from Niepce.</p>
<p>I also implemented the GEGL pipeline using
<a href="https://gitlab.gnome.org/World/Rust/gegl-rs">gegl-rs</a>, which I took
over to make it useful. At one I shall try to figure out how to write
a loader in Rust to use libopenraw with GEGL.</p>
<h2 id="cleanups">Cleanups</h2>
<p>The UI is slowly moving to use blueprint, and I removed all the
first-party C++ code outside of bindings, no more Gtkmm and Glibmm is
only here because RT engine needs it.</p>
<h1 id="other">Other</h1>
<p>Stuff I contributed to.</p>
<h2 id="stf">STF</h2>
<p>I took part to the STF effort and worked on fixing issues with
the desktop portal. The big chunk of the work related to the USB
portal, taking over code by Georges that is itself based on code by
Ryan. It spreads through multiple component of the stack: flatpak,
xdg-desktop-portal, xdg-desktop-portal-gnome, libportal and ashpd.</p>
<p>I also did a bunch of bug fixes, crashes, memory leaks, etc in
flatpak, flatpak-builder, and the rest of the stack.</p>
<p>I also implemented <a href="https://github.com/flatpak/flatpak-builder/issues/1">issue
#1</a> for
flatpak-builder: easy renaming of MIME files and icons, and also
properly fixing the <code>id</code> in the appstream file, a common problem in
flatpak.</p>
<h2 id="glycin">Glycin</h2>
<p>Glycin is a sandboxed image loader. I did implement the <a href="https://gitlab.gnome.org/sophie-h/glycin/-/merge_requests/38">raw camera
loader</a>
using libopenraw. It's written in Rust, so is libopenraw now. Thank
you Sophie for merging it.</p>
<h2 id="poppler">Poppler</h2>
<p>Jeff was complaining about a <a href="https://gitlab.freedesktop.org/poppler/poppler/-/issues/1485">file being super
slow</a>,
with sysprof flamegraph. That picked my curiosity and looked at
it. The peculiarity of the document is that it has 16000 pages and a
lot of cross references.</p>
<p>This lead to two patches:</p>
<ul>
<li>
<p><a href="https://gitlab.freedesktop.org/poppler/poppler/-/merge_requests/1554">The first
one</a>
is in 24.06. There was a loop, calling for the length of the
container at each iteration. Turns out this is protected by a mutex
and that's a lot of time spend for nothing since the value is
immutable. Call it once before the loop and voila.</p>
</li>
<li>
<p><a href="https://gitlab.freedesktop.org/poppler/poppler/-/merge_requests/1556">The other
one</a>,
merged for 24.09 change that loop to be a hash table lookup. The
problem is that it want to locate the page by object reference, but
iterate through the page list. Lots of ref and lots of a page mean
even more iterator. The more complex approach is when building the
page cache (it's done on demand), we build a reference to page index
map. And the slow code is no longer slow and almost disappear from
the flamegraphs.</p>
</li>
</ul>
<p>This make Evince and Okular faster to open that document and any
presenting similar attribute: a lot of bookmarks.</p></div>
    </summary>
    <updated>2024-10-09T00:00:00Z</updated>
    <published>2024-10-09T00:00:00Z</published>
    <author>
      <name>Hubert Figuière</name>
    </author>
    <source>
      <id>https://www.figuiere.net/hub/wlog/atom.xml</id>
      <link href="https://www.figuiere.net/hub/wlog/atom.xml" rel="self" type="application/atom+xml"/>
      <link href="https://www.figuiere.net/hub/wlog" rel="alternate" type="text/html"/>
      <title xml:lang="en">Hub's wlog</title>
      <updated>2024-10-09T00:00:00Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://foundation.gnome.org/?p=19329</id>
    <link href="https://foundation.gnome.org/2024/10/07/update-from-the-board-2024-10/" rel="alternate" type="text/html"/>
    <title>Update from the Board: 2024-10</title>
    <summary>Dear GNOME community members, We want to provide you with an important update on recent developments at the GNOME Foundation. What Has Happened The GNOME Foundation Board of Directors has approved a budget for the coming financial year (October 1, 2024, to September 30, 2025). In the process, we’ve had to make some tough decisions […]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Dear GNOME community members,</p>



<p>We want to provide you with an important update on recent developments at the GNOME Foundation.</p>



<h2 class="wp-block-heading">What Has Happened</h2>



<p>The GNOME Foundation Board of Directors has approved a budget for the coming financial year (October 1, 2024, to September 30, 2025). In the process, we’ve had to make some tough decisions to ensure the Foundation’s long-term financial sustainability.</p>



<h2 class="wp-block-heading">What Is Impacted</h2>



<p><strong>Staff Changes</strong></p>



<p>Regrettably, we have had to reduce our staff. Caroline Henriksen (Creative Director) and Melissa Wu (Director of Community Development) are no longer members of the GNOME Foundation staff team. We sincerely thank Caroline and Melissa for their significant contributions over the past years and wish them the best in their future endeavors.</p>



<p><strong>Operational Adjustments</strong></p>



<p>Critical tasks will be redistributed among remaining staff and the Board. We will be reaching out to the community for more support in areas such as:</p>



<ul class="wp-block-list">
<li>Event organization and representation</li>



<li>Marketing initiatives</li>



<li>Fundraising efforts</li>



<li>Graphic design</li>
</ul>



<p><strong>Reduced Travel</strong></p>



<p>Unless additional funds are secured, there will be significant reductions on community, board and staff travel to events. We’ll be reassessing which events are most critical for staff attendance.</p>



<h2 class="wp-block-heading">What Is Unaffected</h2>



<p><strong>Key Events: LAS, GNOME.Asia, GUADEC</strong></p>



<p>We are hosting the Linux App Summit in partnership with KDE this weekend, on 4th-5th October in Monterrey, Mexico. Other events such as GNOME.Asia and GUADEC are continuing as planned and remain a core priority for our team. We’re very grateful to our event sponsors for separately supporting these important events to bring our community together.</p>



<p><strong>Internships</strong></p>



<p>We have secured funding to continue our participation in Outreachy at our previous level of four interns a year, two later this year and two early next year. Our participation in Google Summer of Code is supported by our greatly-appreciated Internship Committee and is also not impacted by these changes.</p>



<p><strong>Externally Sponsored Projects</strong></p>



<p>Certain other projects, including all of the infrastructure, staff, legal and operating costs of Flathub, and ongoing development work on Digital Wellbeing / Parental Controls, are fully sponsored by an existing grant from Endless. We are also working with our team of contractors to complete the delivery of the remaining elements of the Sovereign Tech Fund contract. We are not able to divert these funds to different purposes, but equally, they are fully funded to continue even though we’ve had to reduce spending in other areas.</p>



<p><strong>Infrastructure &amp; Operations</strong></p>



<p>All of the gnome.org infrastructure remains fully funded and staffed as before, together with our core finance, operations and administrative functions.</p>



<h2 class="wp-block-heading">Why This Has Happened</h2>



<p>Our plan for the previous financial year was to operate a break-even budget. We raised less than expected last year, due to a very challenging fundraising environment for nonprofits, on top of internal changes such as the <a href="https://foundation.gnome.org/2024/07/12/gnome-foundation-announces-transition-of-executive-director/">departure of our previous Executive Director, Holly Million</a>.</p>



<p>The Foundation has a <a href="https://wiki.gnome.org/Foundation/BudgetAndSpending#Reserves_policy">reserves policy</a> which requires us to keep a certain amount of money in the bank account, to preserve core operations in the event of interruptions to our income.</p>



<p>In order to meet our reserves policy, this year’s budget had to reduce our expenditure to below expected income, and generate a small surplus to reinstate the Foundation’s financial reserves to the necessary level.</p>



<h2 class="wp-block-heading">What’s Next</h2>



<ul class="wp-block-list">
<li><strong>Executive Director Recruitment:</strong> We are actively <a href="https://foundation.gnome.org/2024/09/13/search-for-new-executive-director/">searching for a new Executive Director</a>. This process is unaffected by the current budget constraints as we are exploring different ways to fund the role.</li>



<li><strong>Community Support:</strong> We’re asking for your support in several ways:
<ul class="wp-block-list">
<li>Look out for opportunities to volunteer your time and skills in areas where we’ve had to reduce staff involvement.</li>



<li>Share ideas on how to organize and improve our activities in this new context.</li>



<li>Consider <a href="https://www.gnome.org/donate/">making donations</a> to support the GNOME Foundation’s core priorities, if you’re able.</li>
</ul>
</li>



<li><strong>Transparency:</strong> In the coming weeks, we’ll share a more detailed report of the current finances and the approved budget, including specific categories and the reasoning behind various decisions.</li>



<li><strong>Ongoing Communication:</strong> We’re committed to providing regular updates on our progress and welcome your feedback on how often you’d like to hear from us.</li>
</ul>



<p>Through these difficult decisions, the GNOME Foundation is able to meet its reserves policy, ensuring sufficient funds for the coming year. Our budget for the new financial year is realistic and supports four full time staff, who are able to support key operations like finance, infrastructure and events. We are additionally contracting a number of other individuals on a short term or part time basis, to help with fund raising, websites and delivering on our project commitments.</p>



<p>We are going to be looking to the GNOME community to help with the areas that are most affected by our reduced staffing. If you would like to help GNOME with its events, marketing, or fundraising, we would love to hear from you. We would also welcome the community’s input on the best way to organize these activities, so please feel free to reach out to our Interim Executive Director, Richard Littauer (richard@gnome.org), or the Board if you have ideas.</p>



<p>Thank you all for your continued commitment to the GNOME community, and thanks to all of the existing donors, sponsors and advisory board members whose support year on year is essential to maintain the Foundation’s core operations.</p>



<p>The GNOME Foundation Board of Directors</p>



<p><em>This document was previously posted on the Discourse, and is mirrored here without changes (except adding Richard’s email, above). <a href="https://discourse.gnome.org/t/update-from-the-board-2024-10/24346">https://discourse.gnome.org/t/update-from-the-board-2024-10/24346</a></em></p></div>
    </content>
    <updated>2024-10-07T21:33:06Z</updated>
    <published>2024-10-07T21:33:06Z</published>
    <category term="News"/>
    <author>
      <name>richard</name>
    </author>
    <source>
      <id>https://foundation.gnome.org</id>
      <logo>https://foundation.gnome.org/wp-content/uploads/sites/12/2020/08/cropped-icon-32x32.jpg</logo>
      <link href="https://foundation.gnome.org/news/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://foundation.gnome.org" rel="alternate" type="text/html"/>
      <subtitle>Building a diverse and sustainable free software ecosystem</subtitle>
      <title>News – The GNOME Foundation</title>
      <updated>2024-10-10T07:45:40Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-5968355124473522212.post-1614814492711366938</id>
    <link href="https://nibblestew.blogspot.com/feeds/1614814492711366938/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/>
    <link href="https://nibblestew.blogspot.com/2024/10/capypdf-1120-released.html#comment-form" rel="replies" title="0 Comments" type="text/html"/>
    <link href="https://www.blogger.com/feeds/5968355124473522212/posts/default/1614814492711366938" rel="edit" type="application/atom+xml"/>
    <link href="https://www.blogger.com/feeds/5968355124473522212/posts/default/1614814492711366938" rel="self" type="application/atom+xml"/>
    <link href="https://nibblestew.blogspot.com/2024/10/capypdf-1120-released.html" rel="alternate" title="CapyPDF 0.12.0 released" type="text/html"/>
    <title>CapyPDF 0.12.0 released</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I have just made the <a href="https://github.com/jpakkane/capypdf/releases/tag/0.12.0">0.12 release of CapyPDF</a>. It does not really have new features, but the API has been overhauled. It is almost guaranteed that no code developed against 0.11 will work without code changes. Such is the joy of not having any users.</p><h1 style="text-align: left;">Experimental C++ wrapper</h1><p style="text-align: left;">CapyPDF has a plain C API. This makes it stable and easy to use from any programming language. That also makes it cumbersome to use. Here is what you need to write to create a PDF file that has a single rectangle:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbgAjYQvAf7nt8BObDdPAH7PhtbUqNtfPHZuye8cm6iEcimvXYJqN0FzR8TRRfQGxXgt-j3xYtgvgEunPMkzhNeEt_lt-ZEc52itQltPSXN6Nj8FhLI6fxFKMS4SrMwlRkIafDRSJaSKLgJO25WDeu5wySRu00lu_ePwNCGsf3eKjaUiPP69YfkOXmp7E/s1024/capycpp1.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbgAjYQvAf7nt8BObDdPAH7PhtbUqNtfPHZuye8cm6iEcimvXYJqN0FzR8TRRfQGxXgt-j3xYtgvgEunPMkzhNeEt_lt-ZEc52itQltPSXN6Nj8FhLI6fxFKMS4SrMwlRkIafDRSJaSKLgJO25WDeu5wySRu00lu_ePwNCGsf3eKjaUiPP69YfkOXmp7E/w298-h400/capycpp1.png" width="298"/></a></div><p style="text-align: left;">Given that this is C, you can't really do better. However I was asked if I could create something more ergonomic for C++ users. This seemed like an interesting challenge, so I did some experimentation, which ships with the 0.12 release.</p><h3 style="text-align: left;">The requirements</h3><p style="text-align: left;">The C++ wrapper should fulfill the following requirements:</p><p style="text-align: left;"/><ul style="text-align: left;"><li>Fully type safe</li><li>No manual memory management</li><li>Ideally a single header</li><li>Zero overhead</li><li>Fast to compile</li><li>All objects are move-only</li><li>IDE code completion friendly</li><li>Does not need to maintain API or ABI stability (those who need that have to use the C API anyway)</li></ul><h3 style="text-align: left;">The base</h3><p style="text-align: left;">After trying a bunch of different things I eventually came up with this design:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBQ_yzcu74YQ5cQtlKZMkiS2atXjkWd1J-Ur4t_SLi2yJLPO64VeSSXeSptixV-ovE9jbazm9AacBfQLJCjg56KciJ4OTrV-KE1kyEgd1q0i5FYj94SrWWFPDdtaUAhwtYPlNoJZTyzGO4J6OWoXTIw4_kJDduwkmhsOHRHc7Ccy4Jk7L0SpX2vAmXG-M/s640/capycpp2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="122" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBQ_yzcu74YQ5cQtlKZMkiS2atXjkWd1J-Ur4t_SLi2yJLPO64VeSSXeSptixV-ovE9jbazm9AacBfQLJCjg56KciJ4OTrV-KE1kyEgd1q0i5FYj94SrWWFPDdtaUAhwtYPlNoJZTyzGO4J6OWoXTIw4_kJDduwkmhsOHRHc7Ccy4Jk7L0SpX2vAmXG-M/w400-h122/capycpp2.png" width="400"/></a></div><p style="text-align: left;">Basically it just stores an underlying CapyPDF object type and a helper class used to deallocate it. The operators merely mean that the object can be cast to a pointer of the underlying type. Typically you want conversion operators to be <span style="font-family: courier;">explicit</span> but these are not, because begin implicit removes a ton of boilerplate code.</p><p style="text-align: left;">For example let's look what the Color object wrapper looks like. First you need the deleter:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioygsrs7th4nDYawHpQH5X-7_mP6S8fBgoRQPg1gWPY_bHkkyMboaqgxWjQZMIE5Cre9jt8EZZ80JQ6P_KnzweH7mLCsiwpgjlEH9a-jhKkudWKdhV3QmaC31PtKEM_ewht-HTchxb4FD5vcdS0TtycTDuiTU3_1F_nu1_XsagyDQ4XhmXOvBHui4EXK4/s400/capycpp3.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="129" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioygsrs7th4nDYawHpQH5X-7_mP6S8fBgoRQPg1gWPY_bHkkyMboaqgxWjQZMIE5Cre9jt8EZZ80JQ6P_KnzweH7mLCsiwpgjlEH9a-jhKkudWKdhV3QmaC31PtKEM_ewht-HTchxb4FD5vcdS0TtycTDuiTU3_1F_nu1_XsagyDQ4XhmXOvBHui4EXK4/w400-h129/capycpp3.png" width="400"/></a></div><p style="text-align: left;">The class definition itself is simple:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxqCbXKvzwaZUmU8rreHBl5rp9D_Wfnw9awksZRIb4yl_c4CtA41zAeJtfPf7646pKds4DZhtHZ1RrseGb7-HEp4EeqB9r72FCwXnl1bfuE2eZ14_o3HijcRrLoGII_TOLTpmv4mLPNyF37qbLlRrpSFRs-g14BcnPaGuzN4aCZt0u0EyEibWovxMk18Y/s500/capycpp4.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="30" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxqCbXKvzwaZUmU8rreHBl5rp9D_Wfnw9awksZRIb4yl_c4CtA41zAeJtfPf7646pKds4DZhtHZ1RrseGb7-HEp4EeqB9r72FCwXnl1bfuE2eZ14_o3HijcRrLoGII_TOLTpmv4mLPNyF37qbLlRrpSFRs-g14BcnPaGuzN4aCZt0u0EyEibWovxMk18Y/w400-h30/capycpp4.png" width="400"/></a></div><p style="text-align: left;">The class has no other members than the one from the base class. The last thing we need before we can start calling into CapyPDF functions is an error handler. Because all functions in the API have the exact same form, this can be done with a single macro:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRIzEsjiDGxQFO924fVSCtyNemjUntdJRjKlrXObAIzjvFqlLdJYWRv2oqzxoxDJFegj7r_dgA7ke-lrRn63RkIcHhtj-Q-hww2QTdPX3X0uGceyrp0fdlSCn3ax3dxb4h0f4a_CPGgLkozgWYvpP_oeHPGciCghoqU8Vr8jqmk16vbveqGf1oLZSP8ZM/s1024/capycpp5.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="60" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRIzEsjiDGxQFO924fVSCtyNemjUntdJRjKlrXObAIzjvFqlLdJYWRv2oqzxoxDJFegj7r_dgA7ke-lrRn63RkIcHhtj-Q-hww2QTdPX3X0uGceyrp0fdlSCn3ax3dxb4h0f4a_CPGgLkozgWYvpP_oeHPGciCghoqU8Vr8jqmk16vbveqGf1oLZSP8ZM/w400-h60/capycpp5.png" width="400"/></a></div><p style="text-align: left;">This makes the constructor look like this:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzydqW3xFvn33okXnZ_JrP1lOAqp06Su3V13gBJi3wKJxUKcod1_RzvHKgsD60UAuxE2qmHqW8l1QeSPWJzvNy9rFXVjbYmjU-EmEIlckv9F5vO6mhWWytxEGlLzW9Qzlyh2SCsQLKQ1IGEwLQtKKHCWB5Pe1ldAtIlUjN2BpoggExX6WcnPM2Aq8XaxE/s460/capycpp6.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="99" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzydqW3xFvn33okXnZ_JrP1lOAqp06Su3V13gBJi3wKJxUKcod1_RzvHKgsD60UAuxE2qmHqW8l1QeSPWJzvNy9rFXVjbYmjU-EmEIlckv9F5vO6mhWWytxEGlLzW9Qzlyh2SCsQLKQ1IGEwLQtKKHCWB5Pe1ldAtIlUjN2BpoggExX6WcnPM2Aq8XaxE/w400-h99/capycpp6.png" width="400"/></a></div><p style="text-align: left;">Method calls bring all of these things together.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifR3XeCpClHkRRWxls9FSCeEqBcUJtrtPJq0DFaoozpoWS-WoM5oaSiGlr2BaIVXo6SYfKhRRapc_wZANGFAxZ-1hARLwAdpwYNu2IKQbeBPMHbO2V95ziQ4eWMbJQ1TYLgZGsmuMI-_xQgHozEWxc9IRJtLyS9Qj9weSbQICYJfQeR3z_F6UhddcOKK4/s500/capycpp8.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="45" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifR3XeCpClHkRRWxls9FSCeEqBcUJtrtPJq0DFaoozpoWS-WoM5oaSiGlr2BaIVXo6SYfKhRRapc_wZANGFAxZ-1hARLwAdpwYNu2IKQbeBPMHbO2V95ziQ4eWMbJQ1TYLgZGsmuMI-_xQgHozEWxc9IRJtLyS9Qj9weSbQICYJfQeR3z_F6UhddcOKK4/w400-h45/capycpp8.png" width="400"/></a></div><p style="text-align: left;">Because the wrapper types are implicitly convertible to the underlying pointer types you can pass them directly to the C API functions. Otherwise the wrapper code would be filled with <span style="font-family: courier;">.get()</span> method calls or the like.</p><h3 style="text-align: left;">The end result</h3><p style="text-align: left;">With all that done, the C code from the beginning of this post can be written like this:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZyhuUTFQ2XOIu8JXnw1r3j7sbdv8kbadmUjAzZx-pPxWxqJQ5kK2_vhWanZQjIt4QRelCyxb3sswjY_p_FQLl6K22fj2R3QCargWMWrGxFE6O8anByB9Sb_kNfuFnwJBqf1xPzU2wPjtPYH2u-5WHq9h-tQ5o0-cDdkKZrxp6kEK0mbFMwGo1rO4JgpY/s550/capycpp9.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="189" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZyhuUTFQ2XOIu8JXnw1r3j7sbdv8kbadmUjAzZx-pPxWxqJQ5kK2_vhWanZQjIt4QRelCyxb3sswjY_p_FQLl6K22fj2R3QCargWMWrGxFE6O8anByB9Sb_kNfuFnwJBqf1xPzU2wPjtPYH2u-5WHq9h-tQ5o0-cDdkKZrxp6kEK0mbFMwGo1rO4JgpY/w400-h189/capycpp9.png" width="400"/></a></div><p style="text-align: left;">Despite using templates, inheritance and stdlib types the end result can be proven to have zero overhead:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ_9NAgNLF1MAN27vVooO5t-j0Kiwb7f5BYZQuspSKOoapRS1_srQtK6Kei9I9Y7BlzrbGaFGZejs0uWvhyphenhyphen-uZ2Y-wI5lu1duAv73clEMJ5D3RshEXKLSUtwzgKT-ciLBMjpJ9purADnfnAh0O0qlz0w4kSDewM-RFHu_-B5vFvSJVPY-0NWxAB2zVJcE/s400/capycpp10.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="19" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ_9NAgNLF1MAN27vVooO5t-j0Kiwb7f5BYZQuspSKOoapRS1_srQtK6Kei9I9Y7BlzrbGaFGZejs0uWvhyphenhyphen-uZ2Y-wI5lu1duAv73clEMJ5D3RshEXKLSUtwzgKT-ciLBMjpJ9purADnfnAh0O0qlz0w4kSDewM-RFHu_-B5vFvSJVPY-0NWxAB2zVJcE/w400-h19/capycpp10.png" width="400"/></a></div><p style="text-align: left;">After this what remains is mostly the boring work of typing out all the wrapper calls.</p><p/></div>
    </content>
    <updated>2024-10-06T14:35:00Z</updated>
    <published>2024-10-06T14:35:00Z</published>
    <author>
      <name>Jussi</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/03370287682352908292</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-5968355124473522212</id>
      <author>
        <name>Jussi</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/03370287682352908292</uri>
      </author>
      <link href="https://nibblestew.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="https://www.blogger.com/feeds/5968355124473522212/posts/default" rel="self" type="application/atom+xml"/>
      <link href="https://nibblestew.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <link href="https://www.blogger.com/feeds/5968355124473522212/posts/default?start-index=26&amp;max-results=25" rel="next" type="application/atom+xml"/>
      <subtitle>A gathering of development thoughts of Jussi Pakkanen. Some of you may know him as the creator of the Meson build system. jpakkane at gmail dot com</subtitle>
      <title>Nibble Stew</title>
      <updated>2024-10-12T12:35:47Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blogs.gnome.org/tbernard/?p=10391</id>
    <link href="https://blogs.gnome.org/tbernard/2024/10/05/boiling-the-ocean-hackfest/" rel="alternate" type="text/html"/>
    <title>Boiling The Ocean Hackfest</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Last weekend we had another edition of last year’s post-All Systems Go hackfest in Berlin. This year it was even more of a collaborative event with friends from other communities, particularly postmarketOS. Topics included GNOME OS, postmarketOS, systemd, Android app support, hardware enablement, app design, local-first sync, and many other exciting things. This left us … <a class="more-link" href="https://blogs.gnome.org/tbernard/2024/10/05/boiling-the-ocean-hackfest/">Continue reading <span class="screen-reader-text">Boiling The Ocean Hackfest</span></a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Last weekend we had another edition of last year’s <a href="https://blogs.gnome.org/tbernard/2023/09/26/gnome-45-release-party-hackfest">post-All Systems Go hackfest</a> in Berlin. This year it was even more of a collaborative event with friends from other communities, particularly postmarketOS. Topics included GNOME OS, postmarketOS, systemd, Android app support, hardware enablement, app design, local-first sync, and many other exciting things.</p>
<p>This left us with an awkward branding question, since we didn’t want to name the event after one specific community or project. Initially we had a very long and unpronounceable acronym (LMGOSRP), but I couldn’t bring myself to use that on the announcement post so I went with something a bit more digestible :)</p>
<p><img alt="" class="alignnone size-large wp-image-10418" height="497" src="https://blogs.gnome.org/tbernard/files/2024/10/IMG_20240928_201843_230-1024x771.jpg" width="660"/></p>
<p>“Boiling The Ocean” refers to the fact that this is what all the hackfest topics share in common: They’re all very difficult long-term efforts that we expect to still be working on for years before they fully bear fruit. A second, mostly incidental, connotation is that the the ocean (and wider biosphere) are currently being boiled thanks to the climate crisis, and that much of our work has a degrowth or resilience angle (e.g. running on older devices or local-first).</p>
<p>I’m not going to try to summarize all the work done at the event since there were many different parallel tracks, many of which I didn’t participate in. Here’s a quick summary of a few of the things I was tangentially involved in, hopefully others will do their own write-ups about what they were up to.</p>
<p><img alt="" class="alignnone size-large wp-image-10403" height="497" src="https://blogs.gnome.org/tbernard/files/2024/10/IMG_20240929_145759_959-1024x771.jpg" width="660"/></p>
<h2>Mobile</h2>
<p>Mainline Linux on ex-Android phones was a big topic, since there were many relevant actors from this space present. This includes the postmarketOS crew, Robert with his camera work, and Jonas and Caleb who are still working on Android app support via Alien Dalvik.</p>
<p><img alt="" class="alignnone size-large wp-image-10421" height="497" src="https://blogs.gnome.org/tbernard/files/2024/10/IMG_20240928_175818_633-1024x771.jpg" width="660"/></p>
<p>To me, one of the most exciting things here is that we’re seeing more well-supported Qualcomm devices (in addition to everyone’s favorite, the Oneplus 6) these days thanks to all the work being done by Caleb and others on that stack. Between this, the progress on cameras, and the Android app support maybe we can finally do the week-long daily driving challenge we’ve wanted to do for a while at GUADEC 2025 :)</p>
<h2>Design</h2>
<p>On Thursday night we already did a bit of pre-event hacking at a cafe, and I had an impromptu design session with Luca about eSIM support. He has an <a href="https://lucaweiss.eu/post/2024-06-24-esim-manager-for-mobile-linux">app</a> for this at the moment, though of course ideally this should just be in Settings longer-term. For now we discussed how to clean up the UI a bit and bring it more in line with the HIG, and I’ll push some updates to the cellular settings mockups based on this soon.</p>
<p>On Friday I looked into a few Papers things with Pablo, in particular highlights/annotations. I pushed the <a href="https://gitlab.gnome.org/Teams/Design/app-mockups/-/blob/master/document-viewer/adaptive-layout.png">new mockups</a>, including a new way to edit annotations. It’s very exciting to see how energetic the Papers team is, huge kudos to Pablo, Qiu, Markus, et al for revitalizing this app &lt;3</p>
<p>On Saturday I sat down with fellow GNOME design contributor Philipp, and looked at a few design questions in Decibels and Calendar. One of my main takeaways is that we should take a fresh look at the adaptive Calendar layout now that we have Adwaita breakpoints and multi-layout.</p>
<h2>47 Release Party</h2>
<p>On Saturday night we had the GNOME 47 release party, featuring a GNOME trivia quiz. Thanks to Ondrej for preparing it, and congrats to the winners: Adrian, Marvin, and Stefan :)</p>
<p><img alt="" class="alignnone size-large wp-image-10415" height="497" src="https://blogs.gnome.org/tbernard/files/2024/10/IMG_20240928_203132_045-1024x771.jpg" width="660"/></p>
<p><img alt="" class="alignnone size-large wp-image-10412" height="497" src="https://blogs.gnome.org/tbernard/files/2024/10/IMG_20240928_203713_351-1024x771.jpg" width="660"/></p>
<h2>Local-First</h2>
<p>Adrian and Andreas from p2panda had some productive discussions about a longer-term plan for a local-first sync system, and immediate next steps in that direction.</p>
<p>We have a first collaboration planned in the form of a Hedgedoc-style local-first syncing pad, codenamed “Aardvark” (<a href="https://gitlab.gnome.org/Teams/Design/other-app-mockups/-/blob/master/aardvark/aardvark.png">initial mockups</a>). This will be based on a new, more modular version of p2panda (still WIP, but to be released later this year). Longer-term the idea is to have some kind of shared system level daemon so multiple apps can use the same syncing infrastructure, but for now we want to test this architecture in a self-contained app since it’s much easier to iterate on. There’s no clear timeline for this yet, but we’re aiming to start this work around the end of the year.</p>
<h2>GNOME OS</h2>
<p>On Sunday we had a GNOME OS planning meeting with Adrian, Abderrahim, and the rest of the GNOME OS team (remote). The notes are <a href="https://pad.gnome.org/bto-gnomeos-sep24">here</a> if you’re interested in the details, but the upshot is that the transition to the next-generation stack using systemd sysupdate and homed is progressing nicely (thanks to the work Adrian and Codethink have been doing for our Sovereign Tech Fund project).</p>
<p><img alt="" class="alignnone size-large wp-image-10400" height="497" src="https://blogs.gnome.org/tbernard/files/2024/10/IMG_20240929_191228_222-1024x771.jpg" width="660"/></p>
<p>If all goes to plan we’ll complete both of these this cycle, making GNOME OS 48 next spring a real game changer in terms of security and reliability.</p>
<h2>Community</h2>
<p>Despite the very last minute announcement and some logistical back and forth the event worked out beautifully, and we had over 20 people joining across the various days. In addition to the usual suspects I was happy to meet some newcomers, including from outside Berlin and outside the typical desktop crowd. Thanks for joining everyone!</p>
<p><img alt="" class="alignnone size-large wp-image-10424" height="497" src="https://blogs.gnome.org/tbernard/files/2024/10/IMG_20240927_173633_801-1024x771.jpg" width="660"/></p>
<p><img alt="" class="alignnone size-large wp-image-10397" height="497" src="https://blogs.gnome.org/tbernard/files/2024/10/IMG_20240929_213502_122-1024x771.jpg" width="660"/></p>
<p>Thanks also to Caleb and Zeeshan for helping with organization, and the venues we had hosting us across the various days:</p>
<ul>
<li><a href="https://offline.place">offline</a>, a community space in Neukölln</li>
<li><a href="https://jucr.de">JUCR</a>, for hosting us in their very cool Kreuzberg office and even paying for drinks and food</li>
<li>The <a href="https://x-hain.de">x-hain</a> hackerspace in Friedrichshain</li>
</ul>
<p>See you next time!</p></div>
    </content>
    <updated>2024-10-05T18:00:17Z</updated>
    <published>2024-10-05T18:00:17Z</published>
    <category term="Berlin"/>
    <category term="Community"/>
    <category term="Hackfest"/>
    <category term="Local-First"/>
    <category term="Phone"/>
    <author>
      <name>Tobias Bernard</name>
    </author>
    <source>
      <id>https://blogs.gnome.org/tbernard</id>
      <link href="https://blogs.gnome.org/tbernard/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blogs.gnome.org/tbernard" rel="alternate" type="text/html"/>
      <subtitle>Tobias Bernard's GNOME Blog</subtitle>
      <title>Space and Meaning</title>
      <updated>2024-10-05T18:00:17Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blogs.gnome.org/hughsie/?p=9833</id>
    <link href="https://blogs.gnome.org/hughsie/2024/10/04/fwupd-2-0-0/" rel="alternate" type="text/html"/>
    <title>fwupd 2.0.0 and new tricks</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Today I tagged fwupd 2.0.0, which includes lots of new hardware support, a ton of bugfixes and more importantly a redesigned device prober and firmware loader that allows it to do some cool tricks. As this is a bigger-than-usual release I’ve written some more verbose releases notes below. The first notable thing is that we’ve … <a class="more-link" href="https://blogs.gnome.org/hughsie/2024/10/04/fwupd-2-0-0/">Continue reading <span class="screen-reader-text">fwupd 2.0.0 and new tricks</span></a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Today I tagged <a href="https://github.com/fwupd/fwupd/releases/tag/2.0.0">fwupd 2.0.0,</a> which includes lots of new hardware support, a ton of bugfixes and more importantly a redesigned device prober and firmware loader that allows it to do some cool tricks. As this is a bigger-than-usual release I’ve written some more verbose releases notes below.</p>
<p>The first notable thing is that we’ve removed the requirement of <a href="https://github.com/hughsie/libgusb">GUsb</a> in the daemon, and now use <a href="https://libusb.info/">libusb</a> directly. This allowed us to move the device emulation support from libgusb up into libfwupdplugin, which now means we can emulate devices created from sysfs too. This means that we can emulate end-to-end firmware updates on fake hidraw and nvme devices in CI just <a href="https://fwupd.github.io/libfwupdplugin/device-emulation.html">like we’ve been able to emulate using fake USB devices for some time</a>. This increases the coverage of testing for every pull request, and makes sure that none of our “<em>improvements</em>” actually end up breaking firmware updates on some existing device.</p>
<p>The emulation code is actually pretty cool; every USB control request, <code>ioctl()</code>, <code>read()</code> (and everything inbetween) is recorded from a target device and saved to a JSON file with a unique per-request key for each stage of the update process. This is saved to a zip archive and is usually uploaded to the LVFS mirror and used in <a href="https://github.com/fwupd/fwupd/tree/main/data/device-tests">the device-tests in fwupd</a>. It’s much easier than having a desk full of hardware and because each emulation is just that, emulated, we don’t need to do the tens of thousands of 5ms sleeps in between device writes — which means most emulations take a few ms to load, decompress, write and verify. This means you can test [nearly] “<em>every device we support</em>” in just a few seconds of CI time.</p>
<p>Another nice change is the removal of <a href="https://gitlab.gnome.org/GNOME/libgudev">GUdev</a> as a dependency. GUdev is a nice GObject abstraction over <code>libudev</code> and then <code>sd_device</code> from systemd, but when you’re dealing with thousands of devices (that you’re poking in weird ways), and <em>tens of thousands</em> of device children and parents the “<em>immutable device state</em>” objects drift from reality and the abstraction layers really start to hurt. So instead of using GUdev <a href="https://github.com/fwupd/fwupd/blob/main/src/fu-engine.rs#L50">we now listen to the netlink socket</a> and parse those events into fwupd <code>FuDevice</code> objects, rather than having an abstract device with <em>another</em> abstract device being used as a data source. It has also allowed us to remove at least one layer of caching (that we had to work around in weird ways), and also reduce the memory requirement both at startup and at runtime at the expense of re-implementing the netlink parsing code. It also means we can easily start using <a href="https://android.googlesource.com/platform/system/core/+/master/init/README.ueventd.md">ueventd</a>, which makes it possible to run fwupd on Android. More on that another day!</p>
<figure class="wp-caption aligncenter" id="attachment_9845" style="width: 249px;"><a href="https://blogs.gnome.org/hughsie/files/2024/10/Screenshot-2024-10-04-at-11-22-47-Online-FlowChart-Diagrams-Editor-Mermaid-Live-Editor.png"><img alt="dep graph showing lots of things" class="size-medium wp-image-9845" height="300" src="https://blogs.gnome.org/hughsie/files/2024/10/Screenshot-2024-10-04-at-11-22-47-Online-FlowChart-Diagrams-Editor-Mermaid-Live-Editor-249x300.png" width="249"/></a><figcaption class="wp-caption-text" id="caption-attachment-9845">The old</figcaption></figure>
<figure class="wp-caption aligncenter" id="attachment_9848" style="width: 249px;"><a href="https://blogs.gnome.org/hughsie/files/2024/10/Screenshot-2024-10-04-at-11-22-24-Online-FlowChart-Diagrams-Editor-Mermaid-Live-Editor.png"><img alt="dep graph showing a lot less things" class="size-medium wp-image-9848" height="300" src="https://blogs.gnome.org/hughsie/files/2024/10/Screenshot-2024-10-04-at-11-22-24-Online-FlowChart-Diagrams-Editor-Mermaid-Live-Editor-249x300.png" width="249"/></a><figcaption class="wp-caption-text" id="caption-attachment-9848">The new</figcaption></figure>
<p>The biggest change, and the feature that’s been requested the most by enterprise customers is the ability to “<em>stream</em>” firmware from archives into devices. What fwupdmgr used to do (and what 1_9_X still does) is:</p>
<ul>
<li>Send the cabinet archive to the daemon as a file descriptor</li>
<li>The daemon then loads the input stream into memory (copy 1)</li>
<li>The memory blob is parsed as a cabinet archive, and the blocks-with-header are re-assembled into whole files (copy 2)</li>
<li>The payload is then typically chunked into pieces, with each chunk being allocated as a new blob (copy 3)</li>
<li>Each chunk is sent to the device being updated</li>
</ul>
<p>This worked fine for a 32MB firmware payload — we allocate ~100MB of memory and then free it, no bother at all.</p>
<p>Where this fails is for one of two cases: huge firmware or underpowered machine — or in the pathological case, huge video conferencing camera firmware with inexpensive Google ChromeBook. In that example we might have a 1.5GB firmware file (it’s probably a custom Android image…) on a 4GB-of-RAM budget ChromeBook. The running machine has a measly 1GB free system memory, and then fwupd immediately OOMs when just trying to <em>parse the archive</em>, let alone deploy the firmware.</p>
<p>So what can we do to reduce the number of in memory copies, or maybe even remove them all completely? There are two tricks that fwupd 2.0.x uses to load firmware now, and those two primitives we now use all over the source tree:</p>
<h3>Partial Input Stream:</h3>
<p>This models an input stream (which you can think of <em>like</em> a file descriptor) that is made up of a part of a different input stream at a specific offset. So if you have a base input stream of <code>[123456789]</code> you can build two partial input streams of, say, <code>[234]</code> and <code>[789]</code>. If you try and <code>read()</code> 5 bytes from the first partial stream you just get 3 bytes back. If you seek to offset 0x1 on the second partial input stream you get the two bytes of <code>[89]</code>.</p>
<h3>Composite Input Stream</h3>
<p>This models a different kind of input stream, which is made up of one or more partial input streams. In some cases there can be hundreds of partial streams making up one composite stream. So if you take the first two partial input streams defined a few lines before, and then add them to a composite input stream you get <code>[234789]</code> — and reading 8 bytes at offset 0x0 from that would give you what you expect.</p>
<p>This means the new way of processing firmware archives can be:</p>
<ul>
<li>Send the cabinet archive to the daemon as a file descriptor</li>
<li>The daemon parses it as a cab archive header, and adds the data section of each block to a partial stream that references the base stream at a specific offset</li>
<li>The daemon “collects” all the partial streams into a composite stream for each file in the archive that spans multiple blocks</li>
<li>The payload is split into chunks, with each chunk actually being a partial stream of the composite file stream</li>
<li>Each chunk is read from the stream, and sent to the device being updated</li>
</ul>
<p><em>Sooo</em>…. We never actually read the firmware payload from the cabinet file descriptor until we actually send the chunk of payload to the hardware. This means we have to <code>seek()</code> all over the place, possibly many times for each chunk, but in the kernel a <code>seek()</code> is really just doing some pointer maths to a memory buffer and so it’s super quick — even faster in real time than the “simple” process we used in <code>1_9_X</code>. The only caveat is that you have to use uncompressed cabinet archives (the default for the LVFS) — as using MSZIP decompression currently does need a single copy fallback.</p>
<p><a href="https://blogs.gnome.org/hughsie/files/2024/10/Screenshot-2024-10-04-at-13-08-26-Online-FlowChart-Diagrams-Editor-Mermaid-Live-Editor.png"><img alt="blocks in a cab archive" class="aligncenter size-medium wp-image-9908" height="300" src="https://blogs.gnome.org/hughsie/files/2024/10/Screenshot-2024-10-04-at-13-08-26-Online-FlowChart-Diagrams-Editor-Mermaid-Live-Editor-249x300.png" width="249"/></a></p>
<p>This means we can deploy a 1.5GB firmware payload using an amazingly low 8MB of RSS, and using less CPU that copying 1.5GB of data around a few times. Which means, you can now deploy that huge firmware to that $3,000 meeting room camera from a $200 ChromeBook — but also means we can do the same in RHEL for 5G mobile broadband radios on low-power, low-cost IoT hardware.</p>
<p>Making such huge changes to fwupd meant we could justify branching a new release, and because we bumped the major version it also made sense to remove all the deprecated API in libfwupd. All the changes are <a href="https://github.com/fwupd/fwupd/blob/main/libfwupd/README.md">documented in the README file</a>, but I’ve already sent patches for gnome-firmware, gnome-software and kde-discover to make the tiny changes needed for the library bump.</p>
<p>My plan for 2.0.x is to ship it in Flathub, and in Fedora 42 — but NOT Fedora 41, RHEL 9 or RHEL 10 just yet. There is a lot of new code that’s only had a little testing, and I fully expect to do a brown paperbag 2.0.1 release in a few days because we’ve managed to break some hardware for some vendor that I don’t own, or we don’t have emulations for. If you do see anything that’s weird, or have hardware that used to be detected, and now isn’t — please <a href="https://github.com/fwupd/fwupd/issues">let us know</a>.</p>
<p>Anyway, enough talking for now, enjoy!</p></div>
    </content>
    <updated>2024-10-04T13:39:54Z</updated>
    <published>2024-10-04T13:39:54Z</published>
    <category term="Uncategorized"/>
    <author>
      <name>hughsie</name>
    </author>
    <source>
      <id>https://blogs.gnome.org/hughsie</id>
      <link href="https://blogs.gnome.org/hughsie/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blogs.gnome.org/hughsie" rel="alternate" type="text/html"/>
      <subtitle>Blog about geeky stuff</subtitle>
      <title>Technical Blog of Richard Hughes</title>
      <updated>2024-10-11T15:48:32Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-6112936277054198647.post-5576489425191643261</id>
    <link href="https://who-t.blogspot.com/feeds/5576489425191643261/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/>
    <link href="https://www.blogger.com/comment/fullpage/post/6112936277054198647/5576489425191643261" rel="replies" title="0 Comments" type="text/html"/>
    <link href="https://www.blogger.com/feeds/6112936277054198647/posts/default/5576489425191643261" rel="edit" type="application/atom+xml"/>
    <link href="https://www.blogger.com/feeds/6112936277054198647/posts/default/5576489425191643261" rel="self" type="application/atom+xml"/>
    <link href="https://who-t.blogspot.com/2024/10/hiocrevoke-merged-for-kernel-612.html" rel="alternate" title="HIOCREVOKE merged for kernel 6.12" type="text/html"/>
    <title>HIOCREVOKE merged for kernel 6.12</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
  TLDR: if you know what <b>EVIOCREVOKE</b> does, the same now works for hidraw devices via <b>HIDIOCREVOKE</b>.
</p>
<p>
  The <a href="https://who-t.blogspot.com/2018/12/understanding-hid-report-descriptors.html">HID standard</a> is the most common hardware protocol for input devices. In the Linux kernel HID is typically translated to the <a href="https://who-t.blogspot.com/2016/09/understanding-evdev.html">evdev protocol</a> which is what libinput and all Xorg input drivers use. evdev is the kernel's input API and used for all devices, not just HID ones.
</p>
<p>
  
  evdev is <i>mostly</i> compatible with HID but there are quite a few niche cases where they differ a fair bit. And some cases where evdev doesn't work well because of different assumptions, e.g. it's near-impossible to correctly express a device with 40 generic buttons (as opposed to named buttons like "left", "right", ...[0]). In particular for gaming devices it's quite common to access the HID device directly via the <i>/dev/hidraw</i> nodes. And of course for configuration of devices accessing the hidraw node is a must too (see Solaar, openrazer, libratbag, etc.). Alas, <i>/dev/hidraw</i> nodes are only accessible as root - right now applications work around this by either "run as root" or shipping udev rules tagging the device with uaccess.
</p>
<p>
  evdev too can only be accessed as root (or the input group) but many many moons ago when dinosaurs still roamed the earth (version 3.12 to be precise), David Rheinsberg merged the <b>EVIOCREVOKE</b> ioctl. When called the file descriptor immediately becomes invalid, any further reads/writes will fail with <i>ENODEV</i>. This is a cornerstone for systemd-logind: it hands out a file descriptor via DBus to Xorg or the Wayland compositor but keeps a copy. On VT switch it calls the ioctl, thus preventing any events from reaching said X server/compositor. In turn this means that a) X no longer needs to run as root[1] since it can get input devices from logind and b) X loses access to those input devices at logind's leisure so we don't have to worry about leaking passwords.
</p>
<p>
  Real-time forward to 2024 and kernel 6.12 now gained the <b>HIDIOCREVOKE</b> for <i>/dev/hidraw</i> nodes. The corresponding <a href="https://github.com/systemd/systemd/pull/33970">logind support</a> has also been merged. The principle is the same: logind can hand out an fd to a hidraw node and can revoke it at will so we don't have to worry about data leakage to processes that should not longer receive events. This is the first of many steps towards more general HID support in userspace. It's not immediately usable since logind will only hand out those fds to the session leader (read: compositor or Xorg) so if you as application want that fd you need to convince your display server to give it to you. For that we <i>may</i> have something like the <a href="https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/110#note_1080252">inputfd Wayland protocol</a> (or maybe a <a href="https://github.com/flatpak/xdg-desktop-portal/issues/611" target="_blank">portal</a> but right now it seems a Wayland protocol is more likely).
  
  But that aside, let's hooray nonetheless. One step down, many more to go.
</p>
<p>
  One of the other side-effects of this is that logind now has an fd to any device opened by a user-space process. With <a href="https://who-t.blogspot.com/2024/04/udev-hid-bpf-quickstart-tooling-to-fix.html">HID-BPF</a> this means we can eventually "firewall" these devices from malicious applications: we could e.g. allow libratbag to configure your mouse' buttons but block any attempts to upload a new firmware. This is very much an idea for now, there's a lot of code that needs to be written to get there. But getting there we can now, so full of optimism we go[2].
</p>


<p>
  <small>
    [0] to illustrate: the button that goes back in your browser is actually evdev's <i>BTN_SIDE</i> and <i>BTN_BACK</i> is ... just another button assigned to nothing particular by default.<br/>
    [1] and c) I have to care less about X server CVEs.<br/>
    [2] mind you, optimism is just another word for naïveté<br/>
  </small>
</p></div>
    </content>
    <updated>2024-10-04T00:27:00Z</updated>
    <published>2024-10-04T00:27:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="hid"/>
    <author>
      <name>Peter Hutterer</name>
      <email>noreply@blogger.com</email>
      <uri>https://www.blogger.com/profile/17204066043271384535</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-6112936277054198647</id>
      <category term="git"/>
      <category term="kernel"/>
      <category term="compiz"/>
      <category term="gitlab"/>
      <category term="configuration"/>
      <category term="xkb"/>
      <category term="x"/>
      <category term="fedora"/>
      <category term="tig"/>
      <category term="multitouch"/>
      <category term="libratbag"/>
      <category term="tutorial"/>
      <category term="wayland"/>
      <category term="xorg.conf"/>
      <category term="input device properties"/>
      <category term="tuhi"/>
      <category term="workflow"/>
      <category term="hid"/>
      <category term="gnome-device-setup"/>
      <category term="mpx"/>
      <category term="outdoors"/>
      <category term="gnome"/>
      <category term="libevdev"/>
      <category term="xds"/>
      <category term="xi2"/>
      <category term="wacom"/>
      <category term="evemu"/>
      <category term="xorg"/>
      <category term="xlib"/>
      <category term="libinput"/>
      <category term="hal"/>
      <category term="synaptics"/>
      <category term="freedesktop.org"/>
      <category term="xts"/>
      <category term="evtest"/>
      <category term="evdev"/>
      <category term="libei"/>
      <category term="libinput. wayland"/>
      <author>
        <name>Peter Hutterer</name>
        <email>noreply@blogger.com</email>
        <uri>https://www.blogger.com/profile/17204066043271384535</uri>
      </author>
      <link href="https://www.blogger.com/feeds/6112936277054198647/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="https://www.blogger.com/feeds/6112936277054198647/posts/default" rel="self" type="application/atom+xml"/>
      <link href="http://who-t.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <link href="https://www.blogger.com/feeds/6112936277054198647/posts/default?start-index=26&amp;max-results=25" rel="next" type="application/atom+xml"/>
      <title>Who-T</title>
      <updated>2024-10-14T22:09:00Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://thisweek.gnome.org/posts/2024/10/twig-168/</id>
    <link href="https://thisweek.gnome.org/posts/2024/10/twig-168/" rel="alternate" type="text/html"/>
    <title>#168 Testing Portals</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Update on what happened across the GNOME project in the week from September 27 to October 04.</p>
<h1 id="gnome-core-apps-and-libraries">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#gnome-core-apps-and-libraries"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>GNOME Core Apps and Libraries
</h1>

<h3 id="glib">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#glib"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>GLib <a href="https://gitlab.gnome.org/GNOME/glib"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#link"/></svg></a>
</h3><p>The low-level core library that forms the basis for projects such as GTK and GNOME.</p>
<p><a href="https://matrix.to/#/@pwithnall:matrix.org">Philip Withnall</a> says</p>
<blockquote>
<p>Julian Sparber is tackling adding tests for some tricky-to-test portal code in GLib 🙌 <a href="https://gitlab.gnome.org/GNOME/glib/-/merge_requests/4176">https://gitlab.gnome.org/GNOME/glib/-/merge_requests/4176</a> — as always, adding tests has paid itself back by finding bugs, which he’s fixed</p>
</blockquote>


<h3 id="software">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#software"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>Software <a href="https://gitlab.gnome.org/GNOME/gnome-software/"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#link"/></svg></a>
</h3><p>Lets you install and update applications and system extensions.</p>
<p><a href="https://matrix.to/#/@pwithnall:matrix.org">Philip Withnall</a> announces</p>
<blockquote>
<p>Automeris Naranja and Hari Rana have continued work this week to modernise GNOME Software’s UI with libadwaita 1.6 widgets, while Sid is working on making submission of app reviews not block the UI.

<img alt="" src="https://thisweek.gnome.org/posts/2024/10/twig-168/yKejRqaHoYcJiZEzSnunbQEp.png"/>
</p>
</blockquote>


<h1 id="gnome-circle-apps-and-libraries">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#gnome-circle-apps-and-libraries"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>GNOME Circle Apps and Libraries
</h1>

<h3 id="video-trimmer">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#video-trimmer"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>Video Trimmer <a href="https://gitlab.gnome.org/YaLTeR/video-trimmer"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#link"/></svg></a>
</h3><p>Trim videos quickly.</p>
<p><a href="https://matrix.to/#/@yalter:gnome.org">Ivan Molodetskikh</a> announces</p>
<blockquote>
<p><a href="https://flathub.org/apps/org.gnome.gitlab.YaLTeR.VideoTrimmer">Video Trimmer</a> v0.9 is out with support for accent colors and improvements to the hotkey behavior.

<img alt="" src="https://thisweek.gnome.org/posts/2024/10/twig-168/edf4c1936416b5ab72fad5f904de323e312bca9b1841929310949081088.png"/>
</p>
</blockquote>


<h3 id="identity">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#identity"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>Identity <a href="https://gitlab.gnome.org/YaLTeR/identity"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#link"/></svg></a>
</h3><p>Compare images and videos.</p>
<p><a href="https://matrix.to/#/@yalter:gnome.org">Ivan Molodetskikh</a> reports</p>
<blockquote>
<p>For the new <a href="https://flathub.org/apps/org.gnome.gitlab.YaLTeR.Identity">Identity</a> v0.7 release, I implemented image loading via the <a href="https://gitlab.gnome.org/sophie-h/glycin">glycin</a> library. It lets you open newer image formats like AVIF and JPEG XL, and improves rendering for other images, like using the correct color spaces for regular JPEGs.

<img alt="" src="https://thisweek.gnome.org/posts/2024/10/twig-168/dce4953f81839d6dc54547e4087cc8a0fc6493051841927982919188480.png"/>
</p>
</blockquote>


<h3 id="d&#xE9;j&#xE0;-dup-backups">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#d%c3%a9j%c3%a0-dup-backups"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>Déjà Dup Backups <a href="https://apps.gnome.org/DejaDup/"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#link"/></svg></a>
</h3><p>A simple backup tool.</p>
<p><a href="https://matrix.to/#/@mterry:gnome.org">Michael Terry</a> reports</p>
<blockquote>
<p><a href="https://flathub.org/apps/org.gnome.DejaDup">Déjà Dup</a> 47 is now available! This release features Restic support improvements and the latest adwaita widgets and accent colors.</p>
</blockquote>


<h1 id="third-party-projects">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#third-party-projects"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>Third Party Projects
</h1><p><a href="https://matrix.to/#/@vmkspv:matrix.org">Vladimir Kosolapov</a> says</p>
<blockquote>
<p>This week I released my first app — <a href="https://github.com/vmkspv/netsleuth">Netsleuth</a>.</p>
<p>It’s a simple utility for the calculation and analysis of IP subnet values, designed to simplify network configuration tasks. There’s no longer a need to rely on various ad-laden websites with awkward designs, as Netsleuth is native and available offline.</p>
<p>Check it out on <a href="https://flathub.org/apps/io.github.vmkspv.netsleuth">Flathub</a>!

<img alt="" src="https://thisweek.gnome.org/posts/2024/10/twig-168/UcREQJrjLyuDlRePlagbQgOj.png"/>
</p>
</blockquote>


<h3 id="phosh">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#phosh"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>Phosh <a href="https://gitlab.gnome.org/World/Phosh/phosh"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#link"/></svg></a>
</h3><p>A pure wayland shell for mobile devices.</p>
<p><a href="https://matrix.to/#/@agx:sigxcpu.org">Guido</a> says</p>
<blockquote>
<p><a href="https://gitlab.gnome.org/World/Phosh/phosh">Phosh</a> 0.42.0 is out:</p>
<p>The lock screen now adjusts to smaller resolutions and we fixed a whole lot of bugs around (but not limited to) OSK text input when using text prediction - up to a point where we now enable it by default when the app requests it (and the OSK supports it). <a href="https://gitlab.gnome.org/World/Phosh/squeekboard">squeekboard</a> saw another round of layout improvements and additions.</p>
<p>Check the full details <a href="https://phosh.mobi/releases/rel-0.42.0/">here</a></p>
</blockquote>


<h3 id="parabolic">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#parabolic"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>Parabolic <a href="https://flathub.org/apps/details/org.nickvision.tubeconverter"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#link"/></svg></a>
</h3><p>Download web video and audio.</p>
<p><a href="https://matrix.to/#/@nlogozzo:matrix.org">Nick</a> reports</p>
<blockquote>
<p>Parabolic <a href="https://github.com/NickvisionApps/Parabolic/releases/tag/2024.10.0">V2024.10.0</a> is here!</p>
<p>This update features a brand new rewrite of Parabolic in C++. Users should now have a faster and more stable downloading experience, with the continued reliability and customizability loved by our users.</p>
<p>We have also redesigned the user interfaces on both the GNOME and Windows platforms to make it easier to find the Parabolic features you love and want to use. We have also refined and improved the options available when configuring individual downloads, playlists, and Parabolic as a whole. Besides new things, we have fixed tons of bugs throughout the downloading backend that users have been waiting for.</p>
<p>We hope you all love this release as much as we loved making it! A huge thank you to all users who worked with us in fixing issues, testing the betas, contributing translations and more ❤️</p>
<p>Here’s the full changelog:</p>
<ul>
<li>Parabolic has been rewritten in C++ for faster performance</li>
<li>The Keyring module was rewritten. As a result, all keyrings have been reset and will need to be reconfigured</li>
<li>Audio languages with audio description are now correctly recognized and handled separately from audio languages without audio description</li>
<li>Audio download qualities will now list audio bitrates for the user to choose from</li>
<li>Playlist downloads will now be saved in a subdirectory with the playlist’s title within the chosen save folder</li>
<li>When viewing the log of a download, the command used to run the download can now also be copied to the clipboard</li>
<li>The length of the kept download history can now be changed in Preferences</li>
<li>On non-sandbox platforms, a browser can be selected for Parabolic to fetch cookies from instead of selecting a txt file in Preferences</li>
<li>Added an option in Preferences to allow for immediate download after a URL is validated</li>
<li>Added an option in Preferences to pick a preferred video codec for when downloading video media</li>
<li>Fixed validation issues with various sites</li>
<li>Fixed an issue where a specified video password was not being used</li>
<li>Redesigned user interface</li>
<li>Updated yt-dlp

<img alt="" src="https://thisweek.gnome.org/posts/2024/10/twig-168/KybkdPqbKYKDPHRZonmoQZXI.png"/>


<img alt="" src="https://thisweek.gnome.org/posts/2024/10/twig-168/DkKMCmMjyewjPwUFKXMKLuXs.png"/>
</li>
</ul>
</blockquote>


<h3 id="flatseal">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#flatseal"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>Flatseal <a href="https://github.com/tchx84/Flatseal"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#link"/></svg></a>
</h3><p>A graphical utility to review and modify permissions of Flatpak applications.</p>
<p><a href="https://matrix.to/#/@tchx84:matrix.org">Martín Abente Lahaye</a> announces</p>
<blockquote>
<p><a href="https://flathub.org/apps/com.github.tchx84.Flatseal">Flatseal</a> 2.3.0 is out! This new release has caught up with new Flatpak permissions, added Hindi translation thanks to Scrambled777, and updated its runtime to GNOME 47. Make sure to keep your GNOME runtime up-to-date to prevent some common <a href="https://github.com/tchx84/Flatseal/issues/726">issues</a>!</p>
</blockquote>


<h1 id="shell-extensions">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#shell-extensions"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>Shell Extensions
</h1><p><a href="https://matrix.to/#/@mnjahn:matrix.org">Marcin Jahn</a> reports</p>
<blockquote>
<p>(Almost) all of my Gnome extensions do support Gnome 47 now. What’s even better is that all the updates came from contributors, so all I had to do was to merge a couple of PRs. Thanks!</p>
<ul>
<li><a href="https://github.com/marcinjahn/gnome-do-not-disturb-while-screen-sharing-or-recording-extension">Do Not Disturb While Screen Sharing Or Recording</a></li>
<li><a href="https://github.com/marcinjahn/gnome-quicksettings-audio-devices-hider-extension">Quick Settings Audio Devices Hider</a></li>
<li><a href="https://github.com/marcinjahn/gnome-quicksettings-audio-devices-renamer-extension">Quick Settings Audio Devices Renamer</a></li>
<li><a href="https://github.com/marcinjahn/gnome-dim-completed-calendar-events-extension">Dim Completed Calendar Events</a></li>
</ul>
</blockquote>


<h1 id="events">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#events"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>Events
</h1><p><a href="https://matrix.to/#/@deepeshaburse:matrix.org">Deepesha Burse</a> announces</p>
<blockquote>
<p>GNOME Asia 2024 is happening in Bengaluru, India between 6th to 8th of December. We’re happy to announce that the call for proposals is now open and will close on October 8th, 2024. This is your chance to submit a proposal and speak at the conference!</p>
<p>You can submit your CFPs at: <a href="https://events.gnome.org/event/258/abstracts/">https://events.gnome.org/event/258/abstracts/</a>
and find more info at: <a href="https://foundation.gnome.org/2024/09/12/gnome-asia-2024-in-bengaluru-india/">https://foundation.gnome.org/2024/09/12/gnome-asia-2024-in-bengaluru-india/</a></p>
</blockquote>
<p><a href="https://matrix.to/#/@bragefuglseth:gnome.org">Brage Fuglseth</a> says</p>
<blockquote>
<p>This weekend, from Oct 4 to Oct 5, the <a href="https://linuxappsummit.org/">Linux App Summit</a> is taking place in Monterrey, Mexico. LAS is dedicated to collaboration on all aspects aimed at accelerating the growth of the Linux application ecosystem.</p>
<p>To attend remotely, <a href="https://linuxappsummit.org/register/">register here</a>. Videos from LAS will also be live streamed on the <a href="https://www.youtube.com/channel/UCjSsbz2TDxIxBEarbDzNQ4w">LAS YouTube channel</a>.

<img alt="" src="https://thisweek.gnome.org/posts/2024/10/twig-168/8c799b32a98272b7919a0272710c280d628c8e8d1842208378336575488.png"/>
</p>
</blockquote>


<h1 id="gnome-foundation">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#gnome-foundation"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>GNOME Foundation
</h1><p><a href="https://matrix.to/#/@pabloyoyoista:matrix.org">Pablo Correa Gomez</a> says</p>
<blockquote>
<p>The last months, the GNOME Foundation Board of directors has been busy with budgeting and other strategic decisions, and we’ve written a small update to keep everybody informed: <a href="https://discourse.gnome.org/t/update-from-the-board-2024-10/24346">https://discourse.gnome.org/t/update-from-the-board-2024-10/24346</a> We will follow-up with a more detailed discussion of the budget in the following weeks</p>
</blockquote>


<h1 id="thats-all-for-this-week">
<a class="heading-anchor" hidden="hidden" href="https://thisweek.gnome.org/index.xml#thats-all-for-this-week"><svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://thisweek.gnome.org/images/icons.svg#anchor"/></svg></a>That’s all for this week!
</h1><p>See you next week, and be sure to stop by <a href="https://matrix.to/#/#thisweek:gnome.org">#thisweek:gnome.org</a> with updates on your own projects!</p></div>
    </summary>
    <updated>2024-10-04T00:00:00Z</updated>
    <published>2024-10-04T00:00:00Z</published>
    <source>
      <id>https://thisweek.gnome.org/</id>
      <author>
        <name>This Week in GNOME</name>
      </author>
      <link href="https://thisweek.gnome.org/" rel="alternate" type="text/html"/>
      <link href="https://thisweek.gnome.org/index.xml" rel="self" type="application/rss+xml"/>
      <subtitle>Recent content on This Week in GNOME</subtitle>
      <title>This Week in GNOME</title>
      <updated>2024-10-11T00:00:00Z</updated>
    </source>
  </entry>

  <entry>
    <id>https://wingolog.org/2024/10/03/preliminary-notes-on-a-nofl-field-logging-barrier</id>
    <link href="https://wingolog.org/archives/2024/10/03/preliminary-notes-on-a-nofl-field-logging-barrier" rel="alternate" type="text/html"/>
    <title>preliminary notes on a nofl field-logging barrier</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><div><p>When you have a generational collector, you aim to trace only the part
of the object graph that has been allocated recently.  To do so, you
need to keep a <i>remembered set</i>: a set of old-to-new edges, used as
roots when performing a minor collection.  A language run-time maintains this set by
adding <i>write barriers</i>: little bits of collector code that run when a
mutator writes to a field.</p><p>Whippet’s <a href="https://wingolog.org/archives/2024/08/25/whippet-update-faster-evacuation-eager-sweeping-of-empty-blocks">nofl
space</a>
is a block-structured space that is appropriate for use as an old
generation or as part of a sticky-mark-bit generational collector.  It
used to have a card-marking write barrier; see my <a href="https://wingolog.org/archives/2024/01/05/v8s-precise-field-logging-remembered-set">article diving into V8’s new
write
barrier</a>,
for more background.</p><p>Unfortunately, when running <a href="https://github.com/wingo/whiffle">whiffle</a>
benchmarks, I was seeing no improvement for generational configurations relative to whole-heap collection.  Generational collection
was doing fine in my tiny microbenchmarks that are part of Whippet
itself, but when translated to larger programs (that aren’t yet proper
macrobenchmarks), it was a lose.</p><p>I had planned on doing some serious tracing and instrumentation to
figure out what was happening, and thereby correct the problem.  I still
plan on doing this, but instead for this issue I used the old noggin
technique instead: just, you know, thinking about the thing, eventually concluding that unconditional card-marking barriers are inappropriate
for sticky-mark-bit collectors.  As I mentioned in the earlier article:</p><blockquote>
An unconditional card-marking barrier applies to stores to slots in
all objects, not just those in oldspace; a store to a new object will
mark a card, but that card may contain old objects which would then
be re-scanned. Or consider a store to an old object in a more dense
part of oldspace; scanning the card may incur more work than
needed. It could also be that Whippet is being too aggressive at
re-using blocks for new allocations, where it should be limiting
itself to blocks that are very sparsely populated with old objects.
</blockquote><p>That’s three problems.  The second is well-known.  But the first and
last are specific to sticky-mark-bit collectors, where pages mix old and
new objects.</p><h3>a precise field-logging write barrier</h3><p>Back in 2019, Steve Blackburn’s paper <a href="https://www.steveblackburn.org/pubs/papers/fieldbarrier-ismm-2019.pdf"><i>Design and Analysis of
Field-Logging Write
Barriers</i></a>
took a look at the state of the art in precise barriers that record not
regions of memory that have been updated, but the precise edges (fields)
that were written to.  He ends up re-using this work later in <a href="https://www.steveblackburn.org/pubs/papers/lxr-pldi-2022.pdf">the 2022
LXR paper</a>
(see §3.4), where the write barrier is used for deferred reference counting and a
snapshot-at-the-beginning (SATB) barrier for concurrent marking.  All in
all field-logging seems like an interesting strategy.  Relative to card-marking,
work during the pause is much less: you have a precise buffer of all
fields that were written to, and you just iterate that, instead of
iterating objects.  Field-logging does impose some mutator cost, but perhaps the
payoff is worth it.</p><p>To log each old-to-new edge precisely once, you need a bit per field
indicating whether the field is logged already.  Blackburn’s 2019 write
barrier paper used bits in the object header, if the object was small
enough, and otherwise bits before the object start.  This requires some
cooperation between the collector, the compiler, and the run-time that I
wasn’t ready to pay for.  The 2022 LXR paper was a bit vague on this
topic, saying just that it used “a side table”.</p><p>In Whippet’s nofl space, we have a side table already, <a href="https://github.com/wingo/whippet/blob/main/src/nofl-space.h#L187-L246">used for a number
of purposes</a>:</p><ol><li><p>Mark bits.</p></li><li><p>Iterability / interior pointers: is there an object at a given
address?  If so, it will have a recognizable bit pattern.</p></li><li><p>End of object, to be able to sweep without inspecting the object
itself</p></li><li><p>Pinning, allowing a mutator to prevent an object from being
evacuated, for example because a hash code was computed from its
address</p></li><li><p>A hack to allow fully-conservative tracing to identify ephemerons at
trace-time; this re-uses the pinning bit, since in practice such
configurations never evacuate</p></li><li><p>Bump-pointer allocation into holes: the mark byte table serves the
purpose of Immix’s line mark byte table, but at finer granularity.
Because of this though, it is swept lazily rather than eagerly.</p></li><li><p>Generations.  Young objects have a bit set that is cleared when they
are promoted.</p></li></ol><p>Well.  Why not add another thing?  The nofl space’s granule size is two
words, so we can use two bits of the byte for field logging bits.  If
there is a write to a field, a barrier would first check that the object
being written to is old, and then check the log bit for the field being
written.  The old check will be to a byte that is nearby or possibly the
same as the one to check the field logging bit.  If the bit is unsert,
we call out to a slow path to actually record the field.</p><h3>preliminary results</h3><p>I disassembled the fast path as compiled by GCC and got something like
this on x86-64, in AT&amp;T syntax, for the young-generation test:</p><pre>mov    %rax,%rdx
and    $0xffffffffffc00000,%rdx
shr    $0x4,%rax
and    $0x3ffff,%eax
or     %rdx,%rax
testb  $0xe,(%rax)
</pre><p>The first five instructions compute the location of the mark byte, from
the address of the object (which is known to be in the nofl space).  If
it has any of the bits in <tt>0xe</tt> set, then it’s in the old generation.</p><p>Then to test a field logging bit it’s a similar set of instructions.  In
one of my tests the data type looks like this:</p><pre>struct Node {
  uintptr_t tag;
  struct Node *left;
  struct Node *right;
  int i, j;
};
</pre><p>Writing the <tt>left</tt> field will be in the same granule as the object
itself, so we can just test the byte we fetched for the logging bit
directly with <tt>testb</tt> against <tt>$0x80</tt>.  For <tt>right</tt>, we should be able
to know it’s in the same slab (aligned 4 MB region) and just add to the
previously computed byte address, but the C compiler doesn’t know that
right now and so recomputes.  This would work better in a JIT.  Anyway I
think these bit-swizzling operations are just lost in the flow of memory
accesses.</p><p>For the general case where you don’t statically know the offset of the
field in the object, you have to compute which bit in the byte to test:</p><pre>mov    %r13,%rcx
mov    $0x40,%eax
shr    $0x3,%rcx
and    $0x1,%ecx
shl    %cl,%eax
test   %al,%dil
</pre><p>Is it good?  Well, it improves things for my whiffle benchmarks,
relative to the card-marking barrier, seeing a 1.05×-1.5× speedup across
a range of benchmarks.  I suspect the main advantage is in avoiding the
“unconditional” part of card marking, where a write to a new
object could cause old objects to be added to the remembered set.  There are still quite a
few whiffle configurations in which the whole-heap collector outperforms
the sticky-mark-bit generational collector, though; I hope to understand
this a bit more by building a more classic semi-space nursery, and
comparing performance to that.</p><p>Implementation links: <a href="https://github.com/wingo/whippet/blob/main/api/gc-api.h#L231-L247">the barrier
fast-path</a>,
<a href="https://github.com/wingo/whippet/blob/main/src/mmc.c#L910-L923">the slow
path</a>,
and the <a href="https://github.com/wingo/whippet/blob/main/src/field-set.h">sequential store
buffers</a>.
(At some point I need to make it so that allocating edge buffers in the
field set causes the nofl space to page out a corresponding amount of
memory, so as to be honest when comparing GC performance at a fixed heap
size.)</p><p>Until next time, onwards and upwards!</p></div></div>
    </content>
    <updated>2024-10-03T08:54:07Z</updated>
    <published>2024-10-03T08:54:07Z</published>
    <author>
      <name>Andy Wingo</name>
      <uri>https://wingolog.org/</uri>
    </author>
    <source>
      <id>https://wingolog.org/feed/atom</id>
      <link href="https://wingolog.org/" rel="alternate" type="text/html"/>
      <link href="https://wingolog.org/feed/atom" rel="self" type="application/atom+xml"/>
      <subtitle>A mostly dorky weblog by Andy Wingo</subtitle>
      <title>wingolog</title>
      <updated>2024-10-03T08:54:07Z</updated>
    </source>
  </entry>

  <entry>
    <id>https://hansdegoede.dreamwidth.org/28841.html</id>
    <link href="https://hansdegoede.dreamwidth.org/28841.html" rel="alternate" type="text/html"/>
    <title>IPU6 camera support in Fedora 41</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I'm happy to announce that the last tweaks have landed and that the fully FOSS libcamera software ISP based IPU6 camera support in Fedora 41 now has no known bugs left. See the <a href="https://fedoraproject.org/wiki/Changes/IPU6_Camera_support">Changes page</a> for <a href="https://fedoraproject.org/wiki/Changes/IPU6_Camera_support#How_To_Test">testing instructions</a>.<br/><br/><span style="font-size: x-large;">Supported hardware</span><br/><br/>Unlike USB UVC cameras where all cameras work with a single kernel driver, MIPI cameras like the Intel IPU6 cameras require multiple drivers. The IPU6 input-system CSI receiver driver is common to all laptops with an IPU6 camera, but different laptops use different camera sensors and each sensor needs its own driver and then there are glue ICs like the LJCA USB IO-expander and the iVSC (Intel Visual Sensing Controller) and there also is the <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/media/pci/intel/ipu-bridge.c">ipu-bridge</a>  code which translates Windows oriented ACPI tables with sensor info into the fwnodes which the Linux drivers expect.<br/><br/>This means that even though IPU6 support has landed in Fedora 41 not all laptops with an IPU6 camera will work. Currently the IPU6 integrated in the following CPU models works if the sensor + glue hw/sw is also supported:<br/><br/><ul><li>Tiger Lake</li><li>Alder Lake</li><li>Raptor Lake</li></ul><br/>Jasper Lake and Meteor Lake also have an IPU6 but there is some more integration work necessary to get things to work there. Getting Meteor Lake IPU6 cameras to work is high on my TODO list.<br/><br/>The mainline kernel IPU6 CSI receiver + libcamera software ISP has been successfully tested on the following models:<br/><br/><ul><li>Various Lenovo ThinkPad models with ov2740 (INT3474) sensor (1)</li><li>Various Dell models with ov01a10 (OVTI01A0) sensor</li><li>Dell XPS 13 PLus with ov13b10 (OVTIDB10/OVTI13B1)</li><li>Some HP laptops with hi556 sensor (INT3537)</li></ul><br/>To see which sensor your laptop has run: <em>"ls /sys/bus/i2c/devices"</em> this will show e.g. "i2c-INT3474:00" if you have an ov2740, with INT3474 being the ACPI Hardware ID (HID) for the sensor. See <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/media/pci/intel/ipu-bridge.c#n49">here</a> for a list of currently known HID to sensor mappings. Note not all of these have upstream drivers yet. In that cases chances are that there might be a sensor driver for your sensor <a href="https://github.com/intel/ipu6-drivers/tree/master/drivers/media/i2c">here</a>.<br/><br/>We could really use help with people submitting drivers from <a href="https://github.com/intel/ipu6-drivers/tree/master/drivers/media/i2c">there</a> upstream. So if you have a laptop with a sensor which is not in the mainline but is available there, you know a bit of C-programming and you are willing to help, then please drop me an <a href="mailto:hdegoede@redhat.com">email</a> so that we can work together to get the driver upstream.<br/><br/>1) on some ThinkPads the ov2740 sensor fails to start streaming most of the time. I plan to look into this next week and hopefully I can come up with a fix.<br/><br/><span style="font-size: x-large;">MIPI camera Integration work done for Fedora 41</span><br/><br/>After landing the kernel IPU6 CSI receiver and libcamera software ISP support upstream early in the Fedora 41 cycle, there still was a lot of work to do with regards to integrating this into the rest of the stack so that the cameras can actually be used outside of the qcam test app.<br/><br/>The whole stack looks like this <em>"kernel → libcamera → pipewire | pipewire-camera-consuming-app"</em>. Where the 2 currently supported pipewire-camera consuming apps are <a href="https://jgrulich.cz/2024/08/19/making-pipewire-default-option-for-firefox-camera-handling/">Firefox</a> and GNOME Snapshot.<br/><br/>Once this was all up and running testing found quite a few bugs which have all been fixed now:<br/><br/><ul><li>Firefox showing 13 different cameras in its camera selection pulldown for a single IPU6 camera (<a href="https://gitlab.freedesktop.org/pipewire/pipewire/-/merge_requests/2095">fix</a>).</li><li>Installing pipewire-plugin-libcamera leads to UVC cameras being powered on all the time causing significant battery drain (<a href="https://gitlab.freedesktop.org/pipewire/pipewire/-/merge_requests/2086">bug</a>, <a href="https://bugs.libcamera.org/show_bug.cgi?id=168">bug</a>, <a href="https://lists.libcamera.org/pipermail/libcamera-devel/2024-August/044384.html">discussion</a>, <a href="https://lists.libcamera.org/pipermail/libcamera-devel/2024-August/044279.html">fix</a>).</li><li>Pipewire does not always recognizes cameras on login (<a href="https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/3539">bug</a>, <a href="https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/3960">bug</a>, <a href="https://bugs.launchpad.net/ubuntu/+source/pipewire/+bug/2061687">bug</a>, <a href="https://gitlab.freedesktop.org/pipewire/pipewire/-/merge_requests/2118">fix</a>).</li><li>Pipewire fails to show cameras with relative controls (<a href="https://gitlab.freedesktop.org/pipewire/pipewire/-/merge_requests/2121">fix</a>).</li><li>spa_libcamera_buffer_recycle sometimes fails, causing stream to freeze on first frame (<a href="https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/4227">bug</a>, <a href="https://gitlab.freedesktop.org/pipewire/pipewire/-/merge_requests/2108">fix</a>)</li><li>Firefox chooses bad default resolution of 640x480. I worked with Jan Grulich to get this fixed and this is fixed as of firefox-130.0.1-3.fc41. Thank you Jan!</li><li>Snapshot prefers 4:3 mode, e.g. 1280x1080 on 16:9 camera sensors capable of 1920x1080 (<a href="https://gitlab.gnome.org/GNOME/snapshot/-/merge_requests/317">pending fix</a>)</li><li>Added intel-vsc-firmware, pipewire-plugin-libcamera, libcamera-ipa to the Fedora 41 Workstation default package-set (<a href="https://pagure.io/fedora-comps/pull-request/1023">pull</a>, <a href="https://src.fedoraproject.org/rpms/pipewire/pull-request/27">pull</a>, <a href="https://src.fedoraproject.org/rpms/libcamera/pull-request/13">pull</a>)</li></ul><br/><br/><br/><img alt="comment count unavailable" height="12" src="https://www.dreamwidth.org/tools/commentcount?user=hansdegoede&amp;ditemid=28841" style="vertical-align: middle;" width="30"/> comments</div>
    </summary>
    <updated>2024-10-02T18:06:02Z</updated>
    <published>2024-10-02T18:06:02Z</published>
    <category term="ipu6"/>
    <category term="pipewire"/>
    <category term="kernel"/>
    <category term="libcamera"/>
    <category term="fedora"/>
    <source>
      <id>https://hansdegoede.dreamwidth.org/</id>
      <logo>https://v.dreamwidth.org/16479769/3892031</logo>
      <author>
        <name>Hans de Goede</name>
      </author>
      <link href="https://hansdegoede.dreamwidth.org/" rel="alternate" type="text/html"/>
      <link href="https://hansdegoede.dreamwidth.org/data/rss" rel="self" type="application/rss+xml"/>
      <subtitle>Hans de Goede - Dreamwidth Studios</subtitle>
      <title>Hans de Goede</title>
      <updated>2024-10-02T18:06:02Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blogs.gnome.org/tbernard/?p=10292</id>
    <link href="https://blogs.gnome.org/tbernard/2024/10/01/berlin-mini-guadec-2024/" rel="alternate" type="text/html"/>
    <title>Berlin Mini GUADEC 2024</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It’s been over two months but I still haven’t gotten around to writing a blog post about this year’s Berlin Mini GUADEC. I still don’t have time to write a longer post, but instead of putting this off forever I thought I’d at least share a few photos. Overall I think our idea of running … <a class="more-link" href="https://blogs.gnome.org/tbernard/2024/10/01/berlin-mini-guadec-2024/">Continue reading <span class="screen-reader-text">Berlin Mini GUADEC 2024</span></a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>It’s been over two months but I still haven’t gotten around to writing a blog post about this year’s Berlin Mini GUADEC. I still don’t have time to write a longer post, but instead of putting this off forever I thought I’d at least share a few photos.</p>
<p>Overall I think our idea of running this as a self-organized event worked out great. The community (both Berlin locals and other attendees) really came together to make it a success, despite the difficult circumstances. Thanks in particular to Jonas Dreßler for taking care of recording and streaming the talks, Ondřej Kolín and Andrei Zisu for keeping things on track during the event, and Sonny Piers for helping with various logistical things before the event.</p>
<p><img alt="" class="alignnone size-large wp-image-10307" height="495" src="https://blogs.gnome.org/tbernard/files/2024/10/2024-07-23-16-43-48-239-Edited-1024x768.jpg" width="660"/></p>
<p><img alt="" class="alignnone size-large wp-image-10310" height="495" src="https://blogs.gnome.org/tbernard/files/2024/10/2024-07-23-17-13-28-211-1024x768.jpg" width="660"/></p>
<p><img alt="" class="alignnone size-large wp-image-10370" height="495" src="https://blogs.gnome.org/tbernard/files/2024/10/2024-07-19-14-27-31-155-1024x768.jpg" width="660"/>  <img alt="" class="alignnone size-large wp-image-10322" height="880" src="https://blogs.gnome.org/tbernard/files/2024/10/2024-07-23-21-06-33-308-768x1024.jpg" width="660"/></p>
<p><img alt="" class="alignnone size-large wp-image-10373" height="495" src="https://blogs.gnome.org/tbernard/files/2024/10/2024-07-21-17-08-09-657-1024x768.jpg" width="660"/></p>
<p><img alt="" class="alignnone size-large wp-image-10340" height="495" src="https://blogs.gnome.org/tbernard/files/2024/10/2024-07-19-14-56-31-510-1-1024x768.jpg" width="660"/></p>
<p><img alt="" class="alignnone size-large wp-image-10337" height="880" src="https://blogs.gnome.org/tbernard/files/2024/10/2024-07-20-11-56-18-052-768x1024.jpg" width="660"/></p>
<p><img alt="" class="alignnone size-large wp-image-10334" height="495" src="https://blogs.gnome.org/tbernard/files/2024/10/2024-07-20-12-02-29-775-1024x768.jpg" width="660"/></p>
<p><img alt="" class="alignnone size-large wp-image-10316" height="880" src="https://blogs.gnome.org/tbernard/files/2024/10/2024-07-19-17-08-23-824-768x1024.jpg" width="660"/></p>
<p><img alt="" class="alignnone size-large wp-image-10331" height="495" src="https://blogs.gnome.org/tbernard/files/2024/10/2024-07-20-16-56-19-514-1024x768.jpg" width="660"/></p>
<p><img alt="" class="alignnone size-large wp-image-10328" height="495" src="https://blogs.gnome.org/tbernard/files/2024/10/2024-07-20-20-01-15-153-1024x768.jpg" width="660"/> <img alt="" class="alignnone size-large wp-image-10343" height="880" src="https://blogs.gnome.org/tbernard/files/2024/10/2024-07-21-15-27-22-080-768x1024.jpg" width="660"/></p>
<p><img alt="" class="alignnone size-large wp-image-10352" height="495" src="https://blogs.gnome.org/tbernard/files/2024/10/2024-07-24-14-05-19-065-1024x768.jpg" width="660"/></p>
<p><img alt="" class="alignnone size-large wp-image-10325" height="880" src="https://blogs.gnome.org/tbernard/files/2024/10/2024-07-23-20-16-46-483-768x1024.jpg" width="660"/></p>
<p><img alt="" class="alignnone size-large wp-image-10346" height="495" src="https://blogs.gnome.org/tbernard/files/2024/10/2024-07-20-21-04-10-344-1024x768.jpg" width="660"/></p>
<p><img alt="" class="alignnone size-large wp-image-10355" height="495" src="https://blogs.gnome.org/tbernard/files/2024/10/2024-07-19-20-35-46-965-1024x768.jpg" width="660"/></p>
<p><img alt="" class="alignnone size-large wp-image-10364" height="495" src="https://blogs.gnome.org/tbernard/files/2024/10/2024-07-20-10-59-39-575-1024x768.jpg" width="660"/></p>
<p><img alt="" class="alignnone size-large wp-image-10304" height="495" src="https://blogs.gnome.org/tbernard/files/2024/10/2024-07-24-17-53-16-384-1024x768.jpg" width="660"/></p>
<p>Thanks to everyone who helped to make it happen, and see you next year!</p></div>
    </content>
    <updated>2024-10-01T23:54:44Z</updated>
    <published>2024-10-01T23:54:44Z</published>
    <category term="Berlin"/>
    <category term="Conference"/>
    <category term="GUADEC"/>
    <author>
      <name>Tobias Bernard</name>
    </author>
    <source>
      <id>https://blogs.gnome.org/tbernard</id>
      <link href="https://blogs.gnome.org/tbernard/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blogs.gnome.org/tbernard" rel="alternate" type="text/html"/>
      <subtitle>Tobias Bernard's GNOME Blog</subtitle>
      <title>Space and Meaning</title>
      <updated>2024-10-05T18:00:17Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blogs.igalia.com/carlosgc/?p=1029</id>
    <link href="https://blogs.igalia.com/carlosgc/2024/09/27/graphics-improvements-in-webkitgtk-and-wpewebkit-2-46/" rel="alternate" type="text/html"/>
    <title>Graphics improvements in WebKitGTK and WPEWebKit 2.46</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">WebKitGTK and WPEWebKit recently released a new stable version 2.46. This version includes important changes in the graphics implementation. Skia The most important change in 2.46 is the introduction of Skia to replace Cairo as the 2D graphics renderer. Skia … <a href="https://blogs.igalia.com/carlosgc/2024/09/27/graphics-improvements-in-webkitgtk-and-wpewebkit-2-46/">Continue reading <span class="meta-nav">→</span></a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="https://www,webkitgtk.org">WebKitGTK</a> and <a href="https://wpewebkit.org">WPEWebKit</a> recently released a new stable version 2.46. This version includes important changes in the graphics implementation.</p>
<h2>Skia</h2>
<p>The most important change in 2.46 is the introduction of Skia to replace Cairo as the 2D graphics renderer. Skia supports rendering using the GPU, which is now the default, but we also use it for CPU rendering using the same threaded rendering model we had with Cairo. The architecture hasn’t changed much for GPU rendering: we use the same tiled rendering approach, but buffers for dirty regions are rendered in the main thread as textures. The compositor waits for textures to be ready using fences and copies them directly to the compositor texture. This was the simplest approach that already resulted in much better performance, specially in the desktop with more powerful GPUs. In embedded systems, where GPUs are not so powerful, it’s still better to use the CPU with several rendering threads in most of the cases. It’s still too early to announce anything, but we are already experimenting with different models to improve the performance even more and make a better usage of the GPU in embedded devices.</p>
<p>Skia has received several GCC specific optimizations lately, but it’s always more optimized when built with clang. The optimizations are more noticeable in performance when using the CPU for rendering. For this reason, since version 2.46 we recommend to build WebKit with clang for the best performance. GCC is still supported, of course, and performance when built with GCC is quite good too.</p>
<h2>HiDPI</h2>
<p>Even though there aren’t specific changes about HiDPI in 2.46, users of high resolution screens using a device scale factor bigger than 1 will notice much better performance thanks to scaling being a lot faster on the GPU.</p>
<h2>Accelerated canvas</h2>
<p>The 2D canvas can be accelerated independently on whether the CPU or the GPU is used for painting layers. In 2.46 there’s a new setting <a href="https://webkitgtk.org/reference/webkitgtk/stable/property.Settings.enable-2d-canvas-acceleration.html">WebKitSettings:enable-2d-canvas-acceleration</a> to control the 2D canvas acceleration. In some embedded devices the combination of CPU rendering for layer tiles and GPU for the canvas gives the best performance. The 2D canvas is normally rendered into an image buffer that is then painted in the layer as an image. We changed that for the accelerated case, so that the canvas is now rendered into a texture that is copied to a compositor texture to be directly composited instead of painted into the layer as an image. In 2.46 the offscreen canvas is enabled by default.</p>
<p>There are more cases where accelerating the canvas is not desired, for example when the canvas size is not big enough it’s faster to use the GPU. Also when there’s going to be many operations to “download” pixels from GPU. Since this is not always easy to predict, in 2.46 we added support for the <a href="https://html.spec.whatwg.org/multipage/canvas.html#concept-canvas-will-read-frequently">willReadFrequently</a> canvas setting, so that when set by the application when creating the canvas it causes the canvas to be always unaccelerated.</p>
<h2>Filters</h2>
<p>All the CSS filters are now implemented using Skia APIs, and accelerated when possible. The most noticeable change here is that sites using blur filters are no longer slow.</p>
<h2>Color spaces</h2>
<p>Skia brings native support for color spaces, which allows us to greatly simplify the color space handling code in WebKit. WebKit uses color spaces in many scenarios – but especially in case of SVG and filters. In case of some filters, color spaces are necessary as some operations are simpler to perform in linear sRGB. The good example of that is feDiffuseLighting filter – it yielded wrong visual results for a very long time in case of Cairo-based implementation as Cairo doesn’t have a support for color spaces. At some point, however, Cairo-based WebKit implementation has been fixed by converting pixels to linear in-place before applying the filter and converting pixels in-place back to sRGB afterwards. Such a workarounds are not necessary anymore as with Skia, all the pixel-level operations are handled in a color-space-transparent way as long as proper color space information is provided. This not only impacts the results of some filters that are now correct, but improves performance and opens new possibilities for acceleration.</p>
<h2>Font rendering</h2>
<p>Font rendering is probably the most noticeable visual change after the Skia switch with mixed feedback. Some people reported that several sites look much better, while others reported problems with kerning in other sites. In other cases it’s not really better or worse, it’s just that we were used to the way fonts were rendered before.</p>
<h2>Damage tracking</h2>
<p>WebKit already tracks the area of the layers that has changed to paint only the dirty regions. This means that we only repaint the areas that changed but the compositor incorporates them and the whole frame is always composited and passed to the system compositor. In 2.46 there’s experimental code to track the damage regions and pass them to the system compositor in addition to the frame. Since this is experimental it’s disabled by default, but can be enabled with the runtime feature <em>PropagateDamagingInformation</em>. There’s also <em>UnifyDamagedRegions</em> feature that can be used in combination with <em>PropagateDamagingInformation</em> to unify the damage regions into one before passing it to the system compositor. We still need to analyze the impact of damage tracking in performance before enabling it by default. We have also started an experiment to use the damage information in WebKit compositor and avoid compositing the entire frame every time.</p>
<h2>GPU info</h2>
<p>Working on graphics can be really hard in Linux, there are too many variables that can result in different outputs for different users: the driver version, the kernel version, the system compositor, the EGL extensions available, etc. When something doesn’t work for some people and work for others, it’s key for us to gather as much information as possible about the graphics stack. In 2.46 we have added more useful information to webkit://gpu, like the DMA-BUF buffer format and modifier used (for GTK port and WPE when using the new API). Very often the symptom is the same, nothing is rendered in the web view, even when the causes could be very different. For those cases, it’s even more difficult to gather the info because webkit://gpu doesn’t render anything either. In 2.46 it’s possible to load webkit://gpu/stdout to get the information as a JSON directly in stdout.</p>
<h2>Sysprof</h2>
<p>Another common symptom for people having problems is that a particular website is slow to render, while for others it works fine. In these cases, in addition to the graphics stack information, we need to figure out where we are slower and why. This is very difficult to fix when you can’t reproduce the problem. We added initial support for profiling in 2.46 using <a href="https://gitlab.gnome.org/GNOME/sysprof">sysprof</a>. The code already has some marks so that when run under sysprof we get useful information about timings of several parts of the graphics pipeline.</p>
<h2>Next</h2>
<p>This is just the beginning, we are already working on changes that will allow us to make a better use of both the GPU and CPU for the best performance. We have also plans to do other changes in the graphics architecture to improve synchronization, latency and security. Now that we have adopted sysprof for profiling, we are also working on improvements and new tools.</p></div>
    </content>
    <updated>2024-09-27T10:30:14Z</updated>
    <published>2024-09-27T10:30:14Z</published>
    <category term="Free Software"/>
    <category term="GNOME"/>
    <category term="Igalia"/>
    <category term="WebKit"/>
    <category term="skia"/>
    <author>
      <name>carlos garcia campos</name>
    </author>
    <source>
      <id>https://blogs.igalia.com/carlosgc</id>
      <link href="https://blogs.igalia.com/carlosgc/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blogs.igalia.com/carlosgc" rel="alternate" type="text/html"/>
      <title>Carlos Garcia Campos</title>
      <updated>2024-09-27T10:30:14Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blogs.gnome.org/xjuan/?p=6383</id>
    <link href="https://blogs.gnome.org/xjuan/2024/09/26/new-cambalache-release-0-92-0/" rel="alternate" type="text/html"/>
    <title>New Cambalache Release 0.92.0!</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I am pleased to announce a new Cambalache stable release, version 0.92.0! This comes with two major dependencies changes, the first one is a very basic port to Adwaita and webkit/broadway replacement with a custom Wayland compositor widget based on wlroots. What’s new: Basic port to Adwaita Use Casilda compositor widget for workspace Update widget … <a class="more-link" href="https://blogs.gnome.org/xjuan/2024/09/26/new-cambalache-release-0-92-0/">Continue reading <span class="screen-reader-text">New Cambalache Release 0.92.0!</span></a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I am pleased to announce a new Cambalache stable release, version 0.92.0!</p>
<p>This comes with two major dependencies changes, the first one is a very basic port to Adwaita and webkit/broadway replacement with a custom Wayland compositor widget based on wlroots.</p>
<h3>What’s new:</h3>
<ul>
<li>
<ul>
<li>Basic port to Adwaita</li>
<li>Use Casilda compositor widget for workspace</li>
<li>Update widget catalogs to SDK 47</li>
<li>Improved Drag&amp;Drop support</li>
<li>Improve workspace performance</li>
<li>Enable workspace animations</li>
<li>Fix window ordering</li>
<li>Support new desktop dark style</li>
<li>Support 3rd party libraries</li>
<li>Streamline headerbar</li>
<li>Lots of bug fixes and minor improvements</li>
</ul>
</li>
</ul>
<h3>Adwaita</h3>
<p>The port to Adwaita gives Cambalache the new modern look and enables dark mode support.<br/>
<a href="https://blogs.gnome.org/xjuan/files/2024/09/cambalache_dark.png"><img alt="" class="size-full wp-image-6386 aligncenter" height="767" src="https://blogs.gnome.org/xjuan/files/2024/09/cambalache_dark.png" width="1323"/></a>The headerbar is simplified only keeping most common used actions, everything else was moved to the main menu.</p>
<figure class="wp-caption aligncenter" id="attachment_6392" style="width: 1853px;"><a href="https://blogs.gnome.org/xjuan/files/2024/09/camabalache_cabalache_light.png"><img alt="" class="wp-image-6392 size-full" height="983" src="https://blogs.gnome.org/xjuan/files/2024/09/camabalache_cabalache_light.png" width="1853"/></a><figcaption class="wp-caption-text" id="caption-attachment-6392">Cambalache editing Cambalache UI</figcaption></figure>
<figure class="wp-caption aligncenter" id="attachment_6395" style="width: 1853px;"><a href="https://blogs.gnome.org/xjuan/files/2024/09/cambalache_cambalache.png"><img alt="" class="wp-image-6395 size-full" height="983" src="https://blogs.gnome.org/xjuan/files/2024/09/cambalache_cambalache.png" width="1853"/></a><figcaption class="wp-caption-text" id="caption-attachment-6395">Cambalache editing Cambalache UI in dark mode</figcaption></figure>
<h3>Casilda Compositor</h3>
<p>Up until this release, Cambalache showed windows from a different process in its workspace running broadwayd or gtk4-broadwayd backend depending on the gtk version of your project and using a WebView to connect to it and show the windows in an HTML canvas.<a href="https://blogs.gnome.org/xjuan/files/2021/05/merengue-1.png"><img alt="Workspace diagram using Bradwayd and WebKit WebView" class="wp-image-5799 size-full aligncenter" height="658" src="https://blogs.gnome.org/xjuan/files/2021/05/merengue-1.png" width="1189"/></a>All of this was replaced with a simple Wayland compositor widget which reduces hard dependencies a lot.</p>
<p><a href="https://blogs.gnome.org/xjuan/files/2024/09/merengue.png"><img alt="" class="size-full wp-image-6389 aligncenter" height="360" src="https://blogs.gnome.org/xjuan/files/2024/09/merengue.png" width="640"/></a>On top of that we get all the optimizations from using Wayland instead of a protocol meant to go over the internet.</p>
<p>With Broadway, the client would render the window in memory, the broadway backend would compress the image and sent it over TCP to the webview which has to uncompress it and render it on an HTML5 canvas.</p>
<p>Now, the client just renders in shared memory which is directly available to the compositor widget to use. This also leave the option to further improve performance by adding support for dmabuf which would allow to offload the composition to the host compositor reducing the number of memory copies to show the windows on the screen.</p>
<p>This allowed me to re enable Gtk animations since they no longer impact the workspace performance.</p>
<p>Special thanks to emersion, kennylevinsen, vyivel and the <a href="https://gitlab.freedesktop.org/wlroots/wlroots">wlroots</a> community for their support and awesome project, I would not have been able to do this without wlroots and their help.</p>
<p>You can read more about<a href="https://blogs.gnome.org/xjuan/2024/09/13/introducing-casilda-wayland-compositor-widget/"> Casilda in my previous post</a></p>
<h3>3rd party libraries</h3>
<p>Cambalache now loads 3rd party catalogs from GLib.get_system_data_dirs()/cambalache/catalogs and ~/.cambalache/catalogs</p>
<p>These catalog files are generated from Gir data with a new tool bundled in Cambalache called<code>cmb-catalog-gen</code>. This used to be an internal and still lacks proper documentation but you can see an example of how its used internally <a href="https://gitlab.gnome.org/jpu/cambalache/-/blob/main/catalogs/Makefile">here</a></p>
<p>So what is a catalog anyway?</p>
<p>A catalog is a XML file with all the necessary data for Cambalache to produce UI files with widgets from a particular library, this includes the different GTypes, with their properties, signals and everything else except the actual object implementations.</p>
<p>Runtime objects are created in the workspace by loading the GI namespace specified in the catalog.</p>
<p>Feel free to contact me on matrix if you are interested in adding support for a 3rd party library.</p>
<h3>Improved Drag&amp;Drop</h3>
<p>After the extensive rework done porting the main widget hierarchy from GtkTreeView to GtkColumnView and implementing several GListModel interfaces to avoid maintaining multiple lists I was able to reimplement and extend Drag&amp;Drop code so now its possible to drop widgets in different parents.</p>
<p><a href="https://blogs.gnome.org/xjuan/files/2024/08/drag_and_drop.gif"><img alt="" class="alignnone size-full wp-image-6324" height="643" src="https://blogs.gnome.org/xjuan/files/2024/08/drag_and_drop.gif" width="1210"/></a></p>
<h3>Data Model</h3>
<p>History handling for Undo/Redo was simplified from multiple history tables (one per table tracked) into one history table by adding a few extra columns to store data change in JSON format.</p>
<pre>CREATE TABLE history (
  history_id INTEGER PRIMARY KEY,
  command TEXT NOT NULL,
  range_id INTEGER REFERENCES history,
  table_name TEXT,
  column_name TEXT,
  message TEXT,
+  table_pk JSON,
+  new_values JSON,
+  old_values JSON
);</pre>
<p>This is the current history table, entries are populated automatically by triggers each time something in the project is created, changed or removed.</p>
<p>This data is then used to implement Undo and Redo commands.</p>
<h3>Where to get it?</h3>
<p>You can get it from Flathub</p>
<pre>flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo

flatpak install flathub ar.xjuan.Cambalache</pre>
<p>or directly from <a href="https://gitlab.gnome.org/jpu/cambalache">gitlab</a></p>
<blockquote>
<pre>git clone https://gitlab.gnome.org/jpu/cambalache.git</pre>
</blockquote>
<h3>Matrix channel</h3>
<p>Have any question? come chat with us at <a href="https://matrix.to/#/#cambalache:gnome.org">#cambalache:gnome.org</a></p>
<h3>Mastodon</h3>
<p>Follow me in Mastodon <a href="https://mastodon.social/@xjuan">@xjuan</a> to get news related to Cambalache development.</p>
<p>Happy coding!</p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p></div>
    </content>
    <updated>2024-09-27T01:23:39Z</updated>
    <published>2024-09-27T01:23:39Z</published>
    <category term="Cambalache UI Maker"/>
    <category term="Gtk 4"/>
    <category term="GTK+"/>
    <category term="Programming"/>
    <author>
      <name>xjuan</name>
    </author>
    <source>
      <id>https://blogs.gnome.org/xjuan</id>
      <link href="https://blogs.gnome.org/xjuan/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blogs.gnome.org/xjuan" rel="alternate" type="text/html"/>
      <subtitle>Just another GNOME Blogs site</subtitle>
      <title>ar.xjuan.Blog</title>
      <updated>2024-09-27T16:34:16Z</updated>
    </source>
  </entry>

  <entry>
    <id>https://wingolog.org/2024/09/26/needed-bits-optimizations-in-guile</id>
    <link href="https://wingolog.org/archives/2024/09/26/needed-bits-optimizations-in-guile" rel="alternate" type="text/html"/>
    <title>needed-bits optimizations in guile</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><div><p>Hey all, I had a fun bug this week and want to share it with you.</p><h3>numbers and representations</h3><p>First, though, some background.  Guile’s numeric operations are defined over the complex numbers, not
over e.g. a finite field of integers.  This is generally great when
writing an algorithm, because you don’t have to think about how the
computer will actually represent the numbers you are working on.</p><p>In practice, Guile will represent a small exact integer as a
<a href="https://www.gnu.org/software/guile/manual/html_node/Faster-Integers.html"><i>fixnum</i></a>,
which is a machine word with a low-bit tag.  If an integer doesn’t fit
in a word (minus space for the tag), it is represented as a
heap-allocated bignum.  But sometimes the compiler can realize that
e.g. the operands to a specific bitwise-and operation are within (say)
the 64-bit range of unsigned integers, and so therefore we can use
<i>unboxed operations</i> instead of the more generic functions that do
run-time dispatch on the operand types, and which might perform heap
allocation.</p><p>Unboxing is important for speed.  It’s also tricky: under what
circumstances can we do it?  In the example above, there is information
that flows from defs to uses: the operands of <tt>logand</tt> are known to be
exact integers in a certain range and the operation itself is closed over
its domain, so we can unbox.</p><p>But there is another case in which we can unbox, in which information
flows backwards, from uses to defs: if we see <tt>(logand n #xff)</tt>, we know:</p><ul><li><p>the result will be in <tt>[0, 255]</tt></p></li><li><p>that <i>n</i> will be an exact integer (or an exception will be thrown)</p></li><li><p>we are only interested in a subset of <i>n</i>‘s bits.</p></li></ul><p>Together, these observations let us transform the more general <tt>logand</tt>
to an unboxed operation, having first truncated <i>n</i> to a <tt>u64</tt>.  And
actually, the information can flow from use to def: if we know that <i>n</i>
will be an exact integer but don’t know its range, we can transform the
potentially heap-allocating computation that produces <i>n</i> to instead
truncate its result to the <tt>u64</tt> range where it is defined, instead of
just truncating at the use; and potentially this information could
travel farther up the dominator tree, to inputs of the operation that
defines <i>n</i>, their inputs, and so on.</p><h3>needed-bits: the <tt>|0</tt> of scheme</h3><p>Let’s say we have a numerical operation that produces an exact integer,
but we don’t know the range.  We could truncate the result to a <tt>u64</tt>
and use unboxed operations, if and only if only <tt>u64</tt> bits are used.  So
we need to compute, for each variable in a program, what bits are needed
from it.</p><p>I think this is generally known a <i>needed-bits analysis</i>, though both
Google and my textbooks are failing me at the moment; perhaps this is
because dynamic languages and flow analysis don’t get so much attention
these days.  Anyway, the analysis can be local (within a basic block),
global (all blocks in a function), or interprocedural (larger than a
function).  Guile’s is global.  Each CPS/SSA variable in the function
starts as needing 0 bits.  We then compute the fixpoint of visiting each
term in the function; if a term causes a variable to flow out of the
function, for example via return or call, the variable is recorded as
needing all bits, as is also the case if the variable is an operand to
some primcall that doesn’t have a specific needed-bits analyser.</p><p>Currently, only <tt>logand</tt> has a needed-bits analyser, and this is because
sometimes you want to do modular arithmetic, for example in a hash
function.  Consider Bon Jenkins’ <a href="http://burtleburtle.net/bob/c/lookup3.c">lookup3 string hash
function</a>:</p><pre>#define rot(x,k) (((x)&lt;&lt;(k)) | ((x)&gt;&gt;(32-(k))))
#define mix(a,b,c) \
{ \
  a -= c;  a ^= rot(c, 4);  c += b; \
  b -= a;  b ^= rot(a, 6);  a += c; \
  c -= b;  c ^= rot(b, 8);  b += a; \
  a -= c;  a ^= rot(c,16);  c += b; \
  b -= a;  b ^= rot(a,19);  a += c; \
  c -= b;  c ^= rot(b, 4);  b += a; \
}
...
</pre><p>If we <a href="https://git.savannah.gnu.org/cgit/guile.git/tree/module/language/cps/guile-vm.scm#n37">transcribe this to
Scheme</a>,
we get something like:</p><pre>(define (jenkins-lookup3-hashword2 str)
  (define (u32 x) (logand x #xffffFFFF))
  (define (shl x n) (u32 (ash x n)))
  (define (shr x n) (ash x (- n)))
  (define (rot x n) (logior (shl x n) (shr x (- 32 n))))
  (define (add x y) (u32 (+ x y)))
  (define (sub x y) (u32 (- x y)))
  (define (xor x y) (logxor x y))

  (define (mix a b c)
    (let* ((a (sub a c)) (a (xor a (rot c 4)))  (c (add c b))
           (b (sub b a)) (b (xor b (rot a 6)))  (a (add a c))
           (c (sub c b)) (c (xor c (rot b 8)))  (b (add b a))
           ...)
      ...))

  ...
</pre><p>These <tt>u32</tt> calls are like <a href="https://stackoverflow.com/questions/30156122/what-is-this-asm-style-x-0-some-javascript-programmers-are-now-using">the JavaScript <tt>|0</tt>
idiom</a>,
to tell the compiler that we really just want the low 32 bits of the
number, as an integer.  Guile’s compiler will propagate that information
down to uses of the defined values but also back up the dominator tree,
resulting in unboxed arithmetic for all of these operations.</p><p>(When writing this, I got all the way here and then realized <a href="https://wingolog.org/archives/2016/01/19/unboxing-in-guile">I had
already written quite a bit about this, almost a decade ago
ago</a>.  Oh
well, consider this your lucky day, you get two scoops of prose!)</p><h3>the bug</h3><p>All that was just prelude.  So I said that needed-bits is a fixed-point
flow analysis problem.  In this case, I want to compute, for each
variable, what bits are needed for its definition.  Because of loops, we
need to keep iterating until we have found the fixed point.  We use a
worklist to represent the conts we need to visit.</p><p>Visiting a cont may cause the program to require more bits from the
variables that cont uses.
<a href="https://git.savannah.gnu.org/cgit/guile.git/tree/module/language/cps/specialize-numbers.scm#n306">Consider</a>:</p><pre>(define-significant-bits-handler
    ((logand/immediate label types out res) param a)
  (let ((sigbits (sigbits-intersect
                   (inferred-sigbits types label a)
                   param
                   (sigbits-ref out res))))
    (intmap-add out a sigbits sigbits-union)))
</pre><p>This is the sigbits (needed-bits) handler for <tt>logand</tt> when one of its
operands (<i>param</i>) is a constant and the other (<i>a</i>) is variable.  It
adds an entry for <i>a</i> to the analysis <i>out</i>, which is an intmap from
variable to a bitmask of needed bits, or <tt>#f</tt> for all bits.  If <i>a</i>
already has some computed sigbits, we add to that set via
<tt>sigbits-union</tt>.  The interesting point comes in the <tt>sigbits-intersect</tt>
call: the bits that we will need from <i>a</i> are first the bits that we
infer <i>a</i> to have, by forward type-and-range analysis; intersected with
the bits from the immediate <i>param</i>; intersected with the needed bits
from the result value <i>res</i>.</p><p>If the <tt>intmap-add</tt> call is idempotent—i.e., <i>out</i> already contains
<i>sigbits</i> for <i>a</i>—then <i>out</i> is returned as-is.  So we can check for a
fixed-point by comparing <i>out</i> with the resulting analysis, via <tt>eq?</tt>.
If they are not equal, we need to add the cont that defines <i>a</i> to the
worklist.</p><p>The bug?  The bug was that we were not enqueuing the def of <i>a</i>, but
rather the predecessors of <i>label</i>.  This works when there are no
cycles, provided we visit the worklist in post-order; and regardless, it
works for many other analyses in Guile where we compute, for each
labelled cont (basic block), <a href="https://wingolog.org/archives/2014/07/01/flow-analysis-in-guile">some set of facts about all other labels
or about all other
variables</a>.
In that case, enqueuing a predecessor on the worklist will cause all
nodes up and to including the variable’s definition to be visited,
because each step adds more information (relative to the analysis
computed on the previous visit).  But it doesn’t work for this case,
because we aren’t computing a per-label analysis.</p><p>The solution was to <a href="https://git.savannah.gnu.org/cgit/guile.git/commit/?id=aff9ac968840e9c86719fb613bd2ed3c39b9905c">rewrite that particular fixed-point to enqueue
labels that define a variable (possibly multiple defs, because of joins
and loop back-edges), instead of just the predecessors of the use</a>.</p><p>Et voilà !  If you got this far, bravo.  Type at y’all again soon!</p></div></div>
    </content>
    <updated>2024-09-26T12:44:57Z</updated>
    <published>2024-09-26T12:44:57Z</published>
    <author>
      <name>Andy Wingo</name>
      <uri>https://wingolog.org/</uri>
    </author>
    <source>
      <id>https://wingolog.org/feed/atom</id>
      <link href="https://wingolog.org/" rel="alternate" type="text/html"/>
      <link href="https://wingolog.org/feed/atom" rel="self" type="application/atom+xml"/>
      <subtitle>A mostly dorky weblog by Andy Wingo</subtitle>
      <title>wingolog</title>
      <updated>2024-10-03T08:54:07Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blogs.gnome.org/jrb/?p=7479</id>
    <link href="https://blogs.gnome.org/jrb/2024/09/25/guadec-2024/" rel="alternate" type="text/html"/>
    <title>GUADEC 2024</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">GUADEC was in Denver this year! I meant to write an update right after the conference, but Real Life™ got in the way and it took a while to finish this post. I finally found a little spare time to collect my thoughts and finish writing this. It was a smaller crowd than normal this … <a class="more-link" href="https://blogs.gnome.org/jrb/2024/09/25/guadec-2024/">Continue reading<span class="screen-reader-text"> "GUADEC 2024"</span></a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>GUADEC was in Denver this year! I meant to write an update right after the conference, but Real Life<img alt="&#x2122;" class="wp-smiley" src="https://s.w.org/images/core/emoji/15.0.3/72x72/2122.png" style="height: 1em;"/> got in the way and it took a while to finish this post. I finally found a little spare time to collect my thoughts and finish writing this.</p>
<p>It was a smaller crowd than normal this year. There were ~100 people registered, though unfortunately a number of people were unable to make it at the last minute due to Cloudstrike– and visa– related issues.</p>
<figure class="wp-caption aligncenter" id="attachment_7512" style="width: 840px;"><a href="https://blogs.gnome.org/jrb/files/2024/08/PXL_20240717_155840416-1.jpg"><img alt="Denver City Hall" class="size-large wp-image-7512" height="445" src="https://blogs.gnome.org/jrb/files/2024/08/PXL_20240717_155840416-1-1024x543.jpg" width="840"/></a><figcaption class="wp-caption-text" id="caption-attachment-7512">Denver City Hall</figcaption></figure>
<p>I gave two talks: <a href="https://www.youtube.com/watch?v=fcQfpQLLzYo">Crosswords, Year Three</a> (<a href="https://docs.google.com/presentation/d/1HISC7MF8QnLkonZ1bLzsmtY1_kfp3I8OnJsD2xflVxk/edit?usp=sharing">slides</a>) and a spur-of-the-moment lightning talk on <a href="https://www.youtube.com/watch?v=0oRa8bnNUjk&amp;t=2016s">development docs</a>. The first talk was nominally about authoring crosswords, but I also presented the architecture we used to create the game. Although rushed, I hope I got most of the points about our design across. It’s definitely worth a full blog post at a future date.</p>
<p>Other highlights of the conference included Martin’s very funny (and brave) <a href="https://www.youtube.com/watch?v=ch9WLQ9ImGY">live demo of gameeky</a>, Scott’s talk about being <a href="https://www.youtube.com/watch?v=m1v3dg7S6KQ">bold with design</a>, the <a href="https://lwn.net/Articles/983203/">AGM</a>, and a fabulous <a href="https://www.youtube.com/watch?v=pWw1A1aKfh8">Thunderbird keynote about the power of money</a>. That last one spurred conversations about putting a fundraising request popup in GNOME itself to raise funds. The yearly popup in Thunderbird appears to continue being wildly successful. Since GUADEC, I see that <a href="https://pointieststick.com/2024/08/28/asking-for-donations-in-plasma/">KDE has attempted</a> to do that as well. I’d love for GNOME to do something similar. Maybe this is something the new board can pick up.</p>
<figure class="wp-caption aligncenter" id="attachment_7535" style="width: 300px;"><a href="https://blogs.gnome.org/jrb/files/2024/09/PXL_20240719_014313317-scaled.jpg"><img alt="Original Nikolai Tesla generator in the Tivoli Brewing Co." class="wp-image-7535 size-medium" height="226" src="https://blogs.gnome.org/jrb/files/2024/09/PXL_20240719_014313317-300x226.jpg" width="300"/></a><figcaption class="wp-caption-text" id="caption-attachment-7535">Original Nikolai Tesla generator in the Tivoli Brewing Co.</figcaption></figure>
<p>It was a very chill GUADEC, and I enjoyed the change of pace. I had never spent time in Denver (other than at the airport), and found it to be a surprisingly intimate city with a very walkable downtown. The venue was absolutely fabulous. Every conference should have a pub on-site, and the Tivoli Brewing Co definitely surpassed expectations. It even has an original Nikolai Tesla generator in its basement.</p>
<h1>Reflections</h1>
<p>It was <em>really</em> nice having GUADEC relatively close to me for once. There was a different crowd than normal: there were long-time GNOME people I haven’t seen in a very long time (Hi Owen, Behdad, and Michael!) as well as numerous new folks (welcome Richard!) Holding it in North America opened us up to different contributors, and maybe let us reengage with long-time gnomies.</p>
<p>On the other hand, it did feel like the community was split. Sam said it <a href="https://samthursfield.wordpress.com/2024/08/15/status-update-15-08-2024/">extremely well in his blog post</a>.</p>
<blockquote><p>Let’s not pretend that a video conference or a hybrid BOF is the same as an in-person meetup. Once you’ve sung karaoke with someone, or explored Meow Wolf, or camped in the desert in Utah together, your relationship is richer than when you only interacted via Gitlab pull requests and BigBlueButton. You have more empathy and you can resolve conflicts better.</p></blockquote>
<p>Fragmentation is always a danger with distributed endeavors and any group bigger than two will have politics, but it feels like our best tool to deal with those issues is fragmenting too.</p>
<p>Personally, as someone who has schlepped across the Atlantic for over two decades to meet with other folks, it doesn’t feel great to have comparatively few people come the other direction. There are a plenty of good individual decisions that lead to this, but collectively it felt like a misfire.</p>
<p>I also really appreciate the commitment of our South American / Asian / African developers who have tough travel routes to get to the Euro/American events.</p>
<figure class="wp-caption aligncenter" id="attachment_7520" style="width: 224px;"><a href="https://blogs.gnome.org/jrb/files/2024/09/PXL_20240924_1530022532-scaled.jpg"><img alt="The first GUADEC poster" class="wp-image-7520 size-medium" height="300" src="https://blogs.gnome.org/jrb/files/2024/09/PXL_20240924_1530022532-224x300.jpg" width="224"/></a><figcaption class="wp-caption-text" id="caption-attachment-7520">The first GUADEC poster</figcaption></figure>
<p>In some sense, it feels like we’ve gone full-circle. When GNOME started, development was strongly centered in North America. The GIMP started in Berkeley, and GNOME itself was founded in Mexico, and there were quite a few other pockets of GNOME activity (Boston, North Carolina, etc). Proportionally, Europe was underrepresented — so GUADEC was proposed as a way to build a European community. It took sustained engagement to build it up. Twenty-four years on, it appears we need to do the reverse.</p>
<p>What’s next? Well for me, it’s time to look more local. We used to have a Bay Area GNOME community and it has fallen on hard times. Maybe it’s worth trying to push some local enthusiasm. If you’re a Bay Area GNOME person, <a href="mailto:jrb@gnome.org">drop me a note</a>. We should hold a release party!</p>
<h1>Nonograms</h1>
<p>While in Denver, ptomato and I nerd-sniped each other into writing a nonogram game. Nonograms are a popular puzzle-type, and are quite common on existing mobile platforms. Conceptually, they’re pen-and-paper grid-based games and could easily be implemented as an .ipuz extension.</p>
<p>I’ve been slowly changing the <a href="https://libipuz.org/">libipuz</a> API over the summer to work with gobject-introspection, and was excited at the chance to get someone to test it out. Meanwhile, Philip had been wanting to write an app with typescript. So, I sketched out an <a href="https://libipuz.org/ipuz-extensions.html#nonograms">extension</a> and put together an <a href="https://libipuz.org/libipuz-1.0/class.Nonogram.html">API</a> for Philip to use. With a little back-and-forth, he got something to render. Exciting!</p>
<p><a href="https://blogs.gnome.org/jrb/files/2024/08/nonogram.png"><img alt="Nonogram" class="aligncenter wp-image-7497 size-medium" height="235" src="https://blogs.gnome.org/jrb/files/2024/08/nonogram-300x235.png" width="300"/></a>I don’t think it is playable yet but it’s lovely to see the potential emerging. There’s a lot of great pixel art floating around GNOME. Some of it might make the basis for a really fun nonogram game.</p>
<p>As a bonus, Philip has been experimenting with using the stateless design we use in Crosswords. I’m hoping he’ll be able to provide additional validation and feedback to our architectural approach.</p></div>
    </content>
    <updated>2024-09-25T21:44:07Z</updated>
    <published>2024-09-25T21:44:07Z</published>
    <category term="General"/>
    <author>
      <name>jrb</name>
    </author>
    <source>
      <id>https://blogs.gnome.org/jrb</id>
      <link href="https://blogs.gnome.org/jrb/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blogs.gnome.org/jrb" rel="alternate" type="text/html"/>
      <subtitle>ChangeLog</subtitle>
      <title>Jonathan Blandford</title>
      <updated>2024-09-25T21:46:26Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.jimmac.eu/2024/wallpapers</id>
    <link href="https://blog.jimmac.eu/2024/wallpapers/" rel="alternate" title="GNOME 47 Wallpapers" type="text/html"/>
    <title xml:lang="en-US">GNOME 47 Wallpapers</title>
    <content type="xhtml" xml:lang="en-US"><div xmlns="http://www.w3.org/1999/xhtml"><p>With GNOME 47 out, it’s time for my bi-annual wallpaper deep dive. For many, these may seem like simple background images, but GNOME wallpapers are the visual anchors of the project, defining its aesthetic and identity. The signature blue wallpaper with its dark top bar remains a key part of that.</p>

<p><img alt="GNOME 47 Wallpapers" src="https://blog.jimmac.eu/2024/wallpapers/wallpapers-l.webp"/></p>

<p>In this release, GNOME 47 doesn’t overhaul the default blue wallpaper. It’s more of a subtle tweak than a full redesign. The familiar rounded triangles remain, but here’s something neat: the dark variant mimics real-world camera behavior. When it’s darker, the camera’s aperture widens, creating a shallower depth of field. A small but nice touch for those who notice these things.</p>

<video class="image full" controls="" loop="">
<source src="https://blog.jimmac.eu/2024/wallpapers/focus.webm" type="video/webm"/>
<source src="https://blog.jimmac.eu/2024/wallpapers/focus.mp4" type="video/mp4"/>
</video>

<p>The real action this cycle, though, is in the supplemental wallpapers.</p>

<p>We haven’t had to remove much this time around, thanks to the JXL format keeping file sizes manageable. The focus has been on variety rather than cutting old designs. We aim to keep things fresh, though you might notice that photographic wallpapers are still missing (we’ll get to that eventually, <a href="https://gitlab.gnome.org/GNOME/gnome-backgrounds/-/issues/20">promise</a>.</p>

<p>In terms of fine tuning changes, the classic, <code class="language-plaintext highlighter-rouge">Pixels</code> has been updated to feature newer apps from <a href="https://circle.gnome.org">GNOME Circle</a>.</p>

<video class="image full" controls="" loop="">
<source src="https://blog.jimmac.eu/2024/wallpapers/pixels-timelapse.webm" type="video/webm"/>
<source src="https://blog.jimmac.eu/2024/wallpapers/pixels-timelapse.mp4" type="video/mp4"/>
</video>

<p>The dark variant of <code class="language-plaintext highlighter-rouge">Pills</code> also got some love with lighting and shading tweaks, including a subtle subsurface scattering effect.</p>

<p>As for the new wallpapers, there are a few cool additions this release. I collaborated with <em>Dominik Baran</em> to create a tube-map-inspired vector wallpaper, which I’m particularly into. There’s also <code class="language-plaintext highlighter-rouge">Mollnar</code>, a nod to Vera Molnar, using simple geometric shapes in SVG format.</p>

<p>Most of our wallpapers are still bitmaps, largely because our rendering tools don’t yet handle color banding well with vectors. For now, even designs that would work better as vectors—like mesh gradients—get converted to bitmaps.</p>

<p>We’ve introduced some new abstract designs as well – meet <code class="language-plaintext highlighter-rouge">Sheet</code> and <code class="language-plaintext highlighter-rouge">Swoosh</code>. And for fans of pixel art, we’ve added <code class="language-plaintext highlighter-rouge">LCD</code> and its colorful sibling, <code class="language-plaintext highlighter-rouge">LCD-rainbow</code>. Both give off that retro screen vibe, even if the color gradient realism isn’t real-world accurate.</p>

<p>Lastly, there’s <code class="language-plaintext highlighter-rouge">Symbolic Soup</code>, which is, well… a bit chaotic. It might not be everyone’s cup of tea, but it definitely adds variety.</p>

<h2 id="preview">Preview</h2>

<p class="walls"><a href="https://blog.jimmac.eu/2024/wallpapers/lcd-d.jxl"><img alt="LCD" src="https://blog.jimmac.eu/2024/wallpapers/lcd-d.webp"/></a>
<a href="https://blog.jimmac.eu/2024/wallpapers/pills-d.jxl"><img alt="Pills" src="https://blog.jimmac.eu/2024/wallpapers/pills-d.webp"/></a>
<a class="big" href="https://blog.jimmac.eu/2024/wallpapers/map-d.svg"><img alt="Map" src="https://blog.jimmac.eu/2024/wallpapers/map-d.svg"/></a>
<a href="https://blog.jimmac.eu/2024/wallpapers/mollnar-d.svg"><img alt="Mollnar" src="https://blog.jimmac.eu/2024/wallpapers/mollnar-d.svg"/></a>
<a href="https://blog.jimmac.eu/2024/wallpapers/lcd-rainbow-l.jxl"><img alt="LCD Raindow" src="https://blog.jimmac.eu/2024/wallpapers/lcd-rainbow-l.webp"/></a>
<a class="big" href="https://blog.jimmac.eu/2024/wallpapers/pixels-d.jxl"><img alt="Pixels" src="https://blog.jimmac.eu/2024/wallpapers/pixels-d.webp"/></a>
<a href="https://blog.jimmac.eu/2024/wallpapers/sheet-l.jxl"><img alt="Sheet" src="https://blog.jimmac.eu/2024/wallpapers/sheet-l.webp"/></a>
<a href="https://blog.jimmac.eu/2024/wallpapers/swoosh-l.jxl"><img alt="Swoosh" src="https://blog.jimmac.eu/2024/wallpapers/swoosh-l.webp"/></a>
<a href="https://blog.jimmac.eu/2024/wallpapers/symbolic-soup-d.jxl"><img alt="Symbolic Soup" src="https://blog.jimmac.eu/2024/wallpapers/symbolic-soup-d.webp"/></a></p>

<p>If you’re wondering about the strange square aspect ratio, take a look at the wallpaper sizing guide in our <a href="https://developer.gnome.org/hig/reference/backgrounds.html">GNOME Interface Guidelines</a>.</p>

<p>Also worth noting is the fact that all of these wallpapers have been created by humans. While I’ve experimented with image generation for some parts of the workflow in some of of my personal projects, all this work is <em>AIgen-free</em> and <a href="https://gitlab.gnome.org/GNOME/gnome-backgrounds/-/blob/main/AUTHORS?ref_type=heads">explicitly credited</a>.</p></div>
    </content>
    <updated>2024-09-23T22:00:00Z</updated>
    <published>2024-09-23T22:00:00Z</published>
    <category term="work"/>
    <category term="gnome"/>
    <category term="design"/>
    <category term="wallpaper"/>
    <category term="art"/>
    <author>
      <name>Jakub Steiner</name>
      <email>jimmac@gmail.com</email>
    </author>
    <source>
      <id>https://blog.jimmac.eu/feed.xml</id>
      <author>
        <name>Jakub Steiner</name>
        <email>jimmac@gmail.com</email>
      </author>
      <link href="https://blog.jimmac.eu/feed.xml" rel="self" type="application/atom+xml"/>
      <link href="https://blog.jimmac.eu/" rel="alternate" type="text/html"/>
      <subtitle xml:lang="en-US">Random musings of a semi-sane designer from lesser Europe.</subtitle>
      <title xml:lang="en-US">Even a Stopped Clock</title>
      <updated>2024-09-24T10:19:29Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://ptomato.wordpress.com/?p=1545</id>
    <link href="https://ptomato.wordpress.com/2024/09/23/its-like-cp-r-but-for-your-gui/" rel="alternate" type="text/html"/>
    <title>It’s like cp -R but for your GUI</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">As a JavaScript engine developer at Igalia I don’t find myself writing much plain C code anymore. I’m either writing JS or TypeScript, or hacking on large compiler codebases in C++1, or writing ECMAScript specification language. Frankly, that is fine … <a href="https://ptomato.wordpress.com/2024/09/23/its-like-cp-r-but-for-your-gui/">Continue reading <span class="meta-nav">→</span></a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p id="footnote1-return">As a JavaScript engine developer at <a href="http://igalia.com">Igalia</a> I don’t find myself writing much plain C code anymore. I’m either writing JS or TypeScript, or hacking on large compiler codebases in C++<sup><a href="https://ptomato.wordpress.com/feed/#footnote1">1</a></sup>, or writing ECMAScript specification language. Frankly, that is fine with me. C’s time may not be over yet, but I wouldn’t be sad if I never had to write another line of it. (Hopefully this post conveys why.)</p>



<div class="wp-block-media-text is-stacked-on-mobile"><figure class="wp-block-media-text__media"><img alt="" class="wp-image-1556 size-full" height="480" src="https://ptomato.wordpress.com/wp-content/uploads/2024/09/toner-581905_640.jpg?w=640" tabindex="0" width="640"/></figure><div class="wp-block-media-text__content">
<p>However, while working on modernizing an app written in C for the GNOME platform, that I hack on in my spare time, I wanted to copy a folder recursively using the GIO async APIs. Like <code>cp -R</code> at the shell, but without freezing up your GUI while it works.</p>
</div></div>



<p id="footnote2-return">C’s callback style for async programming, combined with lack of capturing variables in closures, is like going back to the dark ages if you’ve gotten used to languages with async/await style or even C++’s lambdas. I would’ve avoided writing this if I could, but apparently no one else had done it publicly on the internet that I could find.<sup><a href="https://ptomato.wordpress.com/feed/#footnote2">2</a></sup> So here it is for your enjoyment.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">typedef struct {
	GFile *dest_folder;
	GQueue *files_to_copy;
	GQueue *folders_to_copy;
	GFileCopyFlags flags;
} CopyRecursiveClosure;

/* Pre-declare so we can read them in the order they are executed: */
static void on_recursive_make_dir_finish(GFile *file, GAsyncResult *res, GTask *data);
static void on_recursive_file_enumerate_finish(GFile* file, GAsyncResult *res, GTask *data);
static void on_recursive_file_next_files_finish(GFileEnumerator *children, GAsyncResult *res, GTask *data);
static void copy_file_queue_async(GTask *task);
static void on_recursive_file_copy_finish(GFile *file, GAsyncResult *result, GTask *data);
static void on_recursive_folder_copy_finish(GFile *file, GAsyncResult *result, GTask *data);
static void copy_folder_queue_async(GTask *task);
static void copy_recursive_closure_free(CopyRecursiveClosure *ptr);

/**
 * copy_recursive_async:
 * @src: The source folder
 * @dest: Destination folder in which to place the copy of @src
 * @flags: #GFileCopyFlags to apply to copy operations
 * @prio: I/O priority, e.g. #G_PRIORITY_DEFAULT
 * @cancel: #GCancellable that will interrupt the operation when triggered
 * @done_cb: Function to call when the operation is finished
 * @data: Pointer to pass to @done_cb
 *
 * Copy the folder @src and all of the files and subfolders in it into the
 * folder @dest, asynchronously.
 *
 * The only @flags supported are #G_FILE_COPY_NONE and #G_FILE_COPY_OVERWRITE.
 */
void
copy_recursive_async(GFile *src, GFile *dest, GFileCopyFlags flags, int prio, GCancellable *cancel,
	GAsyncReadyCallback done_cb, void *data)
{
	g_return_if_fail(G_IS_FILE(src));
	g_return_if_fail(G_IS_FILE(dest));
	g_return_if_fail(flags == G_FILE_COPY_NONE || flags == G_FILE_COPY_OVERWRITE);
	g_return_if_fail(!cancel || G_IS_CANCELLABLE(cancel));

	g_autoptr(GTask) task = g_task_new(src, cancel, done_cb, data);
	g_task_set_priority(task, prio);

	CopyRecursiveClosure *task_data = g_new0(CopyRecursiveClosure, 1);
	g_autofree char *basename = g_file_get_basename(src);
	task_data-&gt;dest_folder = g_file_get_child(dest, basename);
	task_data-&gt;files_to_copy = g_queue_new();
	task_data-&gt;folders_to_copy = g_queue_new();
	task_data-&gt;flags = flags;
	g_task_set_task_data(task, task_data, (GDestroyNotify)copy_recursive_closure_free);

	g_file_make_directory_async(task_data-&gt;dest_folder, prio, cancel,
		(GAsyncReadyCallback)on_recursive_make_dir_finish, g_steal_pointer(&amp;task));
}

/**
 * copy_recursive_finish:
 * @src: The source folder
 * @result: The #GAsyncResult passed to the callback
 * @error_out: (nullable): Return location for a #GError
 *
 * Complete the asynchronous copy operation started by copy_recursive_async().
 *
 * Returns: %TRUE if the operation completed successfully, %FALSE on error.
 */
bool
copy_recursive_finish(GFile *src, GAsyncResult *result, GError **error_out)
{
	g_return_val_if_fail(G_IS_FILE(src), false);
	g_return_val_if_fail(G_IS_TASK(result), false);
	g_return_val_if_fail(g_task_is_valid(result, src), false);

	return g_task_propagate_boolean(G_TASK(result), error_out);
}

static void
on_recursive_make_dir_finish(GFile *file, GAsyncResult *result, GTask *task_ptr)
{
	g_autoptr(GTask) task = g_steal_pointer(&amp;task_ptr);
	g_autoptr(GError) error = NULL;
	GCancellable *cancel = g_task_get_cancellable(task);
	int prio = g_task_get_priority(task);

	if (!g_file_make_directory_finish(G_FILE(file), result, &amp;error)) {
		/* With the OVERWRITE flag, don't error out when the folder already
		 * exists. (Hopefully plopping all the files in the existing folder is
		 * sufficient. If not, another way to do this would be to delete the
		 * existing folder recursively, so that extra existing files not in the
		 * source don't remain in the destination.) */
		CopyRecursiveClosure *data = g_task_get_task_data(task);
		bool overwrite = !!(data-&gt;flags &amp; G_FILE_COPY_OVERWRITE);
		if (!overwrite || !g_error_matches(error, G_IO_ERROR, G_IO_ERROR_EXISTS)) {
			g_autofree char *path = g_file_get_path(file);
			g_task_return_prefixed_error(task, g_steal_pointer(&amp;error),
				"Error creating destination folder %s: ", path);
			return;
		}
	}

	GFile *src = g_task_get_source_object(task);
	g_file_enumerate_children_async(src, "standard::*", G_FILE_QUERY_INFO_NONE, prio, cancel,
		(GAsyncReadyCallback)on_recursive_file_enumerate_finish, g_steal_pointer(&amp;task));
}

static void
on_recursive_file_enumerate_finish(GFile *file, GAsyncResult *result, GTask *task_ptr)
{
	g_autoptr(GTask) task = g_steal_pointer(&amp;task_ptr);
	g_autoptr(GError) error = NULL;
	GCancellable *cancel = g_task_get_cancellable(task);
	int prio = g_task_get_priority(task);

	g_autoptr(GFileEnumerator) children = g_file_enumerate_children_finish(G_FILE(file), result, &amp;error);
	if (!children) {
		g_autofree char *path = g_file_get_path(file);
		g_task_return_prefixed_error(task, g_steal_pointer(&amp;error),
			"Error reading folder %s: ", path);
		return;
	}

	g_file_enumerator_next_files_async(children, 10, prio, cancel,
		(GAsyncReadyCallback)on_recursive_file_next_files_finish, g_steal_pointer(&amp;task));
}

static void
on_recursive_file_next_files_finish(GFileEnumerator *children, GAsyncResult *result, GTask *task_ptr)
{
	g_autoptr(GTask) task = g_steal_pointer(&amp;task_ptr);
	g_autoptr(GError) error = NULL;
	GCancellable *cancel = g_task_get_cancellable(task);
	int prio = g_task_get_priority(task);

	g_autolist(GFileInfo) next_files = g_file_enumerator_next_files_finish(children, result, &amp;error);
	if (error) {
		g_autofree char *path = g_file_get_path(g_file_enumerator_get_container(children));
		g_task_return_prefixed_error(task, g_steal_pointer(&amp;error),
			"Error reading files from folder %s: ", path);
		return;
	}

	CopyRecursiveClosure *data = g_task_get_task_data(task);

	if (next_files) {
		for (GList *iter = next_files; iter != NULL; iter = g_list_next(iter)) {
			GFileInfo *info = G_FILE_INFO(iter-&gt;data);
			GFileType type = g_file_info_get_file_type(info);
			g_autoptr(GFile) file = g_file_enumerator_get_child(children, info);
			switch (type) {
				case G_FILE_TYPE_DIRECTORY:
					g_queue_push_tail(data-&gt;folders_to_copy, g_steal_pointer(&amp;file));
					break;
				case G_FILE_TYPE_REGULAR:
					g_queue_push_tail(data-&gt;files_to_copy, g_steal_pointer(&amp;file));
					break;
				default:
					g_warning("Unhandled file type %d in recursive copy: %s", type, g_file_info_get_name(info));
					continue;
			}
		}

		g_file_enumerator_next_files_async(children, 10, prio, cancel,
			(GAsyncReadyCallback)on_recursive_file_next_files_finish, g_steal_pointer(&amp;task));

		return;
	}

	copy_file_queue_async(g_steal_pointer(&amp;task));
}

static void
copy_file_queue_async(GTask *task_ptr)
{
	g_autoptr(GTask) task = task_ptr;
	CopyRecursiveClosure *data = g_task_get_task_data(task);

	g_autoptr(GFile) file = g_queue_pop_head(data-&gt;files_to_copy);
	if (file) {
		GCancellable *cancel = g_task_get_cancellable(task);
		int prio = g_task_get_priority(task);

		g_autofree char *basename = g_file_get_basename(file);
		g_autoptr(GFile) dest = g_file_get_child(data-&gt;dest_folder, basename);
		g_file_copy_async(file, dest, data-&gt;flags, prio, cancel,
			/* progress_callback = */ NULL, NULL,
			(GAsyncReadyCallback)on_recursive_file_copy_finish, g_steal_pointer(&amp;task));
		return;
	}

	copy_folder_queue_async(g_steal_pointer(&amp;task));
}

static void
on_recursive_file_copy_finish(GFile *file, GAsyncResult *result, GTask *task_ptr)
{
	g_autoptr(GTask) task = task_ptr;
	g_autoptr(GError) error = NULL;
	if (!g_file_copy_finish(file, result, &amp;error)) {
		g_autofree char *path = g_file_get_path(file);
		g_task_return_prefixed_error(task, g_steal_pointer(&amp;error),
			"Error copying file %s: ", path);
		return;
	}
	copy_file_queue_async(g_steal_pointer(&amp;task));
}

static void
copy_folder_queue_async(GTask *task_ptr)
{
	g_autoptr(GTask) task = task_ptr;
	CopyRecursiveClosure *data = g_task_get_task_data(task);

	g_autoptr(GFile) folder = g_queue_pop_head(data-&gt;folders_to_copy);
	if (folder) {
		GCancellable *cancel = g_task_get_cancellable(task);
		int prio = g_task_get_priority(task);

		copy_recursive_async(folder, data-&gt;dest_folder, data-&gt;flags, prio, cancel,
			(GAsyncReadyCallback)on_recursive_folder_copy_finish, g_steal_pointer(&amp;task));
		return;
	}

	g_task_return_boolean(task, true);
}

static void
on_recursive_folder_copy_finish(GFile *folder, GAsyncResult *result, GTask *task_ptr)
{
	g_autoptr(GTask) task = task_ptr;
	g_autoptr(GError) error = NULL;
	if (!copy_recursive_finish(folder, result, &amp;error)) {
		g_autofree char *path = g_file_get_path(folder);
		g_task_return_prefixed_error(task, g_steal_pointer(&amp;error),
			"Error copying folder %s: ", path);
		return;
	}
	copy_folder_queue_async(g_steal_pointer(&amp;task));
}

static void
copy_recursive_closure_free(CopyRecursiveClosure *ptr) {
	g_object_unref(ptr-&gt;dest_folder);
	g_queue_free_full(ptr-&gt;files_to_copy, g_object_unref);
	g_queue_free_full(ptr-&gt;folders_to_copy, g_object_unref);
	g_free(ptr);
}
</pre></div>


<p>You are welcome to take this code and customize it to your needs. I’m putting it into the public domain so hopefully nobody else has to go through this.</p>



<p>Although if you really want to, it could be improved by implementing progress callbacks like <code>g_file_copy_async()</code> has.</p>



<p>Just so you can understand what’s going on at a glance, here’s what it would look like in about 30 lines of JavaScript, with async/await style:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">async function copyRecursive(src, dest, flags, prio, cancel) {
  const destFolder = dest.get_child(src.get_basename());
  const overwrite = !!(flags &amp; Gio.FileCopyFlags.OVERWRITE);

  try {
    await destFolder.make_directory_async(prio, cancel);
  } catch (error) {
    if (!overwrite || !error.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.EXISTS))
      throw error;
  }

  const children = await src.enumerate_children_async('standard::*',
    Gio.FileQueryInfoFlags.NONE, prio, cancel);
  let nextFiles;
  const filesToCopy = [];
  const foldersToCopy = [];
  while ((nextFiles = await children.next_files_async(10, prio, cancel)).length) {
    const {
      [Gio.FileType.REGULAR]: files,
      [Gio.FileType.DIRECTORY]: folders,
    } = Object.groupBy(nextFiles, info =&gt; info.get_file_type()); 
    foldersToCopy.push(...folders?.map(info =&gt; children.get_child(info)) ?? []);
    filesToCopy.push(...files?.map(info =&gt; children.get_child(info)) ?? []);
  }

  for (const file of filesToCopy) {
    const dest = destFolder.get_child(file.get_basename());
    await file.copy_async(dest, flags, prio, cancel, null, null);
  }

  for (const folder of foldersToCopy)
    await copyRecursive(folder, destFolder, flags, prio, cancel);
}
</pre></div>


<p>(This excludes the imports and calls to <code>Gio._promisify</code> that you would have to do; hopefully we’ll get native async operations in GNOME 48!)</p>



<p id="footnote1">[1] C++ before C++11 used to be a worse experience than C. However, I don’t have to deal with that because the three major JS engines use C++17. It’s … its own category of <em>special</em>, but <em>better</em>. <a href="https://ptomato.wordpress.com/feed/#footnote1-return"><img alt="&#x21A9;" class="wp-smiley" src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/21a9.png" style="height: 1em;"/></a></p>



<p id="footnote2">[2] No, ChatGPT couldn’t do it either; it made up GIO APIs that don’t exist. If <em>that</em> programming technique is on the table, then sure, it’d have been a lot easier. <a href="https://ptomato.wordpress.com/feed/#footnote2-return"><img alt="&#x21A9;" class="wp-smiley" src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/21a9.png" style="height: 1em;"/></a></p>



<p/></div>
    </content>
    <updated>2024-09-23T00:41:03Z</updated>
    <published>2024-09-23T00:41:03Z</published>
    <category term="Rated N"/>
    <category term="async"/>
    <category term="callback"/>
    <category term="gnome"/>
    <category term="javascript"/>
    <category term="open source"/>
    <category term="programming"/>
    <author>
      <name>Philip Chimento</name>
    </author>
    <source>
      <id>https://ptomato.wordpress.com</id>
      <logo>https://s0.wp.com/i/buttonw-com.png</logo>
      <link href="https://ptomato.wordpress.com/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://ptomato.wordpress.com" rel="alternate" type="text/html"/>
      <link href="https://ptomato.wordpress.com/osd.xml" rel="search" title="The Mad Scientist Review" type="application/opensearchdescription+xml"/>
      <link href="https://ptomato.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>"It's hard to tell what the author is exactly shooting for from his high horse."</subtitle>
      <title>The Mad Scientist Review</title>
      <updated>2024-09-23T15:03:40Z</updated>
    </source>
  </entry>

  <entry>
    <id>https://joaquimrocha.com/2024/09/22/how-to-fork/</id>
    <link href="https://joaquimrocha.com/2024/09/22/how-to-fork/" rel="alternate" type="text/html"/>
    <title>How to fork: Best practices and guide</title>
    <updated>2024-09-22T23:49:27Z</updated>
    <published>2024-09-22T23:49:27Z</published>
    <source>
      <id>https://joaquimrocha.com/</id>
      <author>
        <name>Joaquim Rocha</name>
      </author>
      <link href="https://joaquimrocha.com/" rel="alternate" type="text/html"/>
      <link href="https://joaquimrocha.com/rss.xml" rel="self" type="application/rss+xml"/>
      <subtitle>Joaquim Rocha's blog</subtitle>
      <title>Joaquim Rocha</title>
      <updated>2024-10-17T00:02:33Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://www.figuiere.net/hub/wlog/new-raw-thumbnailer/</id>
    <link href="https://www.figuiere.net/hub/wlog/new-raw-thumbnailer/" rel="alternate" type="text/html"/>
    <title xml:lang="en">New raw thumbnailer</title>
    <summary type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>I have resurrected my camera old raw thumbnailer so that I can browse
directories full of of camera raw images in Nautilus. This is version
47.0.1, because GNOME 47 is out.</p>
<p>Like the old one, it uses libopenraw to extract the previews from the
raw files.</p>
<p>But, it now supports more raw formats, and if needed will render the
raw image to generate a preview, like it has to for my old Ricoh GR
Digital II images (the one from 2007). This leverage <a href="https://crates.io/crates/libopenraw/0.4.0-alpha.8">libopenraw
0.4.0</a> (still in
alpha stage) that has been <a href="https://www.figuiere.net/hub/wlog/libopenraw-rust-capi/">rewritten in Rust</a>.</p>
<p>Sadly to get is in the hands of users the only good solution is a
distribution package. At the time of writing there is none, but I put
together smething that allowed me to build a package for Fedora 40 to
install on my big rig.</p>
<p>If you feel like it you can download the <a href="https://download.gnome.org/sources/raw-thumbnailer/47/">source
code</a> from
GNOME, and <a href="https://gitlab.gnome.org/World/gnome-raw-thumbnailer">the
repository</a> is
on GNOME gitlab.</p>
<p>This is how it looks with Nautilus 46 with a bunch of images from my
old Olympus E-P1:</p>
<p><img alt="Nautilus directory view with ORF images thumbnails" src="https://www.figuiere.net/hub/wlog/new-raw-thumbnailer/raw-thumbnailer-nautilus.png"/></p></div>
    </summary>
    <updated>2024-09-22T00:00:00Z</updated>
    <published>2024-09-22T00:00:00Z</published>
    <author>
      <name>Hubert Figuière</name>
    </author>
    <source>
      <id>https://www.figuiere.net/hub/wlog/atom.xml</id>
      <link href="https://www.figuiere.net/hub/wlog/atom.xml" rel="self" type="application/atom+xml"/>
      <link href="https://www.figuiere.net/hub/wlog" rel="alternate" type="text/html"/>
      <title xml:lang="en">Hub's wlog</title>
      <updated>2024-10-09T00:00:00Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blogs.gnome.org/sophieh/?p=1095</id>
    <link href="https://blogs.gnome.org/sophieh/2024/09/20/image-viewing-and-editing-in-gnome-47-and-beyond/" rel="alternate" type="text/html"/>
    <title>Image Viewing and Editing in GNOME 47 and Beyond</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Loupe is GNOME’s default image viewer since GNOME 45. It is powered by the newly written safe image loading and editing library glycin. What’s new in 47 With GNOME 47, Loupe version 47 is available as well. This release mostly consists of a lot of subtle changes. For JPEGs, the image rotation feature now writes … <a class="more-link" href="https://blogs.gnome.org/sophieh/2024/09/20/image-viewing-and-editing-in-gnome-47-and-beyond/">Continue reading <span class="screen-reader-text">Image Viewing and Editing in GNOME 47 and Beyond</span></a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="https://apps.gnome.org/Loupe/"><img alt="" class="alignleft wp-image-118 size-full" src="https://apps.gnome.org/icons/scalable/org.gnome.Loupe.svg" width="85"/></a><em><a href="https://apps.gnome.org/Loupe/">Loupe</a> is GNOME’s default image viewer since GNOME 45. It is powered by the newly written safe image loading and editing library <a href="https://gitlab.gnome.org/sophie-h/glycin/">glycin</a>.</em></p>
<h1 id="whats-new-in-47">What’s new in 47</h1>
<p>With GNOME 47, Loupe version 47 is available as well. This release mostly consists of a lot of subtle changes. For JPEGs, the image rotation feature now writes the new orientation to the image file. While Loupe 46 was still defaulting to an older GTK renderer, the new version is using the same defaults as all other apps. Thanks to work by Benjamin Otte in GTK, Loupe now also handles very large images (larger than 256 megapixels) reliably on systems with limited VRAM while also increasing the loading speed.</p>
<p>Loupe and the underlying image loading and editing library <a href="https://gitlab.gnome.org/sophie-h/glycin">glycin</a> now support much better error reporting if it is not possible to load an image. The new glycin version uses a different decoder for JPEG images, improving loading speed and fixing all known compatibility issues. As part of my work on the GNOME STF grant, glycin now also provides bindings for other programming languages than Rust including C, GJS, Python, and Vala. If necessary, glycin now <a href="https://docs.rs/glycin/latest/glycin/enum.SandboxSelector.html#variant.Auto">automatically disables its sandbox features</a> in Flatpak development environments, simplifying development.</p>
<h1 id="what-we-are-working-on">What we are working on</h1>
<p>But there is more! We have already merged the first GNOME 48 features, which will be released in March 2025. Allan Day worked on a new design for overlay controls, especially zoom. This is already implemented and merged. It allows the selection of zoom levels like 100% without using keyboard shortcuts like <em>Ctrl+1</em> and additionally gives the option to select arbitrary zoom levels. There is also a new experimental design for dragging images into the Loupe window.</p>
<p/>
<p>On the more technical side, Hubert Figuière has written an initial loader implementation for <a href="https://en.wikipedia.org/wiki/Raw_image_format">raw image formats</a> which is now merged into glycin. Last but not least, I’m planning to finally have some initial image editing features beyond image rotation in Loupe 48. I’m currently working on all the basics and an image cropping feature.</p>
<p><img alt="App window with copping selection over an image and and open menu to select the aspect ratio." class="aligncenter size-full wp-image-1116" height="596" src="https://blogs.gnome.org/sophieh/files/2024/09/Loupe-Crop-UI.png" width="776"/></p>
<p>A huge thanks goes out to everyone who contributed to this work including all the people that are kind enough to support my work financially! If you want to get weekly behind-the-scenes development updates or just support my work financially, you can do so <a href="https://blogs.gnome.org/sophieh/projects/">via Patreon, Ko-Fi, GitHub, or OpenCollective</a>.</p>
<p><small>Header Image © Friedrich Haag / <a href="https://commons.wikimedia.org/wiki/Main_Page" title="Main Page">Wikimedia Commons</a> / <a class="extiw" href="https://creativecommons.org/licenses/by-sa/4.0/" title="creativecommons:by-sa/4.0/">CC BY-SA 4.0</a></small></p></div>
    </content>
    <updated>2024-09-20T19:04:38Z</updated>
    <published>2024-09-20T19:04:38Z</published>
    <category term="GNOME"/>
    <category term="Uncategorized"/>
    <author>
      <name>Sophie Herold</name>
    </author>
    <source>
      <id>https://blogs.gnome.org/sophieh</id>
      <link href="https://blogs.gnome.org/sophieh/category/GNOME/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blogs.gnome.org/sophieh" rel="alternate" type="text/html"/>
      <subtitle>News about Pika Backup and other random projects.</subtitle>
      <title>GNOME – Sophie's Blog</title>
      <updated>2024-09-25T21:06:30Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blogs.gnome.org/shell-dev/?p=3291</id>
    <link href="https://blogs.gnome.org/shell-dev/2024/09/20/understanding-gnome-shells-focus-stealing-prevention/" rel="alternate" type="text/html"/>
    <title>Understanding GNOME Shell’s focus stealing prevention</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Focus stealing prevention exists for two main reasons: One is security, since we need to prevent rogue apps from deceiving users into e.g. typing their password into another window. If apps can silently claim keyboard focus and open their own window over the currently focused one, this enables phishing and other similar attacks. The other … <p class="link-more"><a class="more-link" href="https://blogs.gnome.org/shell-dev/2024/09/20/understanding-gnome-shells-focus-stealing-prevention/">Continue reading<span class="screen-reader-text"> "Understanding GNOME Shell’s focus stealing prevention"</span></a></p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Focus stealing prevention exists for two main reasons: One is security, since we need to prevent rogue apps from deceiving users into e.g. typing their password into another window. If apps can silently claim keyboard focus and open their own window over the currently focused one, this enables phishing and other similar attacks. The other is user experience: Even if an app isn’t maliciously taking over your focus, it can be annoying to have a new window popping up while you’re typing something and have half your sentence end up in the wrong app.</p>
<p>At the same time there are cases where you want apps to be able to request focus, for example when clicking a link in a chat app and wanting it to open in the browser. In this case you want the focus to move to the browser window.</p>
<p>This is why our compositor library <code>mutter</code> implements focus stealing prevention mechanisms, which allow the currently focused app to request that a specific other app be allowed to claim focus now.</p>
<h3>&lt;App&gt; is ready??</h3>
<p>Most users have probably seen an “&lt;App&gt; is ready” notification in GNOME Shell at some point. Unfortunately this notification doesn’t really explain why it’s being shown and what’s happening, which may cause confusion.</p>
<p>Because of this there have been proposals to disable focus stealing prevention until it works better (<a href="https://gitlab.gnome.org/GNOME/mutter/-/issues/673">mutter issue 673</a>), and a number of GNOME Shell extensions).</p>
<p><img alt="Screenshot of a GNOME Shell notification showing that Telegram Desktop Media viewer is ready" class="aligncenter wp-image-3300 size-full" height="160" src="https://blogs.gnome.org/shell-dev/files/2024/09/app-ready-notification.png" width="667"/></p>
<p>These are the main cases where the notification is shown:</p>
<ul>
<li> A new window is opened and either the launcher app, or the launched app doesn’t implement the <a href="https://wayland.app/protocols/xdg-activation-v1">XDG Activation protocol</a> or the <a href="https://specifications.freedesktop.org/startup-notification-spec/latest">startup notification specification</a></li>
<li> An app requests focus for one of its windows, but was not activated in a valid way (e.g. because it wasn’t started by a user action)</li>
<li>An app requests focus for a new window, but it’s slow to start and in the meantime there are additional user interactions. In this case we don’t want to interrupt, and show the notification so people can switch at their convenience.</li>
<li>An app is launched from an environment that isn’t able to use the <a href="https://wayland.app/protocols/xdg-activation-v1">XDG Activation protocol</a> (e.g. a terminal)</li>
</ul>
<p>The protocol responsible for this, <a href="https://wayland.app/protocols/xdg-activation-v1">XDG Activation</a>, the Wayland equivalent to the X11-specific <a href="https://specifications.freedesktop.org/startup-notification-spec/latest">startup notification spec</a> was introduced somewhat recently (2020), and needs to be adopted by UI toolkits. GNOME 46 and 47 saw a few fixes and the feature was polished both in the client toolkit side (GTK and <code>xdg-desktop-portal</code>, as well as in the compositor implementation <code>mutter</code>, but there are still cases where XDG activation isn’t hooked up properly.</p>
<h3>How XDG activation works</h3>
<figure class="wp-caption aligncenter" id="attachment_3297" style="width: 680px;"><img alt="Flow xdg activation protocol." class="wp-image-3297 size-full" height="760" src="https://blogs.gnome.org/shell-dev/files/2024/09/xdg-activation-flow.png" width="680"/><figcaption class="wp-caption-text" id="caption-attachment-3297">XDG activation flow for moving focus between two existing windows</figcaption></figure>
<p>The way the protocol works is that the currently focused app asks the compositor to create a token linked to the focused window (Wayland surface) and the most recent user interaction (an input event serial associated with a seat).</p>
<p>This token is then used by the app that should receive focus when it requests to be activated. In GNOME Shell, activation means that the the window receives focus and is placed on top of other windows. An activation token may still be rejected, for example if the window linked to the token doesn’t have focus or when the linked user interaction isn’t recent enough.</p>
<p>In addition to handling focus, GNOME Shell also tracks app launching. Until the new app window is actually shown, GNOME Shell uses a “loading spinner” mouse cursor to indicate to the user that the app is loading. If the app doesn’t implement the XDG Activation protocol, the loading indicator only disappears after a timeout because GNOME Shell doesn’t know that the application finished loading and has presented the target window.</p>
<p>The protocol doesn’t define how tokens are given to the target app. One reason for this is because it depends on how the app is started. The main options are:</p>
<ul>
<li>Setting the <code>XDG_ACTIVATION_TOKEN</code> environment variable</li>
<li><a href="https://specifications.freedesktop.org/desktop-entry-spec/latest/dbus.html">D-Bus Activation</a> using the <code>platform-data</code> field, which contains the activation token</li>
<li><code><a href="https://flatpak.github.io/xdg-desktop-portal/docs">XDG portals</a></code> that will launch an app (e.g. the <code>OpenURI</code> or <code>OpenFile</code> portals)</li>
</ul>
<p>The target app then needs to collect the token and use it to have its window activated to receive focus and to signal to the compositor that it started successfully.</p>
<h3>Not smart enough</h3>
<p>When I started looking into how our focus prevention mechanism works to investigate the issues mentioned above, I was initially pretty confused. There were a lot of cases where the focus window switch worked fine, but other times it wouldn’t. I realized quickly that with existing windows, the “&lt;App&gt; is ready” notification is shown, but new window would get focus immediately.</p>
<p>This struck me as odd: Why are new windows allowed to do whatever, but existing windows are restricted in the way they can take over focus?</p>
<p>I first thought this was some sort of bug, but then I discovered that the behavior was by design: <code>Mutter</code> has a gsettings property called <code>focus-new-windows</code> that controls the focus stealing prevention mechanism. This property can be <code>strict</code> or <code>smart</code> (the latter being the default).</p>
<ul>
<li><code>smart</code> means that in most cases new windows get focus (even without asking for it) and are raised to the top of the window stack</li>
<li><code>strict</code> means they get focus (are “activated”, in technical terms) only when they are actually supposed to</li>
</ul>
<p>The <code>smart</code> mode exists in part because there are some cases where our current focus prevention system does not work well. These issues include:</p>
<ul>
<li>Launching apps via terminal (<a href="https://gitlab.gnome.org/GNOME/vte/-/issues/2788">vte issue #2788</a>). The main issue is that the terminal executing a command does not know whether that process will present a window or not. For example, if you launch <code>vim</code> there’s no new window, but if you launch <code>firefox</code> there is.</li>
<li>Launching apps via <code>Run a Command</code> in GNOME Shell (<a href="https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7704">gnome-shell issue #7704</a>) shares similar issues as running apps from the terminal</li>
<li>Apps launched via custom keyboard shortcut (e.g. set up in Settings &gt; Keyboard &gt; Keyboard Shortcuts)</li>
<li>The lack of implementation of the appropriate protocols in apps or toolkits</li>
</ul>
<p>Because the cases where a new window is opened are a significant percentage of the overall cases where focus prevention is triggered, this <code>smart</code> mode is making it appear as though apps actually implement the XDG Activation protocol, even if they don’t. While it does somewhat reduce annoyance for users, it gives developers the false impression that they don’t have to do anything.</p>
<p>It also makes it harder to debug issues where something doesn’t work as expected or is missing the correct implementation. For example, even in GTK4 the focus transferring is broken in some cases and took a long time to be discovered (<a href="https://gitlab.gnome.org/GNOME/gtk/-/issues/6711">gtk issue #6711</a>).</p>
<h3>Security implications</h3>
<p>Unfortunately the current situation with <code>smart</code> as the default means that we’re not getting most of the benefits of focus stealing prevention. Apps are able to spawn a new window over your current one and grab keyboard focus, because the <code>smart</code> mode just gives the new window focus, circumventing the safety measures. This is trivial to exploit by malicious apps: All they need to do is open a new window, and focus stealing prevention doesn’t apply.</p>
<h3>Next steps</h3>
<p>While some people have asked for focus stealing prevention to be disabled completely until it’s implemented by most apps and toolkits, I’m not sure this is the best way forward. If we did that, nobody would notice which apps don’t implement it, so there’d be no reason for toolkits to do so.</p>
<p>On the other hand, there are some remaining issues around terminal applications and similar use cases that we don’t have a plan for yet, so just switching to <code>strict</code> to flush out app bugs isn’t ideal either at the moment.</p>
<ul>
<li>There is currently no consensus in the team as to how to proceed. The two main directions we could take are:</li>
<li>Switch to <code>strict</code> mode by default (<a href="https://gitlab.gnome.org/GNOME/mutter/-/issues/3486">mutter issue #3486</a>) once a few remaining issues are resolved, perhaps with a “flag day” deadline so apps have time to implement it.</li>
<li>Slowly make the <code>smart</code> mode stricter over time.</li>
</ul>
<p>Either way we need to raise more awareness of the issue to get app and toolkit developers interested in improving things in this area, which this blogpost is a part of <img alt="&#x1F642;" class="wp-smiley" src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f642.png" style="height: 1em;"/></p>
<p>It’d also be helpful if more people (especially developers) turn on strict mode on their system, so we get more testing for which apps work and which don’t. This is the relevant gsetting:</p>
<p><code>gsettings set org.gnome.desktop.wm.preferences focus-new-windows 'strict'</code></p>
<h3>Thanks</h3>
<p>Thanks to the <a href="https://www.sovereigntechfund.de">Sovereign Tech Fund</a> for allowing me to take the time to properly work through this as part of my broader effort around <a href="https://blogs.gnome.org/shell-dev/2024/04/23/notifications-46-and-beyond">improving notifications</a>. Thanks also to Sonny Piers and Tobias Bernard for organizing the STF project, Florian Müllner, Sebastian Wick, Carlos Garnacho, and the rest of the GNOME Shell team for reviewing my MRs, and Jonas Dreßler and Jonas Ådahl for reviewing the blogpost.</p></div>
    </content>
    <updated>2024-09-20T14:19:12Z</updated>
    <published>2024-09-20T14:19:12Z</published>
    <category term="Uncategorized"/>
    <category term="2788"/>
    <category term="3486"/>
    <category term="6711"/>
    <category term="7704"/>
    <author>
      <name>jsparber</name>
    </author>
    <source>
      <id>https://blogs.gnome.org/shell-dev</id>
      <link href="https://blogs.gnome.org/shell-dev/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blogs.gnome.org/shell-dev" rel="alternate" type="text/html"/>
      <subtitle>Development blog for GNOME Shell and Mutter</subtitle>
      <title>GNOME Shell &amp; Mutter</title>
      <updated>2024-09-20T16:06:36Z</updated>
    </source>
  </entry>

  <entry>
    <id>https://hansdegoede.dreamwidth.org/28552.html</id>
    <link href="https://hansdegoede.dreamwidth.org/28552.html" rel="alternate" type="text/html"/>
    <title>Fedora plymouth boot splash not showing on systems with AMD GPUs</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Recently there have been a number of reports (<a href="https://bugzilla.redhat.com/show_bug.cgi?id=2183743">bug 2183743</a>, <a href="https://bugzilla.redhat.com/show_bug.cgi?id=2276698">bug 2276698</a>, <a href="https://bugzilla.redhat.com/show_bug.cgi?id=2283839">bug 2283839</a>, <a href="https://bugzilla.redhat.com/show_bug.cgi?id=2312355">bug 2312355</a>) about the plymouth boot splash not showing properly on PCs using AMD GPUs.<br/><br/>The problem without plymouth and AMD GPUs is that the amdgpu driver is a really really big driver, which easily takes up to 10 seconds to load on older PCs. The delay caused by this may cause plymouth to timeout while waiting for the GPU to be initialized, causing it to fallback to the 3 dot text-mode boot splash.<br/><br/>There are 2 workaround for this depending on the PCs configuration:<br/><br/>1. With older AMD GPUs the radeon driver is actually used to drive the GPU but even though it is unused the amdgpu driver still loads slowing things down.<br/><br/>To check if this is the case for your PC start a terminal in a graphical login session and run: "lsmod | grep -E '^radeon|^amdgpu'" this will output something like this:<br/><br/>amdgpu              17829888  0<br/>radeon               2371584  37<br/><br/>The second number after each is the usage count. As you can see in this example the amdgpu driver is not used. In this case you can disable the loading of the amdgpu driver by adding "modprobe.blacklist=amdgpu" to your kernel commandline:<br/><br/>sudo grubby --update-kernel=ALL --args="modprobe.blacklist=amdgpu"<br/><br/><br/>2. If the amdgpu driver is actually used on your PC then plymouth not showing can be worked around by telling plymouth to use the simpledrm drm/kms device created from the EFI framebuffer early on boot, rather then waiting for the real GPU driver to load. Note this depends on your PC booting in EFI mode. To do this run:<br/><br/>sudo grubby --update-kernel=ALL --args="plymouth.use-simpledrm"<br/><br/><br/>After using 1 of these workarounds plymouth should show normally again on boot (and booting should be a bit faster).<br/><br/><img alt="comment count unavailable" height="12" src="https://www.dreamwidth.org/tools/commentcount?user=hansdegoede&amp;ditemid=28552" style="vertical-align: middle;" width="30"/> comments</div>
    </summary>
    <updated>2024-09-14T13:38:51Z</updated>
    <published>2024-09-14T13:38:51Z</published>
    <category term="kernel"/>
    <category term="plymouth"/>
    <category term="fedora"/>
    <source>
      <id>https://hansdegoede.dreamwidth.org/</id>
      <logo>https://v.dreamwidth.org/16479769/3892031</logo>
      <author>
        <name>Hans de Goede</name>
      </author>
      <link href="https://hansdegoede.dreamwidth.org/" rel="alternate" type="text/html"/>
      <link href="https://hansdegoede.dreamwidth.org/data/rss" rel="self" type="application/rss+xml"/>
      <subtitle>Hans de Goede - Dreamwidth Studios</subtitle>
      <title>Hans de Goede</title>
      <updated>2024-10-02T18:06:02Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blogs.gnome.org/xjuan/?p=6345</id>
    <link href="https://blogs.gnome.org/xjuan/2024/09/13/introducing-casilda-wayland-compositor-widget/" rel="alternate" type="text/html"/>
    <title>Introducing Casilda – A Wayland compositor widget!</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I am pleased to introduce the first stable release of Casilda! A simple Wayland compositor widget for Gtk 4 which can be used to embed other processes windows in your Gtk 4 application. It was originally created for Cambalache‘s workspace using wlroots, a modular library to create Wayland compositors. Following Wayland tradition, this library is … <a class="more-link" href="https://blogs.gnome.org/xjuan/2024/09/13/introducing-casilda-wayland-compositor-widget/">Continue reading <span class="screen-reader-text">Introducing Casilda – A Wayland compositor widget!</span></a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I am pleased to introduce the first stable release of Casilda!</p>
<p>A simple Wayland compositor widget for Gtk 4 which can be used to embed other processes windows in your Gtk 4 application.</p>
<p>It was originally created for <a href="https://gitlab.gnome.org/jpu/cambalache">Cambalache</a>‘s workspace using wlroots, a modular library to create Wayland compositors.</p>
<p>Following Wayland tradition, this library is named after my hometown in Santa Fe, Argentina</p>
<h3>License</h3>
<p>Casilda is distributed under the <a href="http://(https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html">GNU Lesser General Public License</a> version 2.1 only.</p>
<h3>Where to get it?</h3>
<p>Source code lives on GNOME gitlab <a href="https://gitlab.gnome.org/jpu/casilda">here</a></p>
<pre>git clone https://gitlab.gnome.org/jpu/casilda.git</pre>
<h3>Manual installation</h3>
<p>This is a regular meson package and can be installed the usual way.</p>
<pre># Configure project in _build directory
meson setup --wipe --prefix=~/.local _build .

# Build and install in ~/.local
ninja -C _build install</pre>
<h3>How to use it</h3>
<p>To add a Wayland compositor to your application all you have to do is create a CasildaCompositor widget. You can specify which UNIX socket the compositor will listen for clients connections or let it will choose one automatically.</p>
<pre>compositor = casilda_compositor_new ("/tmp/casilda-example.sock");
gtk_window_set_child (GTK_WINDOW (window), GTK_WIDGET (compositor));
</pre>
<p>Once the compositor is running you can connect to it by specifying the socket in WAYLAND_DISPLAY environment variable.</p>
<pre>export GDK_BACKEND=wayland
export WAYLAND_DISPLAY=/tmp/casilda-example.sock
gtk4-demo
</pre>
<p><a href="https://blogs.gnome.org/xjuan/files/2024/09/casilda.gif"><img alt="" class="alignnone size-full wp-image-6357" height="669" src="https://blogs.gnome.org/xjuan/files/2024/09/casilda.gif" width="855"/></a></p>
<h3>API</h3>
<p>The api is pretty simple CasildaCompositor has two properties, socket and bg-color.</p>
<ul>
<li>
<ul>
<li>socket: The unix socket file to connect to this compositor (string)</li>
<li>bg-color: Compositor background color (GdkRGBA)</li>
</ul>
</li>
</ul>
<h3>Matrix channel</h3>
<p>Have any question? come chat with us at <a href="https://matrix.to/#/#cambalache:gnome.org">#cambalache:gnome.org</a></p>
<h3>Mastodon</h3>
<p>Follow me in Mastodon <a href="https://mastodon.social/@xjuan">@xjuan</a> to get news related to Casilda and Cambalache development.</p>
<p>Happy coding!</p></div>
    </content>
    <updated>2024-09-13T17:36:12Z</updated>
    <published>2024-09-13T17:36:12Z</published>
    <category term="Gtk 4"/>
    <category term="Programming"/>
    <category term="Wayland"/>
    <author>
      <name>xjuan</name>
    </author>
    <source>
      <id>https://blogs.gnome.org/xjuan</id>
      <link href="https://blogs.gnome.org/xjuan/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blogs.gnome.org/xjuan" rel="alternate" type="text/html"/>
      <subtitle>Just another GNOME Blogs site</subtitle>
      <title>ar.xjuan.Blog</title>
      <updated>2024-09-27T16:34:16Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blogs.gnome.org/alicem/?p=7689</id>
    <link href="https://blogs.gnome.org/alicem/2024/09/13/libadwaita-1-6/" rel="alternate" type="text/html"/>
    <title>Libadwaita 1.6</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Well, it’s time for another release. Last cycle wasn’t particularly exciting, only featuring the new dialogs and a few smaller changes, but this one should be more interesting. So let’s look at what’s new. Bottom sheet Last cycle libadwaita got new dialogs, which can be presented as bottom sheets on mobile, and I mentioned that … <a class="more-link" href="https://blogs.gnome.org/alicem/2024/09/13/libadwaita-1-6/">Continue reading <span class="screen-reader-text">Libadwaita 1.6</span></a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="https://blogs.gnome.org/alicem/files/2024/09/screenshot.png"><img alt="Screenshot showing Shortwave with the now playing bottom sheet and a spinner in the play button, File History &amp; Trash page in Settings, showing 3 button rows, and a notification request alert dialog in Epiphany" class="alignnone size-full wp-image-7695" height="914" src="https://blogs.gnome.org/alicem/files/2024/09/screenshot.png" width="1505"/></a></p>
<p>Well, it’s time for another release.</p>
<p>Last cycle wasn’t particularly exciting, only featuring the new dialogs and a few smaller changes, but this one should be more interesting. So let’s look at what’s new.</p>
<h2>Bottom sheet</h2>
<p><a href="https://blogs.gnome.org/alicem/files/2024/09/bottom-sheets.png"><img alt="Screenshot of libadwaita bottom sheets. On the left, a sheet as a bottom bar, with a &quot;Pull Up Here&quot; label. On the right, an open sheet, with a drag handle and a close button at the top, and a big arrow pointing down in the middle" class="alignnone size-full wp-image-7698" height="667" src="https://blogs.gnome.org/alicem/files/2024/09/bottom-sheets.png" width="852"/></a></p>
<p>Last cycle libadwaita got new dialogs, which can be presented as bottom sheets on mobile, and I mentioned that they will also be available as a standalone widget in future – so <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.BottomSheet.html"><code>AdwBottomSheet</code></a> exists and is public now.</p>
<p>As a standalone widget, bottom sheets work a bit differently from dialogs – they are persistent instead of being destroyed upon closing, more like the sidebar of <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.OverlaySplitView.html"><code>AdwOverlaySplitView</code></a>.</p>
<p>They also have a few new features, such as a drag handle, or a bottom bar presentation. This is useful for apps like music players.</p>
<p><a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.HeaderBar.html"><code>AdwHeaderBar</code></a> also integrates with bottom sheets – it hides the title when used in a bottom sheet with a drag handle.</p>
<h2>Spinner</h2>
<p><a href="https://blogs.gnome.org/alicem/files/2024/09/spinner.gif"><img alt="Recording of the spinner" class="alignnone size-full wp-image-7677" height="96" src="https://blogs.gnome.org/alicem/files/2024/09/spinner.gif" width="96"/></a></p>
<p>Libadwaita also has a new spinner widget – <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.Spinner.html"><code>AdwSpinner</code></a>. It both refreshes visuals and addresses various problems with <a href="https://docs.gtk.org/gtk4/class.Spinner.html"><code>GtkSpinner</code></a>.</p>
<p><code>GtkSpinner</code> is a really simple widget. Both the spinner itself and the animation are set in CSS. The spinner is just a symbolic icon, and the animation is a CSS animation. This approach has a few problems, however.</p>
<p>First, the old spinner has a gradient. Symbolic icons don’t actually support gradients, so it has to resort to dithering, as <b>Jakub Steiner</b> <a href="https://blog.jimmac.eu/2021/how-to-gradient-when-you-cannot/">explained</a> in his blog a few years ago. This works well if the spinner is small enough (16×16 – 32×32), but becomes very noticeable at larger sizes. This means that the spinner didn’t work well for loading screens, or <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.StatusPage.html">status pages</a>.</p>
<p>Meanwhile, CSS animations are entirely disabled when system animations are off. Usually that makes sense, except here it means the spinner freezes, defeating the entire point of having it (indicating that the app isn’t frozen during long operations).</p>
<p>And, while CSS animations are pretty sophisticated, you can only do so much with a single element – so it’s literally a spinning icon. elementary OS does a more interesting thing – it spins it in steps, while the icon consists of 12 dashes, so it looks like they change color instead. Even then, more complex animations are impossible.</p>
<p><code>AdwSpinner</code> avoids all of these issues. Since it’s in libadwaita and not in GTK, it can be more opinionated with regard to styling, so instead of using an icon and CSS, it’s just custom drawing. And since it’s not using CSS animations, it can keep spinning with animations off, and can animate in a more involved way than a simple spinning icon.</p>
<p>It still has a size limit – 64×64 pixels. While it <em>can</em> scale further, we don’t really need larger sizes and capping the size makes it easier to use – to make a loading screen using <code>GtkSpinner</code>, you have to set the <a href="https://docs.gtk.org/gtk4/property.Widget.halign.html"><code>:halign</code></a> and <a href="https://docs.gtk.org/gtk4/property.Widget.valign.html"><code>:valign</code></a> properties to <code>CENTER</code>, as well as <a href="https://docs.gtk.org/gtk4/property.Widget.width-request.html"><code>:width-request</code></a> and <a href="https://docs.gtk.org/gtk4/property.Widget.height-request.html"><code>:height-request</code></a> properties to 32. If you fail to do these steps, the spinner will either be too large, or too small respectively:</p>

<a href="https://blogs.gnome.org/alicem/files/2024/09/spinner-too-big.png"><img alt="Screenshot of a window with a giant spinner that takes up the entire window" class="attachment-full size-full" height="522" src="https://blogs.gnome.org/alicem/files/2024/09/spinner-too-big.png" width="522"/></a>
<a href="https://blogs.gnome.org/alicem/files/2024/09/spinner-too-small.png"><img alt="Screenshot of a window with a tiny 16&#xD7;16 spinner in the middle" class="attachment-full size-full" height="522" src="https://blogs.gnome.org/alicem/files/2024/09/spinner-too-small.png" width="522"/></a>

<p>Meanwhile if you just put an <code>AdwSpinner</code> into a large bin, it will look right by default.</p>
<p><a href="https://blogs.gnome.org/alicem/files/2024/09/spinner-correct.png"><img alt="Screenshot of a window with a 64&#xD7;64 spinner" class="alignnone size-full wp-image-7716" height="522" src="https://blogs.gnome.org/alicem/files/2024/09/spinner-correct.png" width="522"/></a></p>
<p>Oh, and <code>GtkSpinner</code> is invisible by default and you have to set the <a href="https://docs.gtk.org/gtk4/property.Spinner.spinning.html"><code>:spinning</code></a> property to true as well. This made sense back in the age of foot and dinosaur spinners, where the spinner would stay in place when not animating, but that’s not really a thing anymore.</p>

<a href="https://blogs.gnome.org/alicem/files/2024/09/spinner-foot.gif"><img alt="Spinner in Nautilus 2.24.1" class="attachment-full size-full" height="186" src="https://blogs.gnome.org/alicem/files/2024/09/spinner-foot.gif" width="177"/></a>
<a href="https://blogs.gnome.org/alicem/files/2024/09/spinner-mozilla.gif"><img alt="Spinner in Mozilla 1.7.13" class="attachment-full size-full" height="186" src="https://blogs.gnome.org/alicem/files/2024/09/spinner-mozilla.gif" width="177"/></a>

<p>(though Nautilus wasn’t actually using <code>GtkSpinner</code>)</p>
<p>It also didn’t help that until this cycle, <code>GtkSpinner</code> would continue to consume CPU cycles even when not visible if the <code>:spinning</code> property is left enabled, so you had to start the spinner in the <a href="https://docs.gtk.org/gtk4/signal.Widget.map.html"><code>::map</code></a> signal and stop it in <a href="https://docs.gtk.org/gtk4/signal.Widget.unmap.html"><code>::unmap</code></a>. That is fixed now, but it was a major source of lag in, say, Epiphany in the past (which had a spinner in every tab, another spinner in every mobile tab switcher row and another one in the floating bar that shows URLs on hover, copied from Nautilus).</p>
<h3>Spinner paintable</h3>
<p>In addition to <code>AdwSpinner</code>, there’s also <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.SpinnerPaintable.html"><code>AdwSpinnerPaintable</code></a>. It can be used with <a href="https://docs.gtk.org/gtk4/class.Image.html"><code>GtkImage</code></a>, any other place that accepts paintables (such as status pages) or just manually drawn. It is a bit more awkward to use than the widget, as it needs to reference another widget in order to animate (since paintables cannot access the frame clock on their own), but it allows to use spinners in contexts that wouldn’t be possible otherwise.</p>
<p><code>AdwStatusPage</code> even has a special style for spinner paintable – similar to the <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/style-classes.html#compact-status-page"><code>.compact</code></a> style, but applied automatically.</p>
<p><a href="https://blogs.gnome.org/alicem/files/2024/09/Screenshot-From-2024-09-11-13-00-35.png"><img alt="Screenshot of the spinner page in libadwaita demo, showing a status page with a spinner paintable" class="alignnone size-full wp-image-7797" height="522" src="https://blogs.gnome.org/alicem/files/2024/09/Screenshot-From-2024-09-11-13-00-35.png" width="522"/></a></p>
<h2>Button row</h2>
<p><a href="https://blogs.gnome.org/alicem/files/2024/09/button-rows.png"><img alt="Screenshot of three button rows in libadwaita demo. The first one says &quot;Add Input Source&quot; and has a plus icon on the left, the second says &quot;Add Calendar&quot; and has an arrow on the right, the third one says &quot;Delete Event&quot; and is marked as destructive, so has red text" class="alignnone size-full wp-image-7731" height="222" src="https://blogs.gnome.org/alicem/files/2024/09/button-rows.png" width="461"/></a></p>
<p>Another widget we have now is <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.ButtonRow.html"><code>AdwButtonRow</code></a> – a list row that looks more or less like a button. It has a label, optionally icons on either side, and can use destructive and suggested style classes.</p>
<p>This pattern isn’t new – it has been used in mockups for a while (at least as early as 2021) – but it varied quite a bit between different mockups and implementations and so having a standard widget for it wasn’t viable. This cycle <a href="https://jamie.garden/"><b>Jamie Gravendeel</b></a> and <a href="https://kramo.page/"><b>kramo</b></a> took time to standardize the existing designs into a tangible proposal – so it exists as a standard widget now.</p>
<p>Most of the time these rows aren’t meant to be linked together, so <code>AdwPreferencesGroup</code> has a new property <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/property.PreferencesGroup.separate-rows.html"><code>:separate-rows</code></a>. When enabled, the rows within will appear separately. This is mostly useful for button rows, but also e.g. entry rows. When not using <code>AdwPreferencesGroup</code>, the same effect can be achieved by using the <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/style-classes.html#boxed-lists-cards"><code>.boxed-list-separate</code></a> style class instead of <code>.boxed-list</code>.</p>
<h2>Multi-layout view</h2>
<p>Libadwaita 1.4 introduced <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.Breakpoint.html"><code>AdwBreakpoint</code></a>, which allowed to easily set properties on window size changes. However, a lot of apps need layout changes that can’t be expressed via simple properties – say, switching between a sidebar and a bottom sheet. While it is possible to do it programmatically anyway, it’s fairly involved and not a lot of apps went to those lengths.</p>
<p>Back then I also prototyped a widget for automatically reparenting children between different layouts via using a property <a href="https://blogs.gnome.org/alicem/2023/06/15/rethinking-adaptivity/#dynamic-layouts">mentioned</a> a future widget for automatically reparenting children between different layouts, and now it’s finished and available for use as <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.MultiLayoutView.html"><code>AdwMultiLayoutView</code></a>.</p>
<p>It has changed somewhat since the prototype, e.g. it doesn’t dynamically create or destroy layouts anymore, just parents/unparents them, but the gist is still the same:</p>
<ul>
<li>Put multiple <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.Layout.html"><code>AdwLayout</code></a>s into a multi-layout view</li>
<li>Put one or more <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.LayoutSlot.html"><code>AdwLayoutSlot</code></a> into each layout, give them IDs</li>
<li>Define children matching those IDs</li>
</ul>
<p>Then those children will be placed into the slots for the current layout. When you switch the layout, they will be reparented into slots from that layout instead.</p>
<p>So now it’s possible to define completely different layouts for desktop and mobile entirely via UI files.</p>
<h2>CSS variables and colors</h2>
<p>I’ve already talked about this in a lot of detail in my <a href="https://blogs.gnome.org/alicem/2024/06/07/css-happenings/">last blog post</a>, but GTK has a lot of new CSS goodies, and libadwaita 1.6 makes full use of them.</p>
<p>To recap: GTK now supports CSS variables, as well as <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/color-mix"><code>color-mix()</code></a>, <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_colors/Relative_colors">relative colors</a>, as well as new color spaces, most importantly <a href="https://bottosson.github.io/posts/oklab/">Oklab and Oklch</a>.</p>
<p>Libadwaita now provides CSS variables for all of its old named colors, with <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/css-variables.html">a docs page</a> to go with it, as well as new variables: <code>--dim-opacity</code>, <code>--disabled-opacity</code>, <code>--border-opacity</code> and <code>--window-radius</code>.</p>
<p>This also allowed to have matching focus ring color on <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/style-classes.html#destructive-action"><code>.destructive-action</code></a> buttons, as well as matching accent color for the <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/style-classes.html#colors"><code>.error</code>, <code>.warning</code> and <code>.success</code></a> style classes. And because overriding accent color for a specific widget is now possible, <code>.opaque</code> button style class has been deprecated in favor of overriding accent colors on <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/style-classes.html#suggested-action"><code>.suggested-action</code></a>. Meanwhile, the white accent color of <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/style-classes.html#osd"><code>.osd</code></a> is now more reliable and automatically works for custom widgets, instead of trying (and often failing) to manually override it for every standard widget.</p>
<p>I mentioned that it might be possible to generate <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/css-variables.html#standalone-colors">standalone accent/error/etc colors</a> from their respective background colors. However, the question was how to make that automatic, so at the time we didn’t actually integrate that. Now it is integrated, though it’s not completely automatic – only for <code>:root</code>.</p>
<p>Specifically, there’s a new variable: <code>--standalone-color-oklab</code>, corresponding to the correct color transformation for the current style.</p>
<p>So, when overriding accent color for a specific widget, there is a bit of boilerplate to copy:</p>
<pre style="font-size: large;">my-widget {
  --accent-bg-color: var(--accent-purple);
  --accent-color: oklab(from var(--accent-bg-color) var(--standalone-color-oklab));
}
</pre>
<p>It’s still an improvement over calculating the color manually, both for light and dark styles (which a lot of apps didn’t do at all, resulting in poor contrast), so still worth it. Maybe one day we’ll be able to make it completely automatic – e.g. by ensuring that using variables with wildcards doesn’t regress performance.</p>
<p>Meanwhile <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/func.rgba_to_standalone.html"><code>adw_rgba_to_standalone()</code></a> allows to do the same thing programmatically.</p>
<h2>Accent colors</h2>
<p><a href="https://blogs.gnome.org/alicem/files/2024/09/accent-colors.png"><img alt="Screenshot of GNOME Settings, Appearance page, showing the new accent color selector below the default/dark row. It has the following 9 colors: blue, teal, green, yellow, orange, red, pink, purple, slate grey." class="alignnone size-full wp-image-7740" height="866" src="https://blogs.gnome.org/alicem/files/2024/09/accent-colors.png" width="1073"/></a></p>
<p>Another big feature is system accent color support. While it’s not a strictly libadwaita change, this is the developer-facing part, so it makes sense to talk about it here.</p>
<p>Behind the scenes it’s using the <a href="https://flatpak.github.io/xdg-desktop-portal/docs/doc-org.freedesktop.portal.Settings.html">settings portal</a> which provides a standardized key for the system accent color. Many other environments support it as well, so libadwaita apps will follow their accent color preferences too, while non-GNOME apps that follow the preference will follow it on GNOME too. Note that while the portal exposes arbitrary sRGB colors, libadwaita will pick the closest color from a list of nine colors, as visible on the screenshot above. This is done in the Oklch color space, mostly based on hue, so should work even for really dull colors.</p>
<p>Accent colors are also supported when running on Windows and macOS, and like with the color scheme and high contrast, the libadwaita page in GTK inspector allows to toggle the system accent color now.</p>
<p><a href="https://blogs.gnome.org/alicem/files/2024/09/Screenshot-From-2024-09-11-13-46-26.png"><img alt="Screenshot of the libadwaita page in GTK inspector, showing the new accent color picker" class="alignnone size-full wp-image-7824" height="826" src="https://blogs.gnome.org/alicem/files/2024/09/Screenshot-From-2024-09-11-13-46-26.png" width="891"/></a></p>
<p>Apps are still free to set their own accent color. CSS always takes priority over the system accent.</p>
<p>A lot of people helped push this over the finish line, with particular thanks to <b>Jamie Murphy</b>, <a href="https://kramo.page/"><b>kramo</b></a> and <a href="https://jamie.garden/"><b>Jamie Gravendeel</b></a>.</p>
<h3>API</h3>
<p><a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.StyleManager.html"><code>AdwStyleManager</code></a> provides new properties for fetching the system color – <code>:accent-color</code> and <code>:accent-color-rgb</code>, as well as <code>:system-supports-accent-colors</code> for querying whether the system has accent color preferences – same as for color scheme.</p>
<p>The <code>:accent-color</code> property returns a color from the <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/enum.AccentColor.html"><code>AdwAccentColor</code></a> enum, so that individual colors can be special cased (say, when using bitmap assets). This color can be converted both to background color RGBA (using <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/type_func.AccentColor.to_rgba.html"><code>adw_accent_color_to_rgba()</code></a>) and to standalone color (<a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/type_func.AccentColor.to_standalone_rgba.html"><code>adw_accent_color_to_standalone_rgba()</code></a>).</p>
<p>All of these colors use white foreground color, so there’s no API for fetching it, at least for now.</p>
<p>Note that <code>:accent-color-rgba</code> will still return the system color even if the app overrides its accent color using CSS. It only exists for convenience and is equivalent to calling <code>adw_accent_color_to_rgba()</code> on the <code>:accent-color</code> value.</p>
<p>While we still don’t have a general replacement for deprecated <a href="https://docs.gtk.org/gtk4/method.StyleContext.lookup_color.html"><code>gtk_style_context_lookup_color()</code></a>, the new accent color API can replace at least some of its uses.</p>
<p>On CSS side, there are <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/css-variables.html#accent-colors">new variables</a> corresponding to each accent color: <code>--accent-blue</code> for blue and so on. Additionally, every system color, along with their standalone colors for both light and dark, is documented and can be used as a reference.</p>
<h3>Destructive buttons</h3>
<p><a href="https://blogs.gnome.org/alicem/files/2024/09/destructive-buttons.png"><img alt="Screenshot of the old and new destructive buttons side by side, with a solid red button with white text saying &quot;Before&quot; and a half-transparent red background with darker red text saying &quot;After&quot;" class="alignnone size-full wp-image-7746" height="100" src="https://blogs.gnome.org/alicem/files/2024/09/destructive-buttons.png" width="307"/></a></p>
<p>Having accent color that’s not always blue means having to rethink other style choices. In particular, <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/style-classes.html#destructive-action"><code>.destructive-action</code></a> buttons were just a red version of <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/style-classes.html#suggested-action"><code>.suggested-action</code></a>, same as in GTK3. This was already questionable from accessibility perspective, but breaks entirely with accent colors, since suggested buttons would look exactly same as a destructive ones with red accent. And so <code>.destructive-action</code> has a distinct style now, less prominent than suggested.</p>
<h3>Alert dialogs</h3>
<figure class="wp-caption alignnone" id="attachment_7749" style="width: 926px;"><a href="https://blogs.gnome.org/alicem/files/2024/09/alert-dialogs.png"><img alt="Screenshot of the old and new alert dialogs side by side, using red as system accent color. Both dialogs say &quot;Save Changes? Open document contains unsaved changes. Changes which are not saved will be permanently lost&quot;, as well as 3 buttons: Cancel, Discard, Save. Discard is marked as destructive, Save as suggested, Cancel is unmarked. The old dialog has them edge to edge and flat, arranged horizontally, with separators between and above them, wit the discard button having red text instead of black, and save button also having red text instead of black. The new dialog is more round, the buttons are arranged vertically &#x2013; save has red background and white text, discard has transparent black background with darker red text and cancel has transparent grey background and black text" class="size-full wp-image-7749" height="445" src="https://blogs.gnome.org/alicem/files/2024/09/alert-dialogs.png" width="926"/></a><figcaption class="wp-caption-text" id="caption-attachment-7749">Old and new alert dialogs side by side</figcaption></figure>
<p>Another area that needed updates was <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.AlertDialog.html"><code>AdwAlertDialog</code></a> – it was also using color for differentiating suggested and destructive buttons.</p>
<p>Coincidentally, the alert dialog style went almost unchanged from GTK3 days, and looked rather out of place with the rest of the platform. So <a href="https://kramo.page/"><b>kramo</b></a> came up with an updated design.</p>
<p><code>AdwMessageDialog</code> and <code>GtkAlertDialog</code> received the same style, or at least an approximation – it’s not possible to replicate it entirely in GTK dialogs. Even though neither is recommended for use (when using libadwaita, anyway – nothing wrong with using <code>GtkAlertDialog</code> in plain GTK), regressing apps that aren’t fully up to date with the platform wouldn’t be very good.</p>
<h3>Adapting apps</h3>
<p>Accent colors are supported automatically, and in most cases apps don’t need any changes to make use of them. However, here’s a checklist to ensure it works well:</p>
<ul>
<li> Make use of the accent color variables in custom CSS, like <code>--accent-bg-color</code>. Using the old named colors like <code>@accent_bg_color</code> works as well. Don’t assume accent color will be blue.</li>
<li>Conversely, don’t use accent color when you mean blue. We have variables like <code>--blue-3</code> for that – or even <code>--accent-blue</code>.</li>
<li>When using accent color in custom drawing (say, drawing a graph), make sure to redraw it when <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/property.StyleManager.accent-color.html"><code>AdwStyleManager:accent-color</code></a> value changes – same as for color scheme and high contrast.</li>
<h2>Deprecations</h2>
<p>Last cycle we introduced new dialog widgets that are based on <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.Dialog.html"><code>AdwDialog</code></a> rather than <a href="https://docs.gtk.org/gtk4/class.Window.html"><code>GtkWindow</code></a>. However, that happened right at the end of the cycle, without giving apps a lot of time to port their existing dialogs. Because of that, the old widgets (<code>AdwMessageDialog</code>, <code>AdwPreferencesWindow</code>, <code>AdwAboutWindow</code>) weren’t deprecated and I mentioned that they will be deprecated in future instead. So, they are now.</p>
<p>If you haven’t migrated to the new dialogs yet, see the <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/migrating-to-adaptive-dialogs.html">migration guide</a> for how to do so.</p>
<h2>Other changes</h2>
<p>As always, there are smaller changes that don’t warrant their own sections, so let’s look at those:</p>
<ul>
<li><a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.Window.html"><code>AdwWindow</code></a> and <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.ApplicationWindow.html"><code>AdwApplicationWindow</code></a> now have a default minimum size (360×200 px), meaning you don’t have to set it manually to use breakpoints or dialogs anymore. Apps can still override it if they need a different size, but it works out of the box now.</li>
<li><code>AdwComboRow</code> now has the <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/property.ComboRow.header-factory.html"><code>:header-factory</code></a> and <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/property.ComboRow.search-match-mode.html"><code>:search-match-mode</code></a> properties, following <a href="https://docs.gtk.org/gtk4/class.DropDown.html"><code>GtkDropDown</code></a>. So it’s now possible to, say, have separators in the dropdown list.</li>
<li><code>AdwEntryRow</code> got the <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/property.EntryRow.max-length.html"><code>:max-length</code></a> property, matching <a href="https://docs.gtk.org/gtk4/class.Entry.html"><code>GtkEntry</code></a>.</li>
<li><code>AdwPreferencesPage</code> description now can be centered, using the <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/property.PreferencesPage.description-centered.html"><code>:description-centered</code></a> property.</li>
<li>Documentation now lists available style classes for each widget, in addition to the centralized list of style classes.</li>
<li><a href="https://bewares.it/"><b>Markus Göllnitz</b></a> made the <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/style-classes.html#sidebars"><code>.navigation-sidebar</code></a> style class support <a href="https://docs.gtk.org/gtk4/class.FlowBox.html"><code>GtkFlowBox</code></a> and <a href="https://docs.gtk.org/gtk4/class.GridView.html"><code>GtkGridView</code></a>, as seen in <a href="https://gitlab.gnome.org/GNOME/Incubator/papers/">Papers</a>.</li>
<li><a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/style-classes.html#property-rows">Property rows</a> now support the <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/style-classes.html#typography-styles"><code>.monospace</code></a> style class.
</li>
<li><a href="https://docs.gtk.org/gtk4/class.TextView.html"><code>GtkTextView</code></a> now supports the <a href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/style-classes.html#inline"><code>.inline</code></a> style class, removing its background and resetting its foreground color. This allows to use it in contexts like cards.</li>
</ul>
<h2>Future</h2>
<p>As usual, there are changes that didn’t make it this cycle and will land the next cycle instead. Most notably, the old <a href="https://gitlab.gnome.org/GNOME/libadwaita/-/merge_requests/727">toggle groups branch</a> by <b>Maximiliano</b> is finally finished and will land early next cycle.</p>
<p><a href="https://blogs.gnome.org/alicem/files/2024/09/toggle-groups.png"><img alt="Screenshot of libadwaita demo showing various toggle groups" class="alignnone size-full wp-image-7761" height="733" src="https://blogs.gnome.org/alicem/files/2024/09/toggle-groups.png" width="889"/></a></p>
<hr/>
<p>Big thanks to <a href="https://www.sovereigntechfund.de/tech/gnome"><b>STF</b></a> for funding a lot of this work (GTK CSS improvements, bottom sheets, finishing multi-layout view and toggle groups, general maintenance), as well as people organizing the initiative and all contributors who made this release happen.</p></ul></div>
    </content>
    <updated>2024-09-13T15:32:47Z</updated>
    <published>2024-09-13T15:32:47Z</published>
    <category term="libadwaita"/>
    <author>
      <name>Alice Mikhaylenko</name>
    </author>
    <source>
      <id>https://blogs.gnome.org/alicem</id>
      <link href="https://blogs.gnome.org/alicem/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blogs.gnome.org/alicem" rel="alternate" type="text/html"/>
      <subtitle>Alice Mikhaylenko's GNOME blog</subtitle>
      <title>Just another blog</title>
      <updated>2024-09-17T13:26:24Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.jimmac.eu/2024/weyland</id>
    <link href="https://blog.jimmac.eu/2024/weyland/" rel="alternate" title="Weyland" type="text/html"/>
    <title xml:lang="en-US">Weyland</title>
    <content type="xhtml" xml:lang="en-US"><div xmlns="http://www.w3.org/1999/xhtml"><p><img alt="Weyland Yutani Corp -- Building Better Worlds" src="https://blog.jimmac.eu/2024/weyland/weyland.webp"/></p>

<p>A couple of weeks ago, I went to see <em>Alien: Romulus</em>. While many of my friends were disappointed, I actually enjoyed it. In fact, it exceeded my expectations — mainly because I didn’t expect much! :)</p>

<p>Fede Alvarez delivered exactly what producer Ridley Scott asked of him, leaning heavily on the nostalgia of the original masterpiece while skirting the edge of a reboot. The world of <em>Prometheus</em> wasn’t ignored, but purposedly avoided referencing too deeply.</p>

<p>The dystopian world of corporate feudalism set a tone even darker than the original, to the point where the xenomorph didn’t seem like the worst thing that could happen. I’m still holding out hope for 90-minute movies as the gold standard, but the two-hour runtime was manageable—though my aging buttocks may disagree. The slow-burn first act was actually the most enjoyable part, as that’s where the fresh world-building took center stage. Even as the familiar plot unfolded, Alvarez delivered memorable suspense and action scenes.</p>

<p>Of course, it’s never going to feel the same as seeing <em>Alien</em> or <em>Aliens</em> as a teenager. I can’t fully dive into my minor criticisms without spoilers, but let’s just say the movie understood that “less is more” — except in one area. Other than that, <em>Alien: Romulus</em> proved that going to the movies can still be a pretty great experience.</p>

<p>★★★★☆</p></div>
    </content>
    <updated>2024-09-12T22:00:00Z</updated>
    <published>2024-09-12T22:00:00Z</published>
    <category term="movie"/>
    <author>
      <name>Jakub Steiner</name>
      <email>jimmac@gmail.com</email>
    </author>
    <source>
      <id>https://blog.jimmac.eu/feed.xml</id>
      <author>
        <name>Jakub Steiner</name>
        <email>jimmac@gmail.com</email>
      </author>
      <link href="https://blog.jimmac.eu/feed.xml" rel="self" type="application/atom+xml"/>
      <link href="https://blog.jimmac.eu/" rel="alternate" type="text/html"/>
      <subtitle xml:lang="en-US">Random musings of a semi-sane designer from lesser Europe.</subtitle>
      <title xml:lang="en-US">Even a Stopped Clock</title>
      <updated>2024-09-24T10:19:29Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-5968355124473522212.post-2649479026746196226</id>
    <link href="https://nibblestew.blogspot.com/feeds/2649479026746196226/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/>
    <link href="https://nibblestew.blogspot.com/2024/09/on-m-and-s-type-processes-in-software.html#comment-form" rel="replies" title="0 Comments" type="text/html"/>
    <link href="https://www.blogger.com/feeds/5968355124473522212/posts/default/2649479026746196226" rel="edit" type="application/atom+xml"/>
    <link href="https://www.blogger.com/feeds/5968355124473522212/posts/default/2649479026746196226" rel="self" type="application/atom+xml"/>
    <link href="https://nibblestew.blogspot.com/2024/09/on-m-and-s-type-processes-in-software.html" rel="alternate" title="On M and S Type Processes in Software Development" type="text/html"/>
    <title>On M and S Type Processes in Software Development</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I wrote a post about so called "M type" and "S type" processes in software development. Unfortunately it discusses the concept of human sexuality. Now, just to be sure, it does not have any of the "good stuff" as the kids might say. Nonetheless this blog is syndicated in places where such topics might be considered controversial or even unacceptable.</p><p>Thus I can't really post the text here. Those of you who are of legal age (whatever that means in your jurisdiction) and out of their own free will want to read such material, can access the PDF version of the article via <a href="https://www.dropbox.com/scl/fi/0jf0jkqfo0lecum0v3b9x/esandem.pdf?rlkey=gaydv7gxx53q8qgg8uf1ul5yv&amp;st=9wem8kaa&amp;dl=0">this link</a>.</p></div>
    </content>
    <updated>2024-09-11T21:33:00Z</updated>
    <published>2024-09-11T21:33:00Z</published>
    <author>
      <name>Jussi</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/03370287682352908292</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-5968355124473522212</id>
      <author>
        <name>Jussi</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/03370287682352908292</uri>
      </author>
      <link href="https://nibblestew.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="https://www.blogger.com/feeds/5968355124473522212/posts/default" rel="self" type="application/atom+xml"/>
      <link href="https://nibblestew.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <link href="https://www.blogger.com/feeds/5968355124473522212/posts/default?start-index=26&amp;max-results=25" rel="next" type="application/atom+xml"/>
      <subtitle>A gathering of development thoughts of Jussi Pakkanen. Some of you may know him as the creator of the Meson build system. jpakkane at gmail dot com</subtitle>
      <title>Nibble Stew</title>
      <updated>2024-10-12T12:35:47Z</updated>
    </source>
  </entry>

  <entry>
    <id>https://medium.com/p/3ff7109e3ea7</id>
    <link href="https://medium.com/@larrytabeh/usability-study-report-for-loup-showtime-and-decibels-3ff7109e3ea7?source=rss-b8d7c4c73a7b------2" rel="alternate" type="text/html"/>
    <title>Usability Study Report for Loup, Showtime, And Decibels</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>📢The <strong>Usability Study Report for Loup, Showtime, and Decibels</strong>, conducted during the May to August Outreachy internship round, is now available!</p><p>🚀 Check it out here: <a href="https://lnkd.in/gRZs5VR4">https://lnkd.in/gRZs5VR4</a></p><img alt="" height="1" src="https://medium.com/_/stat?event=post.clientViewed&amp;referrerSource=full_rss&amp;postId=3ff7109e3ea7" width="1"/></div>
    </content>
    <updated>2024-09-09T11:10:10Z</updated>
    <published>2024-09-09T11:10:10Z</published>
    <author>
      <name>Tamnjong Larry Tabeh</name>
    </author>
    <source>
      <id>https://medium.com/@larrytabeh?source=rss-b8d7c4c73a7b------2</id>
      <logo>https://cdn-images-1.medium.com/fit/c/150/150/1*XwGZo9W2MKopr842_uY5ZA.jpeg</logo>
      <link href="https://medium.com/@larrytabeh?source=rss-b8d7c4c73a7b------2" rel="alternate" type="text/html"/>
      <link href="https://medium.com/@larrytabeh/feed" rel="self" type="application/rss+xml"/>
      <link href="http://medium.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Stories by Tamnjong Larry Tabeh on Medium</subtitle>
      <title>Stories by Tamnjong Larry Tabeh on Medium</title>
      <updated>2024-10-17T00:04:44Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-5620128670216603593.post-2736795268675766236</id>
    <link href="https://ml4711.blogspot.com/feeds/2736795268675766236/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/>
    <link href="https://ml4711.blogspot.com/2024/09/maps-and-gnome-47.html#comment-form" rel="replies" title="0 Comments" type="text/html"/>
    <link href="https://www.blogger.com/feeds/5620128670216603593/posts/default/2736795268675766236" rel="edit" type="application/atom+xml"/>
    <link href="https://www.blogger.com/feeds/5620128670216603593/posts/default/2736795268675766236" rel="self" type="application/atom+xml"/>
    <link href="https://ml4711.blogspot.com/2024/09/maps-and-gnome-47.html" rel="alternate" title="Maps and GNOME 47" type="text/html"/>
    <title>Maps and GNOME 47</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><div class="separator" style="clear: both;"/><div class="separator" style="clear: both;"/><div class="separator" style="clear: both;"/><div class="separator" style="clear: both;"/><div class="separator" style="clear: both;"/><div class="separator" style="clear: both;"/><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkO7bKpjJ4sVrpmQ0ihPY2nIHWVbvsWBcJrNUalVoC_jKFOd2Z-pUfYsevpiIR37bH9ZUOZhG0AR36q2rxGvxhd7iOf-qSrrCGpfY6p9VQl2niQPXiThJRNkuI7SFbQrVgYmQTUQaH3RN0VCd4aeHkLhVmE-WzNNKMxYyd6Fss1uRt7QdFRzrpAy5U/s1600/about-47.png" style="margin-left: auto; margin-right: auto;"/></td></tr><tr><td class="tr-caption" style="text-align: center;"><br/></td></tr></tbody></table><div class="separator" style="clear: both;"> </div><div class="separator" style="clear: both;">As it's now aproaching mid-September and the autumn release of GNOME, so is there also a new release of Maps approaching for GNOME 47.</div><div class="separator" style="clear: both;"> </div><h1 class="separator" style="clear: both; text-align: center;">Switch to Vector-based Map</h1><div class="separator" style="clear: both; text-align: left;">The biggest change since last release is that we now use the vector-based map by default  and the old raster map has also been retired since we wanted to move forward with things like enabling, and relying on clickable POIs directly in the map view so we could the remove the old tedious “What's here?” context menu doing a reverse geocoding to get details about a place (which is also a bit hit-and-miss with regards to how close to where you point the actual result is).</div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;">Apart from this other benefits we get (and this has already been mentioned in earlier posts)  localized names (when tagged in OpenStreetMap) and finally a proper dark mode with our new GNOME map style.</div><div class="separator" style="clear: both; text-align: left;"><br/></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUs5RAE9eltItD4cBszKOQd4hjlEB3aZx5yanEXBq7iyV7BAhkWdduT-2LXy_YX1OIZDRsKWYLrdkBtInOpbeRI_w-uKPBMpfksQ8LRUyhbzI-cEpm3yPZ81Xd10meDJgl6iFVft4REHAq4kCQdJ1HBvdncMhkJ3CD0DsNTH6FCrpFpBb-pR6y1k-p/s1572/light-47.png" style="margin-left: auto; margin-right: auto;"><img border="0" height="462" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUs5RAE9eltItD4cBszKOQd4hjlEB3aZx5yanEXBq7iyV7BAhkWdduT-2LXy_YX1OIZDRsKWYLrdkBtInOpbeRI_w-uKPBMpfksQ8LRUyhbzI-cEpm3yPZ81Xd10meDJgl6iFVft4REHAq4kCQdJ1HBvdncMhkJ3CD0DsNTH6FCrpFpBb-pR6y1k-p/w640-h462/light-47.png" width="640"/></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Light (default) theme variant of the map in 47<br/></td></tr></tbody></table><br/><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgMSDSxYDhy2_CAxLizJi0xxMhUsmXEz5-v4f0IFmLBb7HqmvevTFiJ1UEASxbY9T9GJXzC9hzWJEWdj21U2DT80fMpekqEXBW4nxgJuCG_J28CDwZ1ACjb-fTfSrYBX7ASYkwnyu9pxZCoG5rH_EX0aWBACdTJbkxV9nfx12NoPciwfxiRo5SEhlN/s1572/dark-47.png" style="margin-left: auto; margin-right: auto;"><img border="0" height="462" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgMSDSxYDhy2_CAxLizJi0xxMhUsmXEz5-v4f0IFmLBb7HqmvevTFiJ1UEASxbY9T9GJXzC9hzWJEWdj21U2DT80fMpekqEXBW4nxgJuCG_J28CDwZ1ACjb-fTfSrYBX7ASYkwnyu9pxZCoG5rH_EX0aWBACdTJbkxV9nfx12NoPciwfxiRo5SEhlN/w640-h462/dark-47.png" width="640"/></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Dark theme variant of the map in 47</td><td class="tr-caption" style="text-align: center;"><br/></td></tr></tbody></table><h2 class="separator" style="clear: both; text-align: center;">Redesigned Search Bar</h2><div class="separator" style="clear: both; text-align: left;">The “explore” button to open the search for nearby POIs by category menu has now been integrated into the entry to avoid a theme issue when using the linked button style where the rounded corners disappears on the “other side” when the results popover is showing.</div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_MdMLxDPmNwzkAS2D22AI0YMz9t76DWDPgI0VrMdCcfxxy4wCdAx7s8PpWAVfG95RODPnk3xCiNfKkSdpuO-agR5rxEKMKGWiDgkxWF9acIr-Rzh2cwJjMpNte37ABmlNbIa0dBNeF-plU9xaL3Aycn3BhbdYaBuR-dNltQOJ7nmo98tpVnPdhc7o/s651/searchbar-integrated.png" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_MdMLxDPmNwzkAS2D22AI0YMz9t76DWDPgI0VrMdCcfxxy4wCdAx7s8PpWAVfG95RODPnk3xCiNfKkSdpuO-agR5rxEKMKGWiDgkxWF9acIr-Rzh2cwJjMpNte37ABmlNbIa0dBNeF-plU9xaL3Aycn3BhbdYaBuR-dNltQOJ7nmo98tpVnPdhc7o/s16000/searchbar-integrated.png"/></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Search bar with explore button<br/></td></tr></tbody></table><br/> This also looks a bit sleeker I think…</div><div class="separator" style="clear: both; text-align: left;"><br/></div><h1 class="separator" style="clear: both; text-align: center;">Improved Public Transit Routing</h1><div class="separator" style="clear: both; text-align: left;">Public transit routing is now using the Transitous project (<a href="https://transitous.org">https://transitous.org</a>) to provide transit routing for new regions. And as this is a crowd sourcing initiativ you can also help out by adding additional missing GTFS feeds to the project and it should automatically get supported by Maps.</div><div class="separator" style="clear: both; text-align: left;">For the time being, the regions we already supported by third-party APIs (such as Resrobot for Sweden, and OpenData.ch for Switzerland) will still use those providers to avoid possible regressions. It also gives us some leeway to improve MOTIS (the backend used by Transitous). The implementation in Maps also lacks e.g. support for specifying via locations.</div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCn_jA6L0DQu4go_sZximV3BYS9UzUaWgWadtEgzICMSxwHWMS00I9wBrOe2YpFdtbzRr15mHRnnn9VJmyFERyyyUhS96pdG8Z57yiquQsobccYaWeiCvuD8Y7jL_NU654Nk7kXNWNOi43Oo13wUbl-6_qOqZsZ9iYocw-GTj_6lN3xVMVTGZqcXw-/s1643/transitous-prag.png" style="margin-left: auto; margin-right: auto;"><img border="0" height="474" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCn_jA6L0DQu4go_sZximV3BYS9UzUaWgWadtEgzICMSxwHWMS00I9wBrOe2YpFdtbzRr15mHRnnn9VJmyFERyyyUhS96pdG8Z57yiquQsobccYaWeiCvuD8Y7jL_NU654Nk7kXNWNOi43Oo13wUbl-6_qOqZsZ9iYocw-GTj_6lN3xVMVTGZqcXw-/w640-h474/transitous-prag.png" width="640"/></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Showing some travel itinerary options in Prague<br/></td></tr></tbody></table><br/><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBFjUoPEptOMTwcioub92zCKQBGYAXPjkOv7EeOQnk5_TE2hkakWDSgxHyP-ePO0TIlxiikSzjR3PQuFAKfuOgZpju9hz2H5vyASN7TXphetr8BKrJfxsB4GRy8IaMVn8uuPDHDyZ0JbPY-FGEDM0svdthzb3oeIvDphH2CBK55rvLKBaPFMRIfYNv/s1643/lund-hamburg.png" style="margin-left: auto; margin-right: auto;"><img border="0" height="474" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBFjUoPEptOMTwcioub92zCKQBGYAXPjkOv7EeOQnk5_TE2hkakWDSgxHyP-ePO0TIlxiikSzjR3PQuFAKfuOgZpju9hz2H5vyASN7TXphetr8BKrJfxsB4GRy8IaMVn8uuPDHDyZ0JbPY-FGEDM0svdthzb3oeIvDphH2CBK55rvLKBaPFMRIfYNv/w640-h474/lund-hamburg.png" width="640"/></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Showing a sample of an itinerary from Lund, Sweden to Hamburg, Germany<br/></td></tr></tbody></table><br/><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqY4GsFAL_T479Eyc_Vgp7VUdGIJ0UYsbW5yYqiXzJYfHzfR6U9N_UEGmfkmrPzThmFaRmL8eBO_5-J4W3IG9dN1j7HwiE7t_nTUBB5NbVWIWfs_-VjabcuD1tM_TTeKM6iOEk374VEccDZKW87B0Oc1PFmceWlHef0cKU18Aygo9p3aSYWxfQ81uz/s1643/denver.png" style="margin-left: auto; margin-right: auto;"><img border="0" height="474" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqY4GsFAL_T479Eyc_Vgp7VUdGIJ0UYsbW5yYqiXzJYfHzfR6U9N_UEGmfkmrPzThmFaRmL8eBO_5-J4W3IG9dN1j7HwiE7t_nTUBB5NbVWIWfs_-VjabcuD1tM_TTeKM6iOEk374VEccDZKW87B0Oc1PFmceWlHef0cKU18Aygo9p3aSYWxfQ81uz/w640-h474/denver.png" width="640"/></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Showing a sample of an itinerary in Denver, Colorado<br/></td></tr></tbody></table><br/><h1 style="text-align: center;"> Updated Highway Shield Localizations<br/></h1></div><div class="separator" style="clear: both; text-align: left;">Thanks to the latest updates by the OSM Americana project (<a href="https://github.com/osm-americana/openstreetmap-americana">https://github.com/osm-americana/openstreetmap-americana</a>) we now have some refinements in highway shield rendering.</div><div class="separator" style="clear: both; text-align: left;"><br/></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUPxZF08TwUo0H-RcVXXacXH1GA5zUyWtff7mMP_cVZ00KKKvSMbOvCmPnwAg1i-lG2dkPFIlIVMkIxvB5tQ_1x87azrbePGv_AYJvx51SpSGu9iBQ654e0lbwIZvKyQLpGa3fRkZCOr7Km5kphGjAyJBQTYiNZ2vgGjnQiXtpGSW7Xy-9G3bArD2F/s733/france-d-road.png" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUPxZF08TwUo0H-RcVXXacXH1GA5zUyWtff7mMP_cVZ00KKKvSMbOvCmPnwAg1i-lG2dkPFIlIVMkIxvB5tQ_1x87azrbePGv_AYJvx51SpSGu9iBQ654e0lbwIZvKyQLpGa3fRkZCOr7Km5kphGjAyJBQTYiNZ2vgGjnQiXtpGSW7Xy-9G3bArD2F/s16000/france-d-road.png"/></a></td></tr><tr><td class="tr-caption" style="text-align: center;">French departmental routes (D-roads)<br/></td></tr></tbody></table><br/><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLbhnb3xBhu1D6qUQSSGiuoqOA0Y-oenVXz1LOywT9KgdUp7pyVXj5f-1wwxUatUFEKRyjXOAaHBoOQZik5afswFIDxE4tkdHIrXkLEyvgiAHlzJVzwzQ82oRYkpcrCcWusomwplFJcexPyQ6KSfHhwpH094lofddO67wakqEqmKFAlT2blABhgTgk/s733/turkey.png" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLbhnb3xBhu1D6qUQSSGiuoqOA0Y-oenVXz1LOywT9KgdUp7pyVXj5f-1wwxUatUFEKRyjXOAaHBoOQZik5afswFIDxE4tkdHIrXkLEyvgiAHlzJVzwzQ82oRYkpcrCcWusomwplFJcexPyQ6KSfHhwpH094lofddO67wakqEqmKFAlT2blABhgTgk/s16000/turkey.png"/></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Turkish national D-roads<br/><br/></td></tr></tbody></table><p>Some changes had to be made to our internal shield rendering library (we couldn't use the OSM Americana implementation directly, as we had to implement ours using Cairo rendering and so on) to support the new convenience shortcut for a “pill” shield shape, and also being able to define hard-coded route references “ref” directly in the shield definition rather than getting from the tile data.</p><p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgm28wBiQlheLybqnGPsZ-oYq1ceauY8Ea9aEdy0g6vyUEH6ZsXirZyEgZgyvNkUihmQYjY8vlt0SQF0zAA5kY1JX4d_JVq-FrkOwZ1lY02OmlqAG9AN2fP6oIJS-IOAHg2vl9wgc2j4swzbd3hfdzSj8GmYnPD_R35C2fiAvBX7-0kOqSaSkkAFiRD/s832/rochester-loop.png" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgm28wBiQlheLybqnGPsZ-oYq1ceauY8Ea9aEdy0g6vyUEH6ZsXirZyEgZgyvNkUihmQYjY8vlt0SQF0zAA5kY1JX4d_JVq-FrkOwZ1lY02OmlqAG9AN2fP6oIJS-IOAHg2vl9wgc2j4swzbd3hfdzSj8GmYnPD_R35C2fiAvBX7-0kOqSaSkkAFiRD/s16000/rochester-loop.png"/></a></td></tr><tr align="left"><td class="tr-caption">Rochester Inner Loop in Rochester, New York, using a fixed “LOOP” reference label<br/></td></tr></tbody></table><br/></p><p/><div style="text-align: left;"> And on that note, a funny bug I discovered during some testing is that we currently always assume the “pointsUp” attribute in the shield definitions would always default to <span style="font-family: courier;">true </span><span style="font-family: inherit;">when not explicitly set, while the OSM Americana code has different defaults depending on the following shape. So specifically for the “fishhead” shape it should actually be </span><span style="font-family: courier;">false </span><span style="font-family: inherit;">when not set. I guess this is a bit odd to assume different values depending on following JSON elements, but…</span></div><div style="text-align: left;"><span style="font-family: inherit;"> </span></div><div style="text-align: left;"><span style="font-family: inherit;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDz_NkuS-jJ_u3sA23hn-UKGWSfRTdslwFdHVTQNSPJOXHVm1RRsCgbJT109wzog-U9YJa-N4LgpOXa4vmXl3OZsf-qqBLh4mk3irWHWyfd_JLmdSVFg0QLUzn86vcfP08de3VHAErJ3ygPLfeueK02LP0O6MnE2SQqFU9NyJ7bJh9TYo6LLgaPbLO/s832/fish-head-upsidedown.png" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDz_NkuS-jJ_u3sA23hn-UKGWSfRTdslwFdHVTQNSPJOXHVm1RRsCgbJT109wzog-U9YJa-N4LgpOXa4vmXl3OZsf-qqBLh4mk3irWHWyfd_JLmdSVFg0QLUzn86vcfP08de3VHAErJ3ygPLfeueK02LP0O6MnE2SQqFU9NyJ7bJh9TYo6LLgaPbLO/s16000/fish-head-upsidedown.png"/></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Highway shields in New Zeeland<br/></td></tr></tbody></table><br/> It was a bit funny I discovered this bug when “browsing around“ in New Zeeland considering Northern Hemisphere-centric jokes about people “Down-under” walking upside-down 😀. But this actually also affects some highways in the US…</span></div><div style="text-align: left;"><span style="font-family: inherit;"> </span></div><div style="text-align: left;"><span style="font-family: inherit;">I guess this should be fixed before the 47.0 release.</span></div><div style="text-align: left;"><span style="font-family: inherit;"> </span></div><div style="text-align: left;"><span style="font-family: inherit;">And that's that for this time! </span><br/></div><div class="separator" style="clear: both; text-align: left;"><br/></div></div>
    </content>
    <updated>2024-09-07T13:48:00Z</updated>
    <published>2024-09-07T13:48:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="gnome"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="maps"/>
    <author>
      <name>Marcus Lundblad</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/02923955229568787222</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-5620128670216603593</id>
      <category term="gnome"/>
      <category term="maps"/>
      <category term="gnome maps"/>
      <category term="openstreetmap"/>
      <category term="routing"/>
      <category term="transit"/>
      <category term="FOSDEM"/>
      <category term="excursions"/>
      <category term="GNOME Maps 3.34"/>
      <category term="GNOME Maps 3.36"/>
      <category term="GNOME Maps 3.38"/>
      <category term="gpx"/>
      <category term="gtfs"/>
      <category term="gtk+"/>
      <category term="gtk4."/>
      <category term="libshumate"/>
      <category term="summer"/>
      <category term="travel"/>
      <author>
        <name>Marcus Lundblad</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/02923955229568787222</uri>
      </author>
      <link href="https://ml4711.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="https://www.blogger.com/feeds/5620128670216603593/posts/default" rel="self" type="application/atom+xml"/>
      <link href="https://ml4711.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <link href="https://www.blogger.com/feeds/5620128670216603593/posts/default?start-index=26&amp;max-results=25" rel="next" type="application/atom+xml"/>
      <title>The Maps and Geo Blog</title>
      <updated>2024-10-11T23:20:54Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://arunraghavan.net/?p=2638</id>
    <link href="https://arunraghavan.net/2024/09/gstreamer-and-webrtc-http-signalling/" rel="alternate" type="text/html"/>
    <title>GStreamer and WebRTC HTTP signalling</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><div class="wp-block-jetpack-markdown"><p>The WebRTC nerds among us will remember the first thing we learn about WebRTC, which is that it is a specification for peer-to-peer communication of media and data, but it does not specify how <em>signalling</em> is done.</p>
<p>Or put more simply, if you want call someone on the web, WebRTC tells you how you can transfer audio, video and data, but it leaves out the bit about how you make the call itself: how do you locate the person you’re calling, let them know you’d like to call them, and a few following steps before you can see and talk to each other.</p>
</div>



<p>
</p><figure class="wp-block-image size-large"><a href="https://arunraghavan.net/wp-content/uploads/webrtc-signalling.png"><img alt="WebRTC signalling" class="wp-image-2643" height="455" src="https://arunraghavan.net/wp-content/uploads/webrtc-signalling-1024x455.png" width="1024"/></a><figcaption class="wp-element-caption">WebRTC signalling</figcaption></figure>
<p/>



<div class="wp-block-jetpack-markdown"><p>While this allows services to provide their own mechanisms to manage how WebRTC calls work, the lack of a standard mechanism means that general-purpose applications need to individually integrate each service that they want to support. For example, GStreamer’s <code>webrtcsrc</code> and <code>webrtcsink</code> elements support various signalling protocols, including Janus Video Rooms, LiveKit, and Amazon Kinesis Video Streams.</p>
<p>However, having a standard way for clients to do signalling would help developers focus on their application and worry less about interoperability with different services.</p>
<h2>Standardising Signalling</h2>
<p>With this motivation, the IETF <a href="https://datatracker.ietf.org/group/wish/about/">WebRTC Ingest Signalling over HTTPS</a> (WISH) workgroup has been working on two specifications:</p>
<ul>
<li><a href="https://datatracker.ietf.org/doc/draft-ietf-wish-whip/">WebRTC-HTTP Ingestion protocol</a> (WHIP)</li>
<li><a href="https://datatracker.ietf.org/doc/draft-ietf-wish-whep/">WebRTC-HTTP Egress Protocol</a> (WHEP)</li>
</ul>
<p><em>(author’s note: the puns really do write themselves :))</em></p>
<p>As the names suggest, the specifications provide a way to perform signalling using HTTP. WHIP gives us a way to <em>send</em> media to a server, to ingest into a WebRTC call or live stream, for example.</p>
<p>Conversely, WHEP gives us a way for a client to use HTTP signalling to <em>consume</em> a WebRTC stream – for example to create a simple web-based consumer of a WebRTC call, or tap into a live streaming pipeline.</p>
</div>



<p>
</p><figure class="wp-block-image size-large"><a href="https://arunraghavan.net/wp-content/uploads/whip-and-whep.png"><img alt="WHIP and WHEP" class="wp-image-2644" height="578" src="https://arunraghavan.net/wp-content/uploads/whip-and-whep-1024x578.png" width="1024"/></a><figcaption class="wp-element-caption">WHIP and WHEP</figcaption></figure>
<p/>



<div class="wp-block-jetpack-markdown"><p>With this view of the world, WHIP and WHEP can be used both for calling applications, but also as an alternative way to ingest or play back live streams, with lower latency and a near-ubiquitous real-time communication API.</p>
<p>In fact, several services already support this including <a href="https://docs.dolby.io/streaming-apis/docs/webrtc-whip">Dolby Millicast</a>, <a href="https://docs.livekit.io/realtime/ingress/overview/">LiveKit</a> and <a href="https://developers.cloudflare.com/stream/webrtc-beta/">Cloudflare Stream</a>.</p>
<h2>WHIP and WHEP with GStreamer</h2>
<p>We know GStreamer already provides developers two ways to work with WebRTC streams:</p>
<ul>
<li>
<p><code>webrtcbin</code>: provides a low-level API, akin to the <code>PeerConnection</code> API that browser-based users of WebRTC will be familiar with</p>
</li>
<li>
<p><code>webrtcsrc</code> and <code>webrtcsink</code>: provide high-level elements that can respectively produce/consume media from/to a WebRTC endpoint</p>
</li>
</ul>
<p>At <a href="https://asymptotic.io">Asymptotic</a>, my colleagues <a href="https://github.com/tkanakamalla">Tarun</a>  and <a href="https://sanchayanmaity.net">Sanchayan</a> have been using these building blocks to implement GStreamer elements for both the WHIP and WHEP specifications.  You can find these in the <a href="https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs">GStreamer Rust plugins</a> repository.</p>
<p>Our initial implementations were based on <code>webrtcbin</code>, but have since been moved over to the higher-level APIs to reuse common functionality (such as automatic encoding/decoding and congestion control). Tarun covered our work in a <a href="https://gstconf.ubicast.tv/videos/the-evolution-of-http-based-signalling-for-webrtc-in-gstreamer/">talk at last year’s GStreamer Conference</a>.</p>
<p>Today, we have 4 elements implementing WHIP and WHEP.</p>
<h3>Clients</h3>
<ul>
<li><a href="https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/tree/main/net/webrtc?ref_type=heads#whip-client"><code>whipclientsink</code></a>: This is a <code>webrtcsink</code>-based implementation of a WHIP client, using which you can send media to a WHIP server. For example, streaming your camera to a WHIP server is as simple as:</li>
</ul>
<pre class="urvanov-syntax-highlighter-plain-tag">gst-launch-1.0 -e \
  v4l2src ! video/x-raw ! queue ! \
  whipclientsink signaller::whip-endpoint="https://my.webrtc/whip/room1"</pre>
<ul>
<li><a href="https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1545"><code>whepclientsrc</code></a>: This is work in progress and allows us to build player applications to connect to a WHEP server and consume media from it. The goal is to make playing a WHEP stream as simple as:</li>
</ul>
<pre class="urvanov-syntax-highlighter-plain-tag">gst-launch-1.0 -e \
  whepclientsrc signaller:whep-endpoint="https://my.webrtc/whep/room1" ! \
  decodebin ! autovideosink</pre>
<p>The client elements fit quite neatly into how we might imagine GStreamer-based clients could work. You could stream arbitrary stored or live media to a WHIP server, and play back any media a WHEP server provides. Both pipelines implicitly benefit from GStreamer’s ability to use hardware-acceleration capabilities of the platform they are running on.</p>
</div>



<p>
</p><figure class="wp-block-image size-large"><a href="https://arunraghavan.net/wp-content/uploads/gst-whip-whep-client.png"><img alt="GStreamer WHIP/WHEP clients" class="wp-image-2645" height="329" src="https://arunraghavan.net/wp-content/uploads/gst-whip-whep-client-1024x329.png" width="1024"/></a><figcaption class="wp-element-caption">GStreamer WHIP/WHEP clients</figcaption></figure>
<p/>



<div class="wp-block-jetpack-markdown"><h3>Servers</h3>
<ul>
<li>
<p><a href="https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/tree/main/net/webrtc?ref_type=heads#whip-server"><code>whipserversrc</code></a>: Allows us to create a WHIP server to which clients can connect and provide media, each of which will be exposed as GStreamer pads that can be arbitrarily routed and combined as required. We have an <a href="https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/blob/main/net/webrtc/examples/whipserver.rs?ref_type=heads">example server</a> that can
play all the streams being sent to it.</p>
</li>
<li>
<p><a href="https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1538"><code>whepserversink</code></a>: Finally we have ongoing work to publish arbitrary streams over WHEP for web-based clients to consume this media.</p>
</li>
</ul>
<p>The two server elements open up a number of interesting possibilities. We can ingest arbitrary media with WHIP, and then decode and process, or forward it, depending on what the application requires. We expect that the server API will grow over time, based on the different kinds of use-cases we wish to support.</p>
</div>



<p>
</p><figure class="wp-block-image size-large"><a href="https://arunraghavan.net/wp-content/uploads/gst-whip-whep-server-1.png"><img alt="GStreamer WHIP/WHEP server" class="wp-image-2668" height="395" src="https://arunraghavan.net/wp-content/uploads/gst-whip-whep-server-1-1024x395.png" width="1024"/></a><figcaption class="wp-element-caption">GStreamer WHIP/WHEP server</figcaption></figure>
<p/>



<div class="wp-block-jetpack-markdown"><p>This is all pretty exciting, as we have all the pieces to create flexible pipelines for routing media between WebRTC-based endpoints without having to worry about service-specific signalling.</p>
<p>If you’re looking for help realising WHIP/WHEP based endpoints, or other media streaming pipelines, don’t hesitate to <a href="https://asymptotic.io/#contact">reach out to us</a>!</p>
</div></div>
    </content>
    <updated>2024-09-04T16:35:13Z</updated>
    <published>2024-09-04T16:35:13Z</published>
    <category term="Blog"/>
    <category term="f/oss"/>
    <category term="gstreamer"/>
    <category term="linux"/>
    <category term="technical"/>
    <category term="webrtc"/>
    <author>
      <name>Arun</name>
    </author>
    <source>
      <id>https://arunraghavan.net</id>
      <link href="https://arunraghavan.net/tag/foss/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://arunraghavan.net" rel="alternate" type="text/html"/>
      <subtitle>Open source hacker</subtitle>
      <title>f/oss – Arun Raghavan</title>
      <updated>2024-09-04T21:35:03Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://feborg.es/?p=10722</id>
    <link href="https://feborg.es/looking-for-more-internship-project-ideas-for-outreachy-december-march-cohort/" rel="alternate" type="text/html"/>
    <title>Looking for more internship project ideas for Outreachy (December-March cohort)</title>
    <summary>GNOME is interested in participating in the Outreachy December-March cohort, and while we already have a few great projects, we are looking for experienced mentors with a couple more project ideas. Hurry up, we have until September 11 to conclude our list of ideas. Please, submit project ideas on https://gitlab.gnome.org/Teams/internship/project-ideas Feel free to message us […]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>GNOME is interested in participating in the Outreachy December-March cohort, and while we already have a few great projects, we are looking for experienced mentors with a couple more project ideas. Hurry up, we have until September 11 to conclude our list of ideas.</p>
<p>Please, submit project ideas on <a href="https://gitlab.gnome.org/Teams/internship/project-ideas">https://gitlab.gnome.org/Teams/internship/project-ideas</a></p>
<p>Feel free to message us on <a href="https://matrix.to/#/#internship:gnome.org">#internships:gnome.org</a> (matrix) if you have any doubts.</p></div>
    </content>
    <updated>2024-09-03T08:33:10Z</updated>
    <published>2024-09-03T08:33:10Z</published>
    <category term="gnome"/>
    <category term="internships"/>
    <category term="outreachy"/>
    <author>
      <name>Felipe Borges</name>
    </author>
    <source>
      <id>https://feborg.es</id>
      <logo>https://feborg.es/files/2023/12/cropped-avatar-32x32.jpg</logo>
      <link href="https://feborg.es/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://feborg.es" rel="alternate" type="text/html"/>
      <subtitle>Felipe Borges' blog about GNOME</subtitle>
      <title>Felipe Borges</title>
      <updated>2024-09-03T08:33:10Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://feaneron.com/?p=10378</id>
    <link href="https://feaneron.com/2024/08/28/fancy-titlebars/" rel="alternate" type="text/html"/>
    <title>Fancy Titlebars</title>
    <summary>As of today, Mutter will style legacy titlebars (i.e. of X11 / Xwayland apps that don’t use client-side decorations) using Adwaita on GNOME. Shadows match the Adwaita style as well, including shadows of unfocused windows. These titlebars continue to follow the system dark and light mode, even when apps don’t. Should make using legacy apps […]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3981">As of today</a>, Mutter will style legacy titlebars (i.e. of X11 / Xwayland apps that don’t use client-side decorations) using Adwaita on GNOME.</p>



<figure class="wp-block-image alignwide size-full is-style-rounded is-style-rounded--4d139d51c9be80dd39419c1f6ce7a8ab"><img alt="Picture of VLC and Accerciser with a fancier, Adwaita-styled titlebar" class="wp-image-10379" height="993" src="https://feaneron.com/wp-content/uploads/2024/08/image.png" width="3266"/></figure>



<p>Shadows match the Adwaita style as well, including shadows of unfocused windows. These titlebars continue to follow the system dark and light mode, even when apps don’t.</p>



<p>Should make using legacy apps a little less unpleasant <img alt="&#x1F642;" class="wp-smiley" src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f642.png" style="height: 1em;"/></p></div>
    </content>
    <updated>2024-08-28T16:58:24Z</updated>
    <published>2024-08-28T16:58:24Z</published>
    <category term="GNOME"/>
    <category term="GNOME Shell"/>
    <category term="Mutter"/>
    <category term="gnome"/>
    <author>
      <name>Georges Stavracas</name>
    </author>
    <source>
      <id>https://feaneron.com</id>
      <logo>https://feaneron.com/wp-content/uploads/2014/10/jin-150x150.jpg</logo>
      <link href="https://feaneron.com/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://feaneron.com" rel="alternate" type="text/html"/>
      <subtitle>Scratching my own free software itches</subtitle>
      <title>feaneron</title>
      <updated>2024-08-28T16:58:25Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-GB">
    <id>http://demiigood.wordpress.com/?p=53</id>
    <link href="https://demiigood.wordpress.com/2024/08/26/tinysparql-gsoc-final-report/" rel="alternate" type="text/html"/>
    <title>TinySPARQL GSoC Final Report</title>
    <summary>We have finally reached the final week of GSoC. It has been an amazing journey! Let’s summarize what was done, the current state of the project and what’s next. Introduction This summer, I had the opportunity to work as a student developer under the Google Summer of Code 2024 program with the GNOME Community. I […]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>We have finally reached the final week of GSoC. It has been an amazing journey! Let’s summarize what was done, the current state of the project and what’s next.</p>



<h2 class="wp-block-heading">Introduction</h2>



<p>This summer, I had the opportunity to work as a student developer under the Google Summer of Code 2024 program with the GNOME Community. I focused on creating a web-based Integrated Development Environment (IDE) specifically designed for writing and executing SPARQL queries within TinySPARQL (formerly Tracker).</p>



<p>This user-friendly interface empowers developers by allowing them to compose and edit multiline SPARQL queries directly in a code editor, eliminating the need for the traditional terminal approach. Once a query is written, it can be easily executed via the HTTP SPARQL endpoint, and the results will be displayed in a visually appealing format, enhancing readability and user experience.</p>



<p>By lowering the barrier to entry for newcomers, boosting developer productivity with visual editing, and fostering collaboration through easier query sharing, this web IDE aims to significantly improve the experience for those using libtracker-sparql to interact with RDF databases.</p>



<p>I would like to express my sincere gratitude to my mentors, <a href="https://gitlab.gnome.org/carlosg">Carlos</a> and <a href="https://gitlab.gnome.org/sthursfield">Sam</a>, for their guidance and support throughout the internship period. Their expertise was invaluable in helping me navigate the project and gain a deeper understanding of the subject matter. I would also like to thank my co-mentee <a href="https://gitlab.gnome.org/rachleona">Rachel</a>, for her excellent collaboration and contributions to making this project a reality and fostering a fast-paced development environment.</p>



<p>I’m excited to announce that as the internship concludes, we have a functional web IDE that enables users to run SPARQL queries and view the results directly in their web browser. Here is the working demo of the web IDE that was developed from scratch in this GSoC Project.</p>



<figure class="wp-block-image aligncenter"><img alt="" class="wp-image-74" height="453" src="https://demiigood.wordpress.com/wp-content/uploads/2024/08/screencast-from-26-08-24-01_44_06-am-ist-online-video-cutter.com_.gif?w=1000" tabindex="0" width="1000"/><figcaption class="wp-element-caption"><em>Working of TinySPARQL Web IDE</em></figcaption></figure>



<h2 class="wp-block-heading">What was done</h2>



<p>This project was divided into two primary components: the backend C code, which enabled the web IDE to be served and run from the command line, and the frontend JavaScript code, which enhanced the web IDE’s visual appeal and added all user-facing functionalities. I primarily focused on the backend C side of the project, while Rachel worked on the frontend. Therefore, this blog post will delve into the backend aspects of the project. To learn more about the frontend development, please check out <a href="https://rachleona.wordpress.com/">Rachel’s blog</a>.</p>



<p>The work done by me, could be divided into three major phases:</p>



<ul class="wp-block-list">
<li><strong>Pre-Development Phase</strong>
<ul class="wp-block-list">
<li>During the pre-development phase, I focused on familiarizing myself with the existing codebase and preparing it for easier development. This involved removing support for older versions of libraries, such as Libsoup.</li>



<li>TinySPARQL previously supported both Libsoup 2 and Libsoup 3 libraries, but these versions had different function names and macros.</li>



<li>This compatibility requirement could significantly impact development time. To streamline the process, we decided to drop support for Libsoup 2.</li>



<li>The following merge requests document the work done in this phase:
<ul class="wp-block-list">
<li><a href="https://gitlab.gnome.org/GNOME/tinysparql/-/merge_requests/666">Adopt consistent include path for tracker-sparql.h</a></li>



<li><a href="https://gitlab.gnome.org/GNOME/tinysparql/-/merge_requests/671">libtracker-sparql: Drop libsoup2 support</a><br/><br/></li>
</ul>
</li>
</ul>
</li>



<li><strong>Setting Up the Basic Web IDE</strong>
<ul class="wp-block-list">
<li>In this phase, I extended the HTTP endpoint exposed by the <code class="">tinysparql endpoint</code> command to also serve the web IDE. The goal was to enable the endpoint to serve HTML, CSS, and JavaScript files, in addition to RDF data. This was a crucial step, as frontend development could only begin once the basic web IDE was ready.</li>



<li>During this phase, the HTTP module became more complex. To aid in debugging and diagnosing errors, we added a debugging functionality. By running <code>TRACKER_DEBUG=http</code>, one can now view logs of all GET and POST methods, providing valuable insights into the HTTP module’s behavior.</li>



<li>The following merge requests document the work done in this phase:
<ul class="wp-block-list">
<li><a href="https://gitlab.gnome.org/GNOME/tinysparql/-/merge_requests/681">Extend web server to share HTML, CSS + JS files</a></li>



<li><a href="https://gitlab.gnome.org/GNOME/tinysparql/-/merge_requests/691">Add Debugging for HTTP Requests</a><br/><br/></li>
</ul>
</li>
</ul>
</li>



<li><strong>Separating the Web IDE</strong>
<ul class="wp-block-list">
<li>The web IDE added significant size (around 800KB-1MB) to the <code class="">libtracker-sparql</code> library. Since not all users might need the web IDE functionality, we decided to separate it from <code>libtracker-sparql</code>. This separation improves efficiency for users who won’t be using the web IDE.</li>



<li>To achieve this isolation, we implemented a dedicated subcommand <code>tinysparql webide</code> for the web IDE, allowing it to run independently from the SPARQL endpoint.</li>



<li>Here’s a breakdown of the process:
<ol class="wp-block-list">
<li><strong>Isolating HTTP Code:</strong> I started by extracting the HTTP code from <code class="">libtracker-sparql</code> into a new static library named <code class="">libtracker-http</code>. This library contains the abstraction <code class="">TrackerHttpServer</code> over the Libsoup server, which can be reused in the <code>tinysparql webide</code> subcommand.</li>



<li><strong>Creating a Subcommand:</strong> Following the isolation of the web IDE into its own library and the removal of relevant <code>gresources</code> from <code class="">libtracker-sparql</code>, we were finally able to create a dedicated subcommand for the web IDE.  As a result, the size of <code class="">libtinysparql.so.0.800.0</code> has been reduced by approximately 700KB.”</li>
</ol>
</li>



<li>The following merge requests document the work done in this phase:
<ul class="wp-block-list">
<li><a href="https://gitlab.gnome.org/GNOME/tinysparql/-/merge_requests/716">Separate libtracker-http from libtracker-sparql</a></li>



<li><a href="https://gitlab.gnome.org/GNOME/tinysparql/-/merge_requests/707">Add tinysparql webide subcommand</a></li>
</ul>
</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Final Result</h2>



<p>This is the web IDE we developed during the internship. Check out <a href="https://drive.google.com/file/d/1LP2tkx2oWSv3QzxI3plG2Hib_0mwCROg/view?usp=sharing">this</a> demo video to see some of the latest changes in action.</p>



<figure class="wp-block-image aligncenter size-large"><img alt="" class="wp-image-67" height="464" src="https://demiigood.wordpress.com/wp-content/uploads/2024/08/screenshot-from-2024-08-26-01-40-38.png?w=1024" tabindex="0" width="1024"/><figcaption class="wp-element-caption"><em>TinySPARQL Web IDE</em></figcaption></figure>



<figure class="wp-block-image aligncenter"><img alt="" class="wp-image-69" height="464" src="https://demiigood.wordpress.com/wp-content/uploads/2024/08/screenshot-from-2024-08-26-01-41-47.png?w=1024" tabindex="0" width="1024"/><figcaption class="wp-element-caption"><em>SPARQL Query successfully executed</em></figcaption></figure>



<figure class="wp-block-image aligncenter size-large"><img alt="" class="wp-image-71" height="464" src="https://demiigood.wordpress.com/wp-content/uploads/2024/08/screenshot-from-2024-08-26-01-42-21.png?w=1024" tabindex="0" width="1024"/><figcaption class="wp-element-caption"><em>Error handling</em></figcaption></figure>



<h2 class="wp-block-heading">Future Work</h2>



<p>Despite having a functional web IDE and completing many of the tasks outlined in the proposal (even exceeding the original scope due to the collaborative efforts of two developers), there are still areas for improvement.</p>



<p>I plan to continue working on the web IDE in the future, focusing on the following enhancements:</p>



<ul class="wp-block-list">
<li><strong>Multi-Endpoint Support:</strong> Implement a mechanism for querying different SPARQL endpoints. This could involve adding a text box input to the frontend for dynamically entering endpoint URLs or providing a connection string option when creating the web IDE instance from the command line.</li>



<li><strong>Unified HTTP Handling:</strong> Implement a consistent HTTP handler for all cases, allowing <code class="">TrackerEndpointHttp</code> to handle requests both inside and outside the <code class="">/sparql</code> path.</li>



<li><strong>SPARQL Extraction:</strong> Extract the SPARQL query from POST requests in <code class="">TrackerEndpointHttp</code> or pass the raw POST data in the <code class="">::request</code> signal, enabling <code class="">TrackerEndpointHttp</code> to determine if it contains a SPARQL query.</li>



<li><strong>Avahi Configuration:</strong> Move the Avahi code for announcing server availability or assign <code class="">TrackerEndpointHttp</code> responsibility for managing the content and type of broadcasted data.</li>



<li><strong>CORS Configuration:</strong> Make CORS settings configurable at the API level, allowing for more granular control and avoiding the default enforcement of the <code class="">*</code> wildcard.</li>
</ul>



<h2 class="wp-block-heading">GUADEC Experience</h2>



<p>One of the highlights of my GSoC journey was the opportunity to present my project at GUADEC, the annual GNOME conference. It was an incredible experience to share my work with a diverse audience of developers and enthusiasts. Be sure to check out <a href="https://www.youtube.com/live/ynIKMiRwn3s?feature=shared&amp;t=23277">our presentation</a> on the TinySPARQL Web IDE, delivered by Rachel and me at GUADEC.</p>



<h2 class="wp-block-heading">Final Remarks</h2>



<p>Thank you for taking the time to read this. Your support means a great deal to me. This internship was a valuable learning experience, as it was my first exposure to professional-level C code and working with numerous libraries solely based on official documentation. I am now more confident in my skills than ever. I gained a deeper understanding of the benefits of collaboration and how it can significantly accelerate development while maintaining high code quality. </p></div>
    </content>
    <updated>2024-08-25T22:15:40Z</updated>
    <published>2024-08-25T22:15:40Z</published>
    <category term="GNOME"/>
    <author>
      <name>Divyansh Jain</name>
    </author>
    <source>
      <id>https://demiigood.wordpress.com</id>
      <logo>https://s0.wp.com/i/buttonw-com.png</logo>
      <link href="https://demiigood.wordpress.com/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://demiigood.wordpress.com" rel="alternate" type="text/html"/>
      <link href="https://demiigood.wordpress.com/osd.xml" rel="search" title="Demigod's Blog" type="application/opensearchdescription+xml"/>
      <link href="https://demiigood.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <title>Demigod's Blog</title>
      <updated>2024-08-27T07:39:06Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-1368784163887344867.post-7539175288429764684</id>
    <link href="https://sudhanshut.blogspot.com/2024/08/gsoc-2024-final-project-report.html" rel="alternate" type="text/html"/>
    <title>GSoC 2024: Final Project Report</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><h1 style="height: 0px;">GSoC 2024 : Final Project Report | Vala</h1><div><br/></div><div><br/></div><h2 style="text-align: left;">Project Title</h2><div>Add support for the latest GIR attributes and GI-Docgen formatting to Valadoc.</div><div><br/></div><h2 style="text-align: left;">Overview</h2><div>GSoC 2024 has come to an end, so it's time to wrap up. I got the opportunity to contribute to the Vala Project which consists of an awesome programming language called Vala, and it gives me immense sense of accomplishment to know that my work will be beneficial for Vala programmers. I spent the 12 weeks working through the codebase of the Vala compiler, adding features and making the necessary changes to achieve the project goals. It was a valuable experience and I have learnt a lot by working with talented mentors and peers. This has undoubtedly shaped my journey as a developer and I plan to continue working on the project.</div><div><br/></div><h2 style="text-align: left;">Project Summary</h2><div>This project aimed to add support for the latest features of GObject Introspection to the Vala compiler and Valadoc. The plan was to ensure that the Vala compiler (which generates Vala bindings for the GIR files) parses and utilizes the newer GIR attributes from the introspection data of GObject based C libraries, and outputs them in the generation of Vala GIRs. In Valadoc, this was to be implemented by parsing the GI-Docgen documentation format, and rendering working GI-Docgen links in the HTML documentation generated by Valadoc. Another important step in improving Valadoc was to redesign <a href="https://valadoc.org">https://valadoc.org</a> and give it a modernized look, making this one of the milestones that was expected to be acheived in the project.</div><div><br/></div><h2 style="text-align: left;">Contributions (Merge requests)</h2><div>To acheive these objectives, I opened the following merge requests:</div><div><ul style="text-align: left;"><li>Support for sync-func, async-func, and finish-func attributes for method. (Draft) <a href="https://gitlab.gnome.org/GNOME/vala/-/merge_requests/393">[!393]</a></li><li>Add support for default-value attribute for property. <a href="https://gitlab.gnome.org/GNOME/vala/-/merge_requests/394">[394]</a></li><li>libvaladoc: Parse backticks in gi-docgen markdown and display the enclosed text as monospaced. <a href="https://gitlab.gnome.org/GNOME/vala/-/merge_requests/402">[!402]</a></li><li>libvaladoc: Modernize the HTML documentation pages generated by valadoc. <a href="https://gitlab.gnome.org/GNOME/vala/-/merge_requests/403">[!403]</a></li><li>Redesign https://valadoc.org and make it mobile-responsive. <a href="https://github.com/vala-lang/valadoc-org/pull/419">[#419]</a></li></ul><h2 style="text-align: left;">Future Plans</h2></div><div>Although the coding period of GSoC 2024 is now over, I feel that this is just the beginning of my contributions to GNOME. We still have to implement support for working GI-Docgen links and many other features of GI-Docgen markdown to Valadoc. I will continue working to meet the project objectives, contribute more, and be more involved within the GNOME community. I got to learn a lot over the past 12 weeks and this has certainly made me a better contributor. </div><div><br/></div><h2 style="text-align: left;">Mentor</h2><div>I extend my heartfelt gratitude to my mentor <a href="https://gitlab.gnome.org/lwildberg">Lorenz Wildberg</a> for being a constant source of support and motivation throughout the internship. Their expertise and guidance helped me reach this far into the project and I hope to continue working on Vala and other GNOME projects in the coming months. </div><h2 style="text-align: left;">GUADEC 2024</h2><div>I got the opportunity to present my project and participate in the Intern Lightning Talks in GUADEC on 20 July 2024. I had a great experience explaining about my project and answering questions, you can watch my presentation here: <a href="https://youtu.be/chKVTgUUVpk?si=LE46ezQX6q3ZqcZ4&amp;t=2220" target="_blank">https://youtu.be/chKVTgUUVpk?si=LE46ezQX6q3ZqcZ4&amp;t=2220</a></div><h2 style="text-align: left;">After GSoC</h2><div>As I look back and reflect on my journey over the last 12 weeks, I am filled with gratitude for this opportunity and excitement for future work on Vala and related GNOME projects. I want to learn more about GTK, Vala and the GNOME development process so that I can make more impactful contributions and be a valuable member of the community. I had many interactions with numerous GNOME contributors and I'm grateful to each and every one of them for always being ready to guide and for their prompt replies to my doubts. I was a Linux user for a long time but never really used it as a power user until I started contributing to GNOME. I'm glad to say that now Linux will always be my preferred choice of an operating system :). My favourite part of working on this project was being part of a community that is diverse, inclusive, and incredibly welcoming to newcomers. I look forward to being a better GNOME contributor and guiding new contributors in GNOME.</div></div>
    </summary>
    <updated>2024-08-25T17:56:00Z</updated>
    <published>2024-08-25T17:56:00Z</published>
    <author>
      <name>Sudhanshu Tiwari</name>
      <email>noreply@blogger.com</email>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-1368784163887344867</id>
      <author>
        <name>Sudhanshu Tiwari</name>
        <email>noreply@blogger.com</email>
      </author>
      <link href="https://sudhanshut.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="https://sudhanshut.blogspot.com/feeds/posts/default?alt=rss" rel="self" type="application/rss+xml"/>
      <title>GSoC 2024</title>
      <updated>2024-10-16T21:58:11Z</updated>
    </source>
  </entry>
</feed>
