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