<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mardy (Articoli su PhotoTeleport)</title><link>http://mardy.it/</link><description></description><atom:link href="http://mardy.it/it/categories/phototeleport.xml" rel="self" type="application/rss+xml"></atom:link><language>it</language><copyright>Contents © 2025 &lt;a href="mailto:info@mardy.it"&gt;Alberto Mardegan&lt;/a&gt; </copyright><lastBuildDate>Sat, 27 Sep 2025 09:38:19 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>PhotoTeleport 0.13</title><link>http://mardy.it/it/blog/2020/06/phototeleport-013.html</link><dc:creator>Alberto Mardegan</dc:creator><description>&lt;p&gt;Just a quick note to let the world know that &lt;a href="http://phototeleport.com/2020/06/20/version-0.13/"&gt;PhotoTeleport 0.13 has been
released&lt;/a&gt;.&lt;/p&gt;</description><guid>http://mardy.it/it/blog/2020/06/phototeleport-013.html</guid><pubDate>Mon, 22 Jun 2020 20:11:09 GMT</pubDate></item><item><title>Implementing "Open with…" on MacOS with Qt</title><link>http://mardy.it/it/blog/2019/10/implementing-open-with-on-macos-with-qt.html</link><dc:creator>Alberto Mardegan</dc:creator><description>&lt;p&gt;I just released &lt;a href="http://phototeleport.com/2019/10/13/version-0.12/"&gt;PhotoTeleport
0.12&lt;/a&gt;, which includes the
feature mentioned in the title of this blog post. Given that it took me some
time to understand how this could work with Qt, I think it might be worth
spending a couple of lines about how to implement it.&lt;/p&gt;
&lt;h2&gt;In the target application&lt;/h2&gt;
&lt;p&gt;The first step (and the easiest one) is about adding the proper information to
your &lt;code&gt;.plist&lt;/code&gt; file: this is needed to tell MacOS what file types are supported
by your application. The official documentation is
&lt;a href="https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html"&gt;here&lt;/a&gt;,
but given that an example is better than a thousand words, here's what I had to
add to &lt;code&gt;PhotoTeleport.plist&lt;/code&gt; in order to have it registered as a handler for
&lt;code&gt;TIFF&lt;/code&gt; files:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;CFBundleDocumentTypes&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;array&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;CFBundleTypeExtensions&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;array&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;tiff&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;TIFF&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;tif&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;TIF&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;CFBundleTypeMIMETypes&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;array&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;image/tiff&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;CFBundleTypeName&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;NSTIFFPboardType&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;CFBundleTypeOSTypes&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;array&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;TIFF&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;****&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;CFBundleTypeRole&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Viewer&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;LSHandlerRank&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Default&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;LSItemContentTypes&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;array&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;public.tiff&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;NSDocumentClass&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;PVDocument&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;…more&lt;span class="w"&gt; &lt;/span&gt;dict&lt;span class="w"&gt; &lt;/span&gt;entries&lt;span class="w"&gt; &lt;/span&gt;for&lt;span class="w"&gt; &lt;/span&gt;other&lt;span class="w"&gt; &lt;/span&gt;supported&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt; &lt;/span&gt;formats…
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This is enough to have your application appear in Finder's "Open with…" menu
and be started when the user selects it from the context menu, but it's only
half of the story: to my big surprise, the selected files are not passed to
your application as command line parameters, but via some MacOS-specific event
which needs to be handled.&lt;/p&gt;
&lt;p&gt;By grepping into the Qt source code, I've found out that Qt already handles the
event, which is then transformed into a
&lt;a href="https://doc.qt.io/qt-5/qfileopenevent.html"&gt;&lt;code&gt;QFileOpenEvent&lt;/code&gt;&lt;/a&gt;. The
documentation here is quite helpful, so I won't waste your time to repeat it
here; what has hard for me was to actually &lt;em&gt;find&lt;/em&gt; that this functionality
exists and is supported by Qt.&lt;/p&gt;
&lt;h2&gt;In the source application&lt;/h2&gt;
&lt;p&gt;The above is only half of the story: what if you are writing an application
which wants to send some files to some other application? Because of the
sandboxing, you cannot just start the desired application in a &lt;code&gt;QProcess&lt;/code&gt; and
pass the files as parameters: again, we need to use the Apple &lt;a href="https://developer.apple.com/library/archive/documentation/Carbon/Conceptual/LaunchServicesConcepts/LSCIntro/LSCIntro.html#//apple_ref/doc/uid/TP30000999"&gt;Launch
Services&lt;/a&gt;
so that the target application would receive the files through the mechanism
described above.&lt;/p&gt;
&lt;p&gt;Unfortunately, as far as I could find this is not something that Qt supports;
sure, with &lt;code&gt;QDesktopServices::openUrlExternally()&lt;/code&gt; you can start the default
handler for the given url, but what if you need to open more than one file at
once? And what if you want to open the files in a specific application, and not
just in the default one? Well, you need to get your hands dirty and use some
MacOS APIs:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="cp"&gt;#import &amp;lt;CoreFoundation/CoreFoundation.h&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;#import &amp;lt;ApplicationServices/ApplicationServices.h&amp;gt;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;MacOS::runApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;QString&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;QList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;QUrl&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;CFURLRef&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;appUrl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;QUrl&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;fromLocalFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;toCFURL&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;CFMutableArrayRef&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cfaFiles&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;CFArrayCreateMutable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kCFAllocatorDefault&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                             &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="w"&gt;                             &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;kCFTypeArrayCallBacks&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;QUrl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;CFURLRef&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toCFURL&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;CFArrayAppendValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cfaFiles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;CFRelease&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;LSLaunchURLSpec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inspec&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;inspec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;appURL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;appUrl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;inspec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;itemURLs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cfaFiles&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;inspec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;asyncRefCon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;inspec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;launchFlags&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kLSLaunchDefaults&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kLSLaunchAndDisplayErrors&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;inspec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;passThruParams&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;OSStatus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LSOpenFromURLSpec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;inspec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;CFRelease&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;appUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In &lt;a href="http://imaginario.mardy.it"&gt;Imaginario&lt;/a&gt; I've saved this into a &lt;code&gt;macos.mm&lt;/code&gt;
file, added it to the source files, and also added the native MacOS libraries
to the build (qmake):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;LIBS += -framework CoreServices
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You can see the &lt;a href="https://gitlab.com/mardy/imaginario/commit/1a018fa68e3310c286d8aa924c1e8fbff0c76678"&gt;commit implementing all
this&lt;/a&gt;,
it really doesn't get more complex than this. The first parameter to the
&lt;code&gt;MacOS::runApp()&lt;/code&gt; function is the name of the application; I've verified that
the form &lt;code&gt;/Applications/YourAppName.app&lt;/code&gt; works, but it may be that more
human-friendly variants work as well.&lt;/p&gt;</description><guid>http://mardy.it/it/blog/2019/10/implementing-open-with-on-macos-with-qt.html</guid><pubDate>Sun, 13 Oct 2019 18:51:57 GMT</pubDate></item><item><title>Santa brings PhotoTeleport 0.9 with two more upload plugins</title><link>http://mardy.it/it/blog/2018/12/santa-brings-phototeleport-09-with-two.html</link><dc:creator>Alberto Mardegan</dc:creator><description>&lt;p&gt;A few days ago I've released PhotoTeleport 0.9, whose main improvements from the previous version are the added support for Imgur and SmugMug.&lt;/p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://mardy.it/archivos/imagines/blog/9c2215c2dba16c03c59541e7969eb52b-version-0.9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://mardy.it/archivos/imagines/blog/9c2215c2dba16c03c59541e7969eb52b-version-0.9.png" data-original-width="510" data-original-height="260"&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="http://www.phototeleport.com"&gt;PhotoTeleport&lt;/a&gt; is an open source, multi platform photo uploader, written in &lt;tt&gt;Qt&lt;/tt&gt; + &lt;tt&gt;QtQuick.Controls 1&lt;/tt&gt; which supports uploading your photos, along with title, description and tags, to many different sites at the same time. Those interested in the detailed list of changes can read the &lt;a href="http://www.phototeleport.com/2018/12/29/version-0.9/"&gt;full announcement here&lt;/a&gt;.&lt;/p&gt;</description><guid>http://mardy.it/it/blog/2018/12/santa-brings-phototeleport-09-with-two.html</guid><pubDate>Sun, 30 Dec 2018 17:07:00 GMT</pubDate></item><item><title>Announcing PhotoTeleport, a tool to upload your photos everywhere</title><link>http://mardy.it/it/blog/2018/02/announcing-phototeleport-tool-to-upload.html</link><dc:creator>Alberto Mardegan</dc:creator><description>&lt;p&gt;&lt;small&gt;&lt;i&gt;I already wrote about PhotoTeleport in my previous post, but since not everyone can comfortably read interlingua, here's the English announcement&lt;/i&gt;&lt;/small&gt;&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;I've spent the last few months of my free time to work on a new application, called PhotoTeleport, which is a photo uploader capable of working with multiple photo sharing services at once.&lt;/p&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://www.phototeleport.com/assets/metadata.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.phototeleport.com/assets/metadata.png" width="488" height="640" data-original-width="610" data-original-height="800"&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;It's an application I myself felt the need for, because as a photographer I keep my portfolio in many websites: I have a couple of pages in &lt;a href="https://www.facebook.com/mardyphoto/"&gt;Facebook&lt;/a&gt;, and &lt;a href="https://vk.com/mardyphoto"&gt;VK&lt;/a&gt; (a.k.a. "the Russian facebook"), but I also have a profile in other websites such as &lt;a href="https://www.flickr.com/photos/mardytardi/"&gt;Flickr&lt;/a&gt; and &lt;a href="https://mardytardi.deviantart.com/"&gt;DeviantArt&lt;/a&gt;, which I created to further promote my activity, but which alas I failed to keep up-to-date. The harsh reality is that working with multiple profiles is hard: even if you had just two profiles to maintain, it takes a lot of time to upload the photos to both of them and, no matter how convenient their user interface is, entering captions, descriptions and tags here and there is another boring, repetitive and time consuming task.&lt;br&gt;
Then how about automating it? Enter PhotoTeleport, and all photographers rejoice!&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://www.phototeleport.com/assets/interfaccia.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="https://www.phototeleport.com/assets/interfaccia.png" width="350" height="800" data-original-width="350" data-original-height="800"&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;The program in itself is very simple: you drag and drop the photos into its window, select which services you want to upload them to, add captions, descriptions and tags (if you like), review and then upload. For those who prefer a feature list in bullet points, here it is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support many photo sharing services: DeviantArt, Facebook, Flickr, Google Photos, VK, etc. (see &lt;a href="https://www.phototeleport.com/faqs/#services"&gt;here&lt;/a&gt; for an updated list)&lt;/li&gt;
&lt;li&gt;Album selection, or creation of a new album (if the service supports it)&lt;/li&gt;
&lt;li&gt;Fast editor for captions, descriptions and tags&lt;/li&gt;
&lt;li&gt;Possibility to specify different captions, descriptions and tags for each website&lt;/li&gt;
&lt;li&gt;Read metadata embedded in the image files&lt;/li&gt;
&lt;li&gt;On upload completion, provide a link to the newly uploaded files for additional editing or sharing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is just a beta version, but more features are planned, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ability to save and restore session&lt;/li&gt;
&lt;li&gt;Watermark support&lt;/li&gt;
&lt;li&gt;Image scaling&lt;/li&gt;
&lt;li&gt;Support for more plugins (500px, Imgur, Smugsmug, Shutterstock, Photobucket, Pinterest and more)&lt;/li&gt;
&lt;li&gt;Support for uploading to a custom (S)FTP server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You are indeed welcome to suggest new features, just by adding a comment to this blog post, or by creating an issue in the &lt;a href="https://gitlab.com/mardy/photokinesis/issues"&gt;PhotoTeleport bug tracker&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;PhotoTeleport is available for Linux, MacOS X and Windows; to get it, please visit &lt;a href="https://www.phototeleport.com"&gt;PhotoTeleport website&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;Only for the geeks and the folks from the IT crowd&lt;/h4&gt;

&lt;p&gt;Here's some info for those who desire to hack on PhotoTeleport, or just to know more about the technology behind id: PhotoTeleport is an &lt;a href="https://gitlab.com/mardy/photokinesis"&gt;open source project&lt;/a&gt;, it's written in C++ and QML using the cross-platform Qt framework. The authentication to the remote servers is handled by &lt;a href="https://gitlab.com/accounts-sso/libauthentication"&gt;libauthentication&lt;/a&gt;, a library that I wrote just before starting the work on Phototeleport to provide an easy way for Qt and QML based applications to authenticate and peform authorized requests to remove websites using the OAuth 1.0 and OAuth 2.0 protocols (other protocols can be supported too).&lt;/p&gt;

&lt;p&gt;Linux users might ask me why I chose to ship PhotoTeleport as an &lt;a href="https://appimage.org/"&gt;AppImage&lt;/a&gt; package, rather than using &lt;a href="https://www.flatpak.org/"&gt;Flatpak&lt;/a&gt;, &lt;a href="https://snapcraft.io/"&gt;Snap&lt;/a&gt; or a native distribution package like &lt;code&gt;deb&lt;/code&gt; or &lt;code&gt;rpm&lt;/code&gt;. This might deserve a blog post of its own, but in brief:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;deb&amp;gt;&lt;/code&gt; or &lt;code&gt;rpm&lt;/code&gt;&lt;/b&gt;: they require root permissions to be installed, moreover PhotoTeleport uses Qt 5.9 which is not available in all distributions, so if I have to bundle Qt with my package, I don't see many advantages over shipping an AppImage;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Snap&lt;/b&gt;: they require root permission to be installed, and the support for desktop applications is still incomplete;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;FlatPak&lt;/b&gt;: there's no runtime for Qt applications (and no, I don't want to force users to install the whole KDE runtime!), and drag &amp;amp; drop is not supported yet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That said, it's just a matter of making the best out of my little spare time. I can reach every Linux user with the AppImage format, so that's the first option I took. I'm certainly open to the idea of using also other formats in the future (I might make debs after Ubuntu 18.04 is released with Qt 5.9) and I'll happily accept any contribution that can make PhotoTeleport available in Snap, Flatpak or other formats. But I don't have the time pioneering that right now :-)&lt;/p&gt;</description><guid>http://mardy.it/it/blog/2018/02/announcing-phototeleport-tool-to-upload.html</guid><pubDate>Fri, 02 Feb 2018 06:48:00 GMT</pubDate></item><item><title>Fin del expectation :-)</title><link>http://mardy.it/it/blog/2018/02/fin-del-expectation.html</link><dc:creator>Alberto Mardegan</dc:creator><description>&lt;p&gt;In un &lt;a href="http://blog.mardy.it/2018/01/expectation.html"&gt;previe articulo de blog&lt;/a&gt; io annunciava le sito de &lt;a href="https://www.phototeleport.com"&gt;PhotoTeleport&lt;/a&gt;, ma sin explicar que es iste "PhotoTeleport". Ora le sito es preste, e finalmente io pote solver le enigma: PhotoTeleport es un programma pro publicar photographias a plure sitos de &lt;i&gt;photo sharing&lt;/i&gt;, contemporaneemente. &lt;/p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.phototeleport.com/assets/metadata.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.phototeleport.com/assets/metadata.png" width="488" height="640" data-original-width="610" data-original-height="800"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Le photographos, qui ha lor portfolios in multe sitos differente (Facebook, Flickr, DeviantArt, 500px e alteres) va trovar iste programma especialmente utile, perque illo va reducer grandemente le tempores que on debe "perder" pro repeter le mesme operation de cargar le mesme photos in cata sito. Ma in nostre epocha de vita virtual, ubi totes ama condivider lor proprie photos super plures retes social, PhotoTeleport pote resultar utile a cata uno qui ama condivider momentos de proprie vita con su amicos. De facto, &lt;b&gt;io invita omnes a &lt;a href="https://www.phototeleport.com/#download"&gt;discargar le programma e probar lo&lt;/a&gt;&lt;/b&gt;. Illo es disponibile pro computatores con systema operative Linux, MacOS X o Windows.&lt;/p&gt;

&lt;p&gt;Pro plus de informationes, visita le sito de PhotoTeleport; in particular, le pagina del &lt;a href="https://www.phototeleport.com/faqs"&gt;demandas frequente&lt;/a&gt; e le &lt;a href="https://www.phototeleport.com/blog"&gt;blog&lt;/a&gt; deberea satisfacer a omne curiositate — alteremente, vos es benvenite a demandar me plus!&lt;/p&gt;</description><guid>http://mardy.it/it/blog/2018/02/fin-del-expectation.html</guid><pubDate>Thu, 01 Feb 2018 16:12:00 GMT</pubDate></item><item><title>Expectation</title><link>http://mardy.it/it/blog/2018/01/expectation.html</link><dc:creator>Alberto Mardegan</dc:creator><description>&lt;p&gt;Salute, amicos! Io ha essite (quasi) silente in le ultime septimanas, a causa de varie occupationes. Le plus grande es le preparation de un programma per computator, que io ha quasi completate e cuje version "beta" essera tosto disponibile.&lt;/p&gt;

&lt;p&gt;In ultra a laborar super le programma, io anque debe occupar me de crear un sito pro illo. Io non es un habile aranea (&lt;i&gt;webmaster&lt;/i&gt; in interlingua), ma con &lt;a href="https://jekyllrb.com/"&gt;Jekyll&lt;/a&gt; iste operation non es troppo difficile: il ha multissime modellos graphic disponibile, e illos es usualmente jam quasi preste a esser usate.&lt;br&gt;

Pro le momento, io creava solmente un "tenente loco" (&lt;i&gt;placeholder&lt;/i&gt;), un pagina singule pro transmitter le senso de "expectation": vos pote vider lo in &lt;a href="https://www.phototeleport.com"&gt;phototeleport.com&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;Si tosto que io ha le version beta preste, io va modificar le sito con un nove modello graphic, e adder un poco plus de contento (principalmente, alicun liamines pro discargar le programma!). Ma intertanto, esque vos pote divinar qual typo de programma io prepara? Le programma es appellate "PhotoTeleport"; qual ideas isto vos suggere?&lt;/p&gt;</description><guid>http://mardy.it/it/blog/2018/01/expectation.html</guid><pubDate>Thu, 18 Jan 2018 18:06:00 GMT</pubDate></item></channel></rss>