/*************************************************************************** main.cpp - description ------------------- begin : Wed Jan 1 19:06:46 GMT+4 2003 copyright : (C) 2003 - 2005 by Alex Shaduri email : ashaduri '@' gmail.com ***************************************************************************/ #define GARUX_DISABLE_GTKTHEME #ifndef GARUX_DISABLE_GTKTHEME #include #include #include #include #include #ifdef _WIN32 #include #else #include #endif #include #include #include #include #include #include "gtktheme.h" #include "mainframe.h" //#include "gtkutil/window.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 = widget->parent; 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 ){ 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, \ gtk_widget_ref (widget), (GDestroyNotify) gtk_widget_unref) #define GLADE_HOOKUP_OBJECT_NO_REF(component,widget,name) \ g_object_set_data (G_OBJECT (component), name, widget) GtkWidget* create_rc_window (void) { 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; GSList *main_use_default_font_radio_group = NULL; 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; GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); 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_FLAGS (main_themelist, GTK_CAN_DEFAULT); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (main_themelist), FALSE); label1234 = gtk_label_new ("Theme"); 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_mnemonic (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); gtk_radio_button_set_group (GTK_RADIO_BUTTON (main_use_default_font_radio), main_use_default_font_radio_group); main_use_default_font_radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (main_use_default_font_radio)); main_use_custom_font_radio = gtk_radio_button_new_with_mnemonic (NULL, "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_radio_button_set_group (GTK_RADIO_BUTTON (main_use_custom_font_radio), main_use_default_font_radio_group); main_use_default_font_radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (main_use_custom_font_radio)); 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 ("Font"); 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_FLAGS (main_ok_button, GTK_CAN_DEFAULT); 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_FLAGS (main_cancel_button, GTK_CAN_DEFAULT); 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"); GLADE_HOOKUP_OBJECT_NO_REF (main_window, tooltips, "tooltips"); 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)); 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(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(); } #endif // GARUX_DISABLE_GTKTHEME