<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>GNOME on pesader</title><link>https://pesader.dev/tags/gnome/</link><description>Recent content in GNOME on pesader</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 23 Jul 2024 11:00:38 -0300</lastBuildDate><atom:link href="https://pesader.dev/tags/gnome/feed.xml" rel="self" type="application/rss+xml"/><item><title>Accessibility Hackathon</title><link>https://pesader.dev/posts/accessibility-hackathon/</link><pubDate>Tue, 23 Jul 2024 11:00:38 -0300</pubDate><guid>https://pesader.dev/posts/accessibility-hackathon/</guid><description>
&lt;p>When you stop and think about it, user interfaces are almost entirely designed around sight: they display graphical elements that are mostly interacted with by pointing and clicking (or touching). However, as we know, not everyone has &amp;ldquo;perfect&amp;rdquo; vision: some are color blind, some are short sighted, some are long sighted, etc. In many cases, these people can still interact with the same user interfaces as everyone else, but those with more severe visual impairments need a different method to use their computers.&lt;/p>
&lt;p>That&amp;rsquo;s when the Screen Reader comes in! The Screen Reader is a software that adapts computers to the needs of users with low vision or blindness, by reading descriptions of user interfaces out loud and facilitating keyboard navigation.&lt;/p>
&lt;p>Today, we will explore the web with Orca, the Screen Reader of the Linux Desktop! After that, we will contribute towards improving the experience of Orca users.&lt;/p>
&lt;p>Mind you that Screen Readers have tons of advanced features to empower users with as much efficiency as possible. Because of that, it can be challenging to use this kind of software if you are not used to it. I invite you to embrace this challenge as an opportunity to experience the desktop from a different perspective, and to appreciate the way other people user their computers.&lt;/p>
&lt;p>Without further ado, let&amp;rsquo;s get going!&lt;/p>
&lt;h1 id="part-i---exploring-the-screen-reader">Part I - Exploring the Screen Reader&lt;/h1>
&lt;h2 id="enabling-and-disabling-orca">Enabling and Disabling Orca&lt;/h2>
&lt;p>You can enable and disable Orca by pressing &lt;code>Super&lt;/code> + &lt;code>Alt&lt;/code> + &lt;code>s&lt;/code>. This can also be configured via GNOME Settings, under &amp;ldquo;Accessibility&amp;rdquo; &amp;gt; &amp;ldquo;Seeing&amp;rdquo; &amp;gt; &amp;ldquo;Screen Reader&amp;rdquo;.&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/accessibility-hackathon/images/accessibility-settings.png" alt="&amp;amp;ldquo;Seeing&amp;amp;rdquo; panel within GNOME Settings"/>
&lt;/p>
&lt;/p>
&lt;p>Turn up and the volume and make sure you hear a robotic voice saying &amp;ldquo;Screen Reader on&amp;rdquo; and &amp;ldquo;Screen Reader off&amp;rdquo;. Then, open the Firefox web browser and check if Orca describes the current open tab. If it is quiet, try closing and re-opening Firefox again or disabling and re-enabling Orca.&lt;/p>
&lt;h2 id="controlling-orca">Controlling Orca&lt;/h2>
&lt;p>Orca is controlled entirely from the keyboard, having dozens of shortcuts. Besides, these keyboard shortcuts are slightly different if you have a Number Pad (NumPad) or not. I have laid out the most important ones below, but an exhaustive list can be found in the quite excellent &lt;a href="https://help.gnome.org/users/orca/stable/index.html.en">Orca documentation&lt;/a>.&lt;/p>
&lt;h3 id="orca-modifier">Orca Modifier&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Key&lt;/th>
&lt;th>Without a NumPad (Laptop)&lt;/th>
&lt;th>With a NumPad (Desktop)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Orca Modifier&lt;/code>&lt;/td>
&lt;td>&lt;code>Caps Lock&lt;/code>&lt;/td>
&lt;td>&lt;code>NumPad Ins&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="important-shortcuts">Important shortcuts&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Action&lt;/th>
&lt;th>Without a NumPad&lt;/th>
&lt;th>With a NumPad&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Toggle screen reader&lt;/td>
&lt;td>&lt;code>Super&lt;/code> + &lt;code>Alt&lt;/code> + &lt;code>s&lt;/code>&lt;/td>
&lt;td>&lt;code>Super&lt;/code> + &lt;code>Alt&lt;/code> + &lt;code>s&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Interrupt screen reading&lt;/td>
&lt;td>&lt;code>Orca Modifier&lt;/code> (press)&lt;/td>
&lt;td>&lt;code>Orca Modifier&lt;/code> (press)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Toggle caret mode in Firefox&lt;/td>
&lt;td>&lt;code>F7&lt;/code>&lt;/td>
&lt;td>&lt;code>F7&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Where am I&lt;/td>
&lt;td>&lt;code>NumPad Enter&lt;/code>&lt;/td>
&lt;td>&lt;code>Orca Modifier&lt;/code> + &lt;code>Enter&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Display page structure&lt;/td>
&lt;td>&lt;code>Alt&lt;/code> + &lt;code>Shift&lt;/code> + &lt;code>h&lt;/code>&lt;/td>
&lt;td>&lt;code>Alt&lt;/code> + &lt;code>Shift&lt;/code> + &lt;code>h&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Display page buttons&lt;/td>
&lt;td>&lt;code>Alt&lt;/code> + &lt;code>Shift&lt;/code> + &lt;code>b&lt;/code>&lt;/td>
&lt;td>&lt;code>Alt&lt;/code> + &lt;code>Shift&lt;/code> + &lt;code>b&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Read current line&lt;/td>
&lt;td>&lt;code>NumPad 8&lt;/code>&lt;/td>
&lt;td>&lt;code>Orca Modifier&lt;/code> + &lt;code>i&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Read current word&lt;/td>
&lt;td>&lt;code>NumPad 5&lt;/code>&lt;/td>
&lt;td>&lt;code>Orca Modifier&lt;/code> + &lt;code>k&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Read onward&lt;/td>
&lt;td>&lt;code>NumPad +&lt;/code>&lt;/td>
&lt;td>&lt;code>Orca Modifier&lt;/code> + &lt;code>;&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Next link&lt;/td>
&lt;td>&lt;code>k&lt;/code>&lt;/td>
&lt;td>&lt;code>k&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Previous link&lt;/td>
&lt;td>&lt;code>Shift&lt;/code> + &lt;code>k&lt;/code>&lt;/td>
&lt;td>&lt;code>Shift&lt;/code> + &lt;code>k&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Next paragraph&lt;/td>
&lt;td>&lt;code>p&lt;/code>&lt;/td>
&lt;td>&lt;code>p&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Previous paragraph&lt;/td>
&lt;td>&lt;code>Shift&lt;/code> + &lt;code>p&lt;/code>&lt;/td>
&lt;td>&lt;code>Shift&lt;/code> + &lt;code>p&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Next button&lt;/td>
&lt;td>&lt;code>p&lt;/code>&lt;/td>
&lt;td>&lt;code>p&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Previous paragraph&lt;/td>
&lt;td>&lt;code>Shift&lt;/code> + &lt;code>p&lt;/code>&lt;/td>
&lt;td>&lt;code>Shift&lt;/code> + &lt;code>p&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="activity-exploring-the-web-with-orca">Activity: Exploring the web with Orca&lt;/h2>
&lt;p>Open the Firefox web browser and head to &lt;a href="https://flathub.org">https://flathub.org&lt;/a>. Find an app that looks interesting to you and explore its page using Orca. Try to navigate the entire page!&lt;/p>
&lt;p>Feel free to use the questions below as a guide to your exploration:&lt;/p>
&lt;ol>
&lt;li>Can you read the app description? Try to do it twice.&lt;/li>
&lt;li>Can you click the &amp;ldquo;Install&amp;rdquo; button? What happens when you do?&lt;/li>
&lt;li>Can you figure out if the app is verified or not? How so?&lt;/li>
&lt;li>Can you guess what the screenshots of the app are showing?&lt;/li>
&lt;li>Can you find the link to the source code of the app?&lt;/li>
&lt;/ol>
&lt;h1 id="part-ii---captioning-screenshots-in-flathub">Part II - Captioning Screenshots in Flathub&lt;/h1>
&lt;h2 id="flatpak-and-flathub">Flatpak and Flathub&lt;/h2>
&lt;p>Flatpak is a modern packaging technology, which aims to work on all Linux distributions. In turn, Flathub is an app store for software that was packaged using Flatpak. Flathub has been embraced as the main channel for publishing applications by many projects, most notably GNOME!&lt;/p>
&lt;h2 id="app-listings">App listings&lt;/h2>
&lt;p>Each app that is published on Flathub has a page for itself, which is called &amp;ldquo;app listing&amp;rdquo;. You will find lots of important information about an app on its listing, such as:&lt;/p>
&lt;ul>
&lt;li>Name&lt;/li>
&lt;li>Description&lt;/li>
&lt;li>Author&lt;/li>
&lt;li>License&lt;/li>
&lt;li>Permissions&lt;/li>
&lt;li>Screenshots&lt;/li>
&lt;/ul>
&lt;p>All this information is sourced from a special file called &amp;ldquo;MetaInfo File&amp;rdquo;, that is typically hosted on the app&amp;rsquo;s repository. Its filename usually ends with &lt;code>.metainfo.xml.in.in&lt;/code>. You can click &lt;a href="https://github.com/SeaDve/Kooha/blob/main/data/io.github.seadve.Kooha.metainfo.xml.in.in">here&lt;/a> to see an example of a MetaInfo File. You can read more about this file format on Flathub&amp;rsquo;s &lt;a href="https://docs.flathub.org/docs/for-app-authors/metainfo-guidelines/">MetaInfo Guidelines&lt;/a>.&lt;/p>
&lt;h2 id="screenshot-captions">Screenshot captions&lt;/h2>
&lt;p>To promote high-quality listings, Flathub publishes its own &lt;a href="https://docs.flathub.org/docs/for-app-authors/metainfo-guidelines/quality-guidelines/">Quality Guidelines.&lt;/a>. These guidelines encourage maintainer&amp;rsquo;s to add captions to their images, which, as we learned in the first activity, helps people who use Screen Readers understand the content of the screenshots of the app. To quote the Quality Guidelines:&lt;/p>
&lt;blockquote>
&lt;p>Every screenshot should have a caption briefly describing it. Captions should only be one sentence and not end with a full stop. Don&amp;rsquo;t start them with a number.&lt;/p>
&lt;/blockquote>
&lt;p>To be more precise, good captions should clearly convey the functionality demonstrated in the screenshot, as well as give a general idea of the user interface on display. I have cataloged dozens of Flathub listings on this Google Sheet:&lt;/p>
&lt;p>&lt;a href="https://docs.google.com/spreadsheets/d/1QA7_7xVPh83buAlABcd1qKZeljmDgkuRErwFqiJY5cY/edit?gid=0#gid=0">GUADEC 2024 - Accessibility Hackathon&lt;/a>&lt;/p>
&lt;p>There you find listings with &lt;strong>Caption status&lt;/strong> set &amp;ldquo;Exemplary&amp;rdquo;, which are great models of how captions should be written.&lt;/p>
&lt;h2 id="activity-contributing-with-captions">Activity: Contributing with captions&lt;/h2>
&lt;p>Now, we will improve the accessibility of the Linux Desktop (albeit slightly), by contributing to Flathub with screenshot captioning. To do that, follow the instructions laid out below:&lt;/p>
&lt;ol>
&lt;li>Open the Google Sheet on &lt;a href="https://docs.google.com/spreadsheets/d/1QA7_7xVPh83buAlABcd1qKZeljmDgkuRErwFqiJY5cY/edit?usp=sharing">this link&lt;/a>&lt;/li>
&lt;li>Choose an app with &lt;strong>Caption status&lt;/strong> set &amp;ldquo;Absent&amp;rdquo;&lt;/li>
&lt;li>Assign &amp;ldquo;In-progress&amp;rdquo; to its &lt;strong>Caption status&lt;/strong>&lt;/li>
&lt;li>Put your name(s) on its &lt;strong>Group&lt;/strong> column&lt;/li>
&lt;li>Head to the Flathub listing link of the app&lt;/li>
&lt;li>Find the repository of the app (usually under &amp;ldquo;Browser the source code&amp;rdquo; on &amp;ldquo;Links&amp;rdquo;)
&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/accessibility-hackathon/images/flathub-links.png" alt="Flathub listing links tab"/>
&lt;/p>
&lt;/li>
&lt;li>Log in or create an account on the platform that hosts the repository of the app (GitHub, GitLab, etc)&lt;/li>
&lt;li>Go back to the repository of the app, and find its MetaInfo File. It is typically placed in a &lt;code>data/&lt;/code> directory, at the root of the repository.&lt;/li>
&lt;li>On the MetaInfo File, look for the &lt;code>screenshot&lt;/code> tags and find the files referenced in it&lt;/li>
&lt;li>Inside each &lt;code>screenshot&lt;/code> element, there is an &lt;code>image&lt;/code> element. For each of those, create a new line with &lt;code>caption&lt;/code> tags. The caption goes in between them, like so:&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-diff" data-lang="diff">&lt;span style="display:flex;">&lt;span>&amp;lt;screenshot&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;image&amp;gt;https://raw.githubusercontent.com/SeaDve/Kooha/main/data/screenshots/screenshot2.png&amp;lt;/image&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#00a000">+ &amp;lt;caption&amp;gt;In-progress recording duration and button to stop recording&amp;lt;/caption&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#00a000">&lt;/span>&amp;lt;/screenshot&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="11">
&lt;li>When you are done writing your captions, proof read them and run them through a spellchecker. I haven&amp;rsquo;t found any great ones online, but &lt;a href="https://languagetool.org/">Language Tool&amp;rsquo;s&lt;/a> is passable.&lt;/li>
&lt;li>Commit your changes, following the commit message conventions of the project you are contributing to. If this convention is not documented anywhere, try to infer it looking at the commit history.&lt;/li>
&lt;li>Open a Pull Request (PR) / Merge Request (MR) with your contribution, explaining what you did and why it is important. You can use &lt;a href="https://github.com/SeaDve/Kooha/pull/307">my explanation&lt;/a> as a model.&lt;/li>
&lt;li>Put a link to your PR/MR on the sheet.&lt;/li>
&lt;li>Wait for the maintainer&amp;rsquo;s feedback&lt;/li>
&lt;/ol>
&lt;h1 id="part-iii-farewell">Part III: Farewell&lt;/h1>
&lt;p>Thank you for attending this workshop. I hope you had a good time!&lt;/p>
&lt;p>Until the next one!&lt;/p></description></item><item><title>GUADEC 2023</title><link>https://pesader.dev/posts/guadec-2023/</link><pubDate>Tue, 01 Aug 2023 19:15:26 -0300</pubDate><guid>https://pesader.dev/posts/guadec-2023/</guid><description>
&lt;p>A few days back, I went for the first time to the GNOME Users and Developers Everywhere Conference (GUADEC). Even though I&amp;rsquo;m just a Google Summer of Code intern, the GNOME Foundation was kind enough to sponsor my trip to Riga, Latvia, where the event took place this year.&lt;/p>
&lt;h1 id="the-city">The city&lt;/h1>
&lt;p>After an 18h trip to Riga, I thought I would collapse on my hotel&amp;rsquo;s bed as soon as I stepped into my room. However, I was so incredibly overwhelmed by Riga&amp;rsquo;s unique beauty that I dropped all my stuff in the hotel as fast as I could, then left for a quick stroll.&lt;/p>
&lt;p>My first destination ended up being the Saint Peter&amp;rsquo;s Chapel, and for good reason! It is the tallest building in the city and, since Riga is extraordinarily flat, you can see everything from up there. I arrived a few days before the conference but hadn&amp;rsquo;t made any plans, so I took the opportunity of the bird&amp;rsquo;s-eye-view to scan the whole city for interesting places to visit.&lt;/p>
&lt;p>Here&amp;rsquo;s the problem: everything looks interesting in Riga. Take this building for example:&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/guadec-2023/kofisops.jpg" alt="A beautiful Art Noveau building, at a street corner"/>
&lt;/p>
&lt;/p>
&lt;p>This beautiful, intricately detailed Art Noveau building would be a tourist attraction on its own was it placed on the streets of my motherland. If you take a closer look, you will realize that the sign on it reads &amp;ldquo;Eliza Kofisops&amp;rdquo;. &amp;ldquo;Kofisops&amp;rdquo;? Yeah, that&amp;rsquo;s right, this amazing building is nothing but an ordinary every-day-life coffee shop!&lt;/p>
&lt;p>In spite of the choice paralysis, I ended up visiting lots of places. Some of the highlights were the Occupation Museum, the Fashion Museum, the National Library, and the suburbs waking tour.&lt;/p>
&lt;h1 id="the-conference">The conference&lt;/h1>
&lt;p>Time flew as I was touristing through Riga and, before I knew, GUADEC 2023 was upon me!&lt;/p>
&lt;h2 id="the-presentations">The presentations&lt;/h2>
&lt;p>One of the best parts of attending GUADEC was seeing the impressive amount of ongoing work. Usually, the news only cover features and enhancements that are &lt;em>ready&lt;/em>, so it was very exciting to get a glimpse of what the future holds for GNOME.&lt;/p>
&lt;p>That is especially true of the work being done by the GNOME Design Team and GNOME Foundation. For that reason, some of my favorite talks were &amp;ldquo;GNOME Design: State of the Union&amp;rdquo; by the Design Team, and &amp;ldquo;Beyond the Code: Another side of GNOME&amp;rdquo; by Melissa Wu.&lt;/p>
&lt;p>I also had a legit fun time with some of the lightning talks. Jussi Pakkanen’s analogy between geomtry problems and preferences was nothing short of brilliant and Tobias Bernard&amp;rsquo;s surprise lighting talk on GNOME&amp;rsquo;s logo was a bold hot take on branding.&lt;/p>
&lt;p>If I were to cite every other talk I enjoyed I would probably end up listing the entire schedule of the conference so let&amp;rsquo;s just stick with this subset 😅.&lt;/p>
&lt;h2 id="the-contributions">The contributions&lt;/h2>
&lt;p>At my very first GUADEC I already had the honor to present a few things! It was a bit unnerving to speak in front of such a distinguished audience, but the excitement prevailed over every other feeling.&lt;/p>
&lt;p>On the second day, I presented a Lightning Talk on &lt;a href="https://www.youtube.com/watch?v=qaZuQO0bK-M&amp;amp;t=22926s">&amp;ldquo;How to make a FOSS contribution event&amp;rdquo;&lt;/a> in which I talked about the work I do at LKCAMP, the FOSS student club that I participate in.&lt;/p>
&lt;p>On the third day, I presented yet another Lightning Talk. This time I spoke about my work as a Google Summmer of Code intern, on &lt;a href="https://www.youtube.com/watch?v=hv-bkYpHSbQ&amp;amp;t=22765s">&amp;ldquo;Integrating the functionality of GNOME Network Displays into GNOME Shell&amp;rdquo;&lt;/a>.&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/guadec-2023/talk.png" alt="A picture of myself speaking at GUADEC"/>
&lt;/p>
&lt;/p>
&lt;p>Finally, in the last day, I held a workshop for first time contributors. Most attendees, however, were not anywhere near &amp;ldquo;first time contributors&amp;rdquo;. For that reason, I ended up changing up the structure of the event a bit and focus a bit more on my method (or rather, LKCAMP&amp;rsquo;s method) for making events to enlist new contributors to open source.&lt;/p>
&lt;h1 id="the-afterword">The afterword&lt;/h1>
&lt;p>Again, I would like to express my gratitude towards the GNOME Foundation for making this trip possible. I had an amazing time getting meeting the faces behind the usernames that I had been interacting with for years, and none of that would have been possible without the Foundation&amp;rsquo;s support.&lt;/p>
&lt;p>More speficially, I would to thank Melissa Wu for patiently and diligently answering all my questions regarding the trip and Asmit Malakannawar for providing me with the documents (e.g. invitation letter) needed to facilitate my immigration into Latvia.&lt;/p>
&lt;p>Hope to see you again in Denver for GUADEC 2024!&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/guadec-2023/badge.png" alt="A rectangular badge spelling &amp;amp;ldquo;Sponsored by the GNOME Foundation&amp;amp;rdquo;"/>
&lt;/p>
&lt;/p></description></item><item><title>1st Contribution Hackathon, by LKCAMP</title><link>https://pesader.dev/posts/1st-contribution-hackathon/</link><pubDate>Sat, 29 Jul 2023 09:46:26 +0300</pubDate><guid>https://pesader.dev/posts/1st-contribution-hackathon/</guid><description>
&lt;p>The 1&lt;sup>st&lt;/sup> Contribution Hackathon was created by LKCAMP, the Free and Open Source Software study group of the &lt;em>Universidade Estadual de Campinas&lt;/em> (Unicamp) that I have been a member of for years. Over time, we have made many iterations of this event in our university and even took it to the GUADEC (GNOME&amp;rsquo;s global conference) in 2023.&lt;/p>
&lt;p>That being said, thank you for coming to this edition of the 1&lt;sup>st&lt;/sup> Contribution Hackathon! We welcome you into our history. Now, buckle up!&lt;/p>
&lt;h1 id="resources">Resources&lt;/h1>
&lt;p>You can access a page with links to all the resources you&amp;rsquo;ll need to participate in this event by clicking &lt;a href="https://lkcamp.gitlab.io/lynx/first-contribution/">here&lt;/a>. Open it and pin that tab in web browser for the entire duration of the event!&lt;/p>
&lt;h1 id="setup">Setup&lt;/h1>
&lt;p>There are three components that we need for making the contribution: flatpak, flathub, and GNOME Builder. Here&amp;rsquo;s how to get each of them:&lt;/p>
&lt;h2 id="flatpak">Flatpak&lt;/h2>
&lt;p>Flatpak is a packaging format for graphical applications that works on any GNU/Linux distribution. It is the most widely embraced packaging format for GNOME applications. To get flatpak on your distro of choice, run:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Ubuntu&lt;/strong>:&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span> sudo apt install flatpak
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;strong>Arch&lt;/strong>:&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span> sudo pacman -S flatpak
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;strong>Fedora&lt;/strong>:&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span> &lt;span style="color:#60a0b0;font-style:italic"># already installed&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="flathub">Flathub&lt;/h2>
&lt;p>Flathub is an app store for the flatpak packaging format. It&amp;rsquo;s one of the biggest software catalogs in the Linux world! You can get it on your computer by running:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>flatpak remote-add --user --if-not-exists flathub &lt;span style="color:#4070a0;font-weight:bold">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-weight:bold">&lt;/span> https://flathub.org/repo/flathub.flatpakrepo
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="gnome-builder">GNOME Builder&lt;/h2>
&lt;p>Finally, GNOME Builder is an integrated development environment (IDE) for developing applications in the GNOME ecosystem. Install it with:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>flatpak install org.gnome.Builder
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>And you&amp;rsquo;re all set!&lt;/p>
&lt;h1 id="what-is-gnome">What is GNOME?&lt;/h1>
&lt;p>GNOME is a software platform. That means GNOME provides an integrated stack for software development, distribution, and consumption.&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/1st-contribution-hackathon/platform.png" alt=""/>
&lt;/p>
&lt;/p>
&lt;p>An important part of this ecosystem are the GNOME apps, to which we&amp;rsquo;ll contribute in this event! These apps are built with GTK, using GNOME Human Interface Guidelines (HIG).&lt;/p>
&lt;h1 id="what-is-gtk">What is GTK?&lt;/h1>
&lt;p>GTK is a fundamental building block for the applications that belong in the GNOME software platform. In programmer&amp;rsquo;s lingo, GTK is an object oriented widgets-based framework for developing graphical applications. Now let&amp;rsquo;s break that down in plain English:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Object oriented&lt;/strong>:&lt;/li>
&lt;/ul>
&lt;p>Object Oriented Programming is a programming paradigm that seeks to improve code organization, reduce code duplication, among many other things. Object Oriented Programming is very &amp;ldquo;concept heavy&amp;rdquo;, so teaching everything about it is out of scope for this event. Still, we hope to spark your curiosity enough for you to look it up on your own later :)&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Widgets-based&lt;/strong>:&lt;/li>
&lt;/ul>
&lt;p>In GTK, every graphical element is a &amp;ldquo;widget&amp;rdquo;. These widgets are organized hierarchically, for example &lt;code>Window → Header bar → Menu button&lt;/code>. Here are some of the widgets and their names, in the wonderful &lt;a href="https://flathub.org/apps/com.github.tenderowl.frog">Frog&lt;/a> application:&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/1st-contribution-hackathon/widgets.png" alt=""/>
&lt;/p>
&lt;/p>
&lt;p>Widgets&amp;rsquo; behavior and appearance can be configured with a programming language (C, Python, Rust, JavaScript, Vala, etc) and/or a markup language (XML, Blueprint, etc).&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Graphical applications&lt;/strong>:&lt;/li>
&lt;/ul>
&lt;p>Graphical applications are applications that show a window to the user. Some applications are not graphical, for example, that ones that run directly on the terminal.&lt;/p>
&lt;h1 id="access-keys">Access Keys&lt;/h1>
&lt;h2 id="what">What?&lt;/h2>
&lt;p>GTK has a feature called Access Keys (also known as &amp;ldquo;mnemonics&amp;rdquo;). Here&amp;rsquo;s how it works:&lt;/p>
&lt;ul>
&lt;li>Hold the &lt;code>Alt&lt;/code> key until some characters are underlined&lt;/li>
&lt;li>Press an underlined characters while you hold &lt;code>Alt&lt;/code>&lt;/li>
&lt;li>The action associated with that widget will be triggered&lt;/li>
&lt;/ul>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/1st-contribution-hackathon/mnemonics.gif" alt=""/>
&lt;/p>
&lt;/p>
&lt;h2 id="why">Why?&lt;/h2>
&lt;p>Access Keys are an important for two use cases:&lt;/p>
&lt;ul>
&lt;li>Offering a keyboard-centric workflow for power users&lt;/li>
&lt;li>Improving the accessibility of the GNU/Linux desktop&lt;/li>
&lt;/ul>
&lt;h2 id="how">How?&lt;/h2>
&lt;p>To implement an Access Key for a widget within a application, you need to prepend an &lt;em>underline&lt;/em> (&lt;code>_&lt;/code>) to whichever character you want to highlighted when the user hold the &lt;code>Alt&lt;/code> key. For example, to highlight the &lt;code>C&lt;/code> in button whose label is &lt;code>&amp;quot;Continue&amp;quot;&lt;/code>, go with &lt;code>&amp;quot;_Continue&amp;quot;&lt;/code>.&lt;/p>
&lt;p>Then, activate the Access Key feature for that widget. To do that you need to set the property &amp;ldquo;&lt;code>user-underline&lt;/code>&amp;rdquo; to &lt;code>True&lt;/code>.&lt;/p>
&lt;p>This can sometimes be done with programming or markup languages. For programming languages, you&amp;rsquo;ll find some examples in the &lt;a href="https://developer.gnome.org/documentation/tutorials/beginners/components/label.html?highlight=mnemonics">official documentation&lt;/a>. Luckly for you, we have also made some additional examples, which you can checkout in the &lt;a href="https://docs.google.com/spreadsheets/u/1/d/1XX9s93jsXsXu76Hg0k6uS-dThXfiSssc7rZ_BE2fgyY/edit?usp=sharing">Projects Sheet&lt;/a>. Here are some highlights:&lt;/p>
&lt;h3 id="example-in-xml">Example in XML&lt;/h3>
&lt;p>Contribution by Gustavo Pechta to the app &amp;ldquo;Komikku&amp;rdquo; (&lt;a href="https://gitlab.com/valos/Komikku/-/merge_requests/180/diffs#83c420f8542fe5bed57cdd7f5ac8234e05dce352">link&lt;/a>).&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/1st-contribution-hackathon/mnemonics-xml.png" alt=""/>
&lt;/p>
&lt;/p>
&lt;h3 id="example-in-python">Example in Python&lt;/h3>
&lt;p>Contribution by Tárik Sá to the app &amp;ldquo;What IP&amp;rdquo; (&lt;a href="https://gitlab.gnome.org/GabMus/whatip/-/merge_requests/35/diffs">link&lt;/a>).&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/1st-contribution-hackathon/mnemonics-python.png" alt=""/>
&lt;/p>
&lt;/p>
&lt;h3 id="example-in-javascript">Example in Javascript&lt;/h3>
&lt;p>Contribution by Pedro Sader Azevedo to the extension &amp;ldquo;Space Bar&amp;rdquo; (&lt;a href="https://github.com/christopher-l/space-bar/pull/3/commits/6527e5942de5997e573f8bf9ae5cf976c89415df">link&lt;/a>).&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/1st-contribution-hackathon/mnemonics-javascript.png" alt=""/>
&lt;/p>
&lt;/p>
&lt;h3 id="gnome-human-interface-guidelines">GNOME Human Interface Guidelines&lt;/h3>
&lt;p>Now you might asking yourself: How to I decide which widgets to add mnemonics to? Which characters should I choose to underline?&lt;/p>
&lt;p>The answer to all these questions (and plenty more) lie in the &lt;a href="https://developer.gnome.org/hig/">&lt;em>GNOME Human Interface Guidelines (HIG)&lt;/em>&lt;/a>. This document describes, in a very detailed manner, directives for building graphical user interfaces that comply with the design standards of GNOME.&lt;/p>
&lt;p>The HIG contains &lt;a href="https://developer.gnome.org/hig/guidelines/keyboard.html">a section on Access Keys&lt;/a>, that you should read thoroughly (it&amp;rsquo;s very short). When you&amp;rsquo;re back, here&amp;rsquo;s summary on how to implement Access Keys in GNOME apps:&lt;/p>
&lt;ul>
&lt;li>As many as you can&lt;/li>
&lt;li>Prioritize most used widgets&lt;/li>
&lt;li>Prefer the first letter&lt;/li>
&lt;li>Avoid thin letters (i)&lt;/li>
&lt;li>Avoid ambiguous letters (I, l)&lt;/li>
&lt;li>Avoid letters with descenders (g, y, q)&lt;/li>
&lt;li>Avoid vowels (a, e, i, o, u)&lt;/li>
&lt;/ul>
&lt;p>Tip: view switchers are usually good candidates for Access Keys! They can often be found in preferences screens and look like this:&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/1st-contribution-hackathon/view-switcher-top.png" alt=""/>
&lt;/p>
&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/1st-contribution-hackathon/view-switcher-bottom.png" alt=""/>
&lt;/p>
&lt;/p>
&lt;h1 id="git">Git&lt;/h1>
&lt;p>The most popular version control system is &lt;code>git&lt;/code>. We&amp;rsquo;ll need to use its command line interface (CLI) to make our contribution but, unfortunately, &lt;code>git&lt;/code> is a very complex and convoluted tool. Teaching all about it would take a very long (probably a workshop of its own). If want a deeper introduction to the concepts of &lt;code>git&lt;/code> you can read &lt;a href="https://pesader.dev/posts/the-tip-of-the-git-iceberg/">&amp;ldquo;The tip of the git iceberg&amp;rdquo;&lt;/a>, by yours truly 😉.&lt;/p>
&lt;p>That being said, we&amp;rsquo;ll only give you what you need for this workshop:&lt;/p>
&lt;ol>
&lt;li>Download the source code of the application&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git clone https://...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>Create a new branch for your contribution&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git checkout -b add-access-keys
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
&lt;li>See commit history to check for conventions&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git log
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="4">
&lt;li>Create a new version of the application&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git commit
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="5">
&lt;li>Send your branch to your GitHub/GitLab account&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git push origin add-access-keys
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="alert"
style="color: rgba(var(--bs-danger-rgb), 1); background-color: rgba(var(--bs-danger-rgb), .1);">
&lt;strong>Warning&lt;/strong>: We&amp;rsquo;ll contribute to projects that are hosted on GitHub and GitLab. Although there&amp;rsquo;s only link for GitHub (github.com), there are multiple links to GitLab (gitlab.com, gitlab.gnome.org, etc). Make sure you create your account using the same GitLab link as your chosen project is hosted at.
&lt;/div>
&lt;p>After you&amp;rsquo;ve pushed your changes to your GitHub/GitLab account, you have to request that the maintainers of the project accept your contribution. This is known as a &amp;ldquo;merge request&amp;rdquo; (MR) or a &amp;ldquo;pull request&amp;rdquo; (PR).&lt;/p>
&lt;p>When either of these git platforms detect a &lt;code>git push&lt;/code> coming from you, they will offer you to create an MR/PR. Accept the offer and write a detailed description of what your contribution does. Again, you can check the examples in the &lt;a href="https://docs.google.com/spreadsheets/u/1/d/1XX9s93jsXsXu76Hg0k6uS-dThXfiSssc7rZ_BE2fgyY/edit?usp=sharing">Project Sheet&lt;/a>.&lt;/p>
&lt;h1 id="hackathon">Hackathon&lt;/h1>
&lt;p>Finally, you&amp;rsquo;re all set! Follow the steps below to make your first code contribution to GNOME and don&amp;rsquo;t hesitate to ask any questions.&lt;/p>
&lt;ol>
&lt;li>Open the page of links and pin that tab in your browser&lt;/li>
&lt;li>Pick a project and write down your name in the sheet&lt;/li>
&lt;li>Find the project&amp;rsquo;s repository in its Flathub page&lt;/li>
&lt;li>Install it and check if still doesn&amp;rsquo;t have Access Keys&lt;/li>
&lt;li>Create an account and access token at GitHub/GitLab&lt;/li>
&lt;li>Fork the the project and clone your fork&lt;/li>
&lt;li>Build once without any modifications&lt;/li>
&lt;li>Implement the Access Keys following the HIG&lt;/li>
&lt;li>Check the commit conventions&lt;/li>
&lt;li>Commit, push, and make a PR/MR&lt;/li>
&lt;li>Put the PR/MR link in the sheet&lt;/li>
&lt;li>Wait for feedback and iterate&lt;/li>
&lt;/ol>
&lt;h1 id="attribution">Attribution&lt;/h1>
&lt;p>This blog post is a slightly re-written translation of this &lt;a href="https://lkcamp.dev/posts/hackathon-de-1-caractere-parte-ii/">blog post&lt;/a> by LKCAMP, which was originally written in Brazilian Portuguese by myself and Tárik Sá.&lt;/p></description></item><item><title>Hello Planet GNOME!</title><link>https://pesader.dev/posts/hello-planet-gnome/</link><pubDate>Tue, 09 May 2023 17:10:50 -0300</pubDate><guid>https://pesader.dev/posts/hello-planet-gnome/</guid><description>
&lt;p>Hi, everyone!&lt;/p>
&lt;p>I’m Pedro Sader Azevedo, a Computer Engineering student at Universidade
Estadual de Campinas (Unicamp) in Brazil. In the next few months I’ll be
working as a Google Summer of Code (GSoC) intern to integrate the functionality
of GNOME Network Displays into GNOME Settings, with the guidance of Felipe
Borges, Claudio Wunder, Jonas Ådahl, and Anupam Kumar.&lt;/p>
&lt;h1 id="more-about-me">More about me&lt;/h1>
&lt;p>During the pandemic, when every aspect of life was moved to the digital realm,
I learned about Free Software and was won over by its principled stance on
technology. I decided to take back my computing and became a user (and vocal
advocate) of GNU/Linux!&lt;/p>
&lt;p>Soon after, I helped organize The Week of Computing at my university. I invited
a representative of GNOME (the one and only Georges Stavracas!), whose talk was
especially impressive to me as I thoroughly identified with the values of
freedom, collaboration, and inclusivity embodied by the project.&lt;/p>
&lt;p>I started contributing with translations (which I still do a lot!) and was so
warmly welcomed that I soon started programming as well. I also contribute with
community-engagement, by helping the Free and Open Source Software study group
&lt;a href="https://lkcamp.dev/about/">LKCAMP&lt;/a> organize events that promote usage of and
contribution to FOSS projects.&lt;/p>
&lt;h1 id="more-about-my-internship">More about my internship&lt;/h1>
&lt;p>The goal of the internship is to the add networks displays (i.e. &amp;ldquo;screen
casting&amp;rdquo;) to GNOME Settigs. I plan to do that by separating the backend of
GNOME Network Displays into a library, then using that library to implement
the new feature on the settings app.&lt;/p>
&lt;p>This change will contribute to the general impression of using a “first-class”
operating system that seamlessly integrates with others. While it is true that
the app already provides said feature, finding it directly in Settings is much
more reassuring and convenient than having to install a separate program just
for that.&lt;/p>
&lt;hr>
&lt;p>If there&amp;rsquo;s anything you&amp;rsquo;d like to discuss, feel free to reach out to me using
any of the communication plaforms listed &lt;a href="https://keyoxide.org/hkp/adcfe1009ec391e7cc38ec13e7497b22c97fe966">here&lt;/a>
(I&amp;rsquo;m most active on Matrix though).&lt;/p>
&lt;p>Thank you for reading!&lt;/p></description></item><item><title>Making 4 GNOME Shell extensions compatible with GNOME 44</title><link>https://pesader.dev/posts/making-4-extensions-compatible-with-gnome-44/</link><pubDate>Mon, 08 May 2023 19:14:37 -0300</pubDate><guid>https://pesader.dev/posts/making-4-extensions-compatible-with-gnome-44/</guid><description>
&lt;p>I absolutely love extensions, in general. I remember being blown away every
time I found a notably extensible software, from Firefox add-ons in my early
days of surfing the web to Neovim plugins in my latest coding endeavors.&lt;/p>
&lt;p>This is why, once I started using GNU/Linux, I was amazed by GNOME Shell
extensions. Being able to customize the appearance and behavior of my desktop
environment as easily as used to with VS Code extensions was unimaginable
coming from Windows and I loved every bit of it.&lt;/p>
&lt;p>Since then, I&amp;rsquo;ve been a GNOME Shell extension fanatic and only upgraded my
workstation when all extensions were made compatible with the latest version of
GNOME. The addition of an upgrade assistant to Extension Manager made the wait
easier, though not shorter.&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/making-4-extensions-compatible-with-gnome-44/./images/assistant.png" alt="assistant"/>
&lt;/p>
&lt;/p>
&lt;p>Now that my current distro of choice (Fedora Silverblue) allows upgrading early
and safely, I decided to do something different: upgrade right away and
contribute to the extensions with GNOME 44 support!&lt;/p>
&lt;p>These were the extensions I chose to contribute with:&lt;/p>
&lt;h2 id="ddtermhttpsextensionsgnomeorgextension3780ddterm">&lt;a href="https://extensions.gnome.org/extension/3780/ddterm/">&lt;strong>ddterm&lt;/strong>&lt;/a>&lt;/h2>
&lt;p>A drop down terminal extension for GNOME Shell. With tabs. Works on
Wayland natively. I use it every day as my music player, with &lt;code>ncspot&lt;/code>.&lt;/p>
&lt;h2 id="focus-changerhttpsextensionsgnomeorgextension4627focus-changer">&lt;a href="https://extensions.gnome.org/extension/4627/focus-changer/">&lt;strong>Focus changer&lt;/strong>&lt;/a>&lt;/h2>
&lt;p>Change focus between windows in all directions, using vim-like mappings
(&lt;code>Super&lt;/code> + &lt;code>h&lt;/code>, &lt;code>j&lt;/code>, &lt;code>k&lt;/code>, &lt;code>l&lt;/code>). Can&amp;rsquo;t beat that muscle memory!&lt;/p>
&lt;h2 id="focused-window-dbushttpsextensionsgnomeorgextension5592focused-window-d-bus">&lt;a href="https://extensions.gnome.org/extension/5592/focused-window-d-bus/">&lt;strong>Focused Window dbus&lt;/strong>&lt;/a>&lt;/h2>
&lt;p>Exposes a dbus method to get active window title and class. Required to get
ActivityWatch working on mutter.&lt;/p>
&lt;h2 id="reading-striphttpsextensionsgnomeorgextension4419reading-strip">&lt;a href="https://extensions.gnome.org/extension/4419/reading-strip/">&lt;strong>Reading Strip&lt;/strong>&lt;/a>&lt;/h2>
&lt;p>Works as a reading guide for computer and this is really useful for people
affected by dyslexia. Useful to avoid mixing up table rows and columns!&lt;/p>
&lt;p>Here&amp;rsquo;s how that experiment went.&lt;/p>
&lt;h1 id="upgrading-to-gnome-44">Upgrading to GNOME 44&lt;/h1>
&lt;p>As I said, version upgrades are safe and easy on Fedora Silverblue! All I had
to do was pin my current deployment with:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo ostree admin pin &lt;span style="color:#40a070">0&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Then rebase to latest Fedora release:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>rpm-ostree rebase fedora:fedora/38/x86_64/silverblue
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="locating-extension-directories">Locating extension directories&lt;/h1>
&lt;p>With GNOME 44 installed on my machine, it was time to locate where the GNOME
Shell extensions were installed. Extensions installed via EGO or Extension
Manager are located at &lt;code>$HOME/.local/share/gnome-shell/extensions&lt;/code>.&lt;/p>
&lt;p>Each extension has a dedicated folder, whose name looks like
&lt;code>extension-name@author.example.com&lt;/code>.&lt;/p>
&lt;h1 id="editing-the-metadatajson-file">Editing the &lt;code>metadata.json&lt;/code> file&lt;/h1>
&lt;p>On each of these directories there&amp;rsquo;s a &lt;code>metadata.json&lt;/code>, that includes a list
called &amp;ldquo;&lt;code>shell-version&lt;/code>&amp;rdquo; with the versions of GNOME supported by the extension.
My first test was to simply add &amp;ldquo;&lt;code>44&lt;/code>&amp;rdquo; to that list and see what happened, like
so:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-diff" data-lang="diff">&lt;span style="display:flex;">&lt;span> &amp;#34;shell-version&amp;#34;: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;#34;40&amp;#34;,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;#34;41&amp;#34;,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;#34;42&amp;#34;,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a00000">- &amp;#34;43&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a00000">&lt;/span>&lt;span style="color:#00a000">+ &amp;#34;43&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#00a000">+ &amp;#34;44&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#00a000">&lt;/span> ],
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="restarting-the-session">Restarting the session&lt;/h1>
&lt;p>Wayland requires logging out to restart the session, so I logged out and logged
in again.&lt;/p>
&lt;h1 id="tweaking-if-needed">Tweaking, if needed&lt;/h1>
&lt;p>To my surprise, three out of four extensions worked by simply changing the
&lt;code>metadata.json&lt;/code> file!&lt;/p>
&lt;p>The &lt;strong>Focused Window dbus&lt;/strong> extension loaded properly, but when I tried to
actually call its dbus method I got an error saying that the &lt;code>canshade&lt;/code>
window property didn&amp;rsquo;t exist. Since that didn&amp;rsquo;t seem essential for the
extension&amp;rsquo;s funcionality I removed the code related to that and tried
again. This time, it worked perfectly!&lt;/p>
&lt;h1 id="contributing">Contributing&lt;/h1>
&lt;p>After using the extensions on GNOME 44 for a few days without any issues I
decided to contribute to them. Some extensions a specific commit tag for
changes made to &lt;code>metadata.json&lt;/code>, so I made sure to use them in my
contributions.&lt;/p>
&lt;p>I think this a simple but valuable contribution, making it an excellent gateway
into contributing to GNOME Extensions and FOSS projects in general. Give it a
shot! 🧩❤️&lt;/p></description></item><item><title>Adding an RSS feed for GNOME-related posts</title><link>https://pesader.dev/posts/adding-an-rss-feed-for-gnome-related-posts/</link><pubDate>Mon, 08 May 2023 09:40:43 -0300</pubDate><guid>https://pesader.dev/posts/adding-an-rss-feed-for-gnome-related-posts/</guid><description>
&lt;p>I recently got news that I was accepted as a Google Summer of Code (GSoC)
contributor for the GNOME Project! I&amp;rsquo;ll work on integrating the functionality
of GNOME Network Displays into GNOME Settings, and I&amp;rsquo;ll be reporting my
progress publicly in this blog.&lt;/p>
&lt;p>Before the contribution period starts, there&amp;rsquo;s a month-long Community Bonding
Period. On GNOME, GSoC interns are asked to add an RSS feed of their blogs to
&lt;a href="https://planet.gnome.org">Planet GNOME&lt;/a>. For that purpose, I&amp;rsquo;ll show in this
post how I added and configured an RSS feed for my Hugo-powered blog.&lt;/p>
&lt;p>You are welcome to use my website&amp;rsquo;s theme if you want a blog with the same
looks and functionality, but you can also uso this as a guide for implementing
an RSS feed on your theme. Either way, I&amp;rsquo;ll assume you have a working Hugo
theme you can build from as some knowledge about Hugo (taxonomies, page
variables, &lt;code>config.toml&lt;/code> options, etc).&lt;/p>
&lt;h2 id="1-reference-the-rss-feed-in-head">1. Reference the RSS feed in &lt;code>&amp;lt;head&amp;gt;&lt;/code>&lt;/h2>
&lt;p>Thankfully, Hugo has built-in support for RSS feeds! The first thing you need
to do to use this feature in adding a reference to the RSS output format on
the &lt;code>&amp;lt;head&amp;gt;&lt;/code> tag of your blog, like so:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>{{ with .OutputFormats.Get &amp;#34;RSS&amp;#34; -}}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{{ printf `&amp;lt;&lt;span style="color:#062873;font-weight:bold">link&lt;/span> &lt;span style="color:#4070a0">rel&lt;/span>&lt;span style="color:#666">=&lt;/span>&lt;span style="color:#4070a0">&amp;#34;%s&amp;#34;&lt;/span> &lt;span style="color:#4070a0">type&lt;/span>&lt;span style="color:#666">=&lt;/span>&lt;span style="color:#4070a0">&amp;#34;%s&amp;#34;&lt;/span> &lt;span style="color:#4070a0">href&lt;/span>&lt;span style="color:#666">=&lt;/span>&lt;span style="color:#4070a0">&amp;#34;%s&amp;#34;&lt;/span> &lt;span style="color:#4070a0">title&lt;/span>&lt;span style="color:#666">=&lt;/span>&lt;span style="color:#4070a0">&amp;#34;%s&amp;#34;&lt;/span>&amp;gt;` .Rel .MediaType.Type .RelPermalink $.Site.Title | safeHTML }}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{{- end }}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>It is a best-practice to define this tag in a file that you use as a base for all
other files in your website (I do it in the &lt;a href="https://github.com/pesader/hugo-bootstrap-freelancer-template/blob/ceb6e7c0f7f543f1d705fd5218bcda8122973bbe/layouts/_default/baseof.html#L11-L13">&lt;code>baseof.html&lt;/code>&lt;/a>
file).&lt;/p>
&lt;h2 id="2-configure-a-basename-in-configtoml">2. Configure a baseName in &lt;code>config.toml&lt;/code>&lt;/h2>
&lt;p>You should now add the following to the &lt;code>config.toml&lt;/code> file of your website:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-toml" data-lang="toml">&lt;span style="display:flex;">&lt;span>[outputFormats]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[outputFormats.RSS]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> mediaType = &lt;span style="color:#4070a0">&amp;#34;application/rss+xml&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> baseName = &lt;span style="color:#4070a0">&amp;#34;feed&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you push these changes, you will have an RSS feed for any taxonomy (tags,
categories, authors, etc) of your blog! To get the RSS &lt;code>.xml&lt;/code> file, head over
to the taxonomy list and append &amp;ldquo;&lt;code>/feed&lt;/code>&amp;rdquo; to it. Take a look:&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/adding-an-rss-feed-for-gnome-related-posts/./rss.png" alt="rss xml"/>
&lt;/p>
&lt;/p>
&lt;h2 id="3-override-the-default-rss-template">3. Override the default RSS template&lt;/h2>
&lt;p>You may find that the content of the RSS feed isn&amp;rsquo;t exactly what you hoped for.
By default, Hugo only includes a summary (the first paragraph) in the feeds,
but you probably the whole thing to be included in &lt;a href="https://planet.gnome.org">Planet GNOME&lt;/a>!
To fix that, you&amp;rsquo;ll need to write a custom &lt;code>rss.xml&lt;/code> template. Luckly, you
won&amp;rsquo;t have to start from the ground-up &amp;ndash; let&amp;rsquo;s just copy Hugo&amp;rsquo;s default and
start from there.&lt;/p>
&lt;p>First, copy the contents of &lt;a href="https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/_default/rss.xml">this file&lt;/a>
to &lt;code>layouts/_default/rss.xml&lt;/code>. Then do the following change:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-diff" data-lang="diff">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a00000">- &amp;lt;description&amp;gt;{{ .Summary | html }}&amp;lt;/description&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a00000">&lt;/span>&lt;span style="color:#00a000">+ &amp;lt;description&amp;gt;{{ .Content | html }}&amp;lt;/description&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you want to include only one section of content in your RSS feed, now&amp;rsquo;s the
time to do that too. For instance, to include only &amp;ldquo;posts&amp;rdquo; you may do the
following change:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-diff" data-lang="diff">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a00000">- {{- if or $.IsHome $.IsSection -}}
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a00000">- {{- $pages = $pctx.RegularPages -}}
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a00000">- {{- else -}}
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a00000">- {{- $pages = $pctx.Pages -}}
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a00000">- {{- end -}}
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a00000">&lt;/span>&lt;span style="color:#00a000">+ {{- if or $.IsHome $.IsSection -}}
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#00a000">+ {{- $pages = (where (where $pctx.RegularPages &amp;#34;.Section&amp;#34; &amp;#34;posts&amp;#34;) &amp;#34;Kind&amp;#34; &amp;#34;page&amp;#34;) -}}
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#00a000">+ {{- else -}}
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#00a000">+ {{- $pages = (where (where $pctx.Pages &amp;#34;.Section&amp;#34; &amp;#34;posts&amp;#34;) &amp;#34;Kind&amp;#34; &amp;#34;page&amp;#34;) -}}
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#00a000">+ {{- end -}}
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can checkout the &lt;code>rss.xml&lt;/code> for my website &lt;a href="https://github.com/pesader/hugo-bootstrap-freelancer-template/blob/ceb6e7c0f7f543f1d705fd5218bcda8122973bbe/layouts/_default/rss.xml">here&lt;/a>.&lt;/p>
&lt;h2 id="4-add-custom-markdown-render-hook">4. Add custom markdown render hook&lt;/h2>
&lt;p>If you inspect the &lt;code>.xml&lt;/code> file generated by Hugo at this point, it is possible
that the paths for markdown images are wrong. This happens because it is common
to use relative paths for including images in markdown, but the RSS feed
doesn&amp;rsquo;t factor that in by default.&lt;/p>
&lt;p>Gladly, Hugo allows tweaking the conversion of markdown to html with &lt;a href="https://gohugo.io/templates/render-hooks/">Markdown
Render Hooks&lt;/a>, which can be used to
convert relative paths to absolute paths. If you store all images related to a
blog post in its dedicated directory (like I do), all you need to do is create
a file named &lt;code>render-image.rss.xml&lt;/code> under the &lt;code>/layouts/_default/_markup/&lt;/code>
directory and fill it with:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#062873;font-weight:bold">p&lt;/span> &lt;span style="color:#4070a0">class&lt;/span>&lt;span style="color:#666">=&lt;/span>&lt;span style="color:#4070a0">&amp;#34;md__image&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#062873;font-weight:bold">img&lt;/span> &lt;span style="color:#4070a0">src&lt;/span>&lt;span style="color:#666">=&lt;/span>&lt;span style="color:#4070a0">&amp;#34;{{ printf &amp;#34;&lt;/span>&lt;span style="">%&lt;/span>&lt;span style="color:#4070a0">s&lt;/span>&lt;span style="">%&lt;/span>&lt;span style="color:#4070a0">s&lt;/span>&lt;span style="">&amp;#34;&lt;/span> &lt;span style="">.&lt;/span>&lt;span style="color:#4070a0">Page&lt;/span>&lt;span style="">.&lt;/span>&lt;span style="color:#4070a0">Permalink&lt;/span> &lt;span style="">.&lt;/span>&lt;span style="color:#4070a0">Destination&lt;/span> &lt;span style="">|&lt;/span> &lt;span style="color:#4070a0">safeURL&lt;/span> &lt;span style="">}}&amp;#34;&lt;/span> &lt;span style="color:#4070a0">alt&lt;/span>&lt;span style="color:#666">=&lt;/span>&lt;span style="color:#4070a0">&amp;#34;{{ .Text }}&amp;#34;&lt;/span>/&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#062873;font-weight:bold">p&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can checkout the &lt;code>render-image.rss.xml&lt;/code> for my website &lt;a href="https://github.com/pesader/hugo-bootstrap-freelancer-template/blob/ceb6e7c0f7f543f1d705fd5218bcda8122973bbe/layouts/_default/_markup/render-image.rss.xml">here&lt;/a>.&lt;/p>
&lt;h2 id="5-test-the-feed-in-an-aggregator">5. Test the feed in an aggregator&lt;/h2>
&lt;p>You&amp;rsquo;re done! I recommend you try adding your blog to an RSS feed
reader/aggregator, so you can make sure it works as intended. I like using
&lt;a href="https://flathub.org/apps/com.gitlab.newsflash">NewsFlash&lt;/a> for this, so here&amp;rsquo;s
how you can do it there.&lt;/p>
&lt;p>First, find the page in your blog that lists the content that you want to add
to the feed. In my case, I want all posts tagged with GNOME to be included in
Planet GNOME, so the link to the page that lists those is &lt;a href="https://pesader.dev/tags/gnome/">&lt;code>https://pesader.dev/tags/gnome&lt;/code>&lt;/a>:&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/adding-an-rss-feed-for-gnome-related-posts/./test_01.png" alt="RSS feed test part I"/>
&lt;/p>
&lt;/p>
&lt;p>Copy that link and add it to NewsFlash (appending &lt;code>/feed&lt;/code> is optional):&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/adding-an-rss-feed-for-gnome-related-posts/./test_02.png" alt="RSS feed test part II"/>
&lt;/p>
&lt;/p>
&lt;p>And make sure it&amp;rsquo;s working (especially the images!):&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/adding-an-rss-feed-for-gnome-related-posts/./test_03.png" alt="RSS feed test part III"/>
&lt;/p>
&lt;/p>
&lt;p>That&amp;rsquo;s all for today, hope you learned something useful!&lt;/p>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://digitaldrummerj.me/hugo-create-rss-feed/">Justin James: Create RSS Feed for Site&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://gohugo.io/templates/rss/">Hugo Documentation: RSS templates&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://gohugo.io/templates/render-hooks/">Hugo Documentation: Markdown Render Hooks&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://discourse.gohugo.io/t/string-variable-concatenation-to-build-path-for-partial/701/3">Hugo Discourse: string concatenation to build path for partial&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Safely building and running GNOME Settings with toolbx</title><link>https://pesader.dev/posts/safely-building-and-running-gnome-settings-with-toolbx/</link><pubDate>Mon, 03 Apr 2023 18:20:51 -0300</pubDate><guid>https://pesader.dev/posts/safely-building-and-running-gnome-settings-with-toolbx/</guid><description>
&lt;p>Toolbx is a utility that empowers users and developers to install software on
isolated environments, drastically reducing the risk of compromising the
stability of their operating system. It is also indispensable for users of
immutable distros (e.g. Fedora Silverblue, Endless OS, Vanilla OS, etc) like
myself.&lt;/p>
&lt;p>On this blog post I&amp;rsquo;ll share how I used toolbx to safely build and run GNOME
Settings.&lt;/p>
&lt;h1 id="step-0-backup-all-your-settings">Step 0: backup all your settings&lt;/h1>
&lt;p>The isolation provided by toolbx only applies to system directories (those
that you need &lt;code>sudo&lt;/code> to make changes to). That means your &lt;code>$HOME&lt;/code> directory is
as vulnerable to mishaps as it is outside of the toolbx!&lt;/p>
&lt;p>Since your preferences are stored within your &lt;code>$HOME&lt;/code> directory make sure you
back them up before meddling with an unstable version of the GNOME Settings
app. To make the backup run:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>dconf dump / &amp;gt; &lt;span style="color:#bb60d5">$HOME&lt;/span>/preferences_backup.ini
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Again, since your &lt;code>$HOME&lt;/code> directory is not safer inside a toolbx, move that
file somewhere else (e.g. a USB stick, a trusted cloud storage provider, etc).
To restore the backup file, move it back to your &lt;code>$HOME&lt;/code> directory and run:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>dconf load -f / &amp;lt; &lt;span style="color:#bb60d5">$HOME&lt;/span>/preferences_backup.ini
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="step-1-choose-the-right-toolbx-image">Step 1: choose the right toolbx image&lt;/h1>
&lt;p>To choose the operating system that will run on our toolbx, you need to pick
its base image. To figure that out, take a look at the &lt;code>.gitlab-ci.yml&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yml" data-lang="yml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#062873;font-weight:bold">.fedora.container.common&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#60a0b0;font-style:italic"># ...&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">tags&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>[&lt;span style="color:#bbb"> &lt;/span>crun ]&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">variables&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#60a0b0;font-style:italic"># ...&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">FDO_DISTRIBUTION_TAG&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#4070a0">&amp;#39;2023-03-14.0-main&amp;#39;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">FDO_DISTRIBUTION_VERSION&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>rawhide&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Looks like GNOME Settings is targetting Fedora Rawhide, which is a rolling
build of Fedora that has the purpose of testing software for upcoming releases.
That said, you can create your toolbx with the following command:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>toolbox create gnome-control-center --image registry.fedoraproject.org/fedora-toolbox:rawhide
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you are doing this for the first time, this command will download the Fedora
Rawhide toolbx image. It will take some time and some storage (500Mb) but don&amp;rsquo;t
worry it&amp;rsquo;ll be worth it! Once the toolbx is created, enter it with:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>toolbox enter gnome-control-center
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="step-2-installing-dependencies">Step 2: installing dependencies&lt;/h1>
&lt;p>To install the dependencies needed to build GNOME Settings, simply run:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo dnf builddep gnome-control-center
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="step-3-building-and-running">Step 3: building and running&lt;/h1>
&lt;p>Finally, head to the root of its repository and run:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>make _build &lt;span style="color:#666">&amp;amp;&amp;amp;&lt;/span> ninja -C _build
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This will build GNOME Settings at &lt;code>./_build/shell/gnome-control-center&lt;/code>.&lt;/p>
&lt;h1 id="step-4-taking-advantage-of-the-isolation">Step 4: taking advantage of the isolation&lt;/h1>
&lt;p>To run the executable file, you can leave the toolbx and execute like so:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#007020">exit&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>./_build/shell/gnome-control-center
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>However, you may want to run it inside your toolbx! If that&amp;rsquo;s the case, you
also have to install your local build of GNOME Settings. To do that, run:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>ninja -C _build install
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This will allow you to take advantage of the isolated environment provided by
toolbx! For instance, when was writing &lt;a href="https://gitlab.gnome.org/GNOME/gnome-control-center/-/merge_requests/1759">this
contribution&lt;/a>
to the applications panel, I wanted to test a few apps that I didn&amp;rsquo;t have
(nor wanted to have) installed on my system. To address that, I installed a few
applications inside my development toolbx! As you can see, the Settings app
lists different applications when I open it from inside or from outside of the
toolbx:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Outside toolbx&lt;/th>
&lt;th>Inside toolbx&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/safely-building-and-running-gnome-settings-with-toolbx/system.png" alt="Applications panel outside of toolbox"/>
&lt;/p>
&lt;/td>
&lt;td>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/safely-building-and-running-gnome-settings-with-toolbx/toolbx.png" alt="Applications panel inside of toolbox"/>
&lt;/p>
&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>That&amp;rsquo;s all! Hope this was useful for you!&lt;/p>
&lt;h1 id="credit">Credit&lt;/h1>
&lt;p>This post is a personal take on the GNOME Settings&amp;rsquo; own
&lt;a href="https://gitlab.gnome.org/GNOME/gnome-control-center/-/wikis/Building-GNOME-Settings-in-a-Toolbx">guide&lt;/a>
on building with toolbx.&lt;/p></description></item><item><title>Entering the rabbit hole of GNOME Network Displays</title><link>https://pesader.dev/posts/entering-the-rabbit-hole-of-gnome-network-displays/</link><pubDate>Mon, 03 Apr 2023 15:34:02 -0300</pubDate><guid>https://pesader.dev/posts/entering-the-rabbit-hole-of-gnome-network-displays/</guid><description>
&lt;p>In this blog post I&amp;rsquo;ll walk you through my journey of builiding and
contributing to GNOME Network Displays, a standalone application for
screencasting. Fasten your seatbelts, it&amp;rsquo;s gonna be a bumpy ride!&lt;/p>
&lt;h1 id="building-the-application">Building the application&lt;/h1>
&lt;p>First, I cloned the
&lt;a href="https://gitlab.gnome.org/GNOME/gnome-network-displays">repository&lt;/a> of the
application and created a fresh Fedora Rawhide (currently labelled as 39)
toolbx for this project. To do that I ran:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>toolbox create gnome-network-displays --image registry.fedoraproject.org/fedora-toolbox:39
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Following the build instructions on the &lt;code>README.md&lt;/code> file I ran:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo dnf builddep gnome-network-displays
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>meson build
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ninja -C build
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>But I got this error:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>ninja: error: &amp;#39;/usr/lib64/libavahi-gobject.so&amp;#39;, needed by &amp;#39;src/gnome-network-displays&amp;#39;, missing and no known rule to make it
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>That&amp;rsquo;s when one of my favorite &lt;code>dnf&lt;/code> subcommands came into play: &lt;code>dnf provides&lt;/code>
tells you which package provides a given file path. So, to find out how to
install the missing &lt;code>/usr/lib64/libavahi-gobject.so&lt;/code> on my toolbx, I ran:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ dnf provides /usr/lib64/libavahi-client.so
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Fedora rawhide openh264 &lt;span style="color:#666">(&lt;/span>From Cisco&lt;span style="color:#666">)&lt;/span> - x86_64 &lt;span style="color:#40a070">426&lt;/span> B/s | 2.5 kB 00:05
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Fedora - Rawhide - Developmental packages &lt;span style="color:#007020;font-weight:bold">for&lt;/span> the next Fedora release 4.3 MB/s | &lt;span style="color:#40a070">66&lt;/span> MB 00:15
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Fedora - Modular Rawhide - Developmental packages &lt;span style="color:#007020;font-weight:bold">for&lt;/span> the next Fedora release &lt;span style="color:#40a070">351&lt;/span> kB/s | 1.6 MB 00:04
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>avahi-devel-0.8-20.fc38.x86_64 : Libraries and header files &lt;span style="color:#007020;font-weight:bold">for&lt;/span> avahi development
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Repo : @System
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Matched from:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Filename : /usr/lib64/libavahi-client.so
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>avahi-devel-0.8-20.fc38.x86_64 : Libraries and header files &lt;span style="color:#007020;font-weight:bold">for&lt;/span> avahi development
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Repo : rawhide
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Matched from:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Filename : /usr/lib64/libavahi-client.so
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Alright, so the missing package is &lt;code>avahi-devel&lt;/code>. After installing that, I got
a another error:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>ninja: error: &amp;#39;/usr/lib64/libavahi-gobject.so&amp;#39;, needed by &amp;#39;src/gnome-network-displays&amp;#39;, missing and no known rule to make it
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Let&amp;rsquo;s hear what &lt;code>dnf provides&lt;/code> has to say about this one:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>$ dnf provides /usr/lib64/libavahi-gobject.so
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Last metadata expiration check: 0:30:58 ago on Mon &lt;span style="color:#40a070">03&lt;/span> Apr &lt;span style="color:#40a070">2023&lt;/span> 04:28:17 PM -03.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>avahi-gobject-devel-0.8-20.fc38.x86_64 : Libraries and header files &lt;span style="color:#007020;font-weight:bold">for&lt;/span> Avahi GObject development
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Repo : rawhide
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Matched from:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Filename : /usr/lib64/libavahi-gobject.so
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Looks like &lt;code>avahi-gobject-devel&lt;/code> was the culprit this time around, so I
installed it and attempted to build the application again and&amp;hellip; Success!&lt;/p>
&lt;p>Since the build dependencies of the &lt;code>gnome-network-displays&lt;/code> rpm package were
clearly outdated, I made a &lt;a href="https://src.fedoraproject.org/rpms/gnome-network-displays/pull-request/2">pull
request&lt;/a>
over the Fedora Package Sources to update it.&lt;/p>
&lt;h1 id="running-the-application">Running the application&lt;/h1>
&lt;p>Equipped with my own build of GNOME Network Displays, I decided to see what it
was all about. I enabled Miracast on my TV and waited for the application to
pick it up. And waited. And waited. And waited.&lt;/p>
&lt;p>Something was off.&lt;/p>
&lt;p>My first suspicion was firewall configuration and (thankfully) I was right.
Browsing the repository of GNOME Network Displays I found out that &lt;a href="https://gitlab.gnome.org/GNOME/gnome-network-displays/-/commit/c2a81a501ec1eb231c05dd47416fe935d6573c13">this
commit&lt;/a>
added integration with the default firewall utility of Fedora Silverblue.&lt;/p>
&lt;p>All I needed to do was change my firewall zone to WiFi P2P.&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/entering-the-rabbit-hole-of-gnome-network-displays/firewall.png" alt="Firewall configuration screenshot"/>
&lt;/p>
&lt;/p>
&lt;p>Upon doing that, my device started being detected! Once I clicked it though:&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/entering-the-rabbit-hole-of-gnome-network-displays/codecs.png" alt="Codec disclaimer screenshot"/>
&lt;/p>
&lt;/p>
&lt;p>To proceed, I installed the GStreamer OpenH264 Encoder (which is provided by
the &lt;code>gstreamer1-plugin-openh264&lt;/code> package). With that I was finally able to
start the connection, but the display mirroring didn&amp;rsquo;t actually work.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>** (gnome-network-displays:17808): DEBUG: 17:47:13.929: Got state change notification from streaming sink to state ND_SINK_STATE_WAIT_SOCKET
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>** (gnome-network-displays:17808): DEBUG: 17:47:59.487: WFDP2PProvider: Device state changed. It is now 120. Reason: 11
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>** (gnome-network-displays:17808): DEBUG: 17:47:59.494: WfdServer: Finalize
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>** (gnome-network-displays:17808): DEBUG: 17:47:59.495: WfdMediaFactory: Finalize
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>** (gnome-network-displays:17808): DEBUG: 17:47:59.495: Got state change notification from streaming sink to state ND_SINK_STATE_ERROR
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>** (gnome-network-displays:17808): DEBUG: 17:47:59.518: WFDP2PProvider: Device state changed. It is now 30. Reason: 0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>** (gnome-network-displays:17808): DEBUG: 17:47:59.771: WFDP2PProvider: Peer removed
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>** (gnome-network-displays:17808): DEBUG: 17:47:59.771: MetaSink: Priority sink updated. Priority: 100
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>From the logs, it looks like timeout, but I decided to investigate that later.&lt;/p>
&lt;h1 id="making-a-contribution">Making a contribution&lt;/h1>
&lt;p>One of the first things I noticed upon launching GNOME Network Displays was
that I could not move its window by dragging its header bar not resize its
window by dragging its borders. I spent some hours trying to fix that but
didn&amp;rsquo;t manage to.&lt;/p>
&lt;p>After all, I acknowledged my own defeat and decided to make &lt;a href="https://gitlab.gnome.org/GNOME/gnome-network-displays/-/merge_requests/182">a simple
contribution&lt;/a>
fixing some typos. However, there will be no truce! Mark my words:&lt;/p>
&lt;p>GNOME Network Displays, we will meet again!&lt;/p></description></item><item><title>Using the GTK Inspector in GNOME Boxes</title><link>https://pesader.dev/posts/using-the-gtk-inspector-in-gnome-boxes/</link><pubDate>Sun, 02 Apr 2023 11:07:02 -0300</pubDate><guid>https://pesader.dev/posts/using-the-gtk-inspector-in-gnome-boxes/</guid><description>
&lt;p>The GTK Inspector is a powerful tool that allows developers to better
understand how the code is &amp;ldquo;mapped&amp;rdquo; to the user interface of a GTK application.
It can usually be activated using the keyboard shortcut &lt;code>Ctrl + Shift + i&lt;/code>, but
that isn&amp;rsquo;t working on GNOME Boxes. Although I&amp;rsquo;ve made an
&lt;a href="https://gitlab.gnome.org/GNOME/gnome-boxes/-/merge_requests/577">attempt&lt;/a> to
fix this issue, changes to GNOME Boxes can a long time to land because it
follows the release schedule of GNOME (about once every six months).
Considering this, I&amp;rsquo;ve put together this guide to use the GTK Inspector in
GNOME Boxes in its current state.&lt;/p>
&lt;h1 id="method-1-enviroment-variable">Method 1: enviroment variable&lt;/h1>
&lt;p>Setting the environment variable &lt;code>GTK_DEBUG&lt;/code> to &lt;code>interactive&lt;/code> upon launching
GNOME Boxes (or any GTK application!) will launch the GTK Inspector alongside
it.&lt;/p>
&lt;p>If you installed Boxes using a package provided by your distribution run:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bb60d5">GTK_DEBUG&lt;/span>&lt;span style="color:#666">=&lt;/span>interactive gnome-boxes
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you installed GNOME Boxes as a flatpak, run:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bb60d5">GTK_DEBUG&lt;/span>&lt;span style="color:#666">=&lt;/span>interactive flatpak run org.gnome.Boxes
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>However, if you want to use the GTK Inspector with your own build of GNOME
Boxes, you should probably use one of the following methods.&lt;/p>
&lt;h1 id="method-2-toggle-option-in-builder">Method 2: toggle option in Builder&lt;/h1>
&lt;p>On the most recent versions of GNOME Builder you can launch the inpector
alongside the application you are compiling by simply toggling an option on the
run menu, as you can see below:&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/using-the-gtk-inspector-in-gnome-boxes/builder_inspector_check.png" alt="GNOME Builder inspector check"/>
&lt;/p>
&lt;/p>
&lt;p>This will take care of everything for you (thanks GNOME Builder!).&lt;/p>
&lt;h1 id="method-3-project-configuration-in-builder">Method 3: project configuration in Builder&lt;/h1>
&lt;p>If your version of GNOME Builder does not have the feature mentioned above yet,
don&amp;rsquo;t worry there&amp;rsquo;s still hope! First, head to the project configuration page
by hitting &lt;code>Alt + ,&lt;/code> or clicking the &amp;ldquo;Configure Project&amp;hellip;&amp;rdquo; option in the
dropdown menu of the omnibar:&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/using-the-gtk-inspector-in-gnome-boxes/builder_configure_project.png" alt="GNOME Builder project configuration options screenshot"/>
&lt;/p>
&lt;/p>
&lt;p>Then, append &lt;code>GTK_DEBUG=interactive&lt;/code> under the &amp;ldquo;Configure Options&amp;rdquo; text box:&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/using-the-gtk-inspector-in-gnome-boxes/builder_configure_options.png" alt="GNOME Builder configure options textbox screenshot"/>
&lt;/p>
&lt;/p>
&lt;p>What we did here was changing the flatpak manifest of GNOME Boxes using a nice
graphical user interface (thanks GNOME Builder!). Since you would want to keep
our changes to that file to yourself, you should tell &lt;code>git&lt;/code> to ignore it. Using
&lt;code>.gitignore&lt;/code> is no-go because the &lt;code>.gitignore&lt;/code> file itself is being tracked by
&lt;code>git&lt;/code>. Instead we should add the path of the flatpak manifest to
&lt;code>.git/info/exclude&lt;/code>, so git will ignore it locally, like so:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#007020">echo&lt;/span> &lt;span style="color:#4070a0">&amp;#34;build-aux/flatpak/org.gnome.BoxesDevel.json&amp;#34;&lt;/span> &amp;gt; .git/info/exclude
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git update-index --assume-unchanged build-aux/flatpak/org.gnome.BoxesDevel.json
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Later, if you want to make a contribution that involves changing the flatpak
manifest, remove the line that contains &lt;code>build-aux/flatpak/org.gnome.BoxesDevel.json&lt;/code>
from &lt;code>.git/info/exclude&lt;/code> and run:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>git update-index --no-assume-unchanged build-aux/flatpak/org.gnome.BoxesDevel.json
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="method-4-export-package-in-builder">Method 4: export package in Builder&lt;/h1>
&lt;p>In case you need more flexibility with your custom build of Boxes (say,
scripting) you&amp;rsquo;re better off exporting and installing a package. GNOME Builder
makes this very easy (thanks again GNOME Builder!). First, build the
application once by clicking the hammer in the omnibar. Then, click the &amp;ldquo;Export&amp;rdquo;
button and wait.&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/using-the-gtk-inspector-in-gnome-boxes/builder_export_package.png" alt="GNOME Builder option to export package"/>
&lt;/p>
&lt;/p>
&lt;p>Once it&amp;rsquo;s done, the file explorer will open in a directory with the exported
&lt;code>.flatpak&lt;/code> package. Now, simply double-click it to install using GNOME
Software. When installation is complete, you&amp;rsquo;ll be able to access the GTK
Inspector using the first method I presented:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bb60d5">GTK_DEBUG&lt;/span>&lt;span style="color:#666">=&lt;/span>interactive flatpak run org.gnome.BoxesDevel
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you built the application with the project configuration described in the
third method, the GTK Inspector will always launch along side your build of
GNOME Boxes. In that case, you can even launch Boxes via the applications
menu (its icon will be wrapped in &amp;ldquo;under construction&amp;rdquo; tape, as the one on the
left side of the image).&lt;/p>
&lt;p>&lt;p class="md__image">
&lt;img src="https://pesader.dev/posts/using-the-gtk-inspector-in-gnome-boxes/boxes_icons.png" alt="boxes regular and development package application icon"/>
&lt;/p>
&lt;/p>
&lt;p>That about covers it! While I hope this blog post becomes obsolete when someone
fixes the issue of the keyboard shortcut not working (possibly myself?), I
also think this was a great opportunity to learn more about flatpak and GNOME
Builder.&lt;/p>
&lt;p>See you in the next one!&lt;/p></description></item></channel></rss>