1 #ifdef COPYRIGHT_INFORMATION
2 #include "gplv3.h"
3 #endif
4 /*
5  * Copyright (c) 2006-2012 Edscott Wilson Garcia <edscott@users.sf.net>
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public
18  * License along with this library;
19  */
20 #include "primary-options.h"
21 #include "xmltree.h"
22 
23 
24 #define LS_OPTIONS get_ls_options()
25 #define CP_OPTIONS get_cp_options()
26 #define MV_OPTIONS get_mv_options()
27 #define LN_OPTIONS get_ln_options()
28 #define RM_OPTIONS get_rm_options()
29 #define SHRED_OPTIONS get_shred_options()
30 /*
31 #define LS_OPTIONS rfm_void(RFM_MODULE_DIR, "callbacks","get_ls_options")
32 #define CP_OPTIONS rfm_void(RFM_MODULE_DIR, "callbacks","get_cp_options")
33 #define MV_OPTIONS rfm_void(RFM_MODULE_DIR, "callbacks","get_mv_options")
34 #define LN_OPTIONS rfm_void(RFM_MODULE_DIR, "callbacks","get_ln_options")
35 #define RM_OPTIONS rfm_void(RFM_MODULE_DIR, "callbacks","get_rm_options")
36 #define SHRED_OPTIONS rfm_void(RFM_MODULE_DIR, "callbacks","get_shred_options")
37 */
38 
rfm_check_button_new()39 static GtkWidget *rfm_check_button_new(){
40 	return gtk_check_button_new ();
41 }
42 static void
rfm_check_button_set_active(GtkWidget * button,gboolean state)43 rfm_check_button_set_active(GtkWidget *button, gboolean state){
44     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), state);
45 }
46 static void
scroll_to_top(void * user_data)47 scroll_to_top(void *user_data){
48     rfm_threadwait(); //sleep(1);
49     widgets_t *widgets_p = user_data;
50     rfm_context_function(rfm_scroll_to_top, widgets_p);
51 }
52 
53 
54 void *
55 mcs_set_var (const gchar * setting_name, const gchar * setting_value);
56 
57 #define SETTINGS_TIMERVAL 750
58 
59 static void
clear_bgimage(GtkButton * button,gpointer data)60 clear_bgimage (GtkButton * button, gpointer data) {
61     settings_t *settings_p=data;
62     gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(settings_p->desktopimage_button), "gtk gives a warning if we use NULL here (that is not good) so we just use this text to set to NULL");
63 }
64 
65 void
margin_changed(GtkSpinButton * spinbutton,gpointer data)66 margin_changed (GtkSpinButton *spinbutton, gpointer data)  {
67     settings_t *settings_p=g_object_get_data(G_OBJECT(spinbutton), "settings_p");
68     if(!settings_p || settings_p->disable_options){
69         return;
70     }
71     gint which_margin = GPOINTER_TO_INT(data);
72 
73 
74     if(rfm_options[which_margin].value)
75         g_free (rfm_options[which_margin].value);
76 
77     gdouble value=gtk_spin_button_get_value (spinbutton);
78     NOOP ("margin:changed(): %4.0lf\n", value);
79     rfm_options[which_margin].value = g_strdup_printf ("%lf", value);
80     mcs_manager_set_string (mcs_manager, rfm_options[which_margin].name,
81 	    CHANNEL, rfm_options[which_margin].value);
82     mcs_manager_notify (mcs_manager, CHANNEL);
83 
84     return;
85 
86 }
87 
88 void
preview_size_changed(GtkSpinButton * spinbutton,gpointer data)89 preview_size_changed (GtkSpinButton *spinbutton, gpointer data)  {
90     settings_t *settings_p=g_object_get_data(G_OBJECT(spinbutton), "settings_p");
91     if(!settings_p || settings_p->disable_options){
92         return;
93     }
94 
95     if(rfm_options[RFM_PREVIEW_IMAGE_SIZE].value)
96         g_free (rfm_options[RFM_PREVIEW_IMAGE_SIZE].value);
97 
98     gdouble value=gtk_spin_button_get_value (spinbutton);
99     NOOP ("RFM_PREVIEW_IMAGE_SIZE:changed(): %4.0lf\n", value);
100     gint iv = value;
101     rfm_options[RFM_PREVIEW_IMAGE_SIZE].value = g_strdup_printf ("%d", iv);
102     mcs_manager_set_string (mcs_manager, rfm_options[RFM_PREVIEW_IMAGE_SIZE].name,
103 	    CHANNEL, rfm_options[RFM_PREVIEW_IMAGE_SIZE].value);
104     mcs_manager_notify (mcs_manager, CHANNEL);
105 
106     return;
107 
108 }
109 
110 static gboolean
transparency_changed(GtkRange * range,GtkScrollType scroll,gdouble value,gpointer user_data)111 transparency_changed (GtkRange * range,
112 	GtkScrollType scroll,
113 	gdouble value,
114 	gpointer user_data)
115 {
116     settings_t *settings_p=g_object_get_data(G_OBJECT(range), "settings_p");
117     if(settings_p->disable_options)
118         return FALSE;
119     int i = (int)((long)user_data);
120     if(rfm_options[i].value)
121         g_free (rfm_options[i].value);
122     rfm_options[i].value = g_strdup_printf ("%lf", value);
123     mcs_manager_set_string (mcs_manager, rfm_options[i].name,
124 	    CHANNEL, rfm_options[i].value);
125     mcs_manager_notify (mcs_manager, CHANNEL);
126 
127     return FALSE;
128 }
129 
130 static gint
settings_monitor(gpointer data)131 settings_monitor (gpointer data) {
132     NOOP("g_timeout: settings-module.i settings_monitor()\n");
133     mcs_shm_t *mcs_shm_p = (mcs_shm_t *) mp->m;
134     if(shm_settings_serial < 0)
135         return FALSE;
136     if(shm_settings_serial != mcs_shm_p->serial) {
137 	NOOP(stderr, "+++ settings_monitor: refreshing environment...\n");
138         int i;
139         for(i = 0; i < RFM_OPTIONS; i++) {
140             // false positive. We are not comparing the array, we are comparing
141             // the preset value within the array of structures, which may or may
142             // not be null.
143             // coverity[array_null : FALSE]
144             if(mcs_shm_p->data[i].value) {
145                 g_free (rfm_options[i].value);
146                 rfm_options[i].value = g_strdup (mcs_shm_p->data[i].value);
147                 rfm_setenv (rfm_options[i].name, rfm_options[i].value, TRUE);
148             } else {
149                 rfm_setenv (rfm_options[i].name, NULL, TRUE);
150             }
151 	    if (strlen(rfm_options[i].value)){
152 		NOOP ("settings_monitor(): serial %d (was %d)  %s->%s\n",
153 		    mcs_shm_p->serial, shm_settings_serial,
154 		    rfm_options[i].name, rfm_options[i].value);
155 	    }
156 
157         }
158         shm_settings_serial = mcs_shm_p->serial;
159     } else {
160         COMMENT("shm_settings_serial OK\n");
161     }
162     return TRUE;
163 }
164 
165 static int
mcs_shm_fileread(void)166 mcs_shm_fileread (void) {
167     static gchar *rcfile = NULL;
168 
169     if(!rcfile) {
170         rcfile = g_build_filename (MCS_SHM_PLUGIN_FILE, NULL);
171     }
172 
173     if(rfm_g_file_test (rcfile, G_FILE_TEST_EXISTS)) {
174         FILE *f;
175         NOOP("mcs_shm_fileread(): %s\n", rcfile);
176         f = fopen (rcfile, "r");
177         if(f) {
178             size_t items_read = fread (mp->m, sizeof (mcs_shm_t), 1, f);
179             if(items_read == 1){
180                 msync (mp->m, sizeof (mcs_shm_t), MS_SYNC);
181             } else {
182                 DBG ("mcs_shm_fileread() fread: %s\n", strerror (errno));
183             }
184             fclose (f);
185         }
186         return 1;
187     }
188     return 0;
189 }
190 
191 static int
mcs_shm_filewrite(void)192 mcs_shm_filewrite (void) {
193     FILE *f;
194     static gchar *rcfile = NULL;
195 
196     if(!rcfile) {
197         rcfile = g_build_filename (MCS_SHM_PLUGIN_FILE, NULL);
198     }
199     NOOP ("mcs_shm_filewrite(): %s\n", rcfile);
200     msync (mp->m, sizeof (mcs_shm_t), MS_SYNC);
201     f = fopen (rcfile, "w");
202     if(f) {
203         mcs_shm_t *mcs_shm_p = (mcs_shm_t *) mp->m;
204         mcs_shm_p->serial++;
205         if(fwrite (mp->m, sizeof (mcs_shm_t), 1, f) < 1)
206             DBG ("fwrite: %s\n", strerror (errno));
207         fclose (f);
208         return 1;
209     }
210     msync (mp->m, sizeof (mcs_shm_t), MS_SYNC);
211     return 0;
212 }
213 
214 static void
mcs_shm_bringforth(void)215 mcs_shm_bringforth (void) {
216     int i,
217       j;
218     mcs_shm_t *mcs_shm_p = (mcs_shm_t *) mp->m;
219     COMMENT ("mcs_shm_bringforth\n");
220     for(i = 0; i < RFM_OPTIONS; i++) {
221         g_free (rfm_options[i].value);
222         rfm_options[i].value = g_strdup ("");
223     }
224     for(i = 0; i < RFM_OPTIONS; i++){
225         for(j = 0; j < RFM_OPTIONS; j++) {
226             // false positive. We are not comparing the array, we are comparing
227             // the preset value within the array of structures, which may or may
228             // not be null.
229             // coverity[array_null : FALSE]
230             if(rfm_options[i].name && mcs_shm_p->data[j].name) {
231                 if(strcmp (rfm_options[i].name, mcs_shm_p->data[j].name))
232                     continue;
233                 g_free (rfm_options[i].value);
234 		    rfm_options[i].value = g_strdup (mcs_shm_p->data[j].value);
235 		if (strlen(rfm_options[i].value)) {
236 		    NOOP ("mcs_shm_bringforth:  %s->%s\n",
237 			    rfm_options[i].name, rfm_options[i].value);
238 		}
239                 break;
240             }
241         }
242     }
243 }
244 
245 static void
mcs_shm_init(void)246 mcs_shm_init (void) {
247     int i;
248     mcs_shm_t *mcs_shm_p = (mcs_shm_t *) mp->m;
249     COMMENT ("mcs_shm_init\n");
250     for(i = 0; i < RFM_OPTIONS; i++) {
251         memset (mcs_shm_p->data[i].name, 0, SHM_STRING_LENGTH);
252         memset (mcs_shm_p->data[i].value, 0, SHM_VALUE_LENGTH);
253         strncpy (mcs_shm_p->data[i].name, rfm_options[i].name, SHM_STRING_LENGTH-1);
254         if(rfm_options[i].value) {
255             strncpy (mcs_shm_p->data[i].value, rfm_options[i].value, SHM_VALUE_LENGTH-1);
256             mcs_shm_p->data[i].value[SHM_VALUE_LENGTH - 1] = 0;
257         }
258         COMMENT ("*SETTINGS: initialising %s->%s\n",
259 		rfm_options[i].name, rfm_options[i].value);
260     }
261     msync (mp->m, sizeof (mcs_shm_t), MS_SYNC);
262 }
263 
264 static void
start_desktop(gboolean on)265 start_desktop (gboolean on) {
266     // Automatic on/off is only applicable for local displays.
267     if (!localhost_check()) {
268 	return;
269     }
270 
271     Window xid;
272     GError *error = NULL;
273     if(on) {
274         rfm_global_t *rfm_global_p = rfm_global();
275         Atom selection_atom = XInternAtom (rfm_global_p->Xdisplay, "RODENT_DESK_ATOM", False);
276         if((xid = XGetSelectionOwner (rfm_global_p->Xdisplay, selection_atom))) {
277             NOOP ("start_desktop(): rodent-desk already running\n");
278         } else if(!g_spawn_command_line_async ("rodent-desk", &error)) {
279             DBG ("start_desktop(): %s\n", error->message);
280         } else {
281 	    NOOP("start_desktop(): rodent-desk\n");
282 	}
283     } else {
284 	 if(!g_spawn_command_line_async ("killall -TERM rodent-desk", &error)) {
285             DBG ("%s\n", error->message);
286             g_error_free (error);
287         }
288     }
289 
290 }
291 
292 static void
mcs_manager_set_string(McsManager * mcs_m,const gchar * setting_name,const gchar * channel,const gchar * setting_value)293 mcs_manager_set_string (McsManager * mcs_m,
294 	const gchar * setting_name,
295 	const gchar * channel,
296 	const gchar * setting_value)
297 {
298     mcs_shm_t *mcs_shm_p = (mcs_shm_t *) mp->m;
299     int i;
300     COMMENT ("mcs_manager_set_string\n");
301 
302     for(i = 0; i < RFM_OPTIONS; i++) {
303         COMMENT ("%d/%d %s==%s?\n",
304 		i+1, RFM_OPTIONS, setting_name, mcs_shm_p->data[i].name);
305         if(strcmp (setting_name, mcs_shm_p->data[i].name) == 0) {
306             memset (mcs_shm_p->data[i].value, 0, SHM_VALUE_LENGTH);
307             if(setting_value) {
308               if(strlen (setting_value) > 0) {
309 		NOOP (stderr, "mcs_manager_set_string(): %s -> %s (%zd)\n",
310 		    setting_name, setting_value, strlen (setting_value));
311 	      }
312               if(i == RFM_ENABLE_DESKTOP) {
313                 if(strlen (setting_value) > 0) {
314                     NOOP (stderr, "mcs_manager_set_string(): Start desktop (%ld)\n",
315 			    (long)strlen (setting_value));
316                     start_desktop (TRUE);
317                 } else {
318                     NOOP (stderr, "mcs_manager_set_string(): Kill desktop (%ld)\n",
319 			    (long)strlen (setting_value));
320                     start_desktop (FALSE);
321                 }
322               }
323 #ifdef HAVE_SETENV
324         setenv ( mcs_shm_p->data[i].name, setting_value, 1);
325 #endif
326               strncpy (mcs_shm_p->data[i].value, setting_value, SHM_VALUE_LENGTH);
327               mcs_shm_p->data[i].value[SHM_VALUE_LENGTH - 1] = 0;
328 	      gchar *oldvalue = rfm_options[i].value;
329               rfm_options[i].value = g_strdup (setting_value);
330               g_free (oldvalue);
331             }
332         }
333     }
334     msync (mp->m, sizeof (mcs_shm_t), MS_SYNC);
335     /* here we update the shmblock */
336     return;
337 }
338 
339 static void
mcs_manager_notify(McsManager * mcs_m,const gchar * channel)340 mcs_manager_notify (McsManager * mcs_m, const gchar * channel) {
341     /* here we ++ the shmblock serial (or something), this should be
342      * monitored by other instances so that changes are ACK.*/
343     COMMENT ("mcs_manager_notify\n");
344     mcs_shm_t *mcs_shm_p = (mcs_shm_t *) mp->m;
345     mcs_shm_p->serial++;
346     msync (mp->m, sizeof (mcs_shm_t), MS_SYNC);
347     mcs_shm_filewrite ();
348     return;
349 }
350 
351 /* the dialog ******************************************/
352 /*static void
353 add_spacer (GtkBox * box) {
354 
355     GtkWidget *eventbox = gtk_alignment_new (0, 0, 0, 0);
356 
357     gtk_widget_set_size_request (eventbox, SKIP, SKIP);
358     gtk_widget_show (eventbox);
359     gtk_box_pack_start (box, eventbox, FALSE, TRUE, 0);
360 }*/
361 
362 static void update_tree (GtkTreeModel *model, gint id);
363 
364 static gboolean
test_command(const gchar * command)365 test_command(const gchar *command){
366     if (!command) return FALSE;
367     gchar *c=g_strdup(command);
368     if (strchr(c, ' ')) *strchr(c, ' ') = 0;
369     gchar *cmd = g_find_program_in_path (c);
370     g_free(c);
371     if (!cmd) return FALSE;
372     g_free(cmd);
373     return TRUE;
374 }
375 
376 
get_program_options(gint i)377 static gchar **get_program_options(gint i){
378     if (i >= RFM_OPTIONS) return NULL;
379     environ_t *environ_v = rfm_get_environ();
380     return environ_v[i].env_options;
381 }
382 
383 static gboolean
environment_changed(GtkCellRendererText * cell,const gchar * path_string,const gchar * new_text,gpointer data)384 environment_changed (GtkCellRendererText * cell,
385 	const gchar * path_string,
386 	const gchar * new_text,
387 	gpointer data) {
388     settings_t *settings_p=data;
389     if(settings_p->disable_options)
390         return FALSE;
391 
392     GtkTreeModel *model = GTK_TREE_MODEL(settings_p->model);
393     GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
394     GtkTreeIter iter;
395 
396     gint *column;
397 
398     column = g_object_get_data (G_OBJECT (cell), "column");
399 
400     gtk_tree_model_get_iter (model, &iter, path);
401 
402     if(GPOINTER_TO_INT (column) == COLUMN_VALUE) {
403         COMMENT ("column=%d path=%s newtext=%s",
404 		GPOINTER_TO_INT (column), path_string, new_text);
405 
406         gint i;
407         gchar *old_text;
408 
409         gtk_tree_model_get (model, &iter, column, &old_text, -1);
410         g_free (old_text);
411         old_text = NULL;
412         i = gtk_tree_path_get_indices (path)[0];
413 
414         if(new_text && strlen (new_text) >= SHM_VALUE_LENGTH) {
415             DBG ("strlen($%s) <  %d not met. Ignoring it.\n", rfm_options[i].name, SHM_VALUE_LENGTH);
416             gtk_list_store_set (GTK_LIST_STORE (model), &iter, column, rfm_options[i].value, -1);
417             return FALSE;
418         }
419 	// bitflag tests
420 	gchar **aa=get_program_options(i);
421 
422 	if (aa) {
423 	    gboolean notfound = TRUE;
424 	    for(; aa && *aa; aa++){
425 		if (new_text && strcmp(*aa, new_text)==0){
426 		    notfound = FALSE;
427 		    break;
428 		}
429 	    }
430 	    if (notfound){
431 		gtk_list_store_set (GTK_LIST_STORE (model), &iter, column, rfm_options[i].value, -1);
432                 return FALSE;
433 	    }
434 	}
435 
436         /* test for valid commands */
437         if(i == TERMINAL_CMD || i == EDITOR) {
438             gboolean dump = FALSE;
439             if(!new_text || !test_command(new_text)){
440                     dump = TRUE;
441             }
442             if(dump) {
443 
444 		gchar *g=g_strdup_printf("%s: Command not found", (new_text)?new_text:"");
445 		rfm_show_text(settings_p->widgets_p);
446 		rfm_diagnostics(settings_p->widgets_p, "xffm/stock_dialog-error", NULL);
447 		rfm_diagnostics(settings_p->widgets_p, "xffm_tag/stderr", g, "\n", NULL);
448 		g_free(g);
449                 gtk_list_store_set (GTK_LIST_STORE (model), &iter, column, rfm_options[i].value, -1);
450                 return FALSE;
451             }
452         }
453         /* test for valid iconsizes */
454         if(i == RFM_DEFAULT_ICON_SIZE) {
455 	    // New values entered in advanced mode: should they be
456 	    // input in translated or nontranslated form?
457 	    // Non translated, of course.
458             gboolean dump = TRUE;
459             if(new_text) {
460 		const gchar **p=rfm_get_icon_sizes();
461 		for (;p && *p; p++){
462 		    if (strcmp(*p, new_text) == 0){
463 			dump = FALSE;
464 			break;
465 		    }
466 		}
467             }
468             if(dump) {
469                 gtk_list_store_set (GTK_LIST_STORE (model),
470 			&iter, column, rfm_options[i].value, -1);
471                 return FALSE;
472             }
473         }
474         if(i == RFM_FIXED_FONT_SIZE
475 		|| i == RFM_VARIABLE_FONT_SIZE
476 		|| i == RFM_FIXED_FONT_FAMILY
477 		|| i == RFM_VARIABLE_FONT_FAMILY
478 		) {
479 	    // New values entered in advanced mode: should they be
480 	    // input in translated or nontranslated form?
481 	    // Non translated, of course.
482             gboolean dump = TRUE;
483             if(new_text) {
484 		const gchar **p=rfm_get_font_sizes();
485 		for (;p && *p; p++){
486 		    if (strcmp(*p, new_text) == 0){
487 			dump = FALSE;
488 			break;
489 		    }
490 		}
491             }
492             if(dump) {
493                 gtk_list_store_set (GTK_LIST_STORE (model),
494 			&iter, column, rfm_options[i].value, -1);
495                 return FALSE;
496             }
497         }
498 
499         if(rfm_options[i].value) {
500             g_free (rfm_options[i].value);
501             rfm_options[i].value = NULL;
502         }
503         if(new_text && strlen (new_text)) {
504             rfm_options[i].value = g_strdup (new_text);
505         } else {
506             rfm_options[i].value = g_strdup ("");
507         }
508 	COMMENT ("environment_changed:  %s->%s\n",
509 		rfm_options[i].name, rfm_options[i].value);
510         gtk_list_store_set (GTK_LIST_STORE (model), &iter, column, rfm_options[i].value, -1);
511         mcs_manager_set_string (mcs_manager, rfm_options[i].name, CHANNEL, rfm_options[i].value);
512         mcs_manager_notify (mcs_manager, CHANNEL);
513         /*write_options(); */
514     }
515     gtk_tree_path_free (path);
516 
517     return FALSE;
518 }
519 static gboolean animation_stop=FALSE;
520 /* the dialog */
521 static void
dialog_delete(GtkWidget * dialog,gpointer data)522 dialog_delete (GtkWidget * dialog, gpointer data) {
523     GError *error = NULL;
524     if(GPOINTER_TO_INT(data) == 1) {
525 	if (rfm_void(RFM_MODULE_DIR, "icons", "module_active") ){
526 	    g_spawn_command_line_async ("rodent-iconmgr", &error);
527 	} else {
528 	gchar *text = g_strdup_printf("<b>%s</b>\n\n%s: <i>%s</i>\n",
529 		_("List of disabled plugins"), _("Icon Themes"), _("Disabled"));
530 	    rfm_confirm(NULL, GTK_MESSAGE_INFO, text, NULL, NULL);
531 	    g_free(text);
532 	    return;
533 	}
534     } else if(GPOINTER_TO_INT(data) == 2) {
535           /* thumbnail cache */
536           gchar *cache_dir = g_build_filename (RFM_THUMBNAIL_DIR, NULL);
537           NOOP ("dialog_delete(): clearing thumbnail cache: %s", cache_dir);
538           gchar *command = g_strdup_printf ("rm -rf \"%s\"", cache_dir);
539           g_spawn_command_line_async (command, &error);
540           g_free (cache_dir);
541           g_free (command);
542     }
543 
544     // writeout current config, to disable welcome dialog.
545     mcs_shm_filewrite();
546 
547 
548     widgets_t *widgets_p=g_object_get_data(G_OBJECT(dialog), "widgets_p");
549     if (widgets_p) {
550 	g_free(widgets_p);
551     }
552     g_object_set_data(G_OBJECT(dialog), "widgets_p", NULL);
553     gtk_widget_hide(dialog);
554     animation_stop = TRUE;
555     settings_t *settings_p=g_object_get_data(G_OBJECT(dialog), "settings_p");
556     g_free(settings_p);
557     g_object_set_data(G_OBJECT(dialog), "settings_p", NULL);
558     settings_dialog=NULL;
559     gtk_widget_destroy (dialog);
560     //
561     //rfm_unload_module("xmltree");
562 
563 }
564 
565 static void
update_bitflag_entry(settings_t * settings_p,gint id)566 update_bitflag_entry (settings_t *settings_p, gint id) {
567     GtkEntry *entry =
568 	    g_object_get_data(G_OBJECT(settings_p->dialog), rfm_options[id].name);
569     gchar *new_text = rfm_options[id].value;
570     if (GTK_IS_ENTRY(entry)) gtk_entry_set_text(GTK_ENTRY(entry), new_text?new_text:"");
571 }
572 
573 static void
update_bitflag_combo(settings_t * settings_p,gint id)574 update_bitflag_combo (settings_t *settings_p, gint id) {
575     gchar **aa=get_program_options(id);
576     gint item=0;
577     if (aa) {
578 	gchar *new_text = rfm_options[id].value;
579 	gboolean notfound = TRUE;
580 	for(; aa && *aa; aa++,item++){
581 	    if (strcmp(*aa, new_text)==0){
582 		notfound = FALSE;
583 		break;
584 	    }
585 	}
586 	if (notfound) {
587 	    NOOP("aa not found %s\n", new_text);
588 	    return ;
589 	}
590 	GtkComboBox *combo_box =
591 	    g_object_get_data(G_OBJECT(settings_p->dialog), rfm_options[id].name);
592 
593 	NOOP(stderr, "update_bitflag_combo() %s box=0x%x\n", rfm_options[id].name, GPOINTER_TO_INT(combo_box));
594 	if (GTK_IS_COMBO_BOX(combo_box)) gtk_combo_box_set_active (combo_box, item);
595 
596     } else {
597 	NOOP("update_bitflag_combo(): get_program_options(%s) is NULL\n", rfm_options[id].name);
598     }
599 
600 }
601 
602 static void
update_combo(GtkComboBox * combo_box,gint id,gboolean translated)603 update_combo (GtkComboBox * combo_box, gint id, gboolean translated) {
604     const gchar *string=(translated)?_(rfm_options[id].value):rfm_options[id].value;
605     gint item=0;
606 
607     GSList *list=g_object_get_data(G_OBJECT(combo_box), "list");
608     GSList *tmp=list;
609     for (;tmp && tmp->data; tmp=tmp->next, item++){
610 	if (strcmp(string, (gchar *)tmp->data)==0) {
611 	    break;
612 	}
613     }
614 
615     // Is the string in the combobox list?
616     gboolean in_combobox = (item < g_slist_length(list));
617 	// Yes. Then it must be selected.
618     if (in_combobox) {
619 	if (GTK_IS_COMBO_BOX(combo_box))gtk_combo_box_set_active (combo_box, item);
620     } else {
621 	// No. The string is not in the combobox list, the string must
622 	// be inserted and selected.
623 	COMMENT("Adding %s\n",  string);
624 #if GTK_MAJOR_VERSION==2 && GTK_MINOR_VERSION<24
625 	gtk_combo_box_insert_text (combo_box, 0, string);
626 #else
627 	gtk_combo_box_text_insert_text (GTK_COMBO_BOX_TEXT(combo_box), 0, string);
628 #endif
629 	if (GTK_IS_COMBO_BOX(combo_box))gtk_combo_box_set_active (combo_box, 0);
630     }
631 }
632 
633 static void
update_tree(GtkTreeModel * model,gint id)634 update_tree (GtkTreeModel *model, gint id) {
635     GtkTreePath *treepath = gtk_tree_path_new_from_indices (id, -1);
636     GtkTreeIter iter;
637     if(gtk_tree_model_get_iter (model, &iter, treepath)) {
638         gtk_list_store_set (GTK_LIST_STORE(model), &iter,
639 		COLUMN_VALUE, g_strdup (rfm_options[id].value),
640 		COLUMN_EDITABLE, TRUE, -1);
641     }
642     gtk_tree_path_free (treepath);
643 }
644 
get_spin_value(gint i)645 gdouble get_spin_value(gint i){
646     gdouble value=0;
647     environ_t *environ_v = rfm_get_environ();
648     if (getenv(environ_v[i].env_var) && strlen(getenv(environ_v[i].env_var))) {
649 	value = atof(getenv(environ_v[i].env_var));
650 	COMMENT("got env_var=%s\n", getenv(environ_v[i].env_var));
651     } else if (environ_v[i].env_string) {
652 	value = atof(environ_v[i].env_string);
653 	COMMENT("got env_string=%s\n", environ_v[i].env_string);
654     }
655     return value;
656 }
657 
658 static void
set_bit_toggles(settings_t * settings_p,const gchar * boxname,RfmProgramOptions * options_p,gint option_flag)659 set_bit_toggles( settings_t *settings_p, const gchar *boxname,  RfmProgramOptions *options_p, gint option_flag) {
660     GObject *box = g_object_get_data(G_OBJECT(settings_p->dialog), boxname);
661     if (!box || !G_IS_OBJECT (box)) {
662         DBG("Not an object: %s\n", boxname);
663         return;
664     }
665     errno = 0;
666     gint64 flag = strtoll(rfm_options[option_flag].value, NULL, 16);
667     if (errno) flag = 0;
668     gint i;
669     for (i=0;options_p && options_p->option; options_p++, i++){
670 	if (strcmp(options_p->option,"submodule-indent")==0) continue;
671 	if (strcmp(options_p->option,"submodule-unindent")==0) continue;
672 	if (strcmp(options_p->option,"submodule-label")==0) continue;
673 
674 	const gchar *name = options_p->option;
675 	GtkWidget *button = g_object_get_data(box, name);
676 	if (button){
677 	    gint64 k = flag & (ONE64<<i);
678 	    rfm_check_button_set_active(button, k?TRUE:FALSE);
679 	} else {
680 	    DBG("No toggle button for %s\n", name);
681 	}
682     }
683 
684 }
685 
686 static void
update_combo_entry(settings_t * settings_p)687 update_combo_entry(settings_t *settings_p) {
688 #ifdef GNU_CP
689     update_bitflag_combo (settings_p, RFM_CP_backup);
690     update_bitflag_combo (settings_p, RFM_CP_preserve);
691     update_bitflag_combo (settings_p, RFM_CP_no_preserve);
692     update_bitflag_combo (settings_p, RFM_CP_reflink);
693     update_bitflag_combo (settings_p, RFM_CP_sparse);
694     update_bitflag_combo (settings_p, RFM_CP_suffix);
695 #endif
696 #ifdef GNU_MV
697     update_bitflag_combo (settings_p, RFM_MV_backup);
698     update_bitflag_combo (settings_p, RFM_MV_suffix);
699 #endif
700 
701 #ifdef GNU_LN
702     update_bitflag_combo (settings_p, RFM_LN_backup);
703     update_bitflag_combo (settings_p, RFM_LN_suffix);
704 #endif
705 
706 #ifdef GNU_RM
707     update_bitflag_combo (settings_p, RFM_RM_interactive);
708 #endif
709 
710 #ifdef GNU_LS
711     update_bitflag_entry (settings_p, RFM_LS_ignore);
712     update_bitflag_entry (settings_p, RFM_LS_tabsize);
713     update_bitflag_entry (settings_p, RFM_LS_blocksize);
714     update_bitflag_combo (settings_p, RFM_LS_format);
715     update_bitflag_entry (settings_p, RFM_LS_hide);
716     update_bitflag_combo (settings_p, RFM_LS_istyle);
717     update_bitflag_combo (settings_p, RFM_LS_qstyle);
718     update_bitflag_combo (settings_p, RFM_LS_sort);
719     update_bitflag_combo (settings_p, RFM_LS_time);
720     update_bitflag_combo (settings_p, RFM_LS_tstyle);
721     update_bitflag_entry (settings_p, RFM_LS_width);
722 #endif
723 
724     gchar *shred_bin = g_find_program_in_path("shred");
725     if (shred_bin) {
726 	update_bitflag_combo (settings_p, RFM_SHRED_iterations);
727 	update_bitflag_combo (settings_p, RFM_SHRED_size);
728 	g_free(shred_bin);
729     }
730 
731 }
732 
733 GtkWidget *toggle_button[RFM_OPTIONS];
734 static void
set_option_buttons(settings_t * settings_p)735 set_option_buttons ( settings_t *settings_p) {
736 
737     int i;
738     settings_p->disable_options = TRUE;
739 
740     set_bit_toggles(settings_p, "ls_box", LS_OPTIONS,RFM_LS_FLAGS);
741     set_bit_toggles(settings_p, "cp_box", CP_OPTIONS, RFM_CP_FLAGS);
742     set_bit_toggles(settings_p, "mv_box", MV_OPTIONS, RFM_MV_FLAGS);
743     set_bit_toggles(settings_p, "ln_box", LN_OPTIONS, RFM_LN_FLAGS);
744     set_bit_toggles(settings_p, "rm_box", RM_OPTIONS, RFM_RM_FLAGS);
745     gchar *shred_bin = g_find_program_in_path("shred");
746     if (shred_bin) {
747 	set_bit_toggles(settings_p, "shred_box", SHRED_OPTIONS, RFM_SHRED_FLAGS);
748 	g_free(shred_bin);
749     }
750 
751     set_bit_toggles(settings_p, "plugins_box", rfm_get_lite_plugin_options(), RFM_PLUGIN_FLAGS);
752     set_bit_toggles(settings_p, "modules_box", rfm_get_lite_module_options(), RFM_MODULE_FLAGS);
753 
754     update_combo_entry(settings_p);
755 
756     // spin buttons:
757     for (i = RFM_DESKTOP_TOP_MARGIN; i <= RFM_DESKTOP_LEFT_MARGIN; i++){
758 	gdouble value = get_spin_value(i);
759 	gtk_spin_button_set_value (
760 		GTK_SPIN_BUTTON(settings_p->desktop_margin_spinbutton[i-RFM_DESKTOP_TOP_MARGIN]),
761                 value);
762 	update_tree (GTK_TREE_MODEL(settings_p->model), i);
763     }
764     {
765 	gdouble value = rfm_get_preview_image_size();
766 	gtk_spin_button_set_value (
767 		GTK_SPIN_BUTTON(settings_p->preview_size_spinbutton),
768                 value);
769 	update_tree (GTK_TREE_MODEL(settings_p->model), RFM_PREVIEW_IMAGE_SIZE);
770     }
771     for(i = 0; i < RFM_OPTIONS; i++)
772         if(toggle_button[i]) {
773             if(rfm_options[i].value && strlen (rfm_options[i].value)) {
774                 gtk_toggle_button_set_active ((GtkToggleButton *)
775                                               toggle_button[i], TRUE);
776             } else {
777                 gtk_toggle_button_set_active ((GtkToggleButton *)
778                                               toggle_button[i], FALSE);
779             }
780             GtkTreePath *treepath = gtk_tree_path_new_from_indices (i, -1);
781             GtkTreeIter iter;
782             if(gtk_tree_model_get_iter (
783 			GTK_TREE_MODEL(settings_p->model), &iter, treepath))
784 	    {
785                 gtk_list_store_set (settings_p->model, &iter,
786 			COLUMN_VALUE, g_strdup (rfm_options[i].value),
787 			COLUMN_EDITABLE, TRUE, -1);
788             }
789             gtk_tree_path_free (treepath);
790         }
791     update_combo (GTK_COMBO_BOX(settings_p->fontsize_box), RFM_FIXED_FONT_SIZE, TRUE);
792     update_combo (GTK_COMBO_BOX(settings_p->vfontsize_box), RFM_VARIABLE_FONT_SIZE, TRUE);
793     update_combo (GTK_COMBO_BOX(settings_p->fontfamily_box), RFM_FIXED_FONT_FAMILY, TRUE);
794     update_combo (GTK_COMBO_BOX(settings_p->vfontfamily_box), RFM_VARIABLE_FONT_FAMILY, TRUE);
795     update_combo (GTK_COMBO_BOX(settings_p->iconsize_box), RFM_DEFAULT_ICON_SIZE, TRUE);
796     update_combo (GTK_COMBO_BOX(settings_p->terminal_box), TERMINAL_CMD, FALSE);
797     update_combo (GTK_COMBO_BOX(settings_p->editor_box), EDITOR, FALSE);
798     if(getenv ("RFM_DESKTOP_DIR") && strlen (getenv ("RFM_DESKTOP_DIR"))) {
799 	COMMENT("set_option_buttons: setting %s\n",getenv ("RFM_DESKTOP_DIR"));
800         gtk_entry_set_text (GTK_ENTRY (settings_p->desktopdir_entry),
801 		getenv ("RFM_DESKTOP_DIR"));
802     }
803     if(getenv ("RFM_DESKTOP_IMAGE") && strlen (getenv ("RFM_DESKTOP_IMAGE"))) {
804         gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (settings_p->desktopimage_button),
805 		getenv ("RFM_DESKTOP_IMAGE"));
806     }
807     if(getenv ("RFM_DESKTOP_COLOR") && strlen (getenv ("RFM_DESKTOP_COLOR"))) {
808 #if GTK_MAJOR_VERSION==3 && GTK_MINOR_VERSION>=4
809         GdkRGBA color;
810         if(gdk_rgba_parse (&color, getenv ("RFM_DESKTOP_COLOR") )) {
811 	    gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(settings_p->desktopcolor_button), &color);
812         }
813 
814 #else
815         GdkColor color;
816         if(gdk_color_parse (getenv ("RFM_DESKTOP_COLOR"), &color)) {
817             gtk_color_button_set_color (
818 		    GTK_COLOR_BUTTON(settings_p->desktopcolor_button), &color);
819         }
820 #endif
821     }
822     if(getenv ("RFM_ICONVIEW_COLOR") && strlen (getenv ("RFM_ICONVIEW_COLOR")))
823     {
824 #if GTK_MAJOR_VERSION==3 && GTK_MINOR_VERSION>=4
825         GdkRGBA color;
826         if(gdk_rgba_parse (&color, getenv ("RFM_ICONVIEW_COLOR") )) {
827 	    gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(settings_p->iconviewcolor_button), &color);
828         }
829 
830 #else
831         GdkColor color;
832         if(gdk_color_parse (getenv ("RFM_ICONVIEW_COLOR"), &color)) {
833             gtk_color_button_set_color (
834 		    GTK_COLOR_BUTTON(settings_p->desktopcolor_button), &color);
835         }
836 #endif
837     }
838     update_tree (GTK_TREE_MODEL(settings_p->model), VERSION_CONTROL);
839 
840 #ifdef GNU_CP
841 
842     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_LS_FLAGS);
843     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_CP_FLAGS);
844     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_MV_FLAGS);
845     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_LN_FLAGS);
846     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_RM_FLAGS);
847     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_SHRED_FLAGS);
848     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_PLUGIN_FLAGS);
849     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_MODULE_FLAGS);
850 
851     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_CP_backup);
852     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_CP_preserve);
853     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_CP_no_preserve);
854     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_CP_reflink);
855     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_CP_sparse);
856     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_CP_suffix);
857 #endif
858 
859 #ifdef GNU_MV
860     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_MV_backup);
861     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_MV_suffix);
862 #endif
863 
864 #ifdef GNU_LN
865     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_LN_backup);
866     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_LN_suffix);
867 #endif
868 
869 #ifdef GNU_RM
870     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_RM_interactive);
871 #endif
872 
873 #ifdef GNU_LS
874     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_LS_ignore);
875     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_LS_tabsize);
876     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_LS_blocksize);
877     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_LS_format);
878     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_LS_hide);
879     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_LS_istyle);
880     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_LS_qstyle);
881     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_LS_sort);
882     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_LS_time);
883     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_LS_tstyle);
884     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_LS_width);
885 #endif
886 
887     shred_bin = g_find_program_in_path("shred");
888     if (shred_bin) {
889 	update_tree (GTK_TREE_MODEL(settings_p->model), RFM_SHRED_iterations);
890 	update_tree (GTK_TREE_MODEL(settings_p->model), RFM_SHRED_size);
891 	g_free(shred_bin);
892     }
893 
894 
895 
896     update_tree (GTK_TREE_MODEL(settings_p->model),RFM_FIXED_FONT_SIZE );
897     update_tree (GTK_TREE_MODEL(settings_p->model),RFM_VARIABLE_FONT_SIZE );
898     update_tree (GTK_TREE_MODEL(settings_p->model),RFM_FIXED_FONT_FAMILY );
899     update_tree (GTK_TREE_MODEL(settings_p->model),RFM_VARIABLE_FONT_FAMILY );
900     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_DEFAULT_ICON_SIZE);
901     update_tree (GTK_TREE_MODEL(settings_p->model), TERMINAL_CMD);
902     update_tree (GTK_TREE_MODEL(settings_p->model), EDITOR);
903     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_DESKTOP_DIR);
904     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_DESKTOP_IMAGE);
905     update_tree (GTK_TREE_MODEL(settings_p->model), RFM_DESKTOP_COLOR);
906 
907 
908 
909     settings_p->disable_options = FALSE;
910 
911 }
912 
913 
914 
915 static void
option_toggled(GtkToggleButton * togglebutton,gpointer user_data)916 option_toggled (GtkToggleButton * togglebutton, gpointer user_data) {
917     NOOP(stderr, "at option_toggled...\n");
918     settings_t *settings_p=g_object_get_data(G_OBJECT(togglebutton), "settings_p");
919     if(settings_p->disable_options) return;
920     gint i = GPOINTER_TO_INT(user_data);
921     NOOP(stderr, "at option_toggled...%d\n", i);
922 
923     if(rfm_options[i].value) {
924         g_free (rfm_options[i].value);
925     }
926 
927     if (i==RFM_USE_GTK_ICON_THEME) {
928         GtkSettings *settings = gtk_settings_get_default();
929          g_object_get( G_OBJECT(settings),
930                 "gtk-icon-theme-name", &(rfm_options[i].value),
931                 NULL);
932          rfm_show_text(settings_p->widgets_p);
933         rfm_diagnostics(settings_p->widgets_p, "xffm/stock_dialog-info", NULL);
934         rfm_diagnostics(settings_p->widgets_p, "xffm_tag/stderr", _("Please restart application for full changes to take effect"), ".\n ", NULL);
935     }
936 
937     if(gtk_toggle_button_get_active (togglebutton)) {
938 	if (i==RFM_USE_GTK_ICON_THEME) {
939 	    GtkSettings *settings = gtk_settings_get_default();
940 	     g_object_get( G_OBJECT(settings),
941 		    "gtk-icon-theme-name", &(rfm_options[i].value),
942 		    NULL);
943             rfm_diagnostics(settings_p->widgets_p, "xffm/stock_dialog-info", NULL);
944             rfm_diagnostics(settings_p->widgets_p, "xffm_tag/stderr", _("Please restart application for full changes to take effect"), ".\n ", NULL);
945 #if 0
946 	     // First we zap the thumbnail directory
947 	     // (composite icons are thumbnailed cached)
948 	     gchar *thumbnails = g_build_path(RFM_THUMBNAIL_DIR,NULL);
949 	     pid_t pid = fork();
950 	     if (!pid){
951 		 gchar *argv[]={"rm", "-rf", thumbnails, NULL};
952 		 execvp(argv[0], argv);
953 		 _exit(123);
954 	     }
955 	     gint status;
956 	     waitpid(pid, &status, 0);
957 #endif
958 	     // This guy should regenerate the cache...
959              // But is already done in rodent-fm
960 	     // rfm_void(RFM_MODULE_DIR,"icons", "create_cache");
961 	}
962 	else {
963 	    rfm_options[i].value = g_strdup ("yes");
964 	}
965     } else {
966         rfm_options[i].value = g_strdup ("");
967     }
968     mcs_manager_set_string (mcs_manager, rfm_options[i].name,
969 	    CHANNEL, rfm_options[i].value);
970     mcs_manager_notify (mcs_manager, CHANNEL);
971     /*write_options(); */
972 
973 }
974 
bit_option_toggled(GtkToggleButton * togglebutton,gpointer * something_here,gpointer data)975 static void bit_option_toggled (GtkToggleButton * togglebutton,
976 #if GTK_MAJOR_VERSION>=3
977 gpointer *something_here,
978 #endif
979 				gpointer data) {
980     settings_t *settings_p=g_object_get_data(G_OBJECT(togglebutton), "settings_p");
981     if(settings_p->disable_options) return;
982 
983     NOOP("notify:active signal...\n");
984 
985     gint i;
986     gint64 new_value = 0;
987     const gchar *box_name = data;
988 
989     GObject *box = g_object_get_data(G_OBJECT(settings_p->dialog), box_name);
990     RfmProgramOptions *options_p = g_object_get_data(box, "options_p");
991     for (i=0;options_p && options_p->option; options_p++,i++){
992    	const gchar *name = options_p->option;
993 	GtkWidget *button = g_object_get_data(box, name);
994 	if (button) {
995 	    if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) new_value |= (ONE64<<i);
996 	}
997     }
998     i = GPOINTER_TO_INT(g_object_get_data(box, "var_name"));
999     if(rfm_options[i].value) {
1000         g_free (rfm_options[i].value);
1001     }
1002     rfm_options[i].value = g_strdup_printf ("0x%llx", (long long)new_value);
1003     NOOP(stderr, "bitflag toggle %s\n", rfm_options[i].value);
1004     mcs_manager_set_string (mcs_manager, rfm_options[i].name,
1005 	    CHANNEL, rfm_options[i].value);
1006     mcs_manager_notify (mcs_manager, CHANNEL);
1007 }
1008 
1009 static void
switch_page(GtkNotebook * notebook,GtkWidget * page,guint page_num,gpointer user_data)1010 switch_page (GtkNotebook * notebook, GtkWidget * page, guint page_num, gpointer user_data) {
1011     settings_t *settings_p=g_object_get_data(G_OBJECT(notebook), "settings_p");
1012     //    if (page_num < )
1013     {
1014         COMMENT("pagenum=%d",page_num);
1015         set_option_buttons (settings_p);
1016 
1017     }
1018 }
1019 
1020 static void
gint_changed(GtkComboBox * combo_box,gint id)1021 gint_changed (GtkComboBox * combo_box, gint id) {
1022     settings_t *settings_p=g_object_get_data(G_OBJECT(combo_box), "settings_p");
1023     if(settings_p->disable_options){
1024         return;
1025     }
1026 #if GTK_MAJOR_VERSION==2 && GTK_MINOR_VERSION<24
1027     gchar *gint_selected_translated = gtk_combo_box_get_active_text (combo_box);
1028 #else
1029     gchar *gint_selected_translated = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(combo_box));
1030 #endif
1031     if (!gint_selected_translated) {
1032 	DBG("gint_changed(): this should never happen\n");
1033 	return;
1034     }
1035     gchar *gint_selected=NULL;
1036     if (strcmp(_("Normal"), gint_selected_translated)==0){
1037 	gint_selected=g_strdup("Normal");
1038     } else
1039     if (strcmp(_("Compact"), gint_selected_translated)==0){
1040 	gint_selected=g_strdup("Compact");
1041     } else
1042     if (strcmp(_("Details"), gint_selected_translated)==0){
1043 	gint_selected=g_strdup("Details");
1044     } else
1045     if (strcmp(_("Big"), gint_selected_translated)==0){
1046 	gint_selected=g_strdup("Big");
1047     } else
1048     if (strcmp(_("Huge"), gint_selected_translated)==0){
1049 	gint_selected=g_strdup("Huge");
1050     } else {
1051 	gint_selected=g_strdup("");
1052     }
1053 
1054     if(rfm_options[id].value){
1055         g_free (rfm_options[id].value);
1056     }
1057     rfm_options[id].value = gint_selected;
1058     COMMENT ("gint_changed:  %s->%s\n", rfm_options[id].name, rfm_options[id].value);
1059 
1060     mcs_manager_set_string (mcs_manager, rfm_options[id].name, CHANNEL, gint_selected);
1061     mcs_manager_notify (mcs_manager, CHANNEL);
1062     rfm_show_text(settings_p->widgets_p);
1063     rfm_diagnostics(settings_p->widgets_p, "xffm/stock_dialog-info", NULL);
1064     rfm_diagnostics(settings_p->widgets_p, "xffm_tag/stderr", _("Please be patient"), ": ",
1065 	    _("Reload All Tabs in All Windows"), ".  ", NULL);
1066     rfm_diagnostics(settings_p->widgets_p, "xffm_tag/blue", _("Default Size"), " --> ", gint_selected_translated, "\n",NULL);
1067     g_free(gint_selected_translated);
1068 }
1069 
1070 static void
path_changed(GtkComboBox * combo_box,gint id)1071 path_changed (GtkComboBox * combo_box, gint id) {
1072     settings_t *settings_p=g_object_get_data(G_OBJECT(combo_box), "settings_p");
1073     if(settings_p->disable_options)
1074         return;
1075 #if GTK_MAJOR_VERSION==2 && GTK_MINOR_VERSION<24
1076     gchar *path_selected = gtk_combo_box_get_active_text (combo_box);
1077 #else
1078     gchar *path_selected = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(combo_box));
1079 #endif
1080     if(!test_command(path_selected)) {
1081         gchar *m = g_strdup_printf ("%s (%s): %s", strerror (ENOEXEC), path_selected,
1082                                     strerror (ENOENT));
1083         rfm_confirm (NULL, GTK_MESSAGE_ERROR, m, NULL, NULL);
1084         g_free (m);
1085         return;
1086     }
1087 
1088     if(rfm_options[id].value)
1089         g_free (rfm_options[id].value);
1090     rfm_options[id].value = path_selected;
1091     COMMENT ("path_changed:  %s->%s\n", rfm_options[id].name, rfm_options[id].value);
1092 
1093     mcs_manager_set_string (mcs_manager, rfm_options[id].name, CHANNEL, path_selected);
1094     mcs_manager_notify (mcs_manager, CHANNEL);
1095 }
1096 
1097 static void
terminal_changed(GtkComboBox * combo_box,gpointer user_data)1098 terminal_changed (GtkComboBox * combo_box, gpointer user_data) {
1099     path_changed (combo_box, TERMINAL_CMD);
1100 }
1101 
1102 static void
editor_changed(GtkComboBox * combo_box,gpointer user_data)1103 editor_changed (GtkComboBox * combo_box, gpointer user_data) {
1104     path_changed (combo_box, EDITOR);
1105 }
1106 
1107 static void
iconsize_changed(GtkComboBox * combo_box,gpointer user_data)1108  iconsize_changed(GtkComboBox * combo_box, gpointer user_data) {
1109      gint_changed (combo_box, RFM_DEFAULT_ICON_SIZE);
1110 }
1111 
1112 static void
fontsize_f(GtkComboBox * combo_box,gpointer user_data,gint item)1113  fontsize_f(GtkComboBox * combo_box, gpointer user_data, gint item) {
1114    settings_t *settings_p=g_object_get_data(G_OBJECT(combo_box), "settings_p");
1115     if(settings_p->disable_options){
1116         return;
1117     }
1118 #if GTK_MAJOR_VERSION==2 && GTK_MINOR_VERSION<24
1119     gchar *selected = gtk_combo_box_get_active_text (combo_box);
1120 #else
1121     gchar *selected = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(combo_box));
1122 #endif
1123     if (!selected) {
1124 	DBG("fontsize_changed(): this should never happen\n");
1125 	return;
1126     }
1127     if(rfm_options[item].value){
1128         g_free (rfm_options[item].value);
1129     }
1130     rfm_options[item].value = selected;
1131     COMMENT ("fontsize_f():  %s->%s\n",
1132 	    rfm_options[item].name,
1133 	    rfm_options[item].value);
1134 
1135     mcs_manager_set_string (mcs_manager,
1136 	    rfm_options[item].name,
1137 	    CHANNEL, selected);
1138     mcs_manager_notify (mcs_manager, CHANNEL);
1139 }
1140 
1141 static void
fontfamily_changed(GtkComboBox * combo_box,gpointer user_data)1142  fontfamily_changed(GtkComboBox * combo_box, gpointer user_data){
1143      fontsize_f(combo_box, user_data, RFM_FIXED_FONT_FAMILY);
1144  }
1145 static void
vfontfamily_changed(GtkComboBox * combo_box,gpointer user_data)1146  vfontfamily_changed(GtkComboBox * combo_box, gpointer user_data){
1147      fontsize_f(combo_box, user_data, RFM_VARIABLE_FONT_FAMILY);
1148  }
1149 static void
vfontsize_changed(GtkComboBox * combo_box,gpointer user_data)1150  vfontsize_changed(GtkComboBox * combo_box, gpointer user_data) {
1151      fontsize_f(combo_box, user_data, RFM_VARIABLE_FONT_SIZE);
1152  }
1153 static void
fontsize_changed(GtkComboBox * combo_box,gpointer user_data)1154  fontsize_changed(GtkComboBox * combo_box, gpointer user_data) {
1155      fontsize_f(combo_box, user_data, RFM_FIXED_FONT_SIZE);
1156  }
1157 
1158 static gboolean
entry_changed(GtkWidget * entry,GdkEvent * event,gpointer data)1159 entry_changed (GtkWidget *entry, GdkEvent  *event, gpointer data){
1160     const gchar *value = gtk_entry_get_text(GTK_ENTRY(entry));
1161     gint i = GPOINTER_TO_INT(data);
1162     if(rfm_options[i].value) g_free (rfm_options[i].value);
1163 
1164     rfm_options[i].value = g_strdup (value);
1165 
1166     mcs_manager_set_string (mcs_manager, rfm_options[i].name, CHANNEL, rfm_options[i].value);
1167     mcs_manager_notify (mcs_manager, CHANNEL);
1168 
1169     rfm_setenv (rfm_options[i].name, rfm_options[i].value, TRUE);
1170 
1171     return FALSE;
1172 }
1173 
1174 static void
combo_changed(GtkComboBox * combo_box,gpointer data)1175 combo_changed (GtkComboBox * combo_box, gpointer data) {
1176     settings_t *settings_p=g_object_get_data(G_OBJECT(combo_box), "settings_p");
1177     if(settings_p->disable_options) return;
1178     gint i = GPOINTER_TO_INT(data);
1179     if(rfm_options[i].value) g_free (rfm_options[i].value);
1180 
1181 #if GTK_MAJOR_VERSION==2 && GTK_MINOR_VERSION<24
1182     rfm_options[i].value =
1183 	g_strdup (gtk_combo_box_get_active_text (combo_box));
1184 #else
1185     rfm_options[i].value =
1186 	g_strdup (gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(combo_box)));
1187 #endif
1188 
1189     mcs_manager_set_string (mcs_manager, rfm_options[i].name, CHANNEL, rfm_options[i].value);
1190     mcs_manager_notify (mcs_manager, CHANNEL);
1191     rfm_setenv (rfm_options[i].name, rfm_options[i].value, TRUE);
1192 }
1193 
1194 static void
deskdir_entry(GtkEntry * entry,gpointer user_data)1195 deskdir_entry (GtkEntry * entry, gpointer user_data) {
1196     settings_t *settings_p=user_data;
1197     if(settings_p->disable_options) return;
1198     const gchar *new_value=gtk_entry_get_text(entry);
1199     if (!new_value) new_value="";
1200     if (strchr(new_value, '/') && new_value[strlen(new_value)-1]=='/') {
1201 	gchar *v=g_strdup(new_value);
1202 	*strrchr(v, '/')=0;
1203 	gtk_entry_set_text(entry, v);
1204 	g_free(v);
1205 	new_value=gtk_entry_get_text(entry);
1206     }
1207 
1208 
1209     if (strcmp(new_value, rfm_options[RFM_DESKTOP_DIR].value)==0){
1210 	return;
1211     }
1212     if(rfm_options[RFM_DESKTOP_DIR].value){
1213         g_free (rfm_options[RFM_DESKTOP_DIR].value);
1214     }
1215     rfm_options[RFM_DESKTOP_DIR].value = g_strdup(new_value);
1216 
1217     COMMENT ("2.file_set:  %s->%s\n", rfm_options[RFM_DESKTOP_DIR].name, rfm_options[RFM_DESKTOP_DIR].value);
1218     mcs_manager_set_string (mcs_manager, rfm_options[RFM_DESKTOP_DIR].name,
1219 	    CHANNEL, rfm_options[RFM_DESKTOP_DIR].value);
1220     mcs_manager_notify (mcs_manager, CHANNEL);
1221 }
1222 
1223 static void
deskdir_filechooser(GtkButton * button,gpointer user_data)1224 deskdir_filechooser (GtkButton * button, gpointer user_data) {
1225     settings_t *settings_p = user_data;
1226     GtkWidget *dialog = gtk_file_chooser_dialog_new (
1227 	    _("Select Folder"),
1228 	    NULL, //parent
1229             GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
1230             _("Cancel"),
1231             GTK_RESPONSE_CANCEL,
1232             _("Open"),
1233             GTK_RESPONSE_ACCEPT,
1234             NULL);
1235     gtk_file_chooser_set_use_preview_label(GTK_FILE_CHOOSER (dialog), FALSE);
1236     gtk_file_chooser_set_preview_widget_active (GTK_FILE_CHOOSER (dialog), FALSE);
1237     // XXX gtk_file_chooser_set_show_hidden isn't working. Gtk bug or what?
1238     gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER (dialog), TRUE);
1239     g_object_set(G_OBJECT(dialog), "show-hidden", TRUE, NULL);
1240 
1241     gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (dialog), rfm_options[RFM_DESKTOP_DIR].value);
1242 
1243     gint     response = rfm_dialog_run_response(dialog);
1244 
1245     if(response == GTK_RESPONSE_ACCEPT) {
1246         gchar *filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
1247         COMMENT ("Got %s\n", filename);
1248 	// if entry changed, set entry
1249 	gtk_entry_set_text(GTK_ENTRY(settings_p->desktopdir_entry), filename);
1250 	// entry activate callback, do your thing
1251 	deskdir_entry (GTK_ENTRY(settings_p->desktopdir_entry), settings_p);
1252         g_free (filename);
1253     }
1254     gtk_widget_destroy (dialog);
1255 
1256 }
1257 
1258 static void
file_set(GtkFileChooserButton * chooser,gpointer user_data)1259 file_set (GtkFileChooserButton * chooser, gpointer user_data) {
1260     settings_t *settings_p=g_object_get_data(G_OBJECT(chooser), "settings_p");
1261     if(settings_p->disable_options)
1262         return;
1263     gint i = GPOINTER_TO_INT(user_data);
1264     gchar *g=gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(chooser));
1265     COMMENT ("1.file_set:  %s->%s (got: %s)\n", rfm_options[i].name, rfm_options[i].value, g);
1266 
1267 
1268     if(rfm_options[i].value){
1269         g_free (rfm_options[i].value);
1270     }
1271     rfm_options[i].value = g;
1272 
1273     COMMENT ("2.file_set:  %s->%s\n", rfm_options[i].name, rfm_options[i].value);
1274     mcs_manager_set_string (mcs_manager, rfm_options[i].name,
1275 	    CHANNEL, rfm_options[i].value);
1276     mcs_manager_notify (mcs_manager, CHANNEL);
1277 }
1278 
1279 static void
value_clear(GtkButton * button,gpointer user_data)1280 value_clear(GtkButton * button, gpointer user_data){
1281     gint i=GPOINTER_TO_INT(user_data);
1282     if(rfm_options[i].value){
1283         g_free (rfm_options[i].value);
1284     }
1285     rfm_options[i].value = g_strdup("");
1286 
1287     COMMENT ("bg_image_clear:  %s->%s\n", rfm_options[i].name, rfm_options[i].value);
1288     mcs_manager_set_string (mcs_manager, rfm_options[i].name,
1289 	    CHANNEL, rfm_options[i].value);
1290     mcs_manager_notify (mcs_manager, CHANNEL);
1291 
1292 }
1293 
1294 static void
color_changed(GtkColorButton * chooser,gpointer user_data)1295 color_changed (GtkColorButton * chooser, gpointer user_data) {
1296     settings_t *settings_p=g_object_get_data(G_OBJECT(chooser), "settings_p");
1297     if(settings_p->disable_options)
1298         return;
1299     int i = (int)((long)user_data);
1300     if(rfm_options[i].value)
1301         g_free (rfm_options[i].value);
1302 #if GTK_MAJOR_VERSION==3
1303     GdkRGBA rgba;
1304     gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(chooser), &rgba);
1305     int red = 65535 * rgba.red;
1306     int green = 65535 * rgba.green;
1307     int blue = 65535 * rgba.blue;
1308     rfm_options[i].value = g_strdup_printf("#%04x%04x%04x",
1309             red, green, blue);
1310 #else
1311     GdkColor color;
1312     gtk_color_button_get_color ((GtkColorButton *) chooser, &color);
1313     rfm_options[i].value = gdk_color_to_string (&color);
1314 #endif
1315     mcs_manager_set_string (mcs_manager, rfm_options[i].name,
1316 	    CHANNEL, rfm_options[i].value);
1317     mcs_manager_notify (mcs_manager, CHANNEL);
1318 }
1319 
1320 
1321 static void
command_help(GtkWidget * button,gpointer data)1322 command_help (GtkWidget * button, gpointer data) {
1323     GtkWidget *dialog=g_object_get_data(G_OBJECT(button), "dialog");
1324     widgets_t *widgets_p=g_object_get_data(G_OBJECT(dialog), "widgets_p");
1325     gchar *argv[]={data, "--help", NULL};
1326     rfm_clear_text (widgets_p);
1327     rfm_show_text (widgets_p);
1328     rfm_thread_run_argv_full (widgets_p, argv, FALSE, NULL, rfm_operate_stdout, NULL, scroll_to_top);
1329     //argv[1] = "--version";
1330     //rfm_thread_run_argv_full (widgets_p, argv, FALSE, NULL, rfm_operate_stdout, NULL, rfm_null_function);
1331 
1332 //    rfm_thread_run_argv_full (widgets_p, argv, FALSE, NULL, rfm_markup_stdout_f, NULL, rfm_null_function);
1333     //rfm_thread_run_argv_with_stderr (widgets_p, argv, FALSE, rfm_dump_output);
1334 }
1335 
1336 
1337 
1338 static void
rtfm(GtkWidget * button,gpointer data)1339 rtfm (GtkWidget * button, gpointer data) {
1340     GtkWidget *dialog=g_object_get_data(G_OBJECT(button), "dialog");
1341     widgets_t *widgets_p=g_object_get_data(G_OBJECT(dialog), "widgets_p");
1342     gchar *argv[]={"man", data, NULL};
1343     rfm_clear_text (widgets_p);
1344     rfm_show_text (widgets_p);
1345     rfm_thread_run_argv_full (widgets_p, argv, FALSE, NULL, rfm_operate_stdout, NULL, scroll_to_top);
1346 //    rfm_thread_run_argv_full (widgets_p, argv, FALSE, NULL, stdout_f2, NULL, rfm_null_function);
1347     //rfm_thread_run_argv_with_stderr (widgets_p, argv, FALSE, rfm_dump_output);
1348 }
1349 // FIXME: these two functions are in xmltree
1350 static gchar *
mod_string(guint mask)1351 mod_string(guint mask){
1352     if (!mask) return NULL;
1353 	gchar *mod=g_strdup("");
1354 	if (mask & GDK_SHIFT_MASK) {
1355 	    gchar *g = g_strconcat (mod,_("Shift"), "+", NULL);
1356 	    g_free(mod);
1357 	    mod = g;
1358 	}
1359 	if (mask & GDK_CONTROL_MASK) {
1360 	    gchar *g = g_strconcat (mod,_("Control"), "+", NULL);
1361 	    g_free(mod);
1362 	    mod = g;
1363 	}
1364 	if (mask & GDK_MOD1_MASK)  {
1365 	     gchar *g = g_strconcat (mod,_("Alt"), "+", NULL);
1366 	    g_free(mod);
1367 	    mod = g;
1368 	}
1369 	if (strlen(mod)==0) {
1370 	    g_free(mod);
1371 	    mod = g_strdup_printf ("0x%x+", mask);
1372 	}
1373 	return mod;
1374 }
key_string(guint keyval)1375 static gchar *key_string(guint keyval){
1376 	gchar *key=NULL;
1377 	if ((keyval > 0x40 && keyval < 0x5b) ||(keyval >0x02f  && keyval < 0x03a)) {
1378 	    key = g_strdup_printf("%c", keyval);
1379 	}
1380 	else if (keyval > 0x60 && keyval < 0x7b) {
1381 	    key = g_strdup_printf("%c", keyval);
1382 	}
1383 	else if (keyval > 0xffbd && keyval < 0xffca) { // function keys f1-f12
1384 	    key = g_strdup_printf("F%d", keyval-0xffbd);
1385 	}
1386 	else { // other keys
1387 	    switch (keyval){
1388 		case GDK_KEY_Home: key = g_strdup(_("Home")); break;
1389 		case GDK_KEY_Left: key = g_strdup(_("Left")); break;
1390 		case GDK_KEY_Up: key = g_strdup(_("Up")); break;
1391 		case GDK_KEY_Right: key = g_strdup(_("Right")); break;
1392 		case GDK_KEY_Down: key = g_strdup(_("Down")); break;
1393 		case GDK_KEY_Page_Up: key = g_strdup(_("Page up")); break;
1394 		case GDK_KEY_Page_Down: key = g_strdup(_("Page down")); break;
1395 		case GDK_KEY_End: key = g_strdup(_("End")); break;
1396 		case GDK_KEY_Begin: key = g_strdup(_("Begin")); break;
1397 		case GDK_KEY_Delete: key = g_strdup(_("Delete")); break;
1398 		case GDK_KEY_Insert: key = g_strdup(_("Insert")); break;
1399 		case GDK_KEY_equal: key = g_strdup(_("Equal")); break;
1400 		case GDK_KEY_plus: key = g_strdup(_("Plus")); break;
1401 		case GDK_KEY_minus: key = g_strdup(_("Minus")); break;
1402 		case GDK_KEY_KP_Add: key = g_strdup(_("Add")); break;
1403 		case GDK_KEY_KP_Subtract: key = g_strdup(_("Subtract")); break;
1404 	    }
1405 	}
1406 	if (!key) key = g_strdup_printf("0x%x", keyval);
1407 	return key;
1408 }
1409 
1410 static void
set_default_keybindings(xmltree_t * xmltree_p)1411 set_default_keybindings (xmltree_t *xmltree_p){
1412 	NOOP(stderr, "keybindings:\n");
1413     RodentCallback *p = (RodentCallback *) rfm_natural(RFM_MODULE_DIR, "callbacks", NULL, "get_menu_callback");
1414     xmltree_item *top_item_p = XMLTREE_get_tag_item(xmltree_p, NULL, "keys");
1415     if (!top_item_p) top_item_p = XMLTREE_tag_item_add(xmltree_p, NULL, "keys");
1416 
1417     if (!p) DBG("unable to get menu_callback_p\n");
1418 
1419     for (; p && p->function_id >= 0; p++){
1420 	NOOP(stderr, "checking: %s\n", p->string);
1421 	gchar *function_id_s = g_strdup_printf("%d", p->function_id);
1422 	gchar *mod=mod_string(p->mask);
1423 	gchar *key=key_string(p->key);
1424 	const gchar *icon = p->icon;
1425 	if (!icon && p->type == CHECKITEM_TYPE)icon = "xffm/emblem_synchronized";
1426 	else if (!icon && p->type == RADIOITEM_TYPE)icon = "xffm/emblem_favorite";
1427 	xmltree_item *Tag_item_p=NULL;
1428 
1429 	GSList *list = XMLTREE_get_tag_item_list(xmltree_p, top_item_p, "keybind");
1430 	GSList *tmp = list;
1431 	gboolean found = FALSE;
1432 	for (;tmp && tmp->data; tmp = tmp->next){
1433 	    Tag_item_p = tmp->data;
1434 	    xmltree_attribute *a = XMLTREE_get_attribute(Tag_item_p, "function_id");
1435 	    const gchar *value = XMLTREE_get_attribute_value(a);
1436 	    if (value && strcasecmp(value, function_id_s)==0){
1437 		found = TRUE;
1438 		break;
1439 	    }
1440 	}
1441 	g_slist_free(list);
1442 	if (found){
1443 	    g_free(function_id_s);
1444 	    // Replace text item with current translation
1445             // add function will add if not present and replace if present.
1446 	    XMLTREE_set_attribute_parent(xmltree_p, Tag_item_p);
1447 	    XMLTREE_attribute_item_add(xmltree_p, "text", _(p->string));
1448 	    continue;
1449 	}
1450 	// Function id not found
1451 
1452 	Tag_item_p = XMLTREE_tag_item_add(xmltree_p, top_item_p, "keybind");
1453 	gchar *key_s = g_strdup_printf("%d", p->key);
1454 	gchar *mask_s = g_strdup_printf("%d", p->mask);
1455 	gchar *sequence = g_strdup_printf("%s%s", (mod)?mod:"", key);
1456 	// This item is just to check validation routine during test runs
1457 	// attribute_item_add(Tag_p, Tag_item_p, "string", p->string, NULL);
1458 	    XMLTREE_set_attribute_parent(xmltree_p, Tag_item_p);
1459 	XMLTREE_attribute_item_add(xmltree_p,  "icon_id", _(p->icon) );
1460 	XMLTREE_attribute_item_add(xmltree_p,  "text", _(p->string) );
1461 	XMLTREE_attribute_item_add(xmltree_p,  "Keybinding", sequence );
1462 	XMLTREE_attribute_item_add(xmltree_p,  "key", key_s );
1463 	XMLTREE_attribute_item_add(xmltree_p,  "mask", mask_s );
1464 	XMLTREE_attribute_item_add(xmltree_p,  "function_id", function_id_s );
1465 	NOOP(stderr, "adding: %s\n", p->string);
1466 	g_free(key);
1467 	g_free(mod);
1468 	g_free(key_s);
1469 	g_free(mask_s);
1470 	g_free(function_id_s);
1471     }
1472 }
1473 
1474 
1475 static void
k_callback(GtkButton * button,gpointer data)1476 k_callback (GtkButton * button, gpointer data) {
1477     void *xmltree = XMLTREE_new();
1478     XMLTREE_set_defaults_function(xmltree, set_default_keybindings, xmltree);
1479     XMLTREE_set_title(xmltree, _("Configuration of keybindings"));
1480 
1481     gchar *xmlfile = g_build_filename(KEYBINDINGS_FILE, NULL);
1482     XMLTREE_set_xml(xmltree, xmlfile);
1483     g_free(xmlfile);
1484 
1485     gchar *schemafile = g_build_filename(KEYBINDINGS_SCHEMA, NULL);
1486     XMLTREE_set_schema(xmltree, schemafile);
1487     g_free(schemafile);
1488 
1489     XMLTREE_set_editable_attribute(xmltree, "Keybinding", XMLTREE_key_type);
1490     XMLTREE_text_activates_top_attribute(xmltree, 1);
1491 
1492     //set_default_keybindings (xmltree);
1493 
1494     XMLTREE_run(xmltree);
1495     XMLTREE_free(xmltree);
1496 
1497 
1498     //rfm_rational(RFM_MODULE_DIR, "xmltree", (void *)button, (void *)data, "xmltree");
1499 }
1500 
1501 
1502 gint
rfm_dialog_run_response(GtkWidget * dialog)1503 rfm_dialog_run_response(GtkWidget *dialog){
1504     gint response = GTK_RESPONSE_NONE;
1505 
1506     // gtk_dialog_run() is thread unfriendly if readlock on population
1507     // is enabled. Hold on read lock may block release of gdk mutex.
1508 
1509     response = gtk_dialog_run (GTK_DIALOG (dialog));
1510 
1511     return response;
1512 }
1513 
1514 void
t_callback(GtkButton * button,gpointer data)1515 t_callback (GtkButton * button, gpointer data) {
1516     gint64 rfm_toolbar = DEFAULT_TOOLBAR_BUTTONS;
1517     const gchar *rfm_toolbar_s = getenv("RFM_TOOLBAR");
1518     if (rfm_toolbar_s && strlen(rfm_toolbar_s)){
1519 	errno = 0;
1520 	rfm_toolbar = strtoll(rfm_toolbar_s, NULL, 16);
1521 	if (errno){
1522 	    DBG("t_callback(): %s\n", strerror(errno));
1523 	    rfm_toolbar = DEFAULT_TOOLBAR_BUTTONS;
1524 	}
1525     }
1526 
1527     gint response = GTK_RESPONSE_NONE;
1528     GtkWidget *dialog = gtk_dialog_new_with_buttons (
1529 	    _("Toolbar Settings"), NULL,
1530 	    GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
1531             _("Cancel"), GTK_RESPONSE_CANCEL,
1532             _("Ok"), GTK_RESPONSE_YES,
1533 	    NULL);
1534     if(!dialog){
1535 	DBG("t_callback(): cannot create dialog\n");
1536         return;
1537     }
1538     gtk_window_set_type_hint(GTK_WINDOW(dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
1539     GtkWidget *box = gtk_dialog_get_content_area (GTK_DIALOG(dialog));
1540     GtkWidget *frame  = gtk_frame_new("");
1541     gtk_container_add(GTK_CONTAINER(box), frame);
1542     gtk_widget_show(frame);
1543     GtkWidget *t_label = gtk_label_new("");
1544     gchar *markup = g_strdup_printf("<b>%s</b>",
1545 	    _("Configure which items should appear in the toolbar(s)."));
1546     gtk_label_set_markup(GTK_LABEL(t_label), markup);
1547     g_free(markup);
1548     gtk_widget_show(t_label);
1549     gtk_frame_set_label_widget(GTK_FRAME(frame),t_label);
1550     gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_NONE);
1551     box = rfm_vbox_new(TRUE, 3);
1552     gtk_container_add(GTK_CONTAINER(frame), box);
1553     gtk_widget_show(box);
1554 
1555     GtkWidget *scrolled_window = gtk_scrolled_window_new  (NULL, NULL);
1556     gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_ETCHED_IN);
1557     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1558     gtk_widget_set_size_request(scrolled_window, -1 , 375);
1559     gtk_box_pack_start (GTK_BOX (box), scrolled_window, TRUE, TRUE, 0);
1560     GtkWidget *content = rfm_vbox_new(TRUE, 3);
1561 #if GTK_MAJOR_VERSION==3 && GTK_MINOR_VERSION>=8
1562     gtk_container_add(GTK_CONTAINER(scrolled_window), content);
1563 
1564 #else
1565     gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window),content);
1566 #endif
1567     gtk_widget_show(scrolled_window);
1568     gtk_widget_show(content);
1569 
1570     GtkWidget *check_button[BUTTON_OVERFLOW_ID];
1571     gint i;
1572     RodentButtonDefinition *button_callback_p =
1573             rodent_get_button_definitions();
1574     for (i=0; i<BUTTON_OVERFLOW_ID; i++){
1575 	const gchar *string = (button_callback_p+i)->callback.string;
1576 	const gchar *icon = (button_callback_p+i)->callback.icon;
1577 	const gchar *text = (button_callback_p+i)->text;
1578 
1579 	GtkWidget *hbox = rfm_hbox_new(FALSE, 2);
1580 	gtk_box_pack_start (GTK_BOX(content), hbox, FALSE, FALSE, 0);
1581 	gtk_widget_show(hbox);
1582 	check_button[i] = gtk_check_button_new();
1583 	gtk_box_pack_start (GTK_BOX(hbox), check_button[i], FALSE, FALSE, 0);
1584 	gtk_widget_show(check_button[i]);
1585 
1586 	if (rfm_toolbar &(ONE64<<(button_callback_p+i)->id)) {
1587 	    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button[i]), TRUE);
1588 	}
1589 
1590 	GdkPixbuf *pb = rfm_get_pixbuf(icon, 18);
1591 	if (pb) {
1592 	    GtkWidget *image = gtk_image_new_from_pixbuf(pb);
1593 	    g_object_unref(pb);
1594 	    gtk_box_pack_start (GTK_BOX(hbox), image, FALSE, FALSE, 0);
1595 	    gtk_widget_show(image);
1596 	}else if (text){
1597 	    GtkWidget *label = gtk_label_new("");
1598 	    gchar *markup = g_strdup_printf("<span foreground=\"black\" background=\"white\" size=\"xx-small\">%s</span>", _(text));
1599 	    gtk_label_set_markup(GTK_LABEL(label), markup);
1600 	    g_free(markup);
1601 	    gtk_widget_show (label);
1602 	    gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
1603 	}
1604 	GtkWidget *label = gtk_label_new(_(string));
1605 	gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
1606 	gtk_widget_show(label);
1607     }
1608     gtk_widget_show_all (dialog);
1609     // This does not work for fvwm2 (shucks)
1610     // gdk_window_set_keep_above(gtk_widget_get_window(dialog), TRUE);
1611     // This works for fvwm2
1612     gtk_window_set_modal (GTK_WINDOW(dialog), TRUE);
1613     gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(settings_dialog));
1614 
1615     response = rfm_dialog_run_response(dialog);
1616 
1617     gtk_widget_hide (dialog);
1618 
1619     if(response == GTK_RESPONSE_YES){
1620 	rfm_toolbar = 0;
1621 	for (i=0; i<BUTTON_OVERFLOW_ID; i++){
1622 	    if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_button[i]))){
1623 		rfm_toolbar |= (ONE64<<(button_callback_p+i)->id);
1624 	    }
1625 	}
1626 
1627 	gchar *rfm_toolbar_v = g_strdup_printf("0x%llx", (long long) rfm_toolbar);
1628 	mcs_set_var("RFM_TOOLBAR", rfm_toolbar_v);
1629 	g_free(rfm_toolbar_v);
1630 	// set environ
1631     }
1632     gtk_widget_destroy (dialog);
1633 
1634     return ;
1635 
1636 }
1637 
1638 static GtkWidget *
label_new(void)1639 label_new (void) {
1640     GtkWidget *label;
1641     label = gtk_label_new ("");
1642     gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1643     return (label);
1644 }
1645 
1646 static void
mk_bit_toggles(settings_t * settings_p,GtkWidget * vbox,const gchar * boxname,gint id,RfmProgramOptions * options_p)1647 mk_bit_toggles(settings_t *settings_p, GtkWidget *vbox,
1648 	const gchar *boxname, gint id, RfmProgramOptions *options_p){
1649 
1650     g_object_set_data(G_OBJECT(settings_p->dialog), boxname, vbox);
1651     g_object_set_data(G_OBJECT(vbox), "var_name", GINT_TO_POINTER(id));
1652     g_object_set_data(G_OBJECT(vbox), "options_p", options_p);
1653 
1654     GtkGrid *grid;
1655 #if GTK_MAJOR_VERSION>=3
1656     grid = GTK_GRID(gtk_grid_new());
1657 #else
1658     grid = GTK_TABLE(gtk_table_new (1, 1, TRUE));
1659 #endif
1660 
1661     gtk_box_pack_start (GTK_BOX(vbox), GTK_WIDGET(grid), TRUE, FALSE, 0);
1662 
1663     gboolean indent = FALSE;
1664     gint row=0;
1665 
1666     if (!options_p) DBG("mk_bit_toggles(%s): options_p is NULL.\n", boxname);
1667     for (;options_p && options_p->option; options_p++){
1668 	if (strcmp(options_p->option,"submodule-indent")==0) {
1669 	    indent = TRUE;
1670 	    continue;
1671 	}
1672 	if (strcmp(options_p->option,"submodule-unindent")==0) {
1673 	    indent = FALSE;
1674 	    continue;
1675 	}
1676 	GtkWidget *button_box = rfm_hbox_new(FALSE, 0);
1677 	const gchar *label = (options_p->text)?options_p->text:options_p->option;
1678 	if (strcmp(options_p->option,"submodule-label")==0){
1679 	    GtkWidget *w = gtk_label_new("");
1680 	    gchar *t = g_strdup_printf("<i>%s:</i>", label);
1681 	    gtk_label_set_markup(GTK_LABEL(w), t);
1682 	    g_free(t);
1683 	    gtk_grid_attach(grid, w, 0, row, 1, 1);
1684 	    row++;
1685 	    continue;
1686 	}
1687 	if (indent){
1688 	    GtkWidget *w = gtk_label_new("   ");
1689 	    gtk_box_pack_start (GTK_BOX(button_box), w, FALSE, FALSE, 0);
1690 	}
1691 	GtkWidget *t_button = rfm_check_button_new ();
1692 
1693 	gtk_widget_set_sensitive(t_button, options_p->sensitive);
1694 	gtk_widget_set_sensitive(button_box, options_p->sensitive);
1695         gtk_box_pack_start (GTK_BOX(button_box), t_button, FALSE, FALSE, 0);
1696 	if (options_p->option && strlen(options_p->option)){
1697 	    GtkWidget *option_text = gtk_label_new("");
1698 	    gchar *markup = g_strdup_printf("<span weight=\"bold\">%s</span>",
1699 		options_p->option);
1700 	    gtk_label_set_markup(GTK_LABEL(option_text), markup);
1701 	    g_free(markup);
1702 	    gtk_box_pack_start (GTK_BOX(button_box), option_text,
1703 		    FALSE, FALSE, 0);
1704 	}
1705 
1706 	g_object_set_data(G_OBJECT(t_button), "settings_p", settings_p);
1707 	const gchar *name = options_p->option;
1708 	g_object_set_data(G_OBJECT(vbox), name, t_button);
1709 
1710 
1711 
1712 #if GTK_MAJOR_VERSION>=3
1713         g_signal_connect (t_button, "notify::active",
1714 		G_CALLBACK (bit_option_toggled), (void *)boxname);
1715 
1716 #else
1717         g_signal_connect (t_button, "toggled",
1718 		G_CALLBACK (bit_option_toggled), (void *)boxname);
1719 #endif
1720 
1721 	gboolean combo_choice = FALSE;
1722 	if (options_p->choices){
1723 	    combo_choice = TRUE;
1724 	    GtkWidget *box = rfm_hbox_new(FALSE,0);
1725 	    GtkWidget *cbox;
1726 	    if (GPOINTER_TO_INT(options_p->choices) == -1) {
1727 		NOOP(stderr, "entry for %s\n", rfm_options[options_p->choice_id].name);
1728 		cbox = gtk_entry_new();
1729 	    } else {
1730 #if GTK_MAJOR_VERSION==2 && GTK_MINOR_VERSION<24
1731 		cbox = gtk_combo_box_new_text ();
1732 #else
1733 		cbox = gtk_combo_box_text_new ();
1734 #endif
1735 	    }
1736 	    gtk_widget_set_sensitive(box, options_p->sensitive);
1737 	    gtk_widget_set_sensitive(cbox, options_p->sensitive);
1738 	    g_object_set_data(G_OBJECT(settings_p->dialog),
1739 		    rfm_options[options_p->choice_id].name, cbox);
1740 	    NOOP(stderr, "set %s box=0x%x\n", rfm_options[options_p->choice_id].name,
1741 		    GPOINTER_TO_INT(cbox));
1742 
1743 	    gchar **p=options_p->choices;
1744 	    gint place = 0;
1745 	    if (GPOINTER_TO_INT(options_p->choices) == -1) {
1746                 environ_t *environ_v = rfm_get_environ();
1747 		if (getenv(environ_v[options_p->sensitive].env_var)) {
1748 		    gtk_entry_set_text(GTK_ENTRY(cbox),
1749 			getenv(environ_v[options_p->sensitive].env_var));
1750 		}
1751 		g_signal_connect (cbox, "key-release-event", G_CALLBACK (entry_changed), GINT_TO_POINTER(options_p->choice_id));
1752 	    } else {
1753 		for (;p && *p; p++){
1754 #if GTK_MAJOR_VERSION==2 && GTK_MINOR_VERSION<24
1755 		    gtk_combo_box_insert_text (GTK_COMBO_BOX(cbox),
1756 			place++, *p);
1757 #else
1758 		    gtk_combo_box_text_insert_text (GTK_COMBO_BOX_TEXT(cbox),
1759 			place++, *p);
1760 #endif
1761 		}
1762 		gtk_combo_box_set_active (GTK_COMBO_BOX(cbox), 0);
1763 		g_signal_connect (cbox, "changed", G_CALLBACK (combo_changed), GINT_TO_POINTER(options_p->choice_id));
1764 	    }
1765 	    g_object_set_data(G_OBJECT(cbox), "settings_p", settings_p);
1766 	    gtk_box_pack_start (GTK_BOX(box), cbox, FALSE, FALSE, 0);
1767 
1768 	    gtk_box_pack_start (GTK_BOX(button_box), box, FALSE, FALSE, 0);
1769 	    gtk_widget_set_sensitive(cbox, options_p->sensitive);
1770 	}
1771 	gtk_grid_attach(grid, button_box, 0, row, 1,1);
1772 
1773 	row++;
1774 	if (options_p->text) {
1775 	    gchar *text =(strstr(options_p->text, "%d"))?
1776 		    g_strdup_printf(_(options_p->text), 3):
1777 		    g_strdup(_(options_p->text));
1778 	    // Let's do some kinky stuff here...
1779 	    gchar **kinky;
1780 
1781 	    // Replace tabs for spaces.
1782 	    gchar *text_p = text;
1783 	    for (; text_p && *text_p; text_p++){
1784 		if (*text_p == '\t') *text_p = ' ';
1785 	    }
1786 	    // collapse extra spaces...
1787 	    if (strstr(text, "  ")){
1788 		kinky = g_strsplit(text, " ", -1);
1789 		gchar **k = kinky;
1790 		gchar *collapsed = g_strdup("");
1791 		for (;k && *k;k++) if (strlen(*k)) {
1792 		    NOOP(stderr, "concating \"%s\"\n", *k);
1793 		    gchar *g = g_strconcat(collapsed, " ", *k, NULL);
1794 		    g_free(collapsed);
1795 		    collapsed = g;
1796 		}
1797 		g_strfreev(kinky);
1798 		g_free(text);
1799 		text = collapsed;
1800 	    }
1801 
1802 	    //
1803 	    // 1. Split on \n
1804 	    if (strchr(text, '\n')){
1805 		kinky = g_strsplit(text, "\n", -1);
1806 	    } else {
1807 		kinky = (gchar **)malloc(sizeof(gchar *)*2);
1808 		if (!kinky) g_error("malloc: %s\n", strerror(errno));
1809 		memset(kinky, 0, sizeof(gchar *) *2);
1810 		kinky[0] = g_strdup(text);
1811 
1812 	    }
1813 
1814 
1815 	    gchar **k = kinky;
1816 	    //if (options_p->sensitive)
1817 	    for (;k && *k;k++){
1818 		GtkWidget *w = label_new();
1819 		gtk_widget_set_sensitive(w, options_p->sensitive);
1820 		const gchar *spacing =" ";
1821 		gchar *markup;
1822 		if (combo_choice) spacing = "           ";
1823 		if (k != kinky) {
1824 		    spacing = "           ";
1825 		    markup = g_strdup_printf("%s<span style=\"italic\">%s</span>", spacing, *k);
1826 		} else if (options_p->option && strlen(options_p->option)) {
1827 		    markup = g_strdup_printf("%s<span  style=\"italic\">%s</span>", spacing, *k);
1828 
1829 		} else {
1830 		    markup = g_strdup_printf("<span weight=\"bold\">%s</span>", *k);
1831 		}
1832 
1833 		gtk_label_set_markup(GTK_LABEL(w), markup);
1834 		g_free(markup);
1835 		if (combo_choice){
1836 		    gtk_grid_attach(grid, w, 0, row, 1,1);
1837 		    row++;
1838 		} else if (k == kinky) {
1839 		    gtk_box_pack_start (GTK_BOX(button_box), w,
1840 			    FALSE, FALSE, 0);
1841 
1842 		} else {
1843 		    gtk_grid_attach(grid, w, 0, row, 1,1);
1844 		    row++;
1845 		}
1846 
1847 	    }
1848 	    g_free(text);
1849 	    g_strfreev(kinky);
1850 	} else {
1851 	    row++;
1852 	}
1853 	gtk_widget_set_sensitive(button_box, options_p->sensitive);
1854     }
1855 }
1856 
1857 
1858 static void
subtitle(GtkWidget * parent,GtkWidget * dialog,const gchar * text,gchar * button_command)1859 subtitle(GtkWidget *parent, GtkWidget *dialog, const gchar *text, gchar *button_command){
1860 
1861     GtkWidget *label_box=rfm_hbox_new(FALSE, 0);
1862     gtk_box_pack_start ((GtkBox *) parent, label_box, FALSE, FALSE, 0);
1863     gchar *tab_text = g_strdup_printf ("<b><i>%s</i></b>   ", text);
1864     GtkWidget *label = gtk_label_new (tab_text);
1865     gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
1866     //gtk_frame_set_label_widget (GTK_FRAME (framebox), label);
1867     gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1868     gtk_box_pack_start ((GtkBox *) label_box, label, FALSE, FALSE, 0);
1869     if (button_command){
1870 	GtkWidget *button;
1871         gboolean do_help_button=FALSE;
1872 #ifdef GNU_LS
1873         if (strcmp(button_command, "ls")==0) do_help_button=TRUE;
1874 #endif
1875 
1876 #ifdef GNU_CP
1877         if (strcmp(button_command, "cp")==0) do_help_button=TRUE;
1878 #endif
1879 
1880 #ifdef GNU_LN
1881         if (strcmp(button_command, "ln")==0) do_help_button=TRUE;
1882 #endif
1883 
1884 #ifdef GNU_MV
1885         if (strcmp(button_command, "mv")==0) do_help_button=TRUE;
1886 #endif
1887 
1888 #ifdef GNU_RM
1889         if (strcmp(button_command, "rm")==0) do_help_button=TRUE;
1890 #endif
1891         if (strcmp(button_command, "shred")==0) do_help_button=TRUE;
1892 
1893         if (do_help_button) {
1894             button = rfm_dialog_button ("xffm/stock_dialog-question", NULL);
1895             g_object_set_data(G_OBJECT(button), "dialog", dialog);
1896             g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (command_help), button_command);
1897             gchar *g=g_strdup_printf("%s --help", button_command);
1898 	    rfm_add_custom_tooltip(button, NULL, g);
1899             g_free(g);
1900             gtk_box_pack_start ((GtkBox *) label_box, button, FALSE, FALSE, 0);
1901             gtk_widget_show(button);
1902         } else {
1903 	    button = rfm_dialog_button ("xffm/stock_dialog-question", NULL);
1904 	    g_object_set_data(G_OBJECT(button), "dialog", dialog);
1905 	    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (rtfm), button_command);
1906 	    gchar *g=g_strdup_printf("man %s", button_command);
1907 	    rfm_add_custom_tooltip(button, NULL, g);
1908 	    g_free(g);
1909 	    gtk_box_pack_start ((GtkBox *) label_box, button, FALSE, FALSE, 0);
1910 	    gtk_widget_show(button);
1911 	}
1912     }
1913     gtk_widget_show_all (label_box);
1914     g_free(tab_text);
1915 }
1916 
1917 static GtkWidget *
create_tab(GtkNotebook * notebook,char * label,char * frame_label)1918 create_tab (GtkNotebook * notebook, char *label, char *frame_label) {
1919     GtkWidget *tab_label1 = gtk_label_new (label);
1920     gtk_widget_show (tab_label1);
1921     GtkWidget *page_box = rfm_vbox_new (FALSE, 6);
1922     GtkWidget *sw = gtk_scrolled_window_new (NULL, NULL);
1923     gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_ETCHED_IN);
1924     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
1925 	    GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1926     gtk_widget_show (sw);
1927     if(gtk_notebook_append_page (notebook, sw, tab_label1) < 0) {
1928         g_error ("Cannot append page to gtk_notebook!");
1929     }
1930 
1931 #if GTK_MAJOR_VERSION==3 && GTK_MINOR_VERSION>=8
1932     gtk_container_add(GTK_CONTAINER(sw), page_box);
1933 
1934 #else
1935     gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw),page_box);
1936 #endif
1937     gtk_widget_show (page_box);
1938 
1939     // deprecated: add_spacer (GTK_BOX (page_box));
1940 
1941     GtkWidget *header = gtk_label_new ("");
1942     gchar *g = g_strdup_printf("<b>%s</b>", frame_label);
1943     gtk_label_set_markup (GTK_LABEL(header), g);
1944     g_free(g);
1945     GtkWidget *hbox = rfm_hbox_new(FALSE, 3);
1946     gtk_box_pack_start (GTK_BOX (page_box), hbox, FALSE, FALSE, 0);
1947     gtk_box_pack_start (GTK_BOX (hbox), header, FALSE, FALSE, 0);
1948     GtkWidget *vbox = rfm_vbox_new (FALSE, 2);
1949     gtk_box_pack_start (GTK_BOX (page_box), vbox, FALSE, FALSE, 0);
1950 
1951     gtk_widget_show (vbox);
1952     g_object_set_data(G_OBJECT(vbox), "page", sw);
1953 #if 0
1954     GtkWidget *frame = xfce_framebox_new (frame_label, TRUE);
1955     GtkWidget *frame = rfm_vbox_new (frame_label, TRUE);
1956     gtk_widget_show (frame);
1957     gtk_box_pack_start (GTK_BOX (page_box), frame, FALSE, FALSE, 0);
1958 
1959     GtkWidget *vbox = rfm_vbox_new (FALSE, 6);
1960     xfce_framebox_add (XFCE_FRAMEBOX (frame), vbox);
1961 #endif
1962     return vbox;
1963 
1964 }
1965 
1966 static GtkWidget *
make_gint_combo_box(GtkWidget * vbox,gint id,const gchar ** options,void * callback)1967 make_gint_combo_box (GtkWidget * vbox, gint id, const gchar **options, void *callback) {
1968 #if GTK_MAJOR_VERSION==2 && GTK_MINOR_VERSION<24
1969     // this is deprecated...
1970     GtkWidget *box = gtk_combo_box_new_text ();
1971 #else
1972     GtkWidget *box = gtk_combo_box_text_new ();
1973 #endif
1974     int place = 0;
1975     GtkWidget *hbox = rfm_hbox_new (FALSE, 6);
1976     gchar *text;
1977     environ_t *environ_v = rfm_get_environ();
1978     if (id == RFM_DEFAULT_ICON_SIZE) {
1979 	text = g_strdup_printf("%s (%s)",
1980 		_(environ_v[id].env_text), _("default"));
1981     } else {
1982 	text = g_strdup(_(environ_v[id].env_text));
1983     }
1984     GtkWidget *label = gtk_label_new (text);
1985     g_free(text);
1986     gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
1987     GSList *list=NULL;
1988 
1989     const gchar **p=options;
1990     if(getenv (environ_v[id].env_var)
1991        && strlen (getenv (environ_v[id].env_var))) {
1992 	for (;p && *p; p++){
1993 	    if (strcmp(*p, environ_v[id].env_var)==0) {
1994 #if GTK_MAJOR_VERSION==2 && GTK_MINOR_VERSION<24
1995 		gtk_combo_box_insert_text (GTK_COMBO_BOX(box),
1996 			place++, _(environ_v[id].env_var));
1997 #else
1998 		 gtk_combo_box_text_insert_text (GTK_COMBO_BOX_TEXT(box),
1999 			place++, _(environ_v[id].env_var));
2000 #endif
2001 		list=g_slist_prepend(list, _(environ_v[id].env_var));
2002 		break;
2003 	    }
2004 	}
2005 
2006     }
2007 
2008     for(p = options; *p; p++) {
2009        if(place == 0) {
2010 	    /* default values. Null values are not functionally acceptable */
2011 #if GTK_MAJOR_VERSION==2 && GTK_MINOR_VERSION<24
2012 	    gtk_combo_box_insert_text (GTK_COMBO_BOX(box), place++, _(*p));
2013 #else
2014 	    gtk_combo_box_text_insert_text (GTK_COMBO_BOX_TEXT(box), place++, _(*p));
2015 #endif
2016 	    list=g_slist_prepend(list, (void *)_(*p));
2017 	    if(!rfm_options[id].value || !strlen (rfm_options[id].value)) {
2018 		g_free (rfm_options[id].value);
2019 		rfm_options[id].value = g_strdup (_(*p));
2020 		mcs_manager_set_string (mcs_manager, rfm_options[id].name,
2021 			CHANNEL, *p);
2022 		mcs_manager_notify (mcs_manager, CHANNEL);
2023 	    }
2024 	} else {
2025 	    list=g_slist_append(list, (void *)_(*p));
2026 #if GTK_MAJOR_VERSION==2 && GTK_MINOR_VERSION<24
2027 	    gtk_combo_box_append_text (GTK_COMBO_BOX(box), _(*p));
2028 #else
2029 	    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(box), _(*p));
2030 #endif
2031 	}
2032     }
2033 
2034     g_object_set_data(G_OBJECT(box), "list", list);
2035     gtk_combo_box_set_active (GTK_COMBO_BOX(box), 0);
2036     gtk_box_pack_start (GTK_BOX(hbox), box, FALSE, FALSE, 0);
2037     gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
2038     g_signal_connect (box, "changed", G_CALLBACK (callback), NULL);
2039     return box;
2040 }
2041 
2042 static GtkWidget *
make_exec_combo_box(GtkWidget * vbox,gint id,const gchar ** options,void * callback)2043 make_exec_combo_box (GtkWidget * vbox, gint id, const gchar **options, void *callback) {
2044 #if GTK_MAJOR_VERSION==2 && GTK_MINOR_VERSION<24
2045     GtkWidget *box = gtk_combo_box_new_text ();
2046 #else
2047     GtkWidget *box = gtk_combo_box_text_new ();
2048 #endif
2049     GtkWidget *hbox = rfm_hbox_new (FALSE, 6);
2050     environ_t *environ_v = rfm_get_environ();
2051     GtkWidget *label = gtk_label_new (_(environ_v[id].env_text));
2052     gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
2053     GSList *list=NULL;
2054     gint place=0;
2055 
2056     if(getenv (environ_v[id].env_var)
2057        && strlen (getenv (environ_v[id].env_var))) {
2058         if(test_command(getenv (environ_v[id].env_var)) ){
2059 	    gchar *path = g_strdup (getenv (environ_v[id].env_var));
2060 #if GTK_MAJOR_VERSION==2 && GTK_MINOR_VERSION<24
2061             gtk_combo_box_insert_text (GTK_COMBO_BOX(box), place++, path);
2062 #else
2063             gtk_combo_box_text_insert_text (GTK_COMBO_BOX_TEXT(box), place++, path);
2064 #endif
2065 	    list=g_slist_prepend(list, path);
2066 	}
2067     }
2068     const gchar **p;
2069     for(p = options; *p; p++) {
2070         if(test_command(*p)) {
2071             if(place){
2072 		list=g_slist_append(list, (void *)*p);
2073 #if GTK_MAJOR_VERSION==2 && GTK_MINOR_VERSION<24
2074                 gtk_combo_box_append_text (GTK_COMBO_BOX(box), (void *)*p);
2075 
2076 #else
2077                 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(box), (void *)*p);
2078 #endif
2079 	    } else {
2080 		list=g_slist_prepend(list, (void *)*p);
2081 #if GTK_MAJOR_VERSION==2 && GTK_MINOR_VERSION<24
2082                 gtk_combo_box_insert_text (GTK_COMBO_BOX(box), place++, *p);
2083 #else
2084                 gtk_combo_box_text_insert_text (GTK_COMBO_BOX_TEXT(box), place++, *p);
2085 #endif
2086                 if(!rfm_options[id].value || !strlen (rfm_options[id].value)) {
2087                     g_free (rfm_options[id].value);
2088 		}
2089                 rfm_options[id].value = g_strdup (*p);
2090                 mcs_manager_set_string (mcs_manager, rfm_options[id].name,
2091 			    CHANNEL, *p);
2092                 mcs_manager_notify (mcs_manager, CHANNEL);
2093             }
2094         }
2095     }
2096 
2097     g_object_set_data(G_OBJECT(box), "list", list);
2098     gtk_combo_box_set_active (GTK_COMBO_BOX(box), 0);
2099     gtk_box_pack_start (GTK_BOX(hbox), box, FALSE, FALSE, 0);
2100     gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
2101     g_signal_connect (box, "changed", G_CALLBACK (callback), NULL);
2102     return box;
2103 }
2104 
2105 static GtkWidget *
make_string_combo_box(gchar ** options,const gchar * id,void * data)2106 make_string_combo_box (gchar **options, const gchar *id, void *data) {
2107     GtkWidget *combo_box;
2108     gchar **p=options;
2109     gboolean first=TRUE;
2110 #if GTK_MAJOR_VERSION==2 && GTK_MINOR_VERSION<24
2111     combo_box = gtk_combo_box_new_text ();
2112     for (;p && *p; p++){
2113 	if (first){
2114 	    gtk_combo_box_insert_text (GTK_COMBO_BOX(combo_box), 0, *p);
2115 	    first = FALSE;
2116 	} else	gtk_combo_box_append_text (GTK_COMBO_BOX(combo_box), *p);
2117     }
2118 #else
2119     combo_box = gtk_combo_box_text_new ();
2120     for (;p && *p; p++){
2121 	if (first){
2122 	    gtk_combo_box_text_insert_text (GTK_COMBO_BOX_TEXT(combo_box), 0, *p);
2123 	    first = FALSE;
2124 	} else	gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combo_box), *p);
2125     }
2126 #endif
2127     g_object_set_data(G_OBJECT(combo_box), id, data);
2128 
2129     return combo_box;
2130 }
2131 
2132 static GtkWidget *
make_file_chooser_button(int id,gboolean is_folder,GtkWidget * hbox)2133 make_file_chooser_button (int id, gboolean is_folder, GtkWidget * hbox) {
2134     environ_t *environ_v = rfm_get_environ();
2135     GtkWidget *label = gtk_label_new (_(environ_v[id].env_text));
2136     gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
2137     GtkWidget *button;
2138     if(is_folder) {
2139         button = gtk_file_chooser_button_new (_("Select a folder"),
2140 		GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
2141     } else {
2142         button = gtk_file_chooser_button_new (_("Select Files..."),
2143 		GTK_FILE_CHOOSER_ACTION_OPEN);
2144     }
2145 
2146 
2147     if (rfm_options[id].value &&
2148 		rfm_g_file_test(rfm_options[id].value, G_FILE_TEST_EXISTS)){
2149 	COMMENT(stderr, "1.make_file_chooser_button: setting %s->%s\n",rfm_options[id].name,rfm_options[id].value);
2150 	if (rfm_g_file_test(rfm_options[id].value, G_FILE_TEST_IS_DIR)){
2151 	    gtk_file_chooser_set_current_folder (
2152 		GTK_FILE_CHOOSER (button), rfm_options[id].value);
2153 	} else {
2154 	    gtk_file_chooser_set_filename (
2155 		GTK_FILE_CHOOSER (button), rfm_options[id].value);
2156 	}
2157     }
2158     gtk_file_chooser_button_set_title ((GtkFileChooserButton *) (button),
2159 	    (const gchar *)_(environ_v[id].env_text));
2160     gtk_file_chooser_button_set_width_chars ((GtkFileChooserButton *) button, 15);
2161     gtk_box_pack_start (GTK_BOX(hbox), button, FALSE, FALSE, 0);
2162 
2163 
2164 
2165     g_signal_connect (button,
2166 	    "file-set", G_CALLBACK (file_set), GINT_TO_POINTER(id));
2167     return button;
2168 }
2169 static void
sit_message(const gchar * file)2170 sit_message(const gchar *file){
2171     widgets_t *widgets_p = rfm_get_widget("widgets_p");
2172     rfm_diagnostics(widgets_p, "xffm/stock_dialog-info",NULL);
2173     gchar *text = g_strdup_printf(_("Creating a new file (%s)"), file);
2174     rfm_diagnostics(widgets_p, "xffm_tag/blue", text, "\n",NULL);
2175     g_free(text);
2176 }
2177 
2178 static GtkWidget *
get_example_image(void)2179 get_example_image(void){
2180     GtkWidget *image=NULL;
2181     GdkPixbuf *pixbuf;
2182     GtkIconTheme *icon_theme = gtk_icon_theme_get_default ();
2183     gchar *example = NULL;
2184     if (icon_theme) example = gtk_icon_theme_get_example_icon_name(icon_theme);
2185     GtkIconInfo *icon_info = NULL;
2186     if (example && icon_theme) {
2187 	icon_info = gtk_icon_theme_lookup_icon(icon_theme, example, SIZE_DIALOG, 0);
2188     }
2189 
2190     if (icon_info){
2191 	const gchar *path = gtk_icon_info_get_filename(icon_info);
2192 	pixbuf=rfm_get_pixbuf(path, SIZE_DIALOG);
2193     } else {
2194 	pixbuf=rfm_get_pixbuf("xffm/emblem_unreadable", SIZE_DIALOG);
2195     }
2196 #if GTK_MAJOR_VERSION==3 && GTK_MINOR_VERSION>=8
2197     if (icon_info)g_object_unref(G_OBJECT(icon_info));
2198 #else
2199     if (icon_info) gtk_icon_info_free (icon_info);
2200 #endif
2201 
2202     if (pixbuf) {
2203 	image=gtk_image_new_from_pixbuf(pixbuf);
2204     }
2205     if (image) {
2206 	rfm_add_custom_tooltip(image, pixbuf, _("example"));
2207     }
2208 
2209     return image;
2210 }
2211 
2212 static void
update_icon_example(GtkWidget * image_box)2213 update_icon_example(GtkWidget *image_box){
2214     if (!image_box){
2215 	DBG("update_icon_example(): image_box should not be NULL\n");
2216 	return;
2217     }
2218     GList *list = gtk_container_get_children(GTK_CONTAINER(image_box));
2219     if (list) {
2220 	GtkWidget *image = list->data;
2221 	if (image && GTK_IS_WIDGET(image)) {
2222 	    gtk_container_remove(GTK_CONTAINER(image_box), image);
2223 	}
2224     }
2225     g_list_free(list);
2226     GtkWidget *image = get_example_image();
2227     gtk_container_add (GTK_CONTAINER(image_box), image);
2228     gtk_widget_show(image);
2229 }
2230 
2231 #if GTK_MAJOR_VERSION>=3
2232 static void
write_keyfile(GKeyFile * key_file,const gchar * file)2233 write_keyfile(GKeyFile *key_file, const gchar *file){
2234     TRACE( "group_options_write_keyfile: %s\n", file);
2235     // Write out key_file:
2236     gsize file_length;
2237     gchar *file_string = g_key_file_to_data (key_file, &file_length, NULL);
2238     gchar *config_directory = g_path_get_dirname(file);
2239     if (!g_file_test(config_directory, G_FILE_TEST_IS_DIR)){
2240 	TRACE( "creating directory %s\n", config_directory);
2241 	g_mkdir_with_parents(config_directory, 0700);
2242     }
2243     g_free(config_directory);
2244     gint fd = creat(file, O_WRONLY | S_IRWXU);
2245     if (fd >= 0){
2246 	if (write(fd, file_string, file_length) < 0){
2247 	    DBG("write_keyfile(): cannot write to %s: %s\n", file, strerror(errno));
2248 	}
2249 	close(fd);
2250     } else {
2251 	DBG("write_keyfile(): cannot open %s for write: %s\n", file, strerror(errno));
2252     }
2253 }
2254 
2255 #define GTK3_SETTINGS_KEYFILE g_get_user_config_dir(),"gtk-3.0","settings.ini"
2256 static void
save_icon_theme(GtkComboBox * combo_box,gpointer data)2257 save_icon_theme(GtkComboBox *combo_box, gpointer data){
2258     gchar *themename =
2259 	gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(combo_box));// 2.24
2260 
2261     GtkSettings *settings = gtk_settings_get_default();
2262     g_object_set( G_OBJECT(settings),
2263 		    "gtk-icon-theme-name", themename,
2264 		    NULL);
2265     GKeyFile *key_file = g_key_file_new();
2266     gchar *file = g_build_filename(GTK3_SETTINGS_KEYFILE, NULL);
2267     gboolean loaded = g_key_file_load_from_file(key_file, file,
2268 	    G_KEY_FILE_KEEP_COMMENTS |  G_KEY_FILE_KEEP_TRANSLATIONS, NULL);
2269     if (!loaded) sit_message(file);
2270     settings_t *settings_p=g_object_get_data(G_OBJECT(combo_box), "settings_p");
2271     update_icon_example(g_object_get_data(G_OBJECT(combo_box), "image_box"));
2272 
2273     g_key_file_set_string (key_file, "Settings", "gtk-icon-theme-name", themename);
2274     write_keyfile(key_file, file);
2275     g_free(file);
2276     g_free(themename);
2277     GtkToggleButton *togglebutton = data;
2278     NOOP(stderr, "toggle state is %d\n", gtk_toggle_button_get_active (togglebutton));
2279     //if(gtk_toggle_button_get_active (togglebutton))
2280     {
2281 	gboolean state = settings_p->disable_options;
2282 	settings_p->disable_options = FALSE;
2283 	option_toggled (togglebutton, GINT_TO_POINTER(RFM_USE_GTK_ICON_THEME));
2284 	settings_p->disable_options = state;
2285     }
2286 }
2287 #else
2288 #define GTK2_SETTING_FILE g_get_home_dir(),".gtkrc-2.0"
2289 static void
save_icon_theme(GtkComboBox * combo_box,gpointer data)2290 save_icon_theme(GtkComboBox *combo_box, gpointer data){
2291     gchar *file = g_build_filename(GTK2_SETTING_FILE, NULL);
2292     GtkSettings *settings = gtk_settings_get_default();
2293     gchar *themename = NULL;
2294 #if GTK_MAJOR_VERSION==2 && GTK_MINOR_VERSION<24
2295     themename = gtk_combo_box_get_active_text (combo_box);
2296 #else
2297     themename = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(combo_box));
2298 #endif
2299     g_object_set( G_OBJECT(settings),
2300 		    "gtk-icon-theme-name", themename,
2301 		    NULL);
2302     settings_t *settings_p=g_object_get_data(G_OBJECT(combo_box), "settings_p");
2303     update_icon_example(g_object_get_data(G_OBJECT(combo_box), "image_box"));
2304 
2305     gchar *buffer=g_strdup_printf("gtk-icon-theme-name = \"%s\"\n", themename);
2306     g_free(themename);
2307     gchar line[256];
2308     memset (line, 0, 256);
2309     FILE *settings_file=fopen(file, "r");
2310     if (settings_file){
2311 	while (fgets(line, 255, settings_file) && !feof(settings_file)){
2312 	    if (!strstr(line, "gtk-icon-theme-name")){
2313 		gchar *g = g_strconcat(buffer, line, NULL);
2314 		g_free(buffer);
2315 		buffer = g;
2316 	    }
2317 	}
2318 	fclose(settings_file);
2319     } else sit_message(file);
2320 
2321     settings_file=fopen(file, "w");
2322     if (settings_file){
2323 	fprintf(settings_file, "%s", buffer);
2324 	fclose(settings_file);
2325     }
2326     g_free(buffer);
2327     GtkToggleButton *togglebutton = data;
2328     NOOP(stderr, "toggle state is %d\n", gtk_toggle_button_get_active (togglebutton));
2329     //if(gtk_toggle_button_get_active (togglebutton))
2330     {
2331 	gboolean state = settings_p->disable_options;
2332 	settings_p->disable_options = FALSE;
2333 	option_toggled (togglebutton, GINT_TO_POINTER(RFM_USE_GTK_ICON_THEME));
2334 	settings_p->disable_options = state;
2335     }
2336 }
2337 
2338 #endif
2339 static gboolean
anim_f(void * data)2340 anim_f(void *data){
2341     GdkPixbufAnimation *animation = data;
2342     GdkPixbufAnimationIter *a_iter = g_object_get_data(G_OBJECT(animation), "a_iter");
2343     GtkWidget *abox = g_object_get_data(G_OBJECT(animation), "abox");
2344     if (animation_stop) {
2345 	g_object_unref(a_iter);
2346 	g_object_unref(animation);
2347 	return FALSE;
2348     }
2349     // Gtk  bug workaround:
2350     // suspend animations if tooltip mapped.
2351     if (rfm_tooltip_is_mapped()) return TRUE;
2352     gdk_pixbuf_animation_iter_advance(a_iter, NULL);
2353 
2354     GdkPixbuf *pixbuf = gdk_pixbuf_animation_iter_get_pixbuf(a_iter);
2355     GtkWidget *image = gtk_image_new_from_pixbuf (pixbuf);
2356     GList *children = gtk_container_get_children  (GTK_CONTAINER(abox));
2357     if (children && children->data) {
2358 	GtkWidget *child = children->data;
2359 	if (GTK_IS_WIDGET(child))
2360             gtk_container_remove (GTK_CONTAINER(abox), child);
2361     }
2362     g_list_free(children);
2363     gtk_container_add  (GTK_CONTAINER(abox), image);
2364     gtk_widget_show(image);
2365     return TRUE;
2366 }
2367 
2368 static void *
context_run_rfm_settings_dialog(gpointer data)2369 context_run_rfm_settings_dialog (gpointer data) {
2370 
2371     /*GtkWidget *test_dialog = gtk_color_chooser_dialog_new ("test title", NULL);
2372     g_object_set(G_OBJECT(test_dialog), "show-editor", TRUE, NULL);
2373     gtk_widget_show(test_dialog);*/
2374 
2375 
2376 
2377     if (!running) return NULL;
2378     settings_t *settings_p=data;
2379     settings_dialog = settings_p->dialog = gtk_dialog_new();
2380     gtk_window_set_type_hint(GTK_WINDOW(settings_dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
2381     gtk_window_set_title(GTK_WINDOW(settings_dialog), mp->caption);
2382 
2383     environ_t *environ_v = rfm_get_environ();
2384     GtkWidget *button = rfm_dialog_button ("xffm/stock_refresh", _("Rebuild Thumbnails"));
2385     gtk_widget_show (button);
2386     gtk_dialog_add_action_widget (GTK_DIALOG (settings_p->dialog), button, 2);
2387 
2388     button = rfm_dialog_button ("xffm/stock_select-color", _("Icons"));
2389     gtk_widget_show (button);
2390     gtk_dialog_add_action_widget (GTK_DIALOG (settings_p->dialog), button, 1);
2391     button = rfm_dialog_button ("xffm/stock_ok", _("Ok"));
2392     gtk_widget_show (button);
2393     gtk_dialog_add_action_widget (GTK_DIALOG (settings_p->dialog), button, 0);
2394 /*	gtk_dialog_new_with_buttons (mp->caption,
2395                                           NULL, 0,
2396                                           _("Rebuild Thumbnails"), 2,
2397 					  _("Icons"), 1,
2398 					  _("Close"), 0,
2399 					  NULL);*/
2400 
2401     //gtk_window_set_modal (GTK_WINDOW(settings_dialog), TRUE);
2402     rfm_global_t *rfm_global_p = rfm_global();
2403     if (!rfm_global_p) g_error("settings-module.i: !rfm_global_p\n");
2404     //gtk_window_set_transient_for(GTK_WINDOW(settings_dialog), GTK_WINDOW(rfm_global_p->window));
2405     g_object_set_data(G_OBJECT(settings_p->dialog), "settings_p", settings_p);
2406     widgets_t *widgets_p = (widgets_t *)malloc(sizeof(widgets_t));
2407     if (!widgets_p) g_error("malloc: %s", strerror(errno));
2408     settings_p->widgets_p = widgets_p;
2409     if (rfm_global_p){
2410 	rfm_global_p->settings_widgets_p = widgets_p;
2411     }
2412     memset(widgets_p, 0, sizeof(widgets_t));
2413     g_object_set_data(G_OBJECT(settings_p->dialog), "widgets_p", widgets_p);
2414     gtk_window_stick(GTK_WINDOW (settings_p->dialog));
2415     gtk_window_set_keep_above(GTK_WINDOW (settings_p->dialog), TRUE);
2416 
2417     g_signal_connect (settings_p->dialog,
2418 	    "response", G_CALLBACK (dialog_delete), NULL);
2419     g_signal_connect (settings_p->dialog,
2420 	    "delete_event", G_CALLBACK (dialog_delete), NULL);
2421     g_signal_connect (settings_p->dialog,
2422 	    "destroy", G_CALLBACK (dialog_delete), NULL);
2423     //vbox = GTK_DIALOG (settings_p->dialog)->vbox;
2424 #if 10
2425     int i;
2426     GtkTreeIter iter;
2427     GtkCellRenderer *renderer;
2428     GtkWidget *treeview;
2429     GtkWidget *label;
2430     GtkWidget *vbox = rfm_vbox_new (FALSE, 6);
2431     gtk_box_pack_start (
2432 	    GTK_BOX (gtk_dialog_get_content_area(GTK_DIALOG (settings_p->dialog))),
2433 	    vbox, TRUE, TRUE, 0);
2434     gtk_widget_show(vbox);
2435     GtkWidget *hbox = rfm_hbox_new (FALSE, 6);
2436     gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2437     gtk_widget_show(hbox);
2438 
2439     GtkWidget *header = gtk_label_new ("");
2440     gtk_label_set_markup (GTK_LABEL(header), mp->caption);
2441 
2442     GtkWidget *abox = rfm_hbox_new(FALSE,0);
2443     gtk_box_pack_start (GTK_BOX (hbox), abox, FALSE, TRUE, 0);
2444     gchar *iconpath = g_strdup_printf("%s/icons/rfm/animated/rodent-96.gif", PACKAGE_DATA_DIR);
2445     if (!g_file_test(iconpath, G_FILE_TEST_EXISTS)){
2446 	GdkPixbuf *pixbuf = rfm_get_pixbuf("xffm/stock_preferences", 96);
2447 	if (pixbuf){
2448 	    GtkWidget *image = gtk_image_new_from_pixbuf (pixbuf);
2449 	    g_object_unref(pixbuf);
2450 	    gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, TRUE, 0);
2451 	}
2452     } else {
2453 	GdkPixbufAnimation *animation = gdk_pixbuf_animation_new_from_file (iconpath, NULL);
2454 	g_free(iconpath);
2455 	GdkPixbufAnimationIter *a_iter = gdk_pixbuf_animation_get_iter  (animation, NULL);
2456 	GdkPixbuf *pixbuf = gdk_pixbuf_animation_iter_get_pixbuf(a_iter);
2457 	g_object_set_data(G_OBJECT(animation), "a_iter", a_iter);
2458 	g_object_set_data(G_OBJECT(animation), "abox", abox);
2459 
2460 	GtkWidget *image = gtk_image_new_from_pixbuf (pixbuf);
2461 	gtk_widget_show(image);
2462 	gtk_box_pack_start (GTK_BOX (abox), image, FALSE, TRUE, 0);
2463 	animation_stop=FALSE;
2464 	g_timeout_add (20, anim_f, animation);
2465     }
2466 
2467 
2468 
2469 
2470     gtk_box_pack_start (GTK_BOX (hbox), header, FALSE, TRUE, 0);
2471 
2472     GtkWidget *vpane = rfm_vpaned_new ();
2473     g_object_set_data(G_OBJECT(settings_dialog), "vpane", vpane);
2474     // hack:
2475     widgets_p->paper = settings_dialog;
2476 
2477     gtk_widget_show (vpane);
2478     gtk_box_pack_start (GTK_BOX (vbox),vpane, TRUE, TRUE, 0);
2479     gtk_paned_set_position (GTK_PANED (vpane), 1000);
2480     vbox = rfm_vbox_new (FALSE, 6);
2481     gtk_paned_pack1 (GTK_PANED (vpane),
2482 	    GTK_WIDGET (vbox), FALSE, TRUE);
2483     gtk_widget_show(vbox);
2484 
2485     widgets_p->diagnostics = gtk_text_view_new ();
2486     GtkWidget *scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
2487     gtk_widget_show (scrolledwindow);
2488     gtk_widget_show ((widgets_p->diagnostics));
2489     gtk_paned_pack2 (GTK_PANED (vpane), scrolledwindow, TRUE, TRUE);
2490     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
2491 	    GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2492 
2493     gtk_container_add (GTK_CONTAINER (scrolledwindow), (widgets_p->diagnostics));
2494     gtk_container_set_border_width (GTK_CONTAINER ((widgets_p->diagnostics)), 2);
2495     gtk_widget_set_can_focus((widgets_p->diagnostics), FALSE);
2496     gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW ((widgets_p->diagnostics)), GTK_WRAP_WORD);
2497     gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW ((widgets_p->diagnostics)), FALSE);
2498 
2499 
2500     GtkNotebook *notebook = GTK_NOTEBOOK(gtk_notebook_new ());
2501     g_object_set_data(G_OBJECT(notebook), "settings_p", settings_p);
2502     gtk_notebook_set_scrollable (notebook, TRUE);
2503     gtk_notebook_popup_enable (notebook);
2504     gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (notebook), TRUE, TRUE, 0);
2505 
2506     ////////////////// General
2507     //
2508     vbox = create_tab (notebook, _("General"), _("General Options"));
2509 
2510     {
2511 	gchar *k_text=g_strdup(_("Configuration of keybindings"));
2512 	gpointer k_data=NULL;
2513 	GtkWidget *k_box = rfm_hbox_new(FALSE, 0);
2514 	GtkWidget *k_button =
2515 	    rfm_mk_little_button ("xffm/emblem_keyboard",
2516 		      (gpointer)k_callback, k_data, k_text);
2517 	GtkWidget *k_label = gtk_label_new (k_text);
2518 	gtk_box_pack_start (GTK_BOX(k_box), k_button, FALSE, FALSE, 0);
2519 	gtk_box_pack_start (GTK_BOX(k_box), k_label, FALSE, FALSE, 0);
2520 	gtk_box_pack_start (GTK_BOX(vbox), k_box, FALSE, FALSE, 0);
2521 	g_free(k_text);
2522     }
2523 
2524     {
2525 	gchar *t_text=g_strdup(_("Toolbar Settings"));
2526 	gpointer t_data=NULL;
2527 	GtkWidget *t_box = rfm_hbox_new(FALSE, 0);
2528 	GtkWidget *t_button =
2529 	    rfm_mk_little_button ("xffm/stock_preferences",
2530 		     (gpointer)t_callback, t_data,
2531 		      t_text);
2532 	GtkWidget *t_label = gtk_label_new (t_text);
2533 	gtk_box_pack_start (GTK_BOX(t_box), t_button, FALSE, FALSE, 0);
2534 	gtk_box_pack_start (GTK_BOX(t_box), t_label, FALSE, FALSE, 0);
2535 	gtk_box_pack_start (GTK_BOX(vbox), t_box, FALSE, FALSE, 0);
2536 	g_free(t_text);
2537 #if GTK_MAJOR_VERSION==2 && GTK_MINOR_VERSION<20
2538 	gtk_widget_set_sensitive(GTK_WIDGET(t_button), FALSE);
2539 	gtk_widget_set_sensitive(GTK_WIDGET(t_label), FALSE);
2540 	gtk_widget_set_sensitive(GTK_WIDGET(t_box), FALSE);
2541 #endif
2542     }
2543 
2544     for(i = RFM_DOUBLE_CLICK_NAVIGATION; i <= RFM_ENABLE_LABEL_TIPS; i++) {
2545 
2546 	if (i == RFM_USE_GTK_ICON_THEME) {
2547 	    GtkSettings *settings = gtk_settings_get_default();
2548 	    gchar *themename = NULL;
2549 	    /*g_object_set( G_OBJECT(settings),
2550 		    "gtk-icon-theme-name", "gnome",
2551 		    NULL);*/
2552 	    g_object_get( G_OBJECT(settings),
2553 		    "gtk-icon-theme-name", &themename,
2554 		    NULL);
2555 	    DBG( "icon theme name = %s\n", themename);
2556 
2557 	    gchar **th_options = rfm_get_iconthemes();
2558 	    GtkWidget *theme_combo = make_string_combo_box(th_options, "settings_p", settings_p);
2559 	    gint combo_index=0;
2560 	    gchar **p = th_options;
2561 	    gint j;
2562 	    for (j=0; p && *p; p++, j++){
2563 		if (strcmp(themename, *p)==0) combo_index=j;
2564 	    }
2565 
2566 	    gtk_combo_box_set_active (GTK_COMBO_BOX(theme_combo), combo_index);
2567 
2568 	    g_strfreev(th_options);
2569 
2570 
2571 	    g_free(themename);
2572 
2573 	    GtkWidget *theme_box = rfm_hbox_new(FALSE,3);
2574 	    gtk_box_pack_start (GTK_BOX(vbox), theme_box, FALSE, FALSE, 0);
2575 	    toggle_button[i] = gtk_check_button_new_with_label (_(environ_v[i].env_text));
2576 	    gtk_box_pack_start (GTK_BOX(theme_box), toggle_button[i], FALSE, FALSE, 0);
2577 	    gtk_box_pack_start (GTK_BOX(theme_box), theme_combo, FALSE, FALSE, 0);
2578 	    g_signal_connect (G_OBJECT (theme_combo), "changed", G_CALLBACK (save_icon_theme), toggle_button[i]);
2579 
2580 	    GtkWidget *image_box = rfm_hbox_new(FALSE, 0);
2581 	    gtk_box_pack_start (GTK_BOX(theme_box), image_box, FALSE, FALSE, 0);
2582 	    g_object_set_data(G_OBJECT(theme_combo), "image_box", image_box);
2583 
2584 	    GtkWidget *image=get_example_image();
2585 	    if (image) gtk_box_pack_start (GTK_BOX(image_box), image, FALSE, FALSE, 0);
2586 	} else {
2587 	    gchar *text;
2588 	    if (i == RFM_CONTENT_FOLDER_ICONS) {
2589 		text = g_strdup_printf("%s (%s)",
2590 		    _(environ_v[i].env_text), _("Content Type"));
2591 	    } else if (i == RFM_ENABLE_TIPS) {
2592 		text = g_strdup_printf("%s (%s)",
2593 			_(environ_v[i].env_text), _("Icons"));
2594 	    } else if (i == RFM_ENABLE_LABEL_TIPS) {
2595 		text = g_strdup_printf("%s (%s)",
2596 			_(environ_v[i].env_text), _("Labels"));
2597 	    } else {
2598 		text = g_strdup(_(environ_v[i].env_text));
2599 	    }
2600 
2601 	    toggle_button[i] = gtk_check_button_new_with_label (text);
2602 	    g_free(text);
2603 	    gtk_box_pack_start (GTK_BOX(vbox), toggle_button[i], FALSE, FALSE, 0);
2604 	}
2605 	g_object_set_data(G_OBJECT(toggle_button[i]), "settings_p", settings_p);
2606         g_signal_connect (toggle_button[i],
2607 		"toggled", G_CALLBACK (option_toggled), GINT_TO_POINTER(i));
2608     }
2609     // preview size
2610 	GtkWidget *preview_size_hbox = rfm_hbox_new (FALSE, 6);
2611 	gtk_box_pack_start (GTK_BOX(vbox), preview_size_hbox, FALSE, FALSE, 0);
2612 	label = gtk_label_new (_(environ_v[RFM_PREVIEW_IMAGE_SIZE].env_text));
2613 	gtk_box_pack_start (GTK_BOX(preview_size_hbox), label, FALSE, FALSE, 0);
2614 	settings_p->preview_size_spinbutton =
2615 	    gtk_spin_button_new_with_range (100.0, 1000.0, 10.0);
2616 
2617 	gdouble value = rfm_get_preview_image_size();
2618 	gtk_spin_button_set_value (
2619 		GTK_SPIN_BUTTON(settings_p->preview_size_spinbutton),
2620                 value);
2621 	gtk_box_pack_start (GTK_BOX(preview_size_hbox), settings_p->preview_size_spinbutton, FALSE, FALSE, 0);
2622 	g_object_set_data(
2623 		G_OBJECT(settings_p->preview_size_spinbutton),
2624 		"settings_p", settings_p);
2625 	g_object_set_data(
2626 		G_OBJECT(settings_p->preview_size_spinbutton),
2627 		"which_margin", GINT_TO_POINTER(i));
2628         g_signal_connect (settings_p->preview_size_spinbutton,
2629     	    "value-changed", G_CALLBACK (preview_size_changed), NULL);
2630     //////   FONTS
2631     static gchar **fixed_families=NULL;
2632     static gchar **variable_families=NULL;
2633 
2634     if (!fixed_families){
2635 	PangoFontFamily **pfamilies=NULL;
2636 	gint n_families;
2637 	PangoContext *context =
2638 	    gtk_widget_get_pango_context (rfm_global_p->window);
2639 	pango_context_list_families (context, &pfamilies, &n_families);
2640 	gint k=0;
2641 	variable_families = (gchar **)malloc((n_families+1) * sizeof(gchar *));
2642 	fixed_families = (gchar **)malloc((n_families+1) * sizeof(gchar *));
2643 	if (!fixed_families) g_error("malloc: %s\n", strerror(errno));
2644 	if (!variable_families) g_error("malloc: %s\n", strerror(errno));
2645 	memset(fixed_families, 0, (n_families+1) * sizeof(gchar *));
2646 	memset(variable_families, 0, (n_families+1) * sizeof(gchar *));
2647 	gint kk=0;
2648 	gint kkk=0;
2649 	for (;k<n_families;k++){
2650 	    if (pango_font_family_is_monospace(pfamilies[k])){
2651 		fixed_families[kk++] =
2652 		    g_strdup(pango_font_family_get_name(pfamilies[k]));
2653 
2654 	    }
2655 	    variable_families[kkk++] =
2656 		    g_strdup(pango_font_family_get_name(pfamilies[k]));
2657 	}
2658 	g_free(pfamilies);
2659     }
2660 
2661     {
2662 	GtkWidget *font_vbox=rfm_vbox_new(FALSE, 2);
2663 	GtkWidget *font_box=rfm_hbox_new(FALSE, 2);
2664 	gtk_box_pack_start (GTK_BOX(vbox), font_vbox, FALSE, FALSE, 0);
2665 	gtk_box_pack_start (GTK_BOX(font_vbox), font_box, FALSE, FALSE, 0);
2666 
2667 	GtkWidget *font_label = gtk_label_new("");
2668 	gtk_box_pack_start (GTK_BOX(font_box), font_label, FALSE, FALSE, 0);
2669 	gchar *label_markup =g_strdup_printf("<b>%s:</b> ", _("Fixed width font"));
2670 	gtk_label_set_markup(GTK_LABEL(font_label), label_markup);
2671 	g_free(label_markup);
2672 	gtk_widget_show(font_label);
2673 
2674 	font_box=rfm_hbox_new(FALSE, 2);
2675 	gtk_box_pack_start (GTK_BOX(font_box), gtk_label_new("   "), FALSE, FALSE, 0);
2676 	gtk_box_pack_start (GTK_BOX(font_vbox), font_box, FALSE, FALSE, 0);
2677 	settings_p->fontsize_box =
2678 	    make_gint_combo_box (font_box, RFM_FIXED_FONT_SIZE, rfm_get_font_sizes(), (void *)fontsize_changed);
2679 	g_object_set_data(G_OBJECT(settings_p->fontsize_box), "settings_p", settings_p);
2680 
2681 	font_box=rfm_hbox_new(FALSE, 2);
2682 	gtk_box_pack_start (GTK_BOX(font_box), gtk_label_new("   "), FALSE, FALSE, 0);
2683 	gtk_box_pack_start (GTK_BOX(font_vbox), font_box, FALSE, FALSE, 0);
2684         settings_p->fontfamily_box =
2685 	    make_gint_combo_box (font_box, RFM_FIXED_FONT_FAMILY, (const gchar **)fixed_families, (void *)fontfamily_changed);
2686 	g_object_set_data(G_OBJECT(settings_p->fontfamily_box), "settings_p", settings_p);
2687     }
2688 
2689 
2690     {
2691 	GtkWidget *font_vbox=rfm_vbox_new(FALSE, 2);
2692 	GtkWidget *font_box=rfm_hbox_new(FALSE, 2);
2693 	gtk_box_pack_start (GTK_BOX(vbox), font_vbox, FALSE, FALSE, 0);
2694 	gtk_box_pack_start (GTK_BOX(font_vbox), font_box, FALSE, FALSE, 0);
2695 
2696 	GtkWidget *font_label = gtk_label_new("");
2697 	gtk_box_pack_start (GTK_BOX(font_box), font_label, FALSE, FALSE, 0);
2698 	gchar *label_markup =g_strdup_printf("<b>%s:</b> ", _("Variable width font"));
2699 	gtk_label_set_markup(GTK_LABEL(font_label), label_markup);
2700 	g_free(label_markup);
2701 	gtk_widget_show(font_label);
2702 
2703 
2704 	font_box=rfm_hbox_new(FALSE, 2);
2705 	gtk_box_pack_start (GTK_BOX(font_box), gtk_label_new("   "), FALSE, FALSE, 0);
2706 	gtk_box_pack_start (GTK_BOX(font_vbox), font_box, FALSE, FALSE, 0);
2707 	settings_p->vfontsize_box =
2708 	    make_gint_combo_box (font_box, RFM_VARIABLE_FONT_SIZE, rfm_get_font_sizes(), (void *)vfontsize_changed);
2709 	g_object_set_data(G_OBJECT(settings_p->vfontsize_box), "settings_p", settings_p);
2710 
2711 	font_box=rfm_hbox_new(FALSE, 2);
2712 	gtk_box_pack_start (GTK_BOX(font_box), gtk_label_new("   "), FALSE, FALSE, 0);
2713 	gtk_box_pack_start (GTK_BOX(font_vbox), font_box, FALSE, FALSE, 0);
2714 	settings_p->vfontfamily_box =
2715 	    make_gint_combo_box (font_box, RFM_VARIABLE_FONT_FAMILY, (const gchar **)variable_families, (void *)vfontfamily_changed);
2716 	g_object_set_data(G_OBJECT(settings_p->vfontfamily_box), "settings_p", settings_p);
2717     }
2718 
2719 ///////////////////////////////
2720     settings_p->iconsize_box =
2721 	make_gint_combo_box (vbox, RFM_DEFAULT_ICON_SIZE, rfm_get_icon_sizes(), (void *)iconsize_changed);
2722     g_object_set_data(G_OBJECT(settings_p->iconsize_box), "settings_p", settings_p);
2723     settings_p->terminal_box =
2724 	make_exec_combo_box (vbox, TERMINAL_CMD, rfm_get_terminals(), (void *)terminal_changed);
2725     g_object_set_data(G_OBJECT(settings_p->terminal_box), "settings_p", settings_p);
2726     settings_p->editor_box =
2727 	make_exec_combo_box (vbox, EDITOR, rfm_get_editors(), (void *)editor_changed);
2728     g_object_set_data(G_OBJECT(settings_p->editor_box), "settings_p", settings_p);
2729     ////
2730     hbox = rfm_hbox_new (FALSE, 6);
2731     label = gtk_label_new (_(environ_v[RFM_ICONVIEW_COLOR].env_text));
2732     gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
2733     settings_p->iconviewcolor_button = gtk_color_button_new ();
2734     if(getenv ("RFM_ICONVIEW_COLOR") && strlen (getenv ("RFM_ICONVIEW_COLOR")))
2735     {
2736 #if GTK_MAJOR_VERSION==3 && GTK_MINOR_VERSION>=4
2737         GdkRGBA color;
2738         if(gdk_rgba_parse (&color, getenv ("RFM_ICONVIEW_COLOR") )) {
2739 	    gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(settings_p->iconviewcolor_button), &color);
2740         }
2741         /*gtk_color_chooser_add_palette (
2742                     GTK_COLOR_CHOOSER(settings_p->iconviewcolor_button),
2743                     GTK_ORIENTATION_HORIZONTAL,
2744                     7,
2745                     49,
2746                     X11_colors);*/
2747 #else
2748         GdkColor color;
2749         if(gdk_color_parse (getenv ("RFM_ICONVIEW_COLOR"), &color)) {
2750             gtk_color_button_set_color (
2751 		    GTK_COLOR_BUTTON(settings_p->desktopcolor_button), &color);
2752         }
2753 #endif
2754     }
2755     gtk_color_button_set_title (GTK_COLOR_BUTTON(settings_p->iconviewcolor_button),
2756 	    (const gchar *) _(environ_v[RFM_ICONVIEW_COLOR].env_text));
2757     gtk_box_pack_start (GTK_BOX(hbox), settings_p->iconviewcolor_button,
2758 	    FALSE, FALSE, 0);
2759     gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
2760     g_object_set_data(G_OBJECT(settings_p->iconviewcolor_button), "settings_p", settings_p);
2761     g_signal_connect (settings_p->iconviewcolor_button,
2762 	    "color-set", G_CALLBACK (color_changed),
2763 	    GINT_TO_POINTER(RFM_ICONVIEW_COLOR));
2764     //g_object_set(G_OBJECT(settings_p->iconviewcolor_button),"show-editor", TRUE, NULL);
2765     if(gtk_widget_is_composited (settings_p->dialog)) {
2766         hbox = rfm_hbox_new (FALSE, 6);
2767         label = gtk_label_new (_(environ_v[RFM_TRANSPARENCY].env_text));
2768         gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
2769         double transparency=0.0;
2770         if(getenv ("RFM_TRANSPARENCY") && strlen (getenv ("RFM_TRANSPARENCY"))) {
2771             errno = 0;
2772             transparency = strtod (getenv ("RFM_TRANSPARENCY"), NULL);
2773             if(errno != 0 || transparency < 0.0)
2774                 transparency = 0.0;
2775             else if(transparency > 0.75)
2776                 transparency = 0.75;
2777         }
2778         GtkWidget *transparency_slider = rfm_hscale_new_with_range (0.0, 0.75, 0.01);
2779 	g_object_set_data(G_OBJECT(transparency_slider), "settings_p", settings_p);
2780         gtk_scale_set_digits (GTK_SCALE(transparency_slider), 2);
2781         gtk_range_set_value (GTK_RANGE(transparency_slider), transparency);
2782         gtk_box_pack_start (GTK_BOX(hbox), transparency_slider, TRUE, TRUE, 0);
2783         gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
2784         g_signal_connect (transparency_slider, "change-value",
2785                           G_CALLBACK (transparency_changed),
2786 			  GINT_TO_POINTER(RFM_TRANSPARENCY));
2787 
2788     }
2789     //////////////////////////////  version control
2790 
2791     gtk_widget_show_all (vbox);
2792 
2793     ///////////////////////// Desktop options
2794     gchar *tab_text = g_strdup_printf(" %s:", _("Options"));
2795     vbox = create_tab (notebook, _("Desktop"),  tab_text);
2796     g_free(tab_text);
2797 
2798     for(i = RFM_ENABLE_DESKTOP; i <= RFM_NAVIGATE_DESKTOP; i++) {
2799 	gchar *text;
2800 	if (i == RFM_NAVIGATE_DESKTOP) {
2801 	    text = g_strdup_printf("%s (%s)",
2802 		_(environ_v[i].env_text), _("Allow"));
2803 	} else if (i == RFM_ENABLE_DESKTOP) {
2804 	    text = g_strdup_printf("%s (%s)",
2805 		_(environ_v[i].env_text), _("localhost"));
2806 	} else {
2807 	    text = g_strdup(_(environ_v[i].env_text));
2808 	}
2809 	toggle_button[i] =
2810 		gtk_check_button_new_with_label (text);
2811 	g_free(text);
2812 
2813 	g_object_set_data(G_OBJECT(toggle_button[i]), "settings_p", settings_p);
2814         g_signal_connect (toggle_button[i],
2815 		"toggled", G_CALLBACK (option_toggled), GINT_TO_POINTER(i));
2816         gtk_box_pack_start (GTK_BOX(vbox), toggle_button[i], FALSE, FALSE, 0);
2817 	if (i==RFM_ENABLE_DESKTOP && !localhost_check()){
2818 	    gtk_widget_set_sensitive(toggle_button[i], FALSE);
2819 	}
2820     }
2821 
2822    // desktop image selection
2823     hbox = rfm_hbox_new (FALSE, 6);
2824     gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
2825     settings_p->desktopimage_button = make_file_chooser_button (RFM_DESKTOP_IMAGE, FALSE, hbox);
2826     g_object_set_data(G_OBJECT(settings_p->desktopimage_button), "settings_p", settings_p);
2827     gchar *g=g_strdup_printf("%s (%s)", _("Clear"), _("Background image"));
2828     GtkWidget *clear_button = rfm_mk_little_button ("xffm/stock_clear",
2829 	    clear_bgimage, settings_p, g);
2830     gtk_widget_show(clear_button);
2831     g_free(g);
2832     gtk_box_pack_start (GTK_BOX(hbox), clear_button, FALSE, FALSE, 0);
2833     g_signal_connect (clear_button,
2834 	    "clicked", G_CALLBACK (value_clear),
2835 	    GINT_TO_POINTER(RFM_DESKTOP_IMAGE));
2836 
2837 
2838     // desktop directory selection
2839     hbox = rfm_hbox_new (FALSE, 6);
2840     gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
2841     label=gtk_label_new(_(environ_v[RFM_DESKTOP_DIR].env_text));
2842     settings_p->desktopdir_entry = gtk_entry_new();
2843     g_signal_connect (settings_p->desktopdir_entry,
2844 	    "activate", G_CALLBACK (deskdir_entry), settings_p);
2845 
2846     settings_p->desktopdir_button =
2847 	rfm_mk_little_button ("xffm/emblem_desktop",
2848 	    deskdir_filechooser, settings_p, _("Select Folder"));
2849     g_object_set_data(G_OBJECT(settings_p->desktopdir_button), "settings_p", settings_p);
2850     gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
2851     gtk_box_pack_start (GTK_BOX(hbox), settings_p->desktopdir_entry, FALSE, FALSE, 0);
2852     gtk_box_pack_start (GTK_BOX(hbox), settings_p->desktopdir_button, FALSE, FALSE, 0);
2853 
2854 
2855 
2856 
2857      ////
2858     hbox = rfm_hbox_new (FALSE, 6);
2859     label = gtk_label_new (_(environ_v[RFM_DESKTOP_COLOR].env_text));
2860     gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
2861     settings_p->desktopcolor_button = gtk_color_button_new ();
2862     if(getenv ("RFM_DESKTOP_COLOR") && strlen (getenv ("RFM_DESKTOP_COLOR"))) {
2863 #if GTK_MAJOR_VERSION==3 && GTK_MINOR_VERSION>=4
2864         GdkRGBA color;
2865         if(gdk_rgba_parse (&color, getenv ("RFM_DESKTOP_COLOR") )) {
2866 	    gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(settings_p->desktopcolor_button), &color);
2867         }
2868 
2869 #else
2870         GdkColor color;
2871         if(gdk_color_parse (getenv ("RFM_DESKTOP_COLOR"), &color)) {
2872             gtk_color_button_set_color (
2873 		    GTK_COLOR_BUTTON(settings_p->desktopcolor_button), &color);
2874         }
2875 #endif
2876     }
2877     gtk_color_button_set_title ((GtkColorButton *) (settings_p->desktopcolor_button), (const gchar *)
2878                                 _(environ_v[RFM_DESKTOP_COLOR].env_text));
2879     gtk_box_pack_start (GTK_BOX(hbox), settings_p->desktopcolor_button, FALSE, FALSE, 0);
2880     gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
2881     g_object_set_data(G_OBJECT(settings_p->desktopcolor_button), "settings_p", settings_p);
2882     g_signal_connect (settings_p->desktopcolor_button,
2883 	    "color-set", G_CALLBACK (color_changed), GINT_TO_POINTER(RFM_DESKTOP_COLOR));
2884 
2885     // spin buttons: margins
2886     for (i = RFM_DESKTOP_TOP_MARGIN; i <= RFM_DESKTOP_LEFT_MARGIN; i++){
2887 	hbox = rfm_hbox_new (FALSE, 6);
2888 	label = gtk_label_new (_(environ_v[i].env_text));
2889 	gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
2890 	settings_p->desktop_margin_spinbutton[i-RFM_DESKTOP_TOP_MARGIN] =
2891 	    gtk_spin_button_new_with_range (0.0, 200.0, 1.0);
2892 	gdouble value = get_spin_value(i);
2893 
2894 	gtk_spin_button_set_value (
2895 		GTK_SPIN_BUTTON(settings_p->desktop_margin_spinbutton[i-RFM_DESKTOP_TOP_MARGIN]),
2896                 value);
2897 	gtk_box_pack_start (GTK_BOX(hbox), settings_p->desktop_margin_spinbutton[i-RFM_DESKTOP_TOP_MARGIN], FALSE, FALSE, 0);
2898 	gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
2899 	g_object_set_data(
2900 		G_OBJECT(settings_p->desktop_margin_spinbutton[i-RFM_DESKTOP_TOP_MARGIN]),
2901 		"settings_p", settings_p);
2902 	g_object_set_data(
2903 		G_OBJECT(settings_p->desktop_margin_spinbutton[i-RFM_DESKTOP_TOP_MARGIN]),
2904 		"which_margin", GINT_TO_POINTER(i));
2905         g_signal_connect (settings_p->desktop_margin_spinbutton[i-RFM_DESKTOP_TOP_MARGIN],
2906     	    "value-changed", G_CALLBACK (margin_changed), GINT_TO_POINTER(i));
2907     }
2908 
2909 
2910     //////////////////////// Ls options
2911     tab_text = g_strdup_printf(" %s:", _("Options"));
2912     vbox = create_tab (notebook, "ls", tab_text);
2913     g_free(tab_text);
2914     subtitle(vbox, settings_dialog, _("File Information..."), "ls");
2915 
2916     mk_bit_toggles(settings_p, vbox, "ls_box", RFM_LS_FLAGS, LS_OPTIONS);
2917     gtk_widget_show_all (vbox);
2918 
2919 
2920     //////////////////////// Copy options
2921     tab_text = g_strdup_printf(" %s:", _("Options"));
2922     vbox = create_tab (notebook, "cp", tab_text);
2923     g_free(tab_text);
2924     subtitle(vbox, settings_dialog, _("Copy"), "cp");
2925 
2926     mk_bit_toggles(settings_p, vbox, "cp_box", RFM_CP_FLAGS, CP_OPTIONS);
2927     gtk_widget_show_all (vbox);
2928 
2929 
2930     //////////////////////// Move options
2931     tab_text = g_strdup_printf(" %s:", _("Options"));
2932     vbox = create_tab (notebook, "mv", tab_text);
2933     g_object_set_data(G_OBJECT(settings_p->dialog), "mv_box", vbox);
2934     g_free(tab_text);
2935 
2936     tab_text = g_strdup_printf("%s", _("Move"));
2937     subtitle(vbox, settings_dialog, tab_text, "mv");
2938     g_free(tab_text);
2939     mk_bit_toggles(settings_p, vbox, "mv_box", RFM_MV_FLAGS, MV_OPTIONS);
2940     gtk_widget_show_all (vbox);
2941 
2942     //////////////////////// link options
2943     tab_text = g_strdup_printf(" %s:", _("Options"));
2944     vbox = create_tab (notebook, "ln", tab_text);
2945     g_object_set_data(G_OBJECT(settings_p->dialog), "ln_box", vbox);
2946     g_free(tab_text);
2947 
2948     subtitle(vbox, settings_dialog, _("Symbolic Link"), "ln");
2949     mk_bit_toggles(settings_p, vbox, "ln_box", RFM_LN_FLAGS, LN_OPTIONS);
2950 
2951     gtk_widget_show_all (vbox);
2952 
2953     //////////////////////// remove options
2954     tab_text = g_strdup_printf(" %s:", _("Options"));
2955     vbox = create_tab (notebook, "rm", tab_text);
2956     g_object_set_data(G_OBJECT(settings_p->dialog), "rm_box", vbox);
2957     g_free(tab_text);
2958 
2959 
2960 
2961     subtitle(vbox, settings_dialog, _("Delete"), "rm");
2962     mk_bit_toggles(settings_p, vbox, "rm_box", RFM_RM_FLAGS, RM_OPTIONS);
2963     gtk_widget_show_all (vbox);
2964 
2965     //////////////////////// shred options
2966     DBG("testing for shred command...\n");
2967     gchar *shred_bin = g_find_program_in_path("shred");
2968     if (shred_bin) {
2969 	DBG("shred bin is at %s\n", shred_bin);
2970 	tab_text = g_strdup_printf(" %s:", _("Options"));
2971 	vbox = create_tab (notebook, "shred", tab_text);
2972 	g_object_set_data(G_OBJECT(settings_p->dialog), "shred_box", vbox);
2973 	g_free(tab_text);
2974 	subtitle(vbox, settings_dialog, _("Shred"), "shred");
2975 	mk_bit_toggles(settings_p, vbox, "shred_box", RFM_SHRED_FLAGS, SHRED_OPTIONS);
2976 	gtk_widget_show_all (vbox);
2977 	g_free(shred_bin);
2978     }
2979 #if 0
2980     // Plugin restriction is not very useful...
2981     // Just remove the plugin if you don't want it!
2982     //////////////////////// rodent plugins
2983     tab_text = g_strdup_printf(" %s:", _("Plugins"));
2984     vbox = create_tab (notebook, _("Plugins"), tab_text);
2985     g_object_set_data(G_OBJECT(settings_p->dialog), "plugins_box", vbox);
2986     g_free(tab_text);
2987     subtitle(vbox, settings_dialog, _("Rodent"), "rodent");
2988     // find plugins and modules and create toggles, or...
2989     // use a predefined toggle list as with cp.
2990     mk_bit_toggles(settings_p, vbox, "plugins_box", RFM_PLUGIN_FLAGS, rfm_get_lite_plugin_options());
2991 
2992     gtk_widget_show_all (vbox);
2993     //////////////////////// rodent modules
2994     tab_text = g_strdup_printf(" %s:", _("Modules"));
2995     vbox = create_tab (notebook, _("Modules"), tab_text);
2996     g_object_set_data(G_OBJECT(settings_p->dialog), "modules_box", vbox);
2997     g_free(tab_text);
2998     subtitle(vbox, settings_dialog, _("Rodent"), "rodent");
2999     // find plugins and modules and create toggles, or...
3000     // use a predefined toggle list as with cp.
3001     mk_bit_toggles(settings_p, vbox, "modules_box", RFM_MODULE_FLAGS, rfm_get_lite_module_options());
3002 
3003     gtk_widget_show_all (vbox);
3004 #endif
3005 
3006     ///////////////////////////
3007     //    advanced options (environment variables)
3008     ///////////////////////////
3009      vbox = create_tab (notebook, _("Environment Variables"),
3010                _("Edit the list of environment variables and associated values"));
3011 
3012     GtkWidget *sw = gtk_scrolled_window_new (NULL, NULL);
3013     gtk_widget_set_size_request(sw, -1 , 275);
3014     gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_ETCHED_IN);
3015     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
3016     gtk_widget_show (sw);
3017     gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
3018 
3019     settings_p->model = gtk_list_store_new (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
3020     for(i = 0; i < RFM_OPTIONS; i++) {
3021         gtk_list_store_append (settings_p->model, &iter);
3022         gtk_list_store_set (settings_p->model, &iter,
3023                             COLUMN_VARIABLE,
3024                             g_strdup (rfm_options[i].name),
3025                             COLUMN_VALUE, g_strdup (rfm_options[i].value),
3026 			    COLUMN_EDITABLE, TRUE, -1);
3027     }
3028     treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (settings_p->model));
3029     g_object_unref (G_OBJECT (settings_p->model));
3030     // gtk_tree_view_set_rules_hint is deprecated
3031     // and WTF do we need it for anyways?
3032     // gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
3033     gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)),
3034 	    GTK_SELECTION_SINGLE);
3035     /* variable column */
3036     renderer = gtk_cell_renderer_text_new ();
3037     g_signal_connect (G_OBJECT (renderer), "edited", G_CALLBACK (environment_changed), settings_p);
3038     g_object_set_data (G_OBJECT (renderer), "column", (gint *) COLUMN_VARIABLE);
3039 
3040     gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
3041                                                  -1, _("Variable"), renderer, "text",
3042 						 COLUMN_VARIABLE, NULL);
3043     /* value column */
3044     renderer = gtk_cell_renderer_text_new ();
3045     g_signal_connect (G_OBJECT (renderer), "edited", G_CALLBACK (environment_changed), settings_p);
3046     g_object_set_data (G_OBJECT (renderer), "column", (gint *) COLUMN_VALUE);
3047 
3048     gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
3049                                                  -1, _("Value"), renderer, "text",
3050 						 COLUMN_VALUE, "editable",
3051 						 COLUMN_EDITABLE, NULL);
3052 
3053     gtk_widget_set_size_request (treeview, 300, 200);
3054     gtk_widget_show (treeview);
3055     gtk_container_add (GTK_CONTAINER (sw), treeview);
3056 
3057     set_option_buttons (settings_p);
3058     g_signal_connect (notebook, "switch-page", G_CALLBACK (switch_page), NULL);
3059 
3060     gtk_widget_set_size_request (settings_p->dialog, 650, 500);
3061     gtk_window_set_decorated (GTK_WINDOW (settings_p->dialog), TRUE);
3062     gtk_window_set_type_hint (GTK_WINDOW (settings_p->dialog), GDK_WINDOW_TYPE_HINT_NORMAL);
3063     gtk_window_set_destroy_with_parent (GTK_WINDOW (settings_p->dialog), TRUE);
3064     gtk_window_stick (GTK_WINDOW (settings_p->dialog));
3065     gchar *title = g_strdup_printf ("%s %s (%s)",
3066             PACKAGE_NAME, TAG, _("Personal settings"));
3067     gtk_window_set_title (GTK_WINDOW (settings_p->dialog), title);
3068     g_free (title);
3069     GdkPixbuf *icon_pixbuf = rfm_get_pixbuf ("xffm/stock_preferences", SIZE_ICON);
3070     if(icon_pixbuf) {
3071         gtk_window_set_icon (GTK_WINDOW (settings_p->dialog), icon_pixbuf);
3072 	g_object_unref(icon_pixbuf);
3073     }
3074 
3075 #endif
3076     gtk_window_set_type_hint(GTK_WINDOW(settings_dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
3077     gtk_widget_show_all (settings_p->dialog);
3078     return NULL;
3079 }
3080 
3081 
3082 static
3083 void *
options_dialog_f(void * data)3084 options_dialog_f( void *data){
3085     void **arg = data;
3086     widgets_t *widgets_p = arg[0];
3087     const gchar *command = arg[1];
3088     if (!command) return NULL;
3089     settings_t *settings_p=(settings_t *)malloc(sizeof(settings_t));
3090     if (!settings_p) g_error("malloc: %s", strerror(errno));
3091     memset(settings_p, 0, sizeof(settings_t));
3092     RfmProgramOptions *options_p;
3093     const gchar *id = NULL;
3094     gint flags;
3095     if (strcmp(command, "cp")==0){
3096 	options_p = CP_OPTIONS;
3097 	id = "cp_box";
3098 	flags = RFM_CP_FLAGS;
3099     } else if (strcmp(command, "ls")==0){
3100 	options_p = LS_OPTIONS;
3101 	id = "ls_box";
3102 	flags = RFM_LS_FLAGS;
3103     } else if (strcmp(command, "mv")==0){
3104 	options_p = MV_OPTIONS;
3105 	id = "mv_box";
3106 	flags = RFM_MV_FLAGS;
3107     } else if (strcmp(command, "ln")==0){
3108 	options_p = LN_OPTIONS;
3109 	id = "ln_box";
3110 	flags = RFM_LN_FLAGS;
3111     } else if (strcmp(command, "rm")==0){
3112 	options_p = RM_OPTIONS;
3113 	id = "rm_box";
3114 	flags = RFM_RM_FLAGS;
3115     } else if (strcmp(command, "shred")==0){
3116 	options_p = SHRED_OPTIONS;
3117 	id = "shred_box";
3118 	flags = RFM_SHRED_FLAGS;
3119     }
3120     if (!id) {
3121 	DBG("options_dialog(): no option_t for %s\n", command);
3122         g_free(settings_p);
3123 	return NULL;
3124     }
3125     settings_p->dialog = gtk_dialog_new();
3126     gtk_window_set_type_hint(GTK_WINDOW(settings_p->dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
3127     gchar *title = g_strdup_printf(_("Options: %s"), command);
3128     gtk_window_set_title(GTK_WINDOW(settings_p->dialog), title);
3129     g_free(title);
3130     GtkWidget *box = gtk_dialog_get_content_area (GTK_DIALOG(settings_p->dialog));
3131 
3132     GtkLabel *label = GTK_LABEL(gtk_label_new(""));
3133     gchar *slabel = g_strdup_printf("<span foreground=\"blue\" background=\"#cccccc\" weight=\"bold\">%s</span>", _("Ask the user to get additional parameters"));
3134     gtk_label_set_markup(label, slabel);
3135     g_free(slabel);
3136     gtk_widget_show(GTK_WIDGET(label));
3137     gtk_box_pack_start (GTK_BOX(box), GTK_WIDGET(label), FALSE, FALSE, 0);
3138 
3139     GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);
3140     gtk_box_pack_start (GTK_BOX (box), scrolled_window, TRUE, TRUE, 0);
3141     GtkWidget *vbox = rfm_vbox_new(FALSE,0);
3142 
3143 
3144     gtk_widget_set_size_request (settings_p->dialog, -1, 300);
3145 
3146 #if GTK_MAJOR_VERSION==3 && GTK_MINOR_VERSION>=8
3147     gtk_container_add(GTK_CONTAINER(scrolled_window), vbox);
3148 
3149 #else
3150     gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), vbox);
3151 #endif
3152 
3153     mk_bit_toggles(settings_p, vbox, id, flags, options_p);
3154     set_bit_toggles(settings_p, id, options_p, flags);
3155     update_combo_entry(settings_p);
3156 
3157     // XXX create ok and cancel buttons
3158 
3159     GtkWidget *button = rfm_dialog_button ("xffm/stock_cancel", _("Cancel"));
3160     gtk_widget_show (button);
3161     gtk_dialog_add_action_widget (GTK_DIALOG (settings_p->dialog), button, GTK_RESPONSE_NO);
3162     g_object_set_data (G_OBJECT (settings_p->dialog), "action_false_button", button);
3163 
3164     button = rfm_dialog_button ("xffm/stock_ok", _("Ok"));
3165     gtk_widget_show (button);
3166     g_object_set_data (G_OBJECT (settings_p->dialog), "action_true_button", button);
3167     gtk_dialog_add_action_widget (GTK_DIALOG (settings_p->dialog), button, GTK_RESPONSE_YES);
3168 
3169     if(widgets_p) {
3170 	view_t *view_p=widgets_p->view_p;
3171         if(view_p && view_p->flags.type == DESKVIEW_TYPE) {
3172 	    gtk_window_set_keep_above (GTK_WINDOW(settings_p->dialog), TRUE);
3173 	    gtk_window_stick (GTK_WINDOW(settings_p->dialog));
3174 	} else {
3175             rfm_global_t *rfm_global_p = rfm_global();
3176             gtk_window_set_modal (GTK_WINDOW (settings_p->dialog), TRUE);
3177             if(rfm_global_p) gtk_window_set_transient_for (GTK_WINDOW (settings_p->dialog), GTK_WINDOW (rfm_global_p->window));
3178         }
3179     } else {
3180 	gtk_window_set_modal (GTK_WINDOW (settings_p->dialog), TRUE);
3181     }
3182 
3183     gtk_widget_show_all(settings_p->dialog);
3184 
3185     gint response = gtk_dialog_run(GTK_DIALOG(settings_p->dialog));
3186     gtk_widget_hide(settings_p->dialog);
3187     gtk_widget_destroy (settings_p->dialog);
3188     g_free(settings_p);
3189     if(response == GTK_RESPONSE_YES) return GINT_TO_POINTER(TRUE);
3190 
3191     return GINT_TO_POINTER(FALSE);
3192 }
3193 
3194 #if 0
3195 // gtk 3 only. but not used as of yet...
3196 GdkRGBA X11_colors[]={
3197  {0.3882,0.7216,1.0000,1.0}, // SteelBlue1 (1)
3198  {0.8588,0.8588,0.8588,1.0}, // grey86 (2)
3199  {0.3608,0.6745,0.9333,1.0}, // SteelBlue2 (3)
3200  {0.4627,0.9333,0.0000,1.0}, // chartreuse2 (4)
3201  {0.4980,1.0000,0.8314,1.0}, // aquamarine1 (5)
3202  {0.8902,0.8902,0.8902,1.0}, // grey89 (6)
3203  {0.5451,0.2275,0.2275,1.0}, // IndianRed4 (7)
3204  {1.0000,0.9255,0.5451,1.0}, // LightGoldenrod1 (8)
3205  {0.5451,0.4941,0.4000,1.0}, // wheat4 (9)
3206  {0.5451,0.3882,0.4235,1.0}, // pink4 (10)
3207  {0.5451,0.3961,0.0314,1.0}, // DarkGoldenrod4 (11)
3208  {1.0000,0.6275,0.4784,1.0}, // LightSalmon1 (12)
3209  {0.5137,0.5451,0.5451,1.0}, // azure4 (13)
3210  {0.7294,0.7294,0.7294,1.0}, // grey73 (14)
3211  {0.4784,0.4039,0.9333,1.0}, // SlateBlue2 (15)
3212  {1.0000,0.5137,0.9804,1.0}, // orchid1 (16)
3213  {0.0627,0.3059,0.5451,1.0}, // DodgerBlue4 (17)
3214  {0.5451,0.5333,0.4706,1.0}, // cornsilk4 (18)
3215  {0.3725,0.6196,0.6275,1.0}, // CadetBlue (19)
3216  {0.9412,0.9020,0.5490,1.0}, // khaki (20)
3217  {0.2314,0.2314,0.2314,1.0}, // grey23 (21)
3218  {0.9333,0.6824,0.9333,1.0}, // plum2 (22)
3219  {0.0000,0.6980,0.9333,1.0}, // DeepSkyBlue2 (23)
3220  {1.0000,0.4314,0.7059,1.0}, // HotPink1 (24)
3221  {0.5412,0.1686,0.8863,1.0}, // BlueViolet (25)
3222  {0.7412,0.7176,0.4196,1.0}, // DarkKhaki (26)
3223  {0.8039,0.1961,0.4706,1.0}, // VioletRed3 (27)
3224  {0.7569,0.8039,0.8039,1.0}, // azure3 (28)
3225  {0.9294,0.9294,0.9294,1.0}, // grey93 (29)
3226  {0.1333,0.5451,0.1333,1.0}, // ForestGreen (30)
3227  {0.4902,0.1490,0.8039,1.0}, // purple3 (31)
3228  {0.5608,0.7373,0.5608,1.0}, // DarkSeaGreen (32)
3229  {0.0000,0.5255,0.5451,1.0}, // turquoise4 (33)
3230  {0.9412,0.9725,1.0000,1.0}, // AliceBlue (34)
3231  {0.9882,0.9882,0.9882,1.0}, // grey99 (35)
3232  {0.1608,0.1608,0.1608,1.0}, // grey16 (36)
3233  {1.0000,0.4980,0.3137,1.0}, // coral (37)
3234  {0.9804,0.9412,0.9020,1.0}, // linen (38)
3235  {0.4000,0.8039,0.6667,1.0}, // aquamarine3 (39)
3236  {0.2196,0.2196,0.2196,1.0}, // grey22 (40)
3237  {1.0000,0.8275,0.6078,1.0}, // burlywood1 (41)
3238  {0.8667,0.6275,0.8667,1.0}, // plum (42)
3239  {0.9333,0.9020,0.5216,1.0}, // khaki2 (43)
3240  {0.9333,0.7961,0.6784,1.0}, // PeachPuff2 (44)
3241  {0.6784,1.0000,0.1843,1.0}, // GreenYellow (45)
3242  {0.5490,0.5490,0.5490,1.0}, // grey55 (46)
3243  {0.9333,0.6039,0.2863,1.0}, // tan2 (47)
3244  {0.3765,0.4824,0.5451,1.0}, // LightSkyBlue4 (48)
3245  {0.5451,0.5451,0.4784,1.0}, // LightYellow4 (49)
3246  {0.0000,0.0000,0.5451,1.0}, // DarkBlue (50)
3247  {0.6275,0.3216,0.1765,1.0}, // sienna (51)
3248  {1.0000,1.0000,0.0000,1.0}, // yellow1 (52)
3249  {0.0588,0.0588,0.0588,1.0}, // grey6 (53)
3250  {0.6902,0.6902,0.6902,1.0}, // grey69 (54)
3251  {0.6706,0.5098,1.0000,1.0}, // MediumPurple1 (55)
3252  {0.0000,0.7725,0.8039,1.0}, // turquoise3 (56)
3253  {0.9333,0.4784,0.9137,1.0}, // orchid2 (57)
3254  {0.0000,0.9608,1.0000,1.0}, // turquoise1 (58)
3255  {0.2706,0.2706,0.2706,1.0}, // grey27 (59)
3256  {0.8039,0.4000,0.0000,1.0}, // DarkOrange3 (60)
3257  {0.8039,0.6784,0.0000,1.0}, // gold3 (61)
3258  {0.9333,0.3608,0.2588,1.0}, // tomato2 (62)
3259  {0.7922,0.8824,1.0000,1.0}, // LightSteelBlue1 (63)
3260  {0.6902,0.8784,0.9020,1.0}, // PowderBlue (64)
3261  {0.5451,0.2706,0.0000,1.0}, // DarkOrange4 (65)
3262  {1.0000,0.7137,0.7569,1.0}, // LightPink (66)
3263  {0.9333,0.4627,0.0000,1.0}, // DarkOrange2 (67)
3264  {0.1255,0.6980,0.6667,1.0}, // LightSeaGreen (68)
3265  {0.8392,0.8392,0.8392,1.0}, // grey84 (69)
3266  {0.9333,0.1725,0.1725,1.0}, // firebrick2 (70)
3267  {0.4863,0.8039,0.4863,1.0}, // PaleGreen3 (71)
3268  {0.6235,0.7137,0.8039,1.0}, // SlateGray3 (72)
3269  {0.5294,0.8078,0.9804,1.0}, // LightSkyBlue (73)
3270  {0.5137,0.4353,1.0000,1.0}, // SlateBlue1 (74)
3271  {0.2706,0.5451,0.0000,1.0}, // chartreuse4 (75)
3272  {0.3255,0.5255,0.5451,1.0}, // CadetBlue4 (76)
3273  {0.5451,0.1098,0.3843,1.0}, // maroon4 (77)
3274  {1.0000,0.5098,0.6706,1.0}, // PaleVioletRed1 (78)
3275  {0.8980,0.8980,0.8980,1.0}, // grey90 (79)
3276  {0.6078,0.1882,1.0000,1.0}, // purple1 (80)
3277  {0.7569,1.0000,0.7569,1.0}, // DarkSeaGreen1 (81)
3278  {0.2902,0.4392,0.5451,1.0}, // SkyBlue4 (82)
3279  {0.6980,0.8745,0.9333,1.0}, // LightBlue2 (83)
3280  {0.5882,0.5882,0.5882,1.0}, // grey59 (84)
3281  {0.3294,1.0000,0.6235,1.0}, // SeaGreen1 (85)
3282  {0.4000,0.5451,0.5451,1.0}, // PaleTurquoise4 (86)
3283  {1.0000,1.0000,0.8784,1.0}, // LightYellow1 (87)
3284  {0.5216,0.5216,0.5216,1.0}, // grey52 (88)
3285  {0.8471,0.7490,0.8471,1.0}, // thistle (89)
3286  {0.3647,0.2784,0.5451,1.0}, // MediumPurple4 (90)
3287  {0.9333,0.4157,0.6549,1.0}, // HotPink2 (91)
3288  {0.0000,0.9333,0.9333,1.0}, // cyan2 (92)
3289  {1.0000,0.0000,0.0000,1.0}, // red1 (93)
3290  {0.6980,0.2275,0.9333,1.0}, // DarkOrchid2 (94)
3291  {0.8706,0.8706,0.8706,1.0}, // grey87 (95)
3292  {0.4784,0.7725,0.8039,1.0}, // CadetBlue3 (96)
3293  {0.9608,0.8706,0.7020,1.0}, // wheat (97)
3294  {0.4627,0.9333,0.7765,1.0}, // aquamarine2 (98)
3295  {0.0000,0.0000,0.5020,1.0}, // NavyBlue (99)
3296  {0.0314,0.0314,0.0314,1.0}, // grey3 (100)
3297  {1.0000,0.2706,0.0000,1.0}, // OrangeRed1 (101)
3298  {1.0000,0.9608,0.9333,1.0}, // seashell1 (102)
3299  {0.8039,0.6078,0.1137,1.0}, // goldenrod3 (103)
3300  {1.0000,0.3882,0.2784,1.0}, // tomato1 (104)
3301  {0.5451,0.2784,0.3647,1.0}, // PaleVioletRed4 (105)
3302  {0.9333,0.6353,0.6784,1.0}, // LightPink2 (106)
3303  {0.4980,1.0000,0.0000,1.0}, // chartreuse1 (107)
3304  {0.9333,0.8980,0.8706,1.0}, // seashell2 (108)
3305  {0.4667,0.5333,0.6000,1.0}, // LightSlateGrey (109)
3306  {0.2588,0.2588,0.2588,1.0}, // grey26 (110)
3307  {0.8549,0.6471,0.1255,1.0}, // goldenrod (111)
3308  {0.6275,0.1255,0.9412,1.0}, // purple (112)
3309  {0.6902,0.8863,1.0000,1.0}, // LightSkyBlue1 (113)
3310  {0.3608,0.3608,0.3608,1.0}, // grey36 (114)
3311  {0.8039,0.5216,0.2471,1.0}, // tan3 (115)
3312  {0.8039,0.1490,0.1490,1.0}, // firebrick3 (116)
3313  {0.9333,0.9098,0.8039,1.0}, // cornsilk2 (117)
3314  {0.5451,0.1373,0.1373,1.0}, // brown4 (118)
3315  {0.9333,0.6627,0.7216,1.0}, // pink2 (119)
3316  {0.7490,0.9373,1.0000,1.0}, // LightBlue1 (120)
3317  {0.4392,0.5020,0.5647,1.0}, // SlateGrey (121)
3318  {0.9333,0.8118,0.6314,1.0}, // NavajoWhite2 (122)
3319  {0.8706,0.7216,0.5294,1.0}, // burlywood (123)
3320  {0.6784,0.8471,0.9020,1.0}, // LightBlue (124)
3321  {1.0000,0.9804,0.9804,1.0}, // snow1 (125)
3322  {0.6039,0.7529,0.8039,1.0}, // LightBlue3 (126)
3323  {0.7098,0.7098,0.7098,1.0}, // grey71 (127)
3324  {0.8039,0.2000,0.2000,1.0}, // brown3 (128)
3325  {0.8039,0.6667,0.4902,1.0}, // burlywood3 (129)
3326  {0.8039,0.5686,0.6196,1.0}, // pink3 (130)
3327  {0.5451,0.2118,0.1490,1.0}, // tomato4 (131)
3328  {1.0000,0.7569,0.1451,1.0}, // goldenrod1 (132)
3329  {0.9569,0.6431,0.3765,1.0}, // SandyBrown (133)
3330  {0.7608,0.7608,0.7608,1.0}, // grey76 (134)
3331  {0.0000,1.0000,0.4980,1.0}, // SpringGreen1 (135)
3332  {0.4157,0.3529,0.8039,1.0}, // SlateBlue (136)
3333  {0.7294,0.3333,0.8275,1.0}, // MediumOrchid (137)
3334  {0.5098,0.5098,0.5098,1.0}, // grey51 (138)
3335  {0.2510,0.8784,0.8157,1.0}, // turquoise (139)
3336  {0.4784,0.4784,0.4784,1.0}, // grey48 (140)
3337  {0.9333,0.4745,0.6235,1.0}, // PaleVioletRed2 (141)
3338  {0.9490,0.9490,0.9490,1.0}, // grey95 (142)
3339  {0.1020,0.1020,0.1020,1.0}, // grey10 (143)
3340  {0.0196,0.0196,0.0196,1.0}, // grey2 (144)
3341  {1.0000,0.5490,0.4118,1.0}, // salmon1 (145)
3342  {0.9608,1.0000,0.9804,1.0}, // MintCream (146)
3343  {0.6706,0.6706,0.6706,1.0}, // grey67 (147)
3344  {0.5451,0.0000,0.5451,1.0}, // DarkMagenta (148)
3345  {0.8039,0.5059,0.3843,1.0}, // LightSalmon3 (149)
3346  {0.8039,0.4078,0.5373,1.0}, // PaleVioletRed3 (150)
3347  {0.6078,0.8039,0.6078,1.0}, // DarkSeaGreen3 (151)
3348  {0.3490,0.3490,0.3490,1.0}, // grey35 (152)
3349  {1.0000,0.4157,0.4157,1.0}, // IndianRed1 (153)
3350  {0.9333,0.7059,0.7059,1.0}, // RosyBrown2 (154)
3351  {0.9333,0.9333,0.8196,1.0}, // LightYellow2 (155)
3352  {0.9333,0.3882,0.3882,1.0}, // IndianRed2 (156)
3353  {0.4784,0.5451,0.5451,1.0}, // LightCyan4 (157)
3354  {0.9333,0.1882,0.6549,1.0}, // maroon2 (158)
3355  {0.7020,0.9333,0.2275,1.0}, // OliveDrab2 (159)
3356  {0.0000,0.0000,0.9333,1.0}, // blue2 (160)
3357  {0.8784,0.9333,0.9333,1.0}, // azure2 (161)
3358  {0.4784,0.2157,0.5451,1.0}, // MediumOrchid4 (162)
3359  {0.5765,0.4392,0.8588,1.0}, // MediumPurple (163)
3360  {0.5686,0.1725,0.9333,1.0}, // purple2 (164)
3361  {0.9333,0.2275,0.5490,1.0}, // VioletRed2 (165)
3362  {0.9333,0.8784,0.8980,1.0}, // LavenderBlush2 (166)
3363  {0.3922,0.5843,0.9294,1.0}, // CornflowerBlue (167)
3364  {0.4863,0.9882,0.0000,1.0}, // LawnGreen (168)
3365  {1.0000,0.2431,0.5882,1.0}, // VioletRed1 (169)
3366  {0.1294,0.1294,0.1294,1.0}, // grey13 (170)
3367  {1.0000,0.9647,0.5608,1.0}, // khaki1 (171)
3368  {0.9333,0.9333,0.8784,1.0}, // ivory2 (172)
3369  {0.4588,0.4588,0.4588,1.0}, // grey46 (173)
3370  {0.5686,0.5686,0.5686,1.0}, // grey57 (174)
3371  {0.3333,0.1020,0.5451,1.0}, // purple4 (175)
3372  {0.8039,0.7176,0.7098,1.0}, // MistyRose3 (176)
3373  {0.6588,0.6588,0.6588,1.0}, // grey66 (177)
3374  {0.9922,0.9608,0.9020,1.0}, // OldLace (178)
3375  {0.7569,0.8039,0.7569,1.0}, // honeydew3 (179)
3376  {0.9412,0.9412,0.9412,1.0}, // grey94 (180)
3377  {0.7412,0.7412,0.7412,1.0}, // grey74 (181)
3378  {0.7020,0.7020,0.7020,1.0}, // grey70 (182)
3379  {0.6353,0.8039,0.3529,1.0}, // DarkOliveGreen3 (183)
3380  {0.4941,0.7529,0.9333,1.0}, // SkyBlue2 (184)
3381  {0.0000,1.0000,1.0000,1.0}, // cyan1 (185)
3382  {0.8039,0.7098,0.8039,1.0}, // thistle3 (186)
3383  {0.5451,0.0392,0.3137,1.0}, // DeepPink4 (187)
3384  {0.2275,0.3725,0.8039,1.0}, // RoyalBlue3 (188)
3385  {0.0706,0.0706,0.0706,1.0}, // grey7 (189)
3386  {0.0000,0.9804,0.6039,1.0}, // MediumSpringGreen (190)
3387  {0.7216,0.5255,0.0431,1.0}, // DarkGoldenrod (191)
3388  {0.8039,0.4078,0.2235,1.0}, // sienna3 (192)
3389  {0.8196,0.3725,0.9333,1.0}, // MediumOrchid2 (193)
3390  {0.5451,0.1333,0.3216,1.0}, // VioletRed4 (194)
3391  {0.8039,0.3608,0.3608,1.0}, // IndianRed (195)
3392  {0.6392,0.6392,0.6392,1.0}, // grey64 (196)
3393  {0.0000,0.5451,0.2706,1.0}, // SpringGreen4 (197)
3394  {0.9333,0.8745,0.8000,1.0}, // AntiqueWhite2 (198)
3395  {0.8039,0.3765,0.5647,1.0}, // HotPink3 (199)
3396  {0.4392,0.4392,0.4392,1.0}, // grey44 (200)
3397  {0.3294,0.3294,0.3294,1.0}, // grey33 (201)
3398  {0.1882,0.1882,0.1882,1.0}, // grey19 (202)
3399  {0.7059,0.8039,0.8039,1.0}, // LightCyan3 (203)
3400  {0.2824,0.2392,0.5451,1.0}, // DarkSlateBlue (204)
3401  {0.0000,0.6039,0.8039,1.0}, // DeepSkyBlue3 (205)
3402  {0.9333,0.7882,0.0000,1.0}, // gold2 (206)
3403  {0.5451,0.3412,0.2588,1.0}, // LightSalmon4 (207)
3404  {0.5451,0.3529,0.1686,1.0}, // tan4 (208)
3405  {1.0000,0.8941,0.7686,1.0}, // bisque1 (209)
3406  {0.4314,0.5451,0.2392,1.0}, // DarkOliveGreen4 (210)
3407  {0.5529,0.9333,0.9333,1.0}, // DarkSlateGray2 (211)
3408  {1.0000,0.1882,0.1882,1.0}, // firebrick1 (212)
3409  {0.6235,0.4745,0.9333,1.0}, // MediumPurple2 (213)
3410  {0.5451,0.1020,0.1020,1.0}, // firebrick4 (214)
3411  {0.4314,0.4314,0.4314,1.0}, // grey43 (215)
3412  {0.5451,0.0000,0.0000,1.0}, // DarkRed (216)
3413  {0.6902,0.7686,0.8706,1.0}, // LightSteelBlue (217)
3414  {0.3882,0.3882,0.3882,1.0}, // grey39 (218)
3415  {0.8039,0.4392,0.3294,1.0}, // salmon3 (219)
3416  {0.6784,0.6784,0.6784,1.0}, // grey68 (220)
3417  {0.9333,0.7059,0.1333,1.0}, // goldenrod2 (221)
3418  {0.8627,0.8627,0.8627,1.0}, // gainsboro (222)
3419  {0.5569,0.8980,0.9333,1.0}, // CadetBlue2 (223)
3420  {1.0000,0.0784,0.5765,1.0}, // DeepPink1 (224)
3421  {0.3333,0.4196,0.1843,1.0}, // DarkOliveGreen (225)
3422  {0.2784,0.2353,0.5451,1.0}, // SlateBlue4 (226)
3423  {0.8039,0.5216,0.0000,1.0}, // orange3 (227)
3424  {1.0000,0.8941,0.7098,1.0}, // moccasin (228)
3425  {0.5294,0.8078,0.9216,1.0}, // SkyBlue (229)
3426  {0.7373,0.5608,0.5608,1.0}, // RosyBrown (230)
3427  {0.6431,0.8275,0.9333,1.0}, // LightSkyBlue2 (231)
3428  {0.9804,0.9804,0.8235,1.0}, // LightGoldenrodYellow (232)
3429  {0.9333,0.6039,0.0000,1.0}, // orange2 (233)
3430  {0.7490,0.2431,1.0000,1.0}, // DarkOrchid1 (234)
3431  {0.7529,1.0000,0.2431,1.0}, // OliveDrab1 (235)
3432  {1.0000,0.6824,0.7255,1.0}, // LightPink1 (236)
3433  {0.9333,0.4745,0.2588,1.0}, // sienna2 (237)
3434  {0.8118,0.8118,0.8118,1.0}, // grey81 (238)
3435  {1.0000,0.7529,0.7961,1.0}, // pink (239)
3436  {1.0000,0.4980,0.0000,1.0}, // DarkOrange1 (240)
3437  {1.0000,0.7569,0.7569,1.0}, // RosyBrown1 (241)
3438  {0.8039,0.4000,0.1137,1.0}, // chocolate3 (242)
3439  {1.0000,0.7098,0.7725,1.0}, // pink1 (243)
3440  {0.9333,0.8353,0.8235,1.0}, // MistyRose2 (244)
3441  {1.0000,0.6471,0.3098,1.0}, // tan1 (245)
3442  {1.0000,0.8549,0.7255,1.0}, // PeachPuff1 (246)
3443  {0.0000,0.7490,1.0000,1.0}, // DeepSkyBlue1 (247)
3444  {0.9412,1.0000,0.9412,1.0}, // honeydew1 (248)
3445  {0.7686,0.7686,0.7686,1.0}, // grey77 (249)
3446  {0.5451,0.2784,0.1490,1.0}, // sienna4 (250)
3447  {0.5451,0.5059,0.2980,1.0}, // LightGoldenrod4 (251)
3448  {0.2000,0.2000,0.2000,1.0}, // grey20 (252)
3449  {0.9804,0.9216,0.8431,1.0}, // AntiqueWhite (253)
3450  {0.0118,0.0118,0.0118,1.0}, // grey1 (254)
3451  {1.0000,1.0000,1.0000,1.0}, // grey100 (255)
3452  {0.8275,0.8275,0.8275,1.0}, // LightGray (256)
3453  {0.2745,0.5098,0.7059,1.0}, // SteelBlue (257)
3454  {0.9412,0.5020,0.5020,1.0}, // LightCoral (258)
3455  {0.9333,0.8667,0.5098,1.0}, // LightGoldenrod (259)
3456  {0.9333,0.0706,0.5373,1.0}, // DeepPink2 (260)
3457  {0.8510,0.8510,0.8510,1.0}, // grey85 (261)
3458  {0.8588,0.4392,0.5765,1.0}, // PaleVioletRed (262)
3459  {0.8039,0.4118,0.7882,1.0}, // orchid3 (263)
3460  {0.2784,0.2784,0.2784,1.0}, // grey28 (264)
3461  {0.0510,0.0510,0.0510,1.0}, // grey5 (265)
3462  {0.8039,0.8039,0.0000,1.0}, // yellow3 (266)
3463  {0.4980,0.4980,0.4980,1.0}, // grey50 (267)
3464  {0.5451,0.5451,0.5137,1.0}, // ivory4 (268)
3465  {0.5451,0.2431,0.1843,1.0}, // coral4 (269)
3466  {0.2706,0.5451,0.4549,1.0}, // aquamarine4 (270)
3467  {0.9333,0.8471,0.6824,1.0}, // wheat2 (271)
3468  {0.7333,1.0000,1.0000,1.0}, // PaleTurquoise1 (272)
3469  {0.0902,0.0902,0.0902,1.0}, // grey9 (273)
3470  {0.1098,0.1098,0.1098,1.0}, // grey11 (274)
3471  {0.9608,0.9608,0.8627,1.0}, // beige (275)
3472  {0.6980,0.1333,0.1333,1.0}, // firebrick (276)
3473  {0.8039,0.7176,0.6196,1.0}, // bisque3 (277)
3474  {0.9333,0.0000,0.9333,1.0}, // magenta2 (278)
3475  {1.0000,0.4471,0.3373,1.0}, // coral1 (279)
3476  {0.0000,0.0000,1.0000,1.0}, // blue1 (280)
3477  {0.3098,0.5804,0.8039,1.0}, // SteelBlue3 (281)
3478  {0.1961,0.8039,0.1961,1.0}, // LimeGreen (282)
3479  {0.0000,0.9333,0.4627,1.0}, // SpringGreen2 (283)
3480  {0.9333,0.4157,0.3137,1.0}, // coral2 (284)
3481  {1.0000,0.4118,0.7059,1.0}, // HotPink (285)
3482  {0.9333,0.5098,0.3843,1.0}, // salmon2 (286)
3483  {1.0000,1.0000,0.9412,1.0}, // ivory1 (287)
3484  {0.8784,1.0000,1.0000,1.0}, // LightCyan1 (288)
3485  {0.6039,1.0000,0.6039,1.0}, // PaleGreen1 (289)
3486  {0.9333,0.4627,0.1294,1.0}, // chocolate2 (290)
3487  {0.8235,0.7059,0.5490,1.0}, // tan (291)
3488  {0.8235,0.4118,0.1176,1.0}, // chocolate (292)
3489  {0.6471,0.1647,0.1647,1.0}, // brown (293)
3490  {0.8039,0.8039,0.7569,1.0}, // ivory3 (294)
3491  {0.6510,0.6510,0.6510,1.0}, // grey65 (295)
3492  {0.4118,0.5451,0.4118,1.0}, // DarkSeaGreen4 (296)
3493  {0.7922,1.0000,0.4392,1.0}, // DarkOliveGreen1 (297)
3494  {0.4118,0.4118,0.4118,1.0}, // grey41 (298)
3495  {1.0000,0.9373,0.8588,1.0}, // AntiqueWhite1 (299)
3496  {0.6039,0.8039,0.1961,1.0}, // OliveDrab3 (300)
3497  {0.8039,0.5490,0.5843,1.0}, // LightPink3 (301)
3498  {0.5451,0.4902,0.4196,1.0}, // bisque4 (302)
3499  {0.2627,0.8039,0.5020,1.0}, // SeaGreen3 (303)
3500  {0.0000,0.5451,0.0000,1.0}, // green4 (304)
3501  {0.8039,0.7765,0.4510,1.0}, // khaki3 (305)
3502  {0.1843,0.3098,0.3098,1.0}, // DarkSlateGrey (306)
3503  {0.6353,0.7098,0.8039,1.0}, // LightSteelBlue3 (307)
3504  {0.5451,0.4824,0.5451,1.0}, // thistle4 (308)
3505  {0.9333,0.2510,0.0000,1.0}, // OrangeRed2 (309)
3506  {1.0000,0.2510,0.2510,1.0}, // brown1 (310)
3507  {0.1176,0.5647,1.0000,1.0}, // DodgerBlue1 (311)
3508  {0.0000,1.0000,0.0000,1.0}, // green1 (312)
3509  {0.4078,0.1333,0.5451,1.0}, // DarkOrchid4 (313)
3510  {0.3216,0.3216,0.3216,1.0}, // grey32 (314)
3511  {0.4196,0.5569,0.1373,1.0}, // OliveDrab (315)
3512  {0.0941,0.4549,0.8039,1.0}, // DodgerBlue3 (316)
3513  {0.8039,0.5882,0.8039,1.0}, // plum3 (317)
3514  {0.8039,0.3569,0.2706,1.0}, // coral3 (318)
3515  {0.0000,0.0000,0.0000,1.0}, // grey0 (319)
3516  {0.5922,1.0000,1.0000,1.0}, // DarkSlateGray1 (320)
3517  {0.9333,0.5098,0.9333,1.0}, // violet (321)
3518  {0.4235,0.4824,0.5451,1.0}, // SlateGray4 (322)
3519  {0.9333,0.2314,0.2314,1.0}, // brown2 (323)
3520  {0.5451,0.2980,0.2235,1.0}, // salmon4 (324)
3521  {0.0000,0.0000,0.8039,1.0}, // blue3 (325)
3522  {1.0000,0.9804,0.8039,1.0}, // LemonChiffon1 (326)
3523  {0.8039,0.7725,0.7490,1.0}, // seashell3 (327)
3524  {1.0000,0.6471,0.0000,1.0}, // orange1 (328)
3525  {0.8039,0.1608,0.5647,1.0}, // maroon3 (329)
3526  {0.9333,0.6784,0.0549,1.0}, // DarkGoldenrod2 (330)
3527  {0.9608,0.9608,0.9608,1.0}, // grey96 (331)
3528  {0.2118,0.2118,0.2118,1.0}, // grey21 (332)
3529  {0.3294,0.5451,0.3294,1.0}, // PaleGreen4 (333)
3530  {0.9333,0.8235,0.9333,1.0}, // thistle2 (334)
3531  {0.4196,0.4196,0.4196,1.0}, // grey42 (335)
3532  {1.0000,0.9412,0.9608,1.0}, // LavenderBlush1 (336)
3533  {0.5294,0.8078,1.0000,1.0}, // SkyBlue1 (337)
3534  {0.8039,0.7294,0.5882,1.0}, // wheat3 (338)
3535  {0.5451,0.4667,0.3961,1.0}, // PeachPuff4 (339)
3536  {0.2824,0.4627,1.0000,1.0}, // RoyalBlue1 (340)
3537  {0.5451,0.2784,0.5373,1.0}, // orchid4 (341)
3538  {0.8784,0.9333,0.8784,1.0}, // honeydew2 (342)
3539  {0.5804,0.0000,0.8275,1.0}, // DarkViolet (343)
3540  {0.0000,0.3922,0.0000,1.0}, // DarkGreen (344)
3541  {1.0000,0.5490,0.0000,1.0}, // DarkOrange (345)
3542  {0.5647,0.9333,0.5647,1.0}, // LightGreen (346)
3543  {1.0000,0.9059,0.7294,1.0}, // wheat1 (347)
3544  {0.2392,0.2392,0.2392,1.0}, // grey24 (348)
3545  {0.6196,0.6196,0.6196,1.0}, // grey62 (349)
3546  {0.8039,0.0000,0.0000,1.0}, // red3 (350)
3547  {0.5451,0.5255,0.3059,1.0}, // khaki4 (351)
3548  {0.8039,0.7843,0.6941,1.0}, // cornsilk3 (352)
3549  {0.8000,0.8000,0.8000,1.0}, // grey80 (353)
3550  {0.1490,0.1490,0.1490,1.0}, // grey15 (354)
3551  {0.5451,0.3725,0.3961,1.0}, // LightPink4 (355)
3552  {0.8039,0.7529,0.6902,1.0}, // AntiqueWhite3 (356)
3553  {0.8196,0.8196,0.8196,1.0}, // grey82 (357)
3554  {0.9412,1.0000,1.0000,1.0}, // azure1 (358)
3555  {0.5451,0.4000,0.5451,1.0}, // plum4 (359)
3556  {0.6118,0.6118,0.6118,1.0}, // grey61 (360)
3557  {0.9020,0.9020,0.9804,1.0}, // lavender (361)
3558  {0.5608,0.5608,0.5608,1.0}, // grey56 (362)
3559  {0.4510,0.4510,0.4510,1.0}, // grey45 (363)
3560  {0.3804,0.3804,0.3804,1.0}, // grey38 (364)
3561  {0.8039,0.7569,0.7725,1.0}, // LavenderBlush3 (365)
3562  {0.5882,0.8039,0.8039,1.0}, // PaleTurquoise3 (366)
3563  {0.8157,0.1255,0.5647,1.0}, // VioletRed (367)
3564  {0.6863,0.9333,0.9333,1.0}, // PaleTurquoise (368)
3565  {0.9098,0.9098,0.9098,1.0}, // grey91 (369)
3566  {0.8039,0.6863,0.5843,1.0}, // PeachPuff3 (370)
3567  {0.5451,0.5137,0.5255,1.0}, // LavenderBlush4 (371)
3568  {0.7490,0.7490,0.7490,1.0}, // grey75 (372)
3569  {0.4902,0.4902,0.4902,1.0}, // grey49 (373)
3570  {0.3098,0.3098,0.3098,1.0}, // grey31 (374)
3571  {0.0784,0.0784,0.0784,1.0}, // grey8 (375)
3572  {0.2824,0.8196,0.8000,1.0}, // MediumTurquoise (376)
3573  {0.9333,0.9137,0.7490,1.0}, // LemonChiffon2 (377)
3574  {0.1216,0.1216,0.1216,1.0}, // grey12 (378)
3575  {0.5294,0.5294,0.5294,1.0}, // grey53 (379)
3576  {0.5961,0.9843,0.5961,1.0}, // PaleGreen (380)
3577  {0.4745,0.8039,0.8039,1.0}, // DarkSlateGray3 (381)
3578  {0.0000,0.8039,0.4000,1.0}, // SpringGreen3 (382)
3579  {0.1686,0.1686,0.1686,1.0}, // grey17 (383)
3580  {0.5451,0.4510,0.3333,1.0}, // burlywood4 (384)
3581  {0.2353,0.7020,0.4431,1.0}, // MediumSeaGreen (385)
3582  {0.8196,0.9333,0.9333,1.0}, // LightCyan2 (386)
3583  {0.4000,0.8039,0.0000,1.0}, // chartreuse3 (387)
3584  {0.5451,0.4118,0.4118,1.0}, // RosyBrown4 (388)
3585  {0.5451,0.4588,0.0000,1.0}, // gold4 (389)
3586  {0.5451,0.5255,0.5098,1.0}, // seashell4 (390)
3587  {0.5451,0.3529,0.0000,1.0}, // orange4 (391)
3588  {0.4118,0.5451,0.1333,1.0}, // OliveDrab4 (392)
3589  {0.0000,0.9333,0.0000,1.0}, // green2 (393)
3590  {0.7451,0.7451,0.7451,1.0}, // grey (394)
3591  {0.9725,0.9725,1.0000,1.0}, // GhostWhite (395)
3592  {0.0000,0.4078,0.5451,1.0}, // DeepSkyBlue4 (396)
3593  {0.5451,0.4118,0.0784,1.0}, // goldenrod4 (397)
3594  {1.0000,0.4980,0.1412,1.0}, // chocolate1 (398)
3595  {1.0000,0.5098,0.2784,1.0}, // sienna1 (399)
3596  {0.5451,0.4745,0.3686,1.0}, // NavajoWhite4 (400)
3597  {0.1098,0.5255,0.9333,1.0}, // DodgerBlue2 (401)
3598  {0.5412,0.5412,0.5412,1.0}, // grey54 (402)
3599  {0.4706,0.4706,0.4706,1.0}, // grey47 (403)
3600  {0.9804,0.5020,0.4471,1.0}, // salmon (404)
3601  {0.5451,0.4902,0.4824,1.0}, // MistyRose4 (405)
3602  {0.9804,0.9804,0.9804,1.0}, // grey98 (406)
3603  {0.3686,0.3686,0.3686,1.0}, // grey37 (407)
3604  {0.5137,0.5451,0.5137,1.0}, // honeydew4 (408)
3605  {0.5451,0.2275,0.3843,1.0}, // HotPink4 (409)
3606  {0.5451,0.2706,0.0745,1.0}, // chocolate4 (410)
3607  {0.8039,0.7882,0.7882,1.0}, // snow3 (411)
3608  {0.5451,0.5451,0.0000,1.0}, // yellow4 (412)
3609  {0.1804,0.5451,0.3412,1.0}, // SeaGreen4 (413)
3610  {1.0000,0.2039,0.7020,1.0}, // maroon1 (414)
3611  {0.5804,0.5804,0.5804,1.0}, // grey58 (415)
3612  {1.0000,0.9216,0.8039,1.0}, // BlanchedAlmond (416)
3613  {0.9333,0.9137,0.9137,1.0}, // snow2 (417)
3614  {0.9686,0.9686,0.9686,1.0}, // grey97 (418)
3615  {0.0000,0.8980,0.9333,1.0}, // turquoise2 (419)
3616  {1.0000,0.0000,1.0000,1.0}, // magenta1 (420)
3617  {1.0000,0.8706,0.6784,1.0}, // NavajoWhite1 (421)
3618  {0.1529,0.2510,0.5451,1.0}, // RoyalBlue4 (422)
3619  {0.2118,0.3922,0.5451,1.0}, // SteelBlue4 (423)
3620  {0.4314,0.4824,0.5451,1.0}, // LightSteelBlue4 (424)
3621  {0.9333,0.7725,0.5686,1.0}, // burlywood2 (425)
3622  {0.7255,0.8275,0.9333,1.0}, // SlateGray2 (426)
3623  {0.0000,0.8039,0.8039,1.0}, // cyan3 (427)
3624  {0.6824,0.9333,0.9333,1.0}, // PaleTurquoise2 (428)
3625  {0.9333,0.8627,0.5098,1.0}, // LightGoldenrod2 (429)
3626  {0.6314,0.6314,0.6314,1.0}, // grey63 (430)
3627  {0.8039,0.3333,0.3333,1.0}, // IndianRed3 (431)
3628  {0.9333,0.8353,0.7176,1.0}, // bisque2 (432)
3629  {0.4235,0.6510,0.8039,1.0}, // SkyBlue3 (433)
3630  {0.8784,0.4000,1.0000,1.0}, // MediumOrchid1 (434)
3631  {1.0000,0.7255,0.0588,1.0}, // DarkGoldenrod1 (435)
3632  {0.4118,0.3490,0.8039,1.0}, // SlateBlue3 (436)
3633  {0.0000,0.8078,0.8196,1.0}, // DarkTurquoise (437)
3634  {0.7804,0.7804,0.7804,1.0}, // grey78 (438)
3635  {0.5451,0.5137,0.4706,1.0}, // AntiqueWhite4 (439)
3636  {1.0000,0.8824,1.0000,1.0}, // thistle1 (440)
3637  {0.5451,0.1451,0.0000,1.0}, // OrangeRed4 (441)
3638  {0.9333,0.9333,0.0000,1.0}, // yellow2 (442)
3639  {0.4824,0.4078,0.9333,1.0}, // MediumSlateBlue (443)
3640  {0.8784,0.8784,0.8784,1.0}, // grey88 (444)
3641  {1.0000,0.8941,0.8824,1.0}, // MistyRose1 (445)
3642  {0.9333,0.9098,0.6667,1.0}, // PaleGoldenrod (446)
3643  {0.8039,0.7451,0.4392,1.0}, // LightGoldenrod3 (447)
3644  {0.8314,0.8314,0.8314,1.0}, // grey83 (448)
3645  {0.7765,0.8863,1.0000,1.0}, // SlateGray1 (449)
3646  {0.0980,0.0980,0.4392,1.0}, // MidnightBlue (450)
3647  {0.8039,0.6078,0.6078,1.0}, // RosyBrown3 (451)
3648  {1.0000,0.8431,0.0000,1.0}, // gold1 (452)
3649  {1.0000,0.7333,1.0000,1.0}, // plum1 (453)
3650  {0.2902,0.2902,0.2902,1.0}, // grey29 (454)
3651  {0.7059,0.9333,0.7059,1.0}, // DarkSeaGreen2 (455)
3652  {0.1412,0.1412,0.1412,1.0}, // grey14 (456)
3653  {0.8039,0.2157,0.0000,1.0}, // OrangeRed3 (457)
3654  {0.8039,0.3098,0.2235,1.0}, // tomato3 (458)
3655  {0.0000,0.8039,0.0000,1.0}, // green3 (459)
3656  {0.8039,0.5843,0.0471,1.0}, // DarkGoldenrod3 (460)
3657  {0.7373,0.9333,0.4078,1.0}, // DarkOliveGreen2 (461)
3658  {0.8549,0.4392,0.8392,1.0}, // orchid (462)
3659  {0.6902,0.1882,0.3765,1.0}, // maroon (463)
3660  {0.5451,0.5373,0.4392,1.0}, // LemonChiffon4 (464)
3661  {0.7059,0.3216,0.8039,1.0}, // MediumOrchid3 (465)
3662  {1.0000,0.9804,0.9412,1.0}, // FloralWhite (466)
3663  {0.5373,0.4078,0.8039,1.0}, // MediumPurple3 (467)
3664  {0.6039,0.1961,0.8039,1.0}, // DarkOrchid3 (468)
3665  {0.9216,0.9216,0.9216,1.0}, // grey92 (469)
3666  {0.7373,0.8235,0.9333,1.0}, // LightSteelBlue2 (470)
3667  {0.6000,0.1961,0.8000,1.0}, // DarkOrchid (471)
3668  {0.9137,0.5882,0.4784,1.0}, // DarkSalmon (472)
3669  {0.0000,0.5451,0.5451,1.0}, // DarkCyan (473)
3670  {0.2549,0.4118,0.8824,1.0}, // RoyalBlue (474)
3671  {0.8039,0.0627,0.4627,1.0}, // DeepPink3 (475)
3672  {0.5529,0.7137,0.8039,1.0}, // LightSkyBlue3 (476)
3673  {0.9333,0.5843,0.4471,1.0}, // LightSalmon2 (477)
3674  {0.7216,0.7216,0.7216,1.0}, // grey72 (478)
3675  {0.3020,0.3020,0.3020,1.0}, // grey30 (479)
3676  {1.0000,0.9725,0.8627,1.0}, // cornsilk1 (480)
3677  {0.8039,0.7882,0.6471,1.0}, // LemonChiffon3 (481)
3678  {0.3216,0.5451,0.5451,1.0}, // DarkSlateGray4 (482)
3679  {0.6627,0.6627,0.6627,1.0}, // DarkGray (483)
3680  {0.7804,0.0824,0.5216,1.0}, // MediumVioletRed (484)
3681  {0.7882,0.7882,0.7882,1.0}, // grey79 (485)
3682  {0.1804,0.1804,0.1804,1.0}, // grey18 (486)
3683  {0.3059,0.9333,0.5804,1.0}, // SeaGreen2 (487)
3684  {0.5451,0.5373,0.5373,1.0}, // snow4 (488)
3685  {0.4078,0.5137,0.5451,1.0}, // LightBlue4 (489)
3686  {0.8039,0.0000,0.8039,1.0}, // magenta3 (490)
3687  {1.0000,0.9373,0.8353,1.0}, // PapayaWhip (491)
3688  {0.4000,0.4000,0.4000,1.0}, // grey40 (492)
3689  {0.2627,0.4314,0.9333,1.0}, // RoyalBlue2 (493)
3690  {0.2510,0.2510,0.2510,1.0}, // grey25 (494)
3691  {0.0392,0.0392,0.0392,1.0}, // grey4 (495)
3692  {0.9333,0.0000,0.0000,1.0}, // red2 (496)
3693  {0.8039,0.7020,0.5451,1.0}, // NavajoWhite3 (497)
3694  {0.5961,0.9608,1.0000,1.0}, // CadetBlue1 (498)
3695  {0.3412,0.3412,0.3412,1.0}, // grey34 (499)
3696  {0.6000,0.6000,0.6000,1.0}, // grey60 (500)
3697  {0.8039,0.8039,0.7059,1.0}, // LightYellow3 (501)
3698  {0.5176,0.4392,1.0000,1.0} // LightSlateBlue (502)
3699 };
3700 #endif
3701 
3702