Wait for our child to exit before quitting. The prevents us from pulling

Fri Mar 12 10:53:10 1999  Owen Taylor  <otaylor@redhat.com>

	* capplets/theme-switcher/main.c (main): Wait for
	our child to exit before quitting. The prevents
	us from pulling the socket window out from under
	our child.

	* capplets/theme-switcher/demo.c (demo_main): Clean
	up some warnings about types in formats.

	* capplets/theme-switcher/demo.c (demo_main): Exit
	cleanly if read from parent fails - don't drop
	a core.
This commit is contained in:
Owen Taylor 1999-03-12 15:46:11 +00:00 committed by Owen Taylor
parent 4d6e8150b5
commit af81c4017f
8 changed files with 116 additions and 63 deletions

View file

@ -1,3 +1,17 @@
Fri Mar 12 10:53:10 1999 Owen Taylor <otaylor@redhat.com>
* capplets/theme-switcher/main.c (main): Wait for
our child to exit before quitting. The prevents
us from pulling the socket window out from under
our child.
* capplets/theme-switcher/demo.c (demo_main): Clean
up some warnings about types in formats.
* capplets/theme-switcher/demo.c (demo_main): Exit
cleanly if read from parent fails - don't drop
a core.
Fri Mar 12 02:21:55 1999 Owen Taylor <otaylor@redhat.com> Fri Mar 12 02:21:55 1999 Owen Taylor <otaylor@redhat.com>
* capplets/theme-switcher/gui.c (browse_dialog_close): * capplets/theme-switcher/gui.c (browse_dialog_close):

View file

@ -59,24 +59,10 @@ list_user_themes(gint *number);
GtkWidget * GtkWidget *
make_main(void); make_main(void);
void void
click_entry(GtkWidget *widget, gpointer data);
void
delete_entry(GtkWidget *widget, gpointer data);
void
update_theme_entries(GtkWidget *disp_list); update_theme_entries(GtkWidget *disp_list);
void void
signal_apply_theme(GtkWidget *widget); signal_apply_theme(GtkWidget *widget);
void void
click_preview(GtkWidget *widget, gpointer data);
void
click_try(GtkWidget *widget, gpointer data);
void
click_help(GtkWidget *widget, gpointer data);
void
click_ok(GtkWidget *widget, gpointer data);
void
click_revert(GtkWidget *widget, gpointer data);
void
edit_file_to_use(gchar *file, gchar *theme); edit_file_to_use(gchar *file, gchar *theme);
void void
set_tmp_rc(void); set_tmp_rc(void);
@ -88,7 +74,7 @@ void
click_update(GtkWidget *widget, gpointer data); click_update(GtkWidget *widget, gpointer data);
gchar * gchar *
install_theme(gchar *file); install_theme(gchar *file);
void gint
do_demo(int argc, char **argv); do_demo(int argc, char **argv);
void void
send_socket(void); send_socket(void);

View file

@ -59,24 +59,10 @@ list_user_themes(gint *number);
GtkWidget * GtkWidget *
make_main(void); make_main(void);
void void
click_entry(GtkWidget *widget, gpointer data);
void
delete_entry(GtkWidget *widget, gpointer data);
void
update_theme_entries(GtkWidget *disp_list); update_theme_entries(GtkWidget *disp_list);
void void
signal_apply_theme(GtkWidget *widget); signal_apply_theme(GtkWidget *widget);
void void
click_preview(GtkWidget *widget, gpointer data);
void
click_try(GtkWidget *widget, gpointer data);
void
click_help(GtkWidget *widget, gpointer data);
void
click_ok(GtkWidget *widget, gpointer data);
void
click_revert(GtkWidget *widget, gpointer data);
void
edit_file_to_use(gchar *file, gchar *theme); edit_file_to_use(gchar *file, gchar *theme);
void void
set_tmp_rc(void); set_tmp_rc(void);
@ -88,7 +74,7 @@ void
click_update(GtkWidget *widget, gpointer data); click_update(GtkWidget *widget, gpointer data);
gchar * gchar *
install_theme(gchar *file); install_theme(gchar *file);
void gint
do_demo(int argc, char **argv); do_demo(int argc, char **argv);
void void
send_socket(void); send_socket(void);

