diff options
author | Alexander Schwinn <alexxcons@xfce.org> | 2019-03-24 23:52:42 +0100 |
---|---|---|
committer | Simon Steinbeiss <simon.steinbeiss@elfenbeinturm.at> | 2019-04-25 00:52:24 +0200 |
commit | 88346bde9ea6850caaf91e6868813b3132e76b10 (patch) | |
tree | 5aaf477aab9f692c4821d07333acd8440e843b89 /xfce4-session/xfsm-global.c | |
parent | e10ac91be3301c92900168855b265101ba9884e2 (diff) | |
download | xfce4-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.c | 295 |
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; +} |