652 lines
22 KiB
C++
652 lines
22 KiB
C++
/***************************************************************************
|
|
main.cpp - description
|
|
-------------------
|
|
begin : Wed Jan 1 19:06:46 GMT+4 2003
|
|
copyright : (C) 2003 - 2005 by Alex Shaduri
|
|
email : ashaduri '@' gmail.com
|
|
***************************************************************************/
|
|
|
|
|
|
#include <iostream>
|
|
#include <fstream>
|
|
#include <stdlib.h>
|
|
#include <sstream>
|
|
#include <gtk/gtk.h>
|
|
|
|
#ifdef _WIN32
|
|
#include <io.h>
|
|
#else
|
|
#include <sys/stat.h>
|
|
#endif
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <sys/types.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <gdk/gdkkeysyms.h>
|
|
|
|
#include "gtktheme.h"
|
|
#include "mainframe.h"
|
|
|
|
|
|
// ------------------------------------------------------
|
|
std::string& get_orig_theme();
|
|
std::string& get_orig_font();
|
|
|
|
std::string get_current_theme();
|
|
std::string get_current_font();
|
|
|
|
std::string get_selected_theme();
|
|
std::string get_selected_font();
|
|
|
|
void set_theme( const std::string& theme_name, const std::string& font );
|
|
void apply_theme( const std::string& theme_name, const std::string& font );
|
|
|
|
|
|
GtkWidget* g_main_rc_window = NULL;
|
|
static std::string s_rc_file;
|
|
|
|
|
|
// ------------------------------------------------------
|
|
GtkWidget* lookup_widget( GtkWidget* widget, const gchar* widget_name ) {
|
|
GtkWidget* parent, *found_widget;
|
|
|
|
for( ;; ) {
|
|
if( GTK_IS_MENU( widget ) )
|
|
parent = gtk_menu_get_attach_widget( GTK_MENU( widget ) );
|
|
else
|
|
parent = gtk_widget_get_parent( widget );
|
|
if( !parent )
|
|
parent = (GtkWidget*)g_object_get_data( G_OBJECT( widget ), "GladeParentKey" );
|
|
if( parent == NULL )
|
|
break;
|
|
widget = parent;
|
|
}
|
|
|
|
found_widget = (GtkWidget*)g_object_get_data( G_OBJECT( widget ), widget_name );
|
|
if( !found_widget )
|
|
g_warning( "Widget not found: %s", widget_name );
|
|
return found_widget;
|
|
}
|
|
|
|
|
|
|
|
void on_main_cancel_button_clicked( GtkButton* button, gpointer user_data ) {
|
|
set_theme( get_orig_theme(), get_orig_font() );
|
|
gtk_widget_destroy( g_main_rc_window );
|
|
g_main_rc_window = NULL;
|
|
}
|
|
|
|
void on_main_reset_button_clicked( GtkButton* button, gpointer user_data ) {
|
|
set_theme( get_orig_theme(), get_orig_font() );
|
|
}
|
|
|
|
gboolean on_main_window_delete_event( GtkWidget* widget, GdkEvent* event, gpointer user_data ) {
|
|
set_theme( get_orig_theme(), get_orig_font() );
|
|
gtk_widget_destroy( g_main_rc_window );
|
|
g_main_rc_window = NULL;
|
|
return TRUE;
|
|
}
|
|
|
|
void on_main_use_default_font_radio_toggled( GtkToggleButton* togglebutton, gpointer user_data ) {
|
|
const bool default_font = gtk_toggle_button_get_active( togglebutton );
|
|
gtk_widget_set_sensitive( lookup_widget( g_main_rc_window, "main_font_selector_button" ), !default_font );
|
|
apply_theme( get_selected_theme(), get_selected_font() );
|
|
}
|
|
|
|
void on_main_font_selector_button_font_set( GtkFontButton* fontbutton, gpointer user_data ) {
|
|
apply_theme( get_selected_theme(), get_selected_font() );
|
|
}
|
|
|
|
void on_main_ok_button_clicked( GtkButton* button, gpointer user_data ) {
|
|
gtk_widget_destroy( g_main_rc_window );
|
|
g_main_rc_window = NULL;
|
|
}
|
|
|
|
|
|
#define GLADE_HOOKUP_OBJECT( component, widget, name ) \
|
|
g_object_set_data_full( G_OBJECT( component ), name, \
|
|
g_object_ref( (gpointer)widget ), (GDestroyNotify)g_object_unref )
|
|
|
|
#define GLADE_HOOKUP_OBJECT_NO_REF( component, widget, name ) \
|
|
g_object_set_data( G_OBJECT( component ), name, widget )
|
|
|
|
GtkWidget* create_rc_window() {
|
|
GtkWidget* main_window;
|
|
GtkWidget* main_hbox;
|
|
GtkWidget* vbox1;
|
|
GtkWidget* hbox1;
|
|
GtkWidget* frame2;
|
|
GtkWidget* alignment3;
|
|
GtkWidget* scrolledwindow3;
|
|
GtkWidget* main_themelist;
|
|
GtkWidget* label1234;
|
|
GtkWidget* frame3;
|
|
GtkWidget* alignment4;
|
|
GtkWidget* vbox7;
|
|
GtkWidget* hbox8;
|
|
GtkWidget* vbox9;
|
|
GtkWidget* main_use_default_font_radio;
|
|
GtkWidget* main_use_custom_font_radio;
|
|
GtkWidget* alignment5;
|
|
GtkWidget* vbox10;
|
|
GtkWidget* hbox9;
|
|
GtkWidget* vbox11;
|
|
GtkWidget* main_font_selector_button;
|
|
GtkWidget* label669;
|
|
GtkWidget* vbox13;
|
|
GtkWidget* hbuttonbox1;
|
|
GtkWidget* hbox7;
|
|
GtkWidget* vbox6;
|
|
GtkWidget* hbox5;
|
|
GtkWidget* main_ok_button;
|
|
GtkWidget* main_cancel_button;
|
|
GtkWidget* main_reset_button;
|
|
GtkWidget* alignment2;
|
|
GtkWidget* hbox6;
|
|
GtkWidget* image1;
|
|
GtkWidget* label667;
|
|
GtkAccelGroup* accel_group;
|
|
|
|
accel_group = gtk_accel_group_new();
|
|
|
|
main_window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
|
|
gtk_widget_set_name( main_window, "main_window" );
|
|
gtk_window_set_title( GTK_WINDOW( main_window ), "Gtk2 Theme Selector" );
|
|
gtk_window_set_transient_for( GTK_WINDOW( main_window ), MainFrame_getWindow() );
|
|
gtk_window_set_destroy_with_parent( GTK_WINDOW( main_window ), TRUE );
|
|
|
|
//gtk_window_set_keep_above ( GTK_WINDOW( main_window ), TRUE );
|
|
|
|
main_hbox = gtk_hbox_new( FALSE, 0 );
|
|
gtk_widget_set_name( main_hbox, "main_hbox" );
|
|
gtk_widget_show( main_hbox );
|
|
gtk_container_add( GTK_CONTAINER( main_window ), main_hbox );
|
|
gtk_widget_set_size_request( main_hbox, 310, 320 );
|
|
gtk_window_resize( GTK_WINDOW( main_window ), 310, 640 );
|
|
|
|
vbox1 = gtk_vbox_new( FALSE, 0 );
|
|
gtk_widget_set_name( vbox1, "vbox1" );
|
|
gtk_widget_show( vbox1 );
|
|
gtk_box_pack_start( GTK_BOX( main_hbox ), vbox1, TRUE, TRUE, 0 );
|
|
gtk_container_set_border_width( GTK_CONTAINER( vbox1 ), 3 );
|
|
|
|
hbox1 = gtk_hbox_new( FALSE, 0 );
|
|
gtk_widget_set_name( hbox1, "hbox1" );
|
|
gtk_widget_show( hbox1 );
|
|
gtk_box_pack_start( GTK_BOX( vbox1 ), hbox1, TRUE, TRUE, 0 );
|
|
|
|
frame2 = gtk_frame_new( NULL );
|
|
gtk_widget_set_name( frame2, "frame2" );
|
|
gtk_widget_show( frame2 );
|
|
gtk_box_pack_start( GTK_BOX( hbox1 ), frame2, TRUE, TRUE, 0 );
|
|
gtk_frame_set_shadow_type( GTK_FRAME( frame2 ), GTK_SHADOW_NONE );
|
|
|
|
alignment3 = gtk_alignment_new( 0.5, 0.5, 1, 1 );
|
|
gtk_widget_set_name( alignment3, "alignment3" );
|
|
gtk_widget_show( alignment3 );
|
|
gtk_container_add( GTK_CONTAINER( frame2 ), alignment3 );
|
|
gtk_alignment_set_padding( GTK_ALIGNMENT( alignment3 ), 0, 0, 12, 0 );
|
|
|
|
scrolledwindow3 = gtk_scrolled_window_new( NULL, NULL );
|
|
gtk_widget_set_name( scrolledwindow3, "scrolledwindow3" );
|
|
gtk_widget_show( scrolledwindow3 );
|
|
gtk_container_add( GTK_CONTAINER( alignment3 ), scrolledwindow3 );
|
|
gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scrolledwindow3 ), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
|
|
gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW( scrolledwindow3 ), GTK_SHADOW_IN );
|
|
|
|
main_themelist = gtk_tree_view_new();
|
|
gtk_widget_set_name( main_themelist, "main_themelist" );
|
|
gtk_widget_show( main_themelist );
|
|
gtk_container_add( GTK_CONTAINER( scrolledwindow3 ), main_themelist );
|
|
gtk_widget_set_can_default( main_themelist, TRUE );
|
|
gtk_tree_view_set_headers_visible( GTK_TREE_VIEW( main_themelist ), FALSE );
|
|
|
|
label1234 = gtk_label_new( "<b>Theme</b>" );
|
|
gtk_widget_set_name( label1234, "label1234" );
|
|
gtk_widget_show( label1234 );
|
|
gtk_frame_set_label_widget( GTK_FRAME( frame2 ), label1234 );
|
|
gtk_label_set_use_markup( GTK_LABEL( label1234 ), TRUE );
|
|
|
|
frame3 = gtk_frame_new( NULL );
|
|
gtk_widget_set_name( frame3, "frame3" );
|
|
gtk_widget_show( frame3 );
|
|
gtk_box_pack_start( GTK_BOX( vbox1 ), frame3, FALSE, FALSE, 9 );
|
|
gtk_frame_set_shadow_type( GTK_FRAME( frame3 ), GTK_SHADOW_NONE );
|
|
|
|
alignment4 = gtk_alignment_new( 0.5, 0.5, 1, 1 );
|
|
gtk_widget_set_name( alignment4, "alignment4" );
|
|
gtk_widget_show( alignment4 );
|
|
gtk_container_add( GTK_CONTAINER( frame3 ), alignment4 );
|
|
gtk_alignment_set_padding( GTK_ALIGNMENT( alignment4 ), 0, 0, 12, 0 );
|
|
|
|
vbox7 = gtk_vbox_new( FALSE, 0 );
|
|
gtk_widget_set_name( vbox7, "vbox7" );
|
|
gtk_widget_show( vbox7 );
|
|
gtk_container_add( GTK_CONTAINER( alignment4 ), vbox7 );
|
|
|
|
hbox8 = gtk_hbox_new( FALSE, 0 );
|
|
gtk_widget_set_name( hbox8, "hbox8" );
|
|
gtk_widget_show( hbox8 );
|
|
gtk_box_pack_start( GTK_BOX( vbox7 ), hbox8, FALSE, FALSE, 0 );
|
|
|
|
vbox9 = gtk_vbox_new( FALSE, 0 );
|
|
gtk_widget_set_name( vbox9, "vbox9" );
|
|
gtk_widget_show( vbox9 );
|
|
gtk_box_pack_start( GTK_BOX( hbox8 ), vbox9, TRUE, TRUE, 0 );
|
|
|
|
main_use_default_font_radio = gtk_radio_button_new_with_label_from_widget( NULL, "Use theme default font" );
|
|
gtk_widget_set_name( main_use_default_font_radio, "main_use_default_font_radio" );
|
|
gtk_widget_show( main_use_default_font_radio );
|
|
gtk_box_pack_start( GTK_BOX( vbox9 ), main_use_default_font_radio, FALSE, FALSE, 0 );
|
|
|
|
main_use_custom_font_radio = gtk_radio_button_new_with_label_from_widget( GTK_RADIO_BUTTON( main_use_default_font_radio ), "Use custom font:" );
|
|
gtk_widget_set_name( main_use_custom_font_radio, "main_use_custom_font_radio" );
|
|
gtk_widget_show( main_use_custom_font_radio );
|
|
gtk_box_pack_start( GTK_BOX( vbox9 ), main_use_custom_font_radio, FALSE, FALSE, 0 );
|
|
gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( main_use_custom_font_radio ), TRUE );
|
|
//gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( main_use_custom_font_radio ), FALSE );
|
|
|
|
alignment5 = gtk_alignment_new( 0.5, 0.5, 1, 1 );
|
|
gtk_widget_set_name( alignment5, "alignment5" );
|
|
gtk_widget_show( alignment5 );
|
|
gtk_box_pack_start( GTK_BOX( vbox9 ), alignment5, TRUE, TRUE, 0 );
|
|
gtk_alignment_set_padding( GTK_ALIGNMENT( alignment5 ), 0, 0, 12, 0 );
|
|
|
|
vbox10 = gtk_vbox_new( FALSE, 0 );
|
|
gtk_widget_set_name( vbox10, "vbox10" );
|
|
gtk_widget_show( vbox10 );
|
|
gtk_container_add( GTK_CONTAINER( alignment5 ), vbox10 );
|
|
|
|
hbox9 = gtk_hbox_new( FALSE, 0 );
|
|
gtk_widget_set_name( hbox9, "hbox9" );
|
|
gtk_widget_show( hbox9 );
|
|
gtk_box_pack_start( GTK_BOX( vbox10 ), hbox9, FALSE, FALSE, 0 );
|
|
|
|
vbox11 = gtk_vbox_new( FALSE, 0 );
|
|
gtk_widget_set_name( vbox11, "vbox11" );
|
|
gtk_widget_show( vbox11 );
|
|
gtk_box_pack_start( GTK_BOX( hbox9 ), vbox11, TRUE, TRUE, 0 );
|
|
|
|
main_font_selector_button = gtk_font_button_new();
|
|
gtk_widget_set_name( main_font_selector_button, "main_font_selector_button" );
|
|
gtk_widget_show( main_font_selector_button );
|
|
gtk_box_pack_start( GTK_BOX( vbox11 ), main_font_selector_button, FALSE, FALSE, 0 );
|
|
|
|
label669 = gtk_label_new( "<b>Font</b>" );
|
|
gtk_widget_set_name( label669, "label669" );
|
|
gtk_widget_show( label669 );
|
|
gtk_frame_set_label_widget( GTK_FRAME( frame3 ), label669 );
|
|
gtk_label_set_use_markup( GTK_LABEL( label669 ), TRUE );
|
|
|
|
vbox13 = gtk_vbox_new( FALSE, 0 );
|
|
gtk_widget_set_name( vbox13, "vbox13" );
|
|
gtk_widget_show( vbox13 );
|
|
gtk_box_pack_start( GTK_BOX( vbox1 ), vbox13, FALSE, FALSE, 0 );
|
|
|
|
hbuttonbox1 = gtk_hbutton_box_new();
|
|
gtk_widget_set_name( hbuttonbox1, "hbuttonbox1" );
|
|
gtk_widget_show( hbuttonbox1 );
|
|
gtk_box_pack_start( GTK_BOX( vbox1 ), hbuttonbox1, FALSE, FALSE, 0 );
|
|
|
|
hbox7 = gtk_hbox_new( FALSE, 0 );
|
|
gtk_widget_set_name( hbox7, "hbox7" );
|
|
gtk_widget_show( hbox7 );
|
|
gtk_box_pack_start( GTK_BOX( vbox1 ), hbox7, FALSE, TRUE, 6 );
|
|
|
|
vbox6 = gtk_vbox_new( FALSE, 0 );
|
|
gtk_widget_set_name( vbox6, "vbox6" );
|
|
gtk_widget_show( vbox6 );
|
|
gtk_box_pack_start( GTK_BOX( vbox1 ), vbox6, FALSE, FALSE, 0 );
|
|
|
|
hbox5 = gtk_hbox_new( TRUE, 0 );
|
|
gtk_widget_set_name( hbox5, "hbox5" );
|
|
gtk_widget_show( hbox5 );
|
|
gtk_box_pack_start( GTK_BOX( vbox6 ), hbox5, FALSE, FALSE, 0 );
|
|
gtk_container_set_border_width( GTK_CONTAINER( hbox5 ), 4 );
|
|
|
|
main_ok_button = gtk_button_new_from_stock( "gtk-ok" );
|
|
gtk_widget_set_name( main_ok_button, "main_ok_button" );
|
|
gtk_widget_show( main_ok_button );
|
|
gtk_box_pack_end( GTK_BOX( hbox5 ), main_ok_button, TRUE, TRUE, 4 );
|
|
gtk_widget_set_can_default( main_ok_button, TRUE );
|
|
|
|
main_cancel_button = gtk_button_new_from_stock( "gtk-cancel" );
|
|
gtk_widget_set_name( main_cancel_button, "main_cancel_button" );
|
|
gtk_widget_show( main_cancel_button );
|
|
gtk_box_pack_end( GTK_BOX( hbox5 ), main_cancel_button, TRUE, TRUE, 4 );
|
|
gtk_widget_set_can_default( main_cancel_button, TRUE );
|
|
|
|
main_reset_button = gtk_button_new();
|
|
gtk_widget_set_name( main_reset_button, "main_reset_button" );
|
|
gtk_widget_show( main_reset_button );
|
|
gtk_box_pack_end( GTK_BOX( hbox5 ), main_reset_button, TRUE, TRUE, 4 );
|
|
|
|
alignment2 = gtk_alignment_new( 0.5, 0.5, 0, 0 );
|
|
gtk_widget_set_name( alignment2, "alignment2" );
|
|
gtk_widget_show( alignment2 );
|
|
gtk_container_add( GTK_CONTAINER( main_reset_button ), alignment2 );
|
|
|
|
hbox6 = gtk_hbox_new( FALSE, 2 );
|
|
gtk_widget_set_name( hbox6, "hbox6" );
|
|
gtk_widget_show( hbox6 );
|
|
gtk_container_add( GTK_CONTAINER( alignment2 ), hbox6 );
|
|
|
|
image1 = gtk_image_new_from_stock( "gtk-revert-to-saved", GTK_ICON_SIZE_BUTTON );
|
|
gtk_widget_set_name( image1, "image1" );
|
|
gtk_widget_show( image1 );
|
|
gtk_box_pack_start( GTK_BOX( hbox6 ), image1, FALSE, FALSE, 0 );
|
|
|
|
label667 = gtk_label_new_with_mnemonic( "_Reset" );
|
|
gtk_widget_set_name( label667, "label667" );
|
|
gtk_widget_show( label667 );
|
|
gtk_box_pack_start( GTK_BOX( hbox6 ), label667, FALSE, FALSE, 0 );
|
|
|
|
|
|
g_signal_connect( (gpointer)main_window, "delete_event",
|
|
G_CALLBACK( on_main_window_delete_event ),
|
|
NULL );
|
|
g_signal_connect( (gpointer)main_use_default_font_radio, "toggled",
|
|
G_CALLBACK( on_main_use_default_font_radio_toggled ),
|
|
NULL );
|
|
g_signal_connect( (gpointer)main_font_selector_button, "font_set",
|
|
G_CALLBACK( on_main_font_selector_button_font_set ),
|
|
NULL );
|
|
g_signal_connect( (gpointer)main_cancel_button, "clicked",
|
|
G_CALLBACK( on_main_cancel_button_clicked ),
|
|
NULL );
|
|
g_signal_connect( (gpointer)main_reset_button, "clicked",
|
|
G_CALLBACK( on_main_reset_button_clicked ),
|
|
NULL );
|
|
g_signal_connect( (gpointer)main_ok_button, "clicked",
|
|
G_CALLBACK( on_main_ok_button_clicked ),
|
|
NULL );
|
|
|
|
/* Store pointers to all widgets, for use by lookup_widget(). */
|
|
GLADE_HOOKUP_OBJECT_NO_REF( main_window, main_window, "main_window" );
|
|
GLADE_HOOKUP_OBJECT( main_window, main_hbox, "main_hbox" );
|
|
GLADE_HOOKUP_OBJECT( main_window, vbox1, "vbox1" );
|
|
GLADE_HOOKUP_OBJECT( main_window, hbox1, "hbox1" );
|
|
GLADE_HOOKUP_OBJECT( main_window, frame2, "frame2" );
|
|
GLADE_HOOKUP_OBJECT( main_window, alignment3, "alignment3" );
|
|
GLADE_HOOKUP_OBJECT( main_window, scrolledwindow3, "scrolledwindow3" );
|
|
GLADE_HOOKUP_OBJECT( main_window, main_themelist, "main_themelist" );
|
|
GLADE_HOOKUP_OBJECT( main_window, label1234, "label1234" );
|
|
GLADE_HOOKUP_OBJECT( main_window, frame3, "frame3" );
|
|
GLADE_HOOKUP_OBJECT( main_window, alignment4, "alignment4" );
|
|
GLADE_HOOKUP_OBJECT( main_window, vbox7, "vbox7" );
|
|
GLADE_HOOKUP_OBJECT( main_window, hbox8, "hbox8" );
|
|
GLADE_HOOKUP_OBJECT( main_window, vbox9, "vbox9" );
|
|
GLADE_HOOKUP_OBJECT( main_window, main_use_default_font_radio, "main_use_default_font_radio" );
|
|
GLADE_HOOKUP_OBJECT( main_window, main_use_custom_font_radio, "main_use_custom_font_radio" );
|
|
GLADE_HOOKUP_OBJECT( main_window, alignment5, "alignment5" );
|
|
GLADE_HOOKUP_OBJECT( main_window, vbox10, "vbox10" );
|
|
GLADE_HOOKUP_OBJECT( main_window, hbox9, "hbox9" );
|
|
GLADE_HOOKUP_OBJECT( main_window, vbox11, "vbox11" );
|
|
GLADE_HOOKUP_OBJECT( main_window, main_font_selector_button, "main_font_selector_button" );
|
|
GLADE_HOOKUP_OBJECT( main_window, label669, "label669" );
|
|
GLADE_HOOKUP_OBJECT( main_window, vbox13, "vbox13" );
|
|
GLADE_HOOKUP_OBJECT( main_window, hbuttonbox1, "hbuttonbox1" );
|
|
GLADE_HOOKUP_OBJECT( main_window, hbox7, "hbox7" );
|
|
GLADE_HOOKUP_OBJECT( main_window, vbox6, "vbox6" );
|
|
GLADE_HOOKUP_OBJECT( main_window, hbox5, "hbox5" );
|
|
GLADE_HOOKUP_OBJECT( main_window, main_ok_button, "main_ok_button" );
|
|
GLADE_HOOKUP_OBJECT( main_window, main_cancel_button, "main_cancel_button" );
|
|
GLADE_HOOKUP_OBJECT( main_window, main_reset_button, "main_reset_button" );
|
|
GLADE_HOOKUP_OBJECT( main_window, alignment2, "alignment2" );
|
|
GLADE_HOOKUP_OBJECT( main_window, hbox6, "hbox6" );
|
|
GLADE_HOOKUP_OBJECT( main_window, image1, "image1" );
|
|
GLADE_HOOKUP_OBJECT( main_window, label667, "label667" );
|
|
|
|
gtk_widget_grab_default( main_themelist );
|
|
gtk_window_add_accel_group( GTK_WINDOW( main_window ), accel_group );
|
|
|
|
return main_window;
|
|
}
|
|
|
|
|
|
|
|
static std::string gchar_to_string( gchar* gstr ) {
|
|
std::string str = ( gstr ? gstr : "" );
|
|
g_free( gstr );
|
|
return str;
|
|
}
|
|
|
|
|
|
// ------------------------------------------------------
|
|
static std::string s_orig_theme;
|
|
static std::string s_orig_font;
|
|
|
|
std::string& get_orig_theme() {
|
|
return s_orig_theme;
|
|
}
|
|
|
|
std::string& get_orig_font() {
|
|
return s_orig_font;
|
|
}
|
|
|
|
|
|
// ------------------------------------------------------
|
|
std::string get_current_theme() {
|
|
GtkSettings* settings = gtk_settings_get_default();
|
|
gchar* theme;
|
|
g_object_get( settings, "gtk-theme-name", &theme, NULL );
|
|
|
|
/* dummy check */
|
|
if( !g_ascii_isalnum( theme[0] ) ) {
|
|
g_free( theme );
|
|
return "";
|
|
}
|
|
return gchar_to_string( theme );
|
|
}
|
|
|
|
std::string get_current_font() {
|
|
return gchar_to_string( pango_font_description_to_string( gtk_rc_get_style( g_main_rc_window )->font_desc ) );
|
|
}
|
|
|
|
|
|
// ------------------------------------------------------
|
|
std::string get_selected_theme() {
|
|
GtkTreeView* treeview = GTK_TREE_VIEW( lookup_widget( g_main_rc_window, "main_themelist" ) );
|
|
GtkTreeModel* model = gtk_tree_view_get_model( treeview );
|
|
GtkTreeSelection* selection = gtk_tree_view_get_selection( treeview );
|
|
|
|
GtkTreeIter iter;
|
|
gtk_tree_selection_get_selected( selection, 0, &iter );
|
|
|
|
gchar* theme_name;
|
|
gtk_tree_model_get( model, &iter, 0, &theme_name, -1 );
|
|
// std::cout << theme_name << "\n";
|
|
return gchar_to_string( theme_name );
|
|
}
|
|
|
|
std::string get_selected_font() {
|
|
// GtkWidget* fontentry = lookup_widget( g_main_rc_window, "main_fontentry" );
|
|
// return gtk_entry_get_text( GTK_ENTRY( fontentry ) );
|
|
|
|
const bool default_font = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( lookup_widget( g_main_rc_window, "main_use_default_font_radio" ) ) );
|
|
if( default_font )
|
|
return "";
|
|
|
|
GtkWidget* fontbutton = lookup_widget( g_main_rc_window, "main_font_selector_button" );
|
|
return gtk_font_button_get_font_name( GTK_FONT_BUTTON( fontbutton ) );
|
|
}
|
|
|
|
|
|
// ------------------------------------------------------
|
|
static void themelist_selection_changed_cb( GtkTreeSelection* selection, gpointer data ) {
|
|
if( gtk_tree_selection_get_selected( selection, 0, 0 ) )
|
|
apply_theme( get_selected_theme(), get_current_font() );
|
|
}
|
|
|
|
|
|
// ------------------------------------------------------
|
|
static void populate_with_themes( GtkWidget* w ) {
|
|
std::string search_path = gchar_to_string( gtk_rc_get_theme_dir() );
|
|
|
|
if( search_path.size() && search_path[search_path.size() - 1] != G_DIR_SEPARATOR )
|
|
search_path += G_DIR_SEPARATOR_S;
|
|
|
|
GDir* gdir = g_dir_open( search_path.c_str(), 0, NULL );
|
|
if( gdir == NULL )
|
|
return;
|
|
|
|
char* name;
|
|
GList* glist = 0;
|
|
|
|
while( ( name = const_cast<char*>( g_dir_read_name( gdir ) ) ) != NULL ) {
|
|
std::string filename = name;
|
|
|
|
// if ( g_ascii_strup( fname.c_str(), -1 ) == "Default" )
|
|
// continue;
|
|
|
|
std::string fullname = search_path + filename;
|
|
std::string rc = fullname;
|
|
rc += G_DIR_SEPARATOR_S;
|
|
rc += "gtk-2.0";
|
|
rc += G_DIR_SEPARATOR_S;
|
|
rc += "gtkrc";
|
|
|
|
bool is_dir = 0;
|
|
if( g_file_test( fullname.c_str(), G_FILE_TEST_IS_DIR ) )
|
|
is_dir = 1;
|
|
|
|
if( is_dir && g_file_test( rc.c_str(), G_FILE_TEST_IS_REGULAR ) ) {
|
|
glist = g_list_insert_sorted( glist, g_strdup( filename.c_str() ), ( GCompareFunc )strcmp );
|
|
}
|
|
}
|
|
|
|
g_dir_close( gdir );
|
|
|
|
// ---------------- tree
|
|
GtkTreeView* treeview = GTK_TREE_VIEW( w );
|
|
GtkListStore* store = gtk_list_store_new( 1, G_TYPE_STRING );
|
|
gtk_tree_view_set_model( treeview, GTK_TREE_MODEL( store ) );
|
|
|
|
GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes(
|
|
"Theme", gtk_cell_renderer_text_new(),
|
|
"text", 0,
|
|
NULL );
|
|
gtk_tree_view_column_set_sizing( column, GTK_TREE_VIEW_COLUMN_GROW_ONLY );
|
|
gtk_tree_view_append_column( GTK_TREE_VIEW( treeview ), column );
|
|
|
|
GtkTreeIter iter;
|
|
int i = 0, curr = 0;
|
|
while( char* theme = (char*)g_list_nth_data( glist, i ) ) {
|
|
gtk_list_store_append( store, &iter );
|
|
gtk_list_store_set( store, &iter, 0, theme, -1 );
|
|
|
|
if( strcmp( theme, get_current_theme().c_str() ) == 0 ) {
|
|
curr = i;
|
|
}
|
|
++i;
|
|
}
|
|
|
|
GtkTreeSelection* selection = gtk_tree_view_get_selection( GTK_TREE_VIEW( treeview ) );
|
|
|
|
// set the default theme
|
|
|
|
// THIS IS IMPORTANT!!!
|
|
gtk_widget_grab_focus( w );
|
|
|
|
std::stringstream str;
|
|
str << curr;
|
|
GtkTreePath* selpath = gtk_tree_path_new_from_string( str.str().c_str() );
|
|
if( selpath ) {
|
|
gtk_tree_selection_select_path( selection, selpath );
|
|
gtk_tree_view_scroll_to_cell( treeview, selpath, NULL, true, 0.5, 0.0 );
|
|
gtk_tree_path_free( selpath );
|
|
}
|
|
|
|
g_signal_connect( G_OBJECT( selection ), "changed",
|
|
G_CALLBACK( themelist_selection_changed_cb ), NULL );
|
|
|
|
g_object_unref( G_OBJECT( store ) );
|
|
|
|
// ---------------- font
|
|
GtkWidget* fontbutton = lookup_widget( g_main_rc_window, "main_font_selector_button" );
|
|
gtk_font_button_set_font_name( GTK_FONT_BUTTON( fontbutton ), get_current_font().c_str() );
|
|
}
|
|
|
|
|
|
// ------------------------------------------------------
|
|
void gtkThemeDlg() {
|
|
if( g_main_rc_window )
|
|
return;
|
|
|
|
s_rc_file = std::string( AppPath_get() ) + G_DIR_SEPARATOR_S + ".gtkrc-2.0.radiant";
|
|
|
|
g_main_rc_window = create_rc_window();
|
|
|
|
populate_with_themes( lookup_widget( g_main_rc_window, "main_themelist" ) );
|
|
|
|
get_orig_theme() = get_current_theme();
|
|
get_orig_font() = get_current_font();
|
|
|
|
gtk_widget_show( g_main_rc_window );
|
|
}
|
|
|
|
|
|
// -------------------------------
|
|
void set_theme( const std::string& theme_name, const std::string& font ) {
|
|
if( theme_name.empty() )
|
|
return;
|
|
|
|
// tree
|
|
GtkTreeView* treeview = GTK_TREE_VIEW( lookup_widget( g_main_rc_window, "main_themelist" ) );
|
|
GtkTreeModel* model = gtk_tree_view_get_model( treeview );
|
|
GtkTreeSelection* selection = gtk_tree_view_get_selection( treeview );
|
|
|
|
GtkTreeIter iter;
|
|
gtk_tree_model_get_iter_first( model, &iter );
|
|
|
|
while( gtk_tree_model_iter_next( model, &iter ) ) {
|
|
gchar* text;
|
|
gtk_tree_model_get( model, &iter, 0, &text, -1 );
|
|
std::string theme = gchar_to_string( text );
|
|
|
|
if( theme_name == theme ) {
|
|
gtk_tree_selection_select_iter( selection, &iter );
|
|
break;
|
|
}
|
|
}
|
|
|
|
// font
|
|
if( font != "" ) {
|
|
GtkWidget* fontbutton = lookup_widget( g_main_rc_window, "main_font_selector_button" );
|
|
//gtk_font_button_set_font_name( GTK_FONT_BUTTON( fontbutton ), get_current_font().c_str() );
|
|
gtk_font_button_set_font_name( GTK_FONT_BUTTON( fontbutton ), font.c_str() );
|
|
}
|
|
|
|
apply_theme( get_selected_theme(), get_selected_font() );
|
|
}
|
|
|
|
void apply_theme( const std::string& theme_name, const std::string& font ) {
|
|
std::stringstream strstr;
|
|
strstr << "gtk-theme-name = \"" << theme_name << "\"\n";
|
|
|
|
if( font != "" )
|
|
strstr << "style \"user-font\"\n{\nfont_name=\"" << font << "\"\n}\nwidget_class \"*\" style \"user-font\"";
|
|
|
|
//strstr << "\ngtk-menu-popup-delay = 10";
|
|
|
|
// std::cout << strstr.str() << "\n\n\n";
|
|
std::fstream f;
|
|
f.open( s_rc_file.c_str(), std::ios::out );
|
|
f << strstr.str();
|
|
f.close();
|
|
|
|
GtkSettings* settings = gtk_settings_get_default();
|
|
|
|
gtk_rc_reparse_all_for_settings( settings, true );
|
|
// gtk_rc_parse_string( strstr.str().c_str() );
|
|
// gtk_rc_parse( "/root/.gtk-tmp" );
|
|
// gtk_rc_reset_styles( settings );
|
|
|
|
//unlink(s_rc_file.c_str());
|
|
|
|
while( gtk_events_pending() )
|
|
gtk_main_iteration();
|
|
}
|