<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:base="en">
	<title>Olivier @ Igalia</title>
	<subtitle>Olivier&#39;s blog</subtitle>
	<link href="https://blogs.igalia.com/otilloy/feed/feed.xml" rel="self"/>
	<link href="https://blogs.igalia.com/otilloy/"/>
	<updated>2025-10-10T00:00:00Z</updated>
	<id>https://blogs.igalia.com/</id>
	<author>
		<name>Olivier Tilloy</name>
		<email>otilloy@igalia.com</email>
	</author>
	
	<entry>
		<title>A polite URL handler</title>
		<link href="https://blogs.igalia.com/otilloy/a-polite-url-handler/"/>
		<updated>2025-10-10T00:00:00Z</updated>
		<id>https://blogs.igalia.com/otilloy/a-polite-url-handler/</id>
		<content type="html">&lt;p&gt;Yesterday a colleague of mine was asking around for a way to get their GNOME desktop to always ask which browser to use when a third-party application wants to open a hyperlink. Something like that:&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://blogs.igalia.com/otilloy/img/lcMUDgznv5-612.avif 612w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://blogs.igalia.com/otilloy/img/lcMUDgznv5-612.webp 612w&quot;&gt;&lt;img alt=&quot;App chooser dialog&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://blogs.igalia.com/otilloy/img/lcMUDgznv5-612.png&quot; width=&quot;612&quot; height=&quot;561&quot;&gt;&lt;/picture&gt;
&lt;/p&gt;
&lt;p&gt;If no browser has ever been registered as the default handler for the HTTP/HTTPS schemes, then the first time around that dialog would theoretically pop up. But that’s very unlikely. And as another colleague pointed out, there is no setting to enforce the “always ask” option.&lt;/p&gt;
&lt;p&gt;So I came up with a relatively self-contained hack to address this specific use case, and I’m sharing it here in case it’s useful to others (who knows?), to my future self, or for your favourite &lt;abbr title=&quot;Large Language Model&quot;&gt;LLM&lt;/abbr&gt; to ingest, chew and regurgitate upon request.&lt;/p&gt;
&lt;p&gt;First, drop a desktop file that invokes &lt;a href=&quot;https://flatpak.github.io/xdg-desktop-portal/docs/doc-org.freedesktop.portal.OpenURI.html&quot;&gt;the OpenURI portal&lt;/a&gt; over D-Bus in &lt;code&gt;~/.local/share/applications&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;📝 &lt;code&gt;~/.local/share/applications/url-opener-always-ask.desktop&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-ini&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-ini&quot;&gt;&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token section-name selector&quot;&gt;Desktop Entry&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token key attr-name&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;URL opener - always ask&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token key attr-name&quot;&gt;Exec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;busctl call --user org.freedesktop.portal.Desktop /org/freedesktop/portal/desktop org.freedesktop.portal.OpenURI OpenURI ssa{sv} &quot;&quot; %u 1 ask b true&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token key attr-name&quot;&gt;NoDisplay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;true&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token key attr-name&quot;&gt;Type&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;Application&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, make that wrapper the default scheme handler for HTTP and HTTPS:&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;scheme&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; http https&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;&lt;br&gt;    gio mime x-scheme-handler/&lt;span class=&quot;token variable&quot;&gt;${scheme}&lt;/span&gt; url-opener-always-ask.desktop&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And you’re all set!&lt;/p&gt;
&lt;p&gt;Note that a slightly annoying side effect is that your preferred browser will likely complain that it’s not the default any longer.&lt;/p&gt;
&lt;p&gt;You can at any time revert to associating these schemes to your preferred browser, e.g.:&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ xdg-settings &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; default-web-browser firefox.desktop&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note that I mentioned GNOME at the beginning of this post, but this should work in any desktop environment that provides an XDG desktop portal backend for the OpenURI interface.&lt;/p&gt;
&lt;p&gt;✏️ EDIT: My colleague &lt;a href=&quot;https://base-art.net/&quot;&gt;Philippe&lt;/a&gt; told me about &lt;a href=&quot;https://flathub.org/en/apps/re.sonny.Junction&quot;&gt;Junction&lt;/a&gt;, a dedicated tool that addresses this very use case, with a much broader scope. It appears to be GNOME-specific, and is neatly packaged as a flatpak. An interesting project worth checking out.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Embedded Recipes &#39;25</title>
		<link href="https://blogs.igalia.com/otilloy/embedded-recipes-25/"/>
		<updated>2025-06-09T00:00:00Z</updated>
		<id>https://blogs.igalia.com/otilloy/embedded-recipes-25/</id>
		<content type="html">&lt;p&gt;Last month the &lt;a href=&quot;https://embedded-recipes.org/2025/&quot;&gt;Embedded Recipes&lt;/a&gt; conference was held in Nice, France.
Igalia was sponsoring the event, and my colleague &lt;a href=&quot;https://www.igalia.com/team/mabente&quot;&gt;Martín&lt;/a&gt; and myself were attending.
In addition we both delivered a talk to a highly technical and engaged audience.&lt;/p&gt;
&lt;p&gt;My presentation, unlike most other talks, was a high-level overview of how Igalia engineers contribute to SteamOS to shape the future of gaming on Linux, through our contracting work with Valve. Having joined the project recently, this was a challenge (the good kind) to me: it allowed me to gain a much better understanding of what all my colleagues who work on SteamOS do, through conversations I had with them when preparing the presentation.
The talk was well received and the feedback I got was overall very positive, and it was followed up by several interesting conversations.
I was apprehensive about the questions from the audience, as most of the work I presented wasn’t mine, and indeed some of them had to remain unanswered.&lt;/p&gt;
&lt;div style=&quot;margin: auto; width: 560px&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/ttwXUPo849c?si=xB5J5KPxOSwRxES9&quot; title=&quot;SteamOS and its impact on the Linux Ecosystem (Olivier Tilloy, Igalia)&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Martín delivered &lt;a href=&quot;https://youtu.be/gx95md9TEWE?feature=shared&quot;&gt;a lightning talk&lt;/a&gt; on how to implement OTA updates with &lt;code&gt;systemd-sysupdate&lt;/code&gt; on Yocto-based distributions.
It was also well received, and followed up by conversations in the Yocto workshop that took place the following day.&lt;/p&gt;
&lt;p&gt;I found the selection of presentations overall quite interesting and relevant, and there were plenty of opportunities for networking during lunch, coffee breaks that were splendidly supplied with croissants, fruit juice, cheese and coffee, and a dinner at a beach restaurant.&lt;/p&gt;
&lt;p&gt;The mascot reference to &lt;a href=&quot;https://en.wikipedia.org/wiki/Brice_de_Nice&quot;&gt;a famous French surfer&lt;/a&gt; gave me a smile.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://blogs.igalia.com/otilloy/img/wBd_fG3lWk-256.avif 256w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://blogs.igalia.com/otilloy/img/wBd_fG3lWk-256.webp 256w&quot;&gt;&lt;img alt=&quot;Embedded Recipes de Nice&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://blogs.igalia.com/otilloy/img/wBd_fG3lWk-256.jpeg&quot; width=&quot;256&quot; height=&quot;256&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Many thanks to Kevin and all the folks at BayLibre for a top-notch organization in a relaxed and beautiful setting, to fellow speakers for bringing us these talks, and to everyone I talked to in the hallway track for the enriching conversations.&lt;/p&gt;
&lt;p&gt;See you all next year in sunny Nice!&lt;/p&gt;
</content>
	</entry>
</feed>
