1 /*
2 * Copyright (c) 2008 Brian Tarricone <bjt23@cornell.edu>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 2 of the License ONLY.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
16 * MA 02110-1301 USA.
17 */
18
19 #ifdef HAVE_CONFIG_H
20 #include <config.h>
21 #endif
22
23 #ifdef HAVE_STDLIB_H
24 #include <stdlib.h>
25 #endif
26
27 #include <xfconf/xfconf.h>
28
29 #include <gtk/gtk.h>
30 #include <gtk/gtkx.h>
31 #include <gdk/gdkx.h>
32
33 #include <libxfce4util/libxfce4util.h>
34 #include <libxfce4ui/libxfce4ui.h>
35
36 #include <libxfsm/xfsm-util.h>
37
38 #include "xfae-window.h"
39 #include "xfce4-session-settings-common.h"
40 #include "xfce4-session-settings_ui.h"
41
42
xfce4_session_settings_dialog_response(GtkDialog * dialog,gint response,gpointer userdata)43 static void xfce4_session_settings_dialog_response (GtkDialog *dialog, gint response, gpointer userdata)
44 {
45 if (response == GTK_RESPONSE_HELP) {
46 xfce_dialog_show_help (GTK_WINDOW (dialog), "xfce4-session", "preferences", NULL);
47 }
48 else {
49 gtk_widget_destroy(GTK_WIDGET(dialog));
50 gtk_main_quit ();
51 }
52 }
53
54 static void
xfce4_session_settings_show_saved_sessions(GtkBuilder * builder,XfceRc * rc,gboolean visible)55 xfce4_session_settings_show_saved_sessions (GtkBuilder *builder,
56 XfceRc *rc,
57 gboolean visible)
58 {
59 GtkWidget *notebook = GTK_WIDGET (gtk_builder_get_object (builder, "plug-child"));
60 GtkWidget *sessions_treeview = GTK_WIDGET (gtk_builder_get_object (builder, "saved-sessions-list"));
61 GtkTreeModel *model;
62 GList *sessions;
63
64 gtk_widget_set_visible (gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 3), visible);
65 if (visible == FALSE)
66 return;
67
68 settings_list_sessions_treeview_init (GTK_TREE_VIEW (sessions_treeview));
69 sessions = settings_list_sessions (rc);
70 model = gtk_tree_view_get_model (GTK_TREE_VIEW (sessions_treeview));
71 settings_list_sessions_populate (model, sessions);
72 }
73
74 int
main(int argc,char ** argv)75 main(int argc,
76 char **argv)
77 {
78 GtkBuilder *builder;
79 GtkWidget *notebook;
80 GtkWidget *xfae_page;
81 GtkWidget *lbl;
82 GtkWidget *label_active_session;
83 GObject *delete_button;
84 GObject *treeview;
85 GError *error = NULL;
86 XfconfChannel *channel;
87 XfceRc *rc;
88 gboolean visible;
89 gchar *active_session;
90 gchar *active_session_label;
91 const gchar *format;
92 gchar *markup;
93
94 Window opt_socket_id = 0;
95 gboolean opt_version = FALSE;
96
97 GOptionEntry option_entries[] =
98 {
99 { "socket-id", 's', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_INT, &opt_socket_id, N_("Settings manager socket"), N_("SOCKET ID") },
100 { "version", 'V', 0, G_OPTION_ARG_NONE, &opt_version, N_("Version information"), NULL },
101 { NULL }
102 };
103
104 xfce_textdomain(GETTEXT_PACKAGE, LOCALEDIR, "UTF-8");
105
106 if(!gtk_init_with_args (&argc, &argv, NULL, option_entries,
107 GETTEXT_PACKAGE, &error))
108 {
109 if(G_LIKELY(error)) {
110 g_print("%s: %s.\n", G_LOG_DOMAIN, error->message);
111 g_print(_("Type '%s --help' for usage."), G_LOG_DOMAIN);
112 g_print("\n");
113 g_error_free (error);
114 } else
115 g_error("Unable to open display.");
116
117 return EXIT_FAILURE;
118 }
119
120 if(G_UNLIKELY(opt_version)) {
121 g_print("%s %s (Xfce %s)\n\n", G_LOG_DOMAIN, PACKAGE_VERSION, xfce_version_string ());
122 g_print("%s\n", "Copyright (c) 2004-2020");
123 g_print("\t%s\n\n", _("The Xfce development team. All rights reserved."));
124 g_print(_("Please report bugs to <%s>."), PACKAGE_BUGREPORT);
125 g_print("\n");
126
127 return EXIT_SUCCESS;
128 }
129
130 if(G_UNLIKELY(!xfconf_init(&error))) {
131 xfce_dialog_show_error (NULL,
132 error,
133 _("Unable to contact settings server"));
134 g_error_free(error);
135 return EXIT_FAILURE;
136 }
137
138 gtk_window_set_default_icon_name("xfce4-session");
139
140 /* hook to make sure the libxfce4ui library is linked */
141 if (xfce_titled_dialog_get_type() == 0)
142 return EXIT_FAILURE;
143
144 builder = gtk_builder_new();
145 gtk_builder_add_from_string(builder,
146 xfce4_session_settings_ui,
147 xfce4_session_settings_ui_length,
148 &error);
149
150 if(!builder) {
151 if (error) {
152 xfce_dialog_show_error(NULL, error,
153 _("Unable to create user interface from embedded definition data"));
154 g_error_free (error);
155 }
156 return EXIT_FAILURE;
157 }
158
159 session_editor_init(builder);
160
161 channel = xfconf_channel_get (SETTINGS_CHANNEL);
162
163 /* FIXME: someday, glade-ify this, maybe. */
164 xfae_page = xfae_window_new();
165 gtk_widget_show(xfae_page);
166 notebook = GTK_WIDGET(gtk_builder_get_object(builder, "plug-child"));
167 lbl = gtk_label_new_with_mnemonic(_("App_lication Autostart"));
168 gtk_widget_show(lbl);
169 gtk_notebook_insert_page(GTK_NOTEBOOK(notebook), xfae_page, lbl, 1);
170
171 label_active_session = GTK_WIDGET (gtk_builder_get_object (builder, "label_active_session"));
172 active_session = xfconf_channel_get_string (channel, "/general/SessionName", "Default");
173 active_session_label = _("Currently active session:");
174 format = "%s <b>%s</b>";
175 markup = g_markup_printf_escaped (format, active_session_label, active_session);
176 gtk_label_set_markup (GTK_LABEL (label_active_session), markup);
177 g_free (markup);
178
179 delete_button = gtk_builder_get_object (builder, "btn_delete_session");
180 treeview = gtk_builder_get_object (builder, "saved-sessions-list");
181 g_signal_connect (delete_button, "clicked", G_CALLBACK (settings_list_sessions_delete_session), GTK_TREE_VIEW (treeview));
182
183 /* Check if there are saved sessions and if so, show the "Saved Sessions" tab */
184 rc = settings_list_sessions_open_rc ();
185 if (rc)
186 visible = TRUE;
187 else
188 visible = FALSE;
189 xfce4_session_settings_show_saved_sessions (builder, rc, visible);
190
191 /* bind widgets to xfconf */
192 xfconf_g_property_bind(channel, "/chooser/AlwaysDisplay", G_TYPE_BOOLEAN,
193 gtk_builder_get_object(builder, "chk_display_chooser"),
194 "active");
195 xfconf_g_property_bind(channel, "/general/AutoSave", G_TYPE_BOOLEAN,
196 gtk_builder_get_object(builder, "chk_session_autosave"),
197 "active");
198 xfconf_g_property_bind(channel, "/general/PromptOnLogout", G_TYPE_BOOLEAN,
199 gtk_builder_get_object(builder, "chk_logout_prompt"),
200 "active");
201 xfconf_g_property_bind(channel, "/compat/LaunchGNOME", G_TYPE_BOOLEAN,
202 gtk_builder_get_object(builder, "chk_compat_gnome"),
203 "active");
204 xfconf_g_property_bind(channel, "/compat/LaunchKDE", G_TYPE_BOOLEAN,
205 gtk_builder_get_object(builder, "chk_compat_kde"),
206 "active");
207 xfconf_g_property_bind(channel, "/security/EnableTcp", G_TYPE_BOOLEAN,
208 gtk_builder_get_object(builder, "chk_enable_tcp"),
209 "active");
210 xfconf_g_property_bind(channel, "/shutdown/LockScreen", G_TYPE_BOOLEAN,
211 gtk_builder_get_object(builder, "chk_lock_screen"),
212 "active");
213
214 if(G_UNLIKELY(opt_socket_id == 0)) {
215 GtkWidget *dialog = GTK_WIDGET(gtk_builder_get_object(builder, "xfce4_session_settings_dialog"));
216
217 g_signal_connect(dialog, "response", G_CALLBACK(xfce4_session_settings_dialog_response), NULL);
218 g_signal_connect(dialog, "delete-event", G_CALLBACK(gtk_main_quit), NULL);
219
220 gtk_widget_show(dialog);
221
222 /* To prevent the settings dialog to be saved in the session */
223 gdk_x11_set_sm_client_id ("FAKE ID");
224
225 gtk_main();
226 } else {
227 GtkWidget *plug;
228 GtkWidget *plug_child;
229 GtkWidget *parent;
230
231 plug_child = GTK_WIDGET(gtk_builder_get_object(builder, "plug-child"));
232 plug = gtk_plug_new(opt_socket_id);
233 gtk_widget_show (plug);
234
235 parent = gtk_widget_get_parent (plug_child);
236 if (parent)
237 {
238 g_object_ref (plug_child);
239 gtk_container_remove (GTK_CONTAINER (parent), plug_child);
240 gtk_container_add (GTK_CONTAINER (plug), plug_child);
241 g_object_unref (plug_child);
242 }
243 g_signal_connect(plug, "delete-event",
244 G_CALLBACK(gtk_main_quit), NULL);
245
246 /* Stop startup notification */
247 gdk_notify_startup_complete();
248
249 gtk_main();
250 }
251
252 g_object_unref(builder);
253
254 return EXIT_SUCCESS;
255 }
256