summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am10
-rwxr-xr-xtriggers/desktop-database.trigger5
-rwxr-xr-xtriggers/gtk-icon-cache.trigger13
-rwxr-xr-xtriggers/mime-database.trigger5
-rw-r--r--xdg-app-dir.c91
5 files changed, 120 insertions, 4 deletions
diff --git a/Makefile.am b/Makefile.am
index b0d19d8..e8b9c74 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -5,10 +5,18 @@ SUBDIRS = doc
endif
AM_CPPFLAGS = \
- -DXDG_APP_BASEDIR=\"$(datadir)/xdg-app\" \
+ -DXDG_APP_BASEDIR=\"$(pkgdatadir)\" \
+ -DXDG_APP_TRIGGERDIR=\"$(pkgdatadir)/triggers\" \
-DHELPER=\"$(bindir)/xdg-app-helper\" \
$(NULL)
+triggersdir = $(pkgdatadir)/triggers
+dist_triggers_SCRIPTS = \
+ triggers/gtk-icon-cache.trigger \
+ triggers/mime-database.trigger \
+ triggers/desktop-database.trigger \
+ $(NULL)
+
bin_PROGRAMS = \
xdg-app-helper \
xdg-app \
diff --git a/triggers/desktop-database.trigger b/triggers/desktop-database.trigger
new file mode 100755
index 0000000..8270383
--- /dev/null
+++ b/triggers/desktop-database.trigger
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+if test \( -x "$(which update-desktop-database 2>/dev/null)" \) -a \( -d /self/exports/share/applications \); then
+ exec update-desktop-database -q /self/exports/share/applications
+fi
diff --git a/triggers/gtk-icon-cache.trigger b/triggers/gtk-icon-cache.trigger
new file mode 100755
index 0000000..9b02b9c
--- /dev/null
+++ b/triggers/gtk-icon-cache.trigger
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+if test \( -x "$(which gtk-update-icon-cache 2>/dev/null)" \) -a \( -d /self/exports/share/icons/hicolor \); then
+ cp /usr/share/icons/hicolor/index.theme /self/exports/share/icons/hicolor/
+ for dir in /self/exports/share/icons/*; do
+ if test -f $dir/index.theme; then
+ if ! gtk-update-icon-cache --quiet $dir; then
+ echo "Failed to run gtk-update-icon-cache for $dir"
+ exit 1
+ fi
+ fi
+ done
+fi
diff --git a/triggers/mime-database.trigger b/triggers/mime-database.trigger
new file mode 100755
index 0000000..8a6d3ae
--- /dev/null
+++ b/triggers/mime-database.trigger
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+if test \( -x "$(which update-mime-database 2>/dev/null)" \) -a \( -d /self/exports/share/mime/packages \); then
+ exec update-mime-database /self/exports/share/mime
+fi
diff --git a/xdg-app-dir.c b/xdg-app-dir.c
index f4285e5..7922f7c 100644
--- a/xdg-app-dir.c
+++ b/xdg-app-dir.c
@@ -326,6 +326,85 @@ xdg_app_dir_set_active (XdgAppDir *self,
gboolean
+xdg_app_dir_run_triggers (XdgAppDir *self,
+ GCancellable *cancellable,
+ GError **error)
+{
+ gboolean ret = FALSE;
+ gs_unref_object GFileEnumerator *dir_enum = NULL;
+ gs_unref_object GFileInfo *child_info = NULL;
+ gs_unref_object GFile *triggersdir = NULL;
+ gs_unref_object GFile *exports = NULL;
+ GError *temp_error = NULL;
+
+ g_debug ("running triggers");
+
+ exports = xdg_app_dir_get_exports_dir (self);
+
+ triggersdir = g_file_new_for_path (XDG_APP_TRIGGERDIR);
+
+ dir_enum = g_file_enumerate_children (triggersdir, "standard::type,standard::name",
+ 0, cancellable, error);
+ if (!dir_enum)
+ goto out;
+
+ while ((child_info = g_file_enumerator_next_file (dir_enum, cancellable, &temp_error)) != NULL)
+ {
+ gs_unref_object GFile *child = NULL;
+ const char *name;
+ GError *trigger_error = NULL;
+
+ name = g_file_info_get_name (child_info);
+
+ child = g_file_get_child (triggersdir, name);
+
+ if (g_file_info_get_file_type (child_info) == G_FILE_TYPE_REGULAR &&
+ g_str_has_suffix (name, ".trigger"))
+ {
+ gs_unref_ptrarray GPtrArray *argv_array = NULL;
+
+ g_debug ("running trigger %s", name);
+
+ argv_array = g_ptr_array_new_with_free_func (g_free);
+ g_ptr_array_add (argv_array, g_strdup (HELPER));
+ g_ptr_array_add (argv_array, g_strdup ("-a"));
+ g_ptr_array_add (argv_array, g_file_get_path (self->basedir));
+ g_ptr_array_add (argv_array, g_strdup ("-e"));
+ g_ptr_array_add (argv_array, g_strdup ("-F"));
+ g_ptr_array_add (argv_array, g_strdup ("/usr"));
+ g_ptr_array_add (argv_array, g_file_get_path (child));
+ g_ptr_array_add (argv_array, NULL);
+
+ if (!g_spawn_sync ("/",
+ (char **)argv_array->pdata,
+ NULL,
+ G_SPAWN_DEFAULT,
+ NULL, NULL,
+ NULL, NULL,
+ NULL, &trigger_error))
+ {
+ g_warning ("Error running trigger %s: %s", name, trigger_error->message);
+ g_clear_error (&trigger_error);
+ }
+ }
+
+ g_clear_object (&child_info);
+ }
+
+ if (temp_error != NULL)
+ {
+ g_propagate_error (error, temp_error);
+ goto out;
+ }
+
+ ret = TRUE;
+ out:
+ return ret;
+}
+
+
+
+gboolean
xdg_app_dir_deploy (XdgAppDir *self,
const char *ref,
const char *checksum,
@@ -333,6 +412,7 @@ xdg_app_dir_deploy (XdgAppDir *self,
GError **error)
{
gboolean ret = FALSE;
+ gboolean is_app;
gs_free char *resolved_ref = NULL;
gs_unref_object GFile *root = NULL;
gs_unref_object GFileInfo *file_info = NULL;
@@ -386,8 +466,10 @@ xdg_app_dir_deploy (XdgAppDir *self,
G_FILE_CREATE_NONE, NULL, cancellable, error))
goto out;
+ is_app = g_str_has_prefix (ref, "app");
+
exports = xdg_app_dir_get_exports_dir (self);
- if (g_str_has_prefix (ref, "app"))
+ if (is_app)
{
export = g_file_get_child (checkoutdir, "export");
if (g_file_query_exists (export, cancellable))
@@ -409,10 +491,13 @@ xdg_app_dir_deploy (XdgAppDir *self,
if (!xdg_app_dir_set_active (self, ref, checksum, cancellable, error))
goto out;
- if (g_file_query_exists (exports, cancellable))
+ if (is_app && g_file_query_exists (exports, cancellable))
{
if (!xdg_app_remove_dangling_symlinks (exports, cancellable, error))
- goto out;
+ goto out;
+
+ if (!xdg_app_dir_run_triggers (self, cancellable, error))
+ goto out;
}
ret = TRUE;