diff --git a/ChangeLog b/ChangeLog index dd607599f..984df740f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +Fri Mar 12 10:53:10 1999 Owen Taylor + + * 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 * capplets/theme-switcher/gui.c (browse_dialog_close): diff --git a/capplets/theme-switcher/da.h b/capplets/theme-switcher/da.h index 87b41a1fa..6c34a8c9c 100644 --- a/capplets/theme-switcher/da.h +++ b/capplets/theme-switcher/da.h @@ -59,24 +59,10 @@ list_user_themes(gint *number); GtkWidget * make_main(void); void -click_entry(GtkWidget *widget, gpointer data); -void -delete_entry(GtkWidget *widget, gpointer data); -void update_theme_entries(GtkWidget *disp_list); void signal_apply_theme(GtkWidget *widget); 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); void set_tmp_rc(void); @@ -88,7 +74,7 @@ void click_update(GtkWidget *widget, gpointer data); gchar * install_theme(gchar *file); -void +gint do_demo(int argc, char **argv); void send_socket(void); diff --git a/capplets/theme-switcher/da.h-67648 b/capplets/theme-switcher/da.h-67648 index 87b41a1fa..6c34a8c9c 100644 --- a/capplets/theme-switcher/da.h-67648 +++ b/capplets/theme-switcher/da.h-67648 @@ -59,24 +59,10 @@ list_user_themes(gint *number); GtkWidget * make_main(void); void -click_entry(GtkWidget *widget, gpointer data); -void -delete_entry(GtkWidget *widget, gpointer data); -void update_theme_entries(GtkWidget *disp_list); void signal_apply_theme(GtkWidget *widget); 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); void set_tmp_rc(void); @@ -88,7 +74,7 @@ void click_update(GtkWidget *widget, gpointer data); gchar * install_theme(gchar *file); -void +gint do_demo(int argc, char **argv); void send_socket(void); diff --git a/capplets/theme-switcher/demo.c b/capplets/theme-switcher/demo.c index 325a5b306..7f096c825 100644 --- a/capplets/theme-switcher/demo.c +++ b/capplets/theme-switcher/demo.c @@ -8,8 +8,8 @@ send_socket() { gchar buffer[256]; - g_snprintf(buffer, sizeof(buffer), "%11x ", - GDK_WINDOW_XWINDOW (preview_socket->window)); + g_snprintf(buffer, sizeof(buffer), "%11lx ", + (gulong)GDK_WINDOW_XWINDOW (preview_socket->window)); write(prog_fd, buffer, strlen(buffer)); } @@ -41,7 +41,7 @@ static void demo_main(int argc, char **argv, gint in_fd) { gchar buf[256]; - XID window; + Window window; GtkWidget *widget, *table, *hbox; GtkWidget *scrolled_window; GSList *group; @@ -58,11 +58,11 @@ demo_main(int argc, char **argv, gint in_fd) gint i; if (read(in_fd, buf, 12) <= 0) - g_error ("Error reading socket descriptor from parent: %s", - g_strerror (errno)); + /* Assume this means that our parent exited or was killed */ + exit(0); buf[12] = 0; - sscanf(buf, "%x", &window); + window = strtol (buf, NULL, 16); fcntl(0, F_SETFL, O_NONBLOCK); @@ -161,7 +161,7 @@ demo_main(int argc, char **argv, gint in_fd) gtk_main (); } -void +gint do_demo(int argc, char **argv) { gint toProg[2]; @@ -173,15 +173,17 @@ do_demo(int argc, char **argv) { close(toProg[1]); demo_main(argc, argv, toProg[0]); + exit(0); } else if (pid > 0) { close(toProg[0]); prog_fd = toProg[1]; + return pid; } else { /* baaaaaaaah eeeeek */ + return -1; } - } diff --git a/capplets/theme-switcher/demo.c-45827 b/capplets/theme-switcher/demo.c-45827 index 325a5b306..7f096c825 100644 --- a/capplets/theme-switcher/demo.c-45827 +++ b/capplets/theme-switcher/demo.c-45827 @@ -8,8 +8,8 @@ send_socket() { gchar buffer[256]; - g_snprintf(buffer, sizeof(buffer), "%11x ", - GDK_WINDOW_XWINDOW (preview_socket->window)); + g_snprintf(buffer, sizeof(buffer), "%11lx ", + (gulong)GDK_WINDOW_XWINDOW (preview_socket->window)); write(prog_fd, buffer, strlen(buffer)); } @@ -41,7 +41,7 @@ static void demo_main(int argc, char **argv, gint in_fd) { gchar buf[256]; - XID window; + Window window; GtkWidget *widget, *table, *hbox; GtkWidget *scrolled_window; GSList *group; @@ -58,11 +58,11 @@ demo_main(int argc, char **argv, gint in_fd) gint i; if (read(in_fd, buf, 12) <= 0) - g_error ("Error reading socket descriptor from parent: %s", - g_strerror (errno)); + /* Assume this means that our parent exited or was killed */ + exit(0); buf[12] = 0; - sscanf(buf, "%x", &window); + window = strtol (buf, NULL, 16); fcntl(0, F_SETFL, O_NONBLOCK); @@ -161,7 +161,7 @@ demo_main(int argc, char **argv, gint in_fd) gtk_main (); } -void +gint do_demo(int argc, char **argv) { gint toProg[2]; @@ -173,15 +173,17 @@ do_demo(int argc, char **argv) { close(toProg[1]); demo_main(argc, argv, toProg[0]); + exit(0); } else if (pid > 0) { close(toProg[0]); prog_fd = toProg[1]; + return pid; } else { /* baaaaaaaah eeeeek */ + return -1; } - } diff --git a/capplets/theme-switcher/gui.c b/capplets/theme-switcher/gui.c index 3c97fc82e..bd6815db0 100644 --- a/capplets/theme-switcher/gui.c +++ b/capplets/theme-switcher/gui.c @@ -18,6 +18,21 @@ static GtkWidget *current_global_theme = NULL; static GtkWidget *initial_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 auto_callback (GtkWidget *widget, gpointer data) { @@ -121,6 +136,17 @@ install_theme_callback (GtkWidget *widget, gpointer data) 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 * make_main(void) { @@ -211,6 +237,8 @@ make_main(void) GTK_SIGNAL_FUNC (click_revert), NULL); gtk_signal_connect (GTK_OBJECT (capplet_widget), "cancel", 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); readme_current = NULL; @@ -220,13 +248,13 @@ make_main(void) return capplet_widget; } -void +static void click_update(GtkWidget *widget, gpointer data) { update_theme_entries(theme_list); } -void +static void click_preview(GtkWidget *widget, gpointer data) { gchar *rc; @@ -241,7 +269,7 @@ click_preview(GtkWidget *widget, gpointer data) send_reread(); } -void +static void click_help(GtkWidget *widget, gpointer data) { gchar *tmp; @@ -253,7 +281,7 @@ click_help(GtkWidget *widget, gpointer data) } } -void +static void click_try(GtkWidget *widget, gpointer data) { gchar *rc; @@ -280,7 +308,7 @@ click_try(GtkWidget *widget, gpointer data) /* system(cmd); */ gdk_error_warnings = 1; } -void +static void click_ok(GtkWidget *widget, gpointer 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_sync (); } -void +static void click_revert(GtkWidget *widget, gpointer data) { gchar *rc; @@ -317,7 +345,7 @@ click_revert(GtkWidget *widget, gpointer data) gdk_error_warnings = 1; gtk_list_select_child (GTK_LIST (theme_list), initial_theme); } -void +static void click_entry(GtkWidget *widget, gpointer data) { 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) { gchar *rc, *name, *readme, *icon, *dir; diff --git a/capplets/theme-switcher/gui.c-6060 b/capplets/theme-switcher/gui.c-6060 index 3c97fc82e..bd6815db0 100644 --- a/capplets/theme-switcher/gui.c-6060 +++ b/capplets/theme-switcher/gui.c-6060 @@ -18,6 +18,21 @@ static GtkWidget *current_global_theme = NULL; static GtkWidget *initial_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 auto_callback (GtkWidget *widget, gpointer data) { @@ -121,6 +136,17 @@ install_theme_callback (GtkWidget *widget, gpointer data) 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 * make_main(void) { @@ -211,6 +237,8 @@ make_main(void) GTK_SIGNAL_FUNC (click_revert), NULL); gtk_signal_connect (GTK_OBJECT (capplet_widget), "cancel", 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); readme_current = NULL; @@ -220,13 +248,13 @@ make_main(void) return capplet_widget; } -void +static void click_update(GtkWidget *widget, gpointer data) { update_theme_entries(theme_list); } -void +static void click_preview(GtkWidget *widget, gpointer data) { gchar *rc; @@ -241,7 +269,7 @@ click_preview(GtkWidget *widget, gpointer data) send_reread(); } -void +static void click_help(GtkWidget *widget, gpointer data) { gchar *tmp; @@ -253,7 +281,7 @@ click_help(GtkWidget *widget, gpointer data) } } -void +static void click_try(GtkWidget *widget, gpointer data) { gchar *rc; @@ -280,7 +308,7 @@ click_try(GtkWidget *widget, gpointer data) /* system(cmd); */ gdk_error_warnings = 1; } -void +static void click_ok(GtkWidget *widget, gpointer 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_sync (); } -void +static void click_revert(GtkWidget *widget, gpointer data) { gchar *rc; @@ -317,7 +345,7 @@ click_revert(GtkWidget *widget, gpointer data) gdk_error_warnings = 1; gtk_list_select_child (GTK_LIST (theme_list), initial_theme); } -void +static void click_entry(GtkWidget *widget, gpointer data) { 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) { gchar *rc, *name, *readme, *icon, *dir; diff --git a/capplets/theme-switcher/main.c b/capplets/theme-switcher/main.c index 10a467709..83d8ecae0 100644 --- a/capplets/theme-switcher/main.c +++ b/capplets/theme-switcher/main.c @@ -8,12 +8,13 @@ int main(int argc, char **argv) { GtkWidget *w; + gint child_pid; bindtextdomain (PACKAGE, GNOMELOCALEDIR); textdomain (PACKAGE); set_tmp_rc(); - do_demo(argc, argv); + child_pid = do_demo(argc, argv); switch (gnome_capplet_init ("theme-switcher-capplet", THEME_SWITCHER_VERSION, argc, argv, NULL, 0, NULL)) { case -1: @@ -26,5 +27,11 @@ main(int argc, char **argv) send_socket(); 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; }