diff --git a/capplets/theme-switcher/ChangeLog b/capplets/theme-switcher/ChangeLog index 946fc6880..f3cc2aaba 100644 --- a/capplets/theme-switcher/ChangeLog +++ b/capplets/theme-switcher/ChangeLog @@ -1,3 +1,8 @@ +2001-12-08 Richard Hestilow + + * Partial revamp to use bonobo control instead of bug-prone + custom socket; also port away from libcapplet. + 2001-10-13 Bradford Hovinen * lister.c (edit_file_to_use): Be paranoid about what we have read diff --git a/capplets/theme-switcher/Makefile.am b/capplets/theme-switcher/Makefile.am index f20c7707a..cb1c9f7a0 100644 --- a/capplets/theme-switcher/Makefile.am +++ b/capplets/theme-switcher/Makefile.am @@ -1,3 +1,5 @@ +SUBDIRS = control + cappletname = gtk-theme-selector cappletgroup = "Advanced/" bin_PROGRAMS = gtk-theme-selector-capplet @@ -10,7 +12,6 @@ gtk_theme_selector_capplet_SOURCES = \ lister.c \ main.c \ signals.c \ - demo.c \ gui.c \ install.c diff --git a/capplets/theme-switcher/control/GNOME_Theme_Preview.server.in b/capplets/theme-switcher/control/GNOME_Theme_Preview.server.in new file mode 100644 index 000000000..f1fc3fce7 --- /dev/null +++ b/capplets/theme-switcher/control/GNOME_Theme_Preview.server.in @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/capplets/theme-switcher/control/Makefile.am b/capplets/theme-switcher/control/Makefile.am new file mode 100644 index 000000000..4d3434947 --- /dev/null +++ b/capplets/theme-switcher/control/Makefile.am @@ -0,0 +1,20 @@ +bin_PROGRAMS = gnome-theme-preview + +INCLUDES = \ + -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \ + -I$(top_srcdir) \ + @CONTROL_CFLAGS@ + +gnome_theme_preview_SOURCES = \ + control.c + +gnome_theme_preview_LDADD = \ + @CONTROL_LIBS@ + +serverdir = $(libdir)/bonobo/servers +server_in_files = GNOME_Theme_Preview.server.in +server_DATA = $(server_in_files:.server.in=.server) + +@INTLTOOL_SERVER_RULE@ + +EXTRA_DIST = $(server_in_files) $(server_DATA) diff --git a/capplets/theme-switcher/control/control.c b/capplets/theme-switcher/control/control.c new file mode 100644 index 000000000..2264538cd --- /dev/null +++ b/capplets/theme-switcher/control/control.c @@ -0,0 +1,189 @@ +#include +#include + +static gchar* current_theme = NULL; +static gchar **new_rc_files = NULL; +static gint new_count = 0; + +#define GNOME_PAD_SMALL 4 + +static GtkWidget* +create_form (void) +{ + GtkWidget *widget, *table, *hbox; + GtkWidget *scrolled_window, *menubar, *menu; + GSList *group; + gchar *titles[2] = {N_("One"),N_("Two")}; + /* just 8 short names that will serve as samples for titles in demo */ + gchar *row1[2] = {N_("Eenie"), N_("Meenie")}; + gchar *row2[2] = {N_("Mynie"), N_("Moe")}; + gchar *row3[2] = {N_("Catcha"), N_("Tiger")}; + gchar *row4[2] = {N_("By Its"), N_("Toe")}; + gchar **rc_files; + gint rc_file_count; + gchar *home_dir; + gint i; + + for (i=0;i<2;i++) { + titles[i]=_(titles[i]); + row1[i]=_(row1[i]); + row2[i]=_(row2[i]); + row3[i]=_(row3[i]); + row4[i]=_(row4[i]); + } + + /* Strip out ~/.gtkrc from the set of initial default files. + * to suppress reading of the previous rc file. + */ + + rc_files = gtk_rc_get_default_files(); + for (rc_file_count = 0; rc_files[rc_file_count]; rc_file_count++) + /* Nothing */; + + new_rc_files = g_new (gchar *, rc_file_count + 2); + + home_dir = g_get_home_dir(); + new_count = 0; + + for (i = 0; i #include #include +#include typedef struct _theme_entry { @@ -61,8 +62,6 @@ make_main(void); void update_theme_entries(GtkWidget *disp_list); void -signal_apply_theme(GtkWidget *widget); -void edit_file_to_use(gchar *file, gchar *theme, gchar *font); void set_tmp_rc(void); @@ -72,14 +71,6 @@ void test_theme(gchar *theme, gchar *font); gchar * install_theme(gchar *file); -gint -do_demo(int argc, char **argv); -void -send_socket(void); -void -send_reread(void); - -extern GtkWidget *preview_socket; -extern gint prog_fd; +extern GtkWidget *preview_control; extern gchar gtkrc_tmp[1024]; diff --git a/capplets/theme-switcher/da.h-67648 b/capplets/theme-switcher/da.h-67648 index 35cf5e6fd..0ea160ff6 100644 --- a/capplets/theme-switcher/da.h-67648 +++ b/capplets/theme-switcher/da.h-67648 @@ -7,6 +7,7 @@ #include #include #include +#include typedef struct _theme_entry { @@ -61,8 +62,6 @@ make_main(void); void update_theme_entries(GtkWidget *disp_list); void -signal_apply_theme(GtkWidget *widget); -void edit_file_to_use(gchar *file, gchar *theme, gchar *font); void set_tmp_rc(void); @@ -72,14 +71,6 @@ void test_theme(gchar *theme, gchar *font); gchar * install_theme(gchar *file); -gint -do_demo(int argc, char **argv); -void -send_socket(void); -void -send_reread(void); - -extern GtkWidget *preview_socket; -extern gint prog_fd; +extern GtkWidget *preview_control; extern gchar gtkrc_tmp[1024]; diff --git a/capplets/theme-switcher/gui.c b/capplets/theme-switcher/gui.c index c2eae0c31..fcb71556d 100644 --- a/capplets/theme-switcher/gui.c +++ b/capplets/theme-switcher/gui.c @@ -4,9 +4,10 @@ #endif #include "da.h" -#include "capplet-widget.h" #include +GtkWidget *preview_control; + static gboolean ignore_change = FALSE; static GtkWidget *install_theme_file_sel; @@ -38,6 +39,21 @@ click_revert(GtkWidget *widget, gpointer data); static void click_entry(GtkWidget *clist, gint row, gint col, GdkEvent *event, gpointer data); +static void +state_changed (gboolean state); +static void +response_cb (GtkDialog *dialog, GtkResponseType response, gpointer data); + +void +send_reread(void) +{ + if (!(current_theme && current_theme->rc)) + return; + + bonobo_widget_set_property (BONOBO_WIDGET (preview_control), + "theme", TC_CORBA_string, + gtkrc_tmp, NULL); +} static void auto_callback (GtkWidget *widget, gpointer data) @@ -45,7 +61,7 @@ auto_callback (GtkWidget *widget, gpointer data) if (ignore_change == FALSE) { if (GTK_TOGGLE_BUTTON (auto_preview)->active) click_preview (widget,NULL); - capplet_widget_state_changed(CAPPLET_WIDGET (capplet_widget), TRUE); + state_changed (TRUE); } } @@ -53,7 +69,7 @@ static void font_callback (GtkWidget *widget, gchar *font, gpointer data) { if (ignore_change == FALSE) { - capplet_widget_state_changed(CAPPLET_WIDGET (capplet_widget), TRUE); + state_changed (TRUE); if (GTK_TOGGLE_BUTTON (auto_preview)->active) click_preview (widget,NULL); } @@ -62,7 +78,7 @@ static void use_theme_font_callback (GtkWidget *widget, gpointer data) { if (ignore_change == FALSE) { - capplet_widget_state_changed(CAPPLET_WIDGET (capplet_widget), TRUE); + state_changed (TRUE); if (GTK_TOGGLE_BUTTON (auto_preview)->active) click_preview (widget,NULL); if (!GTK_TOGGLE_BUTTON (font_cbox)->active) @@ -170,16 +186,6 @@ install_theme_callback (GtkWidget *widget, gpointer data) } -static 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) { @@ -188,9 +194,16 @@ make_main(void) GtkWidget *frame, *button; GtkWidget *button_vbox; gboolean default_used; + BonoboUIContainer *container; - capplet_widget = capplet_widget_new(); - gtk_container_set_border_width(GTK_CONTAINER(capplet_widget), 5); + capplet_widget = gtk_dialog_new_with_buttons (_("Gtk+ Theme Selector"), + NULL, -1, + GTK_STOCK_HELP, GTK_RESPONSE_HELP, + GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, + GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, + NULL); + gtk_dialog_set_response_sensitive (GTK_DIALOG (capplet_widget), + GTK_RESPONSE_APPLY, FALSE); box = gtk_vbox_new(FALSE, GNOME_PAD); hbox = gtk_hbox_new(TRUE, GNOME_PAD); @@ -310,23 +323,17 @@ make_main(void) frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 0); - preview_socket = gtk_socket_new(); - gtk_container_add(GTK_CONTAINER(frame), preview_socket); + container = bonobo_ui_container_new (); + preview_control = bonobo_widget_new_control ("OAFIID:GNOME_Theme_Preview", + BONOBO_OBJREF (container)); + bonobo_object_unref (BONOBO_OBJECT (container)); + + gtk_container_add(GTK_CONTAINER(frame), preview_control); update_theme_entries(theme_list); - gtk_signal_connect (GTK_OBJECT (capplet_widget), "help", - GTK_SIGNAL_FUNC (click_help), NULL); - gtk_signal_connect (GTK_OBJECT (capplet_widget), "try", - GTK_SIGNAL_FUNC (click_try), NULL); - gtk_signal_connect (GTK_OBJECT (capplet_widget), "ok", - GTK_SIGNAL_FUNC (click_ok), NULL); - gtk_signal_connect (GTK_OBJECT (capplet_widget), "revert", - 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); + g_signal_connect (G_OBJECT (capplet_widget), "response", response_cb, NULL); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (capplet_widget)->vbox), box, + TRUE, TRUE, 0); last_theme = NULL; @@ -390,7 +397,7 @@ click_try(GtkWidget *widget, gpointer data) use_theme(rc, NULL); } gdk_error_trap_push (); - signal_apply_theme(widget); + signal_apply_theme(capplet_widget); gdk_flush(); /* system(cmd); */ gdk_error_trap_pop (); @@ -489,9 +496,9 @@ click_entry(GtkWidget *clist, gint row, gint col, GdkEvent *event, current_theme = gtk_clist_get_row_data (GTK_CLIST (clist), row); if (initial_theme) - capplet_widget_state_changed(CAPPLET_WIDGET (capplet_widget), TRUE); + state_changed (TRUE); else - capplet_widget_state_changed(CAPPLET_WIDGET (capplet_widget), FALSE); + state_changed (FALSE); if (GTK_TOGGLE_BUTTON (auto_preview)->active) click_preview (NULL,NULL); @@ -614,3 +621,24 @@ update_theme_entries(GtkWidget *disp_list) if (current_theme == NULL) ; } + +static void +response_cb (GtkDialog *dialog, GtkResponseType response, gpointer data) +{ + switch (response) + { + case GTK_RESPONSE_NONE: + case GTK_RESPONSE_CLOSE: + gtk_main_quit (); + break; + case GTK_RESPONSE_APPLY: + click_ok (NULL, NULL); + break; + } +} + +static void state_changed (gboolean state) +{ + gtk_dialog_set_response_sensitive (GTK_DIALOG (capplet_widget), + GTK_RESPONSE_APPLY, state); +} diff --git a/capplets/theme-switcher/gui.c-6060 b/capplets/theme-switcher/gui.c-6060 index c2eae0c31..fcb71556d 100644 --- a/capplets/theme-switcher/gui.c-6060 +++ b/capplets/theme-switcher/gui.c-6060 @@ -4,9 +4,10 @@ #endif #include "da.h" -#include "capplet-widget.h" #include +GtkWidget *preview_control; + static gboolean ignore_change = FALSE; static GtkWidget *install_theme_file_sel; @@ -38,6 +39,21 @@ click_revert(GtkWidget *widget, gpointer data); static void click_entry(GtkWidget *clist, gint row, gint col, GdkEvent *event, gpointer data); +static void +state_changed (gboolean state); +static void +response_cb (GtkDialog *dialog, GtkResponseType response, gpointer data); + +void +send_reread(void) +{ + if (!(current_theme && current_theme->rc)) + return; + + bonobo_widget_set_property (BONOBO_WIDGET (preview_control), + "theme", TC_CORBA_string, + gtkrc_tmp, NULL); +} static void auto_callback (GtkWidget *widget, gpointer data) @@ -45,7 +61,7 @@ auto_callback (GtkWidget *widget, gpointer data) if (ignore_change == FALSE) { if (GTK_TOGGLE_BUTTON (auto_preview)->active) click_preview (widget,NULL); - capplet_widget_state_changed(CAPPLET_WIDGET (capplet_widget), TRUE); + state_changed (TRUE); } } @@ -53,7 +69,7 @@ static void font_callback (GtkWidget *widget, gchar *font, gpointer data) { if (ignore_change == FALSE) { - capplet_widget_state_changed(CAPPLET_WIDGET (capplet_widget), TRUE); + state_changed (TRUE); if (GTK_TOGGLE_BUTTON (auto_preview)->active) click_preview (widget,NULL); } @@ -62,7 +78,7 @@ static void use_theme_font_callback (GtkWidget *widget, gpointer data) { if (ignore_change == FALSE) { - capplet_widget_state_changed(CAPPLET_WIDGET (capplet_widget), TRUE); + state_changed (TRUE); if (GTK_TOGGLE_BUTTON (auto_preview)->active) click_preview (widget,NULL); if (!GTK_TOGGLE_BUTTON (font_cbox)->active) @@ -170,16 +186,6 @@ install_theme_callback (GtkWidget *widget, gpointer data) } -static 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) { @@ -188,9 +194,16 @@ make_main(void) GtkWidget *frame, *button; GtkWidget *button_vbox; gboolean default_used; + BonoboUIContainer *container; - capplet_widget = capplet_widget_new(); - gtk_container_set_border_width(GTK_CONTAINER(capplet_widget), 5); + capplet_widget = gtk_dialog_new_with_buttons (_("Gtk+ Theme Selector"), + NULL, -1, + GTK_STOCK_HELP, GTK_RESPONSE_HELP, + GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, + GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, + NULL); + gtk_dialog_set_response_sensitive (GTK_DIALOG (capplet_widget), + GTK_RESPONSE_APPLY, FALSE); box = gtk_vbox_new(FALSE, GNOME_PAD); hbox = gtk_hbox_new(TRUE, GNOME_PAD); @@ -310,23 +323,17 @@ make_main(void) frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 0); - preview_socket = gtk_socket_new(); - gtk_container_add(GTK_CONTAINER(frame), preview_socket); + container = bonobo_ui_container_new (); + preview_control = bonobo_widget_new_control ("OAFIID:GNOME_Theme_Preview", + BONOBO_OBJREF (container)); + bonobo_object_unref (BONOBO_OBJECT (container)); + + gtk_container_add(GTK_CONTAINER(frame), preview_control); update_theme_entries(theme_list); - gtk_signal_connect (GTK_OBJECT (capplet_widget), "help", - GTK_SIGNAL_FUNC (click_help), NULL); - gtk_signal_connect (GTK_OBJECT (capplet_widget), "try", - GTK_SIGNAL_FUNC (click_try), NULL); - gtk_signal_connect (GTK_OBJECT (capplet_widget), "ok", - GTK_SIGNAL_FUNC (click_ok), NULL); - gtk_signal_connect (GTK_OBJECT (capplet_widget), "revert", - 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); + g_signal_connect (G_OBJECT (capplet_widget), "response", response_cb, NULL); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (capplet_widget)->vbox), box, + TRUE, TRUE, 0); last_theme = NULL; @@ -390,7 +397,7 @@ click_try(GtkWidget *widget, gpointer data) use_theme(rc, NULL); } gdk_error_trap_push (); - signal_apply_theme(widget); + signal_apply_theme(capplet_widget); gdk_flush(); /* system(cmd); */ gdk_error_trap_pop (); @@ -489,9 +496,9 @@ click_entry(GtkWidget *clist, gint row, gint col, GdkEvent *event, current_theme = gtk_clist_get_row_data (GTK_CLIST (clist), row); if (initial_theme) - capplet_widget_state_changed(CAPPLET_WIDGET (capplet_widget), TRUE); + state_changed (TRUE); else - capplet_widget_state_changed(CAPPLET_WIDGET (capplet_widget), FALSE); + state_changed (FALSE); if (GTK_TOGGLE_BUTTON (auto_preview)->active) click_preview (NULL,NULL); @@ -614,3 +621,24 @@ update_theme_entries(GtkWidget *disp_list) if (current_theme == NULL) ; } + +static void +response_cb (GtkDialog *dialog, GtkResponseType response, gpointer data) +{ + switch (response) + { + case GTK_RESPONSE_NONE: + case GTK_RESPONSE_CLOSE: + gtk_main_quit (); + break; + case GTK_RESPONSE_APPLY: + click_ok (NULL, NULL); + break; + } +} + +static void state_changed (gboolean state) +{ + gtk_dialog_set_response_sensitive (GTK_DIALOG (capplet_widget), + GTK_RESPONSE_APPLY, state); +} diff --git a/capplets/theme-switcher/main.c b/capplets/theme-switcher/main.c index 3913c8725..90d1c68f0 100644 --- a/capplets/theme-switcher/main.c +++ b/capplets/theme-switcher/main.c @@ -3,7 +3,6 @@ # include #endif -#include "capplet-widget.h" #include "da.h" #define THEME_SWITCHER_VERSION "0.1" @@ -12,33 +11,19 @@ int main(int argc, char **argv) { GtkWidget *w; - gint child_pid; bindtextdomain (PACKAGE, GNOMELOCALEDIR); textdomain (PACKAGE); set_tmp_rc(); - child_pid = do_demo(argc, argv); - switch (gnome_capplet_init ("gtk-theme-selector", - THEME_SWITCHER_VERSION, argc, argv, NULL, 0, NULL)) { - case -1: - exit (1); - case 1: - return 0; - } + + gnome_program_init ("gtk-theme-selector", THEME_SWITCHER_VERSION, + LIBGNOMEUI_MODULE, argc, argv, NULL); + w = make_main(); gtk_widget_show_all(w); - send_socket(); gtk_main(); - /* This doesn't work any more -- why? */ -#if 0 - /* Pause here until our child exits and the socket can be safely - * destroyed - */ - if (child_pid > 0) - waitpid(child_pid, NULL, 0); -#endif return 0; }