1998-11-21 23:35:51 +00:00
# include <config.h>
1998-09-23 02:39:17 +00:00
# include "da.h"
# include "capplet-widget.h"
# include <signal.h>
1999-03-12 07:28:19 +00:00
static gboolean ignore_change = FALSE ;
1998-10-19 19:03:55 +00:00
1999-03-12 07:28:19 +00:00
static GtkWidget * install_theme_file_sel ;
1998-10-19 19:03:55 +00:00
1999-03-12 07:28:19 +00:00
static GtkWidget * capplet_widget ;
static GtkWidget * theme_list ;
static GtkWidget * auto_preview ;
static GtkWidget * current_theme = NULL ;
static GtkWidget * current_global_theme = NULL ;
static GtkWidget * initial_theme = NULL ;
static GtkWidget * last_theme = NULL ;
1999-04-01 00:58:38 +00:00
static GtkWidget * font_sel ;
static GtkWidget * font_cbox ;
static gboolean initial_preview ;
1999-09-17 19:52:41 +00:00
/* If this is TRUE, then we use the custom font */
1999-04-01 00:58:38 +00:00
static gboolean initial_font_cbox ;
static gchar * initial_font ;
1999-03-12 15:46:11 +00:00
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 ) ;
1999-03-12 07:28:19 +00:00
static void
1998-10-19 19:03:55 +00:00
auto_callback ( GtkWidget * widget , gpointer data )
{
1999-04-01 00:58:38 +00:00
if ( ignore_change = = FALSE ) {
if ( GTK_TOGGLE_BUTTON ( auto_preview ) - > active )
click_preview ( widget , NULL ) ;
capplet_widget_state_changed ( CAPPLET_WIDGET ( capplet_widget ) , TRUE ) ;
}
1998-10-19 19:03:55 +00:00
}
1999-02-26 17:24:10 +00:00
static void
1999-04-01 00:58:38 +00:00
font_callback ( GtkWidget * widget , gchar * font , gpointer data )
{
if ( ignore_change = = FALSE ) {
capplet_widget_state_changed ( CAPPLET_WIDGET ( capplet_widget ) , TRUE ) ;
if ( GTK_TOGGLE_BUTTON ( auto_preview ) - > active )
click_preview ( widget , NULL ) ;
}
}
static void
use_theme_font_callback ( GtkWidget * widget , gpointer data )
{
if ( ignore_change = = FALSE ) {
capplet_widget_state_changed ( CAPPLET_WIDGET ( capplet_widget ) , TRUE ) ;
if ( GTK_TOGGLE_BUTTON ( auto_preview ) - > active )
click_preview ( widget , NULL ) ;
if ( ! GTK_TOGGLE_BUTTON ( font_cbox ) - > active )
gtk_widget_set_sensitive ( font_sel , FALSE ) ;
else
gtk_widget_set_sensitive ( font_sel , TRUE ) ;
}
}
static void
1999-02-26 17:24:10 +00:00
browse_dialog_ok ( GtkWidget * widget , gpointer data )
{
GtkWidget * filesel = gtk_widget_get_toplevel ( widget ) ;
1999-03-12 07:28:19 +00:00
gchar * filename = gtk_file_selection_get_filename ( GTK_FILE_SELECTION ( filesel ) ) ;
gchar * error ;
error = install_theme ( filename ) ;
if ( ! error )
update_theme_entries ( theme_list ) ;
else
{
char * msg = g_strdup_printf ( _ ( " Error installing theme: \n '%s' \n %s " ) ,
filename , error ) ;
GtkWidget * msgbox = gnome_message_box_new ( msg ,
GNOME_MESSAGE_BOX_ERROR ,
GNOME_STOCK_BUTTON_OK ,
NULL ) ;
gnome_dialog_run ( GNOME_DIALOG ( msgbox ) ) ;
g_free ( msg ) ;
g_free ( error ) ;
}
1999-02-26 17:24:10 +00:00
gtk_widget_set_sensitive ( GTK_WIDGET ( data ) , TRUE ) ;
gtk_widget_destroy ( filesel ) ;
}
static void
browse_dialog_close ( GtkWidget * widget , gpointer data )
{
gtk_widget_set_sensitive ( GTK_WIDGET ( data ) , TRUE ) ;
gtk_widget_destroy ( gtk_widget_get_toplevel ( widget ) ) ;
}
static void
browse_dialog_kill ( GtkWidget * widget , gpointer data )
{
gtk_widget_set_sensitive ( GTK_WIDGET ( data ) , TRUE ) ;
}
static void
install_theme_callback ( GtkWidget * widget , gpointer data )
{
GtkWidget * parent ;
gtk_widget_set_sensitive ( widget , FALSE ) ;
install_theme_file_sel = gtk_file_selection_new ( _ ( " Select a theme to install " ) ) ;
gtk_file_selection_hide_fileop_buttons ( GTK_FILE_SELECTION ( install_theme_file_sel ) ) ;
/* BEGIN UGLINESS. This code is stolen from gnome_dialog_set_parent.
* We want its functionality , but it takes a GnomeDialog as its argument .
* So we copy it ) - : */
1999-03-12 07:28:19 +00:00
1999-02-26 17:24:10 +00:00
parent = gtk_widget_get_toplevel ( GTK_WIDGET ( widget ) ) ;
1998-09-23 02:39:17 +00:00
1999-03-12 07:28:19 +00:00
/* We'd like to set a transient_for hint here, but it isn't
* worth the bother , since our parent window isn ' t in this process
*/
1999-02-26 17:24:10 +00:00
if ( gnome_preferences_get_dialog_centered ( ) ) {
/* User wants us to center over parent */
gint x , y , w , h , dialog_x , dialog_y ;
if ( GTK_WIDGET_VISIBLE ( parent ) ) {
/* Throw out other positioning */
gtk_window_set_position ( GTK_WINDOW ( install_theme_file_sel ) ,
GTK_WIN_POS_NONE ) ;
gdk_window_get_origin ( GTK_WIDGET ( parent ) - > window , & x , & y ) ;
gdk_window_get_size ( GTK_WIDGET ( parent ) - > window , & w , & h ) ;
/* The problem here is we don't know how big the dialog is.
So " centered " isn ' t really true . We ' ll go with
" kind of more or less on top " */
dialog_x = x + w / 4 ;
dialog_y = y + h / 4 ;
gtk_widget_set_uposition ( GTK_WIDGET ( install_theme_file_sel ) ,
dialog_x , dialog_y ) ;
}
}
gtk_signal_connect ( GTK_OBJECT ( GTK_FILE_SELECTION ( install_theme_file_sel )
- > ok_button ) , " clicked " ,
( GtkSignalFunc ) browse_dialog_ok ,
widget ) ;
gtk_signal_connect ( GTK_OBJECT ( GTK_FILE_SELECTION ( install_theme_file_sel ) - > cancel_button ) ,
" clicked " ,
GTK_SIGNAL_FUNC ( browse_dialog_close ) ,
widget ) ;
gtk_signal_connect ( GTK_OBJECT ( install_theme_file_sel ) , " destroy " ,
GTK_SIGNAL_FUNC ( browse_dialog_kill ) ,
widget ) ;
if ( gtk_grab_get_current ( ) )
gtk_grab_add ( install_theme_file_sel ) ;
gtk_widget_show ( install_theme_file_sel ) ;
}
1999-03-12 15:46:11 +00:00
1999-08-04 01:27:16 +00:00
static gint
1999-03-12 15:46:11 +00:00
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 ;
}
1998-09-23 02:39:17 +00:00
GtkWidget *
make_main ( void )
{
1999-03-12 07:28:19 +00:00
void * sw , * label ;
1999-04-01 00:58:38 +00:00
GtkWidget * box , * hbox , * hbox2 , * vbox ;
1999-08-04 01:27:16 +00:00
GtkWidget * frame , * button ;
1999-03-12 07:28:19 +00:00
GtkWidget * button_vbox ;
1999-04-01 00:58:38 +00:00
gboolean default_used ;
1998-09-23 02:39:17 +00:00
1999-03-12 07:28:19 +00:00
capplet_widget = capplet_widget_new ( ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( capplet_widget ) , 5 ) ;
1998-09-23 02:39:17 +00:00
1998-10-19 19:03:55 +00:00
box = gtk_vbox_new ( FALSE , GNOME_PAD ) ;
hbox = gtk_hbox_new ( TRUE , GNOME_PAD ) ;
1998-11-21 23:35:51 +00:00
frame = gtk_frame_new ( _ ( " Available Themes " ) ) ;
1999-03-12 07:28:19 +00:00
hbox2 = gtk_hbox_new ( FALSE , 0 ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( hbox2 ) , GNOME_PAD_SMALL ) ;
1998-10-19 19:03:55 +00:00
gtk_box_pack_start ( GTK_BOX ( hbox ) , frame , TRUE , TRUE , 0 ) ;
1998-09-23 02:39:17 +00:00
gtk_box_pack_start ( GTK_BOX ( box ) , hbox , TRUE , TRUE , 0 ) ;
1999-03-12 07:28:19 +00:00
gtk_container_add ( GTK_CONTAINER ( frame ) , hbox2 ) ;
/* List of available themes
*/
theme_list = gtk_list_new ( ) ;
gtk_list_set_selection_mode ( GTK_LIST ( theme_list ) , GTK_SELECTION_BROWSE ) ;
sw = gtk_scrolled_window_new ( NULL , NULL ) ;
gtk_scrolled_window_add_with_viewport ( GTK_SCROLLED_WINDOW ( sw ) , theme_list ) ;
gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW ( sw ) , GTK_POLICY_AUTOMATIC ,
GTK_POLICY_AUTOMATIC ) ;
gtk_widget_set_usize ( sw , 120 , - 1 ) ;
gtk_box_pack_start ( GTK_BOX ( hbox2 ) , sw , TRUE , TRUE , 0 ) ;
/* Buttons to preview, and install themes
*/
button_vbox = gtk_vbox_new ( FALSE , GNOME_PAD_SMALL ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( button_vbox ) , GNOME_PAD_SMALL ) ;
gtk_box_pack_start ( GTK_BOX ( hbox2 ) , button_vbox , FALSE , FALSE , 0 ) ;
1998-11-21 23:35:51 +00:00
label = gtk_label_new ( _ ( " Auto \n Preview " ) ) ;
1998-10-19 19:03:55 +00:00
gtk_label_set_justify ( GTK_LABEL ( label ) , GTK_JUSTIFY_LEFT ) ;
auto_preview = gtk_check_button_new ( ) ;
1999-04-01 00:58:38 +00:00
initial_preview = gnome_config_get_bool ( " /theme-switcher-capplet/settings/auto=TRUE " ) ;
gtk_toggle_button_set_state ( GTK_TOGGLE_BUTTON ( auto_preview ) ,
initial_preview ) ;
1998-10-19 19:03:55 +00:00
gtk_signal_connect ( GTK_OBJECT ( auto_preview ) , " toggled " , GTK_SIGNAL_FUNC ( auto_callback ) , NULL ) ;
gtk_container_add ( GTK_CONTAINER ( auto_preview ) , label ) ;
1999-03-12 07:28:19 +00:00
gtk_box_pack_start ( GTK_BOX ( button_vbox ) , auto_preview , FALSE , FALSE , 0 ) ;
1998-11-21 23:35:51 +00:00
button = gtk_button_new_with_label ( _ ( " Preview " ) ) ;
1998-10-19 19:03:55 +00:00
gtk_signal_connect ( GTK_OBJECT ( button ) , " clicked " , GTK_SIGNAL_FUNC ( click_preview ) , NULL ) ;
1999-03-12 07:28:19 +00:00
gtk_box_pack_start ( GTK_BOX ( button_vbox ) , button , FALSE , FALSE , 0 ) ;
1998-12-18 17:08:27 +00:00
button = gtk_button_new_with_label ( _ ( " Install new \n theme... " ) ) ;
1999-02-26 17:24:10 +00:00
gtk_signal_connect ( GTK_OBJECT ( button ) , " clicked " , GTK_SIGNAL_FUNC ( install_theme_callback ) , NULL ) ;
1999-03-12 07:28:19 +00:00
gtk_box_pack_start ( GTK_BOX ( button_vbox ) , button , FALSE , FALSE , 0 ) ;
1998-09-23 02:39:17 +00:00
1999-04-01 00:58:38 +00:00
/* Font selector.
1999-03-12 07:28:19 +00:00
*/
1999-04-01 00:58:38 +00:00
frame = gtk_frame_new ( _ ( " User Font " ) ) ;
1998-10-19 19:03:55 +00:00
gtk_box_pack_start ( GTK_BOX ( hbox ) , frame , TRUE , TRUE , 0 ) ;
1999-04-01 00:58:38 +00:00
font_sel = gnome_font_picker_new ( ) ;
gnome_font_picker_set_mode ( GNOME_FONT_PICKER ( font_sel ) ,
GNOME_FONT_PICKER_MODE_FONT_INFO ) ;
initial_font = gnome_config_get_string_with_default ( " /theme-switcher-capplet/settings/font " , & default_used ) ;
1999-04-07 22:17:34 +00:00
1999-04-01 00:58:38 +00:00
if ( initial_font = = NULL ) {
1999-04-07 22:17:34 +00:00
GtkStyle * style ;
gtk_widget_ensure_style ( frame ) ;
style = gtk_widget_get_style ( frame ) ;
if ( style - > rc_style = = NULL ) {
/* FIXME - should really get this from X somehow */
/* for now we just assume default gtk font */
1999-08-29 11:58:51 +00:00
initial_font = g_strdup ( _ ( " -adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-* " ) ) ;
1999-04-07 22:17:34 +00:00
} else {
initial_font = style - > rc_style - > font_name ;
}
1999-04-01 00:58:38 +00:00
}
1999-04-07 22:17:34 +00:00
gnome_font_picker_set_font_name ( GNOME_FONT_PICKER ( font_sel ) , initial_font ) ;
1999-04-01 00:58:38 +00:00
gnome_font_picker_fi_set_use_font_in_label ( GNOME_FONT_PICKER ( font_sel ) ,
TRUE ,
12 ) ;
gnome_font_picker_fi_set_show_size ( GNOME_FONT_PICKER ( font_sel ) , FALSE ) ;
gtk_signal_connect ( GTK_OBJECT ( font_sel ) ,
" font_set " ,
font_callback ,
NULL ) ;
vbox = gtk_vbox_new ( FALSE , GNOME_PAD_SMALL ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( vbox ) , GNOME_PAD_SMALL ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , vbox ) ;
font_cbox = gtk_check_button_new_with_label ( _ ( " Use custom font. " ) ) ;
initial_font_cbox = gnome_config_get_bool ( " /theme-switcher-capplet/settings/use_theme_font=FALSE " ) ;
gtk_toggle_button_set_state ( GTK_TOGGLE_BUTTON ( font_cbox ) ,
initial_font_cbox ) ;
gtk_signal_connect ( GTK_OBJECT ( font_cbox ) ,
" toggled " ,
GTK_SIGNAL_FUNC ( use_theme_font_callback ) ,
NULL ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , font_cbox , FALSE , FALSE , 0 ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , font_sel , FALSE , FALSE , 0 ) ;
if ( ! GTK_TOGGLE_BUTTON ( font_cbox ) - > active )
gtk_widget_set_sensitive ( font_sel , FALSE ) ;
else
gtk_widget_set_sensitive ( font_sel , TRUE ) ;
gtk_widget_show_all ( vbox ) ;
1998-10-19 19:03:55 +00:00
1999-04-01 00:58:38 +00:00
#if 0
1999-03-12 07:28:19 +00:00
readme_display = gtk_xmhtml_new ( ) ;
1999-04-01 00:58:38 +00:00
gtk_container_add ( GTK_CONTAINER ( frame2 ) , readme_display ) ;
# endif
1999-03-12 07:28:19 +00:00
/* Preview of theme
*/
1998-10-19 19:03:55 +00:00
hbox = gtk_hbox_new ( FALSE , GNOME_PAD_SMALL ) ;
1998-11-30 19:26:38 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( hbox ) , GNOME_PAD_SMALL ) ;
1998-11-21 23:35:51 +00:00
frame = gtk_frame_new ( _ ( " Preview " ) ) ;
1998-10-19 19:03:55 +00:00
gtk_box_pack_start ( GTK_BOX ( box ) , frame , TRUE , TRUE , 0 ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , hbox ) ;
1999-03-12 07:28:19 +00:00
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 ) ;
update_theme_entries ( theme_list ) ;
gtk_signal_connect ( GTK_OBJECT ( capplet_widget ) , " help " ,
1999-03-01 16:06:34 +00:00
GTK_SIGNAL_FUNC ( click_help ) , NULL ) ;
1999-03-12 07:28:19 +00:00
gtk_signal_connect ( GTK_OBJECT ( capplet_widget ) , " try " ,
1998-10-19 19:03:55 +00:00
GTK_SIGNAL_FUNC ( click_try ) , NULL ) ;
1999-03-12 07:28:19 +00:00
gtk_signal_connect ( GTK_OBJECT ( capplet_widget ) , " ok " ,
1998-10-19 19:03:55 +00:00
GTK_SIGNAL_FUNC ( click_ok ) , NULL ) ;
1999-03-12 07:28:19 +00:00
gtk_signal_connect ( GTK_OBJECT ( capplet_widget ) , " revert " ,
1998-10-19 19:03:55 +00:00
GTK_SIGNAL_FUNC ( click_revert ) , NULL ) ;
1999-03-12 07:28:19 +00:00
gtk_signal_connect ( GTK_OBJECT ( capplet_widget ) , " cancel " ,
1998-10-19 19:03:55 +00:00
GTK_SIGNAL_FUNC ( click_revert ) , NULL ) ;
1999-03-12 15:46:11 +00:00
gtk_signal_connect ( GTK_OBJECT ( capplet_widget ) , " delete_event " ,
GTK_SIGNAL_FUNC ( delete_capplet ) , NULL ) ;
1999-03-12 07:28:19 +00:00
gtk_container_add ( GTK_CONTAINER ( capplet_widget ) , box ) ;
1998-09-23 02:39:17 +00:00
1998-10-19 19:03:55 +00:00
last_theme = NULL ;
1998-09-23 02:39:17 +00:00
1999-03-12 07:28:19 +00:00
return capplet_widget ;
1998-09-23 02:39:17 +00:00
}
1999-03-12 15:46:11 +00:00
static void
1998-09-23 02:39:17 +00:00
click_preview ( GtkWidget * widget , gpointer data )
{
gchar * rc ;
1999-04-01 00:58:38 +00:00
/* if (current_theme == last_theme)
return ; */
1998-10-19 19:03:55 +00:00
last_theme = current_theme ;
1999-03-26 16:35:43 +00:00
if ( ! current_theme ) {
1999-04-01 00:58:38 +00:00
return ;
1999-03-26 16:35:43 +00:00
}
1998-10-19 19:03:55 +00:00
rc = ( gchar * ) gtk_object_get_data ( GTK_OBJECT ( current_theme ) , " rc " ) ;
1999-04-01 00:58:38 +00:00
if ( GTK_TOGGLE_BUTTON ( font_cbox ) - > active )
test_theme ( rc ,
gnome_font_picker_get_font_name ( GNOME_FONT_PICKER ( font_sel ) ) ) ;
else
{
test_theme ( rc , NULL ) ;
}
1998-09-23 02:39:17 +00:00
send_reread ( ) ;
}
1999-03-12 15:46:11 +00:00
static void
1999-03-01 16:06:34 +00:00
click_help ( GtkWidget * widget , gpointer data )
{
gchar * tmp ;
tmp = gnome_help_file_find_file ( " users-guide " , " gccdesktop.html#GCCTHEME " ) ;
if ( tmp ) {
gnome_help_goto ( 0 , tmp ) ;
g_free ( tmp ) ;
1999-09-02 22:57:01 +00:00
} else {
GtkWidget * mbox ;
mbox = gnome_message_box_new ( _ ( " No help is available/installed for these settings. Please make sure you \n have the GNOME User's Guide installed on your system. " ) ,
GNOME_MESSAGE_BOX_ERROR ,
_ ( " Close " ) , NULL ) ;
gtk_widget_show ( mbox ) ;
1999-03-01 16:06:34 +00:00
}
}
1999-03-12 15:46:11 +00:00
static void
1998-10-19 19:03:55 +00:00
click_try ( GtkWidget * widget , gpointer data )
1998-09-23 02:39:17 +00:00
{
gchar * rc ;
1999-08-04 01:27:16 +00:00
gchar * dir ;
1998-09-23 02:39:17 +00:00
1999-04-01 00:58:38 +00:00
/* if (current_theme == current_global_theme)
return ; */
1998-09-23 02:39:17 +00:00
widget = current_theme ;
if ( ! widget )
return ;
1998-10-19 19:03:55 +00:00
current_global_theme = current_theme ;
1998-09-23 02:39:17 +00:00
rc = ( gchar * ) gtk_object_get_data ( GTK_OBJECT ( widget ) , " rc " ) ;
dir = ( gchar * ) gtk_object_get_data ( GTK_OBJECT ( widget ) , " dir " ) ;
/* hack for enlightenment only!!!! */
/* FIXME: restart what ever windowmanager you have! */
1998-12-18 17:08:27 +00:00
/*g_snprintf(cmd, sizeof(cmd), "eesh -e \"restart %s/e\"", dir);*/
1999-01-25 23:33:57 +00:00
/* printf("%s\n", cmd); */
1998-09-23 02:39:17 +00:00
send_reread ( ) ;
1999-04-01 00:58:38 +00:00
if ( GTK_TOGGLE_BUTTON ( font_cbox ) - > active )
{
use_theme ( rc ,
gnome_font_picker_get_font_name ( GNOME_FONT_PICKER ( font_sel ) ) ) ;
}
else
{
use_theme ( rc , NULL ) ;
}
1998-09-23 02:39:17 +00:00
gdk_error_warnings = 0 ;
signal_apply_theme ( widget ) ;
gdk_flush ( ) ;
1999-01-25 23:33:57 +00:00
/* system(cmd); */
1998-09-23 02:39:17 +00:00
gdk_error_warnings = 1 ;
}
1999-03-12 15:46:11 +00:00
static void
1998-10-19 19:03:55 +00:00
click_ok ( GtkWidget * widget , gpointer data )
{
click_try ( widget , data ) ;
gnome_config_set_bool ( " /theme-switcher-capplet/settings/auto " , GTK_TOGGLE_BUTTON ( auto_preview ) - > active ) ;
gnome_config_set_string ( " /theme-switcher-capplet/settings/theme " , gtk_object_get_data ( GTK_OBJECT ( current_theme ) , " name " ) ) ;
1999-04-01 00:58:38 +00:00
gnome_config_set_bool ( " /theme-switcher-capplet/settings/use_theme_font " ,
GTK_TOGGLE_BUTTON ( font_cbox ) - > active ) ;
gnome_config_set_string ( " /theme-switcher-capplet/settings/font " ,
gnome_font_picker_get_font_name ( GNOME_FONT_PICKER ( font_sel ) ) ) ;
1998-10-19 19:03:55 +00:00
gnome_config_sync ( ) ;
}
1999-03-12 15:46:11 +00:00
static void
1998-10-19 19:03:55 +00:00
click_revert ( GtkWidget * widget , gpointer data )
{
gchar * rc ;
widget = initial_theme ;
1999-04-01 00:58:38 +00:00
if ( ! widget )
/* we hope this doesn't happen, but it could if things
* are mis - installed - jrb */
/* Damn, I hate this code... )-: */
1998-10-19 19:03:55 +00:00
return ;
1999-04-01 00:58:38 +00:00
1998-10-19 19:03:55 +00:00
rc = ( gchar * ) gtk_object_get_data ( GTK_OBJECT ( widget ) , " rc " ) ;
1999-04-01 00:58:38 +00:00
if ( ( current_global_theme ! = initial_theme ) | |
( initial_font_cbox ! = GTK_TOGGLE_BUTTON ( font_cbox ) - > active ) | |
1999-09-17 19:52:41 +00:00
( GTK_TOGGLE_BUTTON ( font_cbox ) - > active & & strcmp ( initial_font ,
1999-04-01 00:58:38 +00:00
gnome_font_picker_get_font_name ( GNOME_FONT_PICKER ( font_sel ) ) ) ) )
{
/* This if statement is magic to determine if we want to reset the system theme.
* It can almost certainly be cleaned up if needed . Basicly , it sees if anything has
* or if the theme has been set . . */
send_reread ( ) ;
use_theme ( rc , initial_font ) ;
gdk_error_warnings = 0 ;
signal_apply_theme ( widget ) ;
gdk_flush ( ) ;
gdk_error_warnings = 1 ;
}
current_global_theme = widget ;
1999-03-26 16:35:43 +00:00
ignore_change = TRUE ;
1999-04-01 00:58:38 +00:00
gtk_toggle_button_set_state ( GTK_TOGGLE_BUTTON ( auto_preview ) ,
initial_preview ) ;
1999-04-07 22:17:34 +00:00
1999-04-01 00:58:38 +00:00
gtk_toggle_button_set_state ( GTK_TOGGLE_BUTTON ( font_cbox ) ,
initial_font_cbox ) ;
1999-04-07 22:17:34 +00:00
if ( initial_font )
gnome_font_picker_set_font_name ( GNOME_FONT_PICKER ( font_sel ) ,
initial_font ) ;
1999-03-12 07:28:19 +00:00
gtk_list_select_child ( GTK_LIST ( theme_list ) , initial_theme ) ;
1999-04-01 00:58:38 +00:00
test_theme ( rc , initial_font ) ;
1999-03-26 16:35:43 +00:00
send_reread ( ) ;
1999-04-01 00:58:38 +00:00
if ( ! GTK_TOGGLE_BUTTON ( font_cbox ) - > active )
gtk_widget_set_sensitive ( font_sel , FALSE ) ;
else
gtk_widget_set_sensitive ( font_sel , TRUE ) ;
ignore_change = FALSE ;
current_theme = initial_theme ;
1998-10-19 19:03:55 +00:00
}
1999-03-12 15:46:11 +00:00
static void
1998-09-23 02:39:17 +00:00
click_entry ( GtkWidget * widget , gpointer data )
{
1999-08-04 01:27:16 +00:00
gchar * rc , * name ;
1998-09-23 02:39:17 +00:00
name = ( gchar * ) gtk_object_get_data ( GTK_OBJECT ( widget ) , " name " ) ;
rc = ( gchar * ) gtk_object_get_data ( GTK_OBJECT ( widget ) , " rc " ) ;
1999-03-12 07:28:19 +00:00
/* Load in the README file */
1999-04-01 00:58:38 +00:00
#if 0
1998-09-23 02:39:17 +00:00
if ( readme_current )
{
g_free ( readme_current ) ;
readme_current = NULL ;
}
f = fopen ( readme , " r " ) ;
if ( f )
{
1999-03-12 07:28:19 +00:00
GString * new_readme = g_string_new ( NULL ) ;
1998-09-23 02:39:17 +00:00
while ( fgets ( buf , 1024 , f ) )
1999-03-12 07:28:19 +00:00
g_string_append ( new_readme , buf ) ;
1998-09-23 02:39:17 +00:00
fclose ( f ) ;
1999-03-12 07:28:19 +00:00
gtk_xmhtml_source ( GTK_XMHTML ( readme_display ) , new_readme - > str ) ;
g_string_free ( new_readme , TRUE ) ;
1998-09-23 02:39:17 +00:00
}
1999-03-12 07:28:19 +00:00
else
gtk_xmhtml_source ( GTK_XMHTML ( readme_display ) , " " ) ;
1999-04-01 00:58:38 +00:00
# endif
1999-03-12 07:28:19 +00:00
if ( ! ignore_change )
{
current_theme = widget ;
if ( initial_theme )
capplet_widget_state_changed ( CAPPLET_WIDGET ( capplet_widget ) , TRUE ) ;
else
capplet_widget_state_changed ( CAPPLET_WIDGET ( capplet_widget ) , FALSE ) ;
1999-04-01 00:58:38 +00:00
1999-03-12 07:28:19 +00:00
if ( GTK_TOGGLE_BUTTON ( auto_preview ) - > active )
click_preview ( widget , NULL ) ;
1999-04-01 00:58:38 +00:00
}
1998-09-23 02:39:17 +00:00
}
1999-03-12 15:46:11 +00:00
static void
1998-09-23 02:39:17 +00:00
delete_entry ( GtkWidget * widget , gpointer data )
{
1999-04-01 00:58:38 +00:00
gchar * rc , * name , * icon , * dir ;
1998-09-23 02:39:17 +00:00
name = ( gchar * ) gtk_object_get_data ( GTK_OBJECT ( widget ) , " name " ) ;
rc = ( gchar * ) gtk_object_get_data ( GTK_OBJECT ( widget ) , " rc " ) ;
1999-03-12 07:28:19 +00:00
dir = ( gchar * ) gtk_object_get_data ( GTK_OBJECT ( widget ) , " dir " ) ;
1998-09-23 02:39:17 +00:00
icon = ( gchar * ) gtk_object_get_data ( GTK_OBJECT ( widget ) , " icon " ) ;
g_free ( name ) ;
g_free ( rc ) ;
1999-03-12 07:28:19 +00:00
g_free ( dir ) ;
1998-09-23 02:39:17 +00:00
g_free ( icon ) ;
if ( current_theme = = widget )
current_theme = NULL ;
}
1998-10-19 19:03:55 +00:00
static gint sort_alpha ( const void * a , const void * b )
{
GtkBin * A , * B ;
A = GTK_BIN ( a ) ;
B = GTK_BIN ( b ) ;
return strcmp ( ( char * ) GTK_LABEL ( A - > child ) - > label , ( char * ) GTK_LABEL ( B - > child ) - > label ) ;
}
1998-09-23 02:39:17 +00:00
void
1998-10-19 19:03:55 +00:00
update_theme_entries ( GtkWidget * disp_list )
1998-09-23 02:39:17 +00:00
{
ThemeEntry * te ;
gint num ;
GList * list ;
int i ;
GtkWidget * item ;
1998-10-19 19:03:55 +00:00
gchar * d_theme = gnome_config_get_string ( " /theme-switcher-capplet/settings/theme=Default " ) ;
1999-03-12 07:28:19 +00:00
gchar * current_name = NULL ;
if ( current_theme )
current_name = g_strdup ( gtk_object_get_data ( GTK_OBJECT ( current_theme ) , " name " ) ) ;
1999-04-01 00:58:38 +00:00
else
current_name = d_theme ;
1999-03-12 07:28:19 +00:00
current_theme = NULL ;
initial_theme = NULL ;
1998-09-23 02:39:17 +00:00
list = NULL ;
1998-10-19 19:03:55 +00:00
gtk_list_clear_items ( GTK_LIST ( disp_list ) , 0 , - 1 ) ;
1998-09-23 02:39:17 +00:00
te = list_system_themes ( & num ) ;
for ( i = 0 ; i < num ; i + + )
{
item = gtk_list_item_new_with_label ( te [ i ] . name ) ;
gtk_widget_show ( item ) ;
1999-03-12 07:28:19 +00:00
if ( strcmp ( d_theme , te [ i ] . name ) = = 0 )
1999-09-17 19:52:41 +00:00
{
current_global_theme = item ;
initial_theme = item ;
}
1999-03-12 07:28:19 +00:00
if ( current_name & & ( strcmp ( current_name , te [ i ] . name ) = = 0 ) )
1999-04-01 00:58:38 +00:00
{
current_theme = item ;
}
1999-03-12 07:28:19 +00:00
1998-09-23 02:39:17 +00:00
gtk_object_set_data ( GTK_OBJECT ( item ) , " name " , g_strdup ( te [ i ] . name ) ) ;
gtk_object_set_data ( GTK_OBJECT ( item ) , " rc " , g_strdup ( te [ i ] . rc ) ) ;
gtk_object_set_data ( GTK_OBJECT ( item ) , " dir " , g_strdup ( te [ i ] . dir ) ) ;
gtk_object_set_data ( GTK_OBJECT ( item ) , " icon " , g_strdup ( te [ i ] . icon ) ) ;
gtk_signal_connect ( GTK_OBJECT ( item ) , " select " ,
GTK_SIGNAL_FUNC ( click_entry ) , NULL ) ;
gtk_signal_connect ( GTK_OBJECT ( item ) , " destroy " ,
GTK_SIGNAL_FUNC ( delete_entry ) , NULL ) ;
1998-10-19 19:03:55 +00:00
list = g_list_insert_sorted ( list , item , sort_alpha ) ;
1998-09-23 02:39:17 +00:00
}
1999-03-12 07:28:19 +00:00
free_theme_list ( te , num ) ;
1998-09-23 02:39:17 +00:00
te = list_user_themes ( & num ) ;
for ( i = 0 ; i < num ; i + + )
{
item = gtk_list_item_new_with_label ( te [ i ] . name ) ;
gtk_widget_show ( item ) ;
1999-03-12 07:28:19 +00:00
if ( strcmp ( d_theme , te [ i ] . name ) = = 0 )
1998-10-19 19:03:55 +00:00
initial_theme = item ;
1999-03-12 07:28:19 +00:00
if ( current_name & & ( strcmp ( current_name , te [ i ] . name ) = = 0 ) )
current_theme = item ;
1998-09-23 02:39:17 +00:00
gtk_object_set_data ( GTK_OBJECT ( item ) , " name " , g_strdup ( te [ i ] . name ) ) ;
gtk_object_set_data ( GTK_OBJECT ( item ) , " rc " , g_strdup ( te [ i ] . rc ) ) ;
gtk_object_set_data ( GTK_OBJECT ( item ) , " dir " , g_strdup ( te [ i ] . dir ) ) ;
gtk_object_set_data ( GTK_OBJECT ( item ) , " icon " , g_strdup ( te [ i ] . icon ) ) ;
gtk_signal_connect ( GTK_OBJECT ( item ) , " select " ,
GTK_SIGNAL_FUNC ( click_entry ) , NULL ) ;
gtk_signal_connect ( GTK_OBJECT ( item ) , " destroy " ,
GTK_SIGNAL_FUNC ( delete_entry ) , NULL ) ;
1998-10-19 19:03:55 +00:00
list = g_list_insert_sorted ( list , item , sort_alpha ) ;
1998-09-23 02:39:17 +00:00
}
1999-03-12 07:28:19 +00:00
free_theme_list ( te , num ) ;
1998-10-19 19:03:55 +00:00
1999-03-12 07:28:19 +00:00
/* Suppress an update here, because the BROWSE mode will
* cause a false initial selection
*/
ignore_change = TRUE ;
1998-10-19 19:03:55 +00:00
gtk_list_append_items ( GTK_LIST ( disp_list ) , list ) ;
1999-03-12 07:28:19 +00:00
ignore_change = FALSE ;
if ( ! current_theme )
current_theme = initial_theme ;
/* Suppress an update only if the current theme didn't change or
* this was the first time around
*/
if ( current_theme )
{
if ( current_name & &
strcmp ( gtk_object_get_data ( GTK_OBJECT ( current_theme ) , " name " ) ,
current_name ) ! = 0 )
{
gtk_list_select_child ( GTK_LIST ( disp_list ) , current_theme ) ;
}
else
{
ignore_change = TRUE ;
gtk_list_select_child ( GTK_LIST ( disp_list ) , current_theme ) ;
ignore_change = FALSE ;
}
}
1999-04-01 00:58:38 +00:00
if ( current_name ! = d_theme ) {
g_free ( current_name ) ;
g_free ( d_theme ) ;
} else
g_free ( d_theme ) ;
if ( current_theme = = NULL )
1999-04-01 11:31:06 +00:00
;
1998-09-23 02:39:17 +00:00
}