View file

@ -8,8 +8,8 @@ send_socket()
{ {
gchar buffer[256]; gchar buffer[256];
g_snprintf(buffer, sizeof(buffer), "%11x ", g_snprintf(buffer, sizeof(buffer), "%11lx ",
GDK_WINDOW_XWINDOW (preview_socket->window)); (gulong)GDK_WINDOW_XWINDOW (preview_socket->window));
write(prog_fd, buffer, strlen(buffer)); write(prog_fd, buffer, strlen(buffer));
} }
@ -41,7 +41,7 @@ static void
demo_main(int argc, char **argv, gint in_fd) demo_main(int argc, char **argv, gint in_fd)
{ {
gchar buf[256]; gchar buf[256];
XID window; Window window;
GtkWidget *widget, *table, *hbox; GtkWidget *widget, *table, *hbox;
GtkWidget *scrolled_window; GtkWidget *scrolled_window;
GSList *group; GSList *group;
@ -58,11 +58,11 @@ demo_main(int argc, char **argv, gint in_fd)
gint i; gint i;
if (read(in_fd, buf, 12) <= 0) if (read(in_fd, buf, 12) <= 0)
g_error ("Error reading socket descriptor from parent: %s", /* Assume this means that our parent exited or was killed */
g_strerror (errno)); exit(0);
buf[12] = 0; buf[12] = 0;
sscanf(buf, "%x", &window); window = strtol (buf, NULL, 16);
fcntl(0, F_SETFL, O_NONBLOCK); fcntl(0, F_SETFL, O_NONBLOCK);
@ -161,7 +161,7 @@ demo_main(int argc, char **argv, gint in_fd)
gtk_main (); gtk_main ();
} }
void gint
do_demo(int argc, char **argv) do_demo(int argc, char **argv)
{ {
gint toProg[2]; gint toProg[2];
@ -173,15 +173,17 @@ do_demo(int argc, char **argv)
{ {
close(toProg[1]); close(toProg[1]);
demo_main(argc, argv, toProg[0]); demo_main(argc, argv, toProg[0]);
exit(0);
} }
else if (pid > 0) else if (pid > 0)
{ {
close(toProg[0]); close(toProg[0]);
prog_fd = toProg[1]; prog_fd = toProg[1];
return pid;
} }
else else
{ {
/* baaaaaaaah eeeeek */ /* baaaaaaaah eeeeek */
return -1;
} }
} }

View file

@ -8,8 +8,8 @@ send_socket()
{ {
gchar buffer[256]; gchar buffer[256];
g_snprintf(buffer, sizeof(buffer), "%11x ", g_snprintf(buffer, sizeof(buffer), "%11lx ",
GDK_WINDOW_XWINDOW (preview_socket->window)); (gulong)GDK_WINDOW_XWINDOW (preview_socket->window));
write(prog_fd, buffer, strlen(buffer)); write(prog_fd, buffer, strlen(buffer));
} }
@ -41,7 +41,7 @@ static void
demo_main(int argc, char **argv, gint in_fd) demo_main(int argc, char **argv, gint in_fd)
{ {
gchar buf[256]; gchar buf[256];
XID window; Window window;
GtkWidget *widget, *table, *hbox; GtkWidget *widget, *table, *hbox;
GtkWidget *scrolled_window; GtkWidget *scrolled_window;
GSList *group; GSList *group;
@ -58,11 +58,11 @@ demo_main(int argc, char **argv, gint in_fd)
gint i; gint i;
if (read(in_fd, buf, 12) <= 0) if (read(in_fd, buf, 12) <= 0)
g_error ("Error reading socket descriptor from parent: %s", /* Assume this means that our parent exited or was killed */
g_strerror (errno)); exit(0);
buf[12] = 0; buf[12] = 0;
sscanf(buf, "%x", &window); window = strtol (buf, NULL, 16);
fcntl(0, F_SETFL, O_NONBLOCK); fcntl(0, F_SETFL, O_NONBLOCK);
@ -161,7 +161,7 @@ demo_main(int argc, char **argv, gint in_fd)
gtk_main (); gtk_main ();
} }
void gint
do_demo(int argc, char **argv) do_demo(int argc, char **argv)
{ {
gint toProg[2]; gint toProg[2];
@ -173,15 +173,17 @@ do_demo(int argc, char **argv)
{ {
close(toProg[1]); close(toProg[1]);
demo_main(argc, argv, toProg[0]); demo_main(argc, argv, toProg[0]);
exit(0);
} }
else if (pid > 0) else if (pid > 0)
{ {
close(toProg[0]); close(toProg[0]);
prog_fd = toProg[1]; prog_fd = toProg[1];
return pid;
} }
else else
{ {
/* baaaaaaaah eeeeek */ /* baaaaaaaah eeeeek */
return -1;
} }
} }

