static void maybe_load_saved_session_apps (GsmManager *manager) { GsmSystem *system; gboolean is_login; system = gsm_get_system (); is_login = gsm_system_is_login_session (system); g_object_unref (system); if (is_login) return; gsm_manager_add_autostart_apps_from_dir (manager, gsm_util_get_saved_session_dir ()); }
int main (int argc, char **argv) { GError *error = NULL; static char **override_autostart_dirs = NULL; static char *opt_session_name = NULL; const char *debug_string = NULL; gboolean gl_failed = FALSE; guint name_owner_id; GOptionContext *options; static GOptionEntry entries[] = { { "autostart", 'a', 0, G_OPTION_ARG_STRING_ARRAY, &override_autostart_dirs, N_("Override standard autostart directories"), N_("AUTOSTART_DIR") }, { "session", 0, 0, G_OPTION_ARG_STRING, &opt_session_name, N_("Session to use"), N_("SESSION_NAME") }, { "debug", 0, 0, G_OPTION_ARG_NONE, &debug, N_("Enable debugging code"), NULL }, { "failsafe", 'f', 0, G_OPTION_ARG_NONE, &failsafe, N_("Do not load user-specified applications"), NULL }, { "version", 0, 0, G_OPTION_ARG_NONE, &show_version, N_("Version of this application"), NULL }, /* Translators: the 'fail whale' is the black dialog we show when something goes seriously wrong */ { "whale", 0, 0, G_OPTION_ARG_NONE, &please_fail, N_("Show the fail whale dialog for testing"), NULL }, { "disable-acceleration-check", 0, 0, G_OPTION_ARG_NONE, &disable_acceleration_check, N_("Disable hardware acceleration check"), NULL }, { NULL, 0, 0, 0, NULL, NULL, NULL } }; /* Make sure that we have a session bus */ if (!require_dbus_session (argc, argv, &error)) { gsm_util_init_error (TRUE, "%s", error->message); } /* From 3.14 GDM sets XDG_CURRENT_DESKTOP. For compatibility with * older versions of GDM, other display managers, and startx, * set a fallback value if we don't find it set. */ if (g_getenv ("XDG_CURRENT_DESKTOP") == NULL) { g_setenv("XDG_CURRENT_DESKTOP", "GNOME", TRUE); gsm_util_setenv ("XDG_CURRENT_DESKTOP", "GNOME"); } /* Make sure we initialize gio in a way that does not autostart any daemon */ initialize_gio (); setlocale (LC_ALL, ""); bindtextdomain (GETTEXT_PACKAGE, LOCALE_DIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); debug_string = g_getenv ("GNOME_SESSION_DEBUG"); if (debug_string != NULL) { debug = rpmatch (debug_string) == TRUE || atoi (debug_string) == 1; } error = NULL; options = g_option_context_new (_(" - the GNOME session manager")); g_option_context_add_main_entries (options, entries, GETTEXT_PACKAGE); g_option_context_parse (options, &argc, &argv, &error); if (error != NULL) { g_warning ("%s", error->message); exit (1); } g_option_context_free (options); /* Rebind stdout/stderr to the journal explicitly, so that * journald picks ups the nicer "gnome-session" as the program * name instead of whatever shell script GDM happened to use. */ #ifdef HAVE_SYSTEMD if (!debug) { int journalfd; journalfd = sd_journal_stream_fd (PACKAGE, LOG_INFO, 0); if (journalfd >= 0) { dup2(journalfd, 1); dup2(journalfd, 2); } } #endif gdm_log_init (); gdm_log_set_debug (debug); if (disable_acceleration_check) { g_debug ("hardware acceleration check is disabled"); } else { /* Check GL, if it doesn't work out then force software fallback */ if (!check_gl (&error)) { gl_failed = TRUE; g_debug ("hardware acceleration check failed: %s", error? error->message : ""); g_clear_error (&error); if (g_getenv ("LIBGL_ALWAYS_SOFTWARE") == NULL) { g_setenv ("LIBGL_ALWAYS_SOFTWARE", "1", TRUE); if (!check_gl (&error)) { g_warning ("software acceleration check failed: %s", error? error->message : ""); g_clear_error (&error); } else { gl_failed = FALSE; } } } } if (show_version) { g_print ("%s %s\n", argv [0], VERSION); exit (0); } if (gl_failed) { gsm_fail_whale_dialog_we_failed (FALSE, TRUE, NULL); gsm_main (); exit (1); } if (please_fail) { gsm_fail_whale_dialog_we_failed (TRUE, TRUE, NULL); gsm_main (); exit (1); } { gchar *ibus_path; ibus_path = g_find_program_in_path("ibus-daemon"); if (ibus_path) { const gchar *p; p = g_getenv ("QT_IM_MODULE"); if (!p || !*p) p = "ibus"; gsm_util_setenv ("QT_IM_MODULE", p); p = g_getenv ("XMODIFIERS"); if (!p || !*p) p = "@im=ibus"; gsm_util_setenv ("XMODIFIERS", p); } g_free (ibus_path); } /* Some third-party programs rely on GNOME_DESKTOP_SESSION_ID to * detect if GNOME is running. We keep this for compatibility reasons. */ gsm_util_setenv ("GNOME_DESKTOP_SESSION_ID", "this-is-deprecated"); /* We want to use the GNOME menus which has the designed categories. */ gsm_util_setenv ("XDG_MENU_PREFIX", "gnome-"); /* hack to fix keyring until we can reorder things in 3.20 * https://bugzilla.gnome.org/show_bug.cgi?id=738205 */ if (g_strcmp0 (g_getenv ("XDG_SESSION_TYPE"), "wayland") == 0 && g_getenv ("GSM_SKIP_SSH_AGENT_WORKAROUND") == NULL) { char *ssh_socket; ssh_socket = g_build_filename (g_get_user_runtime_dir (), "keyring", "ssh", NULL); gsm_util_setenv ("SSH_AUTH_SOCK", ssh_socket); g_free (ssh_socket); } gsm_util_set_autostart_dirs (override_autostart_dirs); session_name = opt_session_name; /* Talk to logind before acquiring a name, since it does synchronous * calls at initialization time that invoke a main loop and if we * already owned a name, then we would service too early during * that main loop. */ g_object_unref (gsm_get_system ()); name_owner_id = acquire_name (); gsm_main (); g_clear_object (&manager); g_free (gl_renderer); g_bus_unown_name (name_owner_id); gdm_log_shutdown (); return 0; }