Открыть файл с приложением по умолчанию от Vala? - PullRequest
0 голосов
/ 26 февраля 2019

Какой лучший способ открыть файл в приложении по умолчанию из Vala?Немного похоже на то, как работает xdg-open.

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Я нашел некоторый существующий код в другом приложении, но позже я также нашел этот метод GLib.AppInfo.launch_default_for_uri.

Простой пример:

var file = File.new_for_path (file_path);
if (file.query_exists ()) {
    try {
        AppInfo.launch_default_for_uri (file.get_uri (), null);
    } catch (Error e) {
        warning ("Unable to launch %s", file_path);
    }
}
0 голосов
/ 27 февраля 2019

Если вы используете GTK, то у вас также есть Gtk.gtk_show_uri_on_window(), который использует GLib под капотом.

0 голосов
/ 26 февраля 2019

Насколько я знаю, существует только одна реализация соответствующих стандартов freedesktop.org.

Это эталонная реализация в xdg-utils:

https://www.freedesktop.org/wiki/Software/xdg-utils/

Инструменты написаны в сценарии оболочки, например, вот исходный код для xdg-open:

https://cgit.freedesktop.org/xdg/xdg-utils/tree/scripts/xdg-open.in

Так что, безусловно, самый простой способ - просто вызвать xdg-откройте скрипт через Process.spawn_async и друзей.

Если вы настаиваете на использовании библиотечной функции, вам придется самостоятельно реализовать стандартную соответствующую библиотеку.

Обновление:

Существует довольно много библиотек на разных языках, которые реализуют некоторые стандарты freedesktop.org, например, вот список на GitHub:

https://github.com/topics/xdg

Например, здесьэто инструмент, похожий на xdg-open, написанный на D:

https://github.com/FreeSlave/mimeapps/blob/master/source/mimeapps.d

Пока я не нашел библиотеку Vala / GLib или plain C, которую можно легко использовать изприложение Vala.

Обновление 2:

На самом деле яОказывается, в GLib есть что-то для этой цели (или, точнее, в Gio):

https://valadoc.org/gio-2.0/GLib.AppInfo.launch_default_for_uri_async.html

https://developer.gnome.org/gio/stable/GAppInfo.html

Так что вы должны иметь возможность использоватьGLib.AppInfo.launch_default_for_uri_async метод.

...