View file

@ -18,6 +18,21 @@ static GtkWidget *current_global_theme = NULL;
static GtkWidget *initial_theme = NULL; static GtkWidget *initial_theme = NULL;
static GtkWidget *last_theme = NULL; static GtkWidget *last_theme = NULL;
static void
click_preview(GtkWidget *widget, gpointer data);
static void
click_try(GtkWidget *widget, gpointer data);
static void
click_help(GtkWidget *widget, gpointer data);
static void
click_ok(GtkWidget *widget, gpointer data);
static void
click_revert(GtkWidget *widget, gpointer data);
static void
click_entry(GtkWidget *widget, gpointer data);
static void
delete_entry(GtkWidget *widget, gpointer data);
static void static void
auto_callback (GtkWidget *widget, gpointer data) auto_callback (GtkWidget *widget, gpointer data)
{ {
@ -121,6 +136,17 @@ install_theme_callback (GtkWidget *widget, gpointer data)
gtk_widget_show (install_theme_file_sel); gtk_widget_show (install_theme_file_sel);
} }
gint
delete_capplet (GtkWidget *widget, GdkEvent *event, gpointer data)
{
/* We don't want the toplevel window destroyed until
* our child exits.
*/
close(prog_fd);
return FALSE;
}
GtkWidget * GtkWidget *
make_main(void) make_main(void)
{ {
@ -211,6 +237,8 @@ make_main(void)
GTK_SIGNAL_FUNC (click_revert), NULL); GTK_SIGNAL_FUNC (click_revert), NULL);
gtk_signal_connect (GTK_OBJECT (capplet_widget), "cancel", gtk_signal_connect (GTK_OBJECT (capplet_widget), "cancel",
GTK_SIGNAL_FUNC (click_revert), NULL); GTK_SIGNAL_FUNC (click_revert), NULL);
gtk_signal_connect (GTK_OBJECT (capplet_widget), "delete_event",
GTK_SIGNAL_FUNC (delete_capplet), NULL);
gtk_container_add (GTK_CONTAINER (capplet_widget), box); gtk_container_add (GTK_CONTAINER (capplet_widget), box);
readme_current = NULL; readme_current = NULL;
@ -220,13 +248,13 @@ make_main(void)
return capplet_widget; return capplet_widget;
} }
void static void
click_update(GtkWidget *widget, gpointer data) click_update(GtkWidget *widget, gpointer data)
{ {
update_theme_entries(theme_list); update_theme_entries(theme_list);
} }
void static void
click_preview(GtkWidget *widget, gpointer data) click_preview(GtkWidget *widget, gpointer data)
{ {
gchar *rc; gchar *rc;
@ -241,7 +269,7 @@ click_preview(GtkWidget *widget, gpointer data)
send_reread(); send_reread();
} }
void static void
click_help(GtkWidget *widget, gpointer data) click_help(GtkWidget *widget, gpointer data)
{ {
gchar *tmp; gchar *tmp;
@ -253,7 +281,7 @@ click_help(GtkWidget *widget, gpointer data)
} }
} }
void static void
click_try(GtkWidget *widget, gpointer data) click_try(GtkWidget *widget, gpointer data)
{ {
gchar *rc; gchar *rc;
@ -280,7 +308,7 @@ click_try(GtkWidget *widget, gpointer data)
/* system(cmd); */ /* system(cmd); */
gdk_error_warnings = 1; gdk_error_warnings = 1;
} }
void static void
click_ok(GtkWidget *widget, gpointer data) click_ok(GtkWidget *widget, gpointer data)
{ {
click_try (widget, data); click_try (widget, data);
@ -288,7 +316,7 @@ click_ok(GtkWidget *widget, gpointer data)
gnome_config_set_string ("/theme-switcher-capplet/settings/theme", gtk_object_get_data (GTK_OBJECT (current_theme), "name")); gnome_config_set_string ("/theme-switcher-capplet/settings/theme", gtk_object_get_data (GTK_OBJECT (current_theme), "name"));
gnome_config_sync (); gnome_config_sync ();
} }
void static void
click_revert(GtkWidget *widget, gpointer data) click_revert(GtkWidget *widget, gpointer data)
{ {
gchar *rc; gchar *rc;
@ -317,7 +345,7 @@ click_revert(GtkWidget *widget, gpointer data)
gdk_error_warnings = 1; gdk_error_warnings = 1;
gtk_list_select_child (GTK_LIST (theme_list), initial_theme); gtk_list_select_child (GTK_LIST (theme_list), initial_theme);
} }
void static void
click_entry(GtkWidget *widget, gpointer data) click_entry(GtkWidget *widget, gpointer data)
{ {
gchar *rc, *name, *readme, *new_readme, buf[1024]; gchar *rc, *name, *readme, *new_readme, buf[1024];
@ -365,7 +393,7 @@ click_entry(GtkWidget *widget, gpointer data)
} }
} }
void static void
delete_entry(GtkWidget *widget, gpointer data) delete_entry(GtkWidget *widget, gpointer data)
{ {
gchar *rc, *name, *readme, *icon, *dir; gchar *rc, *name, *readme, *icon, *dir;

View file

@ -18,6 +18,21 @@ static GtkWidget *current_global_theme = NULL;
static GtkWidget *initial_theme = NULL; static GtkWidget *initial_theme = NULL;
static GtkWidget *last_theme = NULL; static GtkWidget *last_theme = NULL;
static void
click_preview(GtkWidget *widget, gpointer data);
static void
click_try(GtkWidget *widget, gpointer data);
static void
click_help(GtkWidget *widget, gpointer data);
static void
click_ok(GtkWidget *widget, gpointer data);
static void
click_revert(GtkWidget *widget, gpointer data);
static void
click_entry(GtkWidget *widget, gpointer data);
static void
delete_entry(GtkWidget *widget, gpointer data);
static void static void
auto_callback (GtkWidget *widget, gpointer data) auto_callback (GtkWidget *widget, gpointer data)
{ {
@ -121,6 +136,17 @@ install_theme_callback (GtkWidget *widget, gpointer data)
gtk_widget_show (install_theme_file_sel); gtk_widget_show (install_theme_file_sel);
} }
gint
delete_capplet (GtkWidget *widget, GdkEvent *event, gpointer data)
{
/* We don't want the toplevel window destroyed until
* our child exits.
*/
close(prog_fd);
return FALSE;
}
GtkWidget * GtkWidget *
make_main(void) make_main(void)
{ {
@ -211,6 +237,8 @@ make_main(void)
GTK_SIGNAL_FUNC (click_revert), NULL); GTK_SIGNAL_FUNC (click_revert), NULL);
gtk_signal_connect (GTK_OBJECT (capplet_widget), "cancel", gtk_signal_connect (GTK_OBJECT (capplet_widget), "cancel",
GTK_SIGNAL_FUNC (click_revert), NULL); GTK_SIGNAL_FUNC (click_revert), NULL);
gtk_signal_connect (GTK_OBJECT (capplet_widget), "delete_event",
GTK_SIGNAL_FUNC (delete_capplet), NULL);
gtk_container_add (GTK_CONTAINER (capplet_widget), box); gtk_container_add (GTK_CONTAINER (capplet_widget), box);
readme_current = NULL; readme_current = NULL;
@ -220,13 +248,13 @@ make_main(void)
return capplet_widget; return capplet_widget;
} }
void static void
click_update(GtkWidget *widget, gpointer data) click_update(GtkWidget *widget, gpointer data)
{ {
update_theme_entries(theme_list); update_theme_entries(theme_list);
} }
void static void
click_preview(GtkWidget *widget, gpointer data) click_preview(GtkWidget *widget, gpointer data)
{ {
gchar *rc; gchar *rc;
@ -241,7 +269,7 @@ click_preview(GtkWidget *widget, gpointer data)
send_reread(); send_reread();
} }
void static void
click_help(GtkWidget *widget, gpointer data) click_help(GtkWidget *widget, gpointer data)
{ {
gchar *tmp; gchar *tmp;
@ -253,7 +281,7 @@ click_help(GtkWidget *widget, gpointer data)
} }
} }
void static void
click_try(GtkWidget *widget, gpointer data) click_try(GtkWidget *widget, gpointer data)
{ {
gchar *rc; gchar *rc;
@ -280,7 +308,7 @@ click_try(GtkWidget *widget, gpointer data)
/* system(cmd); */ /* system(cmd); */
gdk_error_warnings = 1; gdk_error_warnings = 1;
} }
void static void
click_ok(GtkWidget *widget, gpointer data) click_ok(GtkWidget *widget, gpointer data)
{ {
click_try (widget, data); click_try (widget, data);
@ -288,7 +316,7 @@ click_ok(GtkWidget *widget, gpointer data)
gnome_config_set_string ("/theme-switcher-capplet/settings/theme", gtk_object_get_data (GTK_OBJECT (current_theme), "name")); gnome_config_set_string ("/theme-switcher-capplet/settings/theme", gtk_object_get_data (GTK_OBJECT (current_theme), "name"));
gnome_config_sync (); gnome_config_sync ();
} }
void static void
click_revert(GtkWidget *widget, gpointer data) click_revert(GtkWidget *widget, gpointer data)
{ {
gchar *rc; gchar *rc;
@ -317,7 +345,7 @@ click_revert(GtkWidget *widget, gpointer data)
gdk_error_warnings = 1; gdk_error_warnings = 1;
gtk_list_select_child (GTK_LIST (theme_list), initial_theme); gtk_list_select_child (GTK_LIST (theme_list), initial_theme);
} }
void static void
click_entry(GtkWidget *widget, gpointer data) click_entry(GtkWidget *widget, gpointer data)
{ {
gchar *rc, *name, *readme, *new_readme, buf[1024]; gchar *rc, *name, *readme, *new_readme, buf[1024];
@ -365,7 +393,7 @@ click_entry(GtkWidget *widget, gpointer data)
} }
} }
void static void
delete_entry(GtkWidget *widget, gpointer data) delete_entry(GtkWidget *widget, gpointer data)
{ {
gchar *rc, *name, *readme, *icon, *dir; gchar *rc, *name, *readme, *icon, *dir;

View file

@ -8,12 +8,13 @@ int
main(int argc, char **argv) main(int argc, char **argv)
{ {
GtkWidget *w; GtkWidget *w;
gint child_pid;
bindtextdomain (PACKAGE, GNOMELOCALEDIR); bindtextdomain (PACKAGE, GNOMELOCALEDIR);
textdomain (PACKAGE); textdomain (PACKAGE);
set_tmp_rc(); set_tmp_rc();
do_demo(argc, argv); child_pid = do_demo(argc, argv);
switch (gnome_capplet_init ("theme-switcher-capplet", switch (gnome_capplet_init ("theme-switcher-capplet",
THEME_SWITCHER_VERSION, argc, argv, NULL, 0, NULL)) { THEME_SWITCHER_VERSION, argc, argv, NULL, 0, NULL)) {
case -1: case -1:
@ -26,5 +27,11 @@ main(int argc, char **argv)
send_socket(); send_socket();
gtk_main(); gtk_main();
/* Pause here until our child exits and the socket can be safely
* destroyed
*/
if (child_pid > 0)
waitpid(child_pid, NULL, 0);
return 0; return 0;
} }