guibuilder_pel7x64builder0
7 years ago
25 changed files with 17313 additions and 0 deletions
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,119 @@
@@ -0,0 +1,119 @@
|
||||
From 2c0087930a188684e61e71d5b5459e4363471196 Mon Sep 17 00:00:00 2001 |
||||
From: rpm-build <rpm-build> |
||||
Date: Wed, 14 Feb 2018 09:50:56 -0500 |
||||
Subject: [PATCH] main: don't call into gdbus before setting all environment |
||||
variables |
||||
|
||||
setenv () is not multi-thread safe so we need to avoid gsm_util_setenv |
||||
calls (which fire off the glib worker thread) before we finish |
||||
doing all our setenv() work. |
||||
--- |
||||
gnome-session/main.c | 9 +++++++-- |
||||
1 file changed, 7 insertions(+), 2 deletions(-) |
||||
|
||||
diff --git a/gnome-session/main.c b/gnome-session/main.c |
||||
index e2c3efe..e7a1614 100644 |
||||
--- a/gnome-session/main.c |
||||
+++ b/gnome-session/main.c |
||||
@@ -244,91 +244,96 @@ initialize_gio (void) |
||||
disable_fuse = g_strdup (g_getenv ("GVFS_DISABLE_FUSE")); |
||||
use_vfs = g_strdup (g_getenv ("GIO_USE_VFS")); |
||||
|
||||
g_setenv ("GVFS_DISABLE_FUSE", "1", TRUE); |
||||
g_setenv ("GIO_USE_VFS", "local", TRUE); |
||||
g_vfs_get_default (); |
||||
|
||||
if (use_vfs) { |
||||
g_setenv ("GIO_USE_VFS", use_vfs, TRUE); |
||||
g_free (use_vfs); |
||||
} else { |
||||
g_unsetenv ("GIO_USE_VFS"); |
||||
} |
||||
|
||||
if (disable_fuse) { |
||||
g_setenv ("GVFS_DISABLE_FUSE", disable_fuse, TRUE); |
||||
g_free (disable_fuse); |
||||
} else { |
||||
g_unsetenv ("GVFS_DISABLE_FUSE"); |
||||
} |
||||
} |
||||
|
||||
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; |
||||
+ gboolean needs_current_desktop_setenv = 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"); |
||||
+ g_setenv ("XDG_CURRENT_DESKTOP", "GNOME", TRUE); |
||||
+ needs_current_desktop_setenv = TRUE; |
||||
} |
||||
|
||||
/* Make sure we initialize gio in a way that does not autostart any daemon */ |
||||
initialize_gio (); |
||||
|
||||
+ if (needs_current_desktop_setenv) { |
||||
+ gsm_util_setenv ("XDG_CURRENT_DESKTOP", "GNOME"); |
||||
+ } |
||||
+ |
||||
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); |
||||
-- |
||||
2.14.3 |
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,96 @@
@@ -0,0 +1,96 @@
|
||||
From 622e54d54c65eba7c5d8e4172f8aae8a970126f9 Mon Sep 17 00:00:00 2001 |
||||
From: Ray Strode <rstrode@redhat.com> |
||||
Date: Thu, 18 Jan 2018 10:09:36 -0500 |
||||
Subject: [PATCH 2/2] autostart: ensure gnome-shell and mutter get right |
||||
autostart phase |
||||
|
||||
Previous versions of gnome-shell neglected to save the autostart phases |
||||
for required components in the session state. While that is now fixed, |
||||
users may still have old saved state that lack the autostart phase. |
||||
|
||||
In order to ease upgrades, this commit manually adds in the phases that |
||||
are important for a functioning GNOME desktop. |
||||
--- |
||||
gnome-session/gsm-autostart-app.c | 12 +++++++++++- |
||||
1 file changed, 11 insertions(+), 1 deletion(-) |
||||
|
||||
diff --git a/gnome-session/gsm-autostart-app.c b/gnome-session/gsm-autostart-app.c |
||||
index 9eb1db5b..5617e549 100644 |
||||
--- a/gnome-session/gsm-autostart-app.c |
||||
+++ b/gnome-session/gsm-autostart-app.c |
||||
@@ -621,61 +621,71 @@ load_desktop_file (GsmAutostartApp *app) |
||||
char *startup_id; |
||||
char *phase_str; |
||||
int phase; |
||||
gboolean res; |
||||
|
||||
g_assert (app->priv->app_info != NULL); |
||||
|
||||
phase_str = g_desktop_app_info_get_string (app->priv->app_info, |
||||
GSM_AUTOSTART_APP_PHASE_KEY); |
||||
if (phase_str != NULL) { |
||||
if (strcmp (phase_str, "EarlyInitialization") == 0) { |
||||
phase = GSM_MANAGER_PHASE_EARLY_INITIALIZATION; |
||||
} else if (strcmp (phase_str, "PreDisplayServer") == 0) { |
||||
phase = GSM_MANAGER_PHASE_PRE_DISPLAY_SERVER; |
||||
} else if (strcmp (phase_str, "DisplayServer") == 0) { |
||||
phase = GSM_MANAGER_PHASE_DISPLAY_SERVER; |
||||
} else if (strcmp (phase_str, "Initialization") == 0) { |
||||
phase = GSM_MANAGER_PHASE_INITIALIZATION; |
||||
} else if (strcmp (phase_str, "WindowManager") == 0) { |
||||
phase = GSM_MANAGER_PHASE_WINDOW_MANAGER; |
||||
} else if (strcmp (phase_str, "Panel") == 0) { |
||||
phase = GSM_MANAGER_PHASE_PANEL; |
||||
} else if (strcmp (phase_str, "Desktop") == 0) { |
||||
phase = GSM_MANAGER_PHASE_DESKTOP; |
||||
} else { |
||||
phase = GSM_MANAGER_PHASE_APPLICATION; |
||||
} |
||||
|
||||
g_free (phase_str); |
||||
} else { |
||||
- phase = GSM_MANAGER_PHASE_APPLICATION; |
||||
+ const char *app_id; |
||||
+ |
||||
+ app_id = g_app_info_get_id (G_APP_INFO (app->priv->app_info)); |
||||
+ |
||||
+ /* These hardcoded checks are to keep upgrades working */ |
||||
+ if (app_id != NULL && g_str_has_prefix (app_id, "org.gnome.Shell")) |
||||
+ phase = GSM_MANAGER_PHASE_DISPLAY_SERVER; |
||||
+ else if (app_id != NULL && g_str_has_prefix (app_id, "org.gnome.SettingsDaemon")) |
||||
+ phase = GSM_MANAGER_PHASE_INITIALIZATION; |
||||
+ else |
||||
+ phase = GSM_MANAGER_PHASE_APPLICATION; |
||||
} |
||||
|
||||
dbus_name = g_desktop_app_info_get_string (app->priv->app_info, |
||||
GSM_AUTOSTART_APP_DBUS_NAME_KEY); |
||||
if (dbus_name != NULL) { |
||||
app->priv->launch_type = AUTOSTART_LAUNCH_ACTIVATE; |
||||
} else { |
||||
app->priv->launch_type = AUTOSTART_LAUNCH_SPAWN; |
||||
} |
||||
|
||||
/* this must only be done on first load */ |
||||
switch (app->priv->launch_type) { |
||||
case AUTOSTART_LAUNCH_SPAWN: |
||||
startup_id = |
||||
g_desktop_app_info_get_string (app->priv->app_info, |
||||
GSM_AUTOSTART_APP_STARTUP_ID_KEY); |
||||
|
||||
if (startup_id == NULL) { |
||||
startup_id = gsm_util_generate_startup_id (); |
||||
} |
||||
break; |
||||
case AUTOSTART_LAUNCH_ACTIVATE: |
||||
startup_id = g_strdup (dbus_name); |
||||
break; |
||||
default: |
||||
g_assert_not_reached (); |
||||
} |
||||
|
||||
res = g_desktop_app_info_has_key (app->priv->app_info, |
||||
GSM_AUTOSTART_APP_AUTORESTART_KEY); |
||||
-- |
||||
2.14.3 |
||||
|
@ -0,0 +1,195 @@
@@ -0,0 +1,195 @@
|
||||
From 808e1598dc50484f62998b4a9e94e956f028d362 Mon Sep 17 00:00:00 2001 |
||||
From: Ray Strode <rstrode@redhat.com> |
||||
Date: Fri, 8 May 2015 16:27:15 -0400 |
||||
Subject: [PATCH 03/19] Revert "Rename the desktop file to |
||||
gnome-session-properties.desktop" |
||||
|
||||
This reverts commit ac9fd0dc97a17674cb082f80df0b1fcc45bc92bf. |
||||
--- |
||||
configure.ac | 2 +- |
||||
data/Makefile.am | 2 +- |
||||
...ession-properties.desktop.in.in => session-properties.desktop.in.in} | 0 |
||||
po/POTFILES.in | 1 + |
||||
po/POTFILES.skip | 1 + |
||||
5 files changed, 4 insertions(+), 2 deletions(-) |
||||
rename data/{gnome-session-properties.desktop.in.in => session-properties.desktop.in.in} (100%) |
||||
|
||||
diff --git a/configure.ac b/configure.ac |
||||
index b3f285ed..5182c09e 100644 |
||||
--- a/configure.ac |
||||
+++ b/configure.ac |
||||
@@ -343,61 +343,61 @@ if test $enable_ipv6 = yes; then |
||||
dnl ================================================================= |
||||
dnl Now we would check for specific function like getaddrinfo. |
||||
dnl ================================================================= |
||||
have_getaddrinfo=no |
||||
if test $have_ipv6=yes; then |
||||
AC_CHECK_FUNC(getaddrinfo, have_getaddrinfo=yes) |
||||
if test $have_getaddrinfo != yes; then |
||||
# getaddrinfo is not in the default libraries. See if it's in some other. |
||||
for lib in bsd socket inet; do |
||||
AC_CHECK_LIB($lib, getaddrinfo, [LIBS="$LIBS -l$lib";have_getaddrinfo=yes; break]) |
||||
done |
||||
fi |
||||
if test $have_getaddrinfo=yes; then |
||||
AC_DEFINE(ENABLE_IPV6, 1, [Define if IPV6 is supported]) |
||||
have_full_ipv6=yes |
||||
fi |
||||
fi |
||||
fi |
||||
dnl ============================================================================== |
||||
dnl End of IPv6 checks |
||||
dnl ============================================================================== |
||||
|
||||
AC_CONFIG_FILES([ |
||||
Makefile |
||||
capplet/Makefile |
||||
doc/Makefile |
||||
doc/dbus/Makefile |
||||
doc/dbus/gnome-session.xml |
||||
doc/man/Makefile |
||||
data/Makefile |
||||
-data/gnome-session-properties.desktop.in |
||||
+data/session-properties.desktop.in |
||||
data/org.gnome.SessionManager.gschema.xml |
||||
data/icons/Makefile |
||||
data/icons/16x16/Makefile |
||||
data/icons/22x22/Makefile |
||||
data/icons/24x24/Makefile |
||||
data/icons/32x32/Makefile |
||||
data/icons/48x48/Makefile |
||||
data/icons/scalable/Makefile |
||||
data/icons/symbolic/Makefile |
||||
gnome-session/Makefile |
||||
tools/Makefile |
||||
po/Makefile.in |
||||
]) |
||||
AC_OUTPUT |
||||
|
||||
dnl --------------------------------------------------------------------------- |
||||
dnl - Show summary |
||||
dnl --------------------------------------------------------------------------- |
||||
|
||||
echo " |
||||
gnome-session $VERSION |
||||
`echo gnome-session $VERSION | sed "s/./=/g"` |
||||
|
||||
prefix: ${prefix} |
||||
exec_prefix: ${exec_prefix} |
||||
libdir: ${libdir} |
||||
bindir: ${bindir} |
||||
sbindir: ${sbindir} |
||||
sysconfdir: ${sysconfdir} |
||||
localstatedir: ${localstatedir} |
||||
diff --git a/data/Makefile.am b/data/Makefile.am |
||||
index b5c3f5ec..0bb25c06 100644 |
||||
--- a/data/Makefile.am |
||||
+++ b/data/Makefile.am |
||||
@@ -1,58 +1,58 @@ |
||||
SUBDIRS = icons |
||||
|
||||
uidir = $(pkgdatadir) |
||||
ui_DATA = \ |
||||
session-properties.ui |
||||
|
||||
if BUILD_SESSION_SELECTOR |
||||
ui_DATA += session-selector.ui |
||||
endif |
||||
|
||||
hwcompatdir = $(pkgdatadir) |
||||
hwcompat_DATA = hardware-compatibility |
||||
|
||||
xsessiondir = $(datadir)/xsessions |
||||
xsession_in_files = gnome.desktop.in gnome-xorg.desktop.in |
||||
|
||||
if BUILD_SESSION_SELECTOR |
||||
xsession_in_files += gnome-custom-session.desktop.in |
||||
endif |
||||
|
||||
xsession_DATA = $(xsession_in_files:.desktop.in=.desktop) |
||||
|
||||
wayland_sessiondir = $(datadir)/wayland-sessions |
||||
wayland_session_in_files = gnome.desktop.in |
||||
wayland_session_DATA = $(wayland_session_in_files:.desktop.in=.desktop) |
||||
|
||||
desktopdir = $(datadir)/applications |
||||
-desktop_in_files = gnome-session-properties.desktop.in |
||||
+desktop_in_files = session-properties.desktop.in |
||||
desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) |
||||
|
||||
sessiondir = $(datadir)/gnome-session/sessions |
||||
session_in_in_files = gnome.session.desktop.in.in gnome-dummy.session.desktop.in.in |
||||
session_in_files = $(session_in_in_files:.session.desktop.in.in=.session.desktop.in) |
||||
session_DATA = $(session_in_files:.session.desktop.in=.session) |
||||
|
||||
%.session.desktop.in: %.session.desktop.in.in Makefile |
||||
$(AM_V_GEN)sed \ |
||||
-e "s|\@LIBEXECDIR\@|$(libexecdir)|" \ |
||||
$< > $@ |
||||
|
||||
%.session: %.session.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@ |
||||
|
||||
@INTLTOOL_DESKTOP_RULE@ |
||||
@INTLTOOL_XML_NOMERGE_RULE@ |
||||
|
||||
gsettings_SCHEMAS = org.gnome.SessionManager.gschema.xml |
||||
@GSETTINGS_RULES@ |
||||
|
||||
migrationdir = $(datadir)/GConf/gsettings |
||||
dist_migration_DATA = gnome-session.convert |
||||
|
||||
EXTRA_DIST = \ |
||||
$(xsession_in_files) \ |
||||
$(session_in_in_files) \ |
||||
$(wayland_session_in_files) \ |
||||
$(gsettings_SCHEMAS:.xml=.xml.in) \ |
||||
session-selector.ui \ |
||||
gnome-custom-session.desktop.in \ |
||||
diff --git a/data/gnome-session-properties.desktop.in.in b/data/session-properties.desktop.in.in |
||||
similarity index 100% |
||||
rename from data/gnome-session-properties.desktop.in.in |
||||
rename to data/session-properties.desktop.in.in |
||||
diff --git a/po/POTFILES.in b/po/POTFILES.in |
||||
index 5cb5123d..08d2eb06 100644 |
||||
--- a/po/POTFILES.in |
||||
+++ b/po/POTFILES.in |
||||
@@ -1,24 +1,25 @@ |
||||
# List of source files containing translatable strings. |
||||
# Please keep this file sorted alphabetically. |
||||
capplet/gsm-app-dialog.c |
||||
capplet/gsm-properties-dialog.c |
||||
capplet/gsp-app.c |
||||
capplet/main.c |
||||
data/gnome-custom-session.desktop.in |
||||
data/gnome.desktop.in |
||||
data/gnome-xorg.desktop.in |
||||
data/gnome-dummy.session.desktop.in.in |
||||
data/gnome.session.desktop.in.in |
||||
data/gnome-session-properties.desktop.in.in |
||||
[type: gettext/glade]data/session-selector.ui |
||||
+data/session-properties.desktop.in.in |
||||
[type: gettext/glade]data/session-properties.ui |
||||
gnome-session/gsm-fail-whale-dialog.c |
||||
gnome-session/gsm-manager.c |
||||
gnome-session/gsm-process-helper.c |
||||
gnome-session/gsm-util.c |
||||
gnome-session/gsm-xsmp-client.c |
||||
gnome-session/gsm-xsmp-server.c |
||||
gnome-session/main.c |
||||
tools/gnome-session-inhibit.c |
||||
tools/gnome-session-selector.c |
||||
tools/gnome-session-quit.c |
||||
diff --git a/po/POTFILES.skip b/po/POTFILES.skip |
||||
index 91b41569..e6470914 100644 |
||||
--- a/po/POTFILES.skip |
||||
+++ b/po/POTFILES.skip |
||||
@@ -1,5 +1,6 @@ |
||||
# List of source files containing translatable strings that should not be |
||||
# translated. |
||||
# Please keep this file sorted alphabetically. |
||||
data/gnome-dummy.session.desktop.in |
||||
data/gnome.session.desktop.in |
||||
+data/session-properties.desktop.in |
||||
-- |
||||
2.14.2 |
||||
|
@ -0,0 +1,441 @@
@@ -0,0 +1,441 @@
|
||||
From 2a087ede1b20e8dcac1c37c0b280f9bf6be7c93b Mon Sep 17 00:00:00 2001 |
||||
From: Ray Strode <rstrode@redhat.com> |
||||
Date: Wed, 13 May 2015 10:56:09 -0400 |
||||
Subject: [PATCH 04/19] stop using gsm_util_get_current_desktop |
||||
|
||||
It no longer exists. |
||||
--- |
||||
capplet/gsp-app.c | 111 +++++++++++++++++++++++++++++------------------------- |
||||
1 file changed, 60 insertions(+), 51 deletions(-) |
||||
|
||||
diff --git a/capplet/gsp-app.c b/capplet/gsp-app.c |
||||
index c92b8dad..123ab217 100644 |
||||
--- a/capplet/gsp-app.c |
||||
+++ b/capplet/gsp-app.c |
||||
@@ -3,60 +3,61 @@ |
||||
* Copyright (C) 1999 Free Software Foundation, Inc. |
||||
* Copyright (C) 2007, 2009 Vincent Untz. |
||||
* Copyright (C) 2008 Lucas Rocha. |
||||
* Copyright (C) 2008 William Jon McCann <jmccann@redhat.com> |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation; either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
||||
* |
||||
*/ |
||||
|
||||
#ifdef HAVE_CONFIG_H |
||||
#include <config.h> |
||||
#endif |
||||
|
||||
#include <string.h> |
||||
#include <sys/stat.h> |
||||
|
||||
#include <glib/gi18n.h> |
||||
#include <glib/gstdio.h> |
||||
+#include <gio/gdesktopappinfo.h> |
||||
|
||||
#include "gsm-app-dialog.h" |
||||
#include "gsm-properties-dialog.h" |
||||
#include "gsm-util.h" |
||||
#include "gsp-app-manager.h" |
||||
#include "gsp-keyfile.h" |
||||
|
||||
#include "gsp-app.h" |
||||
|
||||
#define GSP_APP_SAVE_DELAY 2 |
||||
|
||||
#define GSP_ASP_SAVE_MASK_HIDDEN 0x0001 |
||||
#define GSP_ASP_SAVE_MASK_ENABLED 0x0002 |
||||
#define GSP_ASP_SAVE_MASK_NAME 0x0004 |
||||
#define GSP_ASP_SAVE_MASK_EXEC 0x0008 |
||||
#define GSP_ASP_SAVE_MASK_COMMENT 0x0010 |
||||
#define GSP_ASP_SAVE_MASK_NO_DISPLAY 0x0020 |
||||
#define GSP_ASP_SAVE_MASK_ALL 0xffff |
||||
|
||||
struct _GspAppPrivate { |
||||
char *basename; |
||||
char *path; |
||||
|
||||
gboolean hidden; |
||||
gboolean no_display; |
||||
gboolean enabled; |
||||
gboolean shown; |
||||
|
||||
char *name; |
||||
char *exec; |
||||
@@ -281,148 +282,145 @@ _gsp_app_update_description (GspApp *app) |
||||
} else { |
||||
secondary = _("No description"); |
||||
} |
||||
|
||||
g_free (app->priv->description); |
||||
app->priv->description = g_markup_printf_escaped ("<b>%s</b>\n%s", |
||||
primary, |
||||
secondary); |
||||
} |
||||
|
||||
/* |
||||
* Saving |
||||
*/ |
||||
|
||||
static void |
||||
_gsp_ensure_user_autostart_dir (void) |
||||
{ |
||||
char *dir; |
||||
|
||||
dir = g_build_filename (g_get_user_config_dir (), "autostart", NULL); |
||||
g_mkdir_with_parents (dir, S_IRWXU); |
||||
|
||||
g_free (dir); |
||||
} |
||||
|
||||
static gboolean |
||||
_gsp_app_user_equal_system (GspApp *app, |
||||
char **system_path) |
||||
{ |
||||
GspAppManager *manager; |
||||
- const char *system_dir; |
||||
- char *path; |
||||
- char *str; |
||||
- GKeyFile *keyfile; |
||||
+ gboolean return_value = FALSE; |
||||
+ const char *system_dir = NULL; |
||||
+ char *path = NULL; |
||||
+ char *str = NULL; |
||||
+ GKeyFile *keyfile = NULL; |
||||
+ GDesktopAppInfo *app_info = NULL; |
||||
|
||||
manager = gsp_app_manager_get (); |
||||
system_dir = gsp_app_manager_get_dir (manager, |
||||
app->priv->xdg_system_position); |
||||
g_object_unref (manager); |
||||
if (!system_dir) { |
||||
- return FALSE; |
||||
+ goto out; |
||||
} |
||||
|
||||
path = g_build_filename (system_dir, app->priv->basename, NULL); |
||||
|
||||
keyfile = g_key_file_new (); |
||||
if (!g_key_file_load_from_file (keyfile, path, G_KEY_FILE_NONE, NULL)) { |
||||
- g_free (path); |
||||
- g_key_file_free (keyfile); |
||||
- return FALSE; |
||||
+ goto out; |
||||
} |
||||
|
||||
- if (gsp_key_file_get_boolean (keyfile, |
||||
- G_KEY_FILE_DESKTOP_KEY_HIDDEN, |
||||
- FALSE) != app->priv->hidden || |
||||
- gsp_key_file_get_boolean (keyfile, |
||||
- GSP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLED, |
||||
- TRUE) != app->priv->enabled || |
||||
- gsp_key_file_get_shown (keyfile, |
||||
- gsm_util_get_current_desktop ()) != app->priv->shown) { |
||||
- g_free (path); |
||||
- g_key_file_free (keyfile); |
||||
- return FALSE; |
||||
+ app_info = g_desktop_app_info_new_from_keyfile (keyfile); |
||||
+ |
||||
+ if (!app_info) { |
||||
+ goto out; |
||||
} |
||||
|
||||
- if (gsp_key_file_get_boolean (keyfile, |
||||
- G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY, |
||||
- FALSE) != app->priv->no_display) { |
||||
- g_free (path); |
||||
- g_key_file_free (keyfile); |
||||
- return FALSE; |
||||
+ if (g_desktop_app_info_get_is_hidden (app_info)) { |
||||
+ goto out; |
||||
+ } |
||||
+ |
||||
+ if (g_desktop_app_info_has_key (app_info, |
||||
+ GSP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLED) && |
||||
+ !g_desktop_app_info_get_boolean (app_info, |
||||
+ GSP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLED)) { |
||||
+ goto out; |
||||
+ } |
||||
+ |
||||
+ if (!g_desktop_app_info_get_show_in (app_info, NULL)) { |
||||
+ goto out; |
||||
+ } |
||||
+ |
||||
+ if (g_desktop_app_info_get_nodisplay (app_info)) { |
||||
+ goto out; |
||||
} |
||||
|
||||
str = gsp_key_file_get_locale_string (keyfile, |
||||
G_KEY_FILE_DESKTOP_KEY_NAME); |
||||
if (!_gsp_str_equal (str, app->priv->name)) { |
||||
- g_free (str); |
||||
- g_free (path); |
||||
- g_key_file_free (keyfile); |
||||
- return FALSE; |
||||
+ goto out; |
||||
} |
||||
- g_free (str); |
||||
+ g_clear_pointer (&str, g_free); |
||||
|
||||
str = gsp_key_file_get_locale_string (keyfile, |
||||
G_KEY_FILE_DESKTOP_KEY_COMMENT); |
||||
if (!_gsp_str_equal (str, app->priv->comment)) { |
||||
- g_free (str); |
||||
- g_free (path); |
||||
- g_key_file_free (keyfile); |
||||
- return FALSE; |
||||
+ goto out; |
||||
} |
||||
- g_free (str); |
||||
+ g_clear_pointer (&str, g_free); |
||||
|
||||
str = gsp_key_file_get_string (keyfile, |
||||
G_KEY_FILE_DESKTOP_KEY_EXEC); |
||||
if (!_gsp_str_equal (str, app->priv->exec)) { |
||||
- g_free (str); |
||||
- g_free (path); |
||||
- g_key_file_free (keyfile); |
||||
- return FALSE; |
||||
+ goto out; |
||||
} |
||||
- g_free (str); |
||||
+ g_clear_pointer (&str, g_free); |
||||
|
||||
str = gsp_key_file_get_locale_string (keyfile, |
||||
G_KEY_FILE_DESKTOP_KEY_ICON); |
||||
if (!_gsp_str_equal (str, app->priv->icon)) { |
||||
- g_free (str); |
||||
- g_free (path); |
||||
- g_key_file_free (keyfile); |
||||
- return FALSE; |
||||
+ goto out; |
||||
} |
||||
- g_free (str); |
||||
- |
||||
- g_key_file_free (keyfile); |
||||
+ g_clear_pointer (&str, g_free); |
||||
|
||||
*system_path = path; |
||||
- |
||||
- return TRUE; |
||||
+ path = NULL; |
||||
+ return_value = TRUE; |
||||
+out: |
||||
+ g_clear_pointer (&path, g_free); |
||||
+ g_clear_pointer (&str, g_free); |
||||
+ g_clear_object (&app_info); |
||||
+ g_clear_pointer (&keyfile, g_key_file_free); |
||||
+ |
||||
+ return return_value; |
||||
} |
||||
|
||||
static inline void |
||||
_gsp_app_save_done_success (GspApp *app) |
||||
{ |
||||
app->priv->save_mask = 0; |
||||
|
||||
if (app->priv->old_system_path) { |
||||
g_free (app->priv->old_system_path); |
||||
app->priv->old_system_path = NULL; |
||||
} |
||||
} |
||||
|
||||
static gboolean |
||||
_gsp_app_save (gpointer data) |
||||
{ |
||||
GspApp *app; |
||||
char *use_path; |
||||
GKeyFile *keyfile; |
||||
GError *error; |
||||
|
||||
app = GSP_APP (data); |
||||
|
||||
/* first check if removing the data from the user dir and using the |
||||
* data from the system dir is enough -- this helps us keep clean the |
||||
* user config dir by removing unneeded files */ |
||||
if (_gsp_app_user_equal_system (app, &use_path)) { |
||||
if (g_file_test (app->priv->path, G_FILE_TEST_EXISTS)) { |
||||
g_remove (app->priv->path); |
||||
} |
||||
@@ -748,153 +746,164 @@ gsp_app_delete (GspApp *app) |
||||
app->priv->hidden = TRUE; |
||||
app->priv->save_mask |= GSP_ASP_SAVE_MASK_HIDDEN; |
||||
|
||||
_gsp_app_queue_save (app); |
||||
_gsp_app_emit_changed (app); |
||||
} |
||||
} |
||||
|
||||
/* |
||||
* New autostart app |
||||
*/ |
||||
|
||||
void |
||||
gsp_app_reload_at (GspApp *app, |
||||
const char *path, |
||||
unsigned int xdg_position) |
||||
{ |
||||
g_return_if_fail (GSP_IS_APP (app)); |
||||
|
||||
app->priv->xdg_position = G_MAXUINT; |
||||
gsp_app_new (path, xdg_position); |
||||
} |
||||
|
||||
GspApp * |
||||
gsp_app_new (const char *path, |
||||
unsigned int xdg_position) |
||||
{ |
||||
GspAppManager *manager; |
||||
GspApp *app; |
||||
GKeyFile *keyfile; |
||||
+ GDesktopAppInfo *app_info; |
||||
char *basename; |
||||
gboolean new; |
||||
|
||||
basename = g_path_get_basename (path); |
||||
|
||||
manager = gsp_app_manager_get (); |
||||
app = gsp_app_manager_find_app_with_basename (manager, basename); |
||||
g_object_unref (manager); |
||||
|
||||
new = (app == NULL); |
||||
|
||||
if (!new) { |
||||
if (app->priv->xdg_position == xdg_position) { |
||||
if (app->priv->skip_next_monitor_event) { |
||||
app->priv->skip_next_monitor_event = FALSE; |
||||
return NULL; |
||||
} |
||||
/* else: the file got changed but not by us, we'll |
||||
* update our data from disk */ |
||||
} |
||||
|
||||
if (app->priv->xdg_position < xdg_position || |
||||
app->priv->save_timeout != 0) { |
||||
/* we don't really care about this file, since we |
||||
* already have something with a higher priority, or |
||||
* we're going to write something in the user config |
||||
* anyway. |
||||
* Note: xdg_position >= 1 so it's a system dir */ |
||||
app->priv->xdg_system_position = MIN (xdg_position, |
||||
app->priv->xdg_system_position); |
||||
return NULL; |
||||
} |
||||
} |
||||
|
||||
keyfile = g_key_file_new (); |
||||
if (!g_key_file_load_from_file (keyfile, path, G_KEY_FILE_NONE, NULL)) { |
||||
g_key_file_free (keyfile); |
||||
g_free (basename); |
||||
return NULL; |
||||
} |
||||
|
||||
+ app_info = g_desktop_app_info_new_from_keyfile (keyfile); |
||||
+ |
||||
+ if (!app_info) { |
||||
+ g_object_unref (app_info); |
||||
+ g_key_file_free (keyfile); |
||||
+ g_free (basename); |
||||
+ return NULL; |
||||
+ } |
||||
+ |
||||
if (new) { |
||||
app = g_object_new (GSP_TYPE_APP, NULL); |
||||
app->priv->basename = basename; |
||||
} else { |
||||
g_free (basename); |
||||
_gsp_app_free_reusable_data (app); |
||||
} |
||||
|
||||
+ |
||||
app->priv->path = g_strdup (path); |
||||
|
||||
app->priv->hidden = gsp_key_file_get_boolean (keyfile, |
||||
G_KEY_FILE_DESKTOP_KEY_HIDDEN, |
||||
FALSE); |
||||
app->priv->no_display = gsp_key_file_get_boolean (keyfile, |
||||
G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY, |
||||
FALSE); |
||||
app->priv->enabled = gsp_key_file_get_boolean (keyfile, |
||||
GSP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLED, |
||||
TRUE); |
||||
- app->priv->shown = gsp_key_file_get_shown (keyfile, |
||||
- gsm_util_get_current_desktop ()); |
||||
+ app->priv->shown = g_desktop_app_info_get_show_in (app_info, NULL); |
||||
|
||||
app->priv->name = gsp_key_file_get_locale_string (keyfile, |
||||
G_KEY_FILE_DESKTOP_KEY_NAME); |
||||
app->priv->exec = gsp_key_file_get_string (keyfile, |
||||
G_KEY_FILE_DESKTOP_KEY_EXEC); |
||||
app->priv->comment = gsp_key_file_get_locale_string (keyfile, |
||||
G_KEY_FILE_DESKTOP_KEY_COMMENT); |
||||
|
||||
if (gsm_util_text_is_blank (app->priv->name)) { |
||||
g_free (app->priv->name); |
||||
app->priv->name = g_strdup (app->priv->exec); |
||||
} |
||||
|
||||
app->priv->icon = gsp_key_file_get_locale_string (keyfile, |
||||
G_KEY_FILE_DESKTOP_KEY_ICON); |
||||
|
||||
if (app->priv->icon) { |
||||
/* look at icon and see if it's a themed icon or not */ |
||||
if (g_path_is_absolute (app->priv->icon)) { |
||||
GFile *iconfile; |
||||
|
||||
iconfile = g_file_new_for_path (app->priv->icon); |
||||
app->priv->gicon = g_file_icon_new (iconfile); |
||||
g_object_unref (iconfile); |
||||
} else { |
||||
app->priv->gicon = g_themed_icon_new (app->priv->icon); |
||||
} |
||||
} else { |
||||
app->priv->gicon = NULL; |
||||
} |
||||
|
||||
+ g_object_unref (app_info); |
||||
g_key_file_free (keyfile); |
||||
|
||||
_gsp_app_update_description (app); |
||||
|
||||
if (xdg_position > 0) { |
||||
g_assert (xdg_position <= app->priv->xdg_system_position); |
||||
app->priv->xdg_system_position = xdg_position; |
||||
} |
||||
/* else we keep the old value (which is G_MAXUINT if it wasn't set) */ |
||||
app->priv->xdg_position = xdg_position; |
||||
|
||||
g_assert (!new || app->priv->save_timeout == 0); |
||||
app->priv->save_timeout = 0; |
||||
app->priv->old_system_path = NULL; |
||||
app->priv->skip_next_monitor_event = FALSE; |
||||
|
||||
if (!new) { |
||||
_gsp_app_emit_changed (app); |
||||
} |
||||
|
||||
return app; |
||||
} |
||||
|
||||
static char * |
||||
_gsp_find_free_basename (const char *suggested_basename) |
||||
{ |
||||
GspAppManager *manager; |
||||
char *base_path; |
||||
char *filename; |
||||
char *basename; |
||||
-- |
||||
2.14.2 |
||||
|
@ -0,0 +1,34 @@
@@ -0,0 +1,34 @@
|
||||
From 119ac97cea3b362e53aaa236f643f9bb916a03cb Mon Sep 17 00:00:00 2001 |
||||
From: Ray Strode <rstrode@redhat.com> |
||||
Date: Fri, 20 Dec 2013 15:07:35 -0500 |
||||
Subject: [PATCH 05/19] session-properties: get out of Other |
||||
|
||||
Put it in the menus next to Settings and Software |
||||
--- |
||||
data/session-properties.desktop.in.in | 2 +- |
||||
1 file changed, 1 insertion(+), 1 deletion(-) |
||||
|
||||
diff --git a/data/session-properties.desktop.in.in b/data/session-properties.desktop.in.in |
||||
index 3dc7b033..dcfe2f84 100644 |
||||
--- a/data/session-properties.desktop.in.in |
||||
+++ b/data/session-properties.desktop.in.in |
||||
@@ -1,15 +1,15 @@ |
||||
[Desktop Entry] |
||||
_Name=Startup Applications |
||||
_Comment=Choose what applications to start when you log in |
||||
Exec=gnome-session-properties |
||||
Icon=session-properties |
||||
Terminal=false |
||||
Type=Application |
||||
StartupNotify=true |
||||
-Categories=GTK;GNOME;Settings;X-GNOME-PersonalSettings; |
||||
+Categories=GNOME;GTK;System; |
||||
OnlyShowIn=GNOME;Unity; |
||||
NoDisplay=true |
||||
X-GNOME-Bugzilla-Bugzilla=GNOME |
||||
X-GNOME-Bugzilla-Product=gnome-session |
||||
X-GNOME-Bugzilla-Component=gnome-session-properties |
||||
X-GNOME-Bugzilla-Version=@VERSION@ |
||||
-- |
||||
2.14.2 |
||||
|
@ -0,0 +1,377 @@
@@ -0,0 +1,377 @@
|
||||
From 805c9f995da83c173f9323f55a3f26b627410553 Mon Sep 17 00:00:00 2001 |
||||
From: Ray Strode <rstrode@redhat.com> |
||||
Date: Fri, 20 Dec 2013 10:53:33 -0500 |
||||
Subject: [PATCH 06/19] session-properties: refresh from recent glade |
||||
|
||||
The ui file is rather old. This commit just opens it up in a recent |
||||
glade and resaves it, so we have a fresh starting point to make |
||||
changes. |
||||
--- |
||||
data/session-properties.ui | 43 ++++++++++++++++++++++++++++++++++--------- |
||||
1 file changed, 34 insertions(+), 9 deletions(-) |
||||
|
||||
diff --git a/data/session-properties.ui b/data/session-properties.ui |
||||
index 1f0cb9a5..47a30f78 100644 |
||||
--- a/data/session-properties.ui |
||||
+++ b/data/session-properties.ui |
||||
@@ -1,323 +1,348 @@ |
||||
-<?xml version="1.0"?> |
||||
+<?xml version="1.0" encoding="UTF-8"?> |
||||
<interface> |
||||
- <requires lib="gtk+" version="2.16"/> |
||||
- <!-- interface-naming-policy toplevel-contextual --> |
||||
+ <!-- interface-requires gtk+ 3.0 --> |
||||
<object class="GtkNotebook" id="main-notebook"> |
||||
<property name="visible">True</property> |
||||
<property name="can_focus">True</property> |
||||
<property name="border_width">6</property> |
||||
<child> |
||||
<object class="GtkVBox" id="vbox1"> |
||||
<property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="border_width">12</property> |
||||
- <property name="orientation">vertical</property> |
||||
<property name="spacing">3</property> |
||||
<child> |
||||
<object class="GtkLabel" id="label6"> |
||||
<property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="xalign">0</property> |
||||
<property name="xpad">3</property> |
||||
<property name="ypad">3</property> |
||||
<property name="label" translatable="yes">Additional startup _programs:</property> |
||||
<property name="use_underline">True</property> |
||||
<property name="mnemonic_widget">session_properties_treeview</property> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">False</property> |
||||
+ <property name="fill">True</property> |
||||
<property name="position">0</property> |
||||
</packing> |
||||
</child> |
||||
<child> |
||||
<object class="GtkHBox" id="hbox1"> |
||||
<property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="spacing">6</property> |
||||
<child> |
||||
<object class="GtkScrolledWindow" id="scrolledwindow1"> |
||||
<property name="visible">True</property> |
||||
<property name="can_focus">True</property> |
||||
<property name="hscrollbar_policy">never</property> |
||||
- <property name="vscrollbar_policy">automatic</property> |
||||
<property name="shadow_type">etched-in</property> |
||||
<child> |
||||
<object class="GtkTreeView" id="session_properties_treeview"> |
||||
<property name="height_request">210</property> |
||||
<property name="visible">True</property> |
||||
<property name="can_focus">True</property> |
||||
+ <child internal-child="selection"> |
||||
+ <object class="GtkTreeSelection" id="treeview-selection1"/> |
||||
+ </child> |
||||
</object> |
||||
</child> |
||||
</object> |
||||
<packing> |
||||
+ <property name="expand">True</property> |
||||
+ <property name="fill">True</property> |
||||
<property name="position">0</property> |
||||
</packing> |
||||
</child> |
||||
<child> |
||||
<object class="GtkVButtonBox" id="vbuttonbox1"> |
||||
<property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="spacing">6</property> |
||||
<property name="layout_style">start</property> |
||||
<child> |
||||
<object class="GtkButton" id="session_properties_add_button"> |
||||
<property name="label">gtk-add</property> |
||||
<property name="visible">True</property> |
||||
<property name="can_focus">True</property> |
||||
<property name="receives_default">True</property> |
||||
<property name="use_stock">True</property> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">False</property> |
||||
<property name="fill">False</property> |
||||
<property name="position">0</property> |
||||
</packing> |
||||
</child> |
||||
<child> |
||||
<object class="GtkButton" id="session_properties_delete_button"> |
||||
<property name="label">gtk-remove</property> |
||||
<property name="visible">True</property> |
||||
<property name="sensitive">False</property> |
||||
<property name="can_focus">True</property> |
||||
<property name="receives_default">True</property> |
||||
<property name="use_stock">True</property> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">False</property> |
||||
<property name="fill">False</property> |
||||
<property name="position">1</property> |
||||
</packing> |
||||
</child> |
||||
<child> |
||||
<object class="GtkButton" id="session_properties_edit_button"> |
||||
<property name="label">gtk-edit</property> |
||||
<property name="visible">True</property> |
||||
<property name="sensitive">False</property> |
||||
<property name="can_focus">True</property> |
||||
<property name="receives_default">True</property> |
||||
<property name="use_stock">True</property> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">False</property> |
||||
<property name="fill">False</property> |
||||
<property name="position">2</property> |
||||
</packing> |
||||
</child> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">False</property> |
||||
<property name="fill">False</property> |
||||
<property name="position">1</property> |
||||
</packing> |
||||
</child> |
||||
</object> |
||||
<packing> |
||||
+ <property name="expand">True</property> |
||||
+ <property name="fill">True</property> |
||||
<property name="position">1</property> |
||||
</packing> |
||||
</child> |
||||
</object> |
||||
</child> |
||||
<child type="tab"> |
||||
<object class="GtkLabel" id="label4"> |
||||
<property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="label" translatable="yes">Startup Programs</property> |
||||
</object> |
||||
<packing> |
||||
<property name="tab_fill">False</property> |
||||
</packing> |
||||
</child> |
||||
<child> |
||||
<object class="GtkVBox" id="vbox3"> |
||||
<property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="border_width">12</property> |
||||
- <property name="orientation">vertical</property> |
||||
<property name="spacing">6</property> |
||||
<child> |
||||
<object class="GtkCheckButton" id="session_properties_remember_toggle"> |
||||
<property name="label" translatable="yes">_Automatically remember running applications when logging out</property> |
||||
<property name="visible">True</property> |
||||
<property name="can_focus">True</property> |
||||
<property name="receives_default">False</property> |
||||
<property name="use_underline">True</property> |
||||
+ <property name="xalign">0.5</property> |
||||
<property name="draw_indicator">True</property> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">False</property> |
||||
<property name="fill">False</property> |
||||
<property name="position">0</property> |
||||
</packing> |
||||
</child> |
||||
<child> |
||||
<object class="GtkHButtonBox" id="hbuttonbox1"> |
||||
<property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
<child> |
||||
<object class="GtkButton" id="session_properties_save_button"> |
||||
<property name="can_focus">True</property> |
||||
<property name="receives_default">True</property> |
||||
<child> |
||||
<object class="GtkHBox" id="hbox2"> |
||||
<property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="spacing">4</property> |
||||
<child> |
||||
<object class="GtkImage" id="image1"> |
||||
<property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="stock">gtk-save</property> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">False</property> |
||||
<property name="fill">False</property> |
||||
<property name="position">0</property> |
||||
</packing> |
||||
</child> |
||||
<child> |
||||
<object class="GtkLabel" id="label7"> |
||||
<property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="label" translatable="yes">_Remember Currently Running Applications</property> |
||||
<property name="use_underline">True</property> |
||||
</object> |
||||
<packing> |
||||
+ <property name="expand">True</property> |
||||
+ <property name="fill">True</property> |
||||
<property name="position">1</property> |
||||
</packing> |
||||
</child> |
||||
</object> |
||||
</child> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">False</property> |
||||
<property name="fill">False</property> |
||||
<property name="position">0</property> |
||||
</packing> |
||||
</child> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">False</property> |
||||
<property name="fill">False</property> |
||||
<property name="position">1</property> |
||||
</packing> |
||||
</child> |
||||
</object> |
||||
<packing> |
||||
<property name="position">1</property> |
||||
</packing> |
||||
</child> |
||||
<child type="tab"> |
||||
<object class="GtkLabel" id="label5"> |
||||
<property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="label" translatable="yes">Options</property> |
||||
</object> |
||||
<packing> |
||||
<property name="position">1</property> |
||||
<property name="tab_fill">False</property> |
||||
</packing> |
||||
</child> |
||||
</object> |
||||
<object class="GtkTable" id="main-table"> |
||||
<property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="border_width">6</property> |
||||
<property name="n_rows">3</property> |
||||
<property name="n_columns">2</property> |
||||
<property name="column_spacing">12</property> |
||||
<property name="row_spacing">6</property> |
||||
<child> |
||||
<object class="GtkHBox" id="hbox3"> |
||||
<property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="spacing">12</property> |
||||
<child> |
||||
<object class="GtkEntry" id="session_properties_command_entry"> |
||||
<property name="visible">True</property> |
||||
<property name="can_focus">True</property> |
||||
- <property name="invisible_char">●</property> |
||||
+ <property name="invisible_char">●</property> |
||||
</object> |
||||
<packing> |
||||
+ <property name="expand">True</property> |
||||
+ <property name="fill">True</property> |
||||
<property name="position">0</property> |
||||
</packing> |
||||
</child> |
||||
<child> |
||||
<object class="GtkButton" id="session_properties_browse_button"> |
||||
<property name="label" translatable="yes">Browse…</property> |
||||
<property name="visible">True</property> |
||||
<property name="can_focus">True</property> |
||||
<property name="receives_default">True</property> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">False</property> |
||||
<property name="fill">False</property> |
||||
<property name="position">1</property> |
||||
</packing> |
||||
</child> |
||||
</object> |
||||
<packing> |
||||
<property name="left_attach">1</property> |
||||
<property name="right_attach">2</property> |
||||
<property name="top_attach">1</property> |
||||
<property name="bottom_attach">2</property> |
||||
<property name="y_options">GTK_FILL</property> |
||||
</packing> |
||||
</child> |
||||
<child> |
||||
<object class="GtkEntry" id="session_properties_comment_entry"> |
||||
<property name="visible">True</property> |
||||
<property name="can_focus">True</property> |
||||
- <property name="invisible_char">●</property> |
||||
+ <property name="invisible_char">●</property> |
||||
</object> |
||||
<packing> |
||||
<property name="left_attach">1</property> |
||||
<property name="right_attach">2</property> |
||||
<property name="top_attach">2</property> |
||||
<property name="bottom_attach">3</property> |
||||
<property name="y_options">GTK_FILL</property> |
||||
</packing> |
||||
</child> |
||||
<child> |
||||
<object class="GtkEntry" id="session_properties_name_entry"> |
||||
<property name="visible">True</property> |
||||
<property name="can_focus">True</property> |
||||
- <property name="invisible_char">●</property> |
||||
+ <property name="invisible_char">●</property> |
||||
</object> |
||||
<packing> |
||||
<property name="left_attach">1</property> |
||||
<property name="right_attach">2</property> |
||||
<property name="y_options">GTK_FILL</property> |
||||
</packing> |
||||
</child> |
||||
<child> |
||||
<object class="GtkLabel" id="label3"> |
||||
<property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="xalign">0</property> |
||||
<property name="label" translatable="yes">Comm_ent:</property> |
||||
<property name="use_underline">True</property> |
||||
<property name="mnemonic_widget">label2</property> |
||||
</object> |
||||
<packing> |
||||
<property name="top_attach">2</property> |
||||
<property name="bottom_attach">3</property> |
||||
<property name="x_options">GTK_FILL</property> |
||||
<property name="y_options">GTK_FILL</property> |
||||
</packing> |
||||
</child> |
||||
<child> |
||||
<object class="GtkLabel" id="label2"> |
||||
<property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="xalign">0</property> |
||||
<property name="label" translatable="yes">Co_mmand:</property> |
||||
<property name="use_underline">True</property> |
||||
<property name="mnemonic_widget">session_properties_command_entry</property> |
||||
</object> |
||||
<packing> |
||||
<property name="top_attach">1</property> |
||||
<property name="bottom_attach">2</property> |
||||
<property name="x_options">GTK_FILL</property> |
||||
<property name="y_options">GTK_FILL</property> |
||||
</packing> |
||||
</child> |
||||
<child> |
||||
<object class="GtkLabel" id="label1"> |
||||
<property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="xalign">0</property> |
||||
<property name="label" translatable="yes">_Name:</property> |
||||
<property name="use_underline">True</property> |
||||
<property name="mnemonic_widget">session_properties_name_entry</property> |
||||
</object> |
||||
<packing> |
||||
<property name="x_options">GTK_FILL</property> |
||||
<property name="y_options">GTK_FILL</property> |
||||
</packing> |
||||
</child> |
||||
</object> |
||||
</interface> |
||||
-- |
||||
2.14.2 |
||||
|
@ -0,0 +1,81 @@
@@ -0,0 +1,81 @@
|
||||
From eb9b29eeb55c47d691b65b046e31ede815e3d22c Mon Sep 17 00:00:00 2001 |
||||
From: Ray Strode <rstrode@redhat.com> |
||||
Date: Fri, 20 Dec 2013 16:14:16 -0500 |
||||
Subject: [PATCH 07/19] manager: Don't clear saved session if autosaving is |
||||
disabled |
||||
|
||||
Now that we support on-demand saving again, we need to make sure |
||||
we don't wipe that away at log out. |
||||
--- |
||||
gnome-session/gsm-manager.c | 1 - |
||||
1 file changed, 1 deletion(-) |
||||
|
||||
diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c |
||||
index bdba38e8..e2fad3b1 100644 |
||||
--- a/gnome-session/gsm-manager.c |
||||
+++ b/gnome-session/gsm-manager.c |
||||
@@ -1828,61 +1828,60 @@ on_xsmp_client_register_confirmed (GsmXSMPClient *client, |
||||
app = find_app_for_startup_id (manager, id); |
||||
|
||||
if (app != NULL) { |
||||
gsm_app_set_registered (app, TRUE); |
||||
} |
||||
} |
||||
|
||||
static gboolean |
||||
auto_save_is_enabled (GsmManager *manager) |
||||
{ |
||||
return g_settings_get_boolean (manager->priv->settings, KEY_AUTOSAVE_ONE_SHOT) |
||||
|| g_settings_get_boolean (manager->priv->settings, KEY_AUTOSAVE); |
||||
} |
||||
|
||||
static void |
||||
maybe_save_session (GsmManager *manager) |
||||
{ |
||||
GError *error; |
||||
|
||||
if (gsm_system_is_login_session (manager->priv->system)) |
||||
return; |
||||
|
||||
/* We only allow session saving when session is running or when |
||||
* logging out */ |
||||
if (manager->priv->phase != GSM_MANAGER_PHASE_RUNNING && |
||||
manager->priv->phase != GSM_MANAGER_PHASE_END_SESSION) { |
||||
return; |
||||
} |
||||
|
||||
if (!auto_save_is_enabled (manager)) { |
||||
- gsm_session_save_clear (); |
||||
return; |
||||
} |
||||
|
||||
error = NULL; |
||||
gsm_session_save (manager->priv->clients, &error); |
||||
|
||||
if (error) { |
||||
g_warning ("Error saving session: %s", error->message); |
||||
g_error_free (error); |
||||
} |
||||
} |
||||
|
||||
static void |
||||
_handle_client_end_session_response (GsmManager *manager, |
||||
GsmClient *client, |
||||
gboolean is_ok, |
||||
gboolean do_last, |
||||
gboolean cancel, |
||||
const char *reason) |
||||
{ |
||||
/* just ignore if received outside of shutdown */ |
||||
if (manager->priv->phase < GSM_MANAGER_PHASE_QUERY_END_SESSION) { |
||||
return; |
||||
} |
||||
|
||||
g_debug ("GsmManager: Response from end session request: is-ok=%d do-last=%d cancel=%d reason=%s", is_ok, do_last, cancel, reason ? reason :""); |
||||
|
||||
if (cancel) { |
||||
cancel_end_session (manager); |
||||
return; |
||||
-- |
||||
2.14.2 |
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,272 @@
@@ -0,0 +1,272 @@
|
||||
From abf8b3509a0debaf124669d9626a6d9883a1a0d3 Mon Sep 17 00:00:00 2001 |
||||
From: Ray Strode <rstrode@redhat.com> |
||||
Date: Fri, 20 Dec 2013 11:22:07 -0500 |
||||
Subject: [PATCH 09/19] Revert "Allow saved-session to be a symlink" |
||||
|
||||
This reverts commit b733c2ee519b65c3c4eab0d0e93056412f995f3f. |
||||
--- |
||||
gnome-session/gsm-session-save.c | 32 ++++++++++++++++++++++++++++---- |
||||
gnome-session/gsm-util.c | 6 ++++++ |
||||
2 files changed, 34 insertions(+), 4 deletions(-) |
||||
|
||||
diff --git a/gnome-session/gsm-session-save.c b/gnome-session/gsm-session-save.c |
||||
index d6000e09..eebc5ff1 100644 |
||||
--- a/gnome-session/gsm-session-save.c |
||||
+++ b/gnome-session/gsm-session-save.c |
||||
@@ -9,61 +9,61 @@ |
||||
* |
||||
* This program is distributed in the hope that it will be useful, but |
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Lesser General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>. |
||||
*/ |
||||
|
||||
#include <config.h> |
||||
|
||||
#include <glib.h> |
||||
#include <glib/gstdio.h> |
||||
#include <gio/gio.h> |
||||
|
||||
#include "gsm-util.h" |
||||
#include "gsm-autostart-app.h" |
||||
#include "gsm-client.h" |
||||
|
||||
#include "gsm-session-save.h" |
||||
|
||||
#define GSM_MANAGER_SCHEMA "org.gnome.SessionManager" |
||||
#define KEY_AUTOSAVE_ONE_SHOT "auto-save-session-one-shot" |
||||
|
||||
|
||||
static gboolean gsm_session_clear_saved_session (const char *directory, |
||||
GHashTable *discard_hash); |
||||
|
||||
typedef struct { |
||||
- const char *dir; |
||||
+ char *dir; |
||||
GHashTable *discard_hash; |
||||
GError **error; |
||||
} SessionSaveData; |
||||
|
||||
static gboolean |
||||
save_one_client (char *id, |
||||
GObject *object, |
||||
SessionSaveData *data) |
||||
{ |
||||
GsmClient *client; |
||||
GKeyFile *keyfile; |
||||
const char *app_id; |
||||
char *path = NULL; |
||||
char *filename = NULL; |
||||
char *contents = NULL; |
||||
gsize length = 0; |
||||
char *discard_exec; |
||||
GError *local_error; |
||||
|
||||
client = GSM_CLIENT (object); |
||||
|
||||
local_error = NULL; |
||||
|
||||
keyfile = gsm_client_save (client, &local_error); |
||||
|
||||
if (keyfile == NULL || local_error) { |
||||
goto out; |
||||
} |
||||
|
||||
contents = g_key_file_to_data (keyfile, &length, &local_error); |
||||
@@ -112,89 +112,113 @@ save_one_client (char *id, |
||||
} |
||||
|
||||
g_debug ("GsmSessionSave: saved client %s to %s", id, filename); |
||||
|
||||
out: |
||||
if (keyfile != NULL) { |
||||
g_key_file_free (keyfile); |
||||
} |
||||
|
||||
g_free (contents); |
||||
g_free (filename); |
||||
g_free (path); |
||||
|
||||
/* in case of any error, stop saving session */ |
||||
if (local_error) { |
||||
g_propagate_error (data->error, local_error); |
||||
g_error_free (local_error); |
||||
|
||||
return TRUE; |
||||
} |
||||
|
||||
return FALSE; |
||||
} |
||||
|
||||
void |
||||
gsm_session_save (GsmStore *client_store, |
||||
GError **error) |
||||
{ |
||||
GSettings *settings; |
||||
const char *save_dir; |
||||
+ char *tmp_dir; |
||||
SessionSaveData data; |
||||
|
||||
g_debug ("GsmSessionSave: Saving session"); |
||||
|
||||
/* Clear one shot key autosave in the event its set (so that it's actually |
||||
* one shot only) |
||||
*/ |
||||
settings = g_settings_new (GSM_MANAGER_SCHEMA); |
||||
g_settings_set_boolean (settings, KEY_AUTOSAVE_ONE_SHOT, FALSE); |
||||
g_object_unref (settings); |
||||
|
||||
save_dir = gsm_util_get_saved_session_dir (); |
||||
if (save_dir == NULL) { |
||||
g_warning ("GsmSessionSave: cannot create saved session directory"); |
||||
return; |
||||
} |
||||
|
||||
- data.dir = save_dir; |
||||
+ tmp_dir = gsm_util_get_empty_tmp_session_dir (); |
||||
+ if (tmp_dir == NULL) { |
||||
+ g_warning ("GsmSessionSave: cannot create new saved session directory"); |
||||
+ return; |
||||
+ } |
||||
+ |
||||
+ /* save the session in a temp directory, and remember the discard |
||||
+ * commands */ |
||||
+ data.dir = tmp_dir; |
||||
data.discard_hash = g_hash_table_new_full (g_str_hash, g_str_equal, |
||||
g_free, NULL); |
||||
- /* remove old saved session */ |
||||
- gsm_session_clear_saved_session (save_dir, data.discard_hash); |
||||
data.error = error; |
||||
|
||||
gsm_store_foreach (client_store, |
||||
(GsmStoreFunc) save_one_client, |
||||
&data); |
||||
|
||||
+ if (!*error) { |
||||
+ /* remove the old saved session */ |
||||
+ gsm_session_clear_saved_session (save_dir, data.discard_hash); |
||||
+ |
||||
+ /* rename the temp session dir */ |
||||
+ if (g_file_test (save_dir, G_FILE_TEST_IS_DIR)) |
||||
+ g_rmdir (save_dir); |
||||
+ g_rename (tmp_dir, save_dir); |
||||
+ } else { |
||||
+ g_warning ("GsmSessionSave: error saving session: %s", (*error)->message); |
||||
+ /* FIXME: we should create a hash table filled with the discard |
||||
+ * commands that are in desktop files from save_dir. */ |
||||
+ gsm_session_clear_saved_session (tmp_dir, NULL); |
||||
+ g_rmdir (tmp_dir); |
||||
+ } |
||||
+ |
||||
g_hash_table_destroy (data.discard_hash); |
||||
+ g_free (tmp_dir); |
||||
} |
||||
|
||||
static gboolean |
||||
gsm_session_clear_one_client (const char *filename, |
||||
GHashTable *discard_hash) |
||||
{ |
||||
gboolean result = TRUE; |
||||
GKeyFile *key_file; |
||||
char *discard_exec = NULL; |
||||
char **envp; |
||||
|
||||
g_debug ("GsmSessionSave: removing '%s' from saved session", filename); |
||||
|
||||
envp = (char **) gsm_util_listenv (); |
||||
key_file = g_key_file_new (); |
||||
if (g_key_file_load_from_file (key_file, filename, |
||||
G_KEY_FILE_NONE, NULL)) { |
||||
char **argv; |
||||
int argc; |
||||
|
||||
discard_exec = g_key_file_get_string (key_file, |
||||
G_KEY_FILE_DESKTOP_GROUP, |
||||
GSM_AUTOSTART_APP_DISCARD_KEY, |
||||
NULL); |
||||
if (!discard_exec) |
||||
goto out; |
||||
|
||||
if (discard_hash && g_hash_table_lookup (discard_hash, discard_exec)) |
||||
goto out; |
||||
|
||||
diff --git a/gnome-session/gsm-util.c b/gnome-session/gsm-util.c |
||||
index 4772c6e6..30edb577 100644 |
||||
--- a/gnome-session/gsm-util.c |
||||
+++ b/gnome-session/gsm-util.c |
||||
@@ -71,63 +71,69 @@ gsm_util_find_desktop_file_for_app_name (const char *name, |
||||
g_debug ("GsmUtil: found in XDG dirs: '%s'", app_path); |
||||
} |
||||
|
||||
/* look for gnome vendor prefix */ |
||||
if (app_path == NULL) { |
||||
g_free (desktop_file); |
||||
desktop_file = g_strdup_printf ("gnome-%s.desktop", name); |
||||
|
||||
g_key_file_load_from_dirs (key_file, |
||||
desktop_file, |
||||
(const char **) app_dirs, |
||||
&app_path, |
||||
G_KEY_FILE_NONE, |
||||
NULL); |
||||
if (app_path != NULL) { |
||||
g_debug ("GsmUtil: found in XDG dirs: '%s'", app_path); |
||||
} |
||||
} |
||||
|
||||
g_free (desktop_file); |
||||
g_key_file_free (key_file); |
||||
|
||||
g_strfreev (app_dirs); |
||||
|
||||
return app_path; |
||||
} |
||||
|
||||
static gboolean |
||||
ensure_dir_exists (const char *dir) |
||||
{ |
||||
+ if (g_file_test (dir, G_FILE_TEST_IS_DIR)) |
||||
+ return TRUE; |
||||
+ |
||||
if (g_mkdir_with_parents (dir, 0755) == 0) |
||||
return TRUE; |
||||
|
||||
+ if (errno == EEXIST) |
||||
+ return g_file_test (dir, G_FILE_TEST_IS_DIR); |
||||
+ |
||||
g_warning ("GsmSessionSave: Failed to create directory %s: %s", dir, strerror (errno)); |
||||
|
||||
return FALSE; |
||||
} |
||||
|
||||
gchar * |
||||
gsm_util_get_empty_tmp_session_dir (void) |
||||
{ |
||||
char *tmp; |
||||
gboolean exists; |
||||
|
||||
tmp = g_build_filename (g_get_user_config_dir (), |
||||
"gnome-session", |
||||
"saved-session.new", |
||||
NULL); |
||||
|
||||
exists = ensure_dir_exists (tmp); |
||||
|
||||
if (G_UNLIKELY (!exists)) { |
||||
g_warning ("GsmSessionSave: could not create directory for saved session: %s", tmp); |
||||
g_free (tmp); |
||||
return NULL; |
||||
} else { |
||||
/* make sure it's empty */ |
||||
GDir *dir; |
||||
const char *filename; |
||||
|
||||
dir = g_dir_open (tmp, 0, NULL); |
||||
if (dir) { |
||||
while ((filename = g_dir_read_name (dir))) { |
||||
-- |
||||
2.14.2 |
||||
|
@ -0,0 +1,191 @@
@@ -0,0 +1,191 @@
|
||||
From 7c05176e0db2b4d00971a5baf940ad075a088c70 Mon Sep 17 00:00:00 2001 |
||||
From: Ray Strode <rstrode@redhat.com> |
||||
Date: Fri, 20 Dec 2013 11:22:53 -0500 |
||||
Subject: [PATCH 10/19] Allow saved-session directory to be a symlink |
||||
|
||||
This gives us the option of adding a rudimentary session |
||||
chooser later. |
||||
--- |
||||
gnome-session/gsm-session-save.c | 36 ++++++++++++++++++++++++++++++------ |
||||
gnome-session/gsm-util.c | 6 ------ |
||||
2 files changed, 30 insertions(+), 12 deletions(-) |
||||
|
||||
diff --git a/gnome-session/gsm-session-save.c b/gnome-session/gsm-session-save.c |
||||
index eebc5ff1..66914b57 100644 |
||||
--- a/gnome-session/gsm-session-save.c |
||||
+++ b/gnome-session/gsm-session-save.c |
||||
@@ -148,67 +148,91 @@ gsm_session_save (GsmStore *client_store, |
||||
* one shot only) |
||||
*/ |
||||
settings = g_settings_new (GSM_MANAGER_SCHEMA); |
||||
g_settings_set_boolean (settings, KEY_AUTOSAVE_ONE_SHOT, FALSE); |
||||
g_object_unref (settings); |
||||
|
||||
save_dir = gsm_util_get_saved_session_dir (); |
||||
if (save_dir == NULL) { |
||||
g_warning ("GsmSessionSave: cannot create saved session directory"); |
||||
return; |
||||
} |
||||
|
||||
tmp_dir = gsm_util_get_empty_tmp_session_dir (); |
||||
if (tmp_dir == NULL) { |
||||
g_warning ("GsmSessionSave: cannot create new saved session directory"); |
||||
return; |
||||
} |
||||
|
||||
/* save the session in a temp directory, and remember the discard |
||||
* commands */ |
||||
data.dir = tmp_dir; |
||||
data.discard_hash = g_hash_table_new_full (g_str_hash, g_str_equal, |
||||
g_free, NULL); |
||||
data.error = error; |
||||
|
||||
gsm_store_foreach (client_store, |
||||
(GsmStoreFunc) save_one_client, |
||||
&data); |
||||
|
||||
if (!*error) { |
||||
- /* remove the old saved session */ |
||||
- gsm_session_clear_saved_session (save_dir, data.discard_hash); |
||||
+ char *session_dir; |
||||
|
||||
- /* rename the temp session dir */ |
||||
- if (g_file_test (save_dir, G_FILE_TEST_IS_DIR)) |
||||
- g_rmdir (save_dir); |
||||
- g_rename (tmp_dir, save_dir); |
||||
+ if (g_file_test (save_dir, G_FILE_TEST_IS_SYMLINK)) |
||||
+ session_dir = g_file_read_link (save_dir, error); |
||||
+ else |
||||
+ session_dir = g_strdup (save_dir); |
||||
+ |
||||
+ if (session_dir != NULL) { |
||||
+ |
||||
+ char *absolute_session_dir; |
||||
+ |
||||
+ if (g_path_is_absolute (session_dir)) { |
||||
+ absolute_session_dir = g_strdup (session_dir); |
||||
+ } else { |
||||
+ char *parent_dir; |
||||
+ |
||||
+ parent_dir = g_path_get_dirname (save_dir); |
||||
+ absolute_session_dir = g_build_filename (parent_dir, session_dir, NULL); |
||||
+ g_free (parent_dir); |
||||
+ } |
||||
+ g_free (session_dir); |
||||
+ |
||||
+ /* remove the old saved session */ |
||||
+ gsm_session_clear_saved_session (absolute_session_dir, data.discard_hash); |
||||
+ |
||||
+ if (g_file_test (absolute_session_dir, G_FILE_TEST_IS_DIR)) |
||||
+ g_rmdir (absolute_session_dir); |
||||
+ g_rename (tmp_dir, absolute_session_dir); |
||||
+ |
||||
+ g_free (absolute_session_dir); |
||||
+ } |
||||
} else { |
||||
g_warning ("GsmSessionSave: error saving session: %s", (*error)->message); |
||||
/* FIXME: we should create a hash table filled with the discard |
||||
* commands that are in desktop files from save_dir. */ |
||||
gsm_session_clear_saved_session (tmp_dir, NULL); |
||||
g_rmdir (tmp_dir); |
||||
} |
||||
|
||||
g_hash_table_destroy (data.discard_hash); |
||||
g_free (tmp_dir); |
||||
} |
||||
|
||||
static gboolean |
||||
gsm_session_clear_one_client (const char *filename, |
||||
GHashTable *discard_hash) |
||||
{ |
||||
gboolean result = TRUE; |
||||
GKeyFile *key_file; |
||||
char *discard_exec = NULL; |
||||
char **envp; |
||||
|
||||
g_debug ("GsmSessionSave: removing '%s' from saved session", filename); |
||||
|
||||
envp = (char **) gsm_util_listenv (); |
||||
key_file = g_key_file_new (); |
||||
if (g_key_file_load_from_file (key_file, filename, |
||||
G_KEY_FILE_NONE, NULL)) { |
||||
char **argv; |
||||
int argc; |
||||
|
||||
diff --git a/gnome-session/gsm-util.c b/gnome-session/gsm-util.c |
||||
index 30edb577..4772c6e6 100644 |
||||
--- a/gnome-session/gsm-util.c |
||||
+++ b/gnome-session/gsm-util.c |
||||
@@ -71,69 +71,63 @@ gsm_util_find_desktop_file_for_app_name (const char *name, |
||||
g_debug ("GsmUtil: found in XDG dirs: '%s'", app_path); |
||||
} |
||||
|
||||
/* look for gnome vendor prefix */ |
||||
if (app_path == NULL) { |
||||
g_free (desktop_file); |
||||
desktop_file = g_strdup_printf ("gnome-%s.desktop", name); |
||||
|
||||
g_key_file_load_from_dirs (key_file, |
||||
desktop_file, |
||||
(const char **) app_dirs, |
||||
&app_path, |
||||
G_KEY_FILE_NONE, |
||||
NULL); |
||||
if (app_path != NULL) { |
||||
g_debug ("GsmUtil: found in XDG dirs: '%s'", app_path); |
||||
} |
||||
} |
||||
|
||||
g_free (desktop_file); |
||||
g_key_file_free (key_file); |
||||
|
||||
g_strfreev (app_dirs); |
||||
|
||||
return app_path; |
||||
} |
||||
|
||||
static gboolean |
||||
ensure_dir_exists (const char *dir) |
||||
{ |
||||
- if (g_file_test (dir, G_FILE_TEST_IS_DIR)) |
||||
- return TRUE; |
||||
- |
||||
if (g_mkdir_with_parents (dir, 0755) == 0) |
||||
return TRUE; |
||||
|
||||
- if (errno == EEXIST) |
||||
- return g_file_test (dir, G_FILE_TEST_IS_DIR); |
||||
- |
||||
g_warning ("GsmSessionSave: Failed to create directory %s: %s", dir, strerror (errno)); |
||||
|
||||
return FALSE; |
||||
} |
||||
|
||||
gchar * |
||||
gsm_util_get_empty_tmp_session_dir (void) |
||||
{ |
||||
char *tmp; |
||||
gboolean exists; |
||||
|
||||
tmp = g_build_filename (g_get_user_config_dir (), |
||||
"gnome-session", |
||||
"saved-session.new", |
||||
NULL); |
||||
|
||||
exists = ensure_dir_exists (tmp); |
||||
|
||||
if (G_UNLIKELY (!exists)) { |
||||
g_warning ("GsmSessionSave: could not create directory for saved session: %s", tmp); |
||||
g_free (tmp); |
||||
return NULL; |
||||
} else { |
||||
/* make sure it's empty */ |
||||
GDir *dir; |
||||
const char *filename; |
||||
|
||||
dir = g_dir_open (tmp, 0, NULL); |
||||
if (dir) { |
||||
while ((filename = g_dir_read_name (dir))) { |
||||
-- |
||||
2.14.2 |
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,429 @@
@@ -0,0 +1,429 @@
|
||||
From 7553acfe86151ed6bc6649f3e16e2a42c6435930 Mon Sep 17 00:00:00 2001 |
||||
From: Ray Strode <rstrode@redhat.com> |
||||
Date: Fri, 20 Dec 2013 11:32:52 -0500 |
||||
Subject: [PATCH 12/19] make save-session stall until it finishes |
||||
|
||||
--- |
||||
gnome-session/gsm-manager.c | 58 ++++++++++++++++++++++++++---- |
||||
gnome-session/gsm-manager.h | 2 +- |
||||
gnome-session/org.gnome.SessionManager.xml | 1 + |
||||
3 files changed, 53 insertions(+), 8 deletions(-) |
||||
|
||||
diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c |
||||
index 825a6846..6630aab8 100644 |
||||
--- a/gnome-session/gsm-manager.c |
||||
+++ b/gnome-session/gsm-manager.c |
||||
@@ -113,60 +113,61 @@ typedef enum |
||||
GSM_MANAGER_LOGOUT_REBOOT_INTERACT, |
||||
GSM_MANAGER_LOGOUT_SHUTDOWN, |
||||
GSM_MANAGER_LOGOUT_SHUTDOWN_INTERACT, |
||||
} GsmManagerLogoutType; |
||||
|
||||
struct GsmManagerPrivate |
||||
{ |
||||
gboolean failsafe; |
||||
GsmStore *clients; |
||||
GsmStore *inhibitors; |
||||
GsmInhibitorFlag inhibited_actions; |
||||
GsmStore *apps; |
||||
GsmPresence *presence; |
||||
GsmXsmpServer *xsmp_server; |
||||
|
||||
char *session_name; |
||||
gboolean is_fallback_session : 1; |
||||
|
||||
/* Current status */ |
||||
GsmManagerPhase phase; |
||||
guint phase_timeout_id; |
||||
GSList *required_apps; |
||||
GSList *pending_apps; |
||||
GsmManagerLogoutMode logout_mode; |
||||
GSList *query_clients; |
||||
guint query_timeout_id; |
||||
/* This is used for GSM_MANAGER_PHASE_END_SESSION only at the moment, |
||||
* since it uses a sublist of all running client that replied in a |
||||
* specific way */ |
||||
GSList *next_query_clients; |
||||
+ GSList *pending_save_invocations; |
||||
/* This is the action that will be done just before we exit */ |
||||
GsmManagerLogoutType logout_type; |
||||
|
||||
/* List of clients which were disconnected due to disabled condition |
||||
* and shouldn't be automatically restarted */ |
||||
GSList *condition_clients; |
||||
|
||||
GSList *pending_end_session_tasks; |
||||
GCancellable *end_session_cancellable; |
||||
|
||||
GSettings *settings; |
||||
GSettings *session_settings; |
||||
GSettings *screensaver_settings; |
||||
GSettings *lockdown_settings; |
||||
|
||||
GsmSystem *system; |
||||
GDBusConnection *connection; |
||||
GsmExportedManager *skeleton; |
||||
gboolean dbus_disconnected : 1; |
||||
|
||||
GsmShell *shell; |
||||
guint shell_end_session_dialog_canceled_id; |
||||
guint shell_end_session_dialog_open_failed_id; |
||||
guint shell_end_session_dialog_confirmed_logout_id; |
||||
guint shell_end_session_dialog_confirmed_shutdown_id; |
||||
guint shell_end_session_dialog_confirmed_reboot_id; |
||||
}; |
||||
|
||||
enum { |
||||
PROP_0, |
||||
@@ -1202,91 +1203,125 @@ query_end_session_complete (GsmManager *manager) |
||||
|
||||
static gboolean |
||||
_client_request_save (GsmClient *client, |
||||
ClientEndSessionData *data) |
||||
{ |
||||
gboolean ret; |
||||
GError *error; |
||||
|
||||
error = NULL; |
||||
ret = gsm_client_request_save (client, data->flags, &error); |
||||
if (ret) { |
||||
g_debug ("GsmManager: adding client to query clients: %s", gsm_client_peek_id (client)); |
||||
data->manager->priv->query_clients = g_slist_prepend (data->manager->priv->query_clients, |
||||
client); |
||||
} else if (error) { |
||||
g_debug ("GsmManager: unable to query client: %s", error->message); |
||||
g_error_free (error); |
||||
} |
||||
|
||||
return FALSE; |
||||
} |
||||
|
||||
static gboolean |
||||
_client_request_save_helper (const char *id, |
||||
GsmClient *client, |
||||
ClientEndSessionData *data) |
||||
{ |
||||
return _client_request_save (client, data); |
||||
} |
||||
|
||||
+static void |
||||
+fail_pending_save_invocations (GsmManager *manager, |
||||
+ GError *error) |
||||
+{ |
||||
+ GSList *l; |
||||
+ |
||||
+ for (l = manager->priv->pending_save_invocations; l != NULL; l = l->next) { |
||||
+ DBusGMethodInvocation *context = l->data; |
||||
+ |
||||
+ dbus_g_method_return_error (context, error); |
||||
+ } |
||||
+ |
||||
+ g_slist_free (manager->priv->pending_save_invocations); |
||||
+ manager->priv->pending_save_invocations = NULL; |
||||
+} |
||||
+ |
||||
+static void |
||||
+finish_pending_save_invocations (GsmManager *manager) |
||||
+{ |
||||
+ GSList *l; |
||||
+ |
||||
+ for (l = manager->priv->pending_save_invocations; l != NULL; l = l->next) { |
||||
+ DBusGMethodInvocation *context = l->data; |
||||
+ |
||||
+ dbus_g_method_return (context); |
||||
+ } |
||||
+ |
||||
+ g_slist_free (manager->priv->pending_save_invocations); |
||||
+ manager->priv->pending_save_invocations = NULL; |
||||
+} |
||||
+ |
||||
static void |
||||
query_save_session_complete (GsmManager *manager) |
||||
{ |
||||
GError *error = NULL; |
||||
|
||||
if (g_slist_length (manager->priv->next_query_clients) > 0) { |
||||
ClientEndSessionData data; |
||||
|
||||
data.manager = manager; |
||||
data.flags = GSM_CLIENT_END_SESSION_FLAG_LAST; |
||||
|
||||
g_slist_foreach (manager->priv->next_query_clients, |
||||
(GFunc)_client_request_save, |
||||
&data); |
||||
|
||||
g_slist_free (manager->priv->next_query_clients); |
||||
manager->priv->next_query_clients = NULL; |
||||
|
||||
return; |
||||
} |
||||
|
||||
if (manager->priv->query_timeout_id > 0) { |
||||
g_source_remove (manager->priv->query_timeout_id); |
||||
manager->priv->query_timeout_id = 0; |
||||
} |
||||
|
||||
gsm_session_save (manager->priv->clients, &error); |
||||
|
||||
if (error) { |
||||
g_warning ("Error saving session: %s", error->message); |
||||
+ fail_pending_save_invocations (manager, error); |
||||
g_error_free (error); |
||||
+ } else { |
||||
+ finish_pending_save_invocations (manager); |
||||
} |
||||
} |
||||
|
||||
static guint32 |
||||
generate_cookie (void) |
||||
{ |
||||
guint32 cookie; |
||||
|
||||
cookie = (guint32)g_random_int_range (1, G_MAXINT32); |
||||
|
||||
return cookie; |
||||
} |
||||
|
||||
static guint32 |
||||
_generate_unique_cookie (GsmManager *manager) |
||||
{ |
||||
guint32 cookie; |
||||
|
||||
do { |
||||
cookie = generate_cookie (); |
||||
} while (gsm_store_find (manager->priv->inhibitors, (GsmStoreFunc)_find_by_cookie, &cookie) != NULL); |
||||
|
||||
return cookie; |
||||
} |
||||
|
||||
static gboolean |
||||
_on_query_end_session_timeout (GsmManager *manager) |
||||
{ |
||||
GSList *l; |
||||
|
||||
@@ -2737,92 +2772,101 @@ gsm_manager_initialization_error (GsmExportedManager *skeleton, |
||||
GsmManager *manager) |
||||
{ |
||||
if (manager->priv->phase != GSM_MANAGER_PHASE_INITIALIZATION) { |
||||
g_dbus_method_invocation_return_error (invocation, |
||||
GSM_MANAGER_ERROR, |
||||
GSM_MANAGER_ERROR_NOT_IN_INITIALIZATION, |
||||
"InitializationError interface is only available during the Initialization phase"); |
||||
return TRUE; |
||||
} |
||||
|
||||
gsm_util_init_error (fatal, "%s", message); |
||||
gsm_exported_manager_complete_initialization_error (skeleton, invocation); |
||||
|
||||
return TRUE; |
||||
} |
||||
|
||||
static void |
||||
user_logout (GsmManager *manager, |
||||
GsmManagerLogoutMode mode) |
||||
{ |
||||
if (manager->priv->phase >= GSM_MANAGER_PHASE_QUERY_END_SESSION) { |
||||
manager->priv->logout_mode = mode; |
||||
end_session_or_show_shell_dialog (manager); |
||||
return; |
||||
} |
||||
|
||||
request_logout (manager, mode); |
||||
} |
||||
|
||||
gboolean |
||||
-gsm_manager_save_session (GsmManager *manager, |
||||
- GError **error) |
||||
+gsm_manager_save_session (GsmManager *manager, |
||||
+ DBusGMethodInvocation *context) |
||||
{ |
||||
ClientEndSessionData data; |
||||
+ GError *error; |
||||
|
||||
g_debug ("GsmManager: SaveSession called"); |
||||
|
||||
g_return_val_if_fail (GSM_IS_MANAGER (manager), FALSE); |
||||
|
||||
if (manager->priv->phase != GSM_MANAGER_PHASE_RUNNING) { |
||||
- g_set_error (error, |
||||
- GSM_MANAGER_ERROR, |
||||
- GSM_MANAGER_ERROR_NOT_IN_RUNNING, |
||||
- "SaveSession interface is only available during the Running phase"); |
||||
+ error = g_error_new (GSM_MANAGER_ERROR, |
||||
+ GSM_MANAGER_ERROR_NOT_IN_RUNNING, |
||||
+ "SaveSession interface is only available during the Running phase"); |
||||
+ dbus_g_method_return_error (context, error); |
||||
+ g_error_free (error); |
||||
return FALSE; |
||||
} |
||||
|
||||
data.manager = manager; |
||||
data.flags = 0; |
||||
gsm_store_foreach (manager->priv->clients, |
||||
(GsmStoreFunc)_client_request_save_helper, |
||||
&data); |
||||
|
||||
if (manager->priv->query_clients) { |
||||
manager->priv->query_timeout_id = g_timeout_add_seconds (GSM_MANAGER_SAVE_SESSION_TIMEOUT, |
||||
(GSourceFunc)_on_query_save_session_timeout, |
||||
manager); |
||||
+ |
||||
+ manager->priv->pending_save_invocations = g_slist_prepend (manager->priv->pending_save_invocations, |
||||
+ context); |
||||
+ |
||||
return TRUE; |
||||
} else { |
||||
g_debug ("GsmManager: Nothing to save"); |
||||
- return FALSE; |
||||
+ dbus_g_method_return (context); |
||||
+ return TRUE; |
||||
} |
||||
+ |
||||
+ return TRUE; |
||||
} |
||||
|
||||
gboolean |
||||
gsm_manager_logout (GsmManager *manager, |
||||
guint logout_mode, |
||||
GError **error) |
||||
{ |
||||
if (manager->priv->phase < GSM_MANAGER_PHASE_RUNNING) { |
||||
g_set_error (error, |
||||
GSM_MANAGER_ERROR, |
||||
GSM_MANAGER_ERROR_NOT_IN_RUNNING, |
||||
"Logout interface is only available after the Running phase starts"); |
||||
return FALSE; |
||||
} |
||||
|
||||
if (_log_out_is_locked_down (manager)) { |
||||
g_set_error (error, |
||||
GSM_MANAGER_ERROR, |
||||
GSM_MANAGER_ERROR_LOCKED_DOWN, |
||||
"Logout has been locked down"); |
||||
return FALSE; |
||||
} |
||||
|
||||
switch (logout_mode) { |
||||
case GSM_MANAGER_LOGOUT_MODE_NORMAL: |
||||
case GSM_MANAGER_LOGOUT_MODE_NO_CONFIRMATION: |
||||
case GSM_MANAGER_LOGOUT_MODE_FORCE: |
||||
user_logout (manager, logout_mode); |
||||
break; |
||||
|
||||
diff --git a/gnome-session/gsm-manager.h b/gnome-session/gsm-manager.h |
||||
index 4d14aa34..a8de58de 100644 |
||||
--- a/gnome-session/gsm-manager.h |
||||
+++ b/gnome-session/gsm-manager.h |
||||
@@ -97,42 +97,42 @@ GType gsm_manager_get_type (void); |
||||
|
||||
GsmManager * gsm_manager_new (GsmStore *client_store, |
||||
gboolean failsafe); |
||||
GsmManager * gsm_manager_get (void); |
||||
|
||||
gboolean gsm_manager_get_failsafe (GsmManager *manager); |
||||
|
||||
gboolean gsm_manager_add_autostart_app (GsmManager *manager, |
||||
const char *path, |
||||
const char *provides); |
||||
gboolean gsm_manager_add_required_app (GsmManager *manager, |
||||
const char *path, |
||||
const char *provides); |
||||
gboolean gsm_manager_add_autostart_apps_from_dir (GsmManager *manager, |
||||
const char *path); |
||||
gboolean gsm_manager_add_legacy_session_apps (GsmManager *manager, |
||||
const char *path); |
||||
|
||||
void gsm_manager_start (GsmManager *manager); |
||||
|
||||
const char * _gsm_manager_get_default_session (GsmManager *manager); |
||||
|
||||
void _gsm_manager_set_active_session (GsmManager *manager, |
||||
const char *session_name, |
||||
gboolean is_fallback); |
||||
|
||||
void _gsm_manager_set_renderer (GsmManager *manager, |
||||
const char *renderer); |
||||
|
||||
gboolean gsm_manager_save_session (GsmManager *manager, |
||||
- GError **error); |
||||
+ DBusGMethodInvocation *context); |
||||
|
||||
gboolean gsm_manager_logout (GsmManager *manager, |
||||
guint logout_mode, |
||||
GError **error); |
||||
|
||||
gboolean gsm_manager_set_phase (GsmManager *manager, |
||||
GsmManagerPhase phase); |
||||
|
||||
G_END_DECLS |
||||
|
||||
#endif /* __GSM_MANAGER_H */ |
||||
diff --git a/gnome-session/org.gnome.SessionManager.xml b/gnome-session/org.gnome.SessionManager.xml |
||||
index 29eb0990..ac73adc9 100644 |
||||
--- a/gnome-session/org.gnome.SessionManager.xml |
||||
+++ b/gnome-session/org.gnome.SessionManager.xml |
||||
@@ -256,60 +256,61 @@ |
||||
<arg name="handled" direction="out" type="b"> |
||||
<doc:doc> |
||||
<doc:summary>True if condition is handled, false otherwise</doc:summary> |
||||
</doc:doc> |
||||
</arg> |
||||
<doc:doc> |
||||
<doc:description> |
||||
<doc:para>Allows the caller to determine whether the session manager is |
||||
handling changes to the specified autostart condition.</doc:para> |
||||
</doc:description> |
||||
</doc:doc> |
||||
</method> |
||||
|
||||
<method name="Shutdown"> |
||||
<doc:doc> |
||||
<doc:description> |
||||
<doc:para>Request a shutdown dialog.</doc:para> |
||||
</doc:description> |
||||
</doc:doc> |
||||
</method> |
||||
|
||||
<method name="Reboot"> |
||||
<doc:doc> |
||||
<doc:description> |
||||
<doc:para>Request a reboot dialog.</doc:para> |
||||
</doc:description> |
||||
</doc:doc> |
||||
</method> |
||||
|
||||
<method name="SaveSession"> |
||||
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> |
||||
<doc:doc> |
||||
<doc:description> |
||||
<doc:para>Request to save session</doc:para> |
||||
</doc:description> |
||||
</doc:doc> |
||||
</method> |
||||
|
||||
<method name="CanShutdown"> |
||||
<arg name="is_available" direction="out" type="b"> |
||||
<doc:doc> |
||||
<doc:summary>True if shutdown is available to the user, false otherwise</doc:summary> |
||||
</doc:doc> |
||||
</arg> |
||||
<doc:doc> |
||||
<doc:description> |
||||
<doc:para>Allows the caller to determine whether or not it's okay to show |
||||
a shutdown option in the UI</doc:para> |
||||
</doc:description> |
||||
</doc:doc> |
||||
</method> |
||||
|
||||
<method name="Logout"> |
||||
<arg name="mode" type="u" direction="in"> |
||||
<doc:doc> |
||||
<doc:summary>The type of logout that is being requested</doc:summary> |
||||
</doc:doc> |
||||
</arg> |
||||
<doc:doc> |
||||
<doc:description> |
||||
<doc:para>Request a logout dialog</doc:para> |
||||
-- |
||||
2.14.2 |
||||
|
@ -0,0 +1,662 @@
@@ -0,0 +1,662 @@
|
||||
From b92add119aa5b9813556db26477170dd39eca5b6 Mon Sep 17 00:00:00 2001 |
||||
From: Ray Strode <rstrode@redhat.com> |
||||
Date: Fri, 20 Dec 2013 15:32:04 -0500 |
||||
Subject: [PATCH 13/19] manager: save session type in session dir |
||||
|
||||
If a user saved their session when in classic mode, make sure we |
||||
record that information so subsequent calls to gnome-session will |
||||
restore classic mode. |
||||
--- |
||||
gnome-session/gsm-manager.c | 21 ++++++++++++++++++-- |
||||
gnome-session/gsm-manager.h | 1 + |
||||
gnome-session/gsm-session-save.c | 41 +++++++++++++++++++++++++++++++++++++--- |
||||
gnome-session/gsm-session-save.h | 5 +++-- |
||||
gnome-session/main.c | 11 ++++++++++- |
||||
5 files changed, 71 insertions(+), 8 deletions(-) |
||||
|
||||
diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c |
||||
index 6630aab8..135392fd 100644 |
||||
--- a/gnome-session/gsm-manager.c |
||||
+++ b/gnome-session/gsm-manager.c |
||||
@@ -1260,61 +1260,61 @@ finish_pending_save_invocations (GsmManager *manager) |
||||
g_slist_free (manager->priv->pending_save_invocations); |
||||
manager->priv->pending_save_invocations = NULL; |
||||
} |
||||
|
||||
static void |
||||
query_save_session_complete (GsmManager *manager) |
||||
{ |
||||
GError *error = NULL; |
||||
|
||||
if (g_slist_length (manager->priv->next_query_clients) > 0) { |
||||
ClientEndSessionData data; |
||||
|
||||
data.manager = manager; |
||||
data.flags = GSM_CLIENT_END_SESSION_FLAG_LAST; |
||||
|
||||
g_slist_foreach (manager->priv->next_query_clients, |
||||
(GFunc)_client_request_save, |
||||
&data); |
||||
|
||||
g_slist_free (manager->priv->next_query_clients); |
||||
manager->priv->next_query_clients = NULL; |
||||
|
||||
return; |
||||
} |
||||
|
||||
if (manager->priv->query_timeout_id > 0) { |
||||
g_source_remove (manager->priv->query_timeout_id); |
||||
manager->priv->query_timeout_id = 0; |
||||
} |
||||
|
||||
- gsm_session_save (manager->priv->clients, &error); |
||||
+ gsm_session_save (manager->priv->clients, manager->priv->session_name, &error); |
||||
|
||||
if (error) { |
||||
g_warning ("Error saving session: %s", error->message); |
||||
fail_pending_save_invocations (manager, error); |
||||
g_error_free (error); |
||||
} else { |
||||
finish_pending_save_invocations (manager); |
||||
} |
||||
} |
||||
|
||||
static guint32 |
||||
generate_cookie (void) |
||||
{ |
||||
guint32 cookie; |
||||
|
||||
cookie = (guint32)g_random_int_range (1, G_MAXINT32); |
||||
|
||||
return cookie; |
||||
} |
||||
|
||||
static guint32 |
||||
_generate_unique_cookie (GsmManager *manager) |
||||
{ |
||||
guint32 cookie; |
||||
|
||||
do { |
||||
cookie = generate_cookie (); |
||||
} while (gsm_store_find (manager->priv->inhibitors, (GsmStoreFunc)_find_by_cookie, &cookie) != NULL); |
||||
|
||||
return cookie; |
||||
@@ -1528,60 +1528,77 @@ debug_app_summary (GsmManager *manager) |
||||
|
||||
g_debug ("GsmManager: App startup summary"); |
||||
for (phase = GSM_MANAGER_PHASE_EARLY_INITIALIZATION; phase < GSM_MANAGER_PHASE_RUNNING; phase++) { |
||||
g_debug ("GsmManager: Phase %s", phase_num_to_name (phase)); |
||||
gsm_store_foreach (manager->priv->apps, |
||||
(GsmStoreFunc)_debug_app_for_phase, |
||||
GUINT_TO_POINTER (phase)); |
||||
} |
||||
} |
||||
|
||||
void |
||||
gsm_manager_start (GsmManager *manager) |
||||
{ |
||||
g_debug ("GsmManager: GSM starting to manage"); |
||||
|
||||
g_return_if_fail (GSM_IS_MANAGER (manager)); |
||||
|
||||
gsm_xsmp_server_start (manager->priv->xsmp_server); |
||||
gsm_manager_set_phase (manager, GSM_MANAGER_PHASE_EARLY_INITIALIZATION); |
||||
debug_app_summary (manager); |
||||
start_phase (manager); |
||||
} |
||||
|
||||
const char * |
||||
_gsm_manager_get_default_session (GsmManager *manager) |
||||
{ |
||||
return g_settings_get_string (manager->priv->session_settings, |
||||
KEY_SESSION_NAME); |
||||
} |
||||
|
||||
+char * |
||||
+_gsm_manager_get_saved_session (GsmManager *manager) |
||||
+{ |
||||
+ char *file; |
||||
+ char *type; |
||||
+ gboolean loaded; |
||||
+ |
||||
+ file = g_build_filename (gsm_util_get_saved_session_dir (), "type", NULL); |
||||
+ loaded = g_file_get_contents (file, &type, NULL, NULL); |
||||
+ g_free (file); |
||||
+ |
||||
+ if (!loaded) |
||||
+ return NULL; |
||||
+ |
||||
+ return type; |
||||
+} |
||||
+ |
||||
void |
||||
_gsm_manager_set_active_session (GsmManager *manager, |
||||
const char *session_name, |
||||
gboolean is_fallback) |
||||
{ |
||||
g_free (manager->priv->session_name); |
||||
manager->priv->session_name = g_strdup (session_name); |
||||
manager->priv->is_fallback_session = is_fallback; |
||||
|
||||
gsm_exported_manager_set_session_name (manager->priv->skeleton, session_name); |
||||
} |
||||
|
||||
void |
||||
_gsm_manager_set_renderer (GsmManager *manager, |
||||
const char *renderer) |
||||
{ |
||||
gsm_exported_manager_set_renderer (manager->priv->skeleton, renderer); |
||||
} |
||||
|
||||
static gboolean |
||||
_app_has_app_id (const char *id, |
||||
GsmApp *app, |
||||
const char *app_id_a) |
||||
{ |
||||
const char *app_id_b; |
||||
|
||||
app_id_b = gsm_app_peek_app_id (app); |
||||
return (app_id_b != NULL && strcmp (app_id_a, app_id_b) == 0); |
||||
} |
||||
|
||||
@@ -1946,61 +1963,61 @@ on_xsmp_client_register_confirmed (GsmXSMPClient *client, |
||||
} |
||||
} |
||||
|
||||
static gboolean |
||||
auto_save_is_enabled (GsmManager *manager) |
||||
{ |
||||
return g_settings_get_boolean (manager->priv->settings, KEY_AUTOSAVE_ONE_SHOT) |
||||
|| g_settings_get_boolean (manager->priv->settings, KEY_AUTOSAVE); |
||||
} |
||||
|
||||
static void |
||||
maybe_save_session (GsmManager *manager) |
||||
{ |
||||
GError *error; |
||||
|
||||
if (gsm_system_is_login_session (manager->priv->system)) |
||||
return; |
||||
|
||||
/* We only allow session saving when session is running or when |
||||
* logging out */ |
||||
if (manager->priv->phase != GSM_MANAGER_PHASE_RUNNING && |
||||
manager->priv->phase != GSM_MANAGER_PHASE_END_SESSION) { |
||||
return; |
||||
} |
||||
|
||||
if (!auto_save_is_enabled (manager)) { |
||||
return; |
||||
} |
||||
|
||||
error = NULL; |
||||
- gsm_session_save (manager->priv->clients, &error); |
||||
+ gsm_session_save (manager->priv->clients, manager->priv->session_name, &error); |
||||
|
||||
if (error) { |
||||
g_warning ("Error saving session: %s", error->message); |
||||
g_error_free (error); |
||||
} |
||||
} |
||||
|
||||
static void |
||||
_handle_client_end_session_response (GsmManager *manager, |
||||
GsmClient *client, |
||||
gboolean is_ok, |
||||
gboolean do_last, |
||||
gboolean cancel, |
||||
const char *reason) |
||||
{ |
||||
/* just ignore if we are not yet running */ |
||||
if (manager->priv->phase < GSM_MANAGER_PHASE_RUNNING) { |
||||
return; |
||||
} |
||||
|
||||
g_debug ("GsmManager: Response from end session request: is-ok=%d do-last=%d cancel=%d reason=%s", is_ok, do_last, cancel, reason ? reason :""); |
||||
|
||||
if (manager->priv->phase == GSM_MANAGER_PHASE_RUNNING) { |
||||
/* Ignore responses when no requests were sent */ |
||||
if (manager->priv->query_clients == NULL) { |
||||
return; |
||||
} |
||||
|
||||
manager->priv->query_clients = g_slist_remove (manager->priv->query_clients, client); |
||||
|
||||
diff --git a/gnome-session/gsm-manager.h b/gnome-session/gsm-manager.h |
||||
index a8de58de..fcf36019 100644 |
||||
--- a/gnome-session/gsm-manager.h |
||||
+++ b/gnome-session/gsm-manager.h |
||||
@@ -88,51 +88,52 @@ typedef enum |
||||
GSM_MANAGER_ERROR_INVALID_OPTION, |
||||
GSM_MANAGER_ERROR_LOCKED_DOWN, |
||||
GSM_MANAGER_NUM_ERRORS |
||||
} GsmManagerError; |
||||
|
||||
#define GSM_MANAGER_ERROR gsm_manager_error_quark () |
||||
GQuark gsm_manager_error_quark (void); |
||||
|
||||
GType gsm_manager_get_type (void); |
||||
|
||||
GsmManager * gsm_manager_new (GsmStore *client_store, |
||||
gboolean failsafe); |
||||
GsmManager * gsm_manager_get (void); |
||||
|
||||
gboolean gsm_manager_get_failsafe (GsmManager *manager); |
||||
|
||||
gboolean gsm_manager_add_autostart_app (GsmManager *manager, |
||||
const char *path, |
||||
const char *provides); |
||||
gboolean gsm_manager_add_required_app (GsmManager *manager, |
||||
const char *path, |
||||
const char *provides); |
||||
gboolean gsm_manager_add_autostart_apps_from_dir (GsmManager *manager, |
||||
const char *path); |
||||
gboolean gsm_manager_add_legacy_session_apps (GsmManager *manager, |
||||
const char *path); |
||||
|
||||
void gsm_manager_start (GsmManager *manager); |
||||
|
||||
const char * _gsm_manager_get_default_session (GsmManager *manager); |
||||
+char * _gsm_manager_get_saved_session (GsmManager *manager); |
||||
|
||||
void _gsm_manager_set_active_session (GsmManager *manager, |
||||
const char *session_name, |
||||
gboolean is_fallback); |
||||
|
||||
void _gsm_manager_set_renderer (GsmManager *manager, |
||||
const char *renderer); |
||||
|
||||
gboolean gsm_manager_save_session (GsmManager *manager, |
||||
DBusGMethodInvocation *context); |
||||
|
||||
gboolean gsm_manager_logout (GsmManager *manager, |
||||
guint logout_mode, |
||||
GError **error); |
||||
|
||||
gboolean gsm_manager_set_phase (GsmManager *manager, |
||||
GsmManagerPhase phase); |
||||
|
||||
G_END_DECLS |
||||
|
||||
#endif /* __GSM_MANAGER_H */ |
||||
diff --git a/gnome-session/gsm-session-save.c b/gnome-session/gsm-session-save.c |
||||
index 66914b57..78b64197 100644 |
||||
--- a/gnome-session/gsm-session-save.c |
||||
+++ b/gnome-session/gsm-session-save.c |
||||
@@ -1,73 +1,105 @@ |
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- |
||||
* gsm-session-save.c |
||||
* Copyright (C) 2008 Lucas Rocha. |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of the |
||||
* License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, but |
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Lesser General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>. |
||||
*/ |
||||
|
||||
#include <config.h> |
||||
|
||||
+#include <string.h> |
||||
+ |
||||
#include <glib.h> |
||||
#include <glib/gstdio.h> |
||||
#include <gio/gio.h> |
||||
|
||||
#include "gsm-util.h" |
||||
#include "gsm-autostart-app.h" |
||||
#include "gsm-client.h" |
||||
|
||||
#include "gsm-session-save.h" |
||||
|
||||
#define GSM_MANAGER_SCHEMA "org.gnome.SessionManager" |
||||
#define KEY_AUTOSAVE_ONE_SHOT "auto-save-session-one-shot" |
||||
|
||||
|
||||
static gboolean gsm_session_clear_saved_session (const char *directory, |
||||
GHashTable *discard_hash); |
||||
|
||||
typedef struct { |
||||
char *dir; |
||||
GHashTable *discard_hash; |
||||
GError **error; |
||||
} SessionSaveData; |
||||
|
||||
+static void |
||||
+clear_session_type (const char *save_dir) |
||||
+{ |
||||
+ char *file; |
||||
+ |
||||
+ file = g_build_filename (save_dir, "type", NULL); |
||||
+ |
||||
+ g_unlink (file); |
||||
+ |
||||
+ g_free (file); |
||||
+} |
||||
+ |
||||
+static void |
||||
+set_session_type (const char *save_dir, |
||||
+ const char *type) |
||||
+{ |
||||
+ char *file; |
||||
+ GError *error; |
||||
+ |
||||
+ file = g_build_filename (save_dir, "type", NULL); |
||||
+ |
||||
+ error = NULL; |
||||
+ g_file_set_contents (file, type, strlen (type), &error); |
||||
+ if (error != NULL) |
||||
+ g_warning ("couldn't save session type to %s: %s", |
||||
+ type, error->message); |
||||
+ |
||||
+ g_free (file); |
||||
+} |
||||
+ |
||||
static gboolean |
||||
save_one_client (char *id, |
||||
GObject *object, |
||||
SessionSaveData *data) |
||||
{ |
||||
GsmClient *client; |
||||
GKeyFile *keyfile; |
||||
const char *app_id; |
||||
char *path = NULL; |
||||
char *filename = NULL; |
||||
char *contents = NULL; |
||||
gsize length = 0; |
||||
char *discard_exec; |
||||
GError *local_error; |
||||
|
||||
client = GSM_CLIENT (object); |
||||
|
||||
local_error = NULL; |
||||
|
||||
keyfile = gsm_client_save (client, &local_error); |
||||
|
||||
if (keyfile == NULL || local_error) { |
||||
goto out; |
||||
} |
||||
|
||||
contents = g_key_file_to_data (keyfile, &length, &local_error); |
||||
|
||||
if (local_error) { |
||||
goto out; |
||||
} |
||||
@@ -107,112 +139,114 @@ save_one_client (char *id, |
||||
GSM_AUTOSTART_APP_DISCARD_KEY, |
||||
NULL); |
||||
if (discard_exec) { |
||||
g_hash_table_insert (data->discard_hash, |
||||
discard_exec, discard_exec); |
||||
} |
||||
|
||||
g_debug ("GsmSessionSave: saved client %s to %s", id, filename); |
||||
|
||||
out: |
||||
if (keyfile != NULL) { |
||||
g_key_file_free (keyfile); |
||||
} |
||||
|
||||
g_free (contents); |
||||
g_free (filename); |
||||
g_free (path); |
||||
|
||||
/* in case of any error, stop saving session */ |
||||
if (local_error) { |
||||
g_propagate_error (data->error, local_error); |
||||
g_error_free (local_error); |
||||
|
||||
return TRUE; |
||||
} |
||||
|
||||
return FALSE; |
||||
} |
||||
|
||||
void |
||||
-gsm_session_save (GsmStore *client_store, |
||||
- GError **error) |
||||
+gsm_session_save (GsmStore *client_store, |
||||
+ const char *type, |
||||
+ GError **error) |
||||
{ |
||||
GSettings *settings; |
||||
const char *save_dir; |
||||
char *tmp_dir; |
||||
SessionSaveData data; |
||||
|
||||
g_debug ("GsmSessionSave: Saving session"); |
||||
|
||||
/* Clear one shot key autosave in the event its set (so that it's actually |
||||
* one shot only) |
||||
*/ |
||||
settings = g_settings_new (GSM_MANAGER_SCHEMA); |
||||
g_settings_set_boolean (settings, KEY_AUTOSAVE_ONE_SHOT, FALSE); |
||||
g_object_unref (settings); |
||||
|
||||
save_dir = gsm_util_get_saved_session_dir (); |
||||
if (save_dir == NULL) { |
||||
g_warning ("GsmSessionSave: cannot create saved session directory"); |
||||
return; |
||||
} |
||||
|
||||
tmp_dir = gsm_util_get_empty_tmp_session_dir (); |
||||
if (tmp_dir == NULL) { |
||||
g_warning ("GsmSessionSave: cannot create new saved session directory"); |
||||
return; |
||||
} |
||||
|
||||
/* save the session in a temp directory, and remember the discard |
||||
* commands */ |
||||
data.dir = tmp_dir; |
||||
data.discard_hash = g_hash_table_new_full (g_str_hash, g_str_equal, |
||||
g_free, NULL); |
||||
data.error = error; |
||||
|
||||
gsm_store_foreach (client_store, |
||||
(GsmStoreFunc) save_one_client, |
||||
&data); |
||||
|
||||
if (!*error) { |
||||
char *session_dir; |
||||
|
||||
if (g_file_test (save_dir, G_FILE_TEST_IS_SYMLINK)) |
||||
session_dir = g_file_read_link (save_dir, error); |
||||
else |
||||
session_dir = g_strdup (save_dir); |
||||
|
||||
if (session_dir != NULL) { |
||||
- |
||||
char *absolute_session_dir; |
||||
|
||||
+ set_session_type (tmp_dir, type); |
||||
+ |
||||
if (g_path_is_absolute (session_dir)) { |
||||
absolute_session_dir = g_strdup (session_dir); |
||||
} else { |
||||
char *parent_dir; |
||||
|
||||
parent_dir = g_path_get_dirname (save_dir); |
||||
absolute_session_dir = g_build_filename (parent_dir, session_dir, NULL); |
||||
g_free (parent_dir); |
||||
} |
||||
g_free (session_dir); |
||||
|
||||
/* remove the old saved session */ |
||||
gsm_session_clear_saved_session (absolute_session_dir, data.discard_hash); |
||||
|
||||
if (g_file_test (absolute_session_dir, G_FILE_TEST_IS_DIR)) |
||||
g_rmdir (absolute_session_dir); |
||||
g_rename (tmp_dir, absolute_session_dir); |
||||
|
||||
g_free (absolute_session_dir); |
||||
} |
||||
} else { |
||||
g_warning ("GsmSessionSave: error saving session: %s", (*error)->message); |
||||
/* FIXME: we should create a hash table filled with the discard |
||||
* commands that are in desktop files from save_dir. */ |
||||
gsm_session_clear_saved_session (tmp_dir, NULL); |
||||
g_rmdir (tmp_dir); |
||||
} |
||||
|
||||
g_hash_table_destroy (data.discard_hash); |
||||
g_free (tmp_dir); |
||||
@@ -294,31 +328,32 @@ gsm_session_clear_saved_session (const char *directory, |
||||
|
||||
while ((filename = g_dir_read_name (dir))) { |
||||
char *path = g_build_filename (directory, |
||||
filename, NULL); |
||||
|
||||
result = gsm_session_clear_one_client (path, discard_hash) |
||||
&& result; |
||||
|
||||
g_free (path); |
||||
} |
||||
|
||||
g_dir_close (dir); |
||||
|
||||
return result; |
||||
} |
||||
|
||||
void |
||||
gsm_session_save_clear (void) |
||||
{ |
||||
const char *save_dir; |
||||
|
||||
g_debug ("GsmSessionSave: Clearing saved session"); |
||||
|
||||
save_dir = gsm_util_get_saved_session_dir (); |
||||
if (save_dir == NULL) { |
||||
g_warning ("GsmSessionSave: cannot create saved session directory"); |
||||
return; |
||||
} |
||||
|
||||
gsm_session_clear_saved_session (save_dir, NULL); |
||||
+ clear_session_type (save_dir); |
||||
} |
||||
diff --git a/gnome-session/gsm-session-save.h b/gnome-session/gsm-session-save.h |
||||
index e623260f..c91b5615 100644 |
||||
--- a/gnome-session/gsm-session-save.h |
||||
+++ b/gnome-session/gsm-session-save.h |
||||
@@ -1,33 +1,34 @@ |
||||
/* gsm-session-save.h |
||||
* Copyright (C) 2008 Lucas Rocha. |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License as |
||||
* published by the Free Software Foundation; either version 2 of the |
||||
* License, or (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, but |
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Lesser General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>. |
||||
*/ |
||||
|
||||
#ifndef __GSM_SESSION_SAVE_H__ |
||||
#define __GSM_SESSION_SAVE_H__ |
||||
|
||||
#include <glib.h> |
||||
|
||||
#include "gsm-store.h" |
||||
|
||||
G_BEGIN_DECLS |
||||
|
||||
-void gsm_session_save (GsmStore *client_store, |
||||
- GError **error); |
||||
+void gsm_session_save (GsmStore *client_store, |
||||
+ const char *type, |
||||
+ GError **error); |
||||
void gsm_session_save_clear (void); |
||||
|
||||
G_END_DECLS |
||||
|
||||
#endif /* __GSM_SESSION_SAVE_H__ */ |
||||
diff --git a/gnome-session/main.c b/gnome-session/main.c |
||||
index e2c3efef..6e697678 100644 |
||||
--- a/gnome-session/main.c |
||||
+++ b/gnome-session/main.c |
||||
@@ -119,61 +119,70 @@ sigusr2_cb (gpointer data) |
||||
static gboolean |
||||
sigusr1_cb (gpointer data) |
||||
{ |
||||
gdm_log_toggle_debug (); |
||||
return TRUE; |
||||
} |
||||
|
||||
static void |
||||
on_name_acquired (GDBusConnection *connection, |
||||
const char *name, |
||||
gpointer data) |
||||
{ |
||||
gsm_manager_start (manager); |
||||
} |
||||
|
||||
static void |
||||
create_manager (void) |
||||
{ |
||||
GsmStore *client_store; |
||||
|
||||
client_store = gsm_store_new (); |
||||
manager = gsm_manager_new (client_store, failsafe); |
||||
g_object_unref (client_store); |
||||
|
||||
g_unix_signal_add (SIGTERM, term_or_int_signal_cb, manager); |
||||
g_unix_signal_add (SIGINT, term_or_int_signal_cb, manager); |
||||
g_unix_signal_add (SIGUSR1, sigusr1_cb, manager); |
||||
g_unix_signal_add (SIGUSR2, sigusr2_cb, manager); |
||||
|
||||
if (IS_STRING_EMPTY (session_name)) { |
||||
- session_name = _gsm_manager_get_default_session (manager); |
||||
+ char *saved_session_name; |
||||
+ |
||||
+ saved_session_name = _gsm_manager_get_saved_session (manager); |
||||
+ |
||||
+ if (IS_STRING_EMPTY (saved_session_name)) |
||||
+ session_name = _gsm_manager_get_default_session (manager); |
||||
+ else |
||||
+ session_name = g_steal_pointer (&saved_session_name); |
||||
+ |
||||
+ g_free (saved_session_name); |
||||
} |
||||
|
||||
if (!gsm_session_fill (manager, session_name)) { |
||||
gsm_fail_whale_dialog_we_failed (FALSE, TRUE, NULL); |
||||
} |
||||
|
||||
_gsm_manager_set_renderer (manager, gl_renderer); |
||||
} |
||||
|
||||
static void |
||||
on_bus_acquired (GDBusConnection *connection, |
||||
const char *name, |
||||
gpointer data) |
||||
{ |
||||
create_manager (); |
||||
} |
||||
|
||||
static guint |
||||
acquire_name (void) |
||||
{ |
||||
return g_bus_own_name (G_BUS_TYPE_SESSION, |
||||
GSM_DBUS_NAME, |
||||
G_BUS_NAME_OWNER_FLAGS_NONE, |
||||
on_bus_acquired, |
||||
on_name_acquired, |
||||
on_name_lost, |
||||
NULL, NULL); |
||||
} |
||||
|
||||
static gboolean |
||||
-- |
||||
2.14.2 |
||||
|
@ -0,0 +1,42 @@
@@ -0,0 +1,42 @@
|
||||
From 2a15240b8653b8fe0f0c1e2804d7c2fe8452a604 Mon Sep 17 00:00:00 2001 |
||||
From: Ray Strode <rstrode@redhat.com> |
||||
Date: Tue, 7 Jan 2014 21:16:23 -0500 |
||||
Subject: [PATCH 14/19] session-selector: restore saved session mode |
||||
|
||||
When using the custom session selector, we need to know |
||||
whether to use classic mode or not. |
||||
|
||||
This commit makes us use whatever mode was saved with the |
||||
session. |
||||
--- |
||||
tools/gnome-session-custom-session | 17 ++++++++++++++++- |
||||
1 file changed, 16 insertions(+), 1 deletion(-) |
||||
|
||||
diff --git a/tools/gnome-session-custom-session b/tools/gnome-session-custom-session |
||||
index 07fdb0cc..358aee01 100644 |
||||
--- a/tools/gnome-session-custom-session |
||||
+++ b/tools/gnome-session-custom-session |
||||
@@ -1,4 +1,19 @@ |
||||
#! /bin/sh |
||||
|
||||
gnome-session-selector |
||||
-exec gnome-session |
||||
+ |
||||
+type_file="${XDG_CONFIG_HOME:-$HOME/.config}/gnome-session/saved-session/type" |
||||
+ |
||||
+session_type="" |
||||
+if [ -e "$type_file" ]; then |
||||
+ read session_type < "$type_file" |
||||
+fi |
||||
+ |
||||
+session_type_argument="" |
||||
+[ -n "$session_type" ] && session_type_argument="--session=$session_type" |
||||
+ |
||||
+if [ "$session_type" = "gnome-classic" ]; then |
||||
+ export GNOME_SHELL_SESSION_MODE="classic" |
||||
+fi |
||||
+ |
||||
+exec gnome-session "$session_type_argument" |
||||
-- |
||||
2.14.2 |
||||
|
@ -0,0 +1,269 @@
@@ -0,0 +1,269 @@
|
||||
From 3e35abd4c7d0aae97d868db6e66706c2ccdeeb11 Mon Sep 17 00:00:00 2001 |
||||
From: Ray Strode <rstrode@redhat.com> |
||||
Date: Fri, 20 Dec 2013 10:53:33 -0500 |
||||
Subject: [PATCH 15/19] session-selector: refresh from recent glade |
||||
|
||||
The ui file is rather old. This commit just opens it up in a recent |
||||
glade and resaves it, so we have a fresh starting point to make |
||||
changes. |
||||
--- |
||||
data/session-selector.ui | 80 ++++++++++++++++++++++++++++++++---------------- |
||||
1 file changed, 54 insertions(+), 26 deletions(-) |
||||
|
||||
diff --git a/data/session-selector.ui b/data/session-selector.ui |
||||
index 1534a746..4d1e3009 100644 |
||||
--- a/data/session-selector.ui |
||||
+++ b/data/session-selector.ui |
||||
@@ -1,195 +1,223 @@ |
||||
-<?xml version="1.0"?> |
||||
+<?xml version="1.0" encoding="UTF-8"?> |
||||
<interface> |
||||
- <requires lib="gtk+" version="2.16"/> |
||||
- <!-- interface-naming-policy project-wide --> |
||||
- <object class="GtkListStore" id="session-store"> |
||||
- <columns> |
||||
- <!-- column-name name --> |
||||
- <column type="gchararray"/> |
||||
- </columns> |
||||
- </object> |
||||
- <object class="GtkTreeModelSort" id="sort-model"> |
||||
- <property name="model">session-store</property> |
||||
- </object> |
||||
+ <!-- interface-requires gtk+ 3.0 --> |
||||
<object class="GtkWindow" id="main-window"> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="title" translatable="yes">Custom Session</property> |
||||
<property name="window_position">center</property> |
||||
<property name="default_width">500</property> |
||||
<property name="default_height">310</property> |
||||
<property name="decorated">False</property> |
||||
<child> |
||||
<object class="GtkFrame" id="frame1"> |
||||
<property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="label_xalign">0.5</property> |
||||
<property name="shadow_type">out</property> |
||||
<child> |
||||
<object class="GtkAlignment" id="alignment3"> |
||||
<property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="border_width">12</property> |
||||
<child> |
||||
<object class="GtkVBox" id="vbox3"> |
||||
<property name="visible">True</property> |
||||
- <property name="orientation">vertical</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="spacing">6</property> |
||||
- |
||||
<child> |
||||
<object class="GtkInfoBar" id="info-bar"> |
||||
<property name="visible">True</property> |
||||
- <property name="message-type">other</property> |
||||
- |
||||
+ <property name="can_focus">False</property> |
||||
+ <property name="message_type">other</property> |
||||
<child internal-child="content_area"> |
||||
- <object class="GtkHBox" id="info-bar-content_area"> |
||||
+ <object class="GtkBox" id="info-bar-content_area"> |
||||
<property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="orientation">vertical</property> |
||||
- <property name="spacing">0</property> |
||||
<child> |
||||
<object class="GtkLabel" id="info-label"> |
||||
<property name="visible">True</property> |
||||
- <property name="xalign">0.0</property> |
||||
- <property name="yalign">0.5</property> |
||||
+ <property name="can_focus">False</property> |
||||
+ <property name="xalign">0</property> |
||||
<property name="label" translatable="yes">Please select a custom session to use</property> |
||||
</object> |
||||
<packing> |
||||
- <property name="expand">True</property> |
||||
- <property name="fill">True</property> |
||||
+ <property name="expand">False</property> |
||||
+ <property name="fill">False</property> |
||||
<property name="position">0</property> |
||||
</packing> |
||||
</child> |
||||
</object> |
||||
+ <packing> |
||||
+ <property name="expand">False</property> |
||||
+ <property name="fill">False</property> |
||||
+ <property name="position">0</property> |
||||
+ </packing> |
||||
+ </child> |
||||
+ <child internal-child="action_area"> |
||||
+ <object class="GtkButtonBox" id="infobar-action_area1"> |
||||
+ <property name="can_focus">False</property> |
||||
+ </object> |
||||
+ <packing> |
||||
+ <property name="expand">False</property> |
||||
+ <property name="fill">True</property> |
||||
+ <property name="position">1</property> |
||||
+ </packing> |
||||
</child> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">False</property> |
||||
<property name="fill">True</property> |
||||
<property name="position">0</property> |
||||
</packing> |
||||
</child> |
||||
<child> |
||||
<object class="GtkVBox" id="vbox4"> |
||||
<property name="visible">True</property> |
||||
- <property name="orientation">vertical</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="spacing">12</property> |
||||
<child> |
||||
<object class="GtkHBox" id="hbox3"> |
||||
<property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="spacing">12</property> |
||||
<child> |
||||
<object class="GtkScrolledWindow" id="scrolledwindow2"> |
||||
<property name="visible">True</property> |
||||
<property name="can_focus">True</property> |
||||
<property name="hscrollbar_policy">never</property> |
||||
- <property name="vscrollbar_policy">automatic</property> |
||||
<property name="shadow_type">in</property> |
||||
<child> |
||||
<object class="GtkTreeView" id="session-list"> |
||||
<property name="visible">True</property> |
||||
<property name="can_focus">True</property> |
||||
+ <property name="model">sort-model</property> |
||||
<property name="headers_visible">False</property> |
||||
<property name="search_column">0</property> |
||||
- <property name="model">sort-model</property> |
||||
+ <child internal-child="selection"> |
||||
+ <object class="GtkTreeSelection" id="treeview-selection1"/> |
||||
+ </child> |
||||
</object> |
||||
</child> |
||||
</object> |
||||
<packing> |
||||
+ <property name="expand">True</property> |
||||
+ <property name="fill">True</property> |
||||
<property name="position">0</property> |
||||
</packing> |
||||
</child> |
||||
<child> |
||||
<object class="GtkVButtonBox" id="vbuttonbox2"> |
||||
<property name="visible">True</property> |
||||
- <property name="orientation">vertical</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="spacing">6</property> |
||||
<property name="layout_style">start</property> |
||||
<child> |
||||
<object class="GtkButton" id="new-session"> |
||||
<property name="label" translatable="yes">_New Session</property> |
||||
<property name="visible">True</property> |
||||
<property name="can_focus">True</property> |
||||
<property name="receives_default">True</property> |
||||
<property name="use_underline">True</property> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">False</property> |
||||
<property name="fill">False</property> |
||||
<property name="position">0</property> |
||||
</packing> |
||||
</child> |
||||
<child> |
||||
<object class="GtkButton" id="remove-session"> |
||||
<property name="label" translatable="yes">_Remove Session</property> |
||||
<property name="visible">True</property> |
||||
<property name="can_focus">True</property> |
||||
<property name="receives_default">True</property> |
||||
<property name="use_underline">True</property> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">False</property> |
||||
<property name="fill">False</property> |
||||
<property name="position">1</property> |
||||
</packing> |
||||
</child> |
||||
<child> |
||||
<object class="GtkButton" id="rename-session"> |
||||
<property name="label" translatable="yes">Rena_me Session</property> |
||||
<property name="visible">True</property> |
||||
<property name="can_focus">True</property> |
||||
<property name="receives_default">True</property> |
||||
<property name="use_underline">True</property> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">False</property> |
||||
<property name="fill">False</property> |
||||
<property name="position">2</property> |
||||
</packing> |
||||
</child> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">False</property> |
||||
+ <property name="fill">True</property> |
||||
<property name="position">1</property> |
||||
</packing> |
||||
</child> |
||||
</object> |
||||
<packing> |
||||
+ <property name="expand">True</property> |
||||
+ <property name="fill">True</property> |
||||
<property name="position">1</property> |
||||
</packing> |
||||
</child> |
||||
</object> |
||||
<packing> |
||||
+ <property name="expand">True</property> |
||||
+ <property name="fill">True</property> |
||||
<property name="position">1</property> |
||||
</packing> |
||||
</child> |
||||
<child> |
||||
<object class="GtkHButtonBox" id="hbuttonbox2"> |
||||
<property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
<property name="spacing">6</property> |
||||
<property name="layout_style">end</property> |
||||
<child> |
||||
<object class="GtkButton" id="continue-button"> |
||||
<property name="label" translatable="yes">_Continue</property> |
||||
<property name="visible">True</property> |
||||
<property name="can_focus">True</property> |
||||
<property name="can_default">True</property> |
||||
<property name="has_default">True</property> |
||||
<property name="receives_default">True</property> |
||||
<property name="use_underline">True</property> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">False</property> |
||||
<property name="fill">False</property> |
||||
<property name="position">0</property> |
||||
</packing> |
||||
</child> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">False</property> |
||||
+ <property name="fill">True</property> |
||||
<property name="position">2</property> |
||||
</packing> |
||||
</child> |
||||
</object> |
||||
</child> |
||||
</object> |
||||
</child> |
||||
</object> |
||||
</child> |
||||
</object> |
||||
+ <object class="GtkListStore" id="session-store"> |
||||
+ <columns> |
||||
+ <!-- column-name name --> |
||||
+ <column type="gchararray"/> |
||||
+ </columns> |
||||
+ </object> |
||||
+ <object class="GtkTreeModelSort" id="sort-model"> |
||||
+ <property name="model">session-store</property> |
||||
+ </object> |
||||
</interface> |
||||
-- |
||||
2.14.2 |
||||
|
@ -0,0 +1,604 @@
@@ -0,0 +1,604 @@
|
||||
From f0f0898da1c1e28d4ad6d6c17ba559e59780bd21 Mon Sep 17 00:00:00 2001 |
||||
From: Ray Strode <rstrode@redhat.com> |
||||
Date: Tue, 7 Jan 2014 21:02:02 -0500 |
||||
Subject: [PATCH 16/19] session-selector: add toggle for classic/normal |
||||
selection |
||||
|
||||
Since we offer both classic mode and regular mode when |
||||
not using the session selector, we should also offer it |
||||
when using the session selector. |
||||
--- |
||||
data/session-selector.ui | 39 ++++++++++++++- |
||||
tools/gnome-session-selector.c | 106 +++++++++++++++++++++++++++++++++++++++++ |
||||
2 files changed, 143 insertions(+), 2 deletions(-) |
||||
|
||||
diff --git a/data/session-selector.ui b/data/session-selector.ui |
||||
index 4d1e3009..beab73a1 100644 |
||||
--- a/data/session-selector.ui |
||||
+++ b/data/session-selector.ui |
||||
@@ -153,71 +153,106 @@ |
||||
<property name="fill">False</property> |
||||
<property name="position">2</property> |
||||
</packing> |
||||
</child> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">False</property> |
||||
<property name="fill">True</property> |
||||
<property name="position">1</property> |
||||
</packing> |
||||
</child> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">True</property> |
||||
<property name="fill">True</property> |
||||
<property name="position">1</property> |
||||
</packing> |
||||
</child> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">True</property> |
||||
<property name="fill">True</property> |
||||
<property name="position">1</property> |
||||
</packing> |
||||
</child> |
||||
<child> |
||||
<object class="GtkHButtonBox" id="hbuttonbox2"> |
||||
<property name="visible">True</property> |
||||
<property name="can_focus">False</property> |
||||
<property name="spacing">6</property> |
||||
- <property name="layout_style">end</property> |
||||
+ <child> |
||||
+ <object class="GtkBox" id="box1"> |
||||
+ <property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
+ <property name="spacing">6</property> |
||||
+ <child> |
||||
+ <object class="GtkLabel" id="classic-mode-label"> |
||||
+ <property name="visible">True</property> |
||||
+ <property name="can_focus">False</property> |
||||
+ <property name="label" translatable="yes">Classic Experience</property> |
||||
+ </object> |
||||
+ <packing> |
||||
+ <property name="expand">False</property> |
||||
+ <property name="fill">True</property> |
||||
+ <property name="position">0</property> |
||||
+ </packing> |
||||
+ </child> |
||||
+ <child> |
||||
+ <object class="GtkSwitch" id="classic-mode-switch"> |
||||
+ <property name="visible">True</property> |
||||
+ <property name="can_focus">True</property> |
||||
+ </object> |
||||
+ <packing> |
||||
+ <property name="expand">False</property> |
||||
+ <property name="fill">True</property> |
||||
+ <property name="position">1</property> |
||||
+ </packing> |
||||
+ </child> |
||||
+ </object> |
||||
+ <packing> |
||||
+ <property name="expand">False</property> |
||||
+ <property name="fill">True</property> |
||||
+ <property name="position">0</property> |
||||
+ </packing> |
||||
+ </child> |
||||
<child> |
||||
<object class="GtkButton" id="continue-button"> |
||||
<property name="label" translatable="yes">_Continue</property> |
||||
<property name="visible">True</property> |
||||
<property name="can_focus">True</property> |
||||
<property name="can_default">True</property> |
||||
<property name="has_default">True</property> |
||||
<property name="receives_default">True</property> |
||||
<property name="use_underline">True</property> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">False</property> |
||||
<property name="fill">False</property> |
||||
- <property name="position">0</property> |
||||
+ <property name="position">1</property> |
||||
+ <property name="non_homogeneous">True</property> |
||||
</packing> |
||||
</child> |
||||
</object> |
||||
<packing> |
||||
<property name="expand">False</property> |
||||
<property name="fill">True</property> |
||||
<property name="position">2</property> |
||||
</packing> |
||||
</child> |
||||
</object> |
||||
</child> |
||||
</object> |
||||
</child> |
||||
</object> |
||||
</child> |
||||
</object> |
||||
<object class="GtkListStore" id="session-store"> |
||||
<columns> |
||||
<!-- column-name name --> |
||||
<column type="gchararray"/> |
||||
</columns> |
||||
</object> |
||||
<object class="GtkTreeModelSort" id="sort-model"> |
||||
<property name="model">session-store</property> |
||||
</object> |
||||
</interface> |
||||
diff --git a/tools/gnome-session-selector.c b/tools/gnome-session-selector.c |
||||
index 53822f6c..a7361a5b 100644 |
||||
--- a/tools/gnome-session-selector.c |
||||
+++ b/tools/gnome-session-selector.c |
||||
@@ -16,60 +16,61 @@ |
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
* Written by: Matthias Clasen <mclasen@redhat.com> |
||||
*/ |
||||
|
||||
#include "config.h" |
||||
|
||||
#include <fcntl.h> |
||||
#include <stdlib.h> |
||||
#include <string.h> |
||||
#include <sys/types.h> |
||||
#include <sys/stat.h> |
||||
#include <unistd.h> |
||||
|
||||
#include <glib.h> |
||||
#include <gtk/gtk.h> |
||||
#include <gio/gio.h> |
||||
|
||||
#include <glib/gi18n.h> |
||||
#include <glib/gstdio.h> |
||||
|
||||
#include <dbus/dbus-glib.h> |
||||
#include <dbus/dbus-glib-lowlevel.h> |
||||
|
||||
#define GSM_SERVICE_DBUS "org.gnome.SessionManager" |
||||
#define GSM_PATH_DBUS "/org/gnome/SessionManager" |
||||
#define GSM_INTERFACE_DBUS "org.gnome.SessionManager" |
||||
|
||||
#define GSM_MANAGER_SCHEMA "org.gnome.SessionManager" |
||||
#define KEY_AUTOSAVE_ONE_SHOT "auto-save-session-one-shot" |
||||
+#define DEFAULT_SESSION_NAME "gnome" |
||||
|
||||
static GtkBuilder *builder; |
||||
static GtkWidget *session_list; |
||||
static GtkListStore *store; |
||||
static GtkTreeModelSort *sort_model; |
||||
static char *info_text; |
||||
|
||||
static void select_session (const char *name); |
||||
static gboolean make_session_current (const char *name); |
||||
|
||||
static char * |
||||
get_session_path (const char *name) |
||||
{ |
||||
return g_build_filename (g_get_user_config_dir (), "gnome-session", name, NULL); |
||||
} |
||||
|
||||
static char * |
||||
find_new_session_name (void) |
||||
{ |
||||
char *name; |
||||
char *path; |
||||
int i; |
||||
|
||||
for (i = 1; i < 20; i++) { |
||||
name = g_strdup_printf (_("Session %d"), i); |
||||
path = get_session_path (name); |
||||
if (!g_file_test (path, G_FILE_TEST_EXISTS)) { |
||||
g_free (path); |
||||
return name; |
||||
} |
||||
@@ -125,104 +126,126 @@ is_valid_session_name (const char *name) |
||||
gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter); |
||||
do { |
||||
gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 0, &n, -1); |
||||
if (strcmp (n, name) == 0) { |
||||
char *message; |
||||
message = g_strdup_printf (_("A session named “%s” already exists"), name); |
||||
warning_text = g_strdup_printf ("%s\n<small><b>Note:</b> <i>%s</i></small>", info_text, message); |
||||
g_free (message); |
||||
g_free (n); |
||||
break; |
||||
} |
||||
g_free (n); |
||||
} while (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); |
||||
|
||||
info_bar = (GtkWidget *) gtk_builder_get_object (builder, "info-bar"); |
||||
label = (GtkWidget*) gtk_builder_get_object (builder, "info-label"); |
||||
|
||||
if (warning_text != NULL) { |
||||
gtk_info_bar_set_message_type (GTK_INFO_BAR (info_bar), GTK_MESSAGE_WARNING); |
||||
gtk_label_set_markup (GTK_LABEL (label), warning_text); |
||||
g_free (warning_text); |
||||
return FALSE; |
||||
} |
||||
|
||||
gtk_info_bar_set_message_type (GTK_INFO_BAR (info_bar), GTK_MESSAGE_OTHER); |
||||
gtk_label_set_markup (GTK_LABEL (label), info_text); |
||||
|
||||
return TRUE; |
||||
} |
||||
|
||||
+static char * |
||||
+get_session_type_from_file (const char *name) |
||||
+{ |
||||
+ char *file; |
||||
+ char *type; |
||||
+ gboolean loaded; |
||||
+ |
||||
+ file = g_build_filename (g_get_user_config_dir (), "gnome-session", name, "type", NULL); |
||||
+ loaded = g_file_get_contents (file, &type, NULL, NULL); |
||||
+ g_free (file); |
||||
+ |
||||
+ if (!loaded) |
||||
+ return g_strdup (DEFAULT_SESSION_NAME); |
||||
+ |
||||
+ return type; |
||||
+} |
||||
+ |
||||
static void |
||||
populate_session_list (GtkWidget *session_list) |
||||
{ |
||||
GtkTreeIter iter; |
||||
char *path; |
||||
const char *name; |
||||
GDir *dir; |
||||
GError *error; |
||||
char *saved_session; |
||||
char *default_session; |
||||
char *default_name; |
||||
char last_session[PATH_MAX] = ""; |
||||
|
||||
saved_session = get_session_path ("saved-session"); |
||||
|
||||
if (!g_file_test (saved_session, G_FILE_TEST_IS_SYMLINK)) { |
||||
default_name = find_new_session_name (); |
||||
default_session = get_session_path (default_name); |
||||
rename (saved_session, default_session); |
||||
if (symlink (default_name, saved_session) < 0) |
||||
g_warning ("Failed to convert saved-session to symlink"); |
||||
g_free (default_name); |
||||
g_free (default_session); |
||||
} |
||||
|
||||
path = g_build_filename (g_get_user_config_dir (), "gnome-session", NULL); |
||||
error = NULL; |
||||
dir = g_dir_open (path, 0, &error); |
||||
if (dir == NULL) { |
||||
g_warning ("Failed to open %s: %s", path, error->message); |
||||
g_error_free (error); |
||||
goto out; |
||||
} |
||||
|
||||
default_name = NULL; |
||||
if (readlink (saved_session, last_session, PATH_MAX - 1) > 0) { |
||||
default_name = g_path_get_basename (last_session); |
||||
} |
||||
|
||||
while ((name = g_dir_read_name (dir)) != NULL) { |
||||
+ char *session_type; |
||||
+ |
||||
if (strcmp (name, "saved-session") == 0) |
||||
continue; |
||||
|
||||
+ session_type = get_session_type_from_file (name); |
||||
+ |
||||
gtk_list_store_insert_with_values (store, &iter, 100, 0, name, -1); |
||||
+ g_free (session_type); |
||||
|
||||
if (g_strcmp0 (default_name, name) == 0) { |
||||
GtkTreeSelection *selection; |
||||
GtkTreeIter child_iter; |
||||
|
||||
gtk_tree_model_sort_convert_child_iter_to_iter (GTK_TREE_MODEL_SORT (sort_model), &child_iter, &iter); |
||||
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (session_list)); |
||||
gtk_tree_selection_select_iter (selection, &child_iter); |
||||
} |
||||
} |
||||
|
||||
g_free (default_name); |
||||
g_dir_close (dir); |
||||
|
||||
out: |
||||
g_free (saved_session); |
||||
g_free (path); |
||||
} |
||||
|
||||
static char * |
||||
get_last_session (void) |
||||
{ |
||||
char *saved_session; |
||||
char last_session[PATH_MAX] = ""; |
||||
char *name = NULL; |
||||
|
||||
saved_session = get_session_path ("saved-session"); |
||||
|
||||
if (readlink (saved_session, last_session, PATH_MAX - 1) > 0) { |
||||
name = g_path_get_basename (last_session); |
||||
@@ -260,60 +283,136 @@ remove_session (const char *name) |
||||
GError *error; |
||||
|
||||
path1 = get_session_path ("saved-session"); |
||||
path2 = get_session_path (name); |
||||
|
||||
error = NULL; |
||||
n = g_file_read_link (path1, &error); |
||||
if (n == NULL) { |
||||
g_warning ("Failed to read link: %s", error->message); |
||||
g_error_free (error); |
||||
} |
||||
else if (strcmp (n, name) == 0) { |
||||
unlink (path1); |
||||
} |
||||
g_free (n); |
||||
|
||||
dir = g_dir_open (path2, 0, NULL); |
||||
while ((d = g_dir_read_name (dir)) != NULL) { |
||||
path = g_build_filename (path2, d, NULL); |
||||
unlink (path); |
||||
g_free (path); |
||||
} |
||||
g_dir_close (dir); |
||||
|
||||
remove (path2); |
||||
|
||||
g_free (path1); |
||||
g_free (path2); |
||||
} |
||||
|
||||
+static const char * |
||||
+get_session_type_from_switch (void) |
||||
+{ |
||||
+ GtkWidget *mode_switch; |
||||
+ gboolean is_classic_mode; |
||||
+ |
||||
+ mode_switch = (GtkWidget *)gtk_builder_get_object (builder, "classic-mode-switch"); |
||||
+ |
||||
+ is_classic_mode = gtk_switch_get_active (GTK_SWITCH (mode_switch)); |
||||
+ |
||||
+ if (is_classic_mode) { |
||||
+ return "gnome-classic"; |
||||
+ } else { |
||||
+ return "gnome"; |
||||
+ } |
||||
+} |
||||
+ |
||||
+static void |
||||
+set_mode_switch_from_session_type_file (const char *name) |
||||
+{ |
||||
+ GtkWidget *mode_switch; |
||||
+ gboolean is_classic_mode = FALSE; |
||||
+ char *type; |
||||
+ |
||||
+ mode_switch = (GtkWidget *)gtk_builder_get_object (builder, "classic-mode-switch"); |
||||
+ |
||||
+ type = get_session_type_from_file (name); |
||||
+ is_classic_mode = strcmp (type, "gnome-classic") == 0; |
||||
+ g_free (type); |
||||
+ |
||||
+ gtk_switch_set_active (GTK_SWITCH (mode_switch), is_classic_mode); |
||||
+} |
||||
+ |
||||
+static void |
||||
+save_session_type (const char *save_dir, |
||||
+ const char *type) |
||||
+{ |
||||
+ char *file; |
||||
+ GError *error; |
||||
+ |
||||
+ file = g_build_filename (save_dir, "type", NULL); |
||||
+ |
||||
+ error = NULL; |
||||
+ g_file_set_contents (file, type, strlen (type), &error); |
||||
+ if (error != NULL) |
||||
+ g_warning ("couldn't save session type to %s: %s", |
||||
+ type, error->message); |
||||
+ |
||||
+ g_free (file); |
||||
+} |
||||
+ |
||||
+static void |
||||
+save_session_type_from_switch (void) |
||||
+{ |
||||
+ char *name, *path; |
||||
+ const char *session_type; |
||||
+ |
||||
+ name = get_selected_session (); |
||||
+ |
||||
+ if (name == NULL) { |
||||
+ return; |
||||
+ } |
||||
+ |
||||
+ path = get_session_path (name); |
||||
+ g_free (name); |
||||
+ |
||||
+ session_type = get_session_type_from_switch (); |
||||
+ save_session_type (path, session_type); |
||||
+} |
||||
+ |
||||
+static void |
||||
+on_mode_switched (GtkSwitch *mode_switch) |
||||
+{ |
||||
+ save_session_type_from_switch (); |
||||
+} |
||||
+ |
||||
static gboolean |
||||
make_session_current (const char *name) |
||||
{ |
||||
char *path1; |
||||
gboolean ret = TRUE; |
||||
|
||||
path1 = g_build_filename (g_get_user_config_dir (), "gnome-session", "saved-session", NULL); |
||||
|
||||
unlink (path1); |
||||
if (symlink (name, path1) < 0) { |
||||
g_warning ("Failed to make session '%s' current", name); |
||||
ret = FALSE; |
||||
} |
||||
|
||||
g_free (path1); |
||||
|
||||
return ret; |
||||
} |
||||
|
||||
static void |
||||
on_remove_session_clicked (GtkButton *button, |
||||
gpointer data) |
||||
{ |
||||
GtkTreeSelection *selection; |
||||
GtkTreeModel *model; |
||||
GtkTreeIter iter; |
||||
char *name; |
||||
|
||||
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (session_list)); |
||||
if (gtk_tree_selection_get_selected (selection, &model, &iter)) { |
||||
@@ -492,60 +591,62 @@ static void |
||||
create_session_and_begin_rename (void) |
||||
{ |
||||
gchar *name; |
||||
|
||||
name = find_new_session_name (); |
||||
create_session (name); |
||||
select_session (name); |
||||
|
||||
begin_rename (); |
||||
} |
||||
|
||||
static void |
||||
on_new_session_clicked (GtkButton *button, |
||||
gpointer data) |
||||
{ |
||||
create_session_and_begin_rename (); |
||||
} |
||||
|
||||
static void |
||||
on_selection_changed (GtkTreeSelection *selection, |
||||
gpointer data) |
||||
{ |
||||
char *name; |
||||
|
||||
name = get_selected_session (); |
||||
|
||||
if (name == NULL) { |
||||
return; |
||||
} |
||||
|
||||
+ set_mode_switch_from_session_type_file (name); |
||||
+ |
||||
g_free (name); |
||||
} |
||||
|
||||
static void |
||||
update_remove_button (void) |
||||
{ |
||||
GtkWidget *button; |
||||
|
||||
button = (GtkWidget *)gtk_builder_get_object (builder, "remove-session"); |
||||
if (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) > 1) { |
||||
gtk_widget_set_sensitive (button, TRUE); |
||||
} else { |
||||
gtk_widget_set_sensitive (button, FALSE); |
||||
} |
||||
} |
||||
|
||||
static void |
||||
on_row_edited (GtkCellRendererText *cell, |
||||
const char *path_string, |
||||
const char *new_name, |
||||
gpointer data) |
||||
{ |
||||
GtkTreePath *path; |
||||
GtkTreeIter sort_iter, items_iter; |
||||
char *old_name; |
||||
gboolean was_renamed; |
||||
|
||||
path = gtk_tree_path_new_from_string (path_string); |
||||
gtk_tree_model_get_iter (GTK_TREE_MODEL (sort_model), &sort_iter, path); |
||||
|
||||
@@ -751,75 +852,80 @@ main (int argc, char *argv[]) |
||||
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort_model), |
||||
0, GTK_SORT_ASCENDING); |
||||
g_signal_connect (store, "row-deleted", G_CALLBACK (on_row_deleted), NULL); |
||||
g_signal_connect (store, "row-inserted", G_CALLBACK (on_row_inserted), NULL); |
||||
session_list = (GtkWidget *) gtk_builder_get_object (builder, "session-list"); |
||||
|
||||
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (session_list)); |
||||
gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); |
||||
|
||||
populate_session_list (session_list); |
||||
|
||||
cell = gtk_cell_renderer_text_new (); |
||||
g_signal_connect (cell, "edited", G_CALLBACK (on_row_edited), NULL); |
||||
|
||||
column = gtk_tree_view_column_new_with_attributes ("", cell, "text", 0, NULL); |
||||
gtk_tree_view_append_column (GTK_TREE_VIEW (session_list), GTK_TREE_VIEW_COLUMN (column)); |
||||
|
||||
g_signal_connect (session_list, "row-activated", G_CALLBACK (on_row_activated), NULL); |
||||
|
||||
g_signal_connect (selection, "changed", |
||||
G_CALLBACK (on_selection_changed), NULL); |
||||
|
||||
widget = (GtkWidget *) gtk_builder_get_object (builder, "new-session"); |
||||
g_signal_connect (widget, "clicked", G_CALLBACK (on_new_session_clicked), NULL); |
||||
widget = (GtkWidget *) gtk_builder_get_object (builder, "remove-session"); |
||||
g_signal_connect (widget, "clicked", G_CALLBACK (on_remove_session_clicked), NULL); |
||||
widget = (GtkWidget *) gtk_builder_get_object (builder, "rename-session"); |
||||
g_signal_connect (widget, "clicked", G_CALLBACK (on_rename_session_clicked), NULL); |
||||
widget = (GtkWidget *) gtk_builder_get_object (builder, "continue-button"); |
||||
g_signal_connect (widget, "clicked", G_CALLBACK (on_continue_clicked), NULL); |
||||
+ widget = (GtkWidget *) gtk_builder_get_object (builder, "classic-mode-switch"); |
||||
+ g_signal_connect (widget, "notify::active", G_CALLBACK (on_mode_switched), NULL); |
||||
|
||||
g_signal_connect (window, "map", G_CALLBACK (on_map), NULL); |
||||
gtk_widget_show (window); |
||||
|
||||
if (g_strcmp0 (action, "load") == 0) { |
||||
info_text = _("Please select a custom session to run"); |
||||
} else if (g_strcmp0 (action, "print") == 0) { |
||||
info_text = _("Please select a session to use"); |
||||
} else if (g_strcmp0 (action, "save") == 0) { |
||||
info_text = _("Please select a session to save to"); |
||||
} |
||||
|
||||
label = (GtkWidget*) gtk_builder_get_object (builder, "info-label"); |
||||
gtk_label_set_markup (GTK_LABEL (label), info_text); |
||||
|
||||
selected_session = get_selected_session (); |
||||
|
||||
if (selected_session == NULL) { |
||||
create_session_and_begin_rename (); |
||||
} else { |
||||
+ set_mode_switch_from_session_type_file (selected_session); |
||||
g_free (selected_session); |
||||
} |
||||
|
||||
gtk_main (); |
||||
|
||||
selected_session = get_selected_session (); |
||||
|
||||
if (g_strcmp0 (action, "load") == 0) { |
||||
make_session_current (selected_session); |
||||
+ save_session_type_from_switch (); |
||||
auto_save_next_session_if_needed (); |
||||
} else if (g_strcmp0 (action, "save") == 0) { |
||||
char *last_session; |
||||
|
||||
last_session = get_last_session (); |
||||
make_session_current (selected_session); |
||||
save_session (); |
||||
+ save_session_type_from_switch (); |
||||
if (last_session != NULL) |
||||
make_session_current (last_session); |
||||
} else if (g_strcmp0 (action, "print") == 0) { |
||||
g_print ("%s\n", selected_session); |
||||
} |
||||
g_free (selected_session); |
||||
|
||||
return 0; |
||||
} |
||||
-- |
||||
2.14.2 |
||||
|
@ -0,0 +1,79 @@
@@ -0,0 +1,79 @@
|
||||
From 12df4f92bff325fbffcaa4eb0ee0392511f6ebb6 Mon Sep 17 00:00:00 2001 |
||||
From: Ray Strode <rstrode@redhat.com> |
||||
Date: Wed, 8 Jan 2014 10:15:29 -0500 |
||||
Subject: [PATCH 17/19] session-selector: use classic mode by default |
||||
|
||||
--- |
||||
tools/gnome-session-selector.c | 2 +- |
||||
1 file changed, 1 insertion(+), 1 deletion(-) |
||||
|
||||
diff --git a/tools/gnome-session-selector.c b/tools/gnome-session-selector.c |
||||
index a7361a5b..a41cd260 100644 |
||||
--- a/tools/gnome-session-selector.c |
||||
+++ b/tools/gnome-session-selector.c |
||||
@@ -16,61 +16,61 @@ |
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
* Written by: Matthias Clasen <mclasen@redhat.com> |
||||
*/ |
||||
|
||||
#include "config.h" |
||||
|
||||
#include <fcntl.h> |
||||
#include <stdlib.h> |
||||
#include <string.h> |
||||
#include <sys/types.h> |
||||
#include <sys/stat.h> |
||||
#include <unistd.h> |
||||
|
||||
#include <glib.h> |
||||
#include <gtk/gtk.h> |
||||
#include <gio/gio.h> |
||||
|
||||
#include <glib/gi18n.h> |
||||
#include <glib/gstdio.h> |
||||
|
||||
#include <dbus/dbus-glib.h> |
||||
#include <dbus/dbus-glib-lowlevel.h> |
||||
|
||||
#define GSM_SERVICE_DBUS "org.gnome.SessionManager" |
||||
#define GSM_PATH_DBUS "/org/gnome/SessionManager" |
||||
#define GSM_INTERFACE_DBUS "org.gnome.SessionManager" |
||||
|
||||
#define GSM_MANAGER_SCHEMA "org.gnome.SessionManager" |
||||
#define KEY_AUTOSAVE_ONE_SHOT "auto-save-session-one-shot" |
||||
-#define DEFAULT_SESSION_NAME "gnome" |
||||
+#define DEFAULT_SESSION_NAME "gnome-classic" |
||||
|
||||
static GtkBuilder *builder; |
||||
static GtkWidget *session_list; |
||||
static GtkListStore *store; |
||||
static GtkTreeModelSort *sort_model; |
||||
static char *info_text; |
||||
|
||||
static void select_session (const char *name); |
||||
static gboolean make_session_current (const char *name); |
||||
|
||||
static char * |
||||
get_session_path (const char *name) |
||||
{ |
||||
return g_build_filename (g_get_user_config_dir (), "gnome-session", name, NULL); |
||||
} |
||||
|
||||
static char * |
||||
find_new_session_name (void) |
||||
{ |
||||
char *name; |
||||
char *path; |
||||
int i; |
||||
|
||||
for (i = 1; i < 20; i++) { |
||||
name = g_strdup_printf (_("Session %d"), i); |
||||
path = get_session_path (name); |
||||
if (!g_file_test (path, G_FILE_TEST_EXISTS)) { |
||||
g_free (path); |
||||
return name; |
||||
} |
||||
-- |
||||
2.14.2 |
||||
|
@ -0,0 +1,756 @@
@@ -0,0 +1,756 @@
|
||||
From 916d9ba86cf2020ffedff331397ed02b5e53f030 Mon Sep 17 00:00:00 2001 |
||||
From: Ray Strode <rstrode@redhat.com> |
||||
Date: Wed, 8 Mar 2017 16:36:44 -0500 |
||||
Subject: [PATCH 18/19] manager: port away from dbus-glib to GDBus |
||||
|
||||
--- |
||||
capplet/gsm-properties-dialog.c | 52 +++++++++++++++++++++-------------------- |
||||
configure.ac | 2 +- |
||||
gnome-session/gsm-manager.c | 16 ++++++------- |
||||
gnome-session/gsm-manager.h | 3 ++- |
||||
tools/gnome-session-selector.c | 48 ++++++++++++++++++++----------------- |
||||
5 files changed, 64 insertions(+), 57 deletions(-) |
||||
|
||||
diff --git a/capplet/gsm-properties-dialog.c b/capplet/gsm-properties-dialog.c |
||||
index 51fa5106..04452c1a 100644 |
||||
--- a/capplet/gsm-properties-dialog.c |
||||
+++ b/capplet/gsm-properties-dialog.c |
||||
@@ -1,66 +1,66 @@ |
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- |
||||
* |
||||
* Copyright (C) 1999 Free Software Foundation, Inc. |
||||
* Copyright (C) 2007 Vincent Untz. |
||||
* Copyright (C) 2008 Lucas Rocha. |
||||
* Copyright (C) 2008 William Jon McCann <jmccann@redhat.com> |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation; either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
||||
* |
||||
*/ |
||||
|
||||
#include "config.h" |
||||
|
||||
#include <glib.h> |
||||
#include <glib/gi18n.h> |
||||
#include <gtk/gtk.h> |
||||
|
||||
+#include <gio/gio.h> |
||||
+ |
||||
#include "gsm-properties-dialog.h" |
||||
#include "gsm-app-dialog.h" |
||||
#include "gsm-util.h" |
||||
#include "gsp-app.h" |
||||
#include "gsp-app-manager.h" |
||||
-#include <dbus/dbus-glib.h> |
||||
-#include <dbus/dbus-glib-lowlevel.h> |
||||
|
||||
#define GSM_SERVICE_DBUS "org.gnome.SessionManager" |
||||
#define GSM_PATH_DBUS "/org/gnome/SessionManager" |
||||
#define GSM_INTERFACE_DBUS "org.gnome.SessionManager" |
||||
|
||||
#define GSM_PROPERTIES_DIALOG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSM_TYPE_PROPERTIES_DIALOG, GsmPropertiesDialogPrivate)) |
||||
|
||||
#define GTKBUILDER_FILE "session-properties.ui" |
||||
|
||||
#define CAPPLET_TREEVIEW_WIDGET_NAME "session_properties_treeview" |
||||
#define CAPPLET_ADD_WIDGET_NAME "session_properties_add_button" |
||||
#define CAPPLET_DELETE_WIDGET_NAME "session_properties_delete_button" |
||||
#define CAPPLET_EDIT_WIDGET_NAME "session_properties_edit_button" |
||||
#define CAPPLET_SAVE_WIDGET_NAME "session_properties_save_button" |
||||
#define CAPPLET_SESSION_SAVED_WIDGET_NAME "session_properties_session_saved_label" |
||||
#define CAPPLET_REMEMBER_WIDGET_NAME "session_properties_remember_toggle" |
||||
|
||||
#define STARTUP_APP_ICON "system-run" |
||||
|
||||
#define SPC_SETTINGS_SCHEMA "org.gnome.SessionManager" |
||||
#define SPC_SETTINGS_AUTOSAVE_KEY "auto-save-session" |
||||
|
||||
struct GsmPropertiesDialogPrivate |
||||
{ |
||||
GtkBuilder *xml; |
||||
GtkListStore *list_store; |
||||
GtkTreeModel *tree_filter; |
||||
|
||||
GtkTreeView *treeview; |
||||
GtkWidget *add_button; |
||||
@@ -454,101 +454,103 @@ on_edit_app_clicked (GtkWidget *widget, |
||||
g_object_unref (app); |
||||
} |
||||
} |
||||
|
||||
static void |
||||
on_row_activated (GtkTreeView *tree_view, |
||||
GtkTreePath *path, |
||||
GtkTreeViewColumn *column, |
||||
GsmPropertiesDialog *dialog) |
||||
{ |
||||
on_edit_app_clicked (NULL, dialog); |
||||
} |
||||
|
||||
static void |
||||
session_saved_message (GsmPropertiesDialog *dialog, |
||||
const char *msg, |
||||
gboolean is_error) |
||||
{ |
||||
GtkLabel *label; |
||||
gchar *markup; |
||||
label = GTK_LABEL (gtk_builder_get_object (dialog->priv->xml, CAPPLET_SESSION_SAVED_WIDGET_NAME)); |
||||
if (is_error) |
||||
markup = g_markup_printf_escaped ("<span foreground=\"red\">%s</span>", msg); |
||||
else |
||||
markup = g_markup_escape_text (msg, -1); |
||||
gtk_label_set_markup (label, markup); |
||||
g_free (markup); |
||||
} |
||||
|
||||
static void |
||||
-session_saved_cb (DBusGProxy *proxy, |
||||
- DBusGProxyCall *call_id, |
||||
- void *user_data) |
||||
+session_saved_cb (GDBusConnection *conn, |
||||
+ GAsyncResult *result, |
||||
+ gpointer user_data) |
||||
{ |
||||
- gboolean res; |
||||
+ GVariant *reply; |
||||
GsmPropertiesDialog *dialog = user_data; |
||||
+ GError *error = NULL; |
||||
|
||||
- res = dbus_g_proxy_end_call (proxy, call_id, NULL, G_TYPE_INVALID); |
||||
- if (res) |
||||
+ reply = g_dbus_connection_call_finish (conn, result, &error); |
||||
+ if (error == NULL) |
||||
session_saved_message (dialog, _("Your session has been saved."), FALSE); |
||||
else |
||||
session_saved_message (dialog, _("Failed to save session"), TRUE); |
||||
|
||||
- g_object_unref (proxy); |
||||
+ g_clear_error (&error); |
||||
+ |
||||
+ g_variant_unref (reply); |
||||
} |
||||
|
||||
static void |
||||
save_session_directly (GsmPropertiesDialog *dialog) |
||||
{ |
||||
- DBusGConnection *conn; |
||||
- DBusGProxy *proxy; |
||||
- DBusGProxyCall *call; |
||||
+ GDBusConnection *conn; |
||||
|
||||
- conn = dbus_g_bus_get (DBUS_BUS_SESSION, NULL); |
||||
+ conn = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); |
||||
if (conn == NULL) { |
||||
session_saved_message (dialog, _("Could not connect to the session bus"), TRUE); |
||||
return; |
||||
} |
||||
|
||||
- proxy = dbus_g_proxy_new_for_name (conn, GSM_SERVICE_DBUS, GSM_PATH_DBUS, GSM_INTERFACE_DBUS); |
||||
- if (proxy == NULL) { |
||||
- session_saved_message (dialog, _("Could not connect to the session manager"), TRUE); |
||||
- return; |
||||
- } |
||||
- |
||||
- call = dbus_g_proxy_begin_call (proxy, "SaveSession", session_saved_cb, dialog, NULL, G_TYPE_INVALID); |
||||
- if (call == NULL) { |
||||
- session_saved_message (dialog, _("Failed to save session"), TRUE); |
||||
- g_object_unref (proxy); |
||||
- return; |
||||
- } |
||||
+ g_dbus_connection_call (conn, |
||||
+ GSM_SERVICE_DBUS, |
||||
+ GSM_PATH_DBUS, |
||||
+ GSM_INTERFACE_DBUS, |
||||
+ "SaveSession", |
||||
+ NULL, |
||||
+ NULL, |
||||
+ G_DBUS_CALL_FLAGS_NONE, |
||||
+ -1, |
||||
+ NULL, |
||||
+ (GAsyncReadyCallback) |
||||
+ session_saved_cb, |
||||
+ dialog); |
||||
} |
||||
|
||||
static void |
||||
save_session_from_selector (GsmPropertiesDialog *dialog, |
||||
const char *program_path) |
||||
{ |
||||
char *command_line = g_strdup_printf ("%s --action save", program_path); |
||||
|
||||
g_spawn_command_line_sync (command_line, NULL, NULL, NULL, NULL); |
||||
|
||||
g_free (command_line); |
||||
} |
||||
|
||||
static void |
||||
on_save_session_clicked (GtkWidget *widget, |
||||
GsmPropertiesDialog *dialog) |
||||
{ |
||||
char *program_path; |
||||
|
||||
program_path = g_find_program_in_path ("gnome-session-selector"); |
||||
|
||||
if (program_path != NULL) { |
||||
save_session_from_selector (dialog, program_path); |
||||
g_free (program_path); |
||||
} else { |
||||
save_session_directly (dialog); |
||||
} |
||||
} |
||||
|
||||
static void |
||||
diff --git a/configure.ac b/configure.ac |
||||
index d0eeab8a..5182c09e 100644 |
||||
--- a/configure.ac |
||||
+++ b/configure.ac |
||||
@@ -21,61 +21,61 @@ LT_PREREQ([2.2.6]) |
||||
LT_INIT([dlopen disable-static]) |
||||
|
||||
GNOME_MAINTAINER_MODE_DEFINES |
||||
GNOME_COMPILE_WARNINGS([maximum]) |
||||
|
||||
AC_ARG_ENABLE(deprecation_flags, |
||||
[AS_HELP_STRING([--enable-deprecation-flags], |
||||
[use *_DISABLE_DEPRECATED flags @<:@default=no@:>@])],, |
||||
[enable_deprecation_flags=no]) |
||||
|
||||
if test "x$enable_deprecation_flags" = "xyes"; then |
||||
DISABLE_DEPRECATED_CFLAGS=$DISABLE_DEPRECATED |
||||
AC_SUBST([DISABLE_DEPRECATED_CFLAGS]) |
||||
fi |
||||
|
||||
GLIB_REQUIRED=2.46.0 |
||||
GTK3_REQUIRED=3.18.0 |
||||
DBUS_GLIB_REQUIRED=0.76 |
||||
UPOWER_REQUIRED=0.9.0 |
||||
JSON_GLIB_REQUIRED=0.10 |
||||
GNOME_DESKTOP_REQUIRED=3.18.0 |
||||
|
||||
AC_ARG_ENABLE(session-selector, AS_HELP_STRING([--enable-session-selector], |
||||
[enable building a custom session selector dialog]), |
||||
enable_session_selector=$enableval,enable_session_selector=no) |
||||
|
||||
AM_CONDITIONAL(BUILD_SESSION_SELECTOR, |
||||
[test "$enable_session_selector" = yes]) |
||||
|
||||
if test "$enable_session_selector" = yes; then |
||||
- PKG_CHECK_MODULES(SESSION_SELECTOR, gtk+-3.0 gio-2.0 dbus-glib-1 >= $DBUS_GLIB_REQUIRED) |
||||
+ PKG_CHECK_MODULES(SESSION_SELECTOR, gtk+-3.0 gio-2.0) |
||||
fi |
||||
|
||||
dnl ==================================================================== |
||||
dnl Dependency Checks |
||||
dnl ==================================================================== |
||||
|
||||
dnl Standard vertical stacks |
||||
PKG_CHECK_MODULES(GIO, gio-2.0) |
||||
PKG_CHECK_MODULES(GIOUNIX, gio-unix-2.0 >= $GLIB_REQUIRED) |
||||
PKG_CHECK_MODULES(GTK3, gtk+-3.0 >= $GTK3_REQUIRED) |
||||
|
||||
PKG_CHECK_MODULES(GNOME_SESSION, |
||||
glib-2.0 >= $GLIB_REQUIRED |
||||
gio-2.0 >= $GLIB_REQUIRED |
||||
json-glib-1.0 >= $JSON_GLIB_REQUIRED |
||||
gnome-desktop-3.0 >= $GNOME_DESKTOP_REQUIRED |
||||
) |
||||
|
||||
dnl We can only support old upower |
||||
dnl https://bugzilla.gnome.org/show_bug.cgi?id=710383 |
||||
PKG_CHECK_MODULES(UPOWER, upower-glib < 0.99.0, have_old_upower=yes, have_old_upower=no) |
||||
AS_IF([test x$have_old_upower = xyes], [ |
||||
AC_DEFINE([HAVE_OLD_UPOWER], [1], [Define if we have an older upower]) |
||||
]) |
||||
AM_CONDITIONAL(HAVE_OLD_UPOWER, test x$have_old_upower = xyes) |
||||
|
||||
PKG_CHECK_MODULES(SESSION_PROPERTIES, |
||||
glib-2.0 >= $GLIB_REQUIRED |
||||
gtk+-3.0 >= $GTK3_REQUIRED |
||||
) |
||||
diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c |
||||
index 135392fd..29c3054d 100644 |
||||
--- a/gnome-session/gsm-manager.c |
||||
+++ b/gnome-session/gsm-manager.c |
||||
@@ -1210,78 +1210,78 @@ _client_request_save (GsmClient *client, |
||||
|
||||
error = NULL; |
||||
ret = gsm_client_request_save (client, data->flags, &error); |
||||
if (ret) { |
||||
g_debug ("GsmManager: adding client to query clients: %s", gsm_client_peek_id (client)); |
||||
data->manager->priv->query_clients = g_slist_prepend (data->manager->priv->query_clients, |
||||
client); |
||||
} else if (error) { |
||||
g_debug ("GsmManager: unable to query client: %s", error->message); |
||||
g_error_free (error); |
||||
} |
||||
|
||||
return FALSE; |
||||
} |
||||
|
||||
static gboolean |
||||
_client_request_save_helper (const char *id, |
||||
GsmClient *client, |
||||
ClientEndSessionData *data) |
||||
{ |
||||
return _client_request_save (client, data); |
||||
} |
||||
|
||||
static void |
||||
fail_pending_save_invocations (GsmManager *manager, |
||||
GError *error) |
||||
{ |
||||
GSList *l; |
||||
|
||||
for (l = manager->priv->pending_save_invocations; l != NULL; l = l->next) { |
||||
- DBusGMethodInvocation *context = l->data; |
||||
+ GDBusMethodInvocation *invocation = l->data; |
||||
|
||||
- dbus_g_method_return_error (context, error); |
||||
+ g_dbus_method_invocation_return_gerror (invocation, error); |
||||
} |
||||
|
||||
g_slist_free (manager->priv->pending_save_invocations); |
||||
manager->priv->pending_save_invocations = NULL; |
||||
} |
||||
|
||||
static void |
||||
finish_pending_save_invocations (GsmManager *manager) |
||||
{ |
||||
GSList *l; |
||||
|
||||
for (l = manager->priv->pending_save_invocations; l != NULL; l = l->next) { |
||||
- DBusGMethodInvocation *context = l->data; |
||||
+ GDBusMethodInvocation *invocation = l->data; |
||||
|
||||
- dbus_g_method_return (context); |
||||
+ g_dbus_method_invocation_return_value (invocation, NULL); |
||||
} |
||||
|
||||
g_slist_free (manager->priv->pending_save_invocations); |
||||
manager->priv->pending_save_invocations = NULL; |
||||
} |
||||
|
||||
static void |
||||
query_save_session_complete (GsmManager *manager) |
||||
{ |
||||
GError *error = NULL; |
||||
|
||||
if (g_slist_length (manager->priv->next_query_clients) > 0) { |
||||
ClientEndSessionData data; |
||||
|
||||
data.manager = manager; |
||||
data.flags = GSM_CLIENT_END_SESSION_FLAG_LAST; |
||||
|
||||
g_slist_foreach (manager->priv->next_query_clients, |
||||
(GFunc)_client_request_save, |
||||
&data); |
||||
|
||||
g_slist_free (manager->priv->next_query_clients); |
||||
manager->priv->next_query_clients = NULL; |
||||
|
||||
return; |
||||
} |
||||
|
||||
if (manager->priv->query_timeout_id > 0) { |
||||
g_source_remove (manager->priv->query_timeout_id); |
||||
manager->priv->query_timeout_id = 0; |
||||
@@ -2790,96 +2790,96 @@ gsm_manager_initialization_error (GsmExportedManager *skeleton, |
||||
{ |
||||
if (manager->priv->phase != GSM_MANAGER_PHASE_INITIALIZATION) { |
||||
g_dbus_method_invocation_return_error (invocation, |
||||
GSM_MANAGER_ERROR, |
||||
GSM_MANAGER_ERROR_NOT_IN_INITIALIZATION, |
||||
"InitializationError interface is only available during the Initialization phase"); |
||||
return TRUE; |
||||
} |
||||
|
||||
gsm_util_init_error (fatal, "%s", message); |
||||
gsm_exported_manager_complete_initialization_error (skeleton, invocation); |
||||
|
||||
return TRUE; |
||||
} |
||||
|
||||
static void |
||||
user_logout (GsmManager *manager, |
||||
GsmManagerLogoutMode mode) |
||||
{ |
||||
if (manager->priv->phase >= GSM_MANAGER_PHASE_QUERY_END_SESSION) { |
||||
manager->priv->logout_mode = mode; |
||||
end_session_or_show_shell_dialog (manager); |
||||
return; |
||||
} |
||||
|
||||
request_logout (manager, mode); |
||||
} |
||||
|
||||
gboolean |
||||
gsm_manager_save_session (GsmManager *manager, |
||||
- DBusGMethodInvocation *context) |
||||
+ GDBusMethodInvocation *invocation) |
||||
{ |
||||
ClientEndSessionData data; |
||||
GError *error; |
||||
|
||||
g_debug ("GsmManager: SaveSession called"); |
||||
|
||||
g_return_val_if_fail (GSM_IS_MANAGER (manager), FALSE); |
||||
|
||||
if (manager->priv->phase != GSM_MANAGER_PHASE_RUNNING) { |
||||
error = g_error_new (GSM_MANAGER_ERROR, |
||||
GSM_MANAGER_ERROR_NOT_IN_RUNNING, |
||||
"SaveSession interface is only available during the Running phase"); |
||||
- dbus_g_method_return_error (context, error); |
||||
+ g_dbus_method_invocation_return_gerror (invocation, error); |
||||
g_error_free (error); |
||||
return FALSE; |
||||
} |
||||
|
||||
data.manager = manager; |
||||
data.flags = 0; |
||||
gsm_store_foreach (manager->priv->clients, |
||||
(GsmStoreFunc)_client_request_save_helper, |
||||
&data); |
||||
|
||||
if (manager->priv->query_clients) { |
||||
manager->priv->query_timeout_id = g_timeout_add_seconds (GSM_MANAGER_SAVE_SESSION_TIMEOUT, |
||||
(GSourceFunc)_on_query_save_session_timeout, |
||||
manager); |
||||
|
||||
manager->priv->pending_save_invocations = g_slist_prepend (manager->priv->pending_save_invocations, |
||||
- context); |
||||
+ invocation); |
||||
|
||||
return TRUE; |
||||
} else { |
||||
g_debug ("GsmManager: Nothing to save"); |
||||
- dbus_g_method_return (context); |
||||
+ g_dbus_method_invocation_return_value (invocation, NULL); |
||||
return TRUE; |
||||
} |
||||
|
||||
return TRUE; |
||||
} |
||||
|
||||
gboolean |
||||
gsm_manager_logout (GsmManager *manager, |
||||
guint logout_mode, |
||||
GError **error) |
||||
{ |
||||
if (manager->priv->phase < GSM_MANAGER_PHASE_RUNNING) { |
||||
g_set_error (error, |
||||
GSM_MANAGER_ERROR, |
||||
GSM_MANAGER_ERROR_NOT_IN_RUNNING, |
||||
"Logout interface is only available after the Running phase starts"); |
||||
return FALSE; |
||||
} |
||||
|
||||
if (_log_out_is_locked_down (manager)) { |
||||
g_set_error (error, |
||||
GSM_MANAGER_ERROR, |
||||
GSM_MANAGER_ERROR_LOCKED_DOWN, |
||||
"Logout has been locked down"); |
||||
return FALSE; |
||||
} |
||||
|
||||
switch (logout_mode) { |
||||
case GSM_MANAGER_LOGOUT_MODE_NORMAL: |
||||
case GSM_MANAGER_LOGOUT_MODE_NO_CONFIRMATION: |
||||
diff --git a/gnome-session/gsm-manager.h b/gnome-session/gsm-manager.h |
||||
index fcf36019..88a88ccc 100644 |
||||
--- a/gnome-session/gsm-manager.h |
||||
+++ b/gnome-session/gsm-manager.h |
||||
@@ -1,54 +1,55 @@ |
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- |
||||
* |
||||
* Copyright (C) 2008 William Jon McCann <jmccann@redhat.com> |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation; either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
*/ |
||||
|
||||
|
||||
#ifndef __GSM_MANAGER_H |
||||
#define __GSM_MANAGER_H |
||||
|
||||
#include <glib-object.h> |
||||
+#include <gio/gio.h> |
||||
|
||||
#include "gsm-store.h" |
||||
#include "gsm-manager-logout-mode.h" |
||||
|
||||
G_BEGIN_DECLS |
||||
|
||||
#define GSM_TYPE_MANAGER (gsm_manager_get_type ()) |
||||
#define GSM_MANAGER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSM_TYPE_MANAGER, GsmManager)) |
||||
#define GSM_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GSM_TYPE_MANAGER, GsmManagerClass)) |
||||
#define GSM_IS_MANAGER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSM_TYPE_MANAGER)) |
||||
#define GSM_IS_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GSM_TYPE_MANAGER)) |
||||
#define GSM_MANAGER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GSM_TYPE_MANAGER, GsmManagerClass)) |
||||
|
||||
typedef struct GsmManagerPrivate GsmManagerPrivate; |
||||
|
||||
typedef struct |
||||
{ |
||||
GObject parent; |
||||
GsmManagerPrivate *priv; |
||||
} GsmManager; |
||||
|
||||
typedef struct |
||||
{ |
||||
GObjectClass parent_class; |
||||
|
||||
void (* phase_changed) (GsmManager *manager, |
||||
const char *phase); |
||||
} GsmManagerClass; |
||||
|
||||
typedef enum { |
||||
@@ -98,42 +99,42 @@ GType gsm_manager_get_type (void); |
||||
GsmManager * gsm_manager_new (GsmStore *client_store, |
||||
gboolean failsafe); |
||||
GsmManager * gsm_manager_get (void); |
||||
|
||||
gboolean gsm_manager_get_failsafe (GsmManager *manager); |
||||
|
||||
gboolean gsm_manager_add_autostart_app (GsmManager *manager, |
||||
const char *path, |
||||
const char *provides); |
||||
gboolean gsm_manager_add_required_app (GsmManager *manager, |
||||
const char *path, |
||||
const char *provides); |
||||
gboolean gsm_manager_add_autostart_apps_from_dir (GsmManager *manager, |
||||
const char *path); |
||||
gboolean gsm_manager_add_legacy_session_apps (GsmManager *manager, |
||||
const char *path); |
||||
|
||||
void gsm_manager_start (GsmManager *manager); |
||||
|
||||
const char * _gsm_manager_get_default_session (GsmManager *manager); |
||||
char * _gsm_manager_get_saved_session (GsmManager *manager); |
||||
|
||||
void _gsm_manager_set_active_session (GsmManager *manager, |
||||
const char *session_name, |
||||
gboolean is_fallback); |
||||
|
||||
void _gsm_manager_set_renderer (GsmManager *manager, |
||||
const char *renderer); |
||||
|
||||
gboolean gsm_manager_save_session (GsmManager *manager, |
||||
- DBusGMethodInvocation *context); |
||||
+ GDBusMethodInvocation *context); |
||||
|
||||
gboolean gsm_manager_logout (GsmManager *manager, |
||||
guint logout_mode, |
||||
GError **error); |
||||
|
||||
gboolean gsm_manager_set_phase (GsmManager *manager, |
||||
GsmManagerPhase phase); |
||||
|
||||
G_END_DECLS |
||||
|
||||
#endif /* __GSM_MANAGER_H */ |
||||
diff --git a/tools/gnome-session-selector.c b/tools/gnome-session-selector.c |
||||
index a41cd260..6ad307b0 100644 |
||||
--- a/tools/gnome-session-selector.c |
||||
+++ b/tools/gnome-session-selector.c |
||||
@@ -7,63 +7,60 @@ |
||||
* the Free Software Foundation; either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>. |
||||
* |
||||
* Written by: Matthias Clasen <mclasen@redhat.com> |
||||
*/ |
||||
|
||||
#include "config.h" |
||||
|
||||
#include <fcntl.h> |
||||
#include <stdlib.h> |
||||
#include <string.h> |
||||
#include <sys/types.h> |
||||
#include <sys/stat.h> |
||||
#include <unistd.h> |
||||
|
||||
#include <glib.h> |
||||
#include <gtk/gtk.h> |
||||
#include <gio/gio.h> |
||||
|
||||
#include <glib/gi18n.h> |
||||
#include <glib/gstdio.h> |
||||
|
||||
-#include <dbus/dbus-glib.h> |
||||
-#include <dbus/dbus-glib-lowlevel.h> |
||||
- |
||||
#define GSM_SERVICE_DBUS "org.gnome.SessionManager" |
||||
#define GSM_PATH_DBUS "/org/gnome/SessionManager" |
||||
#define GSM_INTERFACE_DBUS "org.gnome.SessionManager" |
||||
|
||||
#define GSM_MANAGER_SCHEMA "org.gnome.SessionManager" |
||||
#define KEY_AUTOSAVE_ONE_SHOT "auto-save-session-one-shot" |
||||
#define DEFAULT_SESSION_NAME "gnome-classic" |
||||
|
||||
static GtkBuilder *builder; |
||||
static GtkWidget *session_list; |
||||
static GtkListStore *store; |
||||
static GtkTreeModelSort *sort_model; |
||||
static char *info_text; |
||||
|
||||
static void select_session (const char *name); |
||||
static gboolean make_session_current (const char *name); |
||||
|
||||
static char * |
||||
get_session_path (const char *name) |
||||
{ |
||||
return g_build_filename (g_get_user_config_dir (), "gnome-session", name, NULL); |
||||
} |
||||
|
||||
static char * |
||||
find_new_session_name (void) |
||||
{ |
||||
char *name; |
||||
char *path; |
||||
int i; |
||||
|
||||
@@ -694,86 +691,93 @@ on_row_activated (GtkTreeView *tree_view, |
||||
gtk_main_quit (); |
||||
} |
||||
|
||||
static void |
||||
auto_save_next_session (void) |
||||
{ |
||||
GSettings *settings; |
||||
|
||||
settings = g_settings_new (GSM_MANAGER_SCHEMA); |
||||
g_settings_set_boolean (settings, KEY_AUTOSAVE_ONE_SHOT, TRUE); |
||||
g_object_unref (settings); |
||||
} |
||||
|
||||
static void |
||||
auto_save_next_session_if_needed (void) |
||||
{ |
||||
char *marker; |
||||
|
||||
marker = g_build_filename (g_get_user_config_dir (), |
||||
"gnome-session", "saved-session", |
||||
".new-session", NULL); |
||||
|
||||
if (g_file_test (marker, G_FILE_TEST_EXISTS)) { |
||||
auto_save_next_session (); |
||||
unlink (marker); |
||||
} |
||||
g_free (marker); |
||||
} |
||||
|
||||
static void |
||||
-save_session (void) |
||||
+session_saved_cb (GDBusConnection *conn, |
||||
+ GAsyncResult *result) |
||||
{ |
||||
- DBusGConnection *conn; |
||||
- DBusGProxy *proxy; |
||||
- GError *error; |
||||
+ GVariant *reply; |
||||
|
||||
- conn = dbus_g_bus_get (DBUS_BUS_SESSION, NULL); |
||||
- if (conn == NULL) { |
||||
- g_warning ("Could not connect to the session bus"); |
||||
- return; |
||||
- } |
||||
+ reply = g_dbus_connection_call_finish (conn, result, NULL); |
||||
|
||||
- proxy = dbus_g_proxy_new_for_name (conn, GSM_SERVICE_DBUS, GSM_PATH_DBUS, GSM_INTERFACE_DBUS); |
||||
- if (proxy == NULL) { |
||||
- g_warning ("Could not connect to the session manager"); |
||||
- return; |
||||
- } |
||||
+ g_variant_unref (reply); |
||||
+} |
||||
|
||||
- error = NULL; |
||||
- if (!dbus_g_proxy_call (proxy, "SaveSession", &error, G_TYPE_INVALID, G_TYPE_INVALID)) { |
||||
- g_warning ("Failed to save session: %s", error->message); |
||||
- g_error_free (error); |
||||
+static void |
||||
+save_session (void) |
||||
+{ |
||||
+ GDBusConnection *conn; |
||||
+ |
||||
+ conn = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); |
||||
+ if (conn == NULL) { |
||||
return; |
||||
} |
||||
|
||||
- g_object_unref (proxy); |
||||
+ g_dbus_connection_call (conn, |
||||
+ GSM_SERVICE_DBUS, |
||||
+ GSM_PATH_DBUS, |
||||
+ GSM_INTERFACE_DBUS, |
||||
+ "SaveSession", |
||||
+ NULL, |
||||
+ NULL, |
||||
+ G_DBUS_CALL_FLAGS_NONE, |
||||
+ -1, |
||||
+ NULL, |
||||
+ (GAsyncReadyCallback) |
||||
+ session_saved_cb, |
||||
+ NULL); |
||||
} |
||||
|
||||
static int |
||||
compare_sessions (GtkTreeModel *model, |
||||
GtkTreeIter *a, |
||||
GtkTreeIter *b, |
||||
gpointer data) |
||||
{ |
||||
char *name_a, *name_b; |
||||
int result; |
||||
|
||||
gtk_tree_model_get (model, a, 0, &name_a, -1); |
||||
gtk_tree_model_get (model, b, 0, &name_b, -1); |
||||
|
||||
result = g_utf8_collate (name_a, name_b); |
||||
|
||||
g_free (name_a); |
||||
g_free (name_b); |
||||
|
||||
return result; |
||||
} |
||||
|
||||
static void |
||||
on_map (GtkWidget *widget, |
||||
gpointer data) |
||||
{ |
||||
gdk_window_focus (gtk_widget_get_window (widget), GDK_CURRENT_TIME); |
||||
} |
||||
|
||||
int |
||||
-- |
||||
2.14.2 |
||||
|
@ -0,0 +1,91 @@
@@ -0,0 +1,91 @@
|
||||
From 0dfb463e126353b17d0c6ec63b99f10bae3fd919 Mon Sep 17 00:00:00 2001 |
||||
From: Ray Strode <rstrode@redhat.com> |
||||
Date: Mon, 27 Mar 2017 15:34:51 -0400 |
||||
Subject: [PATCH 19/19] capplet: fix disable check items |
||||
|
||||
An optimzation that tries to prevent transient desktop files from |
||||
accumulating in the user's homedirectory inadvertently broke the |
||||
ability for a user to disable startup applications. |
||||
|
||||
This commit restores the broken functionality. |
||||
--- |
||||
capplet/gsp-app.c | 9 +++++---- |
||||
1 file changed, 5 insertions(+), 4 deletions(-) |
||||
|
||||
diff --git a/capplet/gsp-app.c b/capplet/gsp-app.c |
||||
index 123ab217..1a0580e6 100644 |
||||
--- a/capplet/gsp-app.c |
||||
+++ b/capplet/gsp-app.c |
||||
@@ -315,64 +315,65 @@ _gsp_app_user_equal_system (GspApp *app, |
||||
char *str = NULL; |
||||
GKeyFile *keyfile = NULL; |
||||
GDesktopAppInfo *app_info = NULL; |
||||
|
||||
manager = gsp_app_manager_get (); |
||||
system_dir = gsp_app_manager_get_dir (manager, |
||||
app->priv->xdg_system_position); |
||||
g_object_unref (manager); |
||||
if (!system_dir) { |
||||
goto out; |
||||
} |
||||
|
||||
path = g_build_filename (system_dir, app->priv->basename, NULL); |
||||
|
||||
keyfile = g_key_file_new (); |
||||
if (!g_key_file_load_from_file (keyfile, path, G_KEY_FILE_NONE, NULL)) { |
||||
goto out; |
||||
} |
||||
|
||||
app_info = g_desktop_app_info_new_from_keyfile (keyfile); |
||||
|
||||
if (!app_info) { |
||||
goto out; |
||||
} |
||||
|
||||
if (g_desktop_app_info_get_is_hidden (app_info)) { |
||||
goto out; |
||||
} |
||||
|
||||
if (g_desktop_app_info_has_key (app_info, |
||||
- GSP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLED) && |
||||
- !g_desktop_app_info_get_boolean (app_info, |
||||
- GSP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLED)) { |
||||
- goto out; |
||||
+ GSP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLED)) { |
||||
+ if (app->priv->enabled != g_desktop_app_info_get_boolean (app_info, GSP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLED)) |
||||
+ goto out; |
||||
+ } else if (!app->priv->enabled) { |
||||
+ goto out; |
||||
} |
||||
|
||||
if (!g_desktop_app_info_get_show_in (app_info, NULL)) { |
||||
goto out; |
||||
} |
||||
|
||||
if (g_desktop_app_info_get_nodisplay (app_info)) { |
||||
goto out; |
||||
} |
||||
|
||||
str = gsp_key_file_get_locale_string (keyfile, |
||||
G_KEY_FILE_DESKTOP_KEY_NAME); |
||||
if (!_gsp_str_equal (str, app->priv->name)) { |
||||
goto out; |
||||
} |
||||
g_clear_pointer (&str, g_free); |
||||
|
||||
str = gsp_key_file_get_locale_string (keyfile, |
||||
G_KEY_FILE_DESKTOP_KEY_COMMENT); |
||||
if (!_gsp_str_equal (str, app->priv->comment)) { |
||||
goto out; |
||||
} |
||||
g_clear_pointer (&str, g_free); |
||||
|
||||
str = gsp_key_file_get_string (keyfile, |
||||
G_KEY_FILE_DESKTOP_KEY_EXEC); |
||||
if (!_gsp_str_equal (str, app->priv->exec)) { |
||||
goto out; |
||||
} |
||||
g_clear_pointer (&str, g_free); |
||||
-- |
||||
2.14.2 |
||||
|
@ -0,0 +1,52 @@
@@ -0,0 +1,52 @@
|
||||
From b524466482c9c64c11a55fb5d0174080471a1d5a Mon Sep 17 00:00:00 2001 |
||||
From: Adam Williamson <awilliam@redhat.com> |
||||
Date: Fri, 8 May 2015 16:41:38 -0400 |
||||
Subject: [PATCH] blacklist NV30 adapter on nouveau until #745202 is fixed |
||||
|
||||
--- |
||||
data/hardware-compatibility | 3 +++ |
||||
1 file changed, 3 insertions(+) |
||||
|
||||
diff --git a/data/hardware-compatibility b/data/hardware-compatibility |
||||
index 48b7946..3daef68 100644 |
||||
--- a/data/hardware-compatibility |
||||
+++ b/data/hardware-compatibility |
||||
@@ -1,32 +1,35 @@ |
||||
## |
||||
## This file contains a list of blacklist/whitelist regular expressions for |
||||
## renderer strings. |
||||
## |
||||
## The regular expressions are case-insensitive POSIX Extended Regular |
||||
## Expressions. See regex(7) for details. |
||||
## |
||||
## Syntax: |
||||
## - Comment lines start with '#' |
||||
## - Lines starting with '+' are whitelisting. |
||||
## - Lines starting with '-' are blacklisting. |
||||
## - Lines not starting with '#', '+', '-' are ignored. |
||||
## |
||||
|
||||
# Intel 830-865 |
||||
-Intel\(R\) 8[[:digit:]]{2,2}[^[:digit:]] |
||||
|
||||
# Intel IGD |
||||
-Intel IGD |
||||
|
||||
# Pre-R300 radeon |
||||
-Mesa DRI R[12]00[^[:digit:]] |
||||
-Mesa DRI R[12]00$ |
||||
|
||||
+# NV30 family on Nouveau: https://bugzilla.redhat.com/show_bug.cgi?id=745202 |
||||
+-Gallium .* on NV3[0-9A-F]$ |
||||
+ |
||||
# Old Mesa software GL renderer |
||||
-software rasterizer |
||||
|
||||
# Gallium has softpipe; we explicitly enable llvmpipe |
||||
-softpipe |
||||
|
||||
# nouveau vieux NV25 doesn't work too well |
||||
-Mesa DRI nv25 |
||||
-- |
||||
2.3.7 |
||||
|
@ -0,0 +1,56 @@
@@ -0,0 +1,56 @@
|
||||
From 69c18aa6324e7d3fd6f93ea7a79ce99bed1a452d Mon Sep 17 00:00:00 2001 |
||||
From: Adam Jackson <ajax@redhat.com> |
||||
Date: Fri, 8 May 2015 16:46:47 -0400 |
||||
Subject: [PATCH] Allow running on the classic software renderer |
||||
|
||||
No effect on arches where we build llvmpipe, |
||||
but on ppc/s390 classic swrast is marginally |
||||
less painful than softpipe. |
||||
--- |
||||
data/hardware-compatibility | 2 +- |
||||
1 file changed, 1 insertion(+), 1 deletion(-) |
||||
|
||||
diff --git a/data/hardware-compatibility b/data/hardware-compatibility |
||||
index 3daef68..fd06230 100644 |
||||
--- a/data/hardware-compatibility |
||||
+++ b/data/hardware-compatibility |
||||
@@ -1,35 +1,35 @@ |
||||
## |
||||
## This file contains a list of blacklist/whitelist regular expressions for |
||||
## renderer strings. |
||||
## |
||||
## The regular expressions are case-insensitive POSIX Extended Regular |
||||
## Expressions. See regex(7) for details. |
||||
## |
||||
## Syntax: |
||||
## - Comment lines start with '#' |
||||
## - Lines starting with '+' are whitelisting. |
||||
## - Lines starting with '-' are blacklisting. |
||||
## - Lines not starting with '#', '+', '-' are ignored. |
||||
## |
||||
|
||||
# Intel 830-865 |
||||
-Intel\(R\) 8[[:digit:]]{2,2}[^[:digit:]] |
||||
|
||||
# Intel IGD |
||||
-Intel IGD |
||||
|
||||
# Pre-R300 radeon |
||||
-Mesa DRI R[12]00[^[:digit:]] |
||||
-Mesa DRI R[12]00$ |
||||
|
||||
# NV30 family on Nouveau: https://bugzilla.redhat.com/show_bug.cgi?id=745202 |
||||
-Gallium .* on NV3[0-9A-F]$ |
||||
|
||||
# Old Mesa software GL renderer |
||||
--software rasterizer |
||||
+#software rasterizer |
||||
|
||||
# Gallium has softpipe; we explicitly enable llvmpipe |
||||
-softpipe |
||||
|
||||
# nouveau vieux NV25 doesn't work too well |
||||
-Mesa DRI nv25 |
||||
-- |
||||
2.3.7 |
||||
|
Loading…
Reference in new issue