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