1 /*
2   DF-SHOW: An interactive directory/file browser written for Unix-like systems.
3   Based on the applications from the PC-DOS DF-EDIT suite by Larry Kroeker.
4   Copyright (C) 2018-2021  Robert Ian Hawdon
5 
6   This program is free software: you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation, either version 3 of the License, or
9   (at your option) any later version.
10 
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15 
16   You should have received a copy of the GNU General Public License
17   along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #define _GNU_SOURCE
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <ncurses.h>
24 #include <string.h>
25 #include <unistd.h>
26 #include <libconfig.h>
27 #include <dirent.h>
28 #include <errno.h>
29 #include "menu.h"
30 #include "display.h"
31 #include "settings.h"
32 #include "common.h"
33 #include "colors.h"
34 #include "input.h"
35 
36 int lightColorPair[256];
37 
38 int colorThemePos = 0;
39 int totalItemCount = 16;
40 
41 int selectedItem;
42 
43 int bgToggle = 0;
44 
45 int themeModified = 0;
46 
47 colorPairs colors[256];
48 
49 char fgbgLabel[11];
50 
51 extern char errmessage[256];
52 
53 extern int colormode;
54 extern int c;
55 extern int * pc;
56 
57 extern char globalConfLocation[128];
58 extern char homeConfLocation[128];
59 
60 menuDef *colorMenu;
61 int colorMenuSize = 0;
62 wchar_t *colorMenuLabel;
63 
processListThemes(const char * pathName)64 void processListThemes(const char * pathName)
65 {
66   DIR *dfDir;
67   struct dirent *res;
68   char currentPath[1024];
69   char currentFile[1024];
70   config_t cfg;
71   config_setting_t *group;
72   strcpy(currentPath, pathName);
73   dfDir = opendir ( currentPath );
74   if (access (currentPath, F_OK) != -1){
75     if (dfDir){
76       while ( ( res = readdir (dfDir))){
77         sprintf(currentFile, "%s/%s", currentPath, res->d_name);
78         if (!check_dir(currentFile)){
79           config_init(&cfg);
80           config_read_file(&cfg, currentFile);
81           group = config_lookup(&cfg, "theme");
82           if (group){
83             printf(" - %s\n", objectFromPath(currentFile));
84           }
85         }
86       }
87       free(res);
88     }
89   }
90 }
91 
listThemes()92 void listThemes()
93 {
94   if (check_dir(DATADIR)) {
95     printf("\nGlobal Themes:\n");
96     processListThemes(DATADIR);
97   }
98   if (check_dir(dirFromPath(homeConfLocation))) {
99     printf("\nPersonal Themes:\n");
100     processListThemes(dirFromPath(homeConfLocation));
101   }
102 }
103 
itemLookup(int menuPos)104 int itemLookup(int menuPos){
105   switch(menuPos){
106   case 0:
107     selectedItem = COMMAND_PAIR;
108     break;
109   case 1:
110     selectedItem = DISPLAY_PAIR;
111     break;
112   case 2:
113     selectedItem = ERROR_PAIR;
114     break;
115   case 3:
116     selectedItem = INFO_PAIR;
117     break;
118   case 4:
119     selectedItem = HEADING_PAIR;
120     break;
121   case 5:
122     selectedItem = DANGER_PAIR;
123     break;
124   case 6:
125     selectedItem = SELECT_PAIR;
126     break;
127   case 7:
128     selectedItem = HILITE_PAIR;
129     break;
130   case 8:
131     selectedItem = INPUT_PAIR;
132     break;
133   case 9:
134     selectedItem = DIR_PAIR;
135     break;
136   case 10:
137     selectedItem = SLINK_PAIR;
138     break;
139   case 11:
140     selectedItem = DEADLINK_PAIR;
141     break;
142   case 12:
143     selectedItem = EXE_PAIR;
144     break;
145   case 13:
146     selectedItem = SUID_PAIR;
147     break;
148   case 14:
149     selectedItem = SGID_PAIR;
150     break;
151   case 15:
152     selectedItem = STICKY_PAIR;
153     break;
154   case 16:
155     selectedItem = STICKY_OW_PAIR;
156     break;
157   default:
158     selectedItem = -1;
159     break;
160   }
161   return(selectedItem);
162 }
163 
setColorPairs(int pair,int foreground,int background,int bold)164 void setColorPairs(int pair, int foreground, int background, int bold){
165   switch(pair){
166   case 1:
167     strcpy(colors[pair].name, "command");
168     break;
169   case 2:
170     strcpy(colors[pair].name, "info");
171     break;
172   case 3:
173     strcpy(colors[pair].name, "input");
174     break;
175   case 4:
176     strcpy(colors[pair].name, "select");
177     break;
178   case 5:
179     strcpy(colors[pair].name, "display");
180     break;
181   case 6:
182     strcpy(colors[pair].name, "danger");
183     break;
184   case 7:
185     strcpy(colors[pair].name, "dir");
186     break;
187   case 8:
188     strcpy(colors[pair].name, "symlink");
189     break;
190   case 9:
191     strcpy(colors[pair].name, "exec");
192     break;
193   case 10:
194     strcpy(colors[pair].name, "suid");
195     break;
196   case 11:
197     strcpy(colors[pair].name, "sgid");
198     break;
199   case 12:
200     strcpy(colors[pair].name, "hilite");
201     break;
202   case 13:
203     strcpy(colors[pair].name, "error");
204     break;
205   case 14:
206     strcpy(colors[pair].name, "heading");
207     break;
208   case 15:
209     strcpy(colors[pair].name, "deadlink");
210     break;
211   case 16:
212     strcpy(colors[pair].name, "sticky");
213     break;
214   case 17:
215     strcpy(colors[pair].name, "sticky-ow");
216     break;
217   default:
218     sprintf(colors[pair].name, "undef-%i", pair);
219     break;
220   }
221   if (COLORS < 9){
222   checkColor:
223     if ( foreground > 8 ){
224       foreground = foreground - 8;
225       bold = 1;
226       goto checkColor;
227     }
228     if ( background > 8 ){
229       background = background - 8;
230       goto checkColor;
231     }
232   }
233   colors[pair].foreground = foreground;
234   colors[pair].background = background;
235   colors[pair].bold = bold;
236 }
237 
useTheme(const char * confFile)238 int useTheme(const char * confFile)
239 {
240   config_t cfg;
241   config_setting_t *root, *setting, *group;
242   int e;
243 
244   config_init(&cfg);
245   config_read_file(&cfg, confFile);
246   root = config_root_setting(&cfg);
247 
248   group = config_setting_get_member(root, "common");
249 
250   if (!group){
251     group = config_setting_add(root, "common", CONFIG_TYPE_GROUP);
252   }
253 
254   config_setting_remove(group, "theme");
255 
256   setting = config_setting_add(group, "theme", CONFIG_TYPE_STRING);
257 
258   config_setting_set_string(setting, getenv("DFS_THEME"));
259 
260   e = config_write_file(&cfg, confFile);
261 
262   return(e);
263 
264 }
265 
refreshColors()266 void refreshColors(){
267   int i;
268   int foreground, background, bold;
269   for ( i = 0; i < 256; i++ ){
270     foreground = colors[i].foreground;
271     background = colors[i].background;
272     bold = colors[i].bold;
273     if (COLORS < 9){
274     checkColor:
275       if ( foreground > 8 ){
276         foreground = foreground - 8;
277         bold = 1;
278         goto checkColor;
279       }
280       if ( background > 8 ){
281         background = background - 8;
282         goto checkColor;
283       }
284     }
285     init_pair(i, foreground, background);
286     lightColorPair[i] = bold;
287   }
288 }
289 
saveTheme()290 void saveTheme(){
291   config_t cfg;
292   config_setting_t *root, *setting, *group, *array;
293   int e, f, i;
294   char filename[1024];
295   char * rewrite;
296   move(0,0);
297   clrtoeol();
298   printMenu(0,0, "Save Colors - Enter pathname:");
299   move(0,30);
300   rewrite = malloc(sizeof(char) * strlen(dirFromPath(homeConfLocation) +1));
301   sprintf(rewrite, "%s/", dirFromPath(homeConfLocation));
302   e = readline(filename, 1024, rewrite);
303   free(rewrite);
304   if ( e == 0 ){
305     if (check_first_char(filename, "~")){
306       rewrite = str_replace(filename, "~", getenv("HOME"));
307       strcpy(filename, rewrite);
308       free(rewrite);
309     }
310     config_init(&cfg);
311     root = config_root_setting(&cfg);
312     group = config_setting_add(root, "theme", CONFIG_TYPE_GROUP);
313     for (i = 1; i < (totalItemCount + 2); i++){
314       array = config_setting_add(group, colors[i].name, CONFIG_TYPE_ARRAY);
315       setting = config_setting_add(array, NULL, CONFIG_TYPE_INT);
316       config_setting_set_int(setting, colors[i].foreground);
317       setting = config_setting_add(array, NULL, CONFIG_TYPE_INT);
318       config_setting_set_int(setting, colors[i].background);
319       setting = config_setting_add(array, NULL, CONFIG_TYPE_INT);
320       config_setting_set_int(setting, colors[i].bold);
321     }
322   saveTheme:
323     if (access(dirFromPath(filename), W_OK) == 0){
324       if (check_file(filename)){
325         curs_set(FALSE);
326         printMenu(0,0, "File exists. Replace? (!Yes/!No)");
327         *pc = getch10th();
328         if (*pc == 'y'){
329           config_write_file(&cfg, filename);
330           setenv("DFS_THEME", objectFromPath(filename), 1);
331         } else {
332           // Skip
333         }
334         curs_set(TRUE);
335         themeBuilder();
336       } else {
337         config_write_file(&cfg, filename);
338         setenv("DFS_THEME", objectFromPath(filename), 1);
339         themeModified = 0;
340       }
341     } else {
342       if (errno == ENOENT){
343         // curs_set(FALSE);
344         // mk_dir(dirFromPath(filename));
345         // config_write_file(&cfg, filename);
346         // // topLineMessage("Error: Unable to write file");
347         // curs_set(TRUE);
348         f = createParentsInput(dirFromPath(filename));
349         if (f == 1){
350           createParentDirs(filename);
351           goto saveTheme;
352         } else {
353           sprintf(errmessage, "Error: %s", strerror(errno));
354           topLineMessage(errmessage);
355         }
356       } else {
357         sprintf(errmessage, "Error: %s", strerror(errno));
358         topLineMessage(errmessage);
359       }
360     }
361     config_destroy(&cfg);
362   }
363   themeBuilder();
364 }
365 
applyTheme(const char * filename)366 int applyTheme(const char *filename){
367   config_t cfg;
368   config_setting_t *root, *setting, *group, *array;
369   int groupLen, i, h;
370   setenv("DFS_THEME", objectFromPath(filename), 1);
371   config_init(&cfg);
372   if (config_read_file(&cfg, filename)){
373     group = config_lookup(&cfg, "theme");
374     groupLen = config_setting_length(group);
375     for (i = 0; i < groupLen; i++){
376       array = config_setting_get_elem(group, i);
377       for (h = 0; h < 256; h++){
378         if (!strcmp(colors[h].name, config_setting_name(array))){
379           setting = config_setting_get_member(group, config_setting_name(array));
380           colors[h].foreground = config_setting_get_int_elem(setting, 0);
381           colors[h].background = config_setting_get_int_elem(setting, 1);
382           colors[h].bold = config_setting_get_int_elem(setting, 2);
383         }
384       }
385 
386     }
387     config_destroy(&cfg);
388     refreshColors();
389     return(0);
390   } else {
391     topLineMessage("Error parsing theme file.");
392     return(1);
393   }
394   return(1);
395 }
396 
loadTheme()397 void loadTheme(){
398   int e;
399   char filename[1024];
400   char * rewrite;
401   move(0,0);
402   clrtoeol();
403   printMenu(0,0, "Load Colors - Enter pathname:");
404   move(0,30);
405   rewrite = malloc(sizeof(char) * strlen(dirFromPath(homeConfLocation) +1));
406   sprintf(rewrite, "%s/", dirFromPath(homeConfLocation));
407   e = readline(filename, 1024, rewrite);
408   free(rewrite);
409   if ( e == 0 ){
410     if (check_first_char(filename, "~")){
411       rewrite = str_replace(filename, "~", getenv("HOME"));
412       strcpy(filename, rewrite);
413       free(rewrite);
414     }
415     if (check_file(filename) ){
416       setenv("DFS_THEME_OVERRIDE", "TRUE", 1);
417       themeModified = 0;
418       applyTheme(filename);
419     } else {
420       curs_set(FALSE);
421       topLineMessage("Error: Unable to read file");
422       // curs_set(TRUE);
423     }
424   }
425   themeBuilder();
426 }
427 
loadAppTheme(const char * themeName)428 void loadAppTheme(const char *themeName)
429 {
430   char * rewrite;
431   // Ignore if the theme requested is called 'default'
432   if (strcmp(themeName, "default") && strcmp(themeName, "\0")){
433       rewrite = malloc(sizeof(char) * (strlen(dirFromPath(homeConfLocation)) + strlen(themeName) + 2));
434       sprintf(rewrite, "%s/%s", dirFromPath(homeConfLocation), themeName);
435       if (check_file(rewrite)){
436         applyTheme(rewrite);
437       } else {
438         free(rewrite);
439         rewrite = malloc(sizeof(char) * (strlen(DATADIR) + strlen(themeName) + 2));
440         sprintf(rewrite, "%s/%s", DATADIR, themeName);
441         if (check_file(rewrite)){
442           applyTheme(rewrite);
443         }
444       }
445       free(rewrite);
446   } else {
447     // Assume default
448     setenv("DFS_THEME", "default", 1);
449   }
450 }
451 
updateColorPair(int code,int location)452 void updateColorPair(int code, int location){
453   int colorCode = -1;
454   int colorBold = 0;
455   themeModified = 1;
456   switch(code){
457   case 0:
458     colorCode = COLOR_BLACK;
459     break;
460   case 1:
461     colorCode = COLOR_RED;
462     break;
463   case 2:
464     colorCode = COLOR_GREEN;
465     break;
466   case 3:
467     colorCode = COLOR_YELLOW;
468     break;
469   case 4:
470     colorCode = COLOR_BLUE;
471     break;
472   case 5:
473     colorCode = COLOR_MAGENTA;
474     break;
475   case 6:
476     colorCode = COLOR_CYAN;
477     break;
478   case 7:
479     colorCode = COLOR_WHITE;
480     break;
481   case 8:
482     if (COLORS > 8){
483       colorCode = BRIGHT_BLACK;
484     } else {
485       colorCode = COLOR_BLACK;
486       colorBold = 1;
487     }
488     break;
489   case 9:
490     if (COLORS > 8){
491       colorCode = BRIGHT_RED;
492     } else {
493       colorCode = COLOR_RED;
494       colorBold = 1;
495     }
496     break;
497   case 10:
498     if (COLORS > 8){
499       colorCode = BRIGHT_GREEN;
500     } else {
501       colorCode = COLOR_GREEN;
502       colorBold = 1;
503     }
504     break;
505   case 11:
506     if (COLORS > 8){
507       colorCode = BRIGHT_YELLOW;
508     } else {
509       colorCode = COLOR_YELLOW;
510       colorBold = 1;
511     }
512     break;
513   case 12:
514     if (COLORS > 8){
515       colorCode = BRIGHT_BLUE;
516     } else {
517       colorCode = COLOR_BLUE;
518       colorBold = 1;
519     }
520     break;
521   case 13:
522     if (COLORS > 8){
523       colorCode = BRIGHT_MAGENTA;
524     } else {
525       colorCode = COLOR_MAGENTA;
526       colorBold = 1;
527     }
528     break;
529   case 14:
530     if (COLORS > 8){
531       colorCode = BRIGHT_CYAN;
532     } else {
533       colorCode = COLOR_CYAN;
534       colorBold = 1;
535     }
536     break;
537   case 15:
538     if (COLORS > 8){
539       colorCode = BRIGHT_WHITE;
540     } else {
541       colorCode = COLOR_WHITE;
542       colorBold = 1;
543     }
544     break;
545   case -1:
546     colorCode = DEFAULT_COLOR;
547     break;
548   case -2:
549     colorCode = DEFAULT_COLOR;
550     colorBold = 1;
551     break;
552   }
553   if (location == 0) {
554     colors[itemLookup(colorThemePos)].foreground = colorCode;
555   } else {
556     colors[itemLookup(colorThemePos)].background = colorCode;
557   }
558   colors[itemLookup(colorThemePos)].bold = colorBold;
559 }
560 
theme_menu_inputs()561 void theme_menu_inputs()
562 {
563   char useThemeMessage[256];
564   while(1)
565     {
566       *pc = getch10th();
567       if (*pc == '!'){
568         updateColorPair(-1, bgToggle);
569         refreshColors();
570         themeBuilder();
571       } else if (*pc == '?'){
572         updateColorPair(-2, bgToggle);
573         refreshColors();
574         themeBuilder();
575       } else if (*pc == '0'){
576         updateColorPair(COLOR_BLACK, bgToggle);
577         refreshColors();
578         themeBuilder();
579       } else if (*pc == '1'){
580         updateColorPair(COLOR_RED, bgToggle);
581         refreshColors();
582         themeBuilder();
583       } else if (*pc == '2'){
584         updateColorPair(COLOR_GREEN, bgToggle);
585         refreshColors();
586         themeBuilder();
587       } else if (*pc == '3'){
588         updateColorPair(COLOR_YELLOW, bgToggle);
589         refreshColors();
590         themeBuilder();
591       } else if (*pc == '4'){
592         updateColorPair(COLOR_BLUE, bgToggle);
593         refreshColors();
594         themeBuilder();
595       } else if (*pc == '5'){
596         updateColorPair(COLOR_MAGENTA, bgToggle);
597         refreshColors();
598         themeBuilder();
599       } else if (*pc == '6'){
600         updateColorPair(COLOR_CYAN, bgToggle);
601         refreshColors();
602         themeBuilder();
603       } else if (*pc == '7'){
604         updateColorPair(COLOR_WHITE, bgToggle);
605         refreshColors();
606         themeBuilder();
607       } else if (*pc == '8'){
608         updateColorPair(BRIGHT_BLACK, bgToggle);
609         refreshColors();
610         themeBuilder();
611       } else if (*pc == '9'){
612         updateColorPair(BRIGHT_RED, bgToggle);
613         refreshColors();
614         themeBuilder();
615       } else if (*pc == 'a'){
616         updateColorPair(BRIGHT_GREEN, bgToggle);
617         refreshColors();
618         themeBuilder();
619       } else if (*pc == 'b'){
620         updateColorPair(BRIGHT_YELLOW, bgToggle);
621         refreshColors();
622         themeBuilder();
623       } else if (*pc == 'c'){
624         updateColorPair(BRIGHT_BLUE, bgToggle);
625         refreshColors();
626         themeBuilder();
627       } else if (*pc == 'd'){
628         updateColorPair(BRIGHT_MAGENTA, bgToggle);
629         refreshColors();
630         themeBuilder();
631       } else if (*pc == 'e'){
632         updateColorPair(BRIGHT_CYAN, bgToggle);
633         refreshColors();
634         themeBuilder();
635       } else if (*pc == 'f'){
636         updateColorPair(BRIGHT_WHITE, bgToggle);
637         refreshColors();
638         themeBuilder();
639       } else if (*pc == menuHotkeyLookup(colorMenu, "c_load", colorMenuSize)){
640         loadTheme();
641       } else if (*pc == menuHotkeyLookup(colorMenu, "c_quit", colorMenuSize)){
642         curs_set(FALSE);
643         return;
644       } else if (*pc == menuHotkeyLookup(colorMenu, "c_save", colorMenuSize)){
645         saveTheme();
646       } else if (*pc == menuHotkeyLookup(colorMenu, "c_toggle", colorMenuSize)){
647         if (bgToggle == 0){
648           bgToggle = 1;
649         } else {
650           bgToggle = 0;
651         }
652         themeBuilder();
653       } else if (*pc == menuHotkeyLookup(colorMenu, "c_use", colorMenuSize)){
654         //
655         if (themeModified == 1){
656           curs_set(FALSE);
657           topLineMessage("Save theme before using as default.");
658         } else {
659           if (access(dirFromPath(homeConfLocation), W_OK) != 0) {
660             createParentDirs(homeConfLocation);
661           }
662           if (useTheme(homeConfLocation)){
663             sprintf(useThemeMessage, "Default theme has been set to [%s].", getenv("DFS_THEME"));
664             topLineMessage(useThemeMessage);
665           } else {
666             topLineMessage("An error occurred setting the default theme.");
667           }
668         }
669         themeBuilder();
670       } else if (*pc == 258 || *pc ==10){
671         if (colorThemePos < totalItemCount){
672           colorThemePos++;
673           themeBuilder();
674         }
675       } else if (*pc == 259){
676         if (colorThemePos > 0) {
677           colorThemePos--;
678           themeBuilder();
679         }
680       } else if (*pc == 260 || *pc == 261){
681         // Do Nothing
682       }
683     }
684 }
685 
setDefaultTheme()686 void setDefaultTheme(){
687   use_default_colors();
688   lightColorPair[0] = 0; // Unused array value
689   setColorPairs(COMMAND_PAIR, DEFAULT_COLOR, DEFAULT_COLOR, 0);
690   setColorPairs(INFO_PAIR, COLOR_GREEN, DEFAULT_COLOR, 0);
691   setColorPairs(INPUT_PAIR, COLOR_BLACK, COLOR_WHITE, 0);
692   setColorPairs(SELECT_PAIR, BRIGHT_BLUE, DEFAULT_COLOR, 0);
693   setColorPairs(DISPLAY_PAIR, COLOR_CYAN, DEFAULT_COLOR, 0);
694   setColorPairs(DANGER_PAIR, BRIGHT_RED, DEFAULT_COLOR, 0);
695   setColorPairs(DIR_PAIR, BRIGHT_MAGENTA, DEFAULT_COLOR, 0);
696   setColorPairs(SLINK_PAIR, DEFAULT_COLOR, DEFAULT_COLOR, 1);
697   setColorPairs(EXE_PAIR, BRIGHT_YELLOW, DEFAULT_COLOR, 0);
698   setColorPairs(SUID_PAIR, DEFAULT_COLOR, COLOR_RED, 0);
699   setColorPairs(SGID_PAIR, COLOR_BLACK, COLOR_GREEN, 1);
700   setColorPairs(HILITE_PAIR, DEFAULT_COLOR, DEFAULT_COLOR, 1);
701   setColorPairs(ERROR_PAIR, DEFAULT_COLOR, DEFAULT_COLOR, 1);
702   setColorPairs(HEADING_PAIR, COLOR_GREEN, DEFAULT_COLOR, 0);
703   setColorPairs(DEADLINK_PAIR, BRIGHT_RED, DEFAULT_COLOR, 0);
704   setColorPairs(STICKY_PAIR, COLOR_WHITE, COLOR_BLUE, 0);
705   setColorPairs(STICKY_OW_PAIR, COLOR_BLACK, COLOR_GREEN, 0);
706 
707   setColorPairs(COLORMENU_PAIR_0, COLOR_BLACK, COLOR_WHITE, 0);
708   setColorPairs(COLORMENU_PAIR_1, COLOR_RED, DEFAULT_COLOR, 0);
709   setColorPairs(COLORMENU_PAIR_2, COLOR_GREEN, DEFAULT_COLOR, 0);
710   setColorPairs(COLORMENU_PAIR_3, COLOR_YELLOW, DEFAULT_COLOR, 0);
711   setColorPairs(COLORMENU_PAIR_4, COLOR_BLUE, DEFAULT_COLOR, 0);
712   setColorPairs(COLORMENU_PAIR_5, COLOR_MAGENTA, DEFAULT_COLOR, 0);
713   setColorPairs(COLORMENU_PAIR_6, COLOR_CYAN, DEFAULT_COLOR, 0);
714   setColorPairs(COLORMENU_PAIR_7, COLOR_WHITE, DEFAULT_COLOR, 0);
715   if (COLORS > 8){
716     setColorPairs(COLORMENU_PAIR_8, BRIGHT_BLACK, COLOR_WHITE, 0);
717     setColorPairs(COLORMENU_PAIR_9, BRIGHT_RED, DEFAULT_COLOR, 0);
718     setColorPairs(COLORMENU_PAIR_A, BRIGHT_GREEN, DEFAULT_COLOR, 0);
719     setColorPairs(COLORMENU_PAIR_B, BRIGHT_YELLOW, DEFAULT_COLOR, 0);
720     setColorPairs(COLORMENU_PAIR_C, BRIGHT_BLUE, DEFAULT_COLOR, 0);
721     setColorPairs(COLORMENU_PAIR_D, BRIGHT_MAGENTA, DEFAULT_COLOR, 0);
722     setColorPairs(COLORMENU_PAIR_E, BRIGHT_CYAN, DEFAULT_COLOR, 0);
723     setColorPairs(COLORMENU_PAIR_F, BRIGHT_WHITE, DEFAULT_COLOR, 0);
724   } else {
725     setColorPairs(COLORMENU_PAIR_8, COLOR_BLACK, COLOR_WHITE, 1);
726     setColorPairs(COLORMENU_PAIR_9, COLOR_RED, DEFAULT_COLOR, 1);
727     setColorPairs(COLORMENU_PAIR_A, COLOR_GREEN, DEFAULT_COLOR, 1);
728     setColorPairs(COLORMENU_PAIR_B, COLOR_YELLOW, DEFAULT_COLOR, 1);
729     setColorPairs(COLORMENU_PAIR_C, COLOR_BLUE, DEFAULT_COLOR, 1);
730     setColorPairs(COLORMENU_PAIR_D, COLOR_MAGENTA, DEFAULT_COLOR, 1);
731     setColorPairs(COLORMENU_PAIR_E, COLOR_CYAN, DEFAULT_COLOR, 1);
732     setColorPairs(COLORMENU_PAIR_F, COLOR_WHITE, DEFAULT_COLOR, 1);
733   }
734 
735   setColorPairs(DEFAULT_BOLD_PAIR, DEFAULT_COLOR, DEFAULT_COLOR, 1);
736   setColorPairs(DEFAULT_COLOR_PAIR, DEFAULT_COLOR, DEFAULT_COLOR, 0);
737 
738   refreshColors();
739 
740 }
741 
setColors(int pair)742 void setColors(int pair)
743 {
744   attron(COLOR_PAIR(pair));
745   if (lightColorPair[pair]){
746     attron(A_BOLD);
747   } else {
748     attroff(A_BOLD);
749   }
750 }
751 
themeBuilder()752 void themeBuilder()
753 {
754   clear();
755   if (bgToggle){
756     strcpy(fgbgLabel, "background");
757   } else {
758     strcpy(fgbgLabel, "foreground");
759   }
760   wPrintMenu(0,0,colorMenuLabel);
761 
762   setColors(COMMAND_PAIR);
763   mvprintw(2, 4, "Command lines");
764   setColors(DISPLAY_PAIR);
765   mvprintw(3, 4, "Display lines");
766   setColors(ERROR_PAIR);
767   mvprintw(4, 4, "Error messages");
768   setColors(INFO_PAIR);
769   mvprintw(5, 4, "Information lines");
770   setColors(HEADING_PAIR);
771   mvprintw(6, 4, "Heading lines");
772   setColors(DANGER_PAIR);
773   mvprintw(7, 4, "Danger lines");
774   setColors(SELECT_PAIR);
775   mvprintw(8, 4, "Selected block lines");
776   setColors(HILITE_PAIR);
777   mvprintw(9, 4, "Highlight");
778   setColors(INPUT_PAIR);
779   mvprintw(10, 4, "Text input");
780   setColors(DIR_PAIR);
781   mvprintw(11, 4, "Directories");
782   setColors(SLINK_PAIR);
783   mvprintw(12, 4, "Symbolic links");
784   setColors(DEADLINK_PAIR);
785   mvprintw(13, 4, "Orphened symbolic links");
786   setColors(EXE_PAIR);
787   mvprintw(14, 4, "Executable files");
788   setColors(SUID_PAIR);
789   mvprintw(15, 4, "Set user identification");
790   setColors(SGID_PAIR);
791   mvprintw(16, 4, "Set group identification");
792   setColors(STICKY_PAIR);
793   mvprintw(17, 4, "Sticky bit directory");
794   setColors(STICKY_OW_PAIR);
795   mvprintw(18, 4, "Sticky bit directory - other writable");
796 
797   setColors(DEFAULT_COLOR_PAIR);
798   mvprintw(2, 45, "!-Default      ");
799   setColors(DEFAULT_BOLD_PAIR);
800   mvprintw(3, 45, "?-Default Bold ");
801   setColors(COLORMENU_PAIR_0);
802   mvprintw(4, 45, "0-Black        ");
803   setColors(COLORMENU_PAIR_1);
804   mvprintw(5, 45, "1-Red          ");
805   setColors(COLORMENU_PAIR_2);
806   mvprintw(6, 45, "2-Green        ");
807   setColors(COLORMENU_PAIR_3);
808   mvprintw(7, 45, "3-Brown        ");
809   setColors(COLORMENU_PAIR_4);
810   mvprintw(8, 45, "4-Blue         ");
811   setColors(COLORMENU_PAIR_5);
812   mvprintw(9, 45, "5-Magenta      ");
813   setColors(COLORMENU_PAIR_6);
814   mvprintw(10, 45, "6-Cyan         ");
815   setColors(COLORMENU_PAIR_7);
816   mvprintw(11, 45, "7-Light Gray   ");
817   setColors(COLORMENU_PAIR_8);
818   mvprintw(12, 45, "8-Dark Gray    ");
819   setColors(COLORMENU_PAIR_9);
820   mvprintw(13, 45, "9-Light Red    ");
821   setColors(COLORMENU_PAIR_A);
822   mvprintw(14, 45, "A-Light Green  ");
823   setColors(COLORMENU_PAIR_B);
824   mvprintw(15, 45, "B-Yellow       ");
825   setColors(COLORMENU_PAIR_C);
826   mvprintw(16, 45, "C-Light Blue   ");
827   setColors(COLORMENU_PAIR_D);
828   mvprintw(17, 45, "D-Light Magenta");
829   setColors(COLORMENU_PAIR_E);
830   mvprintw(18, 45, "E-Light Cyan   ");
831   setColors(COLORMENU_PAIR_F);
832   mvprintw(19, 45, "F-White        ");
833 
834   setColors(DEFAULT_BOLD_PAIR);
835   mvprintw(22, 22, "Select 0 to F for desired %s color", fgbgLabel);
836 
837   attron(A_REVERSE);
838   mvprintw(colorThemePos + 2, 1, " ");
839   attroff(A_REVERSE);
840 
841 
842 }
843