2002-12-03 16:16:45 +00:00
/* This program was written under the GPL by Jonathan Blandford <jrb@gnome.org>
2002-11-01 16:09:43 +00:00
*/
# include <config.h>
# include <string.h>
# include <gtk/gtk.h>
# include <gconf/gconf-client.h>
# include <glade/glade.h>
# include <libgnomevfs/gnome-vfs-async-ops.h>
# include <libgnomevfs/gnome-vfs-ops.h>
# include <libgnomevfs/gnome-vfs-utils.h>
# include <libwindow-settings/gnome-wm-manager.h>
# include "gnome-theme-info.h"
2002-12-04 01:42:45 +00:00
# include "gnome-theme-save.h"
2002-11-01 16:09:43 +00:00
# include "capplet-util.h"
# include "activate-settings-daemon.h"
# include "gconf-property-editor.h"
# include "file-transfer-dialog.h"
2002-12-03 16:16:45 +00:00
# include "gnome-theme-manager.h"
# include "gnome-theme-details.h"
2002-11-01 16:09:43 +00:00
# include "gnome-theme-installer.h"
2003-05-13 18:37:05 +00:00
# include <theme-thumbnail.h>
# include <gnome-theme-apply.h>
2002-11-01 16:09:43 +00:00
2002-11-27 00:03:37 +00:00
# define MAX_ELEMENTS_BEFORE_SCROLLING 3
2002-11-01 16:09:43 +00:00
2002-12-03 16:16:45 +00:00
/* Events: There are two types of change events we worry about. The first is
* when the theme settings change . In this case , we can quickly update the UI
* to reflect . The other is when the themes themselves change .
*
* The code in gnome - theme - manager . c will update the main dialog and proxy the
* update notifications for the details dialog .
*/
2002-11-01 16:09:43 +00:00
enum
{
2002-12-03 16:16:45 +00:00
META_THEME_NAME_COLUMN = THEME_NAME_COLUMN ,
META_THEME_ID_COLUMN = THEME_ID_COLUMN ,
META_THEME_FLAG_COLUMN = THEME_FLAG_COLUMN ,
META_THEME_PIXBUF_COLUMN ,
META_N_COLUMNS
2002-11-01 16:09:43 +00:00
} ;
2002-12-03 16:16:45 +00:00
GtkTargetEntry drop_types [ ] =
2002-11-01 16:09:43 +00:00
{
{ " text/uri-list " , 0 , TARGET_URI_LIST } ,
{ " _NETSCAPE_URL " , 0 , TARGET_NS_URL }
} ;
2002-12-03 16:16:45 +00:00
gint n_drop_types = sizeof ( drop_types ) / sizeof ( GtkTargetEntry ) ;
2002-11-01 16:09:43 +00:00
static gboolean setting_model = FALSE ;
2002-12-03 16:16:45 +00:00
static gboolean idle_running = FALSE ;
2003-01-02 13:58:58 +00:00
static gboolean initial_meta_theme_set = FALSE ;
2002-12-03 16:16:45 +00:00
static GdkPixbuf * default_image = NULL ;
static GnomeThemeMetaInfo custom_meta_theme_info = { } ;
2003-01-02 13:58:58 +00:00
static GnomeThemeMetaInfo initial_meta_theme_info = { } ;
2002-12-03 16:16:45 +00:00
2003-02-05 22:20:09 +00:00
const char * meta_theme_default_name = NULL ;
const char * gtk_theme_default_name = NULL ;
const char * window_theme_default_name = NULL ;
const char * icon_theme_default_name = NULL ;
2002-12-03 16:16:45 +00:00
/* Function Prototypes */
static void idle_async_func ( GdkPixbuf * pixbuf ,
gpointer data ) ;
static void list_data_free ( gpointer data ) ;
static gboolean load_theme_in_idle ( gpointer data ) ;
2003-01-06 15:59:46 +00:00
static void add_pixbuf_idle ( void ) ;
2002-12-03 16:16:45 +00:00
static void load_meta_themes ( GtkTreeView * tree_view ,
2003-02-05 22:20:09 +00:00
GList * meta_theme_list ) ;
2002-12-03 16:16:45 +00:00
static void meta_theme_setup_info ( GnomeThemeMetaInfo * meta_theme_info ,
GladeXML * dialog ) ;
static void meta_theme_selection_changed ( GtkTreeSelection * selection ,
GladeXML * dialog ) ;
static void update_themes_from_disk ( GladeXML * dialog ) ;
static void update_settings_from_gconf ( void ) ;
static void gtk_theme_key_changed ( GConfClient * client ,
guint cnxn_id ,
GConfEntry * entry ,
gpointer user_data ) ;
static void window_settings_changed ( GnomeWindowManager * window_manager ,
GladeXML * dialog ) ;
static void icon_key_changed ( GConfClient * client ,
guint cnxn_id ,
GConfEntry * entry ,
gpointer user_data ) ;
2003-01-08 22:40:33 +00:00
static void font_key_changed ( GConfClient * client ,
guint cnxn_id ,
GConfEntry * entry ,
gpointer user_data ) ;
2002-12-03 16:16:45 +00:00
static void theme_changed_func ( gpointer uri ,
gpointer user_data ) ;
static void cb_dialog_response ( GtkDialog * dialog ,
gint response_id ) ;
static void setup_meta_tree_view ( GtkTreeView * tree_view ,
GCallback changed_callback ,
GladeXML * dialog ) ;
static void setup_dialog ( GladeXML * dialog ) ;
2002-11-01 16:09:43 +00:00
2002-11-27 00:03:37 +00:00
static void
2002-12-03 16:16:45 +00:00
idle_async_func ( GdkPixbuf * pixbuf ,
gpointer data )
2002-11-27 00:03:37 +00:00
{
GList * list = data ;
2002-12-03 16:16:45 +00:00
gchar * theme_id ;
GtkTreeModel * model ;
GtkTreeIter iter ;
gboolean valid ;
2002-11-27 00:03:37 +00:00
2002-12-03 16:16:45 +00:00
theme_id = list - > next - > data ;
model = list - > data ;
for ( valid = gtk_tree_model_get_iter_first ( model , & iter ) ;
valid ;
valid = gtk_tree_model_iter_next ( model , & iter ) )
{
gchar * test_theme_id ;
gtk_tree_model_get ( model , & iter ,
META_THEME_ID_COLUMN , & test_theme_id ,
- 1 ) ;
2003-08-04 18:15:32 +00:00
if ( theme_id & & test_theme_id & & ! strcmp ( theme_id , test_theme_id ) )
2002-12-03 16:16:45 +00:00
{
gtk_list_store_set ( GTK_LIST_STORE ( model ) , & iter ,
2003-07-02 11:14:02 +00:00
META_THEME_PIXBUF_COLUMN , pixbuf ? pixbuf : default_image ,
2002-12-03 16:16:45 +00:00
- 1 ) ;
g_free ( test_theme_id ) ;
break ;
}
g_free ( test_theme_id ) ;
}
idle_running = FALSE ;
2003-01-06 15:59:46 +00:00
add_pixbuf_idle ( ) ;
2002-11-27 00:03:37 +00:00
}
2002-11-07 20:07:26 +00:00
static void
2002-12-03 16:16:45 +00:00
list_data_free ( gpointer data )
2002-11-07 20:07:26 +00:00
{
2002-12-03 16:16:45 +00:00
GList * list_data = data ;
2002-11-07 20:07:26 +00:00
2002-12-03 16:16:45 +00:00
g_object_unref ( G_OBJECT ( list_data - > data ) ) ;
g_free ( list_data - > next - > data ) ;
g_list_free ( list_data ) ;
}
2002-11-07 20:07:26 +00:00
2002-12-03 16:16:45 +00:00
static gboolean
load_theme_in_idle ( gpointer data )
{
2003-01-06 15:59:46 +00:00
GladeXML * dialog ;
GtkWidget * tree_view ;
GtkTreeModel * model ;
2002-12-03 16:16:45 +00:00
GtkTreeIter iter ;
gboolean valid ;
2002-11-07 20:07:26 +00:00
2003-01-06 15:59:46 +00:00
dialog = gnome_theme_manager_get_theme_dialog ( ) ;
tree_view = WID ( " meta_theme_treeview " ) ;
model = gtk_tree_view_get_model ( GTK_TREE_VIEW ( tree_view ) ) ;
2002-12-03 16:16:45 +00:00
for ( valid = gtk_tree_model_get_iter_first ( model , & iter ) ;
valid ;
valid = gtk_tree_model_iter_next ( model , & iter ) )
{
GdkPixbuf * pixbuf = NULL ;
gchar * theme_id = NULL ;
2002-11-07 20:07:26 +00:00
2002-12-03 16:16:45 +00:00
gtk_tree_model_get ( model , & iter ,
META_THEME_PIXBUF_COLUMN , & pixbuf ,
- 1 ) ;
if ( pixbuf = = default_image )
2002-11-27 00:03:37 +00:00
{
GList * list_data = NULL ;
2002-12-03 16:16:45 +00:00
GnomeThemeMetaInfo * meta_theme_info ;
gtk_tree_model_get ( model , & iter ,
META_THEME_ID_COLUMN , & theme_id ,
- 1 ) ;
if ( theme_id = = NULL )
{
meta_theme_info = & custom_meta_theme_info ;
}
else
{
meta_theme_info = gnome_theme_meta_info_find ( theme_id ) ;
}
2002-11-27 00:03:37 +00:00
2002-12-03 16:16:45 +00:00
/* We should always have a metatheme file */
g_assert ( meta_theme_info ) ;
2002-11-27 00:03:37 +00:00
2002-12-03 16:16:45 +00:00
list_data = g_list_prepend ( list_data , theme_id ) ;
g_object_ref ( model ) ;
list_data = g_list_prepend ( list_data , model ) ;
generate_theme_thumbnail_async ( meta_theme_info ,
idle_async_func ,
list_data ,
list_data_free ) ;
2002-11-07 20:07:26 +00:00
2002-12-03 16:16:45 +00:00
return FALSE ;
2002-11-07 20:07:26 +00:00
}
}
2002-12-03 16:16:45 +00:00
/* If we're done loading all the main themes, lets initialize the details
* dialog if it hasn ' t been done yet . If it has , then this call is harmless .
*/
gnome_theme_details_init ( ) ;
2003-01-02 13:58:58 +00:00
idle_running = FALSE ;
2003-01-06 15:59:46 +00:00
return FALSE ;
2002-12-03 16:16:45 +00:00
}
2002-11-07 20:07:26 +00:00
2002-12-03 16:16:45 +00:00
/* FIXME: we need a way to cancel the pixbuf loading if we get a theme updating
* during the pixbuf generation .
*/
static void
2003-01-06 15:59:46 +00:00
add_pixbuf_idle ( void )
2002-12-03 16:16:45 +00:00
{
if ( idle_running )
return ;
2002-11-07 20:07:26 +00:00
2002-12-03 16:16:45 +00:00
idle_running = TRUE ;
g_idle_add_full ( G_PRIORITY_LOW ,
load_theme_in_idle ,
2003-01-06 15:59:46 +00:00
NULL , NULL ) ;
2002-11-07 20:07:26 +00:00
}
2003-01-02 13:58:58 +00:00
static gint
sort_meta_theme_list_func ( gconstpointer a ,
gconstpointer b )
{
const GnomeThemeMetaInfo * a_meta_theme_info = a ;
const GnomeThemeMetaInfo * b_meta_theme_info = b ;
guint a_flag = 0 ;
guint b_flag = 0 ;
g_assert ( a_meta_theme_info - > name ) ;
g_assert ( b_meta_theme_info - > name ) ;
2003-02-05 22:20:09 +00:00
if ( meta_theme_default_name & & strcmp ( meta_theme_default_name , a_meta_theme_info - > name ) = = 0 )
2003-01-02 13:58:58 +00:00
a_flag | = THEME_FLAG_DEFAULT ;
2003-02-05 22:20:09 +00:00
if ( meta_theme_default_name & & strcmp ( meta_theme_default_name , b_meta_theme_info - > name ) = = 0 )
2003-01-02 13:58:58 +00:00
b_flag | = THEME_FLAG_DEFAULT ;
return gnome_theme_manager_sort_func ( a_meta_theme_info - > readable_name ,
b_meta_theme_info - > readable_name ,
a_flag ,
b_flag ) ;
}
/* Loads up a list of GnomeThemeMetaInfo.
2002-12-03 16:16:45 +00:00
*/
2002-11-01 16:09:43 +00:00
static void
2002-12-03 16:16:45 +00:00
load_meta_themes ( GtkTreeView * tree_view ,
2003-02-05 22:20:09 +00:00
GList * meta_theme_list )
2002-11-01 16:09:43 +00:00
{
GList * list ;
GtkTreeModel * model ;
GtkWidget * swindow ;
2003-01-02 13:58:58 +00:00
GtkTreeIter iter ;
gchar * name ;
gboolean valid ;
guint flag ;
2002-11-01 16:09:43 +00:00
gint i = 0 ;
2003-01-02 13:58:58 +00:00
GConfClient * client ;
gchar * current_gtk_theme ;
gchar * current_window_theme ;
gchar * current_icon_theme ;
GnomeWindowManager * window_manager ;
GnomeWMSettings wm_settings ;
static gboolean first_time = TRUE ;
2002-11-01 16:09:43 +00:00
swindow = GTK_WIDGET ( tree_view ) - > parent ;
model = gtk_tree_view_get_model ( tree_view ) ;
2002-12-03 16:16:45 +00:00
g_assert ( model ) ;
2002-11-01 16:09:43 +00:00
setting_model = TRUE ;
2003-01-02 13:58:58 +00:00
client = gconf_client_get_default ( ) ;
current_gtk_theme = gconf_client_get_string ( client , GTK_THEME_KEY , NULL ) ;
current_icon_theme = gconf_client_get_string ( client , ICON_THEME_KEY , NULL ) ;
window_manager = gnome_wm_manager_get_current ( gdk_display_get_default_screen ( gdk_display_get_default ( ) ) ) ;
2003-01-14 07:17:28 +00:00
wm_settings . flags = GNOME_WM_SETTING_THEME ;
2004-02-04 05:21:28 +00:00
if ( ! window_manager )
2003-01-16 01:16:36 +00:00
{
2004-02-04 05:21:28 +00:00
GtkWidget * dialog ;
dialog = gtk_message_dialog_new ( NULL ,
GTK_DIALOG_MODAL ,
GTK_MESSAGE_ERROR ,
GTK_BUTTONS_OK ,
_ ( " The gnome-theme-manager does not know how to change the themes on the current window manager. " ) ) ;
gtk_dialog_run ( GTK_DIALOG ( dialog ) ) ;
gtk_widget_destroy ( dialog ) ;
exit ( 0 ) ;
2003-01-16 01:16:36 +00:00
}
2003-01-02 13:58:58 +00:00
2004-02-04 05:21:28 +00:00
gnome_window_manager_get_settings ( window_manager , & wm_settings ) ;
current_window_theme = g_strdup ( wm_settings . theme ) ;
2003-01-02 13:58:58 +00:00
/* FIXME: What do we really do when there is no theme? */
if ( current_icon_theme = = NULL )
2003-02-05 22:20:09 +00:00
current_icon_theme = g_strdup ( icon_theme_default_name ) ;
2003-01-02 13:58:58 +00:00
if ( current_gtk_theme = = NULL )
2003-02-05 22:20:09 +00:00
current_gtk_theme = g_strdup ( gtk_theme_default_name ) ;
2003-01-02 13:58:58 +00:00
/* handle first time */
if ( first_time )
{
initial_meta_theme_info . gtk_theme_name = g_strdup ( current_gtk_theme ) ;
initial_meta_theme_info . icon_theme_name = g_strdup ( current_icon_theme ) ;
initial_meta_theme_info . metacity_theme_name = g_strdup ( current_window_theme ) ;
2002-12-03 16:16:45 +00:00
2003-02-05 22:20:09 +00:00
for ( list = meta_theme_list ; list ; list = list - > next )
{
GnomeThemeMetaInfo * theme_info = list - > data ;
if ( ( theme_info - > gtk_theme_name & & ! strcmp ( theme_info - > gtk_theme_name , gtk_theme_default_name ) ) & &
( theme_info - > metacity_theme_name & & ! strcmp ( theme_info - > metacity_theme_name , window_theme_default_name ) ) & &
( theme_info - > icon_theme_name & & ! strcmp ( theme_info - > icon_theme_name , icon_theme_default_name ) ) )
{
meta_theme_default_name = g_strdup ( theme_info - > name ) ;
break ;
}
}
}
2002-11-01 16:09:43 +00:00
gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW ( swindow ) ,
GTK_POLICY_NEVER , GTK_POLICY_NEVER ) ;
gtk_widget_set_usize ( swindow , - 1 , - 1 ) ;
2003-01-02 13:58:58 +00:00
/* Sort meta_theme_list to be in the same order of the current data. This way
* we can walk through them together . */
meta_theme_list = g_list_sort ( meta_theme_list , sort_meta_theme_list_func ) ;
list = meta_theme_list ;
valid = gtk_tree_model_get_iter_first ( model , & iter ) ;
while ( valid | | list ! = NULL )
2002-11-01 16:09:43 +00:00
{
2003-01-02 13:58:58 +00:00
GnomeThemeMetaInfo * list_meta_theme_info = NULL ;
GnomeThemeMetaInfo * model_meta_theme_info = NULL ;
2002-12-03 16:16:45 +00:00
gchar * blurb ;
2003-01-02 13:58:58 +00:00
gboolean list_is_default = FALSE ;
2002-12-03 16:16:45 +00:00
GdkPixbuf * pixbuf ;
2002-11-01 16:09:43 +00:00
2003-01-02 13:58:58 +00:00
/* Check info on the list */
if ( list )
{
list_meta_theme_info = list - > data ;
2003-02-05 22:20:09 +00:00
if ( meta_theme_default_name & & strcmp ( meta_theme_default_name , list_meta_theme_info - > name ) = = 0 )
2003-01-02 13:58:58 +00:00
list_is_default = TRUE ;
else
list_is_default = FALSE ;
}
2002-11-01 16:09:43 +00:00
2003-01-02 13:58:58 +00:00
if ( valid )
{
gtk_tree_model_get ( model , & iter ,
META_THEME_ID_COLUMN , & name ,
META_THEME_FLAG_COLUMN , & flag ,
- 1 ) ;
if ( flag & THEME_FLAG_CUSTOM )
model_meta_theme_info = & custom_meta_theme_info ;
2003-01-08 07:01:24 +00:00
else if ( flag & THEME_FLAG_INITIAL )
model_meta_theme_info = & initial_meta_theme_info ;
2003-01-02 13:58:58 +00:00
else
model_meta_theme_info = gnome_theme_meta_info_find ( name ) ;
g_free ( name ) ;
}
/* start comparing values */
if ( list & & valid )
{
gint compare_val ;
2002-12-03 16:16:45 +00:00
2003-01-08 07:01:24 +00:00
if ( flag & THEME_FLAG_CUSTOM | | flag & THEME_FLAG_INITIAL )
2003-01-02 13:58:58 +00:00
{
/* We can always skip the custom row, as it's never in the list */
valid = gtk_tree_model_iter_next ( model , & iter ) ;
i + + ;
goto end_of_loop ;
}
2002-11-01 16:09:43 +00:00
2003-01-02 13:58:58 +00:00
compare_val = gnome_theme_manager_sort_func ( model_meta_theme_info - > readable_name , list_meta_theme_info - > readable_name ,
flag , list_is_default ? THEME_FLAG_DEFAULT : 0 ) ;
if ( compare_val < 0 )
{
GtkTreeIter iter_to_remove ;
/* This item is no longer in the list
*/
iter_to_remove = iter ;
valid = gtk_tree_model_iter_next ( model , & iter ) ;
gtk_list_store_remove ( GTK_LIST_STORE ( model ) , & iter_to_remove ) ;
}
else if ( compare_val = = 0 )
{
/* We reset the blurb in case it has changed */
2004-02-04 04:36:27 +00:00
blurb = g_markup_printf_escaped ( " <span size= \" larger \" weight= \" bold \" >%s</span> \n %s " ,
list_meta_theme_info - > readable_name , list_meta_theme_info - > comment ) ;
2003-01-02 13:58:58 +00:00
pixbuf = default_image ;
gtk_list_store_set ( GTK_LIST_STORE ( model ) , & iter ,
META_THEME_PIXBUF_COLUMN , pixbuf ,
META_THEME_NAME_COLUMN , blurb ,
META_THEME_ID_COLUMN , list_meta_theme_info - > name ,
META_THEME_FLAG_COLUMN , flag ,
- 1 ) ;
g_free ( blurb ) ;
list = list - > next ;
valid = gtk_tree_model_iter_next ( model , & iter ) ;
i + + ;
}
else
{
/* we insert a new item */
GtkTreeIter iter_to_prepend ;
gtk_list_store_insert_before ( GTK_LIST_STORE ( model ) , & iter_to_prepend , & iter ) ;
2004-02-04 04:36:27 +00:00
blurb = g_markup_printf_escaped ( " <span size= \" larger \" weight= \" bold \" >%s</span> \n %s " ,
list_meta_theme_info - > readable_name , list_meta_theme_info - > comment ) ;
2003-01-02 13:58:58 +00:00
pixbuf = default_image ;
2003-01-14 07:17:28 +00:00
gtk_list_store_set ( GTK_LIST_STORE ( model ) , & iter_to_prepend ,
2003-01-02 13:58:58 +00:00
META_THEME_PIXBUF_COLUMN , pixbuf ,
META_THEME_NAME_COLUMN , blurb ,
META_THEME_ID_COLUMN , list_meta_theme_info - > name ,
META_THEME_FLAG_COLUMN , list_is_default ? THEME_FLAG_DEFAULT : 0 ,
- 1 ) ;
g_free ( blurb ) ;
i + + ;
list = list - > next ;
}
goto end_of_loop ;
}
else if ( list )
{
list_meta_theme_info = list - > data ;
gtk_list_store_append ( GTK_LIST_STORE ( model ) , & iter ) ;
2004-02-04 04:36:27 +00:00
blurb = g_markup_printf_escaped ( " <span size= \" larger \" weight= \" bold \" >%s</span> \n %s " ,
list_meta_theme_info - > readable_name , list_meta_theme_info - > comment ) ;
2003-07-02 11:14:02 +00:00
pixbuf = NULL ;
2003-01-02 13:58:58 +00:00
if ( i < = MAX_ELEMENTS_BEFORE_SCROLLING )
2003-01-07 08:15:07 +00:00
pixbuf = generate_theme_thumbnail ( list_meta_theme_info , FALSE ) ;
2003-01-02 13:58:58 +00:00
gtk_list_store_set ( GTK_LIST_STORE ( model ) , & iter ,
2003-07-02 11:14:02 +00:00
META_THEME_PIXBUF_COLUMN , pixbuf ? pixbuf : default_image ,
2003-01-02 13:58:58 +00:00
META_THEME_NAME_COLUMN , blurb ,
META_THEME_ID_COLUMN , list_meta_theme_info - > name ,
META_THEME_FLAG_COLUMN , list_is_default ? THEME_FLAG_DEFAULT : 0 ,
- 1 ) ;
g_free ( blurb ) ;
list = list - > next ;
i + + ;
}
else if ( valid )
{
/* It's a dead item. */
GtkTreeIter iter_to_remove ;
iter_to_remove = iter ;
valid = gtk_tree_model_iter_next ( model , & iter ) ;
gtk_list_store_remove ( GTK_LIST_STORE ( model ) , & iter_to_remove ) ;
}
end_of_loop :
2002-11-01 16:09:43 +00:00
if ( i = = MAX_ELEMENTS_BEFORE_SCROLLING )
{
gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW ( swindow ) ,
GTK_POLICY_NEVER , GTK_POLICY_AUTOMATIC ) ;
}
}
2003-01-06 15:59:46 +00:00
add_pixbuf_idle ( ) ;
2003-01-02 13:58:58 +00:00
g_free ( current_gtk_theme ) ;
g_free ( current_icon_theme ) ;
g_free ( current_window_theme ) ;
first_time = FALSE ;
2002-11-01 16:09:43 +00:00
setting_model = FALSE ;
}
static void
meta_theme_setup_info ( GnomeThemeMetaInfo * meta_theme_info ,
GladeXML * dialog )
{
2002-11-16 05:56:46 +00:00
GtkWidget * notebook ;
notebook = WID ( " meta_theme_notebook " ) ;
2002-11-01 16:09:43 +00:00
if ( meta_theme_info = = NULL )
{
2002-11-16 05:56:46 +00:00
gtk_notebook_set_current_page ( GTK_NOTEBOOK ( notebook ) , 0 ) ;
2002-11-01 16:09:43 +00:00
}
else
{
2002-11-05 20:49:44 +00:00
if ( meta_theme_info - > application_font ! = NULL )
2002-11-01 16:09:43 +00:00
{
2002-11-05 20:49:44 +00:00
if ( meta_theme_info - > background_image ! = NULL )
2002-11-16 05:56:46 +00:00
gtk_notebook_set_current_page ( GTK_NOTEBOOK ( notebook ) , 3 ) ;
2002-11-01 16:09:43 +00:00
else
2002-11-16 05:56:46 +00:00
gtk_notebook_set_current_page ( GTK_NOTEBOOK ( notebook ) , 1 ) ;
2002-11-01 16:09:43 +00:00
}
else
{
2002-11-05 20:49:44 +00:00
if ( meta_theme_info - > background_image ! = NULL )
2002-11-16 05:56:46 +00:00
gtk_notebook_set_current_page ( GTK_NOTEBOOK ( notebook ) , 2 ) ;
2002-11-01 16:09:43 +00:00
else
2002-11-16 05:56:46 +00:00
gtk_notebook_set_current_page ( GTK_NOTEBOOK ( notebook ) , 0 ) ;
2002-11-01 16:09:43 +00:00
}
}
}
static void
meta_theme_selection_changed ( GtkTreeSelection * selection ,
GladeXML * dialog )
{
GnomeThemeMetaInfo * meta_theme_info ;
GtkTreeIter iter ;
gchar * meta_theme_name ;
GtkTreeModel * model ;
if ( gtk_tree_selection_get_selected ( selection , & model , & iter ) )
{
gtk_tree_model_get ( model , & iter ,
2002-12-03 16:16:45 +00:00
META_THEME_ID_COLUMN , & meta_theme_name ,
2002-11-01 16:09:43 +00:00
- 1 ) ;
}
else
2002-12-03 16:16:45 +00:00
{
/* I probably just added a row. */
return ;
}
2002-11-01 16:09:43 +00:00
2002-12-03 16:16:45 +00:00
if ( meta_theme_name )
{
meta_theme_info = gnome_theme_meta_info_find ( meta_theme_name ) ;
Patch from Kjartan Maraas to fix a bunch of leaks.
Thu Feb 13 18:51:37 2003 Jonathan Blandford <jrb@redhat.com>
* capplets/common/gconf-property-editor.c: (gconf_peditor_new):
* capplets/common/gnome-theme-info.c: (read_meta_theme),
(update_theme_index), (update_common_theme_dir_index),
(top_theme_dir_changed), (top_icon_theme_dir_changed),
(add_common_theme_dir_monitor), (real_add_top_theme_dir_monitor):
* capplets/default-applications/gnome-default-applications-properti
es.c: (initialize_default_applications), (read_editor),
(read_terminal):
* capplets/file-types/mime-edit-dialog.c: (fill_dialog):
* capplets/file-types/mime-type-info.c: (load_all_mime_types):
* capplets/file-types/mime-types-model.c:
(mime_types_model_get_value):
* capplets/font/main.c: (font_render_get_gconf), (enum_group_load):
* capplets/mouse/gnome-mouse-properties.c: (read_cursor_font),
(cursor_changed):
* capplets/theme-switcher/gnome-theme-details.c:
(window_theme_selection_changed):
* capplets/theme-switcher/gnome-theme-manager.c:
(meta_theme_selection_changed):
* capplets/theme-switcher/theme-thumbnail.c:
(generate_theme_thumbnail):
* libsounds/sound-properties.c: (sound_properties_add_directory),
(sound_properties_add_file):
* libsounds/sound-view.c: (compare_func):
* libwindow-settings/gnome-window-manager.c:
(gnome_window_manager_new): Patch from Kjartan Maraas to fix a
bunch of leaks.
2003-02-14 00:02:50 +00:00
g_free ( meta_theme_name ) ;
2002-12-03 16:16:45 +00:00
}
else
{
meta_theme_info = & custom_meta_theme_info ;
}
2002-11-01 16:09:43 +00:00
meta_theme_setup_info ( meta_theme_info , dialog ) ;
if ( setting_model )
return ;
if ( meta_theme_info )
2003-05-13 18:37:05 +00:00
gnome_meta_theme_set ( meta_theme_info ) ;
2002-11-01 16:09:43 +00:00
}
2002-12-03 16:16:45 +00:00
/* This function will adjust the list to reflect the current theme
* situation . It is called after the themes change on disk . Currently , it
* recreates the entire list .
2002-11-01 16:09:43 +00:00
*/
static void
2002-12-03 16:16:45 +00:00
update_themes_from_disk ( GladeXML * dialog )
2002-11-01 16:09:43 +00:00
{
GList * theme_list ;
2002-11-05 20:49:44 +00:00
gboolean have_meta_theme ;
2002-11-01 16:09:43 +00:00
2002-12-03 16:16:45 +00:00
theme_list = gnome_theme_meta_info_find_all ( ) ;
2003-01-02 13:58:58 +00:00
if ( theme_list = = NULL )
2002-11-05 20:49:44 +00:00
{
2002-12-03 16:16:45 +00:00
have_meta_theme = FALSE ;
2002-11-05 20:49:44 +00:00
}
else
{
2002-12-03 16:16:45 +00:00
have_meta_theme = TRUE ;
gtk_widget_show ( WID ( " meta_theme_hbox " ) ) ;
2003-02-05 22:20:09 +00:00
load_meta_themes ( GTK_TREE_VIEW ( WID ( " meta_theme_treeview " ) ) , theme_list ) ;
2002-11-05 20:49:44 +00:00
}
2002-11-01 16:09:43 +00:00
g_list_free ( theme_list ) ;
2002-12-03 16:16:45 +00:00
update_settings_from_gconf ( ) ;
2002-11-01 16:09:43 +00:00
2002-12-03 16:16:45 +00:00
if ( ! have_meta_theme )
2002-11-01 16:09:43 +00:00
{
2002-12-03 16:16:45 +00:00
GtkWidget * dialog ;
2002-11-01 16:09:43 +00:00
2002-12-03 16:16:45 +00:00
dialog = gtk_message_dialog_new ( NULL ,
GTK_DIALOG_MODAL ,
GTK_MESSAGE_ERROR ,
GTK_BUTTONS_OK ,
_ ( " No themes could be found on your system. This probably means that your \" Theme Preferences \" dialog was improperly installed, or you haven't installed the \" gnome-themes \" package. " ) ) ;
gtk_dialog_run ( GTK_DIALOG ( dialog ) ) ;
gtk_widget_destroy ( dialog ) ;
exit ( 0 ) ;
2002-11-05 20:49:44 +00:00
}
2002-12-03 16:16:45 +00:00
}
2002-11-01 16:09:43 +00:00
2002-12-03 16:16:45 +00:00
static void
add_custom_row_to_meta_theme ( const gchar * current_gtk_theme ,
const gchar * current_window_theme ,
const gchar * current_icon_theme )
{
GladeXML * dialog ;
GtkWidget * tree_view ;
GtkTreeModel * model ;
GtkTreePath * path ;
GtkTreeIter iter ;
gboolean valid ;
gchar * blurb ;
2003-01-05 23:26:04 +00:00
GdkPixbuf * pixbuf ;
2002-11-01 16:09:43 +00:00
2002-12-03 16:16:45 +00:00
dialog = gnome_theme_manager_get_theme_dialog ( ) ;
tree_view = WID ( " meta_theme_treeview " ) ;
model = gtk_tree_view_get_model ( GTK_TREE_VIEW ( tree_view ) ) ;
2003-01-02 13:58:58 +00:00
2003-01-07 08:15:07 +00:00
g_free ( custom_meta_theme_info . gtk_theme_name ) ;
2002-12-03 16:16:45 +00:00
custom_meta_theme_info . gtk_theme_name = g_strdup ( current_gtk_theme ) ;
2003-01-07 08:15:07 +00:00
g_free ( custom_meta_theme_info . metacity_theme_name ) ;
2002-12-03 16:16:45 +00:00
custom_meta_theme_info . metacity_theme_name = g_strdup ( current_window_theme ) ;
2003-01-07 08:15:07 +00:00
g_free ( custom_meta_theme_info . icon_theme_name ) ;
2002-12-03 16:16:45 +00:00
custom_meta_theme_info . icon_theme_name = g_strdup ( current_icon_theme ) ;
2003-01-07 08:15:07 +00:00
g_free ( custom_meta_theme_info . name ) ;
2003-01-08 07:01:24 +00:00
custom_meta_theme_info . name = g_strdup ( " __Custom Theme__ " ) ;
2002-12-03 16:16:45 +00:00
for ( valid = gtk_tree_model_get_iter_first ( model , & iter ) ;
valid ;
valid = gtk_tree_model_iter_next ( model , & iter ) )
2002-11-05 20:49:44 +00:00
{
2002-12-03 16:16:45 +00:00
guint theme_flags = 0 ;
gtk_tree_model_get ( model , & iter ,
META_THEME_FLAG_COLUMN , & theme_flags ,
- 1 ) ;
2003-01-08 07:01:24 +00:00
if ( theme_flags & THEME_FLAG_CUSTOM | | theme_flags & THEME_FLAG_INITIAL )
2002-12-03 16:16:45 +00:00
break ;
2002-11-05 20:49:44 +00:00
}
2002-11-01 16:09:43 +00:00
2002-12-03 16:16:45 +00:00
/* if we found a custom row and broke out of the list above, valid will be
* TRUE . If we didn ' t , we need to add a new iter .
*/
if ( ! valid )
gtk_list_store_prepend ( GTK_LIST_STORE ( model ) , & iter ) ;
2002-11-01 16:09:43 +00:00
2002-12-03 16:16:45 +00:00
/* set the values of the Custom theme. */
2004-02-04 04:36:27 +00:00
blurb = g_markup_printf_escaped ( " <span size= \" larger \" weight= \" bold \" >%s</span> \n %s " ,
_ ( " Custom theme " ) , _ ( " You can save this theme by pressing the Save Theme button. " ) ) ;
2002-11-05 20:49:44 +00:00
2003-01-05 23:26:04 +00:00
/* Invalidate the cache because the custom theme has potentially changed */
/* Commented out because it does odd things */
/*theme_thumbnail_invalidate_cache (&custom_meta_theme_info);*/
2003-01-07 08:15:07 +00:00
pixbuf = generate_theme_thumbnail ( & custom_meta_theme_info , TRUE ) ;
2003-01-08 07:01:24 +00:00
if ( pixbuf = = NULL )
pixbuf = default_image ;
2002-12-03 16:16:45 +00:00
gtk_list_store_set ( GTK_LIST_STORE ( model ) , & iter ,
2003-01-05 23:26:04 +00:00
META_THEME_PIXBUF_COLUMN , pixbuf ,
2002-12-03 16:16:45 +00:00
META_THEME_NAME_COLUMN , blurb ,
META_THEME_FLAG_COLUMN , THEME_FLAG_CUSTOM ,
- 1 ) ;
2003-01-05 23:26:04 +00:00
2002-12-04 01:42:45 +00:00
gtk_widget_set_sensitive ( WID ( " meta_theme_save_button " ) , TRUE ) ;
2002-12-03 16:16:45 +00:00
path = gtk_tree_model_get_path ( model , & iter ) ;
gtk_tree_view_set_cursor ( GTK_TREE_VIEW ( tree_view ) , path , NULL , FALSE ) ;
gtk_tree_path_free ( path ) ;
g_free ( blurb ) ;
2002-11-01 16:09:43 +00:00
}
static void
2003-01-08 07:01:24 +00:00
add_initial_row_to_meta_theme ( void )
2002-11-01 16:09:43 +00:00
{
2002-12-04 01:42:45 +00:00
GladeXML * dialog ;
2003-01-08 07:01:24 +00:00
GtkWidget * tree_view ;
GtkTreeModel * model ;
GtkTreePath * path ;
GtkTreeIter iter ;
gboolean valid ;
gchar * blurb ;
GdkPixbuf * pixbuf ;
dialog = gnome_theme_manager_get_theme_dialog ( ) ;
tree_view = WID ( " meta_theme_treeview " ) ;
model = gtk_tree_view_get_model ( GTK_TREE_VIEW ( tree_view ) ) ;
for ( valid = gtk_tree_model_get_iter_first ( model , & iter ) ;
valid ;
valid = gtk_tree_model_iter_next ( model , & iter ) )
{
guint theme_flags = 0 ;
gtk_tree_model_get ( model , & iter ,
META_THEME_FLAG_COLUMN , & theme_flags ,
- 1 ) ;
if ( theme_flags & THEME_FLAG_CUSTOM | | theme_flags & THEME_FLAG_INITIAL )
break ;
}
/* if we found a custom row and broke out of the list above, valid will be
* TRUE . If we didn ' t , we need to add a new iter .
*/
if ( ! valid )
gtk_list_store_prepend ( GTK_LIST_STORE ( model ) , & iter ) ;
/* set the values of the Custom theme. */
2004-02-04 04:36:27 +00:00
blurb = g_markup_printf_escaped ( " <span size= \" larger \" weight= \" bold \" >%s</span> \n %s " ,
_ ( " Custom theme " ) , _ ( " You can save this theme by pressing the Save Theme button. " ) ) ;
2003-01-08 07:01:24 +00:00
/* Invalidate the cache because the custom theme has potentially changed */
/* Commented out because it does odd things */
/*theme_thumbnail_invalidate_cache (&custom_meta_theme_info);*/
pixbuf = generate_theme_thumbnail ( & initial_meta_theme_info , TRUE ) ;
if ( pixbuf = = NULL )
pixbuf = default_image ;
gtk_list_store_set ( GTK_LIST_STORE ( model ) , & iter ,
META_THEME_PIXBUF_COLUMN , pixbuf ,
META_THEME_NAME_COLUMN , blurb ,
META_THEME_FLAG_COLUMN , THEME_FLAG_INITIAL ,
- 1 ) ;
gtk_widget_set_sensitive ( WID ( " meta_theme_save_button " ) , TRUE ) ;
path = gtk_tree_model_get_path ( model , & iter ) ;
gtk_tree_path_free ( path ) ;
g_free ( blurb ) ;
}
static void
remove_custom_row_from_meta_theme ( void )
{
GladeXML * dialog ;
GtkWidget * tree_view ;
GtkTreeModel * model ;
2002-12-03 16:16:45 +00:00
GtkTreeIter iter ;
GtkTreeIter next_iter ;
gboolean valid ;
2002-12-04 01:42:45 +00:00
dialog = gnome_theme_manager_get_theme_dialog ( ) ;
2003-01-08 07:01:24 +00:00
tree_view = WID ( " meta_theme_treeview " ) ;
model = gtk_tree_view_get_model ( GTK_TREE_VIEW ( tree_view ) ) ;
2002-12-04 01:42:45 +00:00
2002-12-03 16:16:45 +00:00
valid = gtk_tree_model_get_iter_first ( model , & iter ) ;
while ( valid )
{
guint theme_flags = 0 ;
next_iter = iter ;
valid = gtk_tree_model_iter_next ( model , & next_iter ) ;
gtk_tree_model_get ( model , & iter ,
META_THEME_FLAG_COLUMN , & theme_flags ,
- 1 ) ;
2003-01-08 07:01:24 +00:00
if ( theme_flags & THEME_FLAG_CUSTOM | | theme_flags & THEME_FLAG_INITIAL )
2002-12-03 16:16:45 +00:00
{
gtk_list_store_remove ( GTK_LIST_STORE ( model ) , & iter ) ;
}
iter = next_iter ;
}
g_free ( custom_meta_theme_info . gtk_theme_name ) ;
g_free ( custom_meta_theme_info . metacity_theme_name ) ;
g_free ( custom_meta_theme_info . icon_theme_name ) ;
2003-01-05 23:26:04 +00:00
g_free ( custom_meta_theme_info . name ) ;
2002-11-01 16:09:43 +00:00
2002-12-04 01:42:45 +00:00
gtk_widget_set_sensitive ( WID ( " meta_theme_save_button " ) , FALSE ) ;
2002-12-03 16:16:45 +00:00
custom_meta_theme_info . gtk_theme_name = NULL ;
custom_meta_theme_info . metacity_theme_name = NULL ;
custom_meta_theme_info . icon_theme_name = NULL ;
2003-01-05 23:26:04 +00:00
custom_meta_theme_info . name = NULL ;
2002-11-01 16:09:43 +00:00
}
2002-12-03 16:16:45 +00:00
/* Sets the list to point to the current theme. Also creates the 'Custom Theme'
* field if needed */
2002-11-01 16:09:43 +00:00
static void
2002-12-03 16:16:45 +00:00
update_settings_from_gconf ( void )
2002-11-01 16:09:43 +00:00
{
2002-12-03 16:16:45 +00:00
GConfClient * client ;
gchar * current_gtk_theme ;
gchar * current_window_theme ;
gchar * current_icon_theme ;
GnomeWindowManager * window_manager ;
GnomeWMSettings wm_settings ;
GtkWidget * tree_view ;
GtkTreeModel * model ;
GtkTreeIter iter ;
GladeXML * dialog ;
gboolean valid ;
gboolean custom_theme_found ;
2003-01-08 07:01:24 +00:00
static gboolean first_time_run = TRUE ;
2002-11-01 16:09:43 +00:00
2002-12-03 16:16:45 +00:00
client = gconf_client_get_default ( ) ;
2002-11-01 16:09:43 +00:00
2002-12-03 16:16:45 +00:00
/* Get the settings */
current_gtk_theme = gconf_client_get_string ( client , GTK_THEME_KEY , NULL ) ;
current_icon_theme = gconf_client_get_string ( client , ICON_THEME_KEY , NULL ) ;
window_manager = gnome_wm_manager_get_current ( gdk_display_get_default_screen ( gdk_display_get_default ( ) ) ) ;
2003-01-14 07:17:28 +00:00
wm_settings . flags = GNOME_WM_SETTING_THEME ;
2002-12-30 19:24:05 +00:00
if ( window_manager ) {
gnome_window_manager_get_settings ( window_manager , & wm_settings ) ;
current_window_theme = g_strdup ( wm_settings . theme ) ;
} else
current_window_theme = g_strdup ( " " ) ;
2002-12-03 16:16:45 +00:00
custom_theme_found = TRUE ;
2002-11-01 16:09:43 +00:00
2002-12-03 16:16:45 +00:00
/* Walk the tree looking for the current one. */
dialog = gnome_theme_manager_get_theme_dialog ( ) ;
tree_view = WID ( " meta_theme_treeview " ) ;
g_assert ( tree_view ) ;
model = gtk_tree_view_get_model ( GTK_TREE_VIEW ( tree_view ) ) ;
2002-11-01 16:09:43 +00:00
2002-12-03 16:16:45 +00:00
for ( valid = gtk_tree_model_get_iter_first ( model , & iter ) ;
valid ;
valid = gtk_tree_model_iter_next ( model , & iter ) )
{
gchar * row_theme_id = NULL ;
guint row_theme_flags = 0 ;
GnomeThemeMetaInfo * meta_theme_info ;
2002-11-01 16:09:43 +00:00
2002-12-03 16:16:45 +00:00
gtk_tree_model_get ( model , & iter ,
META_THEME_ID_COLUMN , & row_theme_id ,
META_THEME_FLAG_COLUMN , & row_theme_flags ,
- 1 ) ;
2002-11-01 16:09:43 +00:00
2002-12-03 16:16:45 +00:00
if ( row_theme_flags & THEME_FLAG_CUSTOM )
{
meta_theme_info = & custom_meta_theme_info ;
}
2003-01-08 07:01:24 +00:00
else if ( row_theme_flags & THEME_FLAG_INITIAL )
{
meta_theme_info = & initial_meta_theme_info ;
}
2002-12-03 16:16:45 +00:00
else if ( row_theme_id )
{
meta_theme_info = gnome_theme_meta_info_find ( row_theme_id ) ;
}
else
{
meta_theme_info = & custom_meta_theme_info ;
}
g_free ( row_theme_id ) ;
2002-11-01 16:09:43 +00:00
2002-12-03 16:16:45 +00:00
if ( meta_theme_info = = & ( custom_meta_theme_info ) )
custom_theme_found = TRUE ;
else if ( ! strcmp ( current_gtk_theme , meta_theme_info - > gtk_theme_name ) & &
2003-01-02 13:58:58 +00:00
! strcmp ( current_window_theme , meta_theme_info - > metacity_theme_name ) & &
! strcmp ( current_icon_theme , meta_theme_info - > icon_theme_name ) )
2002-12-03 16:16:45 +00:00
{
GtkTreePath * path ;
2002-11-01 16:09:43 +00:00
2002-12-03 16:16:45 +00:00
path = gtk_tree_model_get_path ( model , & iter ) ;
gtk_tree_view_set_cursor ( GTK_TREE_VIEW ( tree_view ) , path , NULL , FALSE ) ;
gtk_tree_path_free ( path ) ;
custom_theme_found = FALSE ;
2002-11-01 16:09:43 +00:00
2002-12-03 16:16:45 +00:00
break ;
2002-11-01 16:09:43 +00:00
}
2002-12-03 16:16:45 +00:00
}
2002-11-01 16:09:43 +00:00
2003-01-08 07:01:24 +00:00
if ( custom_theme_found & & first_time_run )
{
initial_meta_theme_set = TRUE ;
initial_meta_theme_info . name = g_strdup ( " __Initial Theme__ " ) ;
initial_meta_theme_info . gtk_theme_name = g_strdup ( current_gtk_theme ) ;
initial_meta_theme_info . metacity_theme_name = g_strdup ( current_window_theme ) ;
initial_meta_theme_info . icon_theme_name = g_strdup ( current_icon_theme ) ;
}
first_time_run = FALSE ;
2002-12-03 16:16:45 +00:00
if ( custom_theme_found )
2003-01-08 07:01:24 +00:00
{
add_custom_row_to_meta_theme ( current_gtk_theme , current_window_theme , current_icon_theme ) ;
}
else if ( initial_meta_theme_set )
{
add_initial_row_to_meta_theme ( ) ;
}
2002-12-03 16:16:45 +00:00
else
2003-01-08 07:01:24 +00:00
{
remove_custom_row_from_meta_theme ( ) ;
}
2002-12-03 16:16:45 +00:00
g_free ( current_gtk_theme ) ;
g_free ( current_window_theme ) ;
g_free ( current_icon_theme ) ;
2003-01-06 15:59:46 +00:00
add_pixbuf_idle ( ) ;
2002-11-01 16:09:43 +00:00
}
static void
2002-12-03 16:16:45 +00:00
gtk_theme_key_changed ( GConfClient * client ,
guint cnxn_id ,
GConfEntry * entry ,
gpointer user_data )
2002-11-01 16:09:43 +00:00
{
2002-12-03 16:16:45 +00:00
if ( strcmp ( entry - > key , GTK_THEME_KEY ) )
return ;
2002-11-01 16:09:43 +00:00
2002-12-03 16:16:45 +00:00
update_settings_from_gconf ( ) ;
gnome_theme_details_update_from_gconf ( ) ;
2002-11-01 16:09:43 +00:00
}
static void
2002-12-03 16:16:45 +00:00
window_settings_changed ( GnomeWindowManager * window_manager ,
GladeXML * dialog )
2002-11-01 16:09:43 +00:00
{
2002-12-03 16:16:45 +00:00
/* There is no way to know what changed, so we just check it all */
update_settings_from_gconf ( ) ;
gnome_theme_details_update_from_gconf ( ) ;
2002-11-01 16:09:43 +00:00
}
2003-01-08 22:40:33 +00:00
static void
update_font_button_state ( GladeXML * dialog )
{
GConfClient * client = gconf_client_get_default ( ) ;
GtkTreeSelection * selection ;
GtkTreeModel * model ;
GtkTreeIter iter ;
selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW ( WID ( " meta_theme_treeview " ) ) ) ;
if ( gtk_tree_selection_get_selected ( selection , & model , & iter ) )
{
GnomeThemeMetaInfo * meta_theme_info ;
char * meta_theme_name , * str ;
gtk_tree_model_get ( model , & iter ,
META_THEME_ID_COLUMN , & meta_theme_name ,
- 1 ) ;
if ( ! meta_theme_name )
return ;
meta_theme_info = gnome_theme_meta_info_find ( meta_theme_name ) ;
g_assert ( meta_theme_info ) ;
g_free ( meta_theme_name ) ;
str = gconf_client_get_string ( client , FONT_KEY , NULL ) ;
if ( meta_theme_info - > application_font ! = NULL & & str ! = NULL & &
strcmp ( meta_theme_info - > application_font , str ) = = 0 )
{
gtk_widget_set_sensitive ( WID ( " meta_theme_font1_button " ) , FALSE ) ;
gtk_widget_set_sensitive ( WID ( " meta_theme_font2_button " ) , FALSE ) ;
}
else
{
gtk_widget_set_sensitive ( WID ( " meta_theme_font1_button " ) , TRUE ) ;
gtk_widget_set_sensitive ( WID ( " meta_theme_font2_button " ) , TRUE ) ;
}
g_free ( str ) ;
}
}
static void
font_key_changed ( GConfClient * client ,
guint cnxn_id ,
GConfEntry * entry ,
gpointer user_data )
{
GladeXML * dialog = user_data ;
update_font_button_state ( dialog ) ;
}
2002-11-01 16:09:43 +00:00
static void
2002-12-03 16:16:45 +00:00
icon_key_changed ( GConfClient * client ,
guint cnxn_id ,
GConfEntry * entry ,
gpointer user_data )
2002-11-01 16:09:43 +00:00
{
2002-12-03 16:16:45 +00:00
if ( strcmp ( entry - > key , ICON_THEME_KEY ) )
return ;
2002-11-01 16:09:43 +00:00
2002-12-03 16:16:45 +00:00
update_settings_from_gconf ( ) ;
gnome_theme_details_update_from_gconf ( ) ;
2002-11-01 16:09:43 +00:00
}
2002-12-03 16:16:45 +00:00
/* FIXME: We want a more sophisticated theme_changed func sometime */
2002-11-01 16:09:43 +00:00
static void
2002-12-03 16:16:45 +00:00
theme_changed_func ( gpointer uri ,
gpointer user_data )
2002-11-01 16:09:43 +00:00
{
2002-12-03 16:16:45 +00:00
GladeXML * dialog ;
dialog = gnome_theme_manager_get_theme_dialog ( ) ;
2002-11-01 16:09:43 +00:00
2003-01-02 13:58:58 +00:00
update_themes_from_disk ( dialog ) ;
2002-12-03 16:16:45 +00:00
gnome_theme_details_reread_themes_from_disk ( ) ;
gtk_widget_grab_focus ( WID ( " meta_theme_treeview " ) ) ;
2002-11-01 16:09:43 +00:00
}
static void
cb_dialog_response ( GtkDialog * dialog , gint response_id )
{
2002-12-03 16:16:45 +00:00
if ( response_id = = GTK_RESPONSE_HELP )
capplet_help ( GTK_WINDOW ( dialog ) , " wgoscustdesk.xml " , " goscustdesk-12 " ) ;
else
gtk_main_quit ( ) ;
2002-11-01 16:09:43 +00:00
}
static void
2002-12-03 16:16:45 +00:00
setup_meta_tree_view ( GtkTreeView * tree_view ,
GCallback changed_callback ,
GladeXML * dialog )
2002-11-01 16:09:43 +00:00
{
GtkTreeModel * model ;
GtkTreeSelection * selection ;
2002-11-14 22:26:09 +00:00
GtkCellRenderer * renderer ;
renderer = g_object_new ( GTK_TYPE_CELL_RENDERER_PIXBUF ,
" xpad " , 4 ,
" ypad " , 4 ,
NULL ) ;
2002-11-14 22:14:57 +00:00
gtk_tree_view_insert_column_with_attributes ( tree_view ,
- 1 , NULL ,
2002-11-14 22:26:09 +00:00
renderer ,
2002-12-03 16:16:45 +00:00
" pixbuf " , META_THEME_PIXBUF_COLUMN ,
2002-11-14 22:14:57 +00:00
NULL ) ;
2002-11-14 22:26:09 +00:00
renderer = gtk_cell_renderer_text_new ( ) ;
2002-11-01 16:09:43 +00:00
gtk_tree_view_insert_column_with_attributes ( tree_view ,
- 1 , NULL ,
2002-11-14 22:26:09 +00:00
renderer ,
2002-12-03 16:16:45 +00:00
" markup " , META_THEME_NAME_COLUMN ,
2002-11-01 16:09:43 +00:00
NULL ) ;
2002-11-05 20:49:44 +00:00
2002-12-03 16:16:45 +00:00
model = ( GtkTreeModel * ) gtk_list_store_new ( META_N_COLUMNS ,
G_TYPE_STRING , /* META_THEME_NAME_COLUMN */
G_TYPE_STRING , /* META_THEME_ID_COLUMN */
G_TYPE_UINT , /* META_THEME_FLAG_COLUMN */
GDK_TYPE_PIXBUF ) ; /* META_THEME_PIXBUF_COLUMN */
2002-11-01 16:09:43 +00:00
gtk_tree_view_set_model ( tree_view , model ) ;
selection = gtk_tree_view_get_selection ( tree_view ) ;
gtk_tree_selection_set_mode ( selection , GTK_SELECTION_BROWSE ) ;
g_signal_connect ( G_OBJECT ( selection ) , " changed " , changed_callback , dialog ) ;
}
2003-01-16 07:40:29 +00:00
static void
gnome_meta_theme_installer_run_cb ( GtkWidget * button ,
GtkWidget * parent_window )
{
gnome_theme_installer_run ( parent_window , NULL , FALSE ) ;
}
2002-12-04 01:42:45 +00:00
static void
gnome_theme_save_clicked ( GtkWidget * button ,
gpointer data )
{
GladeXML * dialog ;
dialog = gnome_theme_manager_get_theme_dialog ( ) ;
gnome_theme_save_show_dialog ( WID ( " theme_dialog " ) , & custom_meta_theme_info ) ;
}
2003-01-08 22:40:33 +00:00
static void
apply_font_clicked ( GtkWidget * button ,
gpointer data )
{
GladeXML * dialog = data ;
GConfClient * client ;
GtkTreeSelection * selection ;
GtkTreeModel * model ;
GtkTreeIter iter ;
client = gconf_client_get_default ( ) ;
selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW ( WID ( " meta_theme_treeview " ) ) ) ;
if ( gtk_tree_selection_get_selected ( selection , & model , & iter ) )
{
GnomeThemeMetaInfo * meta_theme_info ;
char * meta_theme_name ;
gtk_tree_model_get ( model , & iter ,
META_THEME_ID_COLUMN , & meta_theme_name ,
- 1 ) ;
meta_theme_info = gnome_theme_meta_info_find ( meta_theme_name ) ;
g_assert ( meta_theme_info ) ;
g_free ( meta_theme_name ) ;
2003-01-02 13:58:58 +00:00
2003-01-08 22:40:33 +00:00
gconf_client_set_string ( client , FONT_KEY , meta_theme_info - > application_font , NULL ) ;
}
}
2002-11-01 16:09:43 +00:00
static void
setup_dialog ( GladeXML * dialog )
{
GConfClient * client ;
GtkWidget * parent , * widget ;
GnomeWindowManager * window_manager ;
2002-11-18 19:40:46 +00:00
GtkSizeGroup * size_group ;
2002-12-03 16:16:45 +00:00
2003-01-06 15:59:46 +00:00
default_image = gdk_pixbuf_new_from_file ( GNOMECC_DATA_DIR " /pixmaps/theme-thumbnailing.png " , NULL ) ;
2002-11-01 16:09:43 +00:00
client = gconf_client_get_default ( ) ;
2003-02-05 22:20:09 +00:00
2002-11-01 16:09:43 +00:00
window_manager = gnome_wm_manager_get_current ( gdk_display_get_default_screen ( gdk_display_get_default ( ) ) ) ;
2003-01-05 23:58:27 +00:00
2002-11-01 16:09:43 +00:00
parent = WID ( " theme_dialog " ) ;
2002-11-18 19:40:46 +00:00
size_group = gtk_size_group_new ( GTK_SIZE_GROUP_HORIZONTAL ) ;
2002-12-03 16:16:45 +00:00
gtk_size_group_add_widget ( size_group , WID ( " meta_theme_details_button " ) ) ;
2002-11-18 19:40:46 +00:00
gtk_size_group_add_widget ( size_group , WID ( " meta_theme_install_button " ) ) ;
gtk_size_group_add_widget ( size_group , WID ( " meta_theme_save_button " ) ) ;
2002-11-27 00:03:37 +00:00
gtk_size_group_add_widget ( size_group , WID ( " meta_theme_font1_button " ) ) ;
gtk_size_group_add_widget ( size_group , WID ( " meta_theme_background1_button " ) ) ;
gtk_size_group_add_widget ( size_group , WID ( " meta_theme_font2_button " ) ) ;
gtk_size_group_add_widget ( size_group , WID ( " meta_theme_background2_button " ) ) ;
g_object_unref ( size_group ) ;
2003-01-16 07:40:29 +00:00
g_signal_connect ( G_OBJECT ( WID ( " meta_theme_install_button " ) ) , " clicked " , G_CALLBACK ( gnome_meta_theme_installer_run_cb ) , parent ) ;
2002-12-03 16:16:45 +00:00
g_signal_connect ( G_OBJECT ( WID ( " meta_theme_details_button " ) ) , " clicked " , gnome_theme_details_show , NULL ) ;
2002-11-27 00:03:37 +00:00
2003-01-08 22:40:33 +00:00
g_signal_connect ( G_OBJECT ( WID ( " meta_theme_font1_button " ) ) , " clicked " , G_CALLBACK ( apply_font_clicked ) , dialog ) ;
2002-12-03 16:16:45 +00:00
setup_meta_tree_view ( GTK_TREE_VIEW ( WID ( " meta_theme_treeview " ) ) ,
( GCallback ) meta_theme_selection_changed ,
dialog ) ;
2002-11-01 16:09:43 +00:00
gconf_client_add_dir ( client , " /desktop/gnome/interface " , GCONF_CLIENT_PRELOAD_ONELEVEL , NULL ) ;
gconf_client_notify_add ( client ,
GTK_THEME_KEY ,
2002-12-03 16:16:45 +00:00
( GConfClientNotifyFunc ) & gtk_theme_key_changed ,
2002-11-01 16:09:43 +00:00
dialog , NULL , NULL ) ;
gconf_client_notify_add ( client ,
ICON_THEME_KEY ,
( GConfClientNotifyFunc ) & icon_key_changed ,
dialog , NULL , NULL ) ;
2003-01-08 22:40:33 +00:00
gconf_client_notify_add ( client ,
FONT_KEY ,
( GConfClientNotifyFunc ) & font_key_changed ,
dialog , NULL , NULL ) ;
2002-12-30 19:24:05 +00:00
if ( window_manager )
g_signal_connect ( G_OBJECT ( window_manager ) ,
" settings_changed " ,
( GCallback ) window_settings_changed , dialog ) ;
2002-12-03 16:16:45 +00:00
update_themes_from_disk ( dialog ) ;
gtk_widget_grab_focus ( WID ( " meta_theme_treeview " ) ) ;
2002-11-01 16:09:43 +00:00
gnome_theme_info_register_theme_change ( theme_changed_func , dialog ) ;
2002-12-04 01:42:45 +00:00
widget = WID ( " meta_theme_save_button " ) ;
g_signal_connect ( G_OBJECT ( widget ) , " clicked " , G_CALLBACK ( gnome_theme_save_clicked ) , NULL ) ;
2002-11-18 19:40:46 +00:00
/*
2002-11-01 16:09:43 +00:00
g_signal_connect ( G_OBJECT ( WID ( " install_dialog " ) ) , " response " ,
G_CALLBACK ( install_dialog_response ) , dialog ) ;
*/
2002-12-03 16:16:45 +00:00
g_signal_connect ( G_OBJECT ( parent ) , " response " , G_CALLBACK ( cb_dialog_response ) , NULL ) ;
2002-11-01 16:09:43 +00:00
gtk_drag_dest_set ( parent , GTK_DEST_DEFAULT_ALL ,
drop_types , n_drop_types ,
GDK_ACTION_COPY | GDK_ACTION_LINK | GDK_ACTION_MOVE ) ;
2002-12-03 16:16:45 +00:00
g_signal_connect ( G_OBJECT ( parent ) , " drag-motion " , G_CALLBACK ( gnome_theme_manager_drag_motion_cb ) , NULL ) ;
g_signal_connect ( G_OBJECT ( parent ) , " drag-leave " , G_CALLBACK ( gnome_theme_manager_drag_leave_cb ) , NULL ) ;
g_signal_connect ( G_OBJECT ( parent ) , " drag-data-received " , G_CALLBACK ( gnome_theme_manager_drag_data_received_cb ) , NULL ) ;
2002-11-01 16:09:43 +00:00
capplet_set_icon ( parent , " gnome-ccthemes.png " ) ;
2003-01-05 23:58:27 +00:00
2003-01-08 22:40:33 +00:00
update_font_button_state ( dialog ) ;
2002-11-01 16:09:43 +00:00
gtk_widget_show ( parent ) ;
2003-01-05 23:58:27 +00:00
2002-11-01 16:09:43 +00:00
}
2002-12-04 01:42:45 +00:00
/* Non static functions */
2002-12-03 16:16:45 +00:00
GladeXML *
gnome_theme_manager_get_theme_dialog ( void )
{
static GladeXML * dialog = NULL ;
if ( dialog = = NULL )
dialog = glade_xml_new ( GLADEDIR " /theme-properties.glade " , NULL , NULL ) ;
return dialog ;
}
2003-01-02 13:58:58 +00:00
gint
gnome_theme_manager_sort_func ( const gchar * a_str ,
const gchar * b_str ,
guint a_flag ,
guint b_flag )
{
gint retval ;
2003-01-08 07:01:24 +00:00
if ( a_flag & ( THEME_FLAG_CUSTOM | THEME_FLAG_INITIAL ) )
2003-01-02 13:58:58 +00:00
retval = - 1 ;
2003-01-08 07:01:24 +00:00
else if ( b_flag & ( THEME_FLAG_CUSTOM | THEME_FLAG_INITIAL ) )
2003-01-02 13:58:58 +00:00
retval = 1 ;
else if ( a_flag & THEME_FLAG_DEFAULT )
retval = - 1 ;
else if ( b_flag & THEME_FLAG_DEFAULT )
retval = 1 ;
else
{
retval = g_utf8_collate ( a_str ? a_str : " " ,
b_str ? b_str : " " ) ;
}
return retval ;
}
2002-12-03 16:16:45 +00:00
/* Starts nautilus on the themes directory*/
void
gnome_theme_manager_show_manage_themes ( GtkWidget * button , gpointer data )
{
gchar * path , * command ;
GnomeVFSURI * uri ;
path = g_strdup_printf ( " %s/.themes " , g_get_home_dir ( ) ) ;
uri = gnome_vfs_uri_new ( path ) ;
if ( ! gnome_vfs_uri_exists ( uri ) ) {
/* Create the directory */
gnome_vfs_make_directory_for_uri ( uri , 0775 ) ;
}
gnome_vfs_uri_unref ( uri ) ;
command = g_strdup_printf ( " nautilus --no-desktop %s " , path ) ;
g_free ( path ) ;
g_spawn_command_line_async ( command , NULL ) ;
g_free ( command ) ;
}
2002-12-30 19:24:05 +00:00
/* Starts nautilus on the icon themes directory*/
void
gnome_theme_manager_icon_show_manage_themes ( GtkWidget * button , gpointer data )
{
gchar * path , * command ;
GnomeVFSURI * uri ;
path = g_strdup_printf ( " %s/.icons " , g_get_home_dir ( ) ) ;
uri = gnome_vfs_uri_new ( path ) ;
if ( ! gnome_vfs_uri_exists ( uri ) ) {
/* Create the directory */
gnome_vfs_make_directory_for_uri ( uri , 0775 ) ;
}
gnome_vfs_uri_unref ( uri ) ;
command = g_strdup_printf ( " nautilus --no-desktop %s " , path ) ;
g_free ( path ) ;
g_spawn_command_line_async ( command , NULL ) ;
g_free ( command ) ;
}
2002-12-03 16:16:45 +00:00
/* Show the nautilus themes window */
void
gnome_theme_manager_window_show_manage_themes ( GtkWidget * button , gpointer data )
{
gchar * path , * command ;
GnomeVFSURI * uri ;
GnomeWindowManager * wm ;
wm = gnome_wm_manager_get_current ( gdk_display_get_default_screen ( gdk_display_get_default ( ) ) ) ;
path = gnome_window_manager_get_user_theme_folder ( wm ) ;
g_object_unref ( G_OBJECT ( wm ) ) ;
uri = gnome_vfs_uri_new ( path ) ;
if ( ! gnome_vfs_uri_exists ( uri ) ) {
/* Create the directory */
gnome_vfs_make_directory_for_uri ( uri , 0775 ) ;
}
gnome_vfs_uri_unref ( uri ) ;
command = g_strdup_printf ( " nautilus --no-desktop %s " , path ) ;
g_free ( path ) ;
g_spawn_command_line_async ( command , NULL ) ;
g_free ( command ) ;
}
/* Callback issued during drag movements */
gboolean
gnome_theme_manager_drag_motion_cb ( GtkWidget * widget , GdkDragContext * context ,
gint x , gint y , guint time , gpointer data )
{
return FALSE ;
}
/* Callback issued during drag leaves */
void
gnome_theme_manager_drag_leave_cb ( GtkWidget * widget , GdkDragContext * context ,
guint time , gpointer data )
{
gtk_widget_queue_draw ( widget ) ;
}
/* Callback issued on actual drops. Attempts to load the file dropped. */
void
gnome_theme_manager_drag_data_received_cb ( GtkWidget * widget , GdkDragContext * context ,
gint x , gint y ,
GtkSelectionData * selection_data ,
guint info , guint time , gpointer data )
{
GList * uris ;
gchar * filename = NULL ;
if ( ! ( info = = TARGET_URI_LIST | | info = = TARGET_NS_URL ) )
return ;
uris = gnome_vfs_uri_list_parse ( ( gchar * ) selection_data - > data ) ;
if ( uris ! = NULL & & uris - > data ! = NULL ) {
GnomeVFSURI * uri = ( GnomeVFSURI * ) uris - > data ;
2003-01-06 01:12:04 +00:00
if ( gnome_vfs_uri_is_local ( uri ) )
filename = gnome_vfs_unescape_string (
gnome_vfs_uri_get_path ( uri ) ,
G_DIR_SEPARATOR_S ) ;
else
filename = gnome_vfs_unescape_string (
gnome_vfs_uri_to_string ( uri , GNOME_VFS_URI_HIDE_NONE ) ,
G_DIR_SEPARATOR_S ) ;
2002-12-03 16:16:45 +00:00
gnome_vfs_uri_list_unref ( uris ) ;
}
2003-01-16 07:40:29 +00:00
gnome_theme_installer_run ( widget , filename , FALSE ) ;
2002-12-03 16:16:45 +00:00
g_free ( filename ) ;
}
2003-02-05 22:20:09 +00:00
static gchar *
get_default_string_from_key ( const char * key )
{
GConfClient * client ;
GConfValue * value ;
GError * error = NULL ;
gchar * str = NULL ;
client = gconf_client_get_default ( ) ;
value = gconf_client_get_default_from_schema ( client , key , & error ) ;
if ( error )
{
g_clear_error ( & error ) ;
return NULL ;
}
if ( value )
{
if ( value - > type = = GCONF_VALUE_STRING )
str = gconf_value_to_string ( value ) ;
gconf_value_free ( value ) ;
}
return str ;
}
2002-11-01 16:09:43 +00:00
int
main ( int argc , char * argv [ ] )
{
GladeXML * dialog ;
2002-12-03 16:16:45 +00:00
/* We need to do this before we initialize anything else */
theme_thumbnail_factory_init ( argc , argv ) ;
2002-11-01 16:09:43 +00:00
bindtextdomain ( GETTEXT_PACKAGE , GNOMELOCALEDIR ) ;
bind_textdomain_codeset ( GETTEXT_PACKAGE , " UTF-8 " ) ;
textdomain ( GETTEXT_PACKAGE ) ;
2002-11-14 22:14:57 +00:00
2003-01-15 00:17:18 +00:00
gnome_program_init ( " gnome-theme-manager " , VERSION ,
2002-11-01 16:09:43 +00:00
LIBGNOMEUI_MODULE , argc , argv ,
GNOME_PARAM_APP_DATADIR , GNOMECC_DATA_DIR ,
NULL ) ;
2003-02-05 22:20:09 +00:00
gtk_theme_default_name = get_default_string_from_key ( GTK_THEME_KEY ) ;
window_theme_default_name = get_default_string_from_key ( METACITY_THEME_KEY ) ;
icon_theme_default_name = get_default_string_from_key ( ICON_THEME_KEY ) ;
if ( gtk_theme_default_name = = NULL | |
window_theme_default_name = = NULL | |
icon_theme_default_name = = NULL )
{
2003-08-11 15:37:34 +00:00
GtkWidget * msg_dialog ;
2003-02-05 22:20:09 +00:00
2003-08-11 15:37:34 +00:00
msg_dialog = gtk_message_dialog_new ( NULL ,
2003-02-05 22:20:09 +00:00
GTK_DIALOG_MODAL ,
GTK_MESSAGE_ERROR ,
GTK_BUTTONS_OK ,
2003-04-29 21:46:04 +00:00
_ ( " The default theme schemas could not be found on your system. This means that you probably don't have metacity installed, or that your gconf is configured incorrectly. " ) ) ;
2003-08-11 15:37:34 +00:00
gtk_dialog_run ( GTK_DIALOG ( msg_dialog ) ) ;
gtk_widget_destroy ( msg_dialog ) ;
2003-02-05 22:20:09 +00:00
exit ( 0 ) ;
}
2003-01-13 20:21:28 +00:00
gnome_theme_init ( NULL ) ;
2002-11-01 16:09:43 +00:00
gnome_wm_manager_init ( ) ;
activate_settings_daemon ( ) ;
2002-12-03 16:16:45 +00:00
dialog = gnome_theme_manager_get_theme_dialog ( ) ;
2003-01-05 23:58:27 +00:00
2002-11-01 16:09:43 +00:00
setup_dialog ( dialog ) ;
2002-12-03 16:16:45 +00:00
2002-11-01 16:09:43 +00:00
gtk_main ( ) ;
return 0 ;
}