Commit b87a2430 authored by George Lebl's avatar George Lebl

*** empty log message ***

parent 4c21da33
Sun May 06 16:31:07 2001 George Lebl <jirka@5z.com>
* config/Failsafe*, config/Makefile.am, configure.in, gui/gdmlogin.c,
daemon/gdm.h: Use our built in Failsafe thingies since they're more
safe from hosage. Also benicerin translating them and add some
tooltippage.
* config/Xsession, config/Gnome.in: Load in the xresources and
modmap and such magic. Make it work on both rh6 and rh7 and
hopefully others.
* daemon/slave.c: Add more errors and pass some nice parameters
to the failsafe thingies.
Sun May 06 05:36:08 2001 George Lebl <jirka@5z.com>
* gui/gdmlogin.c: use the "Default" script if found as default
......
......@@ -17,14 +17,17 @@ gdm daemon:
o XDMCP
o TCP Wrappers for access control
o Autologin for single user workstations
o Timed login for kiosks and public terminals
gdmlogin:
o Logo image
o Background image/color
o Halt and reboot
o Iconified login window
o Session selection support
o Language selection support
o GNOME session selection support
o Face browser
o Background program support
o Xinerama support
......@@ -34,6 +37,9 @@ gdmchooser:
o Visual host browser
o Customizable icons
gdmconfig:
o GUI way to configure everything about GDM
Most features can be turned on and off in the configuration file by
the sysadmin.
......
......@@ -14,3 +14,4 @@
#undef HAVE_SETENV
#undef HAVE_UNSETENV
#undef HAVE_CLEARENV
#undef EXPANDED_BINDIR
......@@ -2,7 +2,6 @@ libtool
confdefs.h
Makefile.in
Gnome
Failsafe
gdm.conf
gnomerc
Makefile
#!/bin/bash
exec @EXPANDED_SESSDIR@/Xsession failsafe
#!/bin/bash
exec /etc/X11/xdm/Xsession failsafe
......@@ -10,12 +10,78 @@ do
fi
done
resources=$HOME/.Xresources
#
# Distributors:
# You should modify the paths here to fit your distro
# If you need to do so, send me (jirka@5z.com) a patch
# and I'll try to make the script detect the distro stuff
#
if [ -f "$resources" ]; then
xrdb -load "$resources"
userresources=$HOME/.Xresources
usermodmap=$HOME/.Xmodmap
userxkbmap=$HOME/.Xkbmap
sysresources=/etc/X11/Xresources
sysmodmap=/etc/X11/Xmodmap
sysxkbmap=/etc/X11/Xkbmap
rh6sysresources=/etc/X11/xinit/Xresources
rh6sysmodmap=/etc/X11/xinit/Xmodmap
# merge in defaults
if [ -f "$rh6sysresources" ]; then
xrdb -merge "$rh6sysresources"
fi
if [ -f "$sysresources" ]; then
xrdb -merge "$sysresources"
fi
if [ -f "$userresources" ]; then
xrdb -merge "$userresources"
fi
# merge in keymaps
if [ -f "$sysxkbmap" ]; then
setxkbmap `cat "$sysxkbmap"`
XKB_IN_USE=yes
fi
if [ -f "$userxkbmap" ]; then
setxkbmap `cat "$userxkbmap"`
XKB_IN_USE=yes
fi
#
# Eeek, this seems like too much magic here
#
if [ -z "$XKB_IN_USE" -a ! -L /etc/X11/X ]; then
if grep '^exec.*/Xsun' /etc/X11/X > /dev/null 2>&1 && [ -f /etc/X11/XF86Config ]; then
xkbsymbols=`sed -n -e 's/^[ ]*XkbSymbols[ ]*"\(.*\)".*$/\1/p' /etc/X11/XF86Config`
if [ -n "$xkbsymbols" ]; then
setxkbmap -symbols "$xkbsymbols"
XKB_IN_USE=yes
fi
fi
fi
# xkb and xmodmap don't play nice together
if [ -z "$XKB_IN_USE" ]; then
if [ -f "$rh6sysmodmap" ]; then
xmodmap "$rh6sysmodmap"
fi
if [ -f "$sysmodmap" ]; then
xmodmap "$sysmodmap"
fi
if [ -f "$usermodmap" ]; then
xmodmap "$usermodmap"
fi
fi
unset XKB_IN_USE
if [ -x "$HOME/.gnomerc" ]; then
exec "$HOME/.gnomerc"
......
......@@ -16,17 +16,15 @@ EXTRA_DIST = \
Gnome.in \
gnomerc.in \
Xsession \
Failsafe.in \
gdm \
locale.alias \
Default \
PostSession \
PreSession \
Default.redhat \
Default.debian \
Failsafe.redhat
Default.debian
install-data-hook: gdm.conf gnomerc Gnome Failsafe
install-data-hook: gdm.conf gnomerc Gnome
if test '!' -d $(confdir); then \
$(mkinstalldirs) $(confdir); \
chmod 755 $(confdir); \
......@@ -52,10 +50,6 @@ install-data-hook: gdm.conf gnomerc Gnome Failsafe
$(INSTALL_SCRIPT) Gnome $(sessdir)/Gnome; \
fi
if test '!' -f $(sessdir)/Failsafe; then \
$(INSTALL_SCRIPT) Failsafe $(sessdir)/Failsafe; \
fi
if test -e /etc/debian_version; then \
$(INSTALL_SCRIPT) $(srcdir)/Default.debian $(sessdir)/Default; \
fi
......
......@@ -25,7 +25,72 @@ done
freetemp
startup=$HOME/.xsession
resources=$HOME/.Xresources
userresources=$HOME/.Xresources
usermodmap=$HOME/.Xmodmap
userxkbmap=$HOME/.Xkbmap
sysresources=/etc/X11/Xresources
sysmodmap=/etc/X11/Xmodmap
sysxkbmap=/etc/X11/Xkbmap
rh6sysresources=/etc/X11/xinit/Xresources
rh6sysmodmap=/etc/X11/xinit/Xmodmap
# merge in defaults
if [ -f "$rh6sysresources" ]; then
xrdb -merge "$rh6sysresources"
fi
if [ -f "$sysresources" ]; then
xrdb -merge "$sysresources"
fi
if [ -f "$userresources" ]; then
xrdb -merge "$userresources"
fi
# merge in keymaps
if [ -f "$sysxkbmap" ]; then
setxkbmap `cat "$sysxkbmap"`
XKB_IN_USE=yes
fi
if [ -f "$userxkbmap" ]; then
setxkbmap `cat "$userxkbmap"`
XKB_IN_USE=yes
fi
#
# Eeek, this seems like too much magic here
#
if [ -z "$XKB_IN_USE" -a ! -L /etc/X11/X ]; then
if grep '^exec.*/Xsun' /etc/X11/X > /dev/null 2>&1 && [ -f /etc/X11/XF86Config ]; then
xkbsymbols=`sed -n -e 's/^[ ]*XkbSymbols[ ]*"\(.*\)".*$/\1/p' /etc/X11/XF86Config`
if [ -n "$xkbsymbols" ]; then
setxkbmap -symbols "$xkbsymbols"
XKB_IN_USE=yes
fi
fi
fi
# xkb and xmodmap don't play nice together
if [ -z "$XKB_IN_USE" ]; then
if [ -f "$rh6sysmodmap" ]; then
xmodmap "$rh6sysmodmap"
fi
if [ -f "$sysmodmap" ]; then
xmodmap "$sysmodmap"
fi
if [ -f "$usermodmap" ]; then
xmodmap "$usermodmap"
fi
fi
unset XKB_IN_USE
if [ -x "$startup" ]; then
exec "$startup"
......@@ -33,9 +98,8 @@ elif [ -x "$HOME/.Xclients" ]; then
exec "$HOME/.Xclients"
elif [ -x /etc/X11/xinit/Xclients ]; then
exec /etc/X11/xinit/Xclients
elif [ -x /etc/X11/Xclients ]; then
exec /etc/X11/Xclients
else
if [ -f "$resources" ]; then
xrdb -load "$resources"
fi
exec xsm
fi
......@@ -211,6 +211,7 @@ AC_SUBST(EXPANDED_PIXMAPDIR)
BINDIR_TMP="$bindir"
EXPANDED_BINDIR=`eval echo $BINDIR_TMP`
AC_SUBST(EXPANDED_BINDIR)
AC_DEFINE(EXPANDED_BINDIR,"$EXPANDED_BINDIR")
dnl This is where the binary actually resides,
dnl not the console helper link
......@@ -265,7 +266,6 @@ docs/C/Makefile
po/Makefile.in
intl/Makefile
debian/Makefile
config/Failsafe
config/gdm.conf
config/Gnome
config/gnomerc
......
......@@ -171,6 +171,7 @@
#define GDM_SESSION_FAILSAFE_GNOME "GDM_Failsafe.GNOME"
#define GDM_SESSION_FAILSAFE_XTERM "GDM_Failsafe.XTERM"
#define GDM_SESSION_GNOME_CHOOSER "Gnome Chooser"
typedef struct _GdmDisplay GdmDisplay;
......
......@@ -299,35 +299,47 @@ run_error_dialog (const char *error)
GtkWidget *dialog;
GtkWidget *label;
GtkWidget *button;
pid_t pid;
gtk_init (&argc, &argv);
pid = fork ();
/* if we can't fork or we are a child */
if (pid <= 0) {
gtk_init (&argc, &argv);
dialog = gtk_dialog_new ();
dialog = gtk_dialog_new ();
gtk_signal_connect (GTK_OBJECT (dialog), "destroy",
GTK_SIGNAL_FUNC(gtk_main_quit),
NULL);
gtk_signal_connect (GTK_OBJECT (dialog), "destroy",
GTK_SIGNAL_FUNC(gtk_main_quit),
NULL);
gtk_window_set_title (GTK_WINDOW (dialog), _("Cannot start session"));
gtk_window_set_title (GTK_WINDOW (dialog), _("Cannot start session"));
label = gtk_label_new (error);
label = gtk_label_new (error);
gtk_container_set_border_width
(GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 10);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), label,
TRUE, TRUE, 0);
gtk_container_set_border_width
(GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 10);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), label,
TRUE, TRUE, 0);
button = gtk_button_new_with_label (_("OK"));
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
button, TRUE, TRUE, 0);
button = gtk_button_new_with_label (_("OK"));
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
button, TRUE, TRUE, 0);
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (gtk_widget_destroy),
GTK_OBJECT (dialog));
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (gtk_widget_destroy),
GTK_OBJECT (dialog));
gtk_widget_show_all (dialog);
gtk_widget_show_all (dialog);
gtk_main ();
gtk_main ();
if (pid == 0)
_exit (0);
}
if (pid > 0) {
waitpid (pid, 0, 0);
}
}
static void
......@@ -781,6 +793,39 @@ find_a_session (void)
return session;
}
static char *
find_prog (const char *name, const char *args)
{
char *ret;
char *path;
int i;
char *try[] = {
"/usr/bin/X11/",
"/usr/X11R6/bin/",
"/usr/bin/",
"/usr/local/bin/",
EXPANDED_BINDIR "/",
NULL
};
path = gnome_is_program_in_path (name);
if (path != NULL) {
ret = g_strdup_printf ("%s %s", path, args);
g_free (path);
return ret;
}
for (i = 0; try[i] != NULL; i++) {
path = g_strconcat (try[i], name, NULL);
if (g_file_exists (path)) {
ret = g_strdup_printf ("%s %s", path, args);
g_free (path);
return ret;
}
g_free (path);
}
return NULL;
}
static void
gdm_slave_session_start (void)
{
......@@ -888,7 +933,7 @@ gdm_slave_session_start (void)
savelang = TRUE;
g_free (ret);
if (strcmp (session, "Gnome Chooser") == 0) {
if (strcmp (session, GDM_SESSION_GNOME_CHOOSER) == 0) {
char *sessions = gdm_get_sessions (pwent);
ret = gdm_slave_greeter_ctl (GDM_GNOMESESS, sessions);
g_free (sessions);
......@@ -1050,7 +1095,7 @@ gdm_slave_session_start (void)
/* If "Gnome Chooser" is still set as a session,
* just change that to "Gnome", since "Gnome Chooser" is a
* fake */
if (strcmp (session, "Gnome Chooser") == 0) {
if (strcmp (session, GDM_SESSION_GNOME_CHOOSER) == 0) {
g_free (session);
session = g_strdup ("Gnome");
}
......@@ -1069,43 +1114,46 @@ gdm_slave_session_start (void)
sesspath = NULL;
if (strcmp (session, GDM_SESSION_FAILSAFE_GNOME) == 0) {
sesspath = gnome_is_program_in_path ("gnome-session");
sesspath = find_prog ("gnome-session",
"--choose-session=Default");
if (sesspath == NULL) {
if (g_file_exists ("/usr/bin/X11/gnome-session")) {
sesspath = g_strdup ("/usr/bin/X11/gnome-session");
} else if (g_file_exists ("/usr/X11R6/bin/gnome-session")) {
sesspath = g_strdup ("/usr/X11R6/bin/gnome-session");
} else if (g_file_exists ("/usr/bin/gnome-session")) {
sesspath = g_strdup ("/usr/bin/gnome-session");
} else if (g_file_exists ("/usr/local/bin/gnome-session")) {
sesspath = g_strdup ("/usr/local/bin/gnome-session");
} else {
/* yaikes */
gdm_error (_("gdm_slave_session_start: gnome-session not found for a failsafe gnome session, trying xterm"));
g_free (session);
session = g_strdup (GDM_SESSION_FAILSAFE_XTERM);
}
/* yaikes */
gdm_error (_("gdm_slave_session_start: gnome-session not found for a failsafe gnome session, trying xterm"));
g_free (session);
session = g_strdup (GDM_SESSION_FAILSAFE_XTERM);
run_error_dialog
(_("Could not find the GNOME installation,\n"
"will try running the \"Failsafe xterm\"\n"
"session."));
} else {
run_error_dialog
(_("This is the Failsafe Gnome session.\n"
"You will be logged into the 'Default'\n"
"session of Gnome with no startup scripts\n"
"run. This is only to fix problems in\n"
"your installation."));
}
}
/* an if and not an else, we could have done a fall-through
* to here in the above code if we can't find gnome-session */
if (strcmp (session, GDM_SESSION_FAILSAFE_XTERM) == 0) {
sesspath = gnome_is_program_in_path ("xterm");
sesspath = find_prog ("xterm",
"-geometry 80x24-0-0");
if (sesspath == NULL) {
if (g_file_exists ("/usr/bin/X11/xterm")) {
sesspath = g_strdup ("/usr/bin/X11/xterm");
} else if (g_file_exists ("/usr/X11R6/bin/xterm")) {
sesspath = g_strdup ("/usr/X11R6/bin/xterm");
} else if (g_file_exists ("/usr/bin/xterm")) {
sesspath = g_strdup ("/usr/bin/xterm");
} else {
run_error_dialog
(_("Cannot find \"xterm\" to start "
"a failsafe session."));
/* nyah nyah nyah nyah nyah */
_exit (0);
}
run_error_dialog
(_("Cannot find \"xterm\" to start "
"a failsafe session."));
/* nyah nyah nyah nyah nyah */
_exit (0);
} else {
run_error_dialog
(_("This is the Failsafe xterm session.\n"
"You will be logged into a terminal\n"
"console so that you may fix your system\n"
"if you cannot log in any other way.\n"
"To exit the terminal emulator, type\n"
"'exit'and an enter into the window."));
}
}
......
......@@ -50,7 +50,6 @@ rm -f $RPM_BUILD_ROOT%{sysconfdir}/X11/gdm/Sessions/*
install -m 755 config/Default.redhat $RPM_BUILD_ROOT%{sysconfdir}/X11/gdm/Sessions/Default
install -m 755 config/Gnome $RPM_BUILD_ROOT%{sysconfdir}/X11/gdm/Sessions/Gnome
install -m 755 config/Failsafe.redhat $RPM_BUILD_ROOT%{sysconfdir}/X11/gdm/Sessions/Failsafe
ln -sf Default $RPM_BUILD_ROOT%{sysconfdir}/X11/gdm/Sessions/default
# change default Init script to be Red Hat default
......@@ -100,6 +99,10 @@ exit 0
%changelog
* Sun May 06 2001 George Lebl <jirka@5z.com>
- Kill the Failsafe script. GDM will now do failsafe itself, in an actual
failsafe way (meaning it will work with greater degree of hosage)
* Wed Mar 07 2001 George Lebl <jirka@5z.com>
- Fixups, move the security dir as well and build with console helper and
hardwire the sysconfdir to /etc as that seems broke on my 6.2 box otherwise
......
......@@ -60,7 +60,6 @@ const char *session_titles[] = {
N_("Last")
};
#define GNOME_CHOOSER_SESSION "Gnome Chooser"
#define LAST_SESSION "Last"
#define LAST_LANGUAGE "Last"
#define SESSION_NAME "SessionName"
......@@ -112,6 +111,7 @@ static GtkWidget *sessmenu;
static GtkWidget *langmenu;
static GdkWindow *rootwin;
static GdkRectangle screen;
static GtkTooltips *tooltips;
static GnomeIconList *browser;
static GdkImlibImage *defface;
......@@ -932,6 +932,21 @@ gdm_login_list_lookup (GSList *l, const gchar *data)
return (FALSE);
}
static const char *
translate_session (const char *name)
{
/* eek */
if (name == NULL)
return "(null)";
if (strcmp (name, GDM_SESSION_FAILSAFE_GNOME) == 0)
return _("Failsafe Gnome");
else if (strcmp (name, GDM_SESSION_FAILSAFE_XTERM) == 0)
return _("Failsafe xterm");
else
return _(name);
}
static void
gdm_login_session_lookup (const gchar* savedsess)
......@@ -974,7 +989,8 @@ gdm_login_session_lookup (const gchar* savedsess)
session = g_strdup (defsess);
msg = g_strdup_printf (_("Your preferred session type %s is not installed on this machine.\n" \
"Do you wish to make %s the default for future sessions?"),
savedsess, defsess);
translate_session (savedsess),
translate_session (defsess));
savesess = gdm_login_query (msg);
g_free (msg);
}
......@@ -990,7 +1006,9 @@ gdm_login_session_lookup (const gchar* savedsess)
msg = g_strdup_printf (_("You have chosen %s for this session, but your default setting is " \
"%s.\nDo you wish to make %s the default for future sessions?"),
cursess, savedsess, cursess);
translate_session (cursess),
translate_session (savedsess),
translate_session (cursess));
savesess = gdm_login_query (msg);
g_free (msg);
}
......@@ -1333,18 +1351,33 @@ gdm_login_session_init (GtkWidget *menu)
if (strcasecmp_no_locale (dent->d_name, "Gnome") == 0) {
if (defsess == NULL)
defsess = g_strdup (dent->d_name);
/* FIXME: when we get descriptions in session files,
* take this out */
gtk_tooltips_set_tip
(tooltips, GTK_WIDGET (item),
_("This session will log you directly into "
"GNOME, into your current session."),
NULL);
/* Add the chooser session, this one doesn't have a script
* really, it's a fake, it runs the Gnome script */
/* For translators: This is the login that lets users choose the
* specific gnome session they want to use */
item = gtk_radio_menu_item_new_with_label (sessgrp, _("Gnome Chooser"));
gtk_tooltips_set_tip
(tooltips, GTK_WIDGET (item),
_("This session will log you into "
"GNOME and it will let you choose which "
"one of the GNOME sessions you want to "
"use."),
NULL);
gtk_object_set_data (GTK_OBJECT (item),
"SessionName",
GNOME_CHOOSER_SESSION);
GDM_SESSION_GNOME_CHOOSER);
sessgrp = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (item));
sessions = g_slist_append (sessions, GNOME_CHOOSER_SESSION);
sessions = g_slist_append (sessions, GDM_SESSION_GNOME_CHOOSER);
gtk_menu_append (GTK_MENU (menu), item);
gtk_signal_connect (GTK_OBJECT (item), "activate",
GTK_SIGNAL_FUNC (gdm_login_session_handler),
......@@ -1371,38 +1404,52 @@ gdm_login_session_init (GtkWidget *menu)
session_dir_whacked_out = TRUE;
defsess = g_strdup (GDM_SESSION_FAILSAFE_GNOME);
/* For translators: This is the login when the session directory
* really is screwed up. */
item = gtk_radio_menu_item_new_with_label (sessgrp,
_("Failsafe Gnome"));
gtk_object_set_data (GTK_OBJECT (item),
"SessionName", GDM_SESSION_FAILSAFE_GNOME);
sessgrp = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (item));
sessions = g_slist_append (sessions, GDM_SESSION_FAILSAFE_GNOME);
gtk_menu_append (GTK_MENU (menu), item);
gtk_signal_connect (GTK_OBJECT (item), "activate",
GTK_SIGNAL_FUNC (gdm_login_session_handler),
NULL);
gtk_widget_show (GTK_WIDGET (item));
/* For translators: This is the login when the session directory
* really is screwed up. */
item = gtk_radio_menu_item_new_with_label (sessgrp,
_("Failsafe xterm"));
gtk_object_set_data (GTK_OBJECT (item),
"SessionName", GDM_SESSION_FAILSAFE_XTERM);
sessgrp = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (item));
sessions = g_slist_append (sessions, GDM_SESSION_FAILSAFE_XTERM);
gtk_menu_append (GTK_MENU (menu), item);
gtk_signal_connect (GTK_OBJECT (item), "activate",
GTK_SIGNAL_FUNC (gdm_login_session_handler),
NULL);
gtk_widget_show (GTK_WIDGET (item));
}
/* For translators: This is the failsafe login when the user
* can't login otherwise */
item = gtk_radio_menu_item_new_with_label (sessgrp,
_("Failsafe Gnome"));
gtk_tooltips_set_tip (tooltips, GTK_WIDGET (item),
_("This is a failsafe session that will log you "
"into GNOME. No startup scripts will be read "
"and it is only to be used when you can't log "
"in otherwise. GNOME will use the 'Default' "
"session."),
NULL);
gtk_object_set_data (GTK_OBJECT (item),
"SessionName", GDM_SESSION_FAILSAFE_GNOME);
sessgrp = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (item));
sessions = g_slist_append (sessions, GDM_SESSION_FAILSAFE_GNOME);
gtk_menu_append (GTK_MENU (menu), item);
gtk_signal_connect (GTK_OBJECT (item), "activate",
GTK_SIGNAL_FUNC (gdm_login_session_handler),
NULL);
gtk_widget_show (GTK_WIDGET (item));
/* For translators: This is the failsafe login when the user
* can't login otherwise */
item = gtk_radio_menu_item_new_with_label (sessgrp,
_("Failsafe xterm"));
gtk_tooltips_set_tip (tooltips, GTK_WIDGET (item),
_("This is a failsafe session that will log you "
"into a terminal. No startup scripts will be read "
"and it is only to be used when you can't log "
"in otherwise. To exit the terminal, "
"type 'exit'."),
NULL);
gtk_object_set_data (GTK_OBJECT (item),
"SessionName", GDM_SESSION_FAILSAFE_XTERM);
sessgrp = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (item));
sessions = g_slist_append (sessions, GDM_SESSION_FAILSAFE_XTERM);
gtk_menu_append (GTK_MENU (menu), item);
gtk_signal_connect (GTK_OBJECT (item), "activate",
GTK_SIGNAL_FUNC (gdm_login_session_handler),
NULL);
gtk_widget_show (GTK_WIDGET (item));
if (defsess == NULL) {
defsess = gtk_object_get_data (GTK_OBJECT (sessgrp->data), SESSION_NAME);
syslog (LOG_WARNING, _("No default session link found. Using %s.\n"), defsess);
......@@ -3223,6 +3270,8 @@ main (int argc, char *argv[])
setup_cursor (GDK_LEFT_PTR);
tooltips = gtk_tooltips_new ();
rootwin = gdk_window_foreign_new (GDK_ROOT_WINDOW ());
atoms_init ();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment