]> git.xonotic.org Git - xonotic/netradiant.git/blob - radiant/gtktheme.cpp
radiant: some comments from NRC
[xonotic/netradiant.git] / radiant / gtktheme.cpp
1 /***************************************************************************
2                           main.cpp  -  description
3                              -------------------
4     begin                : Wed Jan  1 19:06:46 GMT+4 2003
5     copyright            : (C) 2003 - 2005 by Alex Shaduri
6     email                : ashaduri '@' gmail.com
7  ***************************************************************************/
8
9 #define GARUX_DISABLE_GTKTHEME
10 #ifndef GARUX_DISABLE_GTKTHEME
11
12 #include <iostream>
13 #include <fstream>
14 #include <stdlib.h>
15 #include <sstream>
16 #include <gtk/gtk.h>
17
18 #ifdef _WIN32
19 #include <io.h>
20 #else
21 #include <sys/stat.h>
22 #endif
23
24 #include <unistd.h>
25
26
27 #include <sys/types.h>
28 #include <string.h>
29 #include <stdio.h>
30 #include <gdk/gdkkeysyms.h>
31
32
33 #include "gtktheme.h"
34 #include "mainframe.h"
35 //#include "gtkutil/window.h"
36
37 // ------------------------------------------------------
38
39
40 std::string& get_orig_theme();
41 std::string& get_orig_font();
42
43 std::string get_current_theme();
44 std::string get_current_font();
45
46 std::string get_selected_theme();
47 std::string get_selected_font();
48
49 void set_theme(const std::string& theme_name, const std::string& font);
50 void apply_theme(const std::string& theme_name, const std::string& font);
51
52
53
54 GtkWidget* g_main_rc_window = NULL;
55
56
57 static std::string s_rc_file;
58
59
60
61 // ------------------------------------------------------
62
63
64
65 GtkWidget* lookup_widget (GtkWidget *widget, const gchar *widget_name){
66     GtkWidget *parent, *found_widget;
67
68     for (;;)
69     {
70         if (GTK_IS_MENU (widget))
71             parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
72         else
73             parent = widget->parent;
74         if (!parent)
75             parent = (GtkWidget*)g_object_get_data (G_OBJECT (widget), "GladeParentKey");
76         if (parent == NULL)
77             break;
78         widget = parent;
79     }
80
81     found_widget = (GtkWidget*) g_object_get_data (G_OBJECT (widget),
82                    widget_name);
83     if (!found_widget)
84         g_warning ("Widget not found: %s", widget_name);
85     return found_widget;
86 }
87
88
89
90
91
92
93 void on_main_cancel_button_clicked( GtkButton *button, gpointer user_data ){
94         set_theme( get_orig_theme(), get_orig_font() );
95         gtk_widget_destroy( g_main_rc_window );
96         g_main_rc_window = NULL;
97 }
98
99
100 void on_main_reset_button_clicked( GtkButton *button, gpointer user_data ){
101         set_theme( get_orig_theme(), get_orig_font() );
102 }
103
104
105 gboolean on_main_window_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data ){
106         set_theme( get_orig_theme(), get_orig_font() );
107         gtk_widget_destroy( g_main_rc_window );
108         g_main_rc_window = NULL;
109         return TRUE;
110 }
111
112
113 void on_main_use_default_font_radio_toggled ( GtkToggleButton *togglebutton, gpointer user_data ){
114         bool default_font = gtk_toggle_button_get_active( togglebutton );
115
116         gtk_widget_set_sensitive( lookup_widget( g_main_rc_window, "main_font_selector_button" ), !default_font );
117
118         apply_theme( get_selected_theme(), get_selected_font() );
119 }
120
121
122 void on_main_font_selector_button_font_set( GtkFontButton *fontbutton, gpointer user_data ){
123         apply_theme( get_selected_theme(), get_selected_font() );
124 }
125
126 void on_main_ok_button_clicked( GtkButton *button, gpointer user_data ){
127         gtk_widget_destroy( g_main_rc_window );
128         g_main_rc_window = NULL;
129 }
130
131
132
133 #define GLADE_HOOKUP_OBJECT(component,widget,name) \
134   g_object_set_data_full (G_OBJECT (component), name, \
135     gtk_widget_ref (widget), (GDestroyNotify) gtk_widget_unref)
136
137 #define GLADE_HOOKUP_OBJECT_NO_REF(component,widget,name) \
138   g_object_set_data (G_OBJECT (component), name, widget)
139
140 GtkWidget*
141 create_rc_window (void)
142 {
143   GtkWidget *main_window;
144   GtkWidget *main_hbox;
145   GtkWidget *vbox1;
146   GtkWidget *hbox1;
147   GtkWidget *frame2;
148   GtkWidget *alignment3;
149   GtkWidget *scrolledwindow3;
150   GtkWidget *main_themelist;
151   GtkWidget *label1234;
152   GtkWidget *frame3;
153   GtkWidget *alignment4;
154   GtkWidget *vbox7;
155   GtkWidget *hbox8;
156   GtkWidget *vbox9;
157   GtkWidget *main_use_default_font_radio;
158   GSList *main_use_default_font_radio_group = NULL;
159   GtkWidget *main_use_custom_font_radio;
160   GtkWidget *alignment5;
161   GtkWidget *vbox10;
162   GtkWidget *hbox9;
163   GtkWidget *vbox11;
164   GtkWidget *main_font_selector_button;
165   GtkWidget *label669;
166   GtkWidget *vbox13;
167   GtkWidget *hbuttonbox1;
168   GtkWidget *hbox7;
169   GtkWidget *vbox6;
170   GtkWidget *hbox5;
171   GtkWidget *main_ok_button;
172   GtkWidget *main_cancel_button;
173   GtkWidget *main_reset_button;
174   GtkWidget *alignment2;
175   GtkWidget *hbox6;
176   GtkWidget *image1;
177   GtkWidget *label667;
178   GtkAccelGroup *accel_group;
179   GtkTooltips *tooltips;
180
181   tooltips = gtk_tooltips_new ();
182
183   accel_group = gtk_accel_group_new ();
184
185   main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
186   gtk_widget_set_name (main_window, "main_window");
187   gtk_window_set_title (GTK_WINDOW (main_window), "Gtk2 Theme Selector");
188   gtk_window_set_transient_for( GTK_WINDOW (main_window), MainFrame_getWindow() );
189   gtk_window_set_destroy_with_parent( GTK_WINDOW (main_window), TRUE );
190
191   //gtk_window_set_keep_above ( GTK_WINDOW( main_window ), TRUE );
192
193   main_hbox = gtk_hbox_new (FALSE, 0);
194   gtk_widget_set_name (main_hbox, "main_hbox");
195   gtk_widget_show (main_hbox);
196   gtk_container_add (GTK_CONTAINER (main_window), main_hbox);
197   gtk_widget_set_size_request (main_hbox, 310, 320);
198   gtk_window_resize(GTK_WINDOW(main_window), 310, 640);
199
200   vbox1 = gtk_vbox_new (FALSE, 0);
201   gtk_widget_set_name (vbox1, "vbox1");
202   gtk_widget_show (vbox1);
203   gtk_box_pack_start (GTK_BOX (main_hbox), vbox1, TRUE, TRUE, 0);
204   gtk_container_set_border_width (GTK_CONTAINER (vbox1), 3);
205
206   hbox1 = gtk_hbox_new (FALSE, 0);
207   gtk_widget_set_name (hbox1, "hbox1");
208   gtk_widget_show (hbox1);
209   gtk_box_pack_start (GTK_BOX (vbox1), hbox1, TRUE, TRUE, 0);
210
211   frame2 = gtk_frame_new (NULL);
212   gtk_widget_set_name (frame2, "frame2");
213   gtk_widget_show (frame2);
214   gtk_box_pack_start (GTK_BOX (hbox1), frame2, TRUE, TRUE, 0);
215   gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_NONE);
216
217   alignment3 = gtk_alignment_new (0.5, 0.5, 1, 1);
218   gtk_widget_set_name (alignment3, "alignment3");
219   gtk_widget_show (alignment3);
220   gtk_container_add (GTK_CONTAINER (frame2), alignment3);
221   gtk_alignment_set_padding (GTK_ALIGNMENT (alignment3), 0, 0, 12, 0);
222
223   scrolledwindow3 = gtk_scrolled_window_new (NULL, NULL);
224   gtk_widget_set_name (scrolledwindow3, "scrolledwindow3");
225   gtk_widget_show (scrolledwindow3);
226   gtk_container_add (GTK_CONTAINER (alignment3), scrolledwindow3);
227   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow3), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
228   gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow3), GTK_SHADOW_IN);
229
230   main_themelist = gtk_tree_view_new ();
231   gtk_widget_set_name (main_themelist, "main_themelist");
232   gtk_widget_show (main_themelist);
233   gtk_container_add (GTK_CONTAINER (scrolledwindow3), main_themelist);
234   GTK_WIDGET_SET_FLAGS (main_themelist, GTK_CAN_DEFAULT);
235   gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (main_themelist), FALSE);
236
237   label1234 = gtk_label_new ("<b>Theme</b>");
238   gtk_widget_set_name (label1234, "label1234");
239   gtk_widget_show (label1234);
240   gtk_frame_set_label_widget (GTK_FRAME (frame2), label1234);
241   gtk_label_set_use_markup (GTK_LABEL (label1234), TRUE);
242
243   frame3 = gtk_frame_new (NULL);
244   gtk_widget_set_name (frame3, "frame3");
245   gtk_widget_show (frame3);
246   gtk_box_pack_start (GTK_BOX (vbox1), frame3, FALSE, FALSE, 9);
247   gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_NONE);
248
249   alignment4 = gtk_alignment_new (0.5, 0.5, 1, 1);
250   gtk_widget_set_name (alignment4, "alignment4");
251   gtk_widget_show (alignment4);
252   gtk_container_add (GTK_CONTAINER (frame3), alignment4);
253   gtk_alignment_set_padding (GTK_ALIGNMENT (alignment4), 0, 0, 12, 0);
254
255   vbox7 = gtk_vbox_new (FALSE, 0);
256   gtk_widget_set_name (vbox7, "vbox7");
257   gtk_widget_show (vbox7);
258   gtk_container_add (GTK_CONTAINER (alignment4), vbox7);
259
260   hbox8 = gtk_hbox_new (FALSE, 0);
261   gtk_widget_set_name (hbox8, "hbox8");
262   gtk_widget_show (hbox8);
263   gtk_box_pack_start (GTK_BOX (vbox7), hbox8, FALSE, FALSE, 0);
264
265   vbox9 = gtk_vbox_new (FALSE, 0);
266   gtk_widget_set_name (vbox9, "vbox9");
267   gtk_widget_show (vbox9);
268   gtk_box_pack_start (GTK_BOX (hbox8), vbox9, TRUE, TRUE, 0);
269
270   main_use_default_font_radio = gtk_radio_button_new_with_mnemonic (NULL, "Use theme default font");
271   gtk_widget_set_name (main_use_default_font_radio, "main_use_default_font_radio");
272   gtk_widget_show (main_use_default_font_radio);
273   gtk_box_pack_start (GTK_BOX (vbox9), main_use_default_font_radio, FALSE, FALSE, 0);
274   gtk_radio_button_set_group (GTK_RADIO_BUTTON (main_use_default_font_radio), main_use_default_font_radio_group);
275   main_use_default_font_radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (main_use_default_font_radio));
276
277   main_use_custom_font_radio = gtk_radio_button_new_with_mnemonic (NULL, "Use custom font:");
278   gtk_widget_set_name (main_use_custom_font_radio, "main_use_custom_font_radio");
279   gtk_widget_show (main_use_custom_font_radio);
280   gtk_box_pack_start (GTK_BOX (vbox9), main_use_custom_font_radio, FALSE, FALSE, 0);
281   gtk_radio_button_set_group (GTK_RADIO_BUTTON (main_use_custom_font_radio), main_use_default_font_radio_group);
282   main_use_default_font_radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (main_use_custom_font_radio));
283   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (main_use_custom_font_radio), TRUE);
284   //gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (main_use_custom_font_radio), FALSE);
285
286   alignment5 = gtk_alignment_new (0.5, 0.5, 1, 1);
287   gtk_widget_set_name (alignment5, "alignment5");
288   gtk_widget_show (alignment5);
289   gtk_box_pack_start (GTK_BOX (vbox9), alignment5, TRUE, TRUE, 0);
290   gtk_alignment_set_padding (GTK_ALIGNMENT (alignment5), 0, 0, 12, 0);
291
292   vbox10 = gtk_vbox_new (FALSE, 0);
293   gtk_widget_set_name (vbox10, "vbox10");
294   gtk_widget_show (vbox10);
295   gtk_container_add (GTK_CONTAINER (alignment5), vbox10);
296
297   hbox9 = gtk_hbox_new (FALSE, 0);
298   gtk_widget_set_name (hbox9, "hbox9");
299   gtk_widget_show (hbox9);
300   gtk_box_pack_start (GTK_BOX (vbox10), hbox9, FALSE, FALSE, 0);
301
302   vbox11 = gtk_vbox_new (FALSE, 0);
303   gtk_widget_set_name (vbox11, "vbox11");
304   gtk_widget_show (vbox11);
305   gtk_box_pack_start (GTK_BOX (hbox9), vbox11, TRUE, TRUE, 0);
306
307   main_font_selector_button = gtk_font_button_new ();
308   gtk_widget_set_name (main_font_selector_button, "main_font_selector_button");
309   gtk_widget_show (main_font_selector_button);
310   gtk_box_pack_start (GTK_BOX (vbox11), main_font_selector_button, FALSE, FALSE, 0);
311
312   label669 = gtk_label_new ("<b>Font</b>");
313   gtk_widget_set_name (label669, "label669");
314   gtk_widget_show (label669);
315   gtk_frame_set_label_widget (GTK_FRAME (frame3), label669);
316   gtk_label_set_use_markup (GTK_LABEL (label669), TRUE);
317
318   vbox13 = gtk_vbox_new (FALSE, 0);
319   gtk_widget_set_name (vbox13, "vbox13");
320   gtk_widget_show (vbox13);
321   gtk_box_pack_start (GTK_BOX (vbox1), vbox13, FALSE, FALSE, 0);
322
323   hbuttonbox1 = gtk_hbutton_box_new ();
324   gtk_widget_set_name (hbuttonbox1, "hbuttonbox1");
325   gtk_widget_show (hbuttonbox1);
326   gtk_box_pack_start (GTK_BOX (vbox1), hbuttonbox1, FALSE, FALSE, 0);
327
328   hbox7 = gtk_hbox_new (FALSE, 0);
329   gtk_widget_set_name (hbox7, "hbox7");
330   gtk_widget_show (hbox7);
331   gtk_box_pack_start (GTK_BOX (vbox1), hbox7, FALSE, TRUE, 6);
332
333   vbox6 = gtk_vbox_new (FALSE, 0);
334   gtk_widget_set_name (vbox6, "vbox6");
335   gtk_widget_show (vbox6);
336   gtk_box_pack_start (GTK_BOX (vbox1), vbox6, FALSE, FALSE, 0);
337
338   hbox5 = gtk_hbox_new (TRUE, 0);
339   gtk_widget_set_name (hbox5, "hbox5");
340   gtk_widget_show (hbox5);
341   gtk_box_pack_start (GTK_BOX (vbox6), hbox5, FALSE, FALSE, 0);
342   gtk_container_set_border_width (GTK_CONTAINER (hbox5), 4);
343
344   main_ok_button = gtk_button_new_from_stock ("gtk-ok");
345   gtk_widget_set_name (main_ok_button, "main_ok_button");
346   gtk_widget_show (main_ok_button);
347   gtk_box_pack_end (GTK_BOX (hbox5), main_ok_button, TRUE, TRUE, 4);
348   GTK_WIDGET_SET_FLAGS (main_ok_button, GTK_CAN_DEFAULT);
349
350   main_cancel_button = gtk_button_new_from_stock ("gtk-cancel");
351   gtk_widget_set_name (main_cancel_button, "main_cancel_button");
352   gtk_widget_show (main_cancel_button);
353   gtk_box_pack_end (GTK_BOX (hbox5), main_cancel_button, TRUE, TRUE, 4);
354   GTK_WIDGET_SET_FLAGS (main_cancel_button, GTK_CAN_DEFAULT);
355
356   main_reset_button = gtk_button_new ();
357   gtk_widget_set_name (main_reset_button, "main_reset_button");
358   gtk_widget_show (main_reset_button);
359   gtk_box_pack_end (GTK_BOX (hbox5), main_reset_button, TRUE, TRUE, 4);
360
361   alignment2 = gtk_alignment_new (0.5, 0.5, 0, 0);
362   gtk_widget_set_name (alignment2, "alignment2");
363   gtk_widget_show (alignment2);
364   gtk_container_add (GTK_CONTAINER (main_reset_button), alignment2);
365
366   hbox6 = gtk_hbox_new (FALSE, 2);
367   gtk_widget_set_name (hbox6, "hbox6");
368   gtk_widget_show (hbox6);
369   gtk_container_add (GTK_CONTAINER (alignment2), hbox6);
370
371   image1 = gtk_image_new_from_stock ("gtk-revert-to-saved", GTK_ICON_SIZE_BUTTON);
372   gtk_widget_set_name (image1, "image1");
373   gtk_widget_show (image1);
374   gtk_box_pack_start (GTK_BOX (hbox6), image1, FALSE, FALSE, 0);
375
376   label667 = gtk_label_new_with_mnemonic ("_Reset");
377   gtk_widget_set_name (label667, "label667");
378   gtk_widget_show (label667);
379   gtk_box_pack_start (GTK_BOX (hbox6), label667, FALSE, FALSE, 0);
380
381
382   g_signal_connect ((gpointer) main_window, "delete_event",
383                     G_CALLBACK (on_main_window_delete_event),
384                     NULL);
385   g_signal_connect ((gpointer) main_use_default_font_radio, "toggled",
386                     G_CALLBACK (on_main_use_default_font_radio_toggled),
387                     NULL);
388   g_signal_connect ((gpointer) main_font_selector_button, "font_set",
389                     G_CALLBACK (on_main_font_selector_button_font_set),
390                     NULL);
391   g_signal_connect ((gpointer) main_cancel_button, "clicked",
392                     G_CALLBACK (on_main_cancel_button_clicked),
393                     NULL);
394   g_signal_connect ((gpointer) main_reset_button, "clicked",
395                     G_CALLBACK (on_main_reset_button_clicked),
396                     NULL);
397   g_signal_connect ((gpointer) main_ok_button, "clicked",
398                     G_CALLBACK (on_main_ok_button_clicked),
399                     NULL);
400
401   /* Store pointers to all widgets, for use by lookup_widget(). */
402   GLADE_HOOKUP_OBJECT_NO_REF (main_window, main_window, "main_window");
403   GLADE_HOOKUP_OBJECT (main_window, main_hbox, "main_hbox");
404   GLADE_HOOKUP_OBJECT (main_window, vbox1, "vbox1");
405   GLADE_HOOKUP_OBJECT (main_window, hbox1, "hbox1");
406   GLADE_HOOKUP_OBJECT (main_window, frame2, "frame2");
407   GLADE_HOOKUP_OBJECT (main_window, alignment3, "alignment3");
408   GLADE_HOOKUP_OBJECT (main_window, scrolledwindow3, "scrolledwindow3");
409   GLADE_HOOKUP_OBJECT (main_window, main_themelist, "main_themelist");
410   GLADE_HOOKUP_OBJECT (main_window, label1234, "label1234");
411   GLADE_HOOKUP_OBJECT (main_window, frame3, "frame3");
412   GLADE_HOOKUP_OBJECT (main_window, alignment4, "alignment4");
413   GLADE_HOOKUP_OBJECT (main_window, vbox7, "vbox7");
414   GLADE_HOOKUP_OBJECT (main_window, hbox8, "hbox8");
415   GLADE_HOOKUP_OBJECT (main_window, vbox9, "vbox9");
416   GLADE_HOOKUP_OBJECT (main_window, main_use_default_font_radio, "main_use_default_font_radio");
417   GLADE_HOOKUP_OBJECT (main_window, main_use_custom_font_radio, "main_use_custom_font_radio");
418   GLADE_HOOKUP_OBJECT (main_window, alignment5, "alignment5");
419   GLADE_HOOKUP_OBJECT (main_window, vbox10, "vbox10");
420   GLADE_HOOKUP_OBJECT (main_window, hbox9, "hbox9");
421   GLADE_HOOKUP_OBJECT (main_window, vbox11, "vbox11");
422   GLADE_HOOKUP_OBJECT (main_window, main_font_selector_button, "main_font_selector_button");
423   GLADE_HOOKUP_OBJECT (main_window, label669, "label669");
424   GLADE_HOOKUP_OBJECT (main_window, vbox13, "vbox13");
425   GLADE_HOOKUP_OBJECT (main_window, hbuttonbox1, "hbuttonbox1");
426   GLADE_HOOKUP_OBJECT (main_window, hbox7, "hbox7");
427   GLADE_HOOKUP_OBJECT (main_window, vbox6, "vbox6");
428   GLADE_HOOKUP_OBJECT (main_window, hbox5, "hbox5");
429   GLADE_HOOKUP_OBJECT (main_window, main_ok_button, "main_ok_button");
430   GLADE_HOOKUP_OBJECT (main_window, main_cancel_button, "main_cancel_button");
431   GLADE_HOOKUP_OBJECT (main_window, main_reset_button, "main_reset_button");
432   GLADE_HOOKUP_OBJECT (main_window, alignment2, "alignment2");
433   GLADE_HOOKUP_OBJECT (main_window, hbox6, "hbox6");
434   GLADE_HOOKUP_OBJECT (main_window, image1, "image1");
435   GLADE_HOOKUP_OBJECT (main_window, label667, "label667");
436
437   GLADE_HOOKUP_OBJECT_NO_REF (main_window, tooltips, "tooltips");
438
439   gtk_widget_grab_default (main_themelist);
440   gtk_window_add_accel_group (GTK_WINDOW (main_window), accel_group);
441
442   return main_window;
443 }
444
445
446
447
448 static std::string gchar_to_string(gchar* gstr)
449 {
450         std::string str = (gstr ? gstr : "");
451         g_free(gstr);
452         return str;
453 }
454
455
456
457 // ------------------------------------------------------
458
459
460 static std::string s_orig_theme;
461 static std::string s_orig_font;
462
463 std::string& get_orig_theme()
464 {
465         return s_orig_theme;
466 }
467
468
469 std::string& get_orig_font()
470 {
471         return s_orig_font;
472 }
473
474
475 // ------------------------------------------------------
476
477
478 std::string get_current_theme()
479 {
480
481         GtkSettings* settings = gtk_settings_get_default();
482         gchar* theme;
483         g_object_get(settings, "gtk-theme-name", &theme, NULL);
484
485         /* dummy check */
486         if( !g_ascii_isalnum( theme[0] ) ){
487                 g_free( theme );
488                 return "";
489         }
490         return gchar_to_string(theme);
491 }
492
493
494
495
496 std::string get_current_font()
497 {
498         return gchar_to_string( pango_font_description_to_string( gtk_rc_get_style( g_main_rc_window )->font_desc ) );
499 }
500
501
502
503 // ------------------------------------------------------
504
505
506
507 std::string get_selected_theme()
508 {
509         GtkTreeView* treeview = GTK_TREE_VIEW(lookup_widget(g_main_rc_window, "main_themelist"));
510         GtkTreeModel* model = gtk_tree_view_get_model(treeview);
511         GtkTreeSelection* selection = gtk_tree_view_get_selection(treeview);
512
513         GtkTreeIter iter;
514         gtk_tree_selection_get_selected(selection, 0, &iter);
515
516         gchar* theme_name;
517         gtk_tree_model_get(model, &iter, 0, &theme_name, -1);
518 //      std::cout << theme_name << "\n";
519         return gchar_to_string(theme_name);
520 }
521
522
523
524 std::string get_selected_font()
525 {
526 //      GtkWidget* fontentry = lookup_widget(g_main_rc_window, "main_fontentry");
527 //      return gtk_entry_get_text(GTK_ENTRY(fontentry));
528
529         bool default_font = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(g_main_rc_window, "main_use_default_font_radio")));
530
531         if (default_font)
532                 return "";
533
534         GtkWidget* fontbutton = lookup_widget(g_main_rc_window, "main_font_selector_button");
535         return gtk_font_button_get_font_name(GTK_FONT_BUTTON(fontbutton));
536 }
537
538
539 // ------------------------------------------------------
540
541
542
543 static void themelist_selection_changed_cb(GtkTreeSelection* selection, gpointer data)
544 {
545         if (gtk_tree_selection_get_selected (selection, 0, 0))
546                 apply_theme(get_selected_theme(), get_current_font());
547 }
548
549
550
551 // ------------------------------------------------------
552
553
554
555 static void populate_with_themes(GtkWidget* w)
556 {
557
558         std::string search_path = gchar_to_string(gtk_rc_get_theme_dir());
559
560         if (search_path.size() && search_path[search_path.size() -1] != G_DIR_SEPARATOR)
561                 search_path += G_DIR_SEPARATOR_S;
562
563         GDir* gdir = g_dir_open(search_path.c_str(), 0, NULL);
564         if (gdir == NULL)
565                 return;
566
567
568         char* name;
569         GList* glist = 0;
570
571         while ( (name = const_cast<char*>(g_dir_read_name(gdir))) != NULL ) {
572                 std::string filename = name;
573
574 //              if (g_ascii_strup(fname.c_str(), -1) == "Default")
575 //                      continue;
576
577                 std::string fullname = search_path + filename;
578                 std::string rc = fullname; rc += G_DIR_SEPARATOR_S; rc += "gtk-2.0"; rc += G_DIR_SEPARATOR_S; rc += "gtkrc";
579
580                 bool is_dir = 0;
581                 if (g_file_test(fullname.c_str(), G_FILE_TEST_IS_DIR))
582                         is_dir = 1;
583
584                 if (is_dir && g_file_test(rc.c_str(), G_FILE_TEST_IS_REGULAR)) {
585                         glist = g_list_insert_sorted(glist, g_strdup(filename.c_str()), (GCompareFunc)strcmp);
586                 }
587         }
588
589         g_dir_close(gdir);
590
591
592
593
594         // ---------------- tree
595
596
597         GtkTreeView* treeview = GTK_TREE_VIEW(w);
598         GtkListStore *store = gtk_list_store_new (1, G_TYPE_STRING);
599         gtk_tree_view_set_model(treeview, GTK_TREE_MODEL(store));
600
601         GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes (
602                                                                                                 "Theme", gtk_cell_renderer_text_new(),
603                                                                                                 "text", 0,
604                                                                                                 NULL);
605         gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_GROW_ONLY);
606         gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
607
608
609         GtkTreeIter   iter;
610
611         int i =0, curr=0;
612         while (char* theme = (char*)g_list_nth_data(glist, i)) {
613                 gtk_list_store_append (store, &iter);
614                 gtk_list_store_set (store, &iter, 0, theme, -1);
615
616                 if (strcmp(theme, get_current_theme().c_str()) == 0) {
617                         curr = i;
618                 }
619
620                 ++i;
621         }
622
623
624         GtkTreeSelection* selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
625
626         // set the default theme
627
628         // THIS IS IMPORTANT!!!
629         gtk_widget_grab_focus(w);
630
631         std::stringstream str;
632         str << curr;
633         GtkTreePath* selpath = gtk_tree_path_new_from_string (str.str().c_str());
634         if (selpath) {
635                 gtk_tree_selection_select_path(selection, selpath);
636                 gtk_tree_view_scroll_to_cell(treeview, selpath, NULL, true, 0.5, 0.0);
637                 gtk_tree_path_free(selpath);
638         }
639
640         g_signal_connect (G_OBJECT (selection), "changed",
641                   G_CALLBACK (themelist_selection_changed_cb), NULL);
642
643         g_object_unref (G_OBJECT (store));
644
645
646         // ---------------- font
647
648
649         GtkWidget* fontbutton = lookup_widget(g_main_rc_window, "main_font_selector_button");
650         gtk_font_button_set_font_name(GTK_FONT_BUTTON(fontbutton), get_current_font().c_str());
651
652
653 }
654
655
656
657
658 // ------------------------------------------------------
659
660
661
662
663 void gtkThemeDlg(){
664         if( g_main_rc_window ) return;
665
666         s_rc_file = std::string( AppPath_get() ) + G_DIR_SEPARATOR_S + ".gtkrc-2.0.radiant";
667
668         g_main_rc_window = create_rc_window();
669
670     populate_with_themes( lookup_widget( g_main_rc_window, "main_themelist" ) );
671
672         get_orig_theme() = get_current_theme();
673         get_orig_font() = get_current_font();
674
675         gtk_widget_show ( g_main_rc_window );
676 }
677
678
679
680 // -------------------------------
681
682
683
684 void set_theme(const std::string& theme_name, const std::string& font)
685 {
686         if( theme_name.empty() ) return;
687
688         // tree
689         GtkTreeView* treeview = GTK_TREE_VIEW(lookup_widget(g_main_rc_window, "main_themelist"));
690         GtkTreeModel* model = gtk_tree_view_get_model(treeview);
691         GtkTreeSelection* selection = gtk_tree_view_get_selection(treeview);
692
693         GtkTreeIter iter;
694         gtk_tree_model_get_iter_first(model, &iter);
695
696         while(gtk_tree_model_iter_next(model, &iter)) {
697
698                 gchar* text;
699                 gtk_tree_model_get (model, &iter, 0, &text, -1);
700                 std::string theme = gchar_to_string(text);
701
702                 if (theme_name == theme) {
703                         gtk_tree_selection_select_iter(selection, &iter);
704                         break;
705                 }
706
707         }
708
709
710         // font
711         if (font != "") {
712                 GtkWidget* fontbutton = lookup_widget(g_main_rc_window, "main_font_selector_button");
713                 //gtk_font_button_set_font_name(GTK_FONT_BUTTON(fontbutton), get_current_font().c_str());
714                 gtk_font_button_set_font_name(GTK_FONT_BUTTON(fontbutton), font.c_str());
715         }
716
717
718         apply_theme(get_selected_theme(), get_selected_font());
719
720 }
721
722
723
724
725 void apply_theme(const std::string& theme_name, const std::string& font)
726 {
727
728         std::stringstream strstr;
729         strstr << "gtk-theme-name = \"" << theme_name << "\"\n";
730
731         if (font != "")
732                 strstr << "style \"user-font\"\n{\nfont_name=\"" << font << "\"\n}\nwidget_class \"*\" style \"user-font\"";
733
734         //strstr << "\ngtk-menu-popup-delay = 10";
735
736 //      std::cout << strstr.str() << "\n\n\n";
737         std::fstream f;
738         f.open(s_rc_file.c_str(), std::ios::out);
739                 f << strstr.str();
740         f.close();
741
742
743         GtkSettings* settings = gtk_settings_get_default();
744
745         gtk_rc_reparse_all_for_settings (settings, true);
746 //      gtk_rc_parse_string(strstr.str().c_str());
747 //      gtk_rc_parse("/root/.gtk-tmp");
748 //      gtk_rc_reset_styles(settings);
749
750         //unlink(s_rc_file.c_str());
751
752         while (gtk_events_pending())
753                 gtk_main_iteration();
754
755
756 }
757
758 #endif // GARUX_DISABLE_GTKTHEME