1
From 195ab8780148446950c17d736dbb05492be4a9a5 Mon Sep 17 00:00:00 2001
2
From: Tim Lunn <tim@feathertop.org>
3
Date: Sat, 3 Mar 2018 10:15:04 +1100
4
Subject: [PATCH] Revert "Remove gnome-session-properties"
6
This reverts commits ea285af9 and 0c6fe6ca and ports the build to meson.
8
https://bugzilla.gnome.org/show_bug.cgi?id=708923
9
https://bugzilla.gnome.org/show_bug.cgi?id=766836
11
Ubuntu note: .png icons were also removed but they aren't as important
12
as svg icons. .png icons don't fit in a quilt patch.
14
capplet/gsm-app-dialog.c | 540 ++++++++++
15
capplet/gsm-app-dialog.h | 66 ++
16
capplet/gsm-properties-dialog.c | 774 ++++++++++++++
17
capplet/gsm-properties-dialog.h | 57 +
18
capplet/gsp-app-manager.c | 593 ++++++++++
19
capplet/gsp-app-manager.h | 81 ++
20
capplet/gsp-app.c | 1129 ++++++++++++++++++++
21
capplet/gsp-app.h | 108 ++
22
capplet/gsp-keyfile.c | 207 ++++
23
capplet/gsp-keyfile.h | 65 ++
24
capplet/main.c | 108 ++
25
capplet/meson.build | 36 +
26
data/gnome-session-properties.desktop.in | 14 +
27
data/icons/16x16/session-properties.svg | 394 +++++++
28
data/icons/22x22/session-properties.svg | 440 ++++++++
29
data/icons/32x32/session-properties.svg | 490 +++++++++
30
data/icons/scalable/session-properties.svg | 515 +++++++++
31
.../icons/symbolic/session-properties-symbolic.svg | 28 +
32
data/meson.build | 23 +
33
data/session-properties.ui | 303 ++++++
34
doc/man/gnome-session-properties.1 | 24 +
35
doc/man/gnome-session.1 | 2 +
36
doc/man/meson.build | 3 +-
39
po/POTFILES.skip | 1 +
40
26 files changed, 6015 insertions(+), 1 deletion(-)
41
create mode 100644 capplet/gsm-app-dialog.c
42
create mode 100644 capplet/gsm-app-dialog.h
43
create mode 100644 capplet/gsm-properties-dialog.c
44
create mode 100644 capplet/gsm-properties-dialog.h
45
create mode 100644 capplet/gsp-app-manager.c
46
create mode 100644 capplet/gsp-app-manager.h
47
create mode 100644 capplet/gsp-app.c
48
create mode 100644 capplet/gsp-app.h
49
create mode 100644 capplet/gsp-keyfile.c
50
create mode 100644 capplet/gsp-keyfile.h
51
create mode 100644 capplet/main.c
52
create mode 100644 capplet/meson.build
53
create mode 100644 data/gnome-session-properties.desktop.in
54
create mode 100644 data/icons/16x16/session-properties.svg
55
create mode 100644 data/icons/22x22/session-properties.svg
56
create mode 100644 data/icons/32x32/session-properties.svg
57
create mode 100644 data/icons/scalable/session-properties.svg
58
create mode 100644 data/icons/symbolic/session-properties-symbolic.svg
59
create mode 100644 data/session-properties.ui
60
create mode 100644 doc/man/gnome-session-properties.1
62
Index: gnome-session-3.28.0/capplet/gsm-app-dialog.c
63
===================================================================
65
+++ gnome-session-3.28.0/capplet/gsm-app-dialog.c
67
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
69
+ * Copyright (C) 2008 William Jon McCann <jmccann@redhat.com>
71
+ * This program is free software; you can redistribute it and/or modify
72
+ * it under the terms of the GNU General Public License as published by
73
+ * the Free Software Foundation; either version 2 of the License, or
74
+ * (at your option) any later version.
76
+ * This program is distributed in the hope that it will be useful,
77
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
78
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
79
+ * GNU General Public License for more details.
81
+ * You should have received a copy of the GNU General Public License
82
+ * along with this program; if not, write to the Free Software
83
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
90
+#include <glib/gi18n.h>
93
+#include "gsm-util.h"
95
+#include "gsm-app-dialog.h"
97
+#define GTKBUILDER_FILE "session-properties.ui"
99
+#define CAPPLET_NAME_ENTRY_WIDGET_NAME "session_properties_name_entry"
100
+#define CAPPLET_COMMAND_ENTRY_WIDGET_NAME "session_properties_command_entry"
101
+#define CAPPLET_COMMENT_ENTRY_WIDGET_NAME "session_properties_comment_entry"
102
+#define CAPPLET_BROWSE_WIDGET_NAME "session_properties_browse_button"
105
+#define GSM_APP_DIALOG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSM_TYPE_APP_DIALOG, GsmAppDialogPrivate))
107
+struct GsmAppDialogPrivate
109
+ GtkWidget *name_entry;
110
+ GtkWidget *command_entry;
111
+ GtkWidget *comment_entry;
112
+ GtkWidget *browse_button;
118
+static void gsm_app_dialog_class_init (GsmAppDialogClass *klass);
119
+static void gsm_app_dialog_init (GsmAppDialog *app_dialog);
120
+static void gsm_app_dialog_finalize (GObject *object);
129
+G_DEFINE_TYPE (GsmAppDialog, gsm_app_dialog, GTK_TYPE_DIALOG)
132
+make_exec_uri (const char *exec)
137
+ if (exec == NULL) {
138
+ return g_strdup ("");
141
+ if (strchr (exec, ' ') == NULL) {
142
+ return g_strdup (exec);
145
+ str = g_string_new_len (NULL, strlen (exec));
147
+ str = g_string_append_c (str, '"');
148
+ for (c = exec; *c != '\0'; c++) {
149
+ /* FIXME: GKeyFile will add an additional backslach so we'll
150
+ * end up with toto\\" instead of toto\"
151
+ * We could use g_key_file_set_value(), but then we don't
152
+ * benefit from the other escaping that glib is doing...
155
+ str = g_string_append (str, "\\\"");
157
+ str = g_string_append_c (str, *c);
160
+ str = g_string_append_c (str, '"');
162
+ return g_string_free (str, FALSE);
166
+on_browse_button_clicked (GtkWidget *widget,
167
+ GsmAppDialog *dialog)
169
+ GtkWidget *chooser;
172
+ chooser = gtk_file_chooser_dialog_new ("",
173
+ GTK_WINDOW (dialog),
174
+ GTK_FILE_CHOOSER_ACTION_OPEN,
176
+ GTK_RESPONSE_CANCEL,
178
+ GTK_RESPONSE_ACCEPT,
181
+ gtk_window_set_transient_for (GTK_WINDOW (chooser),
182
+ GTK_WINDOW (dialog));
184
+ gtk_window_set_destroy_with_parent (GTK_WINDOW (chooser), TRUE);
186
+ gtk_window_set_title (GTK_WINDOW (chooser), _("Select Command"));
188
+ gtk_widget_show (chooser);
190
+ response = gtk_dialog_run (GTK_DIALOG (chooser));
192
+ if (response == GTK_RESPONSE_ACCEPT) {
196
+ text = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser));
198
+ uri = make_exec_uri (text);
202
+ gtk_entry_set_text (GTK_ENTRY (dialog->priv->command_entry), uri);
207
+ gtk_widget_destroy (chooser);
211
+on_entry_activate (GtkEntry *entry,
212
+ GsmAppDialog *dialog)
214
+ gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
218
+setup_dialog (GsmAppDialog *dialog)
220
+ GtkWidget *content_area;
225
+ xml = gtk_builder_new ();
226
+ gtk_builder_set_translation_domain (xml, GETTEXT_PACKAGE);
229
+ if (!gtk_builder_add_from_file (xml,
230
+ GTKBUILDER_DIR "/" GTKBUILDER_FILE,
233
+ g_warning ("Could not load capplet UI file: %s",
235
+ g_error_free (error);
237
+ g_warning ("Could not load capplet UI file.");
241
+ content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
242
+ widget = GTK_WIDGET (gtk_builder_get_object (xml, "main-table"));
243
+ gtk_container_add (GTK_CONTAINER (content_area), widget);
245
+ gtk_container_set_border_width (GTK_CONTAINER (dialog), 6);
246
+ gtk_window_set_icon_name (GTK_WINDOW (dialog), "session-properties");
248
+ g_object_set (dialog,
249
+ "allow-shrink", FALSE,
250
+ "allow-grow", FALSE,
253
+ gtk_dialog_add_button (GTK_DIALOG (dialog),
254
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
256
+ if (dialog->priv->name == NULL
257
+ && dialog->priv->command == NULL
258
+ && dialog->priv->comment == NULL) {
259
+ gtk_window_set_title (GTK_WINDOW (dialog), _("Add Startup Program"));
260
+ gtk_dialog_add_button (GTK_DIALOG (dialog),
261
+ GTK_STOCK_ADD, GTK_RESPONSE_OK);
263
+ gtk_window_set_title (GTK_WINDOW (dialog), _("Edit Startup Program"));
264
+ gtk_dialog_add_button (GTK_DIALOG (dialog),
265
+ GTK_STOCK_SAVE, GTK_RESPONSE_OK);
268
+ dialog->priv->name_entry = GTK_WIDGET (gtk_builder_get_object (xml, CAPPLET_NAME_ENTRY_WIDGET_NAME));
269
+ g_signal_connect (dialog->priv->name_entry,
271
+ G_CALLBACK (on_entry_activate),
273
+ if (dialog->priv->name != NULL) {
274
+ gtk_entry_set_text (GTK_ENTRY (dialog->priv->name_entry), dialog->priv->name);
277
+ dialog->priv->browse_button = GTK_WIDGET (gtk_builder_get_object (xml, CAPPLET_BROWSE_WIDGET_NAME));
278
+ g_signal_connect (dialog->priv->browse_button,
280
+ G_CALLBACK (on_browse_button_clicked),
283
+ dialog->priv->command_entry = GTK_WIDGET (gtk_builder_get_object (xml, CAPPLET_COMMAND_ENTRY_WIDGET_NAME));
284
+ g_signal_connect (dialog->priv->command_entry,
286
+ G_CALLBACK (on_entry_activate),
288
+ if (dialog->priv->command != NULL) {
289
+ gtk_entry_set_text (GTK_ENTRY (dialog->priv->command_entry), dialog->priv->command);
292
+ dialog->priv->comment_entry = GTK_WIDGET (gtk_builder_get_object (xml, CAPPLET_COMMENT_ENTRY_WIDGET_NAME));
293
+ g_signal_connect (dialog->priv->comment_entry,
295
+ G_CALLBACK (on_entry_activate),
297
+ if (dialog->priv->comment != NULL) {
298
+ gtk_entry_set_text (GTK_ENTRY (dialog->priv->comment_entry), dialog->priv->comment);
302
+ g_object_unref (xml);
307
+gsm_app_dialog_constructor (GType type,
308
+ guint n_construct_app,
309
+ GObjectConstructParam *construct_app)
311
+ GsmAppDialog *dialog;
313
+ dialog = GSM_APP_DIALOG (G_OBJECT_CLASS (gsm_app_dialog_parent_class)->constructor (type,
317
+ setup_dialog (dialog);
319
+ gtk_widget_show_all (GTK_WIDGET (dialog));
321
+ return G_OBJECT (dialog);
325
+gsm_app_dialog_dispose (GObject *object)
327
+ GsmAppDialog *dialog;
329
+ g_return_if_fail (object != NULL);
330
+ g_return_if_fail (GSM_IS_APP_DIALOG (object));
332
+ dialog = GSM_APP_DIALOG (object);
334
+ g_free (dialog->priv->name);
335
+ dialog->priv->name = NULL;
336
+ g_free (dialog->priv->command);
337
+ dialog->priv->command = NULL;
338
+ g_free (dialog->priv->comment);
339
+ dialog->priv->comment = NULL;
341
+ G_OBJECT_CLASS (gsm_app_dialog_parent_class)->dispose (object);
345
+gsm_app_dialog_set_name (GsmAppDialog *dialog,
348
+ g_return_if_fail (GSM_IS_APP_DIALOG (dialog));
350
+ g_free (dialog->priv->name);
352
+ dialog->priv->name = g_strdup (name);
353
+ g_object_notify (G_OBJECT (dialog), "name");
357
+gsm_app_dialog_set_command (GsmAppDialog *dialog,
360
+ g_return_if_fail (GSM_IS_APP_DIALOG (dialog));
362
+ g_free (dialog->priv->command);
364
+ dialog->priv->command = g_strdup (name);
365
+ g_object_notify (G_OBJECT (dialog), "command");
369
+gsm_app_dialog_set_comment (GsmAppDialog *dialog,
372
+ g_return_if_fail (GSM_IS_APP_DIALOG (dialog));
374
+ g_free (dialog->priv->comment);
376
+ dialog->priv->comment = g_strdup (name);
377
+ g_object_notify (G_OBJECT (dialog), "comment");
381
+gsm_app_dialog_get_name (GsmAppDialog *dialog)
383
+ g_return_val_if_fail (GSM_IS_APP_DIALOG (dialog), NULL);
384
+ return gtk_entry_get_text (GTK_ENTRY (dialog->priv->name_entry));
388
+gsm_app_dialog_get_command (GsmAppDialog *dialog)
390
+ g_return_val_if_fail (GSM_IS_APP_DIALOG (dialog), NULL);
391
+ return gtk_entry_get_text (GTK_ENTRY (dialog->priv->command_entry));
395
+gsm_app_dialog_get_comment (GsmAppDialog *dialog)
397
+ g_return_val_if_fail (GSM_IS_APP_DIALOG (dialog), NULL);
398
+ return gtk_entry_get_text (GTK_ENTRY (dialog->priv->comment_entry));
402
+gsm_app_dialog_set_property (GObject *object,
404
+ const GValue *value,
407
+ GsmAppDialog *dialog = GSM_APP_DIALOG (object);
411
+ gsm_app_dialog_set_name (dialog, g_value_get_string (value));
414
+ gsm_app_dialog_set_command (dialog, g_value_get_string (value));
417
+ gsm_app_dialog_set_comment (dialog, g_value_get_string (value));
420
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
426
+gsm_app_dialog_get_property (GObject *object,
431
+ GsmAppDialog *dialog = GSM_APP_DIALOG (object);
435
+ g_value_set_string (value, dialog->priv->name);
438
+ g_value_set_string (value, dialog->priv->command);
441
+ g_value_set_string (value, dialog->priv->comment);
444
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
450
+gsm_app_dialog_class_init (GsmAppDialogClass *klass)
452
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
454
+ object_class->get_property = gsm_app_dialog_get_property;
455
+ object_class->set_property = gsm_app_dialog_set_property;
456
+ object_class->constructor = gsm_app_dialog_constructor;
457
+ object_class->dispose = gsm_app_dialog_dispose;
458
+ object_class->finalize = gsm_app_dialog_finalize;
460
+ g_object_class_install_property (object_class,
462
+ g_param_spec_string ("name",
466
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
467
+ g_object_class_install_property (object_class,
469
+ g_param_spec_string ("command",
473
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
474
+ g_object_class_install_property (object_class,
476
+ g_param_spec_string ("comment",
480
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
482
+ g_type_class_add_private (klass, sizeof (GsmAppDialogPrivate));
486
+gsm_app_dialog_init (GsmAppDialog *dialog)
489
+ dialog->priv = GSM_APP_DIALOG_GET_PRIVATE (dialog);
493
+gsm_app_dialog_finalize (GObject *object)
495
+ GsmAppDialog *dialog;
497
+ g_return_if_fail (object != NULL);
498
+ g_return_if_fail (GSM_IS_APP_DIALOG (object));
500
+ dialog = GSM_APP_DIALOG (object);
502
+ g_return_if_fail (dialog->priv != NULL);
504
+ G_OBJECT_CLASS (gsm_app_dialog_parent_class)->finalize (object);
508
+gsm_app_dialog_new (const char *name,
509
+ const char *command,
510
+ const char *comment)
514
+ object = g_object_new (GSM_TYPE_APP_DIALOG,
516
+ "command", command,
517
+ "comment", comment,
520
+ return GTK_WIDGET (object);
524
+gsm_app_dialog_run (GsmAppDialog *dialog,
533
+ while (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) {
536
+ const char *comment;
537
+ const char *error_msg;
542
+ name = gsm_app_dialog_get_name (GSM_APP_DIALOG (dialog));
543
+ exec = gsm_app_dialog_get_command (GSM_APP_DIALOG (dialog));
544
+ comment = gsm_app_dialog_get_comment (GSM_APP_DIALOG (dialog));
549
+ if (gsm_util_text_is_blank (exec)) {
550
+ error_msg = _("The startup command cannot be empty");
552
+ if (!g_shell_parse_argv (exec, &argc, &argv, &error)) {
553
+ if (error != NULL) {
554
+ error_msg = error->message;
556
+ error_msg = _("The startup command is not valid");
561
+ if (error_msg != NULL) {
564
+ msgbox = gtk_message_dialog_new (GTK_WINDOW (dialog),
570
+ if (error != NULL) {
571
+ g_error_free (error);
574
+ gtk_dialog_run (GTK_DIALOG (msgbox));
576
+ gtk_widget_destroy (msgbox);
581
+ if (gsm_util_text_is_blank (name)) {
586
+ *name_p = g_strdup (name);
592
+ *command_p = g_strdup (exec);
596
+ *comment_p = g_strdup (comment);
603
+ gtk_widget_destroy (GTK_WIDGET (dialog));
607
Index: gnome-session-3.28.0/capplet/gsm-app-dialog.h
608
===================================================================
610
+++ gnome-session-3.28.0/capplet/gsm-app-dialog.h
612
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
614
+ * Copyright (C) 2008 William Jon McCann <jmccann@redhat.com>
616
+ * This program is free software; you can redistribute it and/or modify
617
+ * it under the terms of the GNU General Public License as published by
618
+ * the Free Software Foundation; either version 2 of the License, or
619
+ * (at your option) any later version.
621
+ * This program is distributed in the hope that it will be useful,
622
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
623
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
624
+ * GNU General Public License for more details.
626
+ * You should have received a copy of the GNU General Public License
627
+ * along with this program; if not, write to the Free Software
628
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
632
+#ifndef __GSM_APP_DIALOG_H
633
+#define __GSM_APP_DIALOG_H
635
+#include <glib-object.h>
636
+#include <gtk/gtk.h>
640
+#define GSM_TYPE_APP_DIALOG (gsm_app_dialog_get_type ())
641
+#define GSM_APP_DIALOG(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSM_TYPE_APP_DIALOG, GsmAppDialog))
642
+#define GSM_APP_DIALOG_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GSM_TYPE_APP_DIALOG, GsmAppDialogClass))
643
+#define GSM_IS_APP_DIALOG(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSM_TYPE_APP_DIALOG))
644
+#define GSM_IS_APP_DIALOG_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GSM_TYPE_APP_DIALOG))
645
+#define GSM_APP_DIALOG_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GSM_TYPE_APP_DIALOG, GsmAppDialogClass))
647
+typedef struct GsmAppDialogPrivate GsmAppDialogPrivate;
652
+ GsmAppDialogPrivate *priv;
657
+ GtkDialogClass parent_class;
658
+} GsmAppDialogClass;
660
+GType gsm_app_dialog_get_type (void);
662
+GtkWidget * gsm_app_dialog_new (const char *name,
663
+ const char *command,
664
+ const char *comment);
666
+gboolean gsm_app_dialog_run (GsmAppDialog *dialog,
671
+const char * gsm_app_dialog_get_name (GsmAppDialog *dialog);
672
+const char * gsm_app_dialog_get_command (GsmAppDialog *dialog);
673
+const char * gsm_app_dialog_get_comment (GsmAppDialog *dialog);
677
+#endif /* __GSM_APP_DIALOG_H */
678
Index: gnome-session-3.28.0/capplet/gsm-properties-dialog.c
679
===================================================================
681
+++ gnome-session-3.28.0/capplet/gsm-properties-dialog.c
683
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
685
+ * Copyright (C) 1999 Free Software Foundation, Inc.
686
+ * Copyright (C) 2007 Vincent Untz.
687
+ * Copyright (C) 2008 Lucas Rocha.
688
+ * Copyright (C) 2008 William Jon McCann <jmccann@redhat.com>
690
+ * This program is free software; you can redistribute it and/or modify
691
+ * it under the terms of the GNU General Public License as published by
692
+ * the Free Software Foundation; either version 2 of the License, or
693
+ * (at your option) any later version.
695
+ * This program is distributed in the hope that it will be useful,
696
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
697
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
698
+ * GNU General Public License for more details.
700
+ * You should have received a copy of the GNU General Public License
701
+ * along with this program; if not, write to the Free Software
702
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
709
+#include <glib/gi18n.h>
710
+#include <gtk/gtk.h>
712
+#include "gsm-properties-dialog.h"
713
+#include "gsm-app-dialog.h"
714
+#include "gsm-util.h"
715
+#include "gsp-app.h"
716
+#include "gsp-app-manager.h"
718
+#define GSM_PROPERTIES_DIALOG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSM_TYPE_PROPERTIES_DIALOG, GsmPropertiesDialogPrivate))
720
+#define GTKBUILDER_FILE "session-properties.ui"
722
+#define CAPPLET_TREEVIEW_WIDGET_NAME "session_properties_treeview"
723
+#define CAPPLET_ADD_WIDGET_NAME "session_properties_add_button"
724
+#define CAPPLET_DELETE_WIDGET_NAME "session_properties_delete_button"
725
+#define CAPPLET_EDIT_WIDGET_NAME "session_properties_edit_button"
726
+#define CAPPLET_SAVE_WIDGET_NAME "session_properties_save_button"
727
+#define CAPPLET_REMEMBER_WIDGET_NAME "session_properties_remember_toggle"
729
+#define STARTUP_APP_ICON "system-run"
731
+#define SPC_SETTINGS_SCHEMA "org.gnome.SessionManager"
732
+#define SPC_SETTINGS_AUTOSAVE_KEY "auto-save-session"
734
+struct GsmPropertiesDialogPrivate
737
+ GtkListStore *list_store;
738
+ GtkTreeModel *tree_filter;
740
+ GtkTreeView *treeview;
741
+ GtkWidget *add_button;
742
+ GtkWidget *delete_button;
743
+ GtkWidget *edit_button;
745
+ GSettings *settings;
747
+ GspAppManager *manager;
751
+ STORE_COL_VISIBLE = 0,
754
+ STORE_COL_DESCRIPTION,
760
+static void gsm_properties_dialog_class_init (GsmPropertiesDialogClass *klass);
761
+static void gsm_properties_dialog_init (GsmPropertiesDialog *properties_dialog);
762
+static void gsm_properties_dialog_finalize (GObject *object);
764
+G_DEFINE_TYPE (GsmPropertiesDialog, gsm_properties_dialog, GTK_TYPE_DIALOG)
767
+find_by_app (GtkTreeModel *model,
771
+ GspApp *iter_app = NULL;
773
+ if (!gtk_tree_model_get_iter_first (model, iter)) {
778
+ gtk_tree_model_get (model, iter,
779
+ STORE_COL_APP, &iter_app,
782
+ if (iter_app == app) {
783
+ g_object_unref (iter_app);
786
+ } while (gtk_tree_model_iter_next (model, iter));
792
+_fill_iter_from_app (GtkListStore *list_store,
801
+ const char *description;
802
+ const char *app_name;
804
+ hidden = gsp_app_get_hidden (app);
805
+ display = gsp_app_get_display (app);
806
+ enabled = gsp_app_get_enabled (app);
807
+ shown = gsp_app_get_shown (app);
808
+ icon = gsp_app_get_icon (app);
809
+ description = gsp_app_get_description (app);
810
+ app_name = gsp_app_get_name (app);
812
+ if (G_IS_THEMED_ICON (icon)) {
813
+ GtkIconTheme *theme;
814
+ const char * const *icon_names;
816
+ theme = gtk_icon_theme_get_default ();
817
+ icon_names = g_themed_icon_get_names (G_THEMED_ICON (icon));
818
+ if (icon_names[0] == NULL ||
819
+ !gtk_icon_theme_has_icon (theme, icon_names[0])) {
820
+ g_object_unref (icon);
823
+ } else if (G_IS_FILE_ICON (icon)) {
826
+ iconfile = g_file_icon_get_file (G_FILE_ICON (icon));
827
+ if (!g_file_query_exists (iconfile, NULL)) {
828
+ g_object_unref (icon);
833
+ if (icon == NULL) {
834
+ icon = g_themed_icon_new (STARTUP_APP_ICON);
837
+ gtk_list_store_set (list_store, iter,
838
+ STORE_COL_VISIBLE, !hidden && shown && display,
839
+ STORE_COL_ENABLED, enabled,
840
+ STORE_COL_GICON, icon,
841
+ STORE_COL_DESCRIPTION, description,
842
+ STORE_COL_APP, app,
843
+ STORE_COL_SEARCH, app_name,
845
+ g_object_unref (icon);
849
+_app_changed (GsmPropertiesDialog *dialog,
854
+ if (!find_by_app (GTK_TREE_MODEL (dialog->priv->list_store),
859
+ _fill_iter_from_app (dialog->priv->list_store, &iter, app);
863
+append_app (GsmPropertiesDialog *dialog,
868
+ gtk_list_store_append (dialog->priv->list_store, &iter);
869
+ _fill_iter_from_app (dialog->priv->list_store, &iter, app);
871
+ g_signal_connect_swapped (app, "changed",
872
+ G_CALLBACK (_app_changed), dialog);
876
+_app_added (GsmPropertiesDialog *dialog,
878
+ GspAppManager *manager)
880
+ append_app (dialog, app);
884
+_app_removed (GsmPropertiesDialog *dialog,
886
+ GspAppManager *manager)
890
+ if (!find_by_app (GTK_TREE_MODEL (dialog->priv->list_store),
895
+ g_signal_handlers_disconnect_by_func (app,
898
+ gtk_list_store_remove (dialog->priv->list_store, &iter);
902
+populate_model (GsmPropertiesDialog *dialog)
907
+ apps = gsp_app_manager_get_apps (dialog->priv->manager);
908
+ for (l = apps; l != NULL; l = l->next) {
909
+ append_app (dialog, GSP_APP (l->data));
911
+ g_slist_free (apps);
915
+on_selection_changed (GtkTreeSelection *selection,
916
+ GsmPropertiesDialog *dialog)
920
+ sel = gtk_tree_selection_get_selected (selection, NULL, NULL);
922
+ gtk_widget_set_sensitive (dialog->priv->edit_button, sel);
923
+ gtk_widget_set_sensitive (dialog->priv->delete_button, sel);
927
+on_startup_enabled_toggled (GtkCellRendererToggle *cell_renderer,
929
+ GsmPropertiesDialog *dialog)
935
+ if (!gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (dialog->priv->tree_filter),
941
+ gtk_tree_model_get (GTK_TREE_MODEL (dialog->priv->tree_filter),
943
+ STORE_COL_APP, &app,
946
+ active = gtk_cell_renderer_toggle_get_active (cell_renderer);
950
+ gsp_app_set_enabled (app, active);
951
+ g_object_unref (app);
956
+on_drag_data_received (GtkWidget *widget,
957
+ GdkDragContext *drag_context,
960
+ GtkSelectionData *data,
963
+ GsmPropertiesDialog *dialog)
965
+ gboolean dnd_success;
967
+ dnd_success = FALSE;
969
+ if (data != NULL) {
973
+ filenames = gtk_selection_data_get_uris (data);
975
+ for (i = 0; filenames[i] && filenames[i][0]; i++) {
976
+ /* Return success if at least one file succeeded */
977
+ gboolean file_success;
978
+ file_success = gsp_app_copy_desktop_file (filenames[i]);
979
+ dnd_success = dnd_success || file_success;
982
+ g_strfreev (filenames);
985
+ gtk_drag_finish (drag_context, dnd_success, FALSE, time);
986
+ g_signal_stop_emission_by_name (widget, "drag_data_received");
990
+on_drag_begin (GtkWidget *widget,
991
+ GdkDragContext *context,
992
+ GsmPropertiesDialog *dialog)
998
+ gtk_tree_view_get_cursor (GTK_TREE_VIEW (widget), &path, NULL);
999
+ gtk_tree_model_get_iter (GTK_TREE_MODEL (dialog->priv->tree_filter),
1001
+ gtk_tree_path_free (path);
1003
+ gtk_tree_model_get (GTK_TREE_MODEL (dialog->priv->tree_filter),
1005
+ STORE_COL_APP, &app,
1009
+ g_object_set_data_full (G_OBJECT (context), "gsp-app",
1010
+ g_object_ref (app), g_object_unref);
1011
+ g_object_unref (app);
1017
+on_drag_data_get (GtkWidget *widget,
1018
+ GdkDragContext *context,
1019
+ GtkSelectionData *selection_data,
1022
+ GsmPropertiesDialog *dialog)
1026
+ app = g_object_get_data (G_OBJECT (context), "gsp-app");
1028
+ const char *uris[2];
1031
+ uri = g_filename_to_uri (gsp_app_get_path (app), NULL, NULL);
1035
+ gtk_selection_data_set_uris (selection_data, (char **) uris);
1042
+on_add_app_clicked (GtkWidget *widget,
1043
+ GsmPropertiesDialog *dialog)
1045
+ GtkWidget *add_dialog;
1050
+ add_dialog = gsm_app_dialog_new (NULL, NULL, NULL);
1051
+ gtk_window_set_transient_for (GTK_WINDOW (add_dialog),
1052
+ GTK_WINDOW (dialog));
1054
+ if (gsm_app_dialog_run (GSM_APP_DIALOG (add_dialog),
1055
+ &name, &exec, &comment)) {
1056
+ gsp_app_create (name, comment, exec);
1064
+on_delete_app_clicked (GtkWidget *widget,
1065
+ GsmPropertiesDialog *dialog)
1067
+ GtkTreeSelection *selection;
1071
+ selection = gtk_tree_view_get_selection (dialog->priv->treeview);
1073
+ if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
1078
+ gtk_tree_model_get (GTK_TREE_MODEL (dialog->priv->tree_filter),
1080
+ STORE_COL_APP, &app,
1084
+ gsp_app_delete (app);
1085
+ g_object_unref (app);
1090
+on_edit_app_clicked (GtkWidget *widget,
1091
+ GsmPropertiesDialog *dialog)
1093
+ GtkTreeSelection *selection;
1097
+ selection = gtk_tree_view_get_selection (dialog->priv->treeview);
1099
+ if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
1104
+ gtk_tree_model_get (GTK_TREE_MODEL (dialog->priv->tree_filter),
1106
+ STORE_COL_APP, &app,
1110
+ GtkWidget *edit_dialog;
1115
+ edit_dialog = gsm_app_dialog_new (gsp_app_get_name (app),
1116
+ gsp_app_get_exec (app),
1117
+ gsp_app_get_comment (app));
1118
+ gtk_window_set_transient_for (GTK_WINDOW (edit_dialog),
1119
+ GTK_WINDOW (dialog));
1121
+ if (gsm_app_dialog_run (GSM_APP_DIALOG (edit_dialog),
1122
+ &name, &exec, &comment)) {
1123
+ gsp_app_update (app, name, comment, exec);
1129
+ g_object_unref (app);
1134
+on_row_activated (GtkTreeView *tree_view,
1135
+ GtkTreePath *path,
1136
+ GtkTreeViewColumn *column,
1137
+ GsmPropertiesDialog *dialog)
1139
+ on_edit_app_clicked (NULL, dialog);
1143
+on_save_session_clicked (GtkWidget *widget,
1144
+ GsmPropertiesDialog *dialog)
1146
+ g_debug ("Session saving is not implemented yet!");
1150
+setup_dialog (GsmPropertiesDialog *dialog)
1152
+ GtkTreeView *treeview;
1153
+ GtkWidget *button;
1154
+ GtkTreeModel *tree_filter;
1155
+ GtkTreeViewColumn *column;
1156
+ GtkCellRenderer *renderer;
1157
+ GtkTreeSelection *selection;
1158
+ GtkTargetList *targetlist;
1160
+ gtk_dialog_add_buttons (GTK_DIALOG (dialog),
1161
+ GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
1164
+ dialog->priv->list_store = gtk_list_store_new (NUMBER_OF_COLUMNS,
1171
+ tree_filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (dialog->priv->list_store),
1173
+ g_object_unref (dialog->priv->list_store);
1174
+ dialog->priv->tree_filter = tree_filter;
1176
+ gtk_tree_model_filter_set_visible_column (GTK_TREE_MODEL_FILTER (tree_filter),
1177
+ STORE_COL_VISIBLE);
1179
+ treeview = GTK_TREE_VIEW (gtk_builder_get_object (dialog->priv->xml,
1180
+ CAPPLET_TREEVIEW_WIDGET_NAME));
1181
+ dialog->priv->treeview = treeview;
1183
+ gtk_tree_view_set_model (treeview, tree_filter);
1184
+ g_object_unref (tree_filter);
1186
+ gtk_tree_view_set_headers_visible (treeview, FALSE);
1187
+ g_signal_connect (treeview,
1189
+ G_CALLBACK (on_row_activated),
1192
+ selection = gtk_tree_view_get_selection (treeview);
1193
+ gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
1194
+ g_signal_connect (selection,
1196
+ G_CALLBACK (on_selection_changed),
1199
+ /* CHECKBOX COLUMN */
1200
+ renderer = gtk_cell_renderer_toggle_new ();
1201
+ column = gtk_tree_view_column_new_with_attributes (_("Enabled"),
1203
+ "active", STORE_COL_ENABLED,
1205
+ gtk_tree_view_append_column (treeview, column);
1206
+ g_signal_connect (renderer,
1208
+ G_CALLBACK (on_startup_enabled_toggled),
1212
+ renderer = gtk_cell_renderer_pixbuf_new ();
1213
+ column = gtk_tree_view_column_new_with_attributes (_("Icon"),
1215
+ "gicon", STORE_COL_GICON,
1216
+ "sensitive", STORE_COL_ENABLED,
1218
+ g_object_set (renderer,
1219
+ "stock-size", GSM_PROPERTIES_ICON_SIZE,
1221
+ gtk_tree_view_append_column (treeview, column);
1224
+ renderer = gtk_cell_renderer_text_new ();
1225
+ column = gtk_tree_view_column_new_with_attributes (_("Program"),
1227
+ "markup", STORE_COL_DESCRIPTION,
1228
+ "sensitive", STORE_COL_ENABLED,
1230
+ g_object_set (renderer,
1231
+ "ellipsize", PANGO_ELLIPSIZE_END,
1233
+ gtk_tree_view_append_column (treeview, column);
1236
+ gtk_tree_view_column_set_sort_column_id (column, STORE_COL_DESCRIPTION);
1237
+ gtk_tree_view_set_search_column (treeview, STORE_COL_SEARCH);
1238
+ gtk_tree_view_set_rules_hint (treeview, TRUE);
1240
+ gtk_tree_view_enable_model_drag_source (treeview,
1241
+ GDK_BUTTON1_MASK|GDK_BUTTON2_MASK,
1244
+ gtk_drag_source_add_uri_targets (GTK_WIDGET (treeview));
1246
+ gtk_drag_dest_set (GTK_WIDGET (treeview),
1247
+ GTK_DEST_DEFAULT_ALL,
1251
+ gtk_drag_dest_add_uri_targets (GTK_WIDGET (treeview));
1252
+ /* we don't want to accept drags coming from this widget */
1253
+ targetlist = gtk_drag_dest_get_target_list (GTK_WIDGET (treeview));
1254
+ if (targetlist != NULL) {
1255
+ GtkTargetEntry *targets;
1259
+ targets = gtk_target_table_new_from_list (targetlist, &n_targets);
1260
+ for (i = 0; i < n_targets; i++)
1261
+ targets[i].flags = GTK_TARGET_OTHER_WIDGET;
1263
+ targetlist = gtk_target_list_new (targets, n_targets);
1264
+ gtk_drag_dest_set_target_list (GTK_WIDGET (treeview), targetlist);
1265
+ gtk_target_list_unref (targetlist);
1267
+ gtk_target_table_free (targets, n_targets);
1270
+ g_signal_connect (treeview, "drag_begin",
1271
+ G_CALLBACK (on_drag_begin),
1273
+ g_signal_connect (treeview, "drag_data_get",
1274
+ G_CALLBACK (on_drag_data_get),
1276
+ g_signal_connect (treeview, "drag_data_received",
1277
+ G_CALLBACK (on_drag_data_received),
1280
+ gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (dialog->priv->list_store),
1281
+ STORE_COL_DESCRIPTION,
1282
+ GTK_SORT_ASCENDING);
1285
+ button = GTK_WIDGET (gtk_builder_get_object (dialog->priv->xml,
1286
+ CAPPLET_ADD_WIDGET_NAME));
1287
+ dialog->priv->add_button = button;
1288
+ g_signal_connect (button,
1290
+ G_CALLBACK (on_add_app_clicked),
1293
+ button = GTK_WIDGET (gtk_builder_get_object (dialog->priv->xml,
1294
+ CAPPLET_DELETE_WIDGET_NAME));
1295
+ dialog->priv->delete_button = button;
1296
+ g_signal_connect (button,
1298
+ G_CALLBACK (on_delete_app_clicked),
1301
+ button = GTK_WIDGET (gtk_builder_get_object (dialog->priv->xml,
1302
+ CAPPLET_EDIT_WIDGET_NAME));
1303
+ dialog->priv->edit_button = button;
1304
+ g_signal_connect (button,
1306
+ G_CALLBACK (on_edit_app_clicked),
1309
+ button = GTK_WIDGET (gtk_builder_get_object (dialog->priv->xml,
1310
+ CAPPLET_REMEMBER_WIDGET_NAME));
1311
+ g_settings_bind (dialog->priv->settings, SPC_SETTINGS_AUTOSAVE_KEY,
1312
+ button, "active", G_SETTINGS_BIND_DEFAULT);
1314
+ button = GTK_WIDGET (gtk_builder_get_object (dialog->priv->xml,
1315
+ CAPPLET_SAVE_WIDGET_NAME));
1316
+ g_signal_connect (button,
1318
+ G_CALLBACK (on_save_session_clicked),
1321
+ dialog->priv->manager = gsp_app_manager_get ();
1322
+ gsp_app_manager_fill (dialog->priv->manager);
1323
+ g_signal_connect_swapped (dialog->priv->manager, "added",
1324
+ G_CALLBACK (_app_added), dialog);
1325
+ g_signal_connect_swapped (dialog->priv->manager, "removed",
1326
+ G_CALLBACK (_app_removed), dialog);
1328
+ populate_model (dialog);
1332
+gsm_properties_dialog_constructor (GType type,
1333
+ guint n_construct_properties,
1334
+ GObjectConstructParam *construct_properties)
1336
+ GsmPropertiesDialog *dialog;
1338
+ dialog = GSM_PROPERTIES_DIALOG (G_OBJECT_CLASS (gsm_properties_dialog_parent_class)->constructor (type,
1339
+ n_construct_properties,
1340
+ construct_properties));
1342
+ setup_dialog (dialog);
1344
+ gtk_widget_show (GTK_WIDGET (dialog));
1346
+ return G_OBJECT (dialog);
1350
+gsm_properties_dialog_dispose (GObject *object)
1352
+ GsmPropertiesDialog *dialog;
1354
+ g_return_if_fail (object != NULL);
1355
+ g_return_if_fail (GSM_IS_PROPERTIES_DIALOG (object));
1357
+ dialog = GSM_PROPERTIES_DIALOG (object);
1359
+ if (dialog->priv->xml != NULL) {
1360
+ g_object_unref (dialog->priv->xml);
1361
+ dialog->priv->xml = NULL;
1364
+ if (dialog->priv->settings != NULL) {
1365
+ g_object_unref (dialog->priv->settings);
1366
+ dialog->priv->settings = NULL;
1369
+ G_OBJECT_CLASS (gsm_properties_dialog_parent_class)->dispose (object);
1371
+ /* it's important to do this after chaining to the parent dispose
1372
+ * method because we want to make sure the treeview has been disposed
1373
+ * and removed all its references to GspApp objects */
1374
+ if (dialog->priv->manager != NULL) {
1375
+ g_object_unref (dialog->priv->manager);
1376
+ dialog->priv->manager = NULL;
1381
+gsm_properties_dialog_class_init (GsmPropertiesDialogClass *klass)
1383
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
1385
+ object_class->constructor = gsm_properties_dialog_constructor;
1386
+ object_class->dispose = gsm_properties_dialog_dispose;
1387
+ object_class->finalize = gsm_properties_dialog_finalize;
1389
+ g_type_class_add_private (klass, sizeof (GsmPropertiesDialogPrivate));
1393
+gsm_properties_dialog_init (GsmPropertiesDialog *dialog)
1395
+ GtkWidget *content_area;
1396
+ GtkWidget *widget;
1399
+ dialog->priv = GSM_PROPERTIES_DIALOG_GET_PRIVATE (dialog);
1401
+ dialog->priv->settings = g_settings_new (SPC_SETTINGS_SCHEMA);
1403
+ dialog->priv->xml = gtk_builder_new ();
1404
+ gtk_builder_set_translation_domain (dialog->priv->xml, GETTEXT_PACKAGE);
1407
+ if (!gtk_builder_add_from_file (dialog->priv->xml,
1408
+ GTKBUILDER_DIR "/" GTKBUILDER_FILE,
1411
+ g_warning ("Could not load capplet UI file: %s",
1413
+ g_error_free (error);
1415
+ g_warning ("Could not load capplet UI file.");
1419
+ content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
1420
+ widget = GTK_WIDGET (gtk_builder_get_object (dialog->priv->xml,
1421
+ "main-notebook"));
1422
+ gtk_box_pack_start (GTK_BOX (content_area), widget, TRUE, TRUE, 0);
1424
+ gtk_window_set_default_size (GTK_WINDOW (dialog), 600, 450);
1425
+ gtk_window_set_resizable (GTK_WINDOW (dialog), TRUE);
1426
+ gtk_container_set_border_width (GTK_CONTAINER (dialog), 6);
1427
+ gtk_box_set_spacing (GTK_BOX (content_area), 2);
1428
+ gtk_window_set_icon_name (GTK_WINDOW (dialog), "session-properties");
1429
+ gtk_window_set_title (GTK_WINDOW (dialog), _("Startup Applications Preferences"));
1433
+gsm_properties_dialog_finalize (GObject *object)
1435
+ GsmPropertiesDialog *dialog;
1437
+ g_return_if_fail (object != NULL);
1438
+ g_return_if_fail (GSM_IS_PROPERTIES_DIALOG (object));
1440
+ dialog = GSM_PROPERTIES_DIALOG (object);
1442
+ g_return_if_fail (dialog->priv != NULL);
1444
+ G_OBJECT_CLASS (gsm_properties_dialog_parent_class)->finalize (object);
1448
+gsm_properties_dialog_new (void)
1452
+ object = g_object_new (GSM_TYPE_PROPERTIES_DIALOG,
1455
+ return GTK_WIDGET (object);
1457
Index: gnome-session-3.28.0/capplet/gsm-properties-dialog.h
1458
===================================================================
1460
+++ gnome-session-3.28.0/capplet/gsm-properties-dialog.h
1462
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
1464
+ * Copyright (C) 2008 William Jon McCann <jmccann@redhat.com>
1466
+ * This program is free software; you can redistribute it and/or modify
1467
+ * it under the terms of the GNU General Public License as published by
1468
+ * the Free Software Foundation; either version 2 of the License, or
1469
+ * (at your option) any later version.
1471
+ * This program is distributed in the hope that it will be useful,
1472
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
1473
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1474
+ * GNU General Public License for more details.
1476
+ * You should have received a copy of the GNU General Public License
1477
+ * along with this program; if not, write to the Free Software
1478
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
1482
+#ifndef __GSM_PROPERTIES_DIALOG_H
1483
+#define __GSM_PROPERTIES_DIALOG_H
1485
+#include <glib-object.h>
1486
+#include <gtk/gtk.h>
1490
+#define GSM_TYPE_PROPERTIES_DIALOG (gsm_properties_dialog_get_type ())
1491
+#define GSM_PROPERTIES_DIALOG(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSM_TYPE_PROPERTIES_DIALOG, GsmPropertiesDialog))
1492
+#define GSM_PROPERTIES_DIALOG_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GSM_TYPE_PROPERTIES_DIALOG, GsmPropertiesDialogClass))
1493
+#define GSM_IS_PROPERTIES_DIALOG(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSM_TYPE_PROPERTIES_DIALOG))
1494
+#define GSM_IS_PROPERTIES_DIALOG_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GSM_TYPE_PROPERTIES_DIALOG))
1495
+#define GSM_PROPERTIES_DIALOG_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GSM_TYPE_PROPERTIES_DIALOG, GsmPropertiesDialogClass))
1497
+typedef struct GsmPropertiesDialogPrivate GsmPropertiesDialogPrivate;
1502
+ GsmPropertiesDialogPrivate *priv;
1503
+} GsmPropertiesDialog;
1507
+ GtkDialogClass parent_class;
1508
+} GsmPropertiesDialogClass;
1510
+GType gsm_properties_dialog_get_type (void);
1512
+GtkWidget * gsm_properties_dialog_new (void);
1514
+#define GSM_PROPERTIES_ICON_SIZE GTK_ICON_SIZE_LARGE_TOOLBAR
1518
+#endif /* __GSM_PROPERTIES_DIALOG_H */
1519
Index: gnome-session-3.28.0/capplet/gsp-app-manager.c
1520
===================================================================
1522
+++ gnome-session-3.28.0/capplet/gsp-app-manager.c
1524
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
1526
+ * Copyright (C) 1999 Free Software Foundation, Inc.
1527
+ * Copyright (C) 2007, 2009 Vincent Untz.
1528
+ * Copyright (C) 2008 Lucas Rocha.
1529
+ * Copyright (C) 2008 William Jon McCann <jmccann@redhat.com>
1531
+ * This program is free software; you can redistribute it and/or modify
1532
+ * it under the terms of the GNU General Public License as published by
1533
+ * the Free Software Foundation; either version 2 of the License, or
1534
+ * (at your option) any later version.
1536
+ * This program is distributed in the hope that it will be useful,
1537
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
1538
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1539
+ * GNU General Public License for more details.
1541
+ * You should have received a copy of the GNU General Public License
1542
+ * along with this program; if not, write to the Free Software
1543
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
1547
+#include <string.h>
1549
+#include "gsm-util.h"
1550
+#include "gsp-app.h"
1552
+#include "gsp-app-manager.h"
1554
+static GspAppManager *manager = NULL;
1559
+ GFileMonitor *monitor;
1562
+struct _GspAppManagerPrivate {
1567
+#define GSP_APP_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSP_TYPE_APP_MANAGER, GspAppManagerPrivate))
1576
+static guint gsp_app_manager_signals[LAST_SIGNAL] = { 0 };
1579
+G_DEFINE_TYPE (GspAppManager, gsp_app_manager, G_TYPE_OBJECT)
1581
+static void gsp_app_manager_dispose (GObject *object);
1582
+static void gsp_app_manager_finalize (GObject *object);
1583
+static void _gsp_app_manager_app_unref (GspApp *app,
1584
+ GspAppManager *manager);
1585
+static void _gsp_app_manager_app_removed (GspAppManager *manager,
1589
+_gsp_xdg_dir_new (const char *dir,
1592
+ GspXdgDir *xdgdir;
1594
+ xdgdir = g_slice_new (GspXdgDir);
1596
+ xdgdir->dir = g_strdup (dir);
1597
+ xdgdir->index = index;
1598
+ xdgdir->monitor = NULL;
1604
+_gsp_xdg_dir_free (GspXdgDir *xdgdir)
1606
+ if (xdgdir->dir) {
1607
+ g_free (xdgdir->dir);
1608
+ xdgdir->dir = NULL;
1611
+ if (xdgdir->monitor) {
1612
+ g_file_monitor_cancel (xdgdir->monitor);
1613
+ g_object_unref (xdgdir->monitor);
1614
+ xdgdir->monitor = NULL;
1617
+ g_slice_free (GspXdgDir, xdgdir);
1621
+gsp_app_manager_class_init (GspAppManagerClass *class)
1623
+ GObjectClass *gobject_class = G_OBJECT_CLASS (class);
1625
+ gobject_class->dispose = gsp_app_manager_dispose;
1626
+ gobject_class->finalize = gsp_app_manager_finalize;
1628
+ gsp_app_manager_signals[ADDED] =
1629
+ g_signal_new ("added",
1630
+ G_TYPE_FROM_CLASS (gobject_class),
1631
+ G_SIGNAL_RUN_LAST,
1632
+ G_STRUCT_OFFSET (GspAppManagerClass,
1636
+ g_cclosure_marshal_VOID__OBJECT,
1637
+ G_TYPE_NONE, 1, G_TYPE_OBJECT);
1639
+ gsp_app_manager_signals[REMOVED] =
1640
+ g_signal_new ("removed",
1641
+ G_TYPE_FROM_CLASS (gobject_class),
1642
+ G_SIGNAL_RUN_LAST,
1643
+ G_STRUCT_OFFSET (GspAppManagerClass,
1647
+ g_cclosure_marshal_VOID__OBJECT,
1648
+ G_TYPE_NONE, 1, G_TYPE_OBJECT);
1650
+ g_type_class_add_private (class, sizeof (GspAppManagerPrivate));
1654
+gsp_app_manager_init (GspAppManager *manager)
1656
+ manager->priv = GSP_APP_MANAGER_GET_PRIVATE (manager);
1658
+ memset (manager->priv, 0, sizeof (GspAppManagerPrivate));
1662
+gsp_app_manager_dispose (GObject *object)
1664
+ GspAppManager *manager;
1666
+ g_return_if_fail (object != NULL);
1667
+ g_return_if_fail (GSP_IS_APP_MANAGER (object));
1669
+ manager = GSP_APP_MANAGER (object);
1671
+ /* we unref GspApp objects in dispose since they might need to
1672
+ * reference us during their dispose/finalize */
1673
+ g_slist_foreach (manager->priv->apps,
1674
+ (GFunc) _gsp_app_manager_app_unref, manager);
1675
+ g_slist_free (manager->priv->apps);
1676
+ manager->priv->apps = NULL;
1678
+ G_OBJECT_CLASS (gsp_app_manager_parent_class)->dispose (object);
1682
+gsp_app_manager_finalize (GObject *object)
1684
+ GspAppManager *manager;
1686
+ g_return_if_fail (object != NULL);
1687
+ g_return_if_fail (GSP_IS_APP_MANAGER (object));
1689
+ manager = GSP_APP_MANAGER (object);
1691
+ g_slist_foreach (manager->priv->dirs,
1692
+ (GFunc) _gsp_xdg_dir_free, NULL);
1693
+ g_slist_free (manager->priv->dirs);
1694
+ manager->priv->dirs = NULL;
1696
+ G_OBJECT_CLASS (gsp_app_manager_parent_class)->finalize (object);
1702
+_gsp_app_manager_emit_added (GspAppManager *manager,
1705
+ g_signal_emit (G_OBJECT (manager), gsp_app_manager_signals[ADDED],
1710
+_gsp_app_manager_emit_removed (GspAppManager *manager,
1713
+ g_signal_emit (G_OBJECT (manager), gsp_app_manager_signals[REMOVED],
1722
+gsp_app_manager_get_dir_index (GspAppManager *manager,
1726
+ GspXdgDir *xdgdir;
1728
+ g_return_val_if_fail (GSP_IS_APP_MANAGER (manager), -1);
1729
+ g_return_val_if_fail (dir != NULL, -1);
1731
+ for (l = manager->priv->dirs; l != NULL; l = l->next) {
1733
+ if (strcmp (dir, xdgdir->dir) == 0) {
1734
+ return xdgdir->index;
1742
+gsp_app_manager_get_dir (GspAppManager *manager,
1743
+ unsigned int index)
1746
+ GspXdgDir *xdgdir;
1748
+ g_return_val_if_fail (GSP_IS_APP_MANAGER (manager), NULL);
1750
+ for (l = manager->priv->dirs; l != NULL; l = l->next) {
1752
+ if (index == xdgdir->index) {
1753
+ return xdgdir->dir;
1761
+_gsp_app_manager_find_dir_with_basename (GspAppManager *manager,
1762
+ const char *basename,
1763
+ int minimum_index)
1766
+ GspXdgDir *xdgdir;
1768
+ GKeyFile *keyfile;
1772
+ keyfile = g_key_file_new ();
1774
+ for (l = manager->priv->dirs; l != NULL; l = l->next) {
1777
+ if (xdgdir->index <= minimum_index) {
1782
+ path = g_build_filename (xdgdir->dir, basename, NULL);
1783
+ if (!g_file_test (path, G_FILE_TEST_EXISTS)) {
1787
+ if (!g_key_file_load_from_file (keyfile, path,
1788
+ G_KEY_FILE_NONE, NULL)) {
1792
+ /* the file exists and is readable */
1793
+ if (result == -1) {
1794
+ result = xdgdir->index;
1796
+ result = MIN (result, xdgdir->index);
1800
+ g_key_file_free (keyfile);
1807
+_gsp_app_manager_handle_delete (GspAppManager *manager,
1809
+ const char *basename,
1812
+ unsigned int position;
1813
+ unsigned int system_position;
1815
+ position = gsp_app_get_xdg_position (app);
1816
+ system_position = gsp_app_get_xdg_system_position (app);
1818
+ if (system_position < index) {
1819
+ /* it got deleted, but we don't even care about it */
1823
+ if (index < position) {
1824
+ /* it got deleted, but in a position earlier than the current
1825
+ * one. This happens when the user file was changed and became
1826
+ * identical to the system file; in this case, the user file is
1827
+ * simply removed. */
1828
+ g_assert (index == 0);
1832
+ if (position == index &&
1833
+ (system_position == index || system_position == G_MAXUINT)) {
1834
+ /* the file used by the user was deleted, and there's no other
1835
+ * file in system directories. So it really got deleted. */
1836
+ _gsp_app_manager_app_removed (manager, app);
1840
+ if (system_position == index) {
1841
+ /* then we know that position != index; we just hae to tell
1842
+ * GspApp if there's still a system directory containing this
1846
+ new_system = _gsp_app_manager_find_dir_with_basename (manager,
1849
+ if (new_system < 0) {
1850
+ gsp_app_set_xdg_system_position (app, G_MAXUINT);
1852
+ gsp_app_set_xdg_system_position (app, new_system);
1858
+ if (position == index) {
1859
+ /* then we know that system_position != G_MAXUINT; we need to
1860
+ * tell GspApp to change position to system_position */
1863
+ dir = gsp_app_manager_get_dir (manager, system_position);
1867
+ path = g_build_filename (dir, basename, NULL);
1868
+ gsp_app_reload_at (app, path,
1869
+ (unsigned int) system_position);
1872
+ _gsp_app_manager_app_removed (manager, app);
1878
+ g_assert_not_reached ();
1882
+gsp_app_manager_xdg_dir_monitor (GFileMonitor *monitor,
1884
+ GFile *other_file,
1885
+ GFileMonitorEvent flags,
1888
+ GspAppManager *manager;
1897
+ manager = GSP_APP_MANAGER (data);
1899
+ basename = g_file_get_basename (child);
1900
+ if (!g_str_has_suffix (basename, ".desktop")) {
1901
+ /* not a desktop file, we can ignore */
1902
+ g_free (basename);
1905
+ old_app = gsp_app_manager_find_app_with_basename (manager, basename);
1907
+ parent = g_file_get_parent (child);
1908
+ dir = g_file_get_path (parent);
1909
+ g_object_unref (parent);
1911
+ index = gsp_app_manager_get_dir_index (manager, dir);
1913
+ /* not a directory we know; should never happen, though */
1918
+ path = g_file_get_path (child);
1921
+ case G_FILE_MONITOR_EVENT_CHANGED:
1922
+ case G_FILE_MONITOR_EVENT_CREATED:
1923
+ /* we just do as if it was a new file: GspApp is clever enough
1924
+ * to do the right thing */
1925
+ app = gsp_app_new (path, (unsigned int) index);
1927
+ /* we didn't have this app before, so add it */
1928
+ if (old_app == NULL && app != NULL) {
1929
+ gsp_app_manager_add (manager, app);
1930
+ g_object_unref (app);
1932
+ /* else: it was just updated, GspApp took care of
1933
+ * sending the event */
1935
+ case G_FILE_MONITOR_EVENT_DELETED:
1937
+ /* it got deleted, but we don't know about it, so
1938
+ * nothing to do */
1942
+ _gsp_app_manager_handle_delete (manager, old_app,
1951
+ g_free (basename);
1961
+_gsp_app_manager_fill_from_dir (GspAppManager *manager,
1962
+ GspXdgDir *xdgdir)
1968
+ file = g_file_new_for_path (xdgdir->dir);
1969
+ xdgdir->monitor = g_file_monitor_directory (file, G_FILE_MONITOR_NONE,
1971
+ g_object_unref (file);
1973
+ if (xdgdir->monitor) {
1974
+ g_signal_connect (xdgdir->monitor, "changed",
1975
+ G_CALLBACK (gsp_app_manager_xdg_dir_monitor),
1979
+ dir = g_dir_open (xdgdir->dir, 0, NULL);
1984
+ while ((name = g_dir_read_name (dir))) {
1986
+ char *desktop_file_path;
1988
+ if (!g_str_has_suffix (name, ".desktop")) {
1992
+ desktop_file_path = g_build_filename (xdgdir->dir, name, NULL);
1993
+ app = gsp_app_new (desktop_file_path, xdgdir->index);
1995
+ if (app != NULL) {
1996
+ gsp_app_manager_add (manager, app);
1997
+ g_object_unref (app);
2000
+ g_free (desktop_file_path);
2003
+ g_dir_close (dir);
2007
+gsp_app_manager_fill (GspAppManager *manager)
2009
+ char **autostart_dirs;
2012
+ if (manager->priv->apps != NULL)
2015
+ autostart_dirs = gsm_util_get_autostart_dirs ();
2016
+ /* we always assume that the first directory is the user one */
2017
+ g_assert (g_str_has_prefix (autostart_dirs[0],
2018
+ g_get_user_config_dir ()));
2020
+ for (i = 0; autostart_dirs[i] != NULL; i++) {
2021
+ GspXdgDir *xdgdir;
2023
+ if (gsp_app_manager_get_dir_index (manager,
2024
+ autostart_dirs[i]) >= 0) {
2028
+ xdgdir = _gsp_xdg_dir_new (autostart_dirs[i], i);
2029
+ manager->priv->dirs = g_slist_prepend (manager->priv->dirs,
2032
+ _gsp_app_manager_fill_from_dir (manager, xdgdir);
2035
+ g_strfreev (autostart_dirs);
2043
+_gsp_app_manager_app_unref (GspApp *app,
2044
+ GspAppManager *manager)
2046
+ g_signal_handlers_disconnect_by_func (app,
2047
+ _gsp_app_manager_app_removed,
2049
+ g_object_unref (app);
2053
+_gsp_app_manager_app_removed (GspAppManager *manager,
2056
+ _gsp_app_manager_emit_removed (manager, app);
2057
+ manager->priv->apps = g_slist_remove (manager->priv->apps, app);
2058
+ _gsp_app_manager_app_unref (app, manager);
2062
+gsp_app_manager_add (GspAppManager *manager,
2065
+ g_return_if_fail (GSP_IS_APP_MANAGER (manager));
2066
+ g_return_if_fail (GSP_IS_APP (app));
2068
+ manager->priv->apps = g_slist_prepend (manager->priv->apps,
2069
+ g_object_ref (app));
2070
+ g_signal_connect_swapped (app, "removed",
2071
+ G_CALLBACK (_gsp_app_manager_app_removed),
2073
+ _gsp_app_manager_emit_added (manager, app);
2077
+gsp_app_manager_find_app_with_basename (GspAppManager *manager,
2078
+ const char *basename)
2083
+ g_return_val_if_fail (GSP_IS_APP_MANAGER (manager), NULL);
2084
+ g_return_val_if_fail (basename != NULL, NULL);
2086
+ for (l = manager->priv->apps; l != NULL; l = l->next) {
2087
+ app = GSP_APP (l->data);
2088
+ if (strcmp (basename, gsp_app_get_basename (app)) == 0)
2100
+gsp_app_manager_get (void)
2102
+ if (manager == NULL) {
2103
+ manager = g_object_new (GSP_TYPE_APP_MANAGER, NULL);
2106
+ return g_object_ref (manager);
2111
+gsp_app_manager_get_apps (GspAppManager *manager)
2113
+ g_return_val_if_fail (GSP_IS_APP_MANAGER (manager), NULL);
2115
+ return g_slist_copy (manager->priv->apps);
2117
Index: gnome-session-3.28.0/capplet/gsp-app-manager.h
2118
===================================================================
2120
+++ gnome-session-3.28.0/capplet/gsp-app-manager.h
2122
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
2124
+ * Copyright (C) 1999 Free Software Foundation, Inc.
2125
+ * Copyright (C) 2007, 2009 Vincent Untz.
2126
+ * Copyright (C) 2008 Lucas Rocha.
2127
+ * Copyright (C) 2008 William Jon McCann <jmccann@redhat.com>
2129
+ * This program is free software; you can redistribute it and/or modify
2130
+ * it under the terms of the GNU General Public License as published by
2131
+ * the Free Software Foundation; either version 2 of the License, or
2132
+ * (at your option) any later version.
2134
+ * This program is distributed in the hope that it will be useful,
2135
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
2136
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2137
+ * GNU General Public License for more details.
2139
+ * You should have received a copy of the GNU General Public License
2140
+ * along with this program; if not, write to the Free Software
2141
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
2145
+#ifndef __GSP_APP_MANAGER_H
2146
+#define __GSP_APP_MANAGER_H
2148
+#include <glib-object.h>
2150
+#include <gsp-app.h>
2154
+#define GSP_TYPE_APP_MANAGER (gsp_app_manager_get_type ())
2155
+#define GSP_APP_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSP_TYPE_APP_MANAGER, GspAppManager))
2156
+#define GSP_APP_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GSP_TYPE_APP_MANAGER, GspAppManagerClass))
2157
+#define GSP_IS_APP_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSP_TYPE_APP_MANAGER))
2158
+#define GSP_IS_APP_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GSP_TYPE_APP_MANAGER))
2159
+#define GSP_APP_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GSP_TYPE_APP_MANAGER, GspAppManagerClass))
2161
+typedef struct _GspAppManager GspAppManager;
2162
+typedef struct _GspAppManagerClass GspAppManagerClass;
2164
+typedef struct _GspAppManagerPrivate GspAppManagerPrivate;
2166
+struct _GspAppManagerClass
2168
+ GObjectClass parent_class;
2170
+ void (* added) (GspAppManager *manager,
2172
+ void (* removed) (GspAppManager *manager,
2176
+struct _GspAppManager
2178
+ GObject parent_instance;
2180
+ GspAppManagerPrivate *priv;
2183
+GType gsp_app_manager_get_type (void);
2185
+GspAppManager *gsp_app_manager_get (void);
2187
+void gsp_app_manager_fill (GspAppManager *manager);
2189
+GSList *gsp_app_manager_get_apps (GspAppManager *manager);
2191
+GspApp *gsp_app_manager_find_app_with_basename (GspAppManager *manager,
2192
+ const char *basename);
2194
+const char *gsp_app_manager_get_dir (GspAppManager *manager,
2195
+ unsigned int index);
2197
+void gsp_app_manager_add (GspAppManager *manager,
2202
+#endif /* __GSP_APP_MANAGER_H */
2203
Index: gnome-session-3.28.0/capplet/gsp-app.c
2204
===================================================================
2206
+++ gnome-session-3.28.0/capplet/gsp-app.c
2208
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
2210
+ * Copyright (C) 1999 Free Software Foundation, Inc.
2211
+ * Copyright (C) 2007, 2009 Vincent Untz.
2212
+ * Copyright (C) 2008 Lucas Rocha.
2213
+ * Copyright (C) 2008 William Jon McCann <jmccann@redhat.com>
2215
+ * This program is free software; you can redistribute it and/or modify
2216
+ * it under the terms of the GNU General Public License as published by
2217
+ * the Free Software Foundation; either version 2 of the License, or
2218
+ * (at your option) any later version.
2220
+ * This program is distributed in the hope that it will be useful,
2221
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
2222
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2223
+ * GNU General Public License for more details.
2225
+ * You should have received a copy of the GNU General Public License
2226
+ * along with this program; if not, write to the Free Software
2227
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
2231
+#ifdef HAVE_CONFIG_H
2232
+#include <config.h>
2235
+#include <string.h>
2236
+#include <sys/stat.h>
2238
+#include <glib/gi18n.h>
2239
+#include <glib/gstdio.h>
2241
+#include "gsm-app-dialog.h"
2242
+#include "gsm-properties-dialog.h"
2243
+#include "gsm-util.h"
2244
+#include "gsp-app-manager.h"
2245
+#include "gsp-keyfile.h"
2247
+#include "gsp-app.h"
2249
+#define GSP_APP_SAVE_DELAY 2
2251
+#define GSP_ASP_SAVE_MASK_HIDDEN 0x0001
2252
+#define GSP_ASP_SAVE_MASK_ENABLED 0x0002
2253
+#define GSP_ASP_SAVE_MASK_NAME 0x0004
2254
+#define GSP_ASP_SAVE_MASK_EXEC 0x0008
2255
+#define GSP_ASP_SAVE_MASK_COMMENT 0x0010
2256
+#define GSP_ASP_SAVE_MASK_NO_DISPLAY 0x0020
2257
+#define GSP_ASP_SAVE_MASK_ALL 0xffff
2259
+struct _GspAppPrivate {
2264
+ gboolean no_display;
2274
+ char *description;
2276
+ /* position of the directory in the XDG environment variable */
2277
+ unsigned int xdg_position;
2278
+ /* position of the first system directory in the XDG env var containing
2279
+ * this autostart app too (G_MAXUINT means none) */
2280
+ unsigned int xdg_system_position;
2282
+ unsigned int save_timeout;
2283
+ /* mask of what has changed */
2284
+ unsigned int save_mask;
2285
+ /* path that contains the original file that needs to be saved */
2286
+ char *old_system_path;
2287
+ /* after writing to file, we skip the next file monitor event of type
2289
+ gboolean skip_next_monitor_event;
2292
+#define GSP_APP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSP_TYPE_APP, GspAppPrivate))
2301
+static guint gsp_app_signals[LAST_SIGNAL] = { 0 };
2304
+G_DEFINE_TYPE (GspApp, gsp_app, G_TYPE_OBJECT)
2306
+static void gsp_app_dispose (GObject *object);
2307
+static void gsp_app_finalize (GObject *object);
2308
+static gboolean _gsp_app_save (gpointer data);
2312
+_gsp_str_equal (const char *a,
2315
+ if (g_strcmp0 (a, b) == 0) {
2319
+ if (a && !b && a[0] == '\0') {
2323
+ if (b && !a && b[0] == '\0') {
2332
+gsp_app_class_init (GspAppClass *class)
2334
+ GObjectClass *gobject_class = G_OBJECT_CLASS (class);
2336
+ gobject_class->dispose = gsp_app_dispose;
2337
+ gobject_class->finalize = gsp_app_finalize;
2339
+ gsp_app_signals[CHANGED] =
2340
+ g_signal_new ("changed",
2341
+ G_TYPE_FROM_CLASS (gobject_class),
2342
+ G_SIGNAL_RUN_LAST,
2343
+ G_STRUCT_OFFSET (GspAppClass,
2347
+ g_cclosure_marshal_VOID__VOID,
2350
+ gsp_app_signals[REMOVED] =
2351
+ g_signal_new ("removed",
2352
+ G_TYPE_FROM_CLASS (gobject_class),
2353
+ G_SIGNAL_RUN_LAST,
2354
+ G_STRUCT_OFFSET (GspAppClass,
2358
+ g_cclosure_marshal_VOID__VOID,
2361
+ g_type_class_add_private (class, sizeof (GspAppPrivate));
2365
+gsp_app_init (GspApp *app)
2367
+ app->priv = GSP_APP_GET_PRIVATE (app);
2369
+ memset (app->priv, 0, sizeof (GspAppPrivate));
2370
+ app->priv->xdg_position = G_MAXUINT;
2371
+ app->priv->xdg_system_position = G_MAXUINT;
2375
+_gsp_app_free_reusable_data (GspApp *app)
2377
+ if (app->priv->path) {
2378
+ g_free (app->priv->path);
2379
+ app->priv->path = NULL;
2382
+ if (app->priv->name) {
2383
+ g_free (app->priv->name);
2384
+ app->priv->name = NULL;
2387
+ if (app->priv->exec) {
2388
+ g_free (app->priv->exec);
2389
+ app->priv->exec = NULL;
2392
+ if (app->priv->comment) {
2393
+ g_free (app->priv->comment);
2394
+ app->priv->comment = NULL;
2397
+ if (app->priv->icon) {
2398
+ g_free (app->priv->icon);
2399
+ app->priv->icon = NULL;
2402
+ if (app->priv->gicon) {
2403
+ g_object_unref (app->priv->gicon);
2404
+ app->priv->gicon = NULL;
2407
+ if (app->priv->description) {
2408
+ g_free (app->priv->description);
2409
+ app->priv->description = NULL;
2412
+ if (app->priv->old_system_path) {
2413
+ g_free (app->priv->old_system_path);
2414
+ app->priv->old_system_path = NULL;
2419
+gsp_app_dispose (GObject *object)
2423
+ g_return_if_fail (object != NULL);
2424
+ g_return_if_fail (GSP_IS_APP (object));
2426
+ app = GSP_APP (object);
2428
+ /* we save in dispose since we might need to reference GspAppManager */
2429
+ if (app->priv->save_timeout) {
2430
+ g_source_remove (app->priv->save_timeout);
2431
+ app->priv->save_timeout = 0;
2434
+ _gsp_app_save (app);
2437
+ G_OBJECT_CLASS (gsp_app_parent_class)->dispose (object);
2441
+gsp_app_finalize (GObject *object)
2445
+ g_return_if_fail (object != NULL);
2446
+ g_return_if_fail (GSP_IS_APP (object));
2448
+ app = GSP_APP (object);
2450
+ if (app->priv->basename) {
2451
+ g_free (app->priv->basename);
2452
+ app->priv->basename = NULL;
2455
+ _gsp_app_free_reusable_data (app);
2457
+ G_OBJECT_CLASS (gsp_app_parent_class)->finalize (object);
2461
+_gsp_app_emit_changed (GspApp *app)
2463
+ g_signal_emit (G_OBJECT (app), gsp_app_signals[CHANGED], 0);
2467
+_gsp_app_emit_removed (GspApp *app)
2469
+ g_signal_emit (G_OBJECT (app), gsp_app_signals[REMOVED], 0);
2473
+_gsp_app_update_description (GspApp *app)
2475
+ const char *primary;
2476
+ const char *secondary;
2478
+ if (!gsm_util_text_is_blank (app->priv->name)) {
2479
+ primary = app->priv->name;
2480
+ } else if (!gsm_util_text_is_blank (app->priv->exec)) {
2481
+ primary = app->priv->exec;
2483
+ primary = _("No name");
2486
+ if (!gsm_util_text_is_blank (app->priv->comment)) {
2487
+ secondary = app->priv->comment;
2489
+ secondary = _("No description");
2492
+ g_free (app->priv->description);
2493
+ app->priv->description = g_markup_printf_escaped ("<b>%s</b>\n%s",
2503
+_gsp_ensure_user_autostart_dir (void)
2507
+ dir = g_build_filename (g_get_user_config_dir (), "autostart", NULL);
2508
+ g_mkdir_with_parents (dir, S_IRWXU);
2514
+_gsp_get_current_desktop ()
2516
+ static char *current_desktop = NULL;
2518
+ /* Support XDG_CURRENT_DESKTOP environment variable; this can be used
2519
+ * to abuse gnome-session in non-GNOME desktops. */
2520
+ if (!current_desktop) {
2521
+ const char *desktop;
2523
+ desktop = g_getenv ("XDG_CURRENT_DESKTOP");
2525
+ /* Note: if XDG_CURRENT_DESKTOP is set but empty, do as if it
2527
+ if (!desktop || desktop[0] == '\0')
2528
+ current_desktop = g_strdup ("GNOME");
2530
+ current_desktop = g_strdup (desktop);
2533
+ /* Using "*" means skipping desktop-related checks */
2534
+ if (g_strcmp0 (current_desktop, "*") == 0)
2537
+ return current_desktop;
2541
+_gsp_app_user_equal_system (GspApp *app,
2542
+ char **system_path)
2544
+ GspAppManager *manager;
2545
+ const char *system_dir;
2548
+ GKeyFile *keyfile;
2550
+ manager = gsp_app_manager_get ();
2551
+ system_dir = gsp_app_manager_get_dir (manager,
2552
+ app->priv->xdg_system_position);
2553
+ g_object_unref (manager);
2554
+ if (!system_dir) {
2558
+ path = g_build_filename (system_dir, app->priv->basename, NULL);
2560
+ keyfile = g_key_file_new ();
2561
+ if (!g_key_file_load_from_file (keyfile, path, G_KEY_FILE_NONE, NULL)) {
2563
+ g_key_file_free (keyfile);
2567
+ if (gsp_key_file_get_boolean (keyfile,
2568
+ G_KEY_FILE_DESKTOP_KEY_HIDDEN,
2569
+ FALSE) != app->priv->hidden ||
2570
+ gsp_key_file_get_boolean (keyfile,
2571
+ GSP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLED,
2572
+ TRUE) != app->priv->enabled ||
2573
+ gsp_key_file_get_shown (keyfile,
2574
+ _gsp_get_current_desktop ()) != app->priv->shown) {
2576
+ g_key_file_free (keyfile);
2580
+ if (gsp_key_file_get_boolean (keyfile,
2581
+ G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY,
2582
+ FALSE) != app->priv->no_display) {
2584
+ g_key_file_free (keyfile);
2588
+ str = gsp_key_file_get_locale_string (keyfile,
2589
+ G_KEY_FILE_DESKTOP_KEY_NAME);
2590
+ if (!_gsp_str_equal (str, app->priv->name)) {
2593
+ g_key_file_free (keyfile);
2598
+ str = gsp_key_file_get_locale_string (keyfile,
2599
+ G_KEY_FILE_DESKTOP_KEY_COMMENT);
2600
+ if (!_gsp_str_equal (str, app->priv->comment)) {
2603
+ g_key_file_free (keyfile);
2608
+ str = gsp_key_file_get_string (keyfile,
2609
+ G_KEY_FILE_DESKTOP_KEY_EXEC);
2610
+ if (!_gsp_str_equal (str, app->priv->exec)) {
2613
+ g_key_file_free (keyfile);
2618
+ str = gsp_key_file_get_locale_string (keyfile,
2619
+ G_KEY_FILE_DESKTOP_KEY_ICON);
2620
+ if (!_gsp_str_equal (str, app->priv->icon)) {
2623
+ g_key_file_free (keyfile);
2628
+ g_key_file_free (keyfile);
2630
+ *system_path = path;
2636
+_gsp_app_save_done_success (GspApp *app)
2638
+ app->priv->save_mask = 0;
2640
+ if (app->priv->old_system_path) {
2641
+ g_free (app->priv->old_system_path);
2642
+ app->priv->old_system_path = NULL;
2647
+_gsp_app_save (gpointer data)
2651
+ GKeyFile *keyfile;
2654
+ app = GSP_APP (data);
2656
+ /* first check if removing the data from the user dir and using the
2657
+ * data from the system dir is enough -- this helps us keep clean the
2658
+ * user config dir by removing unneeded files */
2659
+ if (_gsp_app_user_equal_system (app, &use_path)) {
2660
+ if (g_file_test (app->priv->path, G_FILE_TEST_EXISTS)) {
2661
+ g_remove (app->priv->path);
2664
+ g_free (app->priv->path);
2665
+ app->priv->path = use_path;
2667
+ app->priv->xdg_position = app->priv->xdg_system_position;
2669
+ _gsp_app_save_done_success (app);
2673
+ if (app->priv->old_system_path)
2674
+ use_path = app->priv->old_system_path;
2676
+ use_path = app->priv->path;
2678
+ keyfile = g_key_file_new ();
2681
+ g_key_file_load_from_file (keyfile, use_path,
2682
+ G_KEY_FILE_KEEP_COMMENTS|G_KEY_FILE_KEEP_TRANSLATIONS,
2686
+ g_error_free (error);
2687
+ gsp_key_file_populate (keyfile);
2690
+ if (app->priv->save_mask & GSP_ASP_SAVE_MASK_HIDDEN) {
2691
+ gsp_key_file_set_boolean (keyfile,
2692
+ G_KEY_FILE_DESKTOP_KEY_HIDDEN,
2693
+ app->priv->hidden);
2696
+ if (app->priv->save_mask & GSP_ASP_SAVE_MASK_NO_DISPLAY) {
2697
+ gsp_key_file_set_boolean (keyfile,
2698
+ G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY,
2699
+ app->priv->no_display);
2702
+ if (app->priv->save_mask & GSP_ASP_SAVE_MASK_ENABLED) {
2703
+ gsp_key_file_set_boolean (keyfile,
2704
+ GSP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLED,
2705
+ app->priv->enabled);
2708
+ if (app->priv->save_mask & GSP_ASP_SAVE_MASK_NAME) {
2709
+ gsp_key_file_set_locale_string (keyfile,
2710
+ G_KEY_FILE_DESKTOP_KEY_NAME,
2712
+ gsp_key_file_ensure_C_key (keyfile, G_KEY_FILE_DESKTOP_KEY_NAME);
2715
+ if (app->priv->save_mask & GSP_ASP_SAVE_MASK_COMMENT) {
2716
+ gsp_key_file_set_locale_string (keyfile,
2717
+ G_KEY_FILE_DESKTOP_KEY_COMMENT,
2718
+ app->priv->comment);
2719
+ gsp_key_file_ensure_C_key (keyfile, G_KEY_FILE_DESKTOP_KEY_COMMENT);
2722
+ if (app->priv->save_mask & GSP_ASP_SAVE_MASK_EXEC) {
2723
+ gsp_key_file_set_string (keyfile,
2724
+ G_KEY_FILE_DESKTOP_KEY_EXEC,
2728
+ _gsp_ensure_user_autostart_dir ();
2729
+ if (gsp_key_file_to_file (keyfile, app->priv->path, NULL)) {
2730
+ app->priv->skip_next_monitor_event = TRUE;
2731
+ _gsp_app_save_done_success (app);
2733
+ g_warning ("Could not save %s file", app->priv->path);
2736
+ g_key_file_free (keyfile);
2738
+ app->priv->save_timeout = 0;
2743
+_gsp_app_queue_save (GspApp *app)
2745
+ if (app->priv->save_timeout) {
2746
+ g_source_remove (app->priv->save_timeout);
2747
+ app->priv->save_timeout = 0;
2750
+ /* if the file was not in the user directory, then we'll create a copy
2752
+ if (app->priv->xdg_position != 0) {
2753
+ app->priv->xdg_position = 0;
2755
+ if (app->priv->old_system_path == NULL) {
2756
+ app->priv->old_system_path = app->priv->path;
2757
+ /* if old_system_path was not NULL, then it means we
2758
+ * tried to save and we failed; in that case, we want
2759
+ * to try again and use the old file as a basis again */
2762
+ app->priv->path = g_build_filename (g_get_user_config_dir (),
2764
+ app->priv->basename, NULL);
2767
+ app->priv->save_timeout = g_timeout_add_seconds (GSP_APP_SAVE_DELAY,
2777
+gsp_app_get_basename (GspApp *app)
2779
+ g_return_val_if_fail (GSP_IS_APP (app), NULL);
2781
+ return app->priv->basename;
2785
+gsp_app_get_path (GspApp *app)
2787
+ g_return_val_if_fail (GSP_IS_APP (app), NULL);
2789
+ return app->priv->path;
2793
+gsp_app_get_hidden (GspApp *app)
2795
+ g_return_val_if_fail (GSP_IS_APP (app), FALSE);
2797
+ return app->priv->hidden;
2801
+gsp_app_get_display (GspApp *app)
2803
+ g_return_val_if_fail (GSP_IS_APP (app), FALSE);
2805
+ return !app->priv->no_display;
2809
+gsp_app_get_enabled (GspApp *app)
2811
+ g_return_val_if_fail (GSP_IS_APP (app), FALSE);
2813
+ return app->priv->enabled;
2817
+gsp_app_set_enabled (GspApp *app,
2820
+ g_return_if_fail (GSP_IS_APP (app));
2822
+ if (enabled == app->priv->enabled) {
2826
+ app->priv->enabled = enabled;
2827
+ app->priv->save_mask |= GSP_ASP_SAVE_MASK_ENABLED;
2829
+ _gsp_app_queue_save (app);
2830
+ _gsp_app_emit_changed (app);
2834
+gsp_app_get_shown (GspApp *app)
2836
+ g_return_val_if_fail (GSP_IS_APP (app), FALSE);
2838
+ return app->priv->shown;
2842
+gsp_app_get_name (GspApp *app)
2844
+ g_return_val_if_fail (GSP_IS_APP (app), NULL);
2846
+ return app->priv->name;
2850
+gsp_app_get_exec (GspApp *app)
2852
+ g_return_val_if_fail (GSP_IS_APP (app), NULL);
2854
+ return app->priv->exec;
2858
+gsp_app_get_comment (GspApp *app)
2860
+ g_return_val_if_fail (GSP_IS_APP (app), NULL);
2862
+ return app->priv->comment;
2866
+gsp_app_get_icon (GspApp *app)
2868
+ g_return_val_if_fail (GSP_IS_APP (app), NULL);
2870
+ if (app->priv->gicon) {
2871
+ return g_object_ref (app->priv->gicon);
2878
+gsp_app_get_xdg_position (GspApp *app)
2880
+ g_return_val_if_fail (GSP_IS_APP (app), G_MAXUINT);
2882
+ return app->priv->xdg_position;
2886
+gsp_app_get_xdg_system_position (GspApp *app)
2888
+ g_return_val_if_fail (GSP_IS_APP (app), G_MAXUINT);
2890
+ return app->priv->xdg_system_position;
2894
+gsp_app_set_xdg_system_position (GspApp *app,
2895
+ unsigned int position)
2897
+ g_return_if_fail (GSP_IS_APP (app));
2899
+ app->priv->xdg_system_position = position;
2903
+gsp_app_get_description (GspApp *app)
2905
+ g_return_val_if_fail (GSP_IS_APP (app), NULL);
2907
+ return app->priv->description;
2911
+ * High-level edition
2915
+gsp_app_update (GspApp *app,
2917
+ const char *comment,
2922
+ g_return_if_fail (GSP_IS_APP (app));
2926
+ if (!_gsp_str_equal (name, app->priv->name)) {
2928
+ g_free (app->priv->name);
2929
+ app->priv->name = g_strdup (name);
2930
+ app->priv->save_mask |= GSP_ASP_SAVE_MASK_NAME;
2933
+ if (!_gsp_str_equal (comment, app->priv->comment)) {
2935
+ g_free (app->priv->comment);
2936
+ app->priv->comment = g_strdup (comment);
2937
+ app->priv->save_mask |= GSP_ASP_SAVE_MASK_COMMENT;
2941
+ _gsp_app_update_description (app);
2944
+ if (!_gsp_str_equal (exec, app->priv->exec)) {
2946
+ g_free (app->priv->exec);
2947
+ app->priv->exec = g_strdup (exec);
2948
+ app->priv->save_mask |= GSP_ASP_SAVE_MASK_EXEC;
2952
+ _gsp_app_queue_save (app);
2953
+ _gsp_app_emit_changed (app);
2958
+gsp_app_delete (GspApp *app)
2960
+ g_return_if_fail (GSP_IS_APP (app));
2962
+ if (app->priv->xdg_position == 0 &&
2963
+ app->priv->xdg_system_position == G_MAXUINT) {
2964
+ /* exists in user directory only */
2965
+ if (app->priv->save_timeout) {
2966
+ g_source_remove (app->priv->save_timeout);
2967
+ app->priv->save_timeout = 0;
2970
+ if (g_file_test (app->priv->path, G_FILE_TEST_EXISTS)) {
2971
+ g_remove (app->priv->path);
2974
+ /* for extra safety */
2975
+ app->priv->hidden = TRUE;
2976
+ app->priv->save_mask |= GSP_ASP_SAVE_MASK_HIDDEN;
2978
+ _gsp_app_emit_removed (app);
2980
+ /* also exists in system directory, so we have to keep a file
2981
+ * in the user directory */
2982
+ app->priv->hidden = TRUE;
2983
+ app->priv->save_mask |= GSP_ASP_SAVE_MASK_HIDDEN;
2985
+ _gsp_app_queue_save (app);
2986
+ _gsp_app_emit_changed (app);
2991
+ * New autostart app
2995
+gsp_app_reload_at (GspApp *app,
2997
+ unsigned int xdg_position)
2999
+ g_return_if_fail (GSP_IS_APP (app));
3001
+ app->priv->xdg_position = G_MAXUINT;
3002
+ gsp_app_new (path, xdg_position);
3006
+gsp_app_new (const char *path,
3007
+ unsigned int xdg_position)
3009
+ GspAppManager *manager;
3011
+ GKeyFile *keyfile;
3015
+ basename = g_path_get_basename (path);
3017
+ manager = gsp_app_manager_get ();
3018
+ app = gsp_app_manager_find_app_with_basename (manager, basename);
3019
+ g_object_unref (manager);
3021
+ new = (app == NULL);
3024
+ if (app->priv->xdg_position == xdg_position) {
3025
+ if (app->priv->skip_next_monitor_event) {
3026
+ app->priv->skip_next_monitor_event = FALSE;
3029
+ /* else: the file got changed but not by us, we'll
3030
+ * update our data from disk */
3033
+ if (app->priv->xdg_position < xdg_position ||
3034
+ app->priv->save_timeout != 0) {
3035
+ /* we don't really care about this file, since we
3036
+ * already have something with a higher priority, or
3037
+ * we're going to write something in the user config
3039
+ * Note: xdg_position >= 1 so it's a system dir */
3040
+ app->priv->xdg_system_position = MIN (xdg_position,
3041
+ app->priv->xdg_system_position);
3046
+ keyfile = g_key_file_new ();
3047
+ if (!g_key_file_load_from_file (keyfile, path, G_KEY_FILE_NONE, NULL)) {
3048
+ g_key_file_free (keyfile);
3049
+ g_free (basename);
3054
+ app = g_object_new (GSP_TYPE_APP, NULL);
3055
+ app->priv->basename = basename;
3057
+ g_free (basename);
3058
+ _gsp_app_free_reusable_data (app);
3061
+ app->priv->path = g_strdup (path);
3063
+ app->priv->hidden = gsp_key_file_get_boolean (keyfile,
3064
+ G_KEY_FILE_DESKTOP_KEY_HIDDEN,
3066
+ app->priv->no_display = gsp_key_file_get_boolean (keyfile,
3067
+ G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY,
3069
+ app->priv->enabled = gsp_key_file_get_boolean (keyfile,
3070
+ GSP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLED,
3072
+ app->priv->shown = gsp_key_file_get_shown (keyfile,
3073
+ _gsp_get_current_desktop ());
3075
+ app->priv->name = gsp_key_file_get_locale_string (keyfile,
3076
+ G_KEY_FILE_DESKTOP_KEY_NAME);
3077
+ app->priv->exec = gsp_key_file_get_string (keyfile,
3078
+ G_KEY_FILE_DESKTOP_KEY_EXEC);
3079
+ app->priv->comment = gsp_key_file_get_locale_string (keyfile,
3080
+ G_KEY_FILE_DESKTOP_KEY_COMMENT);
3082
+ if (gsm_util_text_is_blank (app->priv->name)) {
3083
+ g_free (app->priv->name);
3084
+ app->priv->name = g_strdup (app->priv->exec);
3087
+ app->priv->icon = gsp_key_file_get_locale_string (keyfile,
3088
+ G_KEY_FILE_DESKTOP_KEY_ICON);
3090
+ if (app->priv->icon) {
3091
+ /* look at icon and see if it's a themed icon or not */
3092
+ if (g_path_is_absolute (app->priv->icon)) {
3095
+ iconfile = g_file_new_for_path (app->priv->icon);
3096
+ app->priv->gicon = g_file_icon_new (iconfile);
3097
+ g_object_unref (iconfile);
3099
+ app->priv->gicon = g_themed_icon_new (app->priv->icon);
3102
+ app->priv->gicon = NULL;
3105
+ g_key_file_free (keyfile);
3107
+ _gsp_app_update_description (app);
3109
+ if (xdg_position > 0) {
3110
+ g_assert (xdg_position <= app->priv->xdg_system_position);
3111
+ app->priv->xdg_system_position = xdg_position;
3113
+ /* else we keep the old value (which is G_MAXUINT if it wasn't set) */
3114
+ app->priv->xdg_position = xdg_position;
3116
+ g_assert (!new || app->priv->save_timeout == 0);
3117
+ app->priv->save_timeout = 0;
3118
+ app->priv->old_system_path = NULL;
3119
+ app->priv->skip_next_monitor_event = FALSE;
3122
+ _gsp_app_emit_changed (app);
3129
+_gsp_find_free_basename (const char *suggested_basename)
3131
+ GspAppManager *manager;
3137
+ if (g_str_has_suffix (suggested_basename, ".desktop")) {
3138
+ char *basename_no_ext;
3140
+ basename_no_ext = g_strndup (suggested_basename,
3141
+ strlen (suggested_basename) - strlen (".desktop"));
3142
+ base_path = g_build_filename (g_get_user_config_dir (),
3144
+ basename_no_ext, NULL);
3145
+ g_free (basename_no_ext);
3147
+ base_path = g_build_filename (g_get_user_config_dir (),
3149
+ suggested_basename, NULL);
3152
+ filename = g_strdup_printf ("%s.desktop", base_path);
3153
+ basename = g_path_get_basename (filename);
3155
+ manager = gsp_app_manager_get ();
3158
+#define _GSP_FIND_MAX_TRY 10000
3159
+ while (gsp_app_manager_find_app_with_basename (manager,
3160
+ basename) != NULL &&
3161
+ g_file_test (filename, G_FILE_TEST_EXISTS) &&
3162
+ i < _GSP_FIND_MAX_TRY) {
3163
+ g_free (filename);
3164
+ g_free (basename);
3166
+ filename = g_strdup_printf ("%s-%d.desktop", base_path, i);
3167
+ basename = g_path_get_basename (filename);
3172
+ g_object_unref (manager);
3174
+ g_free (base_path);
3175
+ g_free (filename);
3177
+ if (i == _GSP_FIND_MAX_TRY) {
3178
+ g_free (basename);
3186
+gsp_app_create (const char *name,
3187
+ const char *comment,
3190
+ GspAppManager *manager;
3196
+ g_return_if_fail (!gsm_util_text_is_blank (exec));
3198
+ if (!g_shell_parse_argv (exec, &argc, &argv, NULL)) {
3202
+ basename = _gsp_find_free_basename (argv[0]);
3203
+ g_strfreev (argv);
3204
+ if (basename == NULL) {
3208
+ app = g_object_new (GSP_TYPE_APP, NULL);
3210
+ app->priv->basename = basename;
3211
+ app->priv->path = g_build_filename (g_get_user_config_dir (),
3213
+ app->priv->basename, NULL);
3215
+ app->priv->hidden = FALSE;
3216
+ app->priv->no_display = FALSE;
3217
+ app->priv->enabled = TRUE;
3218
+ app->priv->shown = TRUE;
3220
+ if (!gsm_util_text_is_blank (name)) {
3221
+ app->priv->name = g_strdup (name);
3223
+ app->priv->name = g_strdup (exec);
3225
+ app->priv->exec = g_strdup (exec);
3226
+ app->priv->comment = g_strdup (comment);
3227
+ app->priv->icon = NULL;
3229
+ app->priv->gicon = NULL;
3230
+ _gsp_app_update_description (app);
3232
+ /* by definition */
3233
+ app->priv->xdg_position = 0;
3234
+ app->priv->xdg_system_position = G_MAXUINT;
3236
+ app->priv->save_timeout = 0;
3237
+ app->priv->save_mask |= GSP_ASP_SAVE_MASK_ALL;
3238
+ app->priv->old_system_path = NULL;
3239
+ app->priv->skip_next_monitor_event = FALSE;
3241
+ _gsp_app_queue_save (app);
3243
+ manager = gsp_app_manager_get ();
3244
+ gsp_app_manager_add (manager, app);
3245
+ g_object_unref (app);
3246
+ g_object_unref (manager);
3250
+gsp_app_copy_desktop_file (const char *uri)
3252
+ GspAppManager *manager;
3255
+ char *src_basename;
3256
+ char *dst_basename;
3261
+ g_return_val_if_fail (uri != NULL, FALSE);
3263
+ src_file = g_file_new_for_uri (uri);
3264
+ src_basename = g_file_get_basename (src_file);
3266
+ if (src_basename == NULL) {
3267
+ g_object_unref (src_file);
3271
+ dst_basename = _gsp_find_free_basename (src_basename);
3272
+ g_free (src_basename);
3274
+ if (dst_basename == NULL) {
3275
+ g_object_unref (src_file);
3279
+ dst_path = g_build_filename (g_get_user_config_dir (),
3281
+ dst_basename, NULL);
3282
+ g_free (dst_basename);
3284
+ dst_file = g_file_new_for_path (dst_path);
3286
+ _gsp_ensure_user_autostart_dir ();
3287
+ if (!g_file_copy (src_file, dst_file, G_FILE_COPY_NONE,
3288
+ NULL, NULL, NULL, NULL)) {
3289
+ g_object_unref (src_file);
3290
+ g_object_unref (dst_file);
3291
+ g_free (dst_path);
3295
+ g_object_unref (src_file);
3296
+ g_object_unref (dst_file);
3298
+ app = gsp_app_new (dst_path, 0);
3300
+ g_remove (dst_path);
3301
+ g_free (dst_path);
3305
+ g_free (dst_path);
3308
+ if (app->priv->hidden) {
3310
+ app->priv->hidden = FALSE;
3311
+ app->priv->save_mask |= GSP_ASP_SAVE_MASK_HIDDEN;
3314
+ if (app->priv->no_display) {
3316
+ app->priv->no_display = FALSE;
3317
+ app->priv->save_mask |= GSP_ASP_SAVE_MASK_NO_DISPLAY;
3320
+ if (!app->priv->enabled) {
3322
+ app->priv->enabled = TRUE;
3323
+ app->priv->save_mask |= GSP_ASP_SAVE_MASK_ENABLED;
3327
+ _gsp_app_queue_save (app);
3330
+ manager = gsp_app_manager_get ();
3331
+ gsp_app_manager_add (manager, app);
3332
+ g_object_unref (app);
3333
+ g_object_unref (manager);
3337
Index: gnome-session-3.28.0/capplet/gsp-app.h
3338
===================================================================
3340
+++ gnome-session-3.28.0/capplet/gsp-app.h
3342
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
3344
+ * Copyright (C) 1999 Free Software Foundation, Inc.
3345
+ * Copyright (C) 2007, 2009 Vincent Untz.
3346
+ * Copyright (C) 2008 Lucas Rocha.
3347
+ * Copyright (C) 2008 William Jon McCann <jmccann@redhat.com>
3349
+ * This program is free software; you can redistribute it and/or modify
3350
+ * it under the terms of the GNU General Public License as published by
3351
+ * the Free Software Foundation; either version 2 of the License, or
3352
+ * (at your option) any later version.
3354
+ * This program is distributed in the hope that it will be useful,
3355
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
3356
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3357
+ * GNU General Public License for more details.
3359
+ * You should have received a copy of the GNU General Public License
3360
+ * along with this program; if not, write to the Free Software
3361
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
3365
+#ifndef __GSP_APP_H
3366
+#define __GSP_APP_H
3368
+#include <glib-object.h>
3369
+#include <gio/gio.h>
3373
+#define GSP_TYPE_APP (gsp_app_get_type ())
3374
+#define GSP_APP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSP_TYPE_APP, GspApp))
3375
+#define GSP_APP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GSP_TYPE_APP, GspAppClass))
3376
+#define GSP_IS_APP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSP_TYPE_APP))
3377
+#define GSP_IS_APP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GSP_TYPE_APP))
3378
+#define GSP_APP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GSP_TYPE_APP, GspAppClass))
3380
+typedef struct _GspApp GspApp;
3381
+typedef struct _GspAppClass GspAppClass;
3383
+typedef struct _GspAppPrivate GspAppPrivate;
3385
+struct _GspAppClass
3387
+ GObjectClass parent_class;
3389
+ void (* changed) (GspApp *app);
3390
+ void (* removed) (GspApp *app);
3395
+ GObject parent_instance;
3397
+ GspAppPrivate *priv;
3400
+GType gsp_app_get_type (void);
3402
+void gsp_app_create (const char *name,
3403
+ const char *comment,
3404
+ const char *exec);
3405
+void gsp_app_update (GspApp *app,
3407
+ const char *comment,
3408
+ const char *exec);
3410
+gboolean gsp_app_copy_desktop_file (const char *uri);
3412
+void gsp_app_delete (GspApp *app);
3414
+const char *gsp_app_get_basename (GspApp *app);
3415
+const char *gsp_app_get_path (GspApp *app);
3417
+gboolean gsp_app_get_hidden (GspApp *app);
3418
+gboolean gsp_app_get_display (GspApp *app);
3420
+gboolean gsp_app_get_enabled (GspApp *app);
3421
+void gsp_app_set_enabled (GspApp *app,
3422
+ gboolean enabled);
3424
+gboolean gsp_app_get_shown (GspApp *app);
3426
+const char *gsp_app_get_name (GspApp *app);
3427
+const char *gsp_app_get_exec (GspApp *app);
3428
+const char *gsp_app_get_comment (GspApp *app);
3430
+const char *gsp_app_get_description (GspApp *app);
3431
+GIcon *gsp_app_get_icon (GspApp *app);
3433
+/* private interface for GspAppManager only */
3435
+GspApp *gsp_app_new (const char *path,
3436
+ unsigned int xdg_position);
3438
+void gsp_app_reload_at (GspApp *app,
3440
+ unsigned int xdg_position);
3442
+unsigned int gsp_app_get_xdg_position (GspApp *app);
3443
+unsigned int gsp_app_get_xdg_system_position (GspApp *app);
3444
+void gsp_app_set_xdg_system_position (GspApp *app,
3445
+ unsigned int position);
3449
+#endif /* __GSP_APP_H */
3450
Index: gnome-session-3.28.0/capplet/gsp-keyfile.c
3451
===================================================================
3453
+++ gnome-session-3.28.0/capplet/gsp-keyfile.c
3456
+ * gsp-keyfile.c: GKeyFile extensions
3458
+ * Copyright (C) 2008, 2009 Novell, Inc.
3460
+ * Based on code from panel-keyfile.c (from gnome-panel)
3462
+ * This program is free software; you can redistribute it and/or
3463
+ * modify it under the terms of the GNU General Public License as
3464
+ * published by the Free Software Foundation; either version 2 of the
3465
+ * License, or (at your option) any later version.
3467
+ * This program is distributed in the hope that it will be useful, but
3468
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
3469
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3470
+ * General Public License for more details.
3472
+ * You should have received a copy of the GNU General Public License
3473
+ * along with this program; if not, write to the Free Software
3474
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
3475
+ * 02111-1307, USA.
3478
+ * Vincent Untz <vuntz@gnome.org>
3481
+#include <string.h>
3485
+#include "gsp-keyfile.h"
3488
+gsp_key_file_populate (GKeyFile *keyfile)
3490
+ gsp_key_file_set_string (keyfile,
3491
+ G_KEY_FILE_DESKTOP_KEY_TYPE,
3494
+ gsp_key_file_set_string (keyfile,
3495
+ G_KEY_FILE_DESKTOP_KEY_EXEC,
3499
+//FIXME: kill this when bug #309224 is fixed
3501
+gsp_key_file_to_file (GKeyFile *keyfile,
3502
+ const gchar *path,
3505
+ GError *write_error;
3510
+ g_return_val_if_fail (keyfile != NULL, FALSE);
3511
+ g_return_val_if_fail (path != NULL, FALSE);
3513
+ write_error = NULL;
3514
+ data = g_key_file_to_data (keyfile, &length, &write_error);
3516
+ if (write_error) {
3517
+ g_propagate_error (error, write_error);
3521
+ res = g_file_set_contents (path, data, length, &write_error);
3524
+ if (write_error) {
3525
+ g_propagate_error (error, write_error);
3533
+gsp_key_file_get_boolean (GKeyFile *keyfile,
3535
+ gboolean default_value)
3541
+ retval = g_key_file_get_boolean (keyfile, G_KEY_FILE_DESKTOP_GROUP,
3543
+ if (error != NULL) {
3544
+ retval = default_value;
3545
+ g_error_free (error);
3552
+gsp_key_file_get_shown (GKeyFile *keyfile,
3553
+ const char *current_desktop)
3555
+ char **only_show_in, **not_show_in;
3556
+ gchar **current_desktops = { NULL };
3560
+ if (!current_desktop)
3563
+ only_show_in = g_key_file_get_string_list (keyfile, G_KEY_FILE_DESKTOP_GROUP,
3564
+ G_KEY_FILE_DESKTOP_KEY_ONLY_SHOW_IN,
3567
+ if (current_desktop && current_desktop[0] != '\0')
3568
+ current_desktops = g_strsplit (current_desktop, ":", 0);
3570
+ if (only_show_in) {
3572
+ for (i = 0; only_show_in[i] != NULL; i++) {
3573
+ if (g_strv_contains ((const gchar * const *) current_desktops, only_show_in[i])) {
3579
+ g_strfreev (only_show_in);
3585
+ not_show_in = g_key_file_get_string_list (keyfile, G_KEY_FILE_DESKTOP_GROUP,
3586
+ G_KEY_FILE_DESKTOP_KEY_NOT_SHOW_IN,
3589
+ if (not_show_in) {
3591
+ for (i = 0; not_show_in[i] != NULL; i++) {
3592
+ if (g_strv_contains ((const gchar * const *) current_desktops, not_show_in[i])) {
3598
+ g_strfreev (not_show_in);
3604
+ g_strfreev (current_desktops);
3610
+gsp_key_file_set_locale_string (GKeyFile *keyfile,
3612
+ const gchar *value)
3614
+ const char *locale;
3615
+ const char * const *langs_pointer;
3618
+ if (value == NULL) {
3623
+ langs_pointer = g_get_language_names ();
3624
+ for (i = 0; langs_pointer[i] != NULL; i++) {
3625
+ /* find first without encoding */
3626
+ if (strchr (langs_pointer[i], '.') == NULL) {
3627
+ locale = langs_pointer[i];
3632
+ if (locale != NULL) {
3633
+ g_key_file_set_locale_string (keyfile, G_KEY_FILE_DESKTOP_GROUP,
3634
+ key, locale, value);
3636
+ g_key_file_set_string (keyfile, G_KEY_FILE_DESKTOP_GROUP,
3642
+gsp_key_file_ensure_C_key (GKeyFile *keyfile,
3648
+ /* Make sure we set the "C" locale strings to the terms we set here.
3649
+ * This is so that if the user logs into another locale they get their
3650
+ * own description there rather then empty. It is not the C locale
3651
+ * however, but the user created this entry herself so it's OK */
3652
+ C_value = gsp_key_file_get_string (keyfile, key);
3653
+ if (C_value == NULL || C_value [0] == '\0') {
3654
+ buffer = gsp_key_file_get_locale_string (keyfile, key);
3656
+ gsp_key_file_set_string (keyfile, key, buffer);
3662
Index: gnome-session-3.28.0/capplet/gsp-keyfile.h
3663
===================================================================
3665
+++ gnome-session-3.28.0/capplet/gsp-keyfile.h
3668
+ * gsp-keyfile.h: GKeyFile extensions
3670
+ * Copyright (C) 2008, 2009 Novell, Inc.
3672
+ * Based on code from panel-keyfile.h (from gnome-panel)
3674
+ * This program is free software; you can redistribute it and/or
3675
+ * modify it under the terms of the GNU General Public License as
3676
+ * published by the Free Software Foundation; either version 2 of the
3677
+ * License, or (at your option) any later version.
3679
+ * This program is distributed in the hope that it will be useful, but
3680
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
3681
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3682
+ * General Public License for more details.
3684
+ * You should have received a copy of the GNU General Public License
3685
+ * along with this program; if not, write to the Free Software
3686
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
3687
+ * 02111-1307, USA.
3690
+ * Vincent Untz <vuntz@gnome.org>
3693
+#ifndef GSP_KEYFILE_H
3694
+#define GSP_KEYFILE_H
3700
+#define GSP_KEY_FILE_DESKTOP_KEY_AUTOSTART_ENABLED "X-GNOME-Autostart-enabled"
3702
+void gsp_key_file_populate (GKeyFile *keyfile);
3704
+gboolean gsp_key_file_to_file (GKeyFile *keyfile,
3705
+ const gchar *path,
3708
+gboolean gsp_key_file_get_boolean (GKeyFile *keyfile,
3710
+ gboolean default_value);
3711
+gboolean gsp_key_file_get_shown (GKeyFile *keyfile,
3712
+ const char *current_desktop);
3713
+#define gsp_key_file_get_string(key_file, key) \
3714
+ g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, key, NULL)
3715
+#define gsp_key_file_get_locale_string(key_file, key) \
3716
+ g_key_file_get_locale_string(key_file, G_KEY_FILE_DESKTOP_GROUP, key, NULL, NULL)
3718
+#define gsp_key_file_set_boolean(key_file, key, value) \
3719
+ g_key_file_set_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, key, value)
3720
+#define gsp_key_file_set_string(key_file, key, value) \
3721
+ g_key_file_set_string (key_file, G_KEY_FILE_DESKTOP_GROUP, key, value)
3722
+void gsp_key_file_set_locale_string (GKeyFile *keyfile,
3724
+ const gchar *value);
3726
+void gsp_key_file_ensure_C_key (GKeyFile *keyfile,
3731
+#endif /* GSP_KEYFILE_H */
3732
Index: gnome-session-3.28.0/capplet/main.c
3733
===================================================================
3735
+++ gnome-session-3.28.0/capplet/main.c
3737
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
3739
+ * Copyright (C) 1999 Free Software Foundation, Inc.
3740
+ * Copyright (C) 2008 Lucas Rocha.
3742
+ * This program is free software; you can redistribute it and/or
3743
+ * modify it under the terms of the GNU General Public License as
3744
+ * published by the Free Software Foundation; either version 2 of the
3745
+ * License, or (at your option) any later version.
3747
+ * This program is distributed in the hope that it will be useful, but
3748
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
3749
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3750
+ * Lesser General Public License for more details.
3752
+ * You should have received a copy of the GNU General Public License
3753
+ * along with this program; if not, write to the Free Software
3754
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
3755
+ * 02111-1307, USA.
3758
+#include <config.h>
3760
+#include <unistd.h>
3761
+#include <stdlib.h>
3763
+#include <glib/gi18n.h>
3764
+#include <gtk/gtk.h>
3766
+#include "gsm-properties-dialog.h"
3768
+static gboolean show_version = FALSE;
3770
+static GOptionEntry options[] = {
3771
+ { "version", 0, 0, G_OPTION_ARG_NONE, &show_version, N_("Version of this application"), NULL },
3772
+ { NULL, 0, 0, 0, NULL, NULL, NULL }
3776
+dialog_response (GsmPropertiesDialog *dialog,
3777
+ guint response_id,
3780
+ GdkScreen *screen;
3783
+ if (response_id == GTK_RESPONSE_HELP) {
3784
+ screen = gtk_widget_get_screen (GTK_WIDGET (dialog));
3787
+ gtk_show_uri (screen, "ghelp:user-guide?gosstartsession-2",
3788
+ gtk_get_current_event_time (), &error);
3790
+ if (error != NULL) {
3792
+ d = gtk_message_dialog_new (GTK_WINDOW (dialog),
3793
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
3794
+ GTK_MESSAGE_ERROR,
3795
+ GTK_BUTTONS_CLOSE,
3797
+ _("Could not display help document"));
3798
+ gtk_message_dialog_format_secondary_text (
3799
+ GTK_MESSAGE_DIALOG (d),
3800
+ "%s", error->message);
3801
+ g_error_free (error);
3803
+ gtk_dialog_run (GTK_DIALOG (d));
3804
+ gtk_widget_destroy (d);
3807
+ gtk_widget_destroy (GTK_WIDGET (dialog));
3813
+main (int argc, char *argv[])
3816
+ GtkWidget *dialog;
3818
+ bindtextdomain (GETTEXT_PACKAGE, LOCALE_DIR);
3819
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
3820
+ textdomain (GETTEXT_PACKAGE);
3823
+ if (! gtk_init_with_args (&argc, &argv, " - GNOME Session Properties", options, GETTEXT_PACKAGE, &error)) {
3824
+ g_warning ("Unable to start: %s", error->message);
3825
+ g_error_free (error);
3829
+ if (show_version) {
3830
+ g_print ("%s %s\n", argv [0], VERSION);
3834
+ dialog = gsm_properties_dialog_new ();
3835
+ g_signal_connect (dialog,
3837
+ G_CALLBACK (dialog_response),
3839
+ gtk_widget_show (dialog);
3845
Index: gnome-session-3.28.0/capplet/meson.build
3846
===================================================================
3848
+++ gnome-session-3.28.0/capplet/meson.build
3852
+ '-DLOCALE_DIR="@0@"'.format(session_localedir),
3853
+ '-DGTKBUILDER_DIR="@0@"'.format(session_pkgdatadir)
3864
+ 'gsm-properties-dialog.c',
3865
+ 'gsm-app-dialog.c',
3867
+ 'gsp-app-manager.c',
3873
+ include_directories('../gnome-session')
3877
+ 'gnome-session-properties',
3879
+ include_directories: includes,
3880
+ dependencies: deps,
3882
+ link_with: libgsmutil,
3884
+ install_dir: session_bindir
3886
Index: gnome-session-3.28.0/data/gnome-session-properties.desktop.in
3887
===================================================================
3889
+++ gnome-session-3.28.0/data/gnome-session-properties.desktop.in
3892
+Name=Startup Applications
3893
+Comment=Choose what applications to start when you log in
3894
+Exec=gnome-session-properties
3895
+Icon=session-properties
3899
+Categories=GTK;GNOME;Settings;X-GNOME-PersonalSettings;
3900
+OnlyShowIn=GNOME;Unity;
3901
+X-GNOME-Bugzilla-Bugzilla=GNOME
3902
+X-GNOME-Bugzilla-Product=gnome-session
3903
+X-GNOME-Bugzilla-Component=gnome-session-properties
3904
+X-GNOME-Bugzilla-Version=@VERSION@
3905
Index: gnome-session-3.28.0/data/icons/16x16/session-properties.svg
3906
===================================================================
3908
+++ gnome-session-3.28.0/data/icons/16x16/session-properties.svg
3910
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
3911
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3913
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
3914
+ xmlns:cc="http://web.resource.org/cc/"
3915
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
3916
+ xmlns:svg="http://www.w3.org/2000/svg"
3917
+ xmlns="http://www.w3.org/2000/svg"
3918
+ xmlns:xlink="http://www.w3.org/1999/xlink"
3919
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
3920
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
3924
+ sodipodi:version="0.32"
3925
+ inkscape:version="0.44+devel"
3927
+ sodipodi:docname="session-properties.svg"
3928
+ sodipodi:docbase="/home/jimmac/gfx/ximian/art/icons/control-center/22x22"
3929
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
3930
+ sodipodi:modified="true">
3934
+ inkscape:collect="always"
3935
+ id="linearGradient5650">
3937
+ style="stop-color:#d3d7cf;stop-opacity:1;"
3941
+ style="stop-color:#9ea795;stop-opacity:1"
3946
+ inkscape:collect="always"
3947
+ id="linearGradient5642">
3949
+ style="stop-color:#eeeeec;stop-opacity:1;"
3953
+ style="stop-color:#c3c3bc;stop-opacity:1"
3958
+ inkscape:collect="always"
3959
+ id="linearGradient5634">
3961
+ style="stop-color:#ffffff;stop-opacity:1;"
3965
+ style="stop-color:#ffffff;stop-opacity:0;"
3970
+ inkscape:collect="always"
3971
+ id="linearGradient5598">
3973
+ style="stop-color:#ffffff;stop-opacity:1;"
3977
+ style="stop-color:#ffffff;stop-opacity:0;"
3982
+ inkscape:collect="always"
3983
+ id="linearGradient5716">
3985
+ style="stop-color:#ffffff;stop-opacity:1;"
3989
+ style="stop-color:#ffffff;stop-opacity:0;"
3994
+ inkscape:collect="always"
3995
+ id="linearGradient5700">
3997
+ style="stop-color:#e4e4e4;stop-opacity:1;"
4003
+ style="stop-color:#fefefe;stop-opacity:1" />
4005
+ style="stop-color:#ffffff;stop-opacity:1"
4006
+ offset="0.79632628"
4009
+ style="stop-color:#949494;stop-opacity:1"
4014
+ id="linearGradient3832">
4017
+ offset="0.0000000"
4018
+ style="stop-color:#ffffff;stop-opacity:1.0000000" />
4021
+ offset="1.0000000"
4022
+ style="stop-color:#e0e0e0;stop-opacity:1.0000000" />
4025
+ id="linearGradient4816">
4028
+ offset="0.0000000"
4029
+ style="stop-color:#204a87;stop-opacity:1.0000000" />
4032
+ offset="1.0000000"
4033
+ style="stop-color:#204a87;stop-opacity:0.0000000" />
4036
+ id="linearGradient5048">
4040
+ style="stop-color:black;stop-opacity:0;" />
4042
+ style="stop-color:black;stop-opacity:1;"
4048
+ style="stop-color:black;stop-opacity:0;" />
4051
+ id="linearGradient5060"
4052
+ inkscape:collect="always">
4056
+ style="stop-color:black;stop-opacity:1;" />
4060
+ style="stop-color:black;stop-opacity:0;" />
4063
+ inkscape:collect="always"
4064
+ xlink:href="#linearGradient5060"
4065
+ id="radialGradient5664"
4066
+ gradientUnits="userSpaceOnUse"
4067
+ gradientTransform="matrix(-6.6526975e-2,0,0,3.5014969e-2,47.812816,25.161837)"
4074
+ inkscape:collect="always"
4075
+ xlink:href="#linearGradient5060"
4076
+ id="radialGradient5667"
4077
+ gradientUnits="userSpaceOnUse"
4078
+ gradientTransform="matrix(6.6526975e-2,0,0,3.5014969e-2,-0.2505064,25.161837)"
4085
+ inkscape:collect="always"
4086
+ xlink:href="#linearGradient5048"
4087
+ id="linearGradient5670"
4088
+ gradientUnits="userSpaceOnUse"
4089
+ gradientTransform="matrix(6.6526975e-2,0,0,3.5014969e-2,-0.2635996,25.161837)"
4095
+ inkscape:collect="always"
4096
+ xlink:href="#linearGradient3832"
4097
+ id="linearGradient5682"
4098
+ gradientUnits="userSpaceOnUse"
4099
+ gradientTransform="matrix(1.451927,0,0,1.3372801,-45.830775,7.6961475)"
4105
+ inkscape:collect="always"
4106
+ xlink:href="#linearGradient4816"
4107
+ id="linearGradient5684"
4108
+ gradientUnits="userSpaceOnUse"
4109
+ gradientTransform="matrix(1.4668451,0,0,1.8750592,-45.628571,3.9919211)"
4115
+ inkscape:collect="always"
4116
+ xlink:href="#linearGradient5700"
4117
+ id="linearGradient5728"
4118
+ gradientUnits="userSpaceOnUse"
4119
+ gradientTransform="translate(0.5,0)"
4125
+ inkscape:collect="always"
4126
+ xlink:href="#linearGradient5716"
4127
+ id="linearGradient5730"
4128
+ gradientUnits="userSpaceOnUse"
4134
+ inkscape:collect="always"
4137
+ inkscape:collect="always"
4138
+ stdDeviation="0.62861987"
4139
+ id="feGaussianBlur5788" />
4142
+ inkscape:collect="always"
4143
+ xlink:href="#linearGradient5598"
4144
+ id="linearGradient5604"
4149
+ gradientUnits="userSpaceOnUse"
4150
+ gradientTransform="matrix(0.3170731,0,0,0.1513709,0.3902442,0.3687103)" />
4152
+ inkscape:collect="always"
4156
+ height="1.2857143"
4159
+ inkscape:collect="always"
4160
+ stdDeviation="0.42857143"
4161
+ id="feGaussianBlur5630" />
4164
+ inkscape:collect="always"
4165
+ xlink:href="#linearGradient5634"
4166
+ id="linearGradient5640"
4171
+ gradientUnits="userSpaceOnUse"
4172
+ gradientTransform="matrix(0.3182502,0,0,0.3589572,0.3378627,-0.7556826)" />
4174
+ inkscape:collect="always"
4175
+ xlink:href="#linearGradient5642"
4176
+ id="linearGradient5648"
4181
+ gradientUnits="userSpaceOnUse"
4182
+ gradientTransform="matrix(0.3500965,0,0,0.4000001,-0.3752413,-0.8999998)" />
4184
+ inkscape:collect="always"
4185
+ xlink:href="#linearGradient5650"
4186
+ id="linearGradient5656"
4191
+ gradientUnits="userSpaceOnUse"
4192
+ gradientTransform="matrix(0.3500965,0,0,0.4000001,-0.3752413,-0.8999998)" />
4194
+ <sodipodi:namedview
4196
+ pagecolor="#ffffff"
4197
+ bordercolor="#e0e0e0"
4199
+ gridtolerance="10000"
4200
+ guidetolerance="10"
4201
+ objecttolerance="10"
4202
+ inkscape:pageopacity="0.0"
4203
+ inkscape:pageshadow="2"
4205
+ inkscape:cx="13.920386"
4206
+ inkscape:cy="2.77771"
4207
+ inkscape:document-units="px"
4208
+ inkscape:current-layer="layer1"
4211
+ inkscape:showpageshadow="false"
4212
+ inkscape:window-width="1102"
4213
+ inkscape:window-height="958"
4214
+ inkscape:window-x="2117"
4215
+ inkscape:window-y="82"
4217
+ borderlayer="true" />
4219
+ id="metadata7859">
4223
+ <dc:format>image/svg+xml</dc:format>
4225
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
4228
+ <dc:title>Jakub Steiner</dc:title>
4231
+ <dc:source>http://jimmac.musichall.cz</dc:source>
4233
+ rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
4234
+ <dc:title>Gnome Session Properties</dc:title>
4237
+ rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
4239
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
4241
+ rdf:resource="http://web.resource.org/cc/Distribution" />
4243
+ rdf:resource="http://web.resource.org/cc/Notice" />
4245
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
4247
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
4249
+ rdf:resource="http://web.resource.org/cc/SourceCode" />
4254
+ inkscape:label="Layer 1"
4255
+ inkscape:groupmode="layer"
4258
+ style="opacity:1;color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#3465a4;stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
4261
+ height="14.931664"
4265
+ ry="0.85151595" />
4267
+ style="opacity:1;color:#000000;fill:url(#linearGradient5648);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5656);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
4270
+ height="1.9999999"
4274
+ ry="0.91688365" />
4280
+ height="13.594053"
4283
+ style="opacity:0.52571429;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5640);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
4286
+ transform="matrix(0.4041599,0,0,0.4075968,-2.9205921,-0.7107676)">
4288
+ sodipodi:nodetypes="cccccccccc"
4290
+ d="M 11.121851,22.804198 L 23.199467,12.216748 L 23.199467,17.747078 L 36.633956,17.747078 C 44.741684,17.747078 45.5,23.213443 45.5,23.213443 L 45.5,36.603439 C 45.5,36.603439 43.628297,27.513864 36.758956,27.513864 L 23.199467,27.513864 L 23.199467,33 L 11.121851,22.804198 z "
4291
+ style="fill:url(#linearGradient5728);fill-opacity:1;fill-rule:evenodd;stroke:#555753;stroke-width:2.46381474px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
4298
+ height="0.45411268"
4301
+ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5604);stroke-width:0.99999982;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
4304
Index: gnome-session-3.28.0/data/icons/22x22/session-properties.svg
4305
===================================================================
4307
+++ gnome-session-3.28.0/data/icons/22x22/session-properties.svg
4309
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
4310
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
4312
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
4313
+ xmlns:cc="http://web.resource.org/cc/"
4314
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
4315
+ xmlns:svg="http://www.w3.org/2000/svg"
4316
+ xmlns="http://www.w3.org/2000/svg"
4317
+ xmlns:xlink="http://www.w3.org/1999/xlink"
4318
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
4319
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
4323
+ sodipodi:version="0.32"
4324
+ inkscape:version="0.44+devel"
4326
+ sodipodi:docname="session-properties.svg"
4327
+ sodipodi:docbase="/home/jimmac/gfx/ximian/art/icons/control-center/32x32"
4328
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
4329
+ sodipodi:modified="true">
4333
+ inkscape:collect="always"
4334
+ id="linearGradient5650">
4336
+ style="stop-color:#d3d7cf;stop-opacity:1;"
4340
+ style="stop-color:#9ea795;stop-opacity:1"
4345
+ inkscape:collect="always"
4346
+ id="linearGradient5642">
4348
+ style="stop-color:#eeeeec;stop-opacity:1;"
4352
+ style="stop-color:#c3c3bc;stop-opacity:1"
4357
+ inkscape:collect="always"
4358
+ id="linearGradient5634">
4360
+ style="stop-color:#ffffff;stop-opacity:1;"
4364
+ style="stop-color:#ffffff;stop-opacity:0;"
4369
+ inkscape:collect="always"
4370
+ id="linearGradient5598">
4372
+ style="stop-color:#ffffff;stop-opacity:1;"
4376
+ style="stop-color:#ffffff;stop-opacity:0;"
4381
+ inkscape:collect="always"
4382
+ id="linearGradient5716">
4384
+ style="stop-color:#ffffff;stop-opacity:1;"
4388
+ style="stop-color:#ffffff;stop-opacity:0;"
4393
+ inkscape:collect="always"
4394
+ id="linearGradient5700">
4396
+ style="stop-color:#e4e4e4;stop-opacity:1;"
4402
+ style="stop-color:#fefefe;stop-opacity:1" />
4404
+ style="stop-color:#ffffff;stop-opacity:1"
4405
+ offset="0.79632628"
4408
+ style="stop-color:#949494;stop-opacity:1"
4413
+ id="linearGradient3832">
4416
+ offset="0.0000000"
4417
+ style="stop-color:#ffffff;stop-opacity:1.0000000" />
4420
+ offset="1.0000000"
4421
+ style="stop-color:#e0e0e0;stop-opacity:1.0000000" />
4424
+ id="linearGradient4816">
4427
+ offset="0.0000000"
4428
+ style="stop-color:#204a87;stop-opacity:1.0000000" />
4431
+ offset="1.0000000"
4432
+ style="stop-color:#204a87;stop-opacity:0.0000000" />
4435
+ id="linearGradient5048">
4439
+ style="stop-color:black;stop-opacity:0;" />
4441
+ style="stop-color:black;stop-opacity:1;"
4447
+ style="stop-color:black;stop-opacity:0;" />
4450
+ id="linearGradient5060"
4451
+ inkscape:collect="always">
4455
+ style="stop-color:black;stop-opacity:1;" />
4459
+ style="stop-color:black;stop-opacity:0;" />
4462
+ inkscape:collect="always"
4463
+ xlink:href="#linearGradient5060"
4464
+ id="radialGradient5664"
4465
+ gradientUnits="userSpaceOnUse"
4466
+ gradientTransform="matrix(-6.6526975e-2,0,0,3.5014969e-2,47.812816,25.161837)"
4473
+ inkscape:collect="always"
4474
+ xlink:href="#linearGradient5060"
4475
+ id="radialGradient5667"
4476
+ gradientUnits="userSpaceOnUse"
4477
+ gradientTransform="matrix(6.6526975e-2,0,0,3.5014969e-2,-0.2505064,25.161837)"
4484
+ inkscape:collect="always"
4485
+ xlink:href="#linearGradient5048"
4486
+ id="linearGradient5670"
4487
+ gradientUnits="userSpaceOnUse"
4488
+ gradientTransform="matrix(6.6526975e-2,0,0,3.5014969e-2,-0.2635996,25.161837)"
4494
+ inkscape:collect="always"
4495
+ xlink:href="#linearGradient3832"
4496
+ id="linearGradient5682"
4497
+ gradientUnits="userSpaceOnUse"
4498
+ gradientTransform="matrix(1.451927,0,0,1.3372801,-45.830775,7.6961475)"
4504
+ inkscape:collect="always"
4505
+ xlink:href="#linearGradient4816"
4506
+ id="linearGradient5684"
4507
+ gradientUnits="userSpaceOnUse"
4508
+ gradientTransform="matrix(1.4668451,0,0,1.8750592,-45.628571,3.9919211)"
4514
+ inkscape:collect="always"
4515
+ xlink:href="#linearGradient5700"
4516
+ id="linearGradient5728"
4517
+ gradientUnits="userSpaceOnUse"
4518
+ gradientTransform="translate(0.5,0)"
4524
+ inkscape:collect="always"
4525
+ xlink:href="#linearGradient5716"
4526
+ id="linearGradient5730"
4527
+ gradientUnits="userSpaceOnUse"
4533
+ inkscape:collect="always"
4536
+ inkscape:collect="always"
4537
+ stdDeviation="0.62861987"
4538
+ id="feGaussianBlur5788" />
4541
+ inkscape:collect="always"
4542
+ xlink:href="#linearGradient5598"
4543
+ id="linearGradient5604"
4548
+ gradientUnits="userSpaceOnUse"
4549
+ gradientTransform="matrix(0.4311139,0,0,0.1911915,0.6155053,1.0660639)" />
4551
+ inkscape:collect="always"
4555
+ height="1.2857143"
4558
+ inkscape:collect="always"
4559
+ stdDeviation="0.42857143"
4560
+ id="feGaussianBlur5630" />
4563
+ inkscape:collect="always"
4564
+ xlink:href="#linearGradient5634"
4565
+ id="linearGradient5640"
4570
+ gradientUnits="userSpaceOnUse"
4571
+ gradientTransform="matrix(0.4161734,0,0,0.4097743,0.9802818,8.45901e-2)" />
4573
+ inkscape:collect="always"
4574
+ xlink:href="#linearGradient5642"
4575
+ id="linearGradient5648"
4580
+ gradientUnits="userSpaceOnUse"
4581
+ gradientTransform="matrix(0.4415111,0,0,0.3917361,0.3659716,0.1289237)" />
4583
+ inkscape:collect="always"
4584
+ xlink:href="#linearGradient5650"
4585
+ id="linearGradient5656"
4590
+ gradientUnits="userSpaceOnUse"
4591
+ gradientTransform="matrix(0.4415111,0,0,0.3917361,0.3659716,0.1289237)" />
4593
+ <sodipodi:namedview
4595
+ pagecolor="#ffffff"
4596
+ bordercolor="#e0e0e0"
4598
+ gridtolerance="10000"
4599
+ guidetolerance="10"
4600
+ objecttolerance="10"
4601
+ inkscape:pageopacity="0.0"
4602
+ inkscape:pageshadow="2"
4604
+ inkscape:cx="21.888246"
4605
+ inkscape:cy="13.442716"
4606
+ inkscape:document-units="px"
4607
+ inkscape:current-layer="layer1"
4610
+ inkscape:showpageshadow="false"
4611
+ inkscape:window-width="1102"
4612
+ inkscape:window-height="958"
4613
+ inkscape:window-x="2117"
4614
+ inkscape:window-y="82"
4616
+ borderlayer="true" />
4618
+ id="metadata7859">
4622
+ <dc:format>image/svg+xml</dc:format>
4624
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
4627
+ <dc:title>Jakub Steiner</dc:title>
4630
+ <dc:source>http://jimmac.musichall.cz</dc:source>
4632
+ rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
4633
+ <dc:title>Gnome Session Properties</dc:title>
4636
+ rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
4638
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
4640
+ rdf:resource="http://web.resource.org/cc/Distribution" />
4642
+ rdf:resource="http://web.resource.org/cc/Notice" />
4644
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
4646
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
4648
+ rdf:resource="http://web.resource.org/cc/SourceCode" />
4653
+ inkscape:label="Layer 1"
4654
+ inkscape:groupmode="layer"
4658
+ style="opacity:0.53714288"
4659
+ transform="matrix(0.4617581,0,0,0.6375656,-4.8917036e-2,-9.3215937)">
4663
+ height="8.5036354"
4666
+ style="opacity:1;color:#000000;fill:url(#linearGradient5670);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
4668
+ sodipodi:nodetypes="cccc"
4670
+ d="M 39.842663,38.000295 C 39.842663,38.000295 39.842663,46.503461 39.842663,46.503461 C 43.268636,46.519469 48.125002,44.598333 48.125,42.25133 C 48.125,39.904328 44.30187,38.000295 39.842663,38.000295 z "
4671
+ style="opacity:1;color:#000000;fill:url(#radialGradient5667);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
4673
+ style="opacity:1;color:#000000;fill:url(#radialGradient5664);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
4674
+ d="M 7.7196385,38.000295 C 7.7196385,38.000295 7.7196385,46.503461 7.7196385,46.503461 C 4.2936621,46.519469 -0.56270146,44.598333 -0.56270146,42.25133 C -0.56270146,39.904328 3.2604286,38.000295 7.7196385,38.000295 z "
4676
+ sodipodi:nodetypes="cccc" />
4679
+ style="opacity:1;color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#3465a4;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
4682
+ height="16.920202"
4686
+ ry="0.96491748" />
4695
+ style="opacity:0.27999998;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.34036613;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter5628);enable-background:accumulate"
4696
+ transform="matrix(0.4281431,0,0,0.4264257,0.8323174,7.5101245e-3)" />
4698
+ style="opacity:1;color:#000000;fill:url(#linearGradient5648);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5656);stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
4701
+ height="1.9586804"
4705
+ ry="0.89794111" />
4711
+ height="15.518545"
4714
+ style="opacity:0.52571429;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5640);stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
4717
+ transform="matrix(0.4754857,0,0,0.4735784,-1.225003,-0.5239366)">
4719
+ style="opacity:0.3142857;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter5786)"
4720
+ d="M 10.5,25.474874 L 20.5,15.474874 L 20.5,21.005204 L 40.5,21.005204 C 44.35508,21.005204 45.58678,20.95144 45.5,23 L 45.5,33 C 45.5,33 43.070425,29.988738 40.625,29.988738 L 20.5,29.988738 L 20.5,35.474874 L 10.5,25.474874 z "
4722
+ sodipodi:nodetypes="cccccccccc" />
4724
+ sodipodi:nodetypes="cccccccccc"
4726
+ d="M 10.5,23.279959 L 20.5,13.559918 L 20.5,19.090248 L 40.5,19.090248 C 44.35508,19.090248 45.58678,21.511358 45.5,23.559918 L 45.5,33 C 45.5,33 45.096959,27.513864 40.625,27.513864 L 20.5,27.513864 L 20.5,33 L 10.5,23.279959 z "
4727
+ style="fill:url(#linearGradient5728);fill-opacity:1;fill-rule:evenodd;stroke:#555753;stroke-width:2.10734344px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
4729
+ d="M 18.125,18.8125 L 13.9375,23 L 18.09375,27.15625 C 18.269985,25.965284 19.296092,25.085764 20.5,25.09375 L 40.625,25.09375 C 41.541275,25.09375 42.352276,25.289567 43.09375,25.59375 L 43.09375,23 C 43.093144,22.968753 43.093144,22.937497 43.09375,22.90625 C 43.114981,22.405075 42.966583,21.933517 42.6875,21.625 C 42.408417,21.316483 41.921956,20.9375 40.5,20.9375 L 20.5,20.9375 C 19.287205,20.925631 18.271136,20.016516 18.125,18.8125 z "
4730
+ inkscape:href="#path5698"
4732
+ style="opacity:0.62857145;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5730);stroke-width:2.10734344px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
4733
+ xlink:href="#path5698"
4734
+ inkscape:original="M 20.5 13.5625 L 10.5 23.28125 L 20.5 33 L 20.5 27.5 L 40.625 27.5 C 45.096959 27.5 45.5 33 45.5 33 L 45.5 23.5625 C 45.58678 21.51394 44.35508 19.09375 40.5 19.09375 L 20.5 19.09375 L 20.5 13.5625 z "
4735
+ inkscape:radius="-2.4160075"
4736
+ sodipodi:type="inkscape:offset" />
4743
+ height="0.57357448"
4746
+ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5604);stroke-width:0.99999988;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
4749
Index: gnome-session-3.28.0/data/icons/32x32/session-properties.svg
4750
===================================================================
4752
+++ gnome-session-3.28.0/data/icons/32x32/session-properties.svg
4754
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
4755
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
4757
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
4758
+ xmlns:cc="http://web.resource.org/cc/"
4759
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
4760
+ xmlns:svg="http://www.w3.org/2000/svg"
4761
+ xmlns="http://www.w3.org/2000/svg"
4762
+ xmlns:xlink="http://www.w3.org/1999/xlink"
4763
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
4764
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
4768
+ sodipodi:version="0.32"
4769
+ inkscape:version="0.44+devel"
4771
+ sodipodi:docname="session-properties.svg"
4772
+ sodipodi:docbase="/home/jimmac/gfx/ximian/art/icons/control-center/scalable"
4773
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
4774
+ sodipodi:modified="true">
4778
+ inkscape:collect="always"
4779
+ id="linearGradient5650">
4781
+ style="stop-color:#d3d7cf;stop-opacity:1;"
4785
+ style="stop-color:#9ea795;stop-opacity:1"
4790
+ inkscape:collect="always"
4791
+ id="linearGradient5642">
4793
+ style="stop-color:#eeeeec;stop-opacity:1;"
4797
+ style="stop-color:#c3c3bc;stop-opacity:1"
4802
+ inkscape:collect="always"
4803
+ id="linearGradient5634">
4805
+ style="stop-color:#ffffff;stop-opacity:1;"
4809
+ style="stop-color:#ffffff;stop-opacity:0;"
4814
+ inkscape:collect="always"
4815
+ id="linearGradient5598">
4817
+ style="stop-color:#ffffff;stop-opacity:1;"
4821
+ style="stop-color:#ffffff;stop-opacity:0;"
4826
+ inkscape:collect="always"
4827
+ id="linearGradient5716">
4829
+ style="stop-color:#ffffff;stop-opacity:1;"
4833
+ style="stop-color:#ffffff;stop-opacity:0;"
4838
+ inkscape:collect="always"
4839
+ id="linearGradient5700">
4841
+ style="stop-color:#e4e4e4;stop-opacity:1;"
4847
+ style="stop-color:#fefefe;stop-opacity:1" />
4849
+ style="stop-color:#ffffff;stop-opacity:1"
4850
+ offset="0.79632628"
4853
+ style="stop-color:#949494;stop-opacity:1"
4858
+ id="linearGradient3832">
4861
+ offset="0.0000000"
4862
+ style="stop-color:#ffffff;stop-opacity:1.0000000" />
4865
+ offset="1.0000000"
4866
+ style="stop-color:#e0e0e0;stop-opacity:1.0000000" />
4869
+ id="linearGradient4816">
4872
+ offset="0.0000000"
4873
+ style="stop-color:#204a87;stop-opacity:1.0000000" />
4876
+ offset="1.0000000"
4877
+ style="stop-color:#204a87;stop-opacity:0.0000000" />
4880
+ id="linearGradient5048">
4884
+ style="stop-color:black;stop-opacity:0;" />
4886
+ style="stop-color:black;stop-opacity:1;"
4892
+ style="stop-color:black;stop-opacity:0;" />
4895
+ id="linearGradient5060"
4896
+ inkscape:collect="always">
4900
+ style="stop-color:black;stop-opacity:1;" />
4904
+ style="stop-color:black;stop-opacity:0;" />
4907
+ inkscape:collect="always"
4908
+ xlink:href="#linearGradient5060"
4909
+ id="radialGradient5664"
4910
+ gradientUnits="userSpaceOnUse"
4911
+ gradientTransform="matrix(-6.6526975e-2,0,0,3.5014969e-2,47.812816,25.161837)"
4918
+ inkscape:collect="always"
4919
+ xlink:href="#linearGradient5060"
4920
+ id="radialGradient5667"
4921
+ gradientUnits="userSpaceOnUse"
4922
+ gradientTransform="matrix(6.6526975e-2,0,0,3.5014969e-2,-0.2505064,25.161837)"
4929
+ inkscape:collect="always"
4930
+ xlink:href="#linearGradient5048"
4931
+ id="linearGradient5670"
4932
+ gradientUnits="userSpaceOnUse"
4933
+ gradientTransform="matrix(6.6526975e-2,0,0,3.5014969e-2,-0.2635996,25.161837)"
4939
+ inkscape:collect="always"
4940
+ xlink:href="#linearGradient3832"
4941
+ id="linearGradient5682"
4942
+ gradientUnits="userSpaceOnUse"
4943
+ gradientTransform="matrix(1.4257653,0,0,1.3494809,-45.841705,7.4048427)"
4949
+ inkscape:collect="always"
4950
+ xlink:href="#linearGradient4816"
4951
+ id="linearGradient5684"
4952
+ gradientUnits="userSpaceOnUse"
4953
+ gradientTransform="matrix(1.2803684,0,0,1.2242141,-43.519693,10.324658)"
4959
+ inkscape:collect="always"
4960
+ xlink:href="#linearGradient3832"
4961
+ id="linearGradient5694"
4962
+ gradientUnits="userSpaceOnUse"
4963
+ gradientTransform="matrix(1.367592,0,0,1.259127,-45.521751,9.5621318)"
4969
+ inkscape:collect="always"
4970
+ xlink:href="#linearGradient4816"
4971
+ id="linearGradient5696"
4972
+ gradientUnits="userSpaceOnUse"
4973
+ gradientTransform="matrix(1.325819,0,0,1.19936,-44.590631,11.169522)"
4979
+ inkscape:collect="always"
4980
+ xlink:href="#linearGradient5700"
4981
+ id="linearGradient5728"
4982
+ gradientUnits="userSpaceOnUse"
4983
+ gradientTransform="translate(0.5,0)"
4989
+ inkscape:collect="always"
4990
+ xlink:href="#linearGradient5716"
4991
+ id="linearGradient5730"
4992
+ gradientUnits="userSpaceOnUse"
4998
+ inkscape:collect="always"
5001
+ inkscape:collect="always"
5002
+ stdDeviation="0.62861987"
5003
+ id="feGaussianBlur5788" />
5006
+ inkscape:collect="always"
5007
+ xlink:href="#linearGradient5598"
5008
+ id="linearGradient5604"
5013
+ gradientUnits="userSpaceOnUse"
5014
+ gradientTransform="matrix(0.6585366,0,0,0.448956,0.195122,1.1328299)" />
5016
+ inkscape:collect="always"
5020
+ height="1.2857143"
5023
+ inkscape:collect="always"
5024
+ stdDeviation="0.42857143"
5025
+ id="feGaussianBlur5630" />
5028
+ inkscape:collect="always"
5029
+ xlink:href="#linearGradient5634"
5030
+ id="linearGradient5640"
5035
+ gradientUnits="userSpaceOnUse"
5036
+ gradientTransform="matrix(0.6609814,0,0,0.6406647,8.63294e-2,0.2717499)" />
5038
+ inkscape:collect="always"
5039
+ xlink:href="#linearGradient5642"
5040
+ id="linearGradient5648"
5045
+ gradientUnits="userSpaceOnUse"
5046
+ gradientTransform="matrix(0.6744186,0,0,0.6,-0.1860466,0.4000001)" />
5048
+ inkscape:collect="always"
5049
+ xlink:href="#linearGradient5650"
5050
+ id="linearGradient5656"
5055
+ gradientUnits="userSpaceOnUse"
5056
+ gradientTransform="matrix(0.6744186,0,0,0.6,-0.1860466,0.4000001)" />
5058
+ <sodipodi:namedview
5060
+ pagecolor="#ffffff"
5061
+ bordercolor="#e0e0e0"
5063
+ gridtolerance="10000"
5064
+ guidetolerance="10"
5065
+ objecttolerance="10"
5066
+ inkscape:pageopacity="0.0"
5067
+ inkscape:pageshadow="2"
5069
+ inkscape:cx="31.400129"
5070
+ inkscape:cy="-4.050017"
5071
+ inkscape:document-units="px"
5072
+ inkscape:current-layer="layer1"
5075
+ inkscape:showpageshadow="false"
5076
+ inkscape:window-width="1102"
5077
+ inkscape:window-height="958"
5078
+ inkscape:window-x="2117"
5079
+ inkscape:window-y="82"
5080
+ showgrid="false" />
5082
+ id="metadata7859">
5086
+ <dc:format>image/svg+xml</dc:format>
5088
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
5091
+ <dc:title>Jakub Steiner</dc:title>
5094
+ <dc:source>http://jimmac.musichall.cz</dc:source>
5096
+ rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
5097
+ <dc:title>Gnome Session Properties</dc:title>
5100
+ rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
5102
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
5104
+ rdf:resource="http://web.resource.org/cc/Distribution" />
5106
+ rdf:resource="http://web.resource.org/cc/Notice" />
5108
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
5110
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
5112
+ rdf:resource="http://web.resource.org/cc/SourceCode" />
5117
+ inkscape:label="Layer 1"
5118
+ inkscape:groupmode="layer"
5122
+ style="opacity:0.53714288"
5123
+ transform="matrix(0.7053465,0,0,0.9765232,-0.8197989,-14.074824)">
5127
+ height="8.5036354"
5130
+ style="opacity:1;color:#000000;fill:url(#linearGradient5670);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
5132
+ sodipodi:nodetypes="cccc"
5134
+ d="M 39.842663,38.000295 C 39.842663,38.000295 39.842663,46.503461 39.842663,46.503461 C 43.268636,46.519469 48.125002,44.598333 48.125,42.25133 C 48.125,39.904328 44.30187,38.000295 39.842663,38.000295 z "
5135
+ style="opacity:1;color:#000000;fill:url(#radialGradient5667);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
5137
+ style="opacity:1;color:#000000;fill:url(#radialGradient5664);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
5138
+ d="M 7.7196385,38.000295 C 7.7196385,38.000295 7.7196385,46.503461 7.7196385,46.503461 C 4.2936621,46.519469 -0.56270146,44.598333 -0.56270146,42.25133 C -0.56270146,39.904328 3.2604286,38.000295 7.7196385,38.000295 z "
5140
+ sodipodi:nodetypes="cccc" />
5143
+ style="opacity:1;color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#3465a4;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
5146
+ height="25.915714"
5159
+ style="opacity:0.27999998;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.53006899;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter5628);enable-background:accumulate"
5160
+ transform="matrix(0.6539988,0,0,0.6531321,0.5263077,0.2140377)" />
5162
+ style="opacity:1;color:#000000;fill:url(#linearGradient5648);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5656);stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
5175
+ height="24.262585"
5178
+ style="opacity:0.52571429;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5640);stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
5181
+ transform="matrix(0.6539988,0,0,0.6531321,29.351952,-3.3803525)">
5184
+ style="color:#000000;fill:url(#linearGradient5682);fill-opacity:1;fill-rule:evenodd;stroke:#8d8d8d;stroke-width:1.5300703;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
5189
+ height="21.435171"
5190
+ width="22.935822" />
5193
+ style="color:#000000;fill:url(#linearGradient5684);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
5198
+ height="3.0621684"
5199
+ width="18.348656" />
5202
+ style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.53007114;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.47878789;visibility:visible;display:inline;overflow:visible"
5207
+ height="18.373005"
5208
+ width="19.877708" />
5212
+ transform="matrix(0.6539988,0,0,0.6531321,0.5263077,5.4390943)">
5214
+ style="opacity:0.3142857;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter5786)"
5215
+ d="M 10.5,25.474874 L 20.5,15.474874 L 20.5,21.005204 L 40.5,21.005204 C 44.35508,21.005204 45.58678,20.95144 45.5,23 L 45.5,33 C 45.5,33 43.070425,29.988738 40.625,29.988738 L 20.5,29.988738 L 20.5,35.474874 L 10.5,25.474874 z "
5217
+ sodipodi:nodetypes="cccccccccc" />
5219
+ sodipodi:nodetypes="cccccccccc"
5221
+ d="M 10.5,23 L 20.5,13 L 20.5,18.53033 L 40.5,18.53033 C 44.35508,18.53033 45.58678,20.95144 45.5,23 L 45.5,33 C 45.5,33 45.096959,27.513864 40.625,27.513864 L 20.5,27.513864 L 20.5,33 L 10.5,23 z "
5222
+ style="fill:url(#linearGradient5728);fill-opacity:1;fill-rule:evenodd;stroke:#555753;stroke-width:1.53006899px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
5224
+ d="M 19.1875,16.1875 L 12.375,23 L 19.1875,29.8125 L 19.1875,27.5 C 19.191541,26.776807 19.776807,26.191541 20.5,26.1875 L 40.625,26.1875 C 42.124779,26.1875 43.279176,26.742626 44.1875,27.5 L 44.1875,23 C 44.187007,22.97917 44.187007,22.95833 44.1875,22.9375 C 44.218785,22.19897 44.005899,21.434255 43.5,20.875 C 42.994101,20.315745 42.151361,19.84375 40.5,19.84375 L 20.5,19.84375 C 19.776807,19.839709 19.191541,19.254443 19.1875,18.53125 L 19.1875,16.1875 z "
5225
+ inkscape:href="#path5698"
5227
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5730);stroke-width:1.53006899px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
5228
+ xlink:href="#path5698"
5229
+ inkscape:original="M 20.5 13 L 10.5 23 L 20.5 33 L 20.5 27.5 L 40.625 27.5 C 45.096959 27.5 45.5 33 45.5 33 L 45.5 23 C 45.58678 20.95144 44.35508 18.531249 40.5 18.53125 L 20.5 18.53125 L 20.5 13 z "
5230
+ inkscape:radius="-1.3197637"
5231
+ sodipodi:type="inkscape:offset" />
5241
+ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5604);stroke-width:0.99999994;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
5244
Index: gnome-session-3.28.0/data/icons/scalable/session-properties.svg
5245
===================================================================
5247
+++ gnome-session-3.28.0/data/icons/scalable/session-properties.svg
5249
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
5250
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
5252
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
5253
+ xmlns:cc="http://web.resource.org/cc/"
5254
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
5255
+ xmlns:svg="http://www.w3.org/2000/svg"
5256
+ xmlns="http://www.w3.org/2000/svg"
5257
+ xmlns:xlink="http://www.w3.org/1999/xlink"
5258
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
5259
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
5263
+ sodipodi:version="0.32"
5264
+ inkscape:version="0.44+devel"
5266
+ sodipodi:docname="session-properties.svg"
5267
+ sodipodi:docbase="/home/jimmac/gfx/ximian/art/icons/control-center/scalable"
5268
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
5269
+ sodipodi:modified="true">
5273
+ inkscape:collect="always"
5274
+ id="linearGradient5650">
5276
+ style="stop-color:#d3d7cf;stop-opacity:1;"
5280
+ style="stop-color:#9ea795;stop-opacity:1"
5285
+ inkscape:collect="always"
5286
+ id="linearGradient5642">
5288
+ style="stop-color:#eeeeec;stop-opacity:1;"
5292
+ style="stop-color:#c3c3bc;stop-opacity:1"
5297
+ inkscape:collect="always"
5298
+ id="linearGradient5634">
5300
+ style="stop-color:#ffffff;stop-opacity:1;"
5304
+ style="stop-color:#ffffff;stop-opacity:0;"
5309
+ inkscape:collect="always"
5310
+ id="linearGradient5598">
5312
+ style="stop-color:#ffffff;stop-opacity:1;"
5316
+ style="stop-color:#ffffff;stop-opacity:0;"
5321
+ inkscape:collect="always"
5322
+ id="linearGradient5716">
5324
+ style="stop-color:#ffffff;stop-opacity:1;"
5328
+ style="stop-color:#ffffff;stop-opacity:0;"
5333
+ inkscape:collect="always"
5334
+ id="linearGradient5700">
5336
+ style="stop-color:#e4e4e4;stop-opacity:1;"
5342
+ style="stop-color:#fefefe;stop-opacity:1" />
5344
+ style="stop-color:#ffffff;stop-opacity:1"
5345
+ offset="0.79632628"
5348
+ style="stop-color:#949494;stop-opacity:1"
5353
+ id="linearGradient3832">
5356
+ offset="0.0000000"
5357
+ style="stop-color:#ffffff;stop-opacity:1.0000000" />
5360
+ offset="1.0000000"
5361
+ style="stop-color:#e0e0e0;stop-opacity:1.0000000" />
5364
+ id="linearGradient4816">
5367
+ offset="0.0000000"
5368
+ style="stop-color:#204a87;stop-opacity:1.0000000" />
5371
+ offset="1.0000000"
5372
+ style="stop-color:#204a87;stop-opacity:0.0000000" />
5375
+ id="linearGradient5048">
5379
+ style="stop-color:black;stop-opacity:0;" />
5381
+ style="stop-color:black;stop-opacity:1;"
5387
+ style="stop-color:black;stop-opacity:0;" />
5390
+ id="linearGradient5060"
5391
+ inkscape:collect="always">
5395
+ style="stop-color:black;stop-opacity:1;" />
5399
+ style="stop-color:black;stop-opacity:0;" />
5402
+ inkscape:collect="always"
5403
+ xlink:href="#linearGradient5060"
5404
+ id="radialGradient5664"
5405
+ gradientUnits="userSpaceOnUse"
5406
+ gradientTransform="matrix(-6.6526975e-2,0,0,3.5014969e-2,47.812816,25.161837)"
5413
+ inkscape:collect="always"
5414
+ xlink:href="#linearGradient5060"
5415
+ id="radialGradient5667"
5416
+ gradientUnits="userSpaceOnUse"
5417
+ gradientTransform="matrix(6.6526975e-2,0,0,3.5014969e-2,-0.2505064,25.161837)"
5424
+ inkscape:collect="always"
5425
+ xlink:href="#linearGradient5048"
5426
+ id="linearGradient5670"
5427
+ gradientUnits="userSpaceOnUse"
5428
+ gradientTransform="matrix(6.6526975e-2,0,0,3.5014969e-2,-0.2635996,25.161837)"
5434
+ inkscape:collect="always"
5435
+ xlink:href="#linearGradient3832"
5436
+ id="linearGradient5682"
5437
+ gradientUnits="userSpaceOnUse"
5438
+ gradientTransform="matrix(1.367592,0,0,1.259127,-45.521751,9.5621318)"
5444
+ inkscape:collect="always"
5445
+ xlink:href="#linearGradient4816"
5446
+ id="linearGradient5684"
5447
+ gradientUnits="userSpaceOnUse"
5448
+ gradientTransform="matrix(1.325819,0,0,1.19936,-44.590631,11.169522)"
5454
+ inkscape:collect="always"
5455
+ xlink:href="#linearGradient3832"
5456
+ id="linearGradient5694"
5457
+ gradientUnits="userSpaceOnUse"
5458
+ gradientTransform="matrix(1.367592,0,0,1.259127,-45.521751,9.5621318)"
5464
+ inkscape:collect="always"
5465
+ xlink:href="#linearGradient4816"
5466
+ id="linearGradient5696"
5467
+ gradientUnits="userSpaceOnUse"
5468
+ gradientTransform="matrix(1.325819,0,0,1.19936,-44.590631,11.169522)"
5474
+ inkscape:collect="always"
5475
+ xlink:href="#linearGradient5700"
5476
+ id="linearGradient5728"
5477
+ gradientUnits="userSpaceOnUse"
5478
+ gradientTransform="translate(0.5,0)"
5484
+ inkscape:collect="always"
5485
+ xlink:href="#linearGradient5716"
5486
+ id="linearGradient5730"
5487
+ gradientUnits="userSpaceOnUse"
5493
+ inkscape:collect="always"
5496
+ inkscape:collect="always"
5497
+ stdDeviation="0.62861987"
5498
+ id="feGaussianBlur5788" />
5501
+ inkscape:collect="always"
5502
+ xlink:href="#linearGradient5598"
5503
+ id="linearGradient5604"
5508
+ gradientUnits="userSpaceOnUse" />
5510
+ inkscape:collect="always"
5514
+ height="1.2857143"
5517
+ inkscape:collect="always"
5518
+ stdDeviation="0.42857143"
5519
+ id="feGaussianBlur5630" />
5522
+ inkscape:collect="always"
5523
+ xlink:href="#linearGradient5634"
5524
+ id="linearGradient5640"
5529
+ gradientUnits="userSpaceOnUse" />
5531
+ inkscape:collect="always"
5532
+ xlink:href="#linearGradient5642"
5533
+ id="linearGradient5648"
5538
+ gradientUnits="userSpaceOnUse" />
5540
+ inkscape:collect="always"
5541
+ xlink:href="#linearGradient5650"
5542
+ id="linearGradient5656"
5547
+ gradientUnits="userSpaceOnUse" />
5549
+ <sodipodi:namedview
5551
+ pagecolor="#ffffff"
5552
+ bordercolor="#e0e0e0"
5554
+ gridtolerance="10000"
5555
+ guidetolerance="10"
5556
+ objecttolerance="10"
5557
+ inkscape:pageopacity="0.0"
5558
+ inkscape:pageshadow="2"
5560
+ inkscape:cx="20.372005"
5561
+ inkscape:cy="14.768475"
5562
+ inkscape:document-units="px"
5563
+ inkscape:current-layer="layer1"
5566
+ inkscape:showpageshadow="false"
5567
+ inkscape:window-width="1102"
5568
+ inkscape:window-height="958"
5569
+ inkscape:window-x="2117"
5570
+ inkscape:window-y="82"
5571
+ showgrid="false" />
5573
+ id="metadata7859">
5577
+ <dc:format>image/svg+xml</dc:format>
5579
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
5582
+ <dc:title>Jakub Steiner</dc:title>
5585
+ <dc:source>http://jimmac.musichall.cz</dc:source>
5587
+ rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
5588
+ <dc:title>Gnome Session Properties</dc:title>
5591
+ rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
5593
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
5595
+ rdf:resource="http://web.resource.org/cc/Distribution" />
5597
+ rdf:resource="http://web.resource.org/cc/Notice" />
5599
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
5601
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
5603
+ rdf:resource="http://web.resource.org/cc/SourceCode" />
5608
+ inkscape:label="Layer 1"
5609
+ inkscape:groupmode="layer"
5613
+ style="opacity:0.53714286">
5617
+ height="8.5036354"
5620
+ style="opacity:1;color:#000000;fill:url(#linearGradient5670);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
5622
+ sodipodi:nodetypes="cccc"
5624
+ d="M 39.842663,38.000295 C 39.842663,38.000295 39.842663,46.503461 39.842663,46.503461 C 43.268636,46.519469 48.125002,44.598333 48.125,42.25133 C 48.125,39.904328 44.30187,38.000295 39.842663,38.000295 z "
5625
+ style="opacity:1;color:#000000;fill:url(#radialGradient5667);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
5627
+ style="opacity:1;color:#000000;fill:url(#radialGradient5664);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
5628
+ d="M 7.7196385,38.000295 C 7.7196385,38.000295 7.7196385,46.503461 7.7196385,46.503461 C 4.2936621,46.519469 -0.56270146,44.598333 -0.56270146,42.25133 C -0.56270146,39.904328 3.2604286,38.000295 7.7196385,38.000295 z "
5630
+ sodipodi:nodetypes="cccc" />
5633
+ style="opacity:1;color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#3465a4;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
5636
+ height="39.870949"
5649
+ style="opacity:0.28;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;filter:url(#filter5628)" />
5651
+ style="opacity:1;color:#000000;fill:url(#linearGradient5648);fill-opacity:1.0;fill-rule:evenodd;stroke:url(#linearGradient5656);stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
5664
+ height="37.870953"
5667
+ style="opacity:0.52571429;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5640);stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
5670
+ transform="translate(43.499997,-2.124989)">
5673
+ style="color:#000000;fill:url(#linearGradient5682);fill-opacity:1;fill-rule:evenodd;stroke:#8d8d8d;stroke-width:1.00000095;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
5678
+ height="19.999989"
5679
+ width="22.000008" />
5682
+ style="color:#000000;fill:url(#linearGradient5684);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
5691
+ style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000143;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.47878789;visibility:visible;display:inline;overflow:visible"
5696
+ height="18.000002"
5697
+ width="20.000011" />
5700
+ transform="translate(53.499997,-7.124989)"
5704
+ height="19.999989"
5709
+ style="color:#000000;fill:url(#linearGradient5694);fill-opacity:1;fill-rule:evenodd;stroke:#8d8d8d;stroke-width:1.00000095;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
5718
+ style="color:#000000;fill:url(#linearGradient5696);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
5722
+ height="18.000002"
5727
+ style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000143;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.47878789;visibility:visible;display:inline;overflow:visible"
5732
+ transform="translate(0,8)">
5734
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;opacity:0.31428571;filter:url(#filter5786)"
5735
+ d="M 10.5,25.474874 L 20.5,15.474874 L 20.5,21.005204 L 40.5,21.005204 C 44.35508,21.005204 45.58678,20.95144 45.5,23 L 45.5,33 C 45.5,33 43.070425,29.988738 40.625,29.988738 L 20.5,29.988738 L 20.5,35.474874 L 10.5,25.474874 z "
5737
+ sodipodi:nodetypes="cccccccccc" />
5739
+ sodipodi:nodetypes="cccccccccc"
5741
+ d="M 10.5,23 L 20.5,13 L 20.5,18.53033 L 40.5,18.53033 C 44.35508,18.53033 45.58678,20.95144 45.5,23 L 45.5,33 C 45.5,33 45.096959,27.513864 40.625,27.513864 L 20.5,27.513864 L 20.5,33 L 10.5,23 z "
5742
+ style="fill:url(#linearGradient5728);fill-opacity:1;fill-rule:evenodd;stroke:#555753;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
5744
+ d="M 19.5625,15.25 L 11.8125,23 L 19.5625,30.75 L 19.5625,27.5 C 19.55998,27.250596 19.657943,27.010672 19.834307,26.834307 C 20.010672,26.657943 20.250596,26.55998 20.5,26.5625 L 40.625,26.5625 C 42.489029,26.5625 43.674657,27.497362 44.5625,28.5625 L 44.5625,23 C 44.562325,22.989584 44.562325,22.979166 44.5625,22.96875 C 44.597378,22.145414 44.36819,21.273844 43.78125,20.625 C 43.19431,19.976156 42.233327,19.46875 40.5,19.46875 L 20.5,19.46875 C 20.250596,19.47127 20.010672,19.373307 19.834307,19.196943 C 19.657943,19.020578 19.55998,18.780654 19.5625,18.53125 L 19.5625,15.25 z "
5745
+ inkscape:href="#path5698"
5747
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5730);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
5748
+ xlink:href="#path5698"
5749
+ inkscape:original="M 20.5 13 L 10.5 23 L 20.5 33 L 20.5 27.5 L 40.625 27.5 C 45.096959 27.5 45.5 33 45.5 33 L 45.5 23 C 45.58678 20.95144 44.35508 18.531249 40.5 18.53125 L 20.5 18.53125 L 20.5 13 z "
5750
+ inkscape:radius="-0.92807764"
5751
+ sodipodi:type="inkscape:offset" />
5761
+ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5604);stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
5764
Index: gnome-session-3.28.0/data/icons/symbolic/session-properties-symbolic.svg
5765
===================================================================
5767
+++ gnome-session-3.28.0/data/icons/symbolic/session-properties-symbolic.svg
5769
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
5770
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
5772
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='gnome-session-properties-symbolic.svg' height='16.000015' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16.000013' xmlns='http://www.w3.org/2000/svg'>
5773
+ <metadata id='metadata90'>
5775
+ <cc:Work rdf:about=''>
5776
+ <dc:format>image/svg+xml</dc:format>
5777
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
5778
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
5782
+ <sodipodi:namedview inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='16.984015' inkscape:cy='3.9235845' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1376' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='0' inkscape:window-y='27' inkscape:zoom='1'>
5783
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-22' originy='-341.99999' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
5784
+ </sodipodi:namedview>
5785
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
5786
+ <defs id='defs7386'>
5787
+ <linearGradient id='linearGradient7212' osb:paint='solid'>
5788
+ <stop id='stop7214' offset='0' style='stop-color:#000000;stop-opacity:1;'/>
5791
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='apps' style='display:inline' transform='translate(-263.0002,125)'>
5792
+ <path inkscape:connector-curvature='0' d='m 264.03145,-125 c -0.56312,0 -1.03125,0.43688 -1.03125,1 l 0,2 16,0 0,-2 c 0,-0.56312 -0.43688,-1 -1,-1 z' id='rect10231' sodipodi:nodetypes='ssccsss' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:0.36470588;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
5793
+ <path inkscape:connector-curvature='0' d='m 263.0002,-120.96865 0,10.9061 c 0,0.5631 0.46813,1.0314 1.03125,1.0314 l 13.96875,0 c 0.56312,0 1,-0.4683 1,-1.0314 l 0,-10.9061 z m 6,0.9686 9,0 0,7 -9,0 z m 1,2 0,4 7,0 0,-4 z m -5,1 3,0 0,2 -2,0 0,4 7,0 0,-0.9686 1,0 0,1.9686 -9,0 z' id='rect10231-3' sodipodi:nodetypes='cssssccccccccccccccccccccccc' style='color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
5797
Index: gnome-session-3.28.0/data/meson.build
5798
===================================================================
5799
--- gnome-session-3.28.0.orig/data/meson.build
5800
+++ gnome-session-3.28.0/data/meson.build
5801
@@ -162,7 +162,30 @@ if enable_session_selector
5805
+desktop = configure_file(
5806
+ input: 'gnome-session-properties.desktop.in',
5807
+ output: 'gnome-session-properties.desktop',
5808
+ configuration: desktop_conf
5813
+ install_dir : join_paths(session_datadir, 'applications')
5816
+data += files('session-properties.ui')
5820
install_dir: session_pkgdatadir
5823
+icondir = join_paths(get_option('datadir'), 'icons/hicolor')
5824
+foreach size: ['16x16', '22x22', '32x32', 'symbolic']
5825
+ install_subdir('icons/' + size, install_dir: icondir)
5829
+ 'icons/scalable/session-properties.svg',
5830
+ install_dir: icondir + '/scalable/apps'
5832
Index: gnome-session-3.28.0/data/session-properties.ui
5833
===================================================================
5835
+++ gnome-session-3.28.0/data/session-properties.ui
5837
+<?xml version="1.0"?>
5839
+ <requires lib="gtk+" version="2.16"/>
5840
+ <!-- interface-naming-policy toplevel-contextual -->
5841
+ <object class="GtkVBox" id="main-notebook">
5842
+ <property name="visible">True</property>
5843
+ <property name="border_width">6</property>
5845
+ <object class="GtkVBox" id="vbox1">
5846
+ <property name="visible">True</property>
5847
+ <property name="border_width">12</property>
5848
+ <property name="orientation">vertical</property>
5849
+ <property name="spacing">3</property>
5851
+ <object class="GtkLabel" id="label6">
5852
+ <property name="visible">True</property>
5853
+ <property name="xalign">0</property>
5854
+ <property name="xpad">3</property>
5855
+ <property name="ypad">3</property>
5856
+ <property name="label" translatable="yes">Additional startup _programs:</property>
5857
+ <property name="use_underline">True</property>
5858
+ <property name="mnemonic_widget">session_properties_treeview</property>
5861
+ <property name="expand">False</property>
5862
+ <property name="position">0</property>
5866
+ <object class="GtkHBox" id="hbox1">
5867
+ <property name="visible">True</property>
5868
+ <property name="spacing">6</property>
5870
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
5871
+ <property name="visible">True</property>
5872
+ <property name="can_focus">True</property>
5873
+ <property name="hscrollbar_policy">never</property>
5874
+ <property name="vscrollbar_policy">automatic</property>
5875
+ <property name="shadow_type">etched-in</property>
5877
+ <object class="GtkTreeView" id="session_properties_treeview">
5878
+ <property name="height_request">210</property>
5879
+ <property name="visible">True</property>
5880
+ <property name="can_focus">True</property>
5885
+ <property name="position">0</property>
5889
+ <object class="GtkVButtonBox" id="vbuttonbox1">
5890
+ <property name="visible">True</property>
5891
+ <property name="spacing">6</property>
5892
+ <property name="layout_style">start</property>
5894
+ <object class="GtkButton" id="session_properties_add_button">
5895
+ <property name="label">gtk-add</property>
5896
+ <property name="visible">True</property>
5897
+ <property name="can_focus">True</property>
5898
+ <property name="receives_default">True</property>
5899
+ <property name="use_stock">True</property>
5902
+ <property name="expand">False</property>
5903
+ <property name="fill">False</property>
5904
+ <property name="position">0</property>
5908
+ <object class="GtkButton" id="session_properties_delete_button">
5909
+ <property name="label">gtk-remove</property>
5910
+ <property name="visible">True</property>
5911
+ <property name="sensitive">False</property>
5912
+ <property name="can_focus">True</property>
5913
+ <property name="receives_default">True</property>
5914
+ <property name="use_stock">True</property>
5917
+ <property name="expand">False</property>
5918
+ <property name="fill">False</property>
5919
+ <property name="position">1</property>
5923
+ <object class="GtkButton" id="session_properties_edit_button">
5924
+ <property name="label">gtk-edit</property>
5925
+ <property name="visible">True</property>
5926
+ <property name="sensitive">False</property>
5927
+ <property name="can_focus">True</property>
5928
+ <property name="receives_default">True</property>
5929
+ <property name="use_stock">True</property>
5932
+ <property name="expand">False</property>
5933
+ <property name="fill">False</property>
5934
+ <property name="position">2</property>
5939
+ <property name="expand">False</property>
5940
+ <property name="fill">False</property>
5941
+ <property name="position">1</property>
5946
+ <property name="position">1</property>
5952
+ <object class="GtkVBox" id="vbox3">
5953
+ <property name="visible">False</property>
5954
+ <property name="border_width">12</property>
5955
+ <property name="orientation">vertical</property>
5956
+ <property name="spacing">6</property>
5958
+ <object class="GtkCheckButton" id="session_properties_remember_toggle">
5959
+ <property name="label" translatable="yes">_Automatically remember running applications when logging out</property>
5960
+ <property name="visible">True</property>
5961
+ <property name="can_focus">True</property>
5962
+ <property name="receives_default">False</property>
5963
+ <property name="use_underline">True</property>
5964
+ <property name="draw_indicator">True</property>
5967
+ <property name="expand">False</property>
5968
+ <property name="fill">False</property>
5969
+ <property name="position">0</property>
5973
+ <object class="GtkHButtonBox" id="hbuttonbox1">
5974
+ <property name="visible">True</property>
5976
+ <object class="GtkButton" id="session_properties_save_button">
5977
+ <property name="can_focus">True</property>
5978
+ <property name="receives_default">True</property>
5980
+ <object class="GtkHBox" id="hbox2">
5981
+ <property name="visible">True</property>
5982
+ <property name="spacing">4</property>
5984
+ <object class="GtkImage" id="image1">
5985
+ <property name="visible">True</property>
5986
+ <property name="stock">gtk-save</property>
5989
+ <property name="expand">False</property>
5990
+ <property name="fill">False</property>
5991
+ <property name="position">0</property>
5995
+ <object class="GtkLabel" id="label7">
5996
+ <property name="visible">True</property>
5997
+ <property name="label" translatable="yes">_Remember Currently Running Applications</property>
5998
+ <property name="use_underline">True</property>
6001
+ <property name="position">1</property>
6008
+ <property name="expand">False</property>
6009
+ <property name="fill">False</property>
6010
+ <property name="position">0</property>
6015
+ <property name="expand">False</property>
6016
+ <property name="fill">False</property>
6017
+ <property name="position">1</property>
6022
+ <property name="position">1</property>
6026
+ <object class="GtkTable" id="main-table">
6027
+ <property name="visible">True</property>
6028
+ <property name="border_width">6</property>
6029
+ <property name="n_rows">3</property>
6030
+ <property name="n_columns">2</property>
6031
+ <property name="column_spacing">12</property>
6032
+ <property name="row_spacing">6</property>
6034
+ <object class="GtkHBox" id="hbox3">
6035
+ <property name="visible">True</property>
6036
+ <property name="spacing">12</property>
6038
+ <object class="GtkEntry" id="session_properties_command_entry">
6039
+ <property name="visible">True</property>
6040
+ <property name="can_focus">True</property>
6041
+ <property name="invisible_char">●</property>
6044
+ <property name="position">0</property>
6048
+ <object class="GtkButton" id="session_properties_browse_button">
6049
+ <property name="label" translatable="yes">Browse…</property>
6050
+ <property name="visible">True</property>
6051
+ <property name="can_focus">True</property>
6052
+ <property name="receives_default">True</property>
6055
+ <property name="expand">False</property>
6056
+ <property name="fill">False</property>
6057
+ <property name="position">1</property>
6062
+ <property name="left_attach">1</property>
6063
+ <property name="right_attach">2</property>
6064
+ <property name="top_attach">1</property>
6065
+ <property name="bottom_attach">2</property>
6066
+ <property name="y_options">GTK_FILL</property>
6070
+ <object class="GtkEntry" id="session_properties_comment_entry">
6071
+ <property name="visible">True</property>
6072
+ <property name="can_focus">True</property>
6073
+ <property name="invisible_char">●</property>
6076
+ <property name="left_attach">1</property>
6077
+ <property name="right_attach">2</property>
6078
+ <property name="top_attach">2</property>
6079
+ <property name="bottom_attach">3</property>
6080
+ <property name="y_options">GTK_FILL</property>
6084
+ <object class="GtkEntry" id="session_properties_name_entry">
6085
+ <property name="visible">True</property>
6086
+ <property name="can_focus">True</property>
6087
+ <property name="invisible_char">●</property>
6090
+ <property name="left_attach">1</property>
6091
+ <property name="right_attach">2</property>
6092
+ <property name="y_options">GTK_FILL</property>
6096
+ <object class="GtkLabel" id="label3">
6097
+ <property name="visible">True</property>
6098
+ <property name="xalign">0</property>
6099
+ <property name="label" translatable="yes">Comm_ent:</property>
6100
+ <property name="use_underline">True</property>
6101
+ <property name="mnemonic_widget">label2</property>
6104
+ <property name="top_attach">2</property>
6105
+ <property name="bottom_attach">3</property>
6106
+ <property name="x_options">GTK_FILL</property>
6107
+ <property name="y_options">GTK_FILL</property>
6111
+ <object class="GtkLabel" id="label2">
6112
+ <property name="visible">True</property>
6113
+ <property name="xalign">0</property>
6114
+ <property name="label" translatable="yes">Co_mmand:</property>
6115
+ <property name="use_underline">True</property>
6116
+ <property name="mnemonic_widget">session_properties_command_entry</property>
6119
+ <property name="top_attach">1</property>
6120
+ <property name="bottom_attach">2</property>
6121
+ <property name="x_options">GTK_FILL</property>
6122
+ <property name="y_options">GTK_FILL</property>
6126
+ <object class="GtkLabel" id="label1">
6127
+ <property name="visible">True</property>
6128
+ <property name="xalign">0</property>
6129
+ <property name="label" translatable="yes">_Name:</property>
6130
+ <property name="use_underline">True</property>
6131
+ <property name="mnemonic_widget">session_properties_name_entry</property>
6134
+ <property name="x_options">GTK_FILL</property>
6135
+ <property name="y_options">GTK_FILL</property>
6140
Index: gnome-session-3.28.0/doc/man/gnome-session-properties.1
6141
===================================================================
6143
+++ gnome-session-3.28.0/doc/man/gnome-session-properties.1
6146
+.\" gnome-session-properties manual page.
6147
+.\" (C) 2009-2010 Vincent Untz (vuntz@gnome.org)
6149
+.TH GNOME-SESSION-PROPERTIES 1 "GNOME"
6151
+gnome-session-properties \- Configure applications to start on login
6153
+.B gnome-session-properties
6156
+The \fIgnome-session-properties\fP program enables the users to
6157
+configure what applications should be started on login, in addition to
6158
+the default startup applications configured on the system.
6160
+It also proposes an interface to save a snapshot of the currently
6161
+running applications so that they can automatically be restored to
6162
+their current state on your next GNOME session.
6164
+If you find bugs in the \fIgnome-session-properties\fP program, please report
6165
+these on https://bugzilla.gnome.org.
6167
+.BR gnome-session(1)
6168
+.BR gnome-session-quit(1)
6169
Index: gnome-session-3.28.0/doc/man/gnome-session.1
6170
===================================================================
6171
--- gnome-session-3.28.0.orig/doc/man/gnome-session.1
6172
+++ gnome-session-3.28.0/doc/man/gnome-session.1
6173
@@ -94,6 +94,7 @@ when gnome-session is invoked.
6174
.B /usr/share/gnome/autostart
6176
The applications defined in those directories will be started on login.
6177
+\fIgnome-session-properties(1)\fP can be used to easily configure them.
6179
.B $XDG_CONFIG_HOME/gnome-session/sessions
6180
.B $XDG_CONFIG_DIRS/gnome-session/sessions
6181
@@ -109,4 +110,5 @@ This directory contains the list of appl
6182
If you find bugs in the \fIgnome-session\fP program, please report
6183
these on https://bugzilla.gnome.org.
6185
+.BR gnome-session-properties(1)
6186
.BR gnome-session-quit(1)
6187
Index: gnome-session-3.28.0/doc/man/meson.build
6188
===================================================================
6189
--- gnome-session-3.28.0.orig/doc/man/meson.build
6190
+++ gnome-session-3.28.0/doc/man/meson.build
6191
@@ -34,7 +34,8 @@ endforeach
6195
- 'gnome-session-quit.1'
6196
+ 'gnome-session-quit.1',
6197
+ 'gnome-session-properties.1'
6201
Index: gnome-session-3.28.0/meson.build
6202
===================================================================
6203
--- gnome-session-3.28.0.orig/meson.build
6204
+++ gnome-session-3.28.0/meson.build
6205
@@ -179,6 +179,7 @@ top_inc = include_directories('.')
6206
subdir('gnome-session')
6211
enable_docbook = get_option('docbook')
6212
enable_man = get_option('man')
6213
Index: gnome-session-3.28.0/po/POTFILES.in
6214
===================================================================
6215
--- gnome-session-3.28.0.orig/po/POTFILES.in
6216
+++ gnome-session-3.28.0/po/POTFILES.in
6218
# List of source files containing translatable strings.
6219
# Please keep this file sorted alphabetically.
6220
+capplet/gsm-app-dialog.c
6221
+capplet/gsm-properties-dialog.c
6224
data/gnome-custom-session.desktop.in
6225
data/gnome.desktop.in
6226
data/gnome-xorg.desktop.in
6227
data/gnome-dummy.session.desktop.in.in
6228
data/gnome.session.desktop.in.in
6229
+data/gnome-session-properties.desktop.in
6230
data/session-selector.ui
6231
+data/session-properties.ui
6232
data/ubuntu.desktop.in
6233
data/ubuntu-wayland.desktop.in
6234
data/ubuntu-communitheme-snap.desktop.in
6235
Index: gnome-session-3.28.0/po/POTFILES.skip
6236
===================================================================
6237
--- gnome-session-3.28.0.orig/po/POTFILES.skip
6238
+++ gnome-session-3.28.0/po/POTFILES.skip
6240
# Please keep this file sorted alphabetically.
6241
data/gnome-dummy.session.desktop.in
6242
data/gnome.session.desktop.in
6243
+data/gnome-session-properties.desktop