summaryrefslogtreecommitdiff
path: root/xfce4-session/xfsm-global.c
diff options
context:
space:
mode:
authorAlexander Schwinn <alexxcons@xfce.org>2019-03-24 23:52:42 +0100
committerSimon Steinbeiss <simon.steinbeiss@elfenbeinturm.at>2019-04-25 00:52:24 +0200
commit88346bde9ea6850caaf91e6868813b3132e76b10 (patch)
tree5aaf477aab9f692c4821d07333acd8440e843b89 /xfce4-session/xfsm-global.c
parente10ac91be3301c92900168855b265101ba9884e2 (diff)
downloadxfce4-session-88346bde9ea6850caaf91e6868813b3132e76b10.tar.gz
Move three methods from startup.c to xfsm-global.c/.h
They will be reused on logout, shutdown, etc. (See Bug #10172)
Diffstat (limited to 'xfce4-session/xfsm-global.c')
-rw-r--r--xfce4-session/xfsm-global.c295
1 files changed, 295 insertions, 0 deletions
diff --git a/xfce4-session/xfsm-global.c b/xfce4-session/xfsm-global.c
index c8106da0..c10ab973 100644
--- a/xfce4-session/xfsm-global.c
+++ b/xfce4-session/xfsm-global.c
@@ -42,6 +42,12 @@
#include <unistd.h>
#endif
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#include <glib/gprintf.h>
+
#include <libxfce4util/libxfce4util.h>
#include <libxfce4ui/libxfce4ui.h>
@@ -213,3 +219,292 @@ xfsm_g_value_free (GValue *value)
}
}
+
+static gboolean
+xfsm_check_valid_exec (const gchar *exec)
+{
+ gboolean result = TRUE;
+ gchar *tmp;
+ gchar *p;
+
+ if (*exec == '/')
+ {
+ result = (access (exec, X_OK) == 0);
+ }
+ else
+ {
+ tmp = g_strdup (exec);
+ p = strchr (tmp, ' ');
+ if (G_UNLIKELY (p != NULL))
+ *p = '\0';
+
+ p = g_find_program_in_path (tmp);
+ g_free (tmp);
+
+ if (G_UNLIKELY (p == NULL))
+ {
+ result = FALSE;
+ }
+ else
+ {
+ result = (access (p, X_OK) == 0);
+ g_free (p);
+ }
+ }
+
+ return result;
+}
+
+
+
+static void
+xfsm_startup_autostart_migrate (void)
+{
+ const gchar *entry;
+ gchar source_path[4096];
+ gchar target_path[4096];
+ gchar *source;
+ gchar *target;
+ FILE *fp;
+ GDir *dp;
+
+ /* migrate the content */
+ source = xfce_get_homefile ("Desktop", "Autostart/", NULL);
+ dp = g_dir_open (source, 0, NULL);
+ if (G_UNLIKELY (dp != NULL))
+ {
+ /* check if the LOCATION-CHANGED.txt file exists and the target can be opened */
+ g_snprintf (source_path, 4096, "%s/LOCATION-CHANGED.txt", source);
+ target = xfce_resource_save_location (XFCE_RESOURCE_CONFIG, "autostart/", TRUE);
+ if (G_LIKELY (target != NULL && !g_file_test (source_path, G_FILE_TEST_IS_REGULAR)))
+ {
+ g_message ("Trying to migrate autostart items from %s to %s...", source, target);
+
+ for (;;)
+ {
+ entry = g_dir_read_name (dp);
+ if (entry == NULL)
+ break;
+
+ /* determine full source and dest paths */
+ g_snprintf (source_path, 4096, "%s%s", source, entry);
+ g_snprintf (target_path, 4096, "%s%s", target, entry);
+
+ /* try to move the file */
+ if (rename (source_path, target_path) < 0)
+ {
+ g_warning ("Failed to rename %s to %s: %s",
+ source_path, target_path,
+ g_strerror (errno));
+ continue;
+ }
+
+ /* check if the file is executable */
+ if (!g_file_test (target_path, G_FILE_TEST_IS_EXECUTABLE))
+ continue;
+
+ /* generate a .desktop file for the executable file */
+ g_snprintf (source_path, 4096, "%s.desktop", target_path);
+ if (!g_file_test (source_path, G_FILE_TEST_IS_REGULAR))
+ {
+ fp = fopen (source_path, "w");
+ if (G_LIKELY (fp != NULL))
+ {
+ fprintf (fp,
+ "# This file was automatically generated for the autostart\n"
+ "# item %s\n"
+ "[Desktop Entry]\n"
+ "Type=Application\n"
+ "Exec=%s\n"
+ "Hidden=False\n"
+ "Terminal=False\n"
+ "StartupNotify=False\n"
+ "Version=0.9.4\n"
+ "Name=%s\n",
+ entry, target_path, entry);
+ fclose (fp);
+ }
+ else
+ {
+ g_warning ("Failed to create a .desktop file for %s: %s",
+ target_path, g_strerror (errno));
+ }
+ }
+ }
+
+ /* create the LOCATION-CHANGED.txt file to let the user know */
+ g_snprintf (source_path, 4096, "%s/LOCATION-CHANGED.txt", source);
+ fp = fopen (source_path, "w");
+ if (G_LIKELY (fp != NULL))
+ {
+ g_fprintf (fp, _("The location and the format of the autostart directory has changed.\n"
+ "The new location is\n"
+ "\n"
+ " %s\n"
+ "\n"
+ "where you can place .desktop files to, that describe the applications\n"
+ "to start when you login to your Xfce desktop. The files in your old\n"
+ "autostart directory have been successfully migrated to the new\n"
+ "location.\n"
+ "You should delete this directory now.\n"), target);
+ fclose (fp);
+ }
+
+ g_free (target);
+ }
+
+ g_dir_close (dp);
+ }
+}
+
+
+
+gint
+xfsm_startup_autostart_xdg (gboolean start_at_spi)
+{
+ const gchar *try_exec;
+ const gchar *type;
+ const gchar *exec;
+ gboolean startup_notify;
+ gboolean terminal;
+ gboolean skip;
+ GError *error = NULL;
+ XfceRc *rc;
+ gchar **files;
+ gchar **only_show_in;
+ gchar **not_show_in;
+ gint started = 0;
+ gint n, m;
+ gchar *filename;
+ const gchar *pattern;
+
+ /* migrate the old autostart location (if still present) */
+ xfsm_startup_autostart_migrate ();
+
+ /* pattern for only at-spi desktop files or everything */
+ if (start_at_spi)
+ pattern = "autostart/at-spi-*.desktop";
+ else
+ pattern = "autostart/*.desktop";
+
+ files = xfce_resource_match (XFCE_RESOURCE_CONFIG, pattern, TRUE);
+ for (n = 0; files[n] != NULL; ++n)
+ {
+ rc = xfce_rc_config_open (XFCE_RESOURCE_CONFIG, files[n], TRUE);
+ if (G_UNLIKELY (rc == NULL))
+ continue;
+
+ xfce_rc_set_group (rc, "Desktop Entry");
+
+ /* check the Hidden key */
+ skip = xfce_rc_read_bool_entry (rc, "Hidden", FALSE);
+ if (G_LIKELY (!skip))
+ {
+ xfsm_verbose("hidden set\n");
+
+ if (xfce_rc_read_bool_entry (rc, "X-XFCE-Autostart-Override", FALSE))
+ {
+ /* override the OnlyShowIn check */
+ skip = FALSE;
+ xfsm_verbose ("X-XFCE-Autostart-Override set, launching\n");
+ }
+ else
+ {
+ /* check the OnlyShowIn setting */
+ only_show_in = xfce_rc_read_list_entry (rc, "OnlyShowIn", ";");
+ if (G_UNLIKELY (only_show_in != NULL))
+ {
+ /* check if "XFCE" is specified */
+ for (m = 0, skip = TRUE; only_show_in[m] != NULL; ++m)
+ {
+ if (g_ascii_strcasecmp (only_show_in[m], "XFCE") == 0)
+ {
+ skip = FALSE;
+ xfsm_verbose ("only show in XFCE set, launching\n");
+ break;
+ }
+ }
+
+ g_strfreev (only_show_in);
+ }
+ }
+
+ /* check the NotShowIn setting */
+ not_show_in = xfce_rc_read_list_entry (rc, "NotShowIn", ";");
+ if (G_UNLIKELY (not_show_in != NULL))
+ {
+ /* check if "Xfce" is not specified */
+ for (m = 0; not_show_in[m] != NULL; ++m)
+ if (g_ascii_strcasecmp (not_show_in[m], "XFCE") == 0)
+ {
+ skip = TRUE;
+ xfsm_verbose ("NotShowIn Xfce set, skipping\n");
+ break;
+ }
+
+ g_strfreev (not_show_in);
+ }
+
+ /* skip at-spi launchers if not in at-spi mode or don't skip
+ * them no matter what the OnlyShowIn key says if only
+ * launching at-spi */
+ filename = g_path_get_basename (files[n]);
+ if (g_str_has_prefix (filename, "at-spi-"))
+ {
+ skip = !start_at_spi;
+ xfsm_verbose ("start_at_spi (a11y support), %s\n", skip ? "skipping" : "showing");
+ }
+ g_free (filename);
+ }
+
+ /* check the "Type" key */
+ type = xfce_rc_read_entry (rc, "Type", NULL);
+ if (G_UNLIKELY (!skip && type != NULL && g_ascii_strcasecmp (type, "Application") != 0))
+ {
+ skip = TRUE;
+ xfsm_verbose ("Type == Application, skipping\n");
+ }
+
+ /* check the "TryExec" key */
+ try_exec = xfce_rc_read_entry (rc, "TryExec", NULL);
+ if (G_UNLIKELY (!skip && try_exec != NULL))
+ {
+ skip = !xfsm_check_valid_exec (try_exec);
+ if (skip)
+ xfsm_verbose ("TryExec set and xfsm_check_valid_exec failed, skipping\n");
+ }
+
+ /* execute the item */
+ exec = xfce_rc_read_entry (rc, "Exec", NULL);
+ if (G_LIKELY (!skip && exec != NULL))
+ {
+ /* query launch parameters */
+ startup_notify = xfce_rc_read_bool_entry (rc, "StartupNotify", FALSE);
+ terminal = xfce_rc_read_bool_entry (rc, "Terminal", FALSE);
+
+ /* try to launch the command */
+ xfsm_verbose ("Autostart: running command \"%s\"\n", exec);
+ if (!xfce_spawn_command_line_on_screen (gdk_screen_get_default (),
+ exec,
+ terminal,
+ startup_notify,
+ &error))
+ {
+ g_warning ("Unable to launch \"%s\" (specified by %s): %s", exec, files[n], error->message);
+ xfsm_verbose ("Unable to launch \"%s\" (specified by %s): %s\n", exec, files[n], error->message);
+ g_error_free (error);
+ error = NULL;
+ }
+ else
+ {
+ ++started;
+ }
+ }
+
+ /* cleanup */
+ xfce_rc_close (rc);
+ }
+ g_strfreev (files);
+
+ return started;
+}