Fossil SCM

Add the "skins/details.txt" file to the skins. Change the skin editors so that they can show a diff of the current configuration against any built-in.

drh 2015-03-30 14:08 trunk
Commit 31a337f0c27f5fbc1e59fd0270ae6672b90625ef
+10 -8
--- skins/README.md
+++ skins/README.md
@@ -1,11 +1,11 @@
11
Built-in Skins
22
==============
33
44
Each subdirectory under this folder describes a built-in "skin".
5
-There are three files in each subdirectory for the CSS, the header,
6
-and the footer for that skin.
5
+There are four files in each subdirectory for the CSS, the "details"
6
+file, the footer, and the header for that skin.
77
88
To improve an existing built-in skin, simply edit the appropriate
99
files and recompile.
1010
1111
To add a new skin:
@@ -12,12 +12,13 @@
1212
1313
1. Create a new subdirectory under skins/. (The new directory is
1414
called "skins/newskin" below but you should use a new original
1515
name, of course.)
1616
17
- 2. Add files skins/newskin/css.txt, skins/newskin/header.txt,
18
- and skins/newskin/footer.txt. Be sure to "fossil add" these files.
17
+ 2. Add files skins/newskin/css.txt, skins/newskin/details.txt,
18
+ skins/newskin/footer.txt and skins/newskin/header.txt.
19
+ Be sure to "fossil add" these files.
1920
2021
3. Go to the src/ directory and rerun "tclsh makemake.tcl". This
2122
step rebuilds the various makefiles so that they have dependencies
2223
on the skin files you just installed.
2324
@@ -28,16 +29,17 @@
2829
2930
Development Hints
3031
-----------------
3132
3233
One way to develop a new skin is to copy the baseline files (css.txt,
33
-footer.txt, and header.txt) into a working directory $WORKDIR then
34
-launch Fossil with a command-line option "--skin $WORKDIR". Example:
34
+details.txt, footer.txt, and header.txt) into a working directory $WORKDIR
35
+then launch Fossil with a command-line option "--skin $WORKDIR". Example:
3536
3637
cp -r skins/default newskin
3738
fossil ui --skin ./newskin
3839
3940
When the argument to --skin contains one or more '/' characters, the
4041
appropriate skin files are read from disk from the directory specified.
4142
So after launching fossil as shown above, you can edit the newskin/css.txt,
42
-newskin/header.txt, and newskin/footer.txt files using your favorite
43
-text editor, then press Reload on your browser to see immediate results.
43
+newskin/details.txt, newskin/footer.txt, and newskin/header.txt files using
44
+your favorite text editor, then press Reload on your browser to see
45
+immediate results.
4446
4547
ADDED skins/aht/details.txt
4648
ADDED skins/black_and_white/details.txt
4749
ADDED skins/blitz/details.txt
4850
ADDED skins/blitz_no_logo/details.txt
4951
ADDED skins/default/details.txt
5052
ADDED skins/eagle/details.txt
5153
ADDED skins/enhanced1/details.txt
5254
ADDED skins/khaki/details.txt
5355
ADDED skins/original/details.txt
5456
ADDED skins/plain_gray/details.txt
5557
ADDED skins/rounded1/details.txt
5658
ADDED skins/xekri/details.txt
--- skins/README.md
+++ skins/README.md
@@ -1,11 +1,11 @@
1 Built-in Skins
2 ==============
3
4 Each subdirectory under this folder describes a built-in "skin".
5 There are three files in each subdirectory for the CSS, the header,
6 and the footer for that skin.
7
8 To improve an existing built-in skin, simply edit the appropriate
9 files and recompile.
10
11 To add a new skin:
@@ -12,12 +12,13 @@
12
13 1. Create a new subdirectory under skins/. (The new directory is
14 called "skins/newskin" below but you should use a new original
15 name, of course.)
16
17 2. Add files skins/newskin/css.txt, skins/newskin/header.txt,
18 and skins/newskin/footer.txt. Be sure to "fossil add" these files.
 
19
20 3. Go to the src/ directory and rerun "tclsh makemake.tcl". This
21 step rebuilds the various makefiles so that they have dependencies
22 on the skin files you just installed.
23
@@ -28,16 +29,17 @@
28
29 Development Hints
30 -----------------
31
32 One way to develop a new skin is to copy the baseline files (css.txt,
33 footer.txt, and header.txt) into a working directory $WORKDIR then
34 launch Fossil with a command-line option "--skin $WORKDIR". Example:
35
36 cp -r skins/default newskin
37 fossil ui --skin ./newskin
38
39 When the argument to --skin contains one or more '/' characters, the
40 appropriate skin files are read from disk from the directory specified.
41 So after launching fossil as shown above, you can edit the newskin/css.txt,
42 newskin/header.txt, and newskin/footer.txt files using your favorite
43 text editor, then press Reload on your browser to see immediate results.
 
44
45 DDED skins/aht/details.txt
46 DDED skins/black_and_white/details.txt
47 DDED skins/blitz/details.txt
48 DDED skins/blitz_no_logo/details.txt
49 DDED skins/default/details.txt
50 DDED skins/eagle/details.txt
51 DDED skins/enhanced1/details.txt
52 DDED skins/khaki/details.txt
53 DDED skins/original/details.txt
54 DDED skins/plain_gray/details.txt
55 DDED skins/rounded1/details.txt
56 DDED skins/xekri/details.txt
--- skins/README.md
+++ skins/README.md
@@ -1,11 +1,11 @@
1 Built-in Skins
2 ==============
3
4 Each subdirectory under this folder describes a built-in "skin".
5 There are four files in each subdirectory for the CSS, the "details"
6 file, the footer, and the header for that skin.
7
8 To improve an existing built-in skin, simply edit the appropriate
9 files and recompile.
10
11 To add a new skin:
@@ -12,12 +12,13 @@
12
13 1. Create a new subdirectory under skins/. (The new directory is
14 called "skins/newskin" below but you should use a new original
15 name, of course.)
16
17 2. Add files skins/newskin/css.txt, skins/newskin/details.txt,
18 skins/newskin/footer.txt and skins/newskin/header.txt.
19 Be sure to "fossil add" these files.
20
21 3. Go to the src/ directory and rerun "tclsh makemake.tcl". This
22 step rebuilds the various makefiles so that they have dependencies
23 on the skin files you just installed.
24
@@ -28,16 +29,17 @@
29
30 Development Hints
31 -----------------
32
33 One way to develop a new skin is to copy the baseline files (css.txt,
34 details.txt, footer.txt, and header.txt) into a working directory $WORKDIR
35 then launch Fossil with a command-line option "--skin $WORKDIR". Example:
36
37 cp -r skins/default newskin
38 fossil ui --skin ./newskin
39
40 When the argument to --skin contains one or more '/' characters, the
41 appropriate skin files are read from disk from the directory specified.
42 So after launching fossil as shown above, you can edit the newskin/css.txt,
43 newskin/details.txt, newskin/footer.txt, and newskin/header.txt files using
44 your favorite text editor, then press Reload on your browser to see
45 immediate results.
46
47 DDED skins/aht/details.txt
48 DDED skins/black_and_white/details.txt
49 DDED skins/blitz/details.txt
50 DDED skins/blitz_no_logo/details.txt
51 DDED skins/default/details.txt
52 DDED skins/eagle/details.txt
53 DDED skins/enhanced1/details.txt
54 DDED skins/khaki/details.txt
55 DDED skins/original/details.txt
56 DDED skins/plain_gray/details.txt
57 DDED skins/rounded1/details.txt
58 DDED skins/xekri/details.txt
--- a/skins/aht/details.txt
+++ b/skins/aht/details.txt
@@ -0,0 +1,2 @@
1
+white-foreground: 0
2
+timeline-arrows: 1
--- a/skins/aht/details.txt
+++ b/skins/aht/details.txt
@@ -0,0 +1,2 @@
 
 
--- a/skins/aht/details.txt
+++ b/skins/aht/details.txt
@@ -0,0 +1,2 @@
1 white-foreground: 0
2 timeline-arrows: 1
--- a/skins/black_and_white/details.txt
+++ b/skins/black_and_white/details.txt
@@ -0,0 +1,2 @@
1
+white-foreground: 0
2
+timeline-arrows: 1
--- a/skins/black_and_white/details.txt
+++ b/skins/black_and_white/details.txt
@@ -0,0 +1,2 @@
 
 
--- a/skins/black_and_white/details.txt
+++ b/skins/black_and_white/details.txt
@@ -0,0 +1,2 @@
1 white-foreground: 0
2 timeline-arrows: 1
--- a/skins/blitz/details.txt
+++ b/skins/blitz/details.txt
@@ -0,0 +1,2 @@
1
+white-foreground: 0
2
+timeline-arrows: 1
--- a/skins/blitz/details.txt
+++ b/skins/blitz/details.txt
@@ -0,0 +1,2 @@
 
 
--- a/skins/blitz/details.txt
+++ b/skins/blitz/details.txt
@@ -0,0 +1,2 @@
1 white-foreground: 0
2 timeline-arrows: 1
--- a/skins/blitz_no_logo/details.txt
+++ b/skins/blitz_no_logo/details.txt
@@ -0,0 +1,2 @@
1
+white-foreground: 0
2
+timeline-arrows: 1
--- a/skins/blitz_no_logo/details.txt
+++ b/skins/blitz_no_logo/details.txt
@@ -0,0 +1,2 @@
 
 
--- a/skins/blitz_no_logo/details.txt
+++ b/skins/blitz_no_logo/details.txt
@@ -0,0 +1,2 @@
1 white-foreground: 0
2 timeline-arrows: 1
--- a/skins/default/details.txt
+++ b/skins/default/details.txt
@@ -0,0 +1,2 @@
1
+white-foreground: 0
2
+timeline-arrows: 1
--- a/skins/default/details.txt
+++ b/skins/default/details.txt
@@ -0,0 +1,2 @@
 
 
--- a/skins/default/details.txt
+++ b/skins/default/details.txt
@@ -0,0 +1,2 @@
1 white-foreground: 0
2 timeline-arrows: 1
--- a/skins/eagle/details.txt
+++ b/skins/eagle/details.txt
@@ -0,0 +1,2 @@
1
+white-foreground: 1
2
+timeline-arrows: 1
--- a/skins/eagle/details.txt
+++ b/skins/eagle/details.txt
@@ -0,0 +1,2 @@
 
 
--- a/skins/eagle/details.txt
+++ b/skins/eagle/details.txt
@@ -0,0 +1,2 @@
1 white-foreground: 1
2 timeline-arrows: 1
--- a/skins/enhanced1/details.txt
+++ b/skins/enhanced1/details.txt
@@ -0,0 +1,2 @@
1
+white-foreground: 0
2
+timeline-arrows: 1
--- a/skins/enhanced1/details.txt
+++ b/skins/enhanced1/details.txt
@@ -0,0 +1,2 @@
 
 
--- a/skins/enhanced1/details.txt
+++ b/skins/enhanced1/details.txt
@@ -0,0 +1,2 @@
1 white-foreground: 0
2 timeline-arrows: 1
--- a/skins/khaki/details.txt
+++ b/skins/khaki/details.txt
@@ -0,0 +1,2 @@
1
+white-foreground: 0
2
+timeline-arrows: 1
--- a/skins/khaki/details.txt
+++ b/skins/khaki/details.txt
@@ -0,0 +1,2 @@
 
 
--- a/skins/khaki/details.txt
+++ b/skins/khaki/details.txt
@@ -0,0 +1,2 @@
1 white-foreground: 0
2 timeline-arrows: 1
--- a/skins/original/details.txt
+++ b/skins/original/details.txt
@@ -0,0 +1,2 @@
1
+white-foreground: 0
2
+timeline-arrows: 1
--- a/skins/original/details.txt
+++ b/skins/original/details.txt
@@ -0,0 +1,2 @@
 
 
--- a/skins/original/details.txt
+++ b/skins/original/details.txt
@@ -0,0 +1,2 @@
1 white-foreground: 0
2 timeline-arrows: 1
--- a/skins/plain_gray/details.txt
+++ b/skins/plain_gray/details.txt
@@ -0,0 +1,2 @@
1
+white-foreground: 0
2
+timeline-arrows: 1
--- a/skins/plain_gray/details.txt
+++ b/skins/plain_gray/details.txt
@@ -0,0 +1,2 @@
 
 
--- a/skins/plain_gray/details.txt
+++ b/skins/plain_gray/details.txt
@@ -0,0 +1,2 @@
1 white-foreground: 0
2 timeline-arrows: 1
--- a/skins/rounded1/details.txt
+++ b/skins/rounded1/details.txt
@@ -0,0 +1,2 @@
1
+white-foreground: 0
2
+timeline-arrows: 1
--- a/skins/rounded1/details.txt
+++ b/skins/rounded1/details.txt
@@ -0,0 +1,2 @@
 
 
--- a/skins/rounded1/details.txt
+++ b/skins/rounded1/details.txt
@@ -0,0 +1,2 @@
1 white-foreground: 0
2 timeline-arrows: 1
--- a/skins/xekri/details.txt
+++ b/skins/xekri/details.txt
@@ -0,0 +1,2 @@
1
+white-foreground: 0
2
+timeline-arrows: 1
--- a/skins/xekri/details.txt
+++ b/skins/xekri/details.txt
@@ -0,0 +1,2 @@
 
 
--- a/skins/xekri/details.txt
+++ b/skins/xekri/details.txt
@@ -0,0 +1,2 @@
1 white-foreground: 0
2 timeline-arrows: 1
+1 -1
--- src/configure.c
+++ src/configure.c
@@ -86,10 +86,11 @@
8686
int groupMask; /* Which config groups is it part of */
8787
} aConfig[] = {
8888
{ "css", CONFIGSET_CSS },
8989
{ "header", CONFIGSET_SKIN },
9090
{ "footer", CONFIGSET_SKIN },
91
+ { "details", CONFIGSET_SKIN },
9192
{ "logo-mimetype", CONFIGSET_SKIN },
9293
{ "logo-image", CONFIGSET_SKIN },
9394
{ "background-mimetype", CONFIGSET_SKIN },
9495
{ "background-image", CONFIGSET_SKIN },
9596
{ "timeline-block-markup", CONFIGSET_SKIN },
@@ -96,11 +97,10 @@
9697
{ "timeline-max-comment", CONFIGSET_SKIN },
9798
{ "timeline-plaintext", CONFIGSET_SKIN },
9899
{ "adunit", CONFIGSET_SKIN },
99100
{ "adunit-omit-if-admin", CONFIGSET_SKIN },
100101
{ "adunit-omit-if-user", CONFIGSET_SKIN },
101
- { "white-foreground", CONFIGSET_SKIN },
102102
103103
#ifdef FOSSIL_ENABLE_TH1_DOCS
104104
{ "th1-docs", CONFIGSET_TH1 },
105105
#endif
106106
#ifdef FOSSIL_ENABLE_TH1_HOOKS
107107
--- src/configure.c
+++ src/configure.c
@@ -86,10 +86,11 @@
86 int groupMask; /* Which config groups is it part of */
87 } aConfig[] = {
88 { "css", CONFIGSET_CSS },
89 { "header", CONFIGSET_SKIN },
90 { "footer", CONFIGSET_SKIN },
 
91 { "logo-mimetype", CONFIGSET_SKIN },
92 { "logo-image", CONFIGSET_SKIN },
93 { "background-mimetype", CONFIGSET_SKIN },
94 { "background-image", CONFIGSET_SKIN },
95 { "timeline-block-markup", CONFIGSET_SKIN },
@@ -96,11 +97,10 @@
96 { "timeline-max-comment", CONFIGSET_SKIN },
97 { "timeline-plaintext", CONFIGSET_SKIN },
98 { "adunit", CONFIGSET_SKIN },
99 { "adunit-omit-if-admin", CONFIGSET_SKIN },
100 { "adunit-omit-if-user", CONFIGSET_SKIN },
101 { "white-foreground", CONFIGSET_SKIN },
102
103 #ifdef FOSSIL_ENABLE_TH1_DOCS
104 { "th1-docs", CONFIGSET_TH1 },
105 #endif
106 #ifdef FOSSIL_ENABLE_TH1_HOOKS
107
--- src/configure.c
+++ src/configure.c
@@ -86,10 +86,11 @@
86 int groupMask; /* Which config groups is it part of */
87 } aConfig[] = {
88 { "css", CONFIGSET_CSS },
89 { "header", CONFIGSET_SKIN },
90 { "footer", CONFIGSET_SKIN },
91 { "details", CONFIGSET_SKIN },
92 { "logo-mimetype", CONFIGSET_SKIN },
93 { "logo-image", CONFIGSET_SKIN },
94 { "background-mimetype", CONFIGSET_SKIN },
95 { "background-image", CONFIGSET_SKIN },
96 { "timeline-block-markup", CONFIGSET_SKIN },
@@ -96,11 +97,10 @@
97 { "timeline-max-comment", CONFIGSET_SKIN },
98 { "timeline-plaintext", CONFIGSET_SKIN },
99 { "adunit", CONFIGSET_SKIN },
100 { "adunit-omit-if-admin", CONFIGSET_SKIN },
101 { "adunit-omit-if-user", CONFIGSET_SKIN },
 
102
103 #ifdef FOSSIL_ENABLE_TH1_DOCS
104 { "th1-docs", CONFIGSET_TH1 },
105 #endif
106 #ifdef FOSSIL_ENABLE_TH1_HOOKS
107
-1
--- src/db.c
+++ src/db.c
@@ -2383,11 +2383,10 @@
23832383
{ "th1-hooks", 0, 0, 0, 0, "off" },
23842384
#endif
23852385
{ "th1-setup", 0, 40, 1, 1, "" },
23862386
{ "th1-uri-regexp", 0, 40, 1, 0, "" },
23872387
{ "web-browser", 0, 32, 0, 0, "" },
2388
- { "white-foreground", 0, 0, 0, 0, "off" },
23892388
{ 0,0,0,0,0,0 }
23902389
};
23912390
23922391
/*
23932392
** Look up a control setting by its name. Return a pointer to the Setting
23942393
--- src/db.c
+++ src/db.c
@@ -2383,11 +2383,10 @@
2383 { "th1-hooks", 0, 0, 0, 0, "off" },
2384 #endif
2385 { "th1-setup", 0, 40, 1, 1, "" },
2386 { "th1-uri-regexp", 0, 40, 1, 0, "" },
2387 { "web-browser", 0, 32, 0, 0, "" },
2388 { "white-foreground", 0, 0, 0, 0, "off" },
2389 { 0,0,0,0,0,0 }
2390 };
2391
2392 /*
2393 ** Look up a control setting by its name. Return a pointer to the Setting
2394
--- src/db.c
+++ src/db.c
@@ -2383,11 +2383,10 @@
2383 { "th1-hooks", 0, 0, 0, 0, "off" },
2384 #endif
2385 { "th1-setup", 0, 40, 1, 1, "" },
2386 { "th1-uri-regexp", 0, 40, 1, 0, "" },
2387 { "web-browser", 0, 32, 0, 0, "" },
 
2388 { 0,0,0,0,0,0 }
2389 };
2390
2391 /*
2392 ** Look up a control setting by its name. Return a pointer to the Setting
2393
+1 -1
--- src/diff.c
+++ src/diff.c
@@ -2294,11 +2294,11 @@
22942294
}
22952295
if( iLimit>20 ){
22962296
style_submenu_element("20 Ancestors", "20 Ancestors",
22972297
"%s", url_render(&url, "limit", "20", 0, 0));
22982298
}
2299
- if( skin_white_foreground() ){
2299
+ if( skin_detail_boolean("white-foreground") ){
23002300
clr1 = 0xa04040;
23012301
clr2 = 0x4059a0;
23022302
}else{
23032303
clr1 = 0xffb5b5; /* Recent changes: red (hot) */
23042304
clr2 = 0xb5e0ff; /* Older changes: blue (cold) */
23052305
--- src/diff.c
+++ src/diff.c
@@ -2294,11 +2294,11 @@
2294 }
2295 if( iLimit>20 ){
2296 style_submenu_element("20 Ancestors", "20 Ancestors",
2297 "%s", url_render(&url, "limit", "20", 0, 0));
2298 }
2299 if( skin_white_foreground() ){
2300 clr1 = 0xa04040;
2301 clr2 = 0x4059a0;
2302 }else{
2303 clr1 = 0xffb5b5; /* Recent changes: red (hot) */
2304 clr2 = 0xb5e0ff; /* Older changes: blue (cold) */
2305
--- src/diff.c
+++ src/diff.c
@@ -2294,11 +2294,11 @@
2294 }
2295 if( iLimit>20 ){
2296 style_submenu_element("20 Ancestors", "20 Ancestors",
2297 "%s", url_render(&url, "limit", "20", 0, 0));
2298 }
2299 if( skin_detail_boolean("white-foreground") ){
2300 clr1 = 0xa04040;
2301 clr2 = 0x4059a0;
2302 }else{
2303 clr1 = 0xffb5b5; /* Recent changes: red (hot) */
2304 clr2 = 0xb5e0ff; /* Older changes: blue (cold) */
2305
--- src/json_config.c
+++ src/json_config.c
@@ -56,10 +56,11 @@
5656
int groupMask;
5757
} JsonConfigProperties[] = {
5858
{ "css", CONFIGSET_CSS },
5959
{ "header", CONFIGSET_SKIN },
6060
{ "footer", CONFIGSET_SKIN },
61
+{ "details", CONFIGSET_SKIN },
6162
{ "logo-mimetype", CONFIGSET_SKIN },
6263
{ "logo-image", CONFIGSET_SKIN },
6364
{ "background-mimetype", CONFIGSET_SKIN },
6465
{ "background-image", CONFIGSET_SKIN },
6566
{ "timeline-block-markup", CONFIGSET_SKIN },
@@ -66,11 +67,10 @@
6667
{ "timeline-max-comment", CONFIGSET_SKIN },
6768
{ "timeline-plaintext", CONFIGSET_SKIN },
6869
{ "adunit", CONFIGSET_SKIN },
6970
{ "adunit-omit-if-admin", CONFIGSET_SKIN },
7071
{ "adunit-omit-if-user", CONFIGSET_SKIN },
71
-{ "white-foreground", CONFIGSET_SKIN },
7272
7373
{ "project-name", CONFIGSET_PROJ },
7474
{ "short-project-name", CONFIGSET_PROJ },
7575
{ "project-description", CONFIGSET_PROJ },
7676
{ "index-page", CONFIGSET_PROJ },
7777
--- src/json_config.c
+++ src/json_config.c
@@ -56,10 +56,11 @@
56 int groupMask;
57 } JsonConfigProperties[] = {
58 { "css", CONFIGSET_CSS },
59 { "header", CONFIGSET_SKIN },
60 { "footer", CONFIGSET_SKIN },
 
61 { "logo-mimetype", CONFIGSET_SKIN },
62 { "logo-image", CONFIGSET_SKIN },
63 { "background-mimetype", CONFIGSET_SKIN },
64 { "background-image", CONFIGSET_SKIN },
65 { "timeline-block-markup", CONFIGSET_SKIN },
@@ -66,11 +67,10 @@
66 { "timeline-max-comment", CONFIGSET_SKIN },
67 { "timeline-plaintext", CONFIGSET_SKIN },
68 { "adunit", CONFIGSET_SKIN },
69 { "adunit-omit-if-admin", CONFIGSET_SKIN },
70 { "adunit-omit-if-user", CONFIGSET_SKIN },
71 { "white-foreground", CONFIGSET_SKIN },
72
73 { "project-name", CONFIGSET_PROJ },
74 { "short-project-name", CONFIGSET_PROJ },
75 { "project-description", CONFIGSET_PROJ },
76 { "index-page", CONFIGSET_PROJ },
77
--- src/json_config.c
+++ src/json_config.c
@@ -56,10 +56,11 @@
56 int groupMask;
57 } JsonConfigProperties[] = {
58 { "css", CONFIGSET_CSS },
59 { "header", CONFIGSET_SKIN },
60 { "footer", CONFIGSET_SKIN },
61 { "details", CONFIGSET_SKIN },
62 { "logo-mimetype", CONFIGSET_SKIN },
63 { "logo-image", CONFIGSET_SKIN },
64 { "background-mimetype", CONFIGSET_SKIN },
65 { "background-image", CONFIGSET_SKIN },
66 { "timeline-block-markup", CONFIGSET_SKIN },
@@ -66,11 +67,10 @@
67 { "timeline-max-comment", CONFIGSET_SKIN },
68 { "timeline-plaintext", CONFIGSET_SKIN },
69 { "adunit", CONFIGSET_SKIN },
70 { "adunit-omit-if-admin", CONFIGSET_SKIN },
71 { "adunit-omit-if-user", CONFIGSET_SKIN },
 
72
73 { "project-name", CONFIGSET_PROJ },
74 { "short-project-name", CONFIGSET_PROJ },
75 { "project-description", CONFIGSET_PROJ },
76 { "index-page", CONFIGSET_PROJ },
77
+12
--- src/main.mk
+++ src/main.mk
@@ -132,43 +132,55 @@
132132
$(SRCDIR)/xfer.c \
133133
$(SRCDIR)/xfersetup.c \
134134
$(SRCDIR)/zip.c
135135
136136
EXTRA_FILES = \
137
+ $(SRCDIR)/../skins/aht/details.txt \
137138
$(SRCDIR)/../skins/black_and_white/css.txt \
139
+ $(SRCDIR)/../skins/black_and_white/details.txt \
138140
$(SRCDIR)/../skins/black_and_white/footer.txt \
139141
$(SRCDIR)/../skins/black_and_white/header.txt \
140142
$(SRCDIR)/../skins/blitz/css.txt \
143
+ $(SRCDIR)/../skins/blitz/details.txt \
141144
$(SRCDIR)/../skins/blitz/footer.txt \
142145
$(SRCDIR)/../skins/blitz/header.txt \
143146
$(SRCDIR)/../skins/blitz/ticket.txt \
144147
$(SRCDIR)/../skins/blitz_no_logo/css.txt \
148
+ $(SRCDIR)/../skins/blitz_no_logo/details.txt \
145149
$(SRCDIR)/../skins/blitz_no_logo/footer.txt \
146150
$(SRCDIR)/../skins/blitz_no_logo/header.txt \
147151
$(SRCDIR)/../skins/blitz_no_logo/ticket.txt \
148152
$(SRCDIR)/../skins/default/css.txt \
153
+ $(SRCDIR)/../skins/default/details.txt \
149154
$(SRCDIR)/../skins/default/footer.txt \
150155
$(SRCDIR)/../skins/default/header.txt \
151156
$(SRCDIR)/../skins/eagle/css.txt \
157
+ $(SRCDIR)/../skins/eagle/details.txt \
152158
$(SRCDIR)/../skins/eagle/footer.txt \
153159
$(SRCDIR)/../skins/eagle/header.txt \
154160
$(SRCDIR)/../skins/enhanced1/css.txt \
161
+ $(SRCDIR)/../skins/enhanced1/details.txt \
155162
$(SRCDIR)/../skins/enhanced1/footer.txt \
156163
$(SRCDIR)/../skins/enhanced1/header.txt \
157164
$(SRCDIR)/../skins/khaki/css.txt \
165
+ $(SRCDIR)/../skins/khaki/details.txt \
158166
$(SRCDIR)/../skins/khaki/footer.txt \
159167
$(SRCDIR)/../skins/khaki/header.txt \
160168
$(SRCDIR)/../skins/original/css.txt \
169
+ $(SRCDIR)/../skins/original/details.txt \
161170
$(SRCDIR)/../skins/original/footer.txt \
162171
$(SRCDIR)/../skins/original/header.txt \
163172
$(SRCDIR)/../skins/plain_gray/css.txt \
173
+ $(SRCDIR)/../skins/plain_gray/details.txt \
164174
$(SRCDIR)/../skins/plain_gray/footer.txt \
165175
$(SRCDIR)/../skins/plain_gray/header.txt \
166176
$(SRCDIR)/../skins/rounded1/css.txt \
177
+ $(SRCDIR)/../skins/rounded1/details.txt \
167178
$(SRCDIR)/../skins/rounded1/footer.txt \
168179
$(SRCDIR)/../skins/rounded1/header.txt \
169180
$(SRCDIR)/../skins/xekri/css.txt \
181
+ $(SRCDIR)/../skins/xekri/details.txt \
170182
$(SRCDIR)/../skins/xekri/footer.txt \
171183
$(SRCDIR)/../skins/xekri/header.txt \
172184
$(SRCDIR)/diff.tcl \
173185
$(SRCDIR)/markdown.md
174186
175187
--- src/main.mk
+++ src/main.mk
@@ -132,43 +132,55 @@
132 $(SRCDIR)/xfer.c \
133 $(SRCDIR)/xfersetup.c \
134 $(SRCDIR)/zip.c
135
136 EXTRA_FILES = \
 
137 $(SRCDIR)/../skins/black_and_white/css.txt \
 
138 $(SRCDIR)/../skins/black_and_white/footer.txt \
139 $(SRCDIR)/../skins/black_and_white/header.txt \
140 $(SRCDIR)/../skins/blitz/css.txt \
 
141 $(SRCDIR)/../skins/blitz/footer.txt \
142 $(SRCDIR)/../skins/blitz/header.txt \
143 $(SRCDIR)/../skins/blitz/ticket.txt \
144 $(SRCDIR)/../skins/blitz_no_logo/css.txt \
 
145 $(SRCDIR)/../skins/blitz_no_logo/footer.txt \
146 $(SRCDIR)/../skins/blitz_no_logo/header.txt \
147 $(SRCDIR)/../skins/blitz_no_logo/ticket.txt \
148 $(SRCDIR)/../skins/default/css.txt \
 
149 $(SRCDIR)/../skins/default/footer.txt \
150 $(SRCDIR)/../skins/default/header.txt \
151 $(SRCDIR)/../skins/eagle/css.txt \
 
152 $(SRCDIR)/../skins/eagle/footer.txt \
153 $(SRCDIR)/../skins/eagle/header.txt \
154 $(SRCDIR)/../skins/enhanced1/css.txt \
 
155 $(SRCDIR)/../skins/enhanced1/footer.txt \
156 $(SRCDIR)/../skins/enhanced1/header.txt \
157 $(SRCDIR)/../skins/khaki/css.txt \
 
158 $(SRCDIR)/../skins/khaki/footer.txt \
159 $(SRCDIR)/../skins/khaki/header.txt \
160 $(SRCDIR)/../skins/original/css.txt \
 
161 $(SRCDIR)/../skins/original/footer.txt \
162 $(SRCDIR)/../skins/original/header.txt \
163 $(SRCDIR)/../skins/plain_gray/css.txt \
 
164 $(SRCDIR)/../skins/plain_gray/footer.txt \
165 $(SRCDIR)/../skins/plain_gray/header.txt \
166 $(SRCDIR)/../skins/rounded1/css.txt \
 
167 $(SRCDIR)/../skins/rounded1/footer.txt \
168 $(SRCDIR)/../skins/rounded1/header.txt \
169 $(SRCDIR)/../skins/xekri/css.txt \
 
170 $(SRCDIR)/../skins/xekri/footer.txt \
171 $(SRCDIR)/../skins/xekri/header.txt \
172 $(SRCDIR)/diff.tcl \
173 $(SRCDIR)/markdown.md
174
175
--- src/main.mk
+++ src/main.mk
@@ -132,43 +132,55 @@
132 $(SRCDIR)/xfer.c \
133 $(SRCDIR)/xfersetup.c \
134 $(SRCDIR)/zip.c
135
136 EXTRA_FILES = \
137 $(SRCDIR)/../skins/aht/details.txt \
138 $(SRCDIR)/../skins/black_and_white/css.txt \
139 $(SRCDIR)/../skins/black_and_white/details.txt \
140 $(SRCDIR)/../skins/black_and_white/footer.txt \
141 $(SRCDIR)/../skins/black_and_white/header.txt \
142 $(SRCDIR)/../skins/blitz/css.txt \
143 $(SRCDIR)/../skins/blitz/details.txt \
144 $(SRCDIR)/../skins/blitz/footer.txt \
145 $(SRCDIR)/../skins/blitz/header.txt \
146 $(SRCDIR)/../skins/blitz/ticket.txt \
147 $(SRCDIR)/../skins/blitz_no_logo/css.txt \
148 $(SRCDIR)/../skins/blitz_no_logo/details.txt \
149 $(SRCDIR)/../skins/blitz_no_logo/footer.txt \
150 $(SRCDIR)/../skins/blitz_no_logo/header.txt \
151 $(SRCDIR)/../skins/blitz_no_logo/ticket.txt \
152 $(SRCDIR)/../skins/default/css.txt \
153 $(SRCDIR)/../skins/default/details.txt \
154 $(SRCDIR)/../skins/default/footer.txt \
155 $(SRCDIR)/../skins/default/header.txt \
156 $(SRCDIR)/../skins/eagle/css.txt \
157 $(SRCDIR)/../skins/eagle/details.txt \
158 $(SRCDIR)/../skins/eagle/footer.txt \
159 $(SRCDIR)/../skins/eagle/header.txt \
160 $(SRCDIR)/../skins/enhanced1/css.txt \
161 $(SRCDIR)/../skins/enhanced1/details.txt \
162 $(SRCDIR)/../skins/enhanced1/footer.txt \
163 $(SRCDIR)/../skins/enhanced1/header.txt \
164 $(SRCDIR)/../skins/khaki/css.txt \
165 $(SRCDIR)/../skins/khaki/details.txt \
166 $(SRCDIR)/../skins/khaki/footer.txt \
167 $(SRCDIR)/../skins/khaki/header.txt \
168 $(SRCDIR)/../skins/original/css.txt \
169 $(SRCDIR)/../skins/original/details.txt \
170 $(SRCDIR)/../skins/original/footer.txt \
171 $(SRCDIR)/../skins/original/header.txt \
172 $(SRCDIR)/../skins/plain_gray/css.txt \
173 $(SRCDIR)/../skins/plain_gray/details.txt \
174 $(SRCDIR)/../skins/plain_gray/footer.txt \
175 $(SRCDIR)/../skins/plain_gray/header.txt \
176 $(SRCDIR)/../skins/rounded1/css.txt \
177 $(SRCDIR)/../skins/rounded1/details.txt \
178 $(SRCDIR)/../skins/rounded1/footer.txt \
179 $(SRCDIR)/../skins/rounded1/header.txt \
180 $(SRCDIR)/../skins/xekri/css.txt \
181 $(SRCDIR)/../skins/xekri/details.txt \
182 $(SRCDIR)/../skins/xekri/footer.txt \
183 $(SRCDIR)/../skins/xekri/header.txt \
184 $(SRCDIR)/diff.tcl \
185 $(SRCDIR)/markdown.md
186
187
+11 -159
--- src/setup.c
+++ src/setup.c
@@ -69,11 +69,11 @@
6969
/* Make sure the header contains <base href="...">. Issue a warning
7070
** if it does not. */
7171
if( !cgi_header_contains("<base href=") ){
7272
@ <p class="generalError"><b>Configuration Error:</b> Please add
7373
@ <tt>&lt;base href="$secureurl/$current_page"&gt;</tt> after
74
- @ <tt>&lt;head&gt;</tt> in the <a href="setup_header">HTML header</a>!</p>
74
+ @ <tt>&lt;head&gt;</tt> in the <a href="setup_skinedit?w=2">HTML header</a>!</p>
7575
}
7676
7777
#if !defined(_WIN32)
7878
/* Check for /dev/null and /dev/urandom. We want both devices to be present,
7979
** but they are sometimes omitted (by mistake) from chroot jails. */
@@ -108,15 +108,15 @@
108108
"Configure the built-in search engine");
109109
setup_menu_entry("Transfers", "xfersetup",
110110
"Configure the transfer system for this repository");
111111
setup_menu_entry("Skins", "setup_skin",
112112
"Select from a menu of prepackaged \"skins\" for the web interface");
113
- setup_menu_entry("CSS", "setup_editcss",
113
+ setup_menu_entry("CSS", "setup_skinedit?w=0",
114114
"Edit the Cascading Style Sheet used by all pages of this repository");
115
- setup_menu_entry("Header", "setup_header",
115
+ setup_menu_entry("Header", "setup_skinedit?w=2",
116116
"Edit HTML text inserted at the top of every page");
117
- setup_menu_entry("Footer", "setup_footer",
117
+ setup_menu_entry("Footer", "setup_skinedit?w=1",
118118
"Edit HTML text inserted at the bottom of every page");
119119
setup_menu_entry("Moderation", "setup_modreq",
120120
"Enable/Disable requiring moderator approval of Wiki and/or Ticket"
121121
" changes and attachments.");
122122
setup_menu_entry("Ad-Unit", "setup_adunit",
@@ -930,11 +930,11 @@
930930
}
931931
932932
/*
933933
** Generate a text box for an attribute.
934934
*/
935
-static void textarea_attribute(
935
+const char *textarea_attribute(
936936
const char *zLabel, /* The text label on the textarea */
937937
int rows, /* Rows in the textarea */
938938
int cols, /* Columns in the textarea */
939939
const char *zVar, /* The corresponding row in the VAR table */
940940
const char *zQP, /* The query parameter */
@@ -959,10 +959,11 @@
959959
@ cols="%d(cols)">%h(z)</textarea>
960960
if( zLabel && *zLabel ){
961961
@ <span class="textareaLabel">%s(zLabel)</span>
962962
}
963963
}
964
+ return z;
964965
}
965966
966967
/*
967968
** Generate a text box for an attribute.
968969
*/
@@ -1550,159 +1551,10 @@
15501551
@ </div></form>
15511552
db_end_transaction(0);
15521553
style_footer();
15531554
}
15541555
1555
-/*
1556
-** WEBPAGE: setup_editcss
1557
-*/
1558
-void setup_editcss(void){
1559
- login_check_credentials();
1560
- if( !g.perm.Setup ){
1561
- login_needed(0);
1562
- return;
1563
- }
1564
- db_begin_transaction();
1565
- if( P("clear")!=0 ){
1566
- db_multi_exec("DELETE FROM config WHERE name='css'");
1567
- cgi_replace_parameter("css", builtin_text("skins/default/css.txt"));
1568
- db_end_transaction(0);
1569
- cgi_redirect("setup_editcss");
1570
- }
1571
- if( P("submit")!=0 ){
1572
- textarea_attribute(0, 0, 0, "css", "css",
1573
- builtin_text("skins/default/css.txt"), 0);
1574
- db_end_transaction(0);
1575
- cgi_redirect("setup_editcss");
1576
- }
1577
- style_header("Edit CSS");
1578
- @ <form action="%s(g.zTop)/setup_editcss" method="post"><div>
1579
- login_insert_csrf_secret();
1580
- @ Edit the CSS below:<br />
1581
- textarea_attribute("", 35, 80, "css", "css",
1582
- builtin_text("skins/default/css.txt"), 0);
1583
- @ <br />
1584
- @ <input type="submit" name="submit" value="Apply Changes" />
1585
- @ <input type="submit" name="clear" value="Revert To Default" />
1586
- @ </div></form>
1587
- @ <p><span class="note">Note:</span> Press your browser Reload button after
1588
- @ modifying the CSS in order to pull in the modified CSS file.</p>
1589
- @ <hr />
1590
- @ The default CSS is shown below for reference. Other examples
1591
- @ of CSS files can be seen on the <a href="setup_skin">skins page</a>.
1592
- @ See also the <a href="setup_header">header</a> and
1593
- @ <a href="setup_footer">footer</a> editing screens.
1594
- @ <blockquote><pre>
1595
- cgi_append_default_css();
1596
- @ </pre></blockquote>
1597
- style_footer();
1598
- db_end_transaction(0);
1599
-}
1600
-
1601
-/*
1602
-** WEBPAGE: setup_header
1603
-*/
1604
-void setup_header(void){
1605
- login_check_credentials();
1606
- if( !g.perm.Setup ){
1607
- login_needed(0);
1608
- return;
1609
- }
1610
- db_begin_transaction();
1611
- if( P("clear")!=0 ){
1612
- db_multi_exec("DELETE FROM config WHERE name='header'");
1613
- cgi_replace_parameter("header", builtin_text("skins/default/header.txt"));
1614
- }else if( P("submit")!=0 ){
1615
- textarea_attribute(0, 0, 0, "header", "header",
1616
- builtin_text("skins/default/header.txt"), 0);
1617
- }else if( P("fixbase")!=0 ){
1618
- const char *z = db_get("header",
1619
- (char*)builtin_text("skins/default/header.txt"));
1620
- char *zHead = strstr(z, "<head>");
1621
- if( strstr(z, "<base href=")==0 && zHead!=0 ){
1622
- char *zNew;
1623
- char *zTail = &zHead[6];
1624
- while( fossil_isspace(zTail[0]) ) zTail++;
1625
- zNew = mprintf("%.*s\n<base href=\"$secureurl/$current_page\" />\n%s",
1626
- zHead+6-z, z, zTail);
1627
- cgi_replace_parameter("header", zNew);
1628
- db_set("header", zNew, 0);
1629
- }
1630
- }
1631
-
1632
- style_header("Edit Page Header");
1633
- @ <form action="%R/setup_header" method="post"><div>
1634
-
1635
- /* Make sure the header contains <base href="...">. Issue a warning
1636
- ** if it does not. */
1637
- if( !cgi_header_contains("<base href=") ){
1638
- @ <p class="generalError">Please add
1639
- @ <tt>&lt;base href="$secureurl/$current_page"&gt;</tt> after
1640
- @ <tt>&lt;head&gt;</tt> in the header!
1641
- @ <input type="submit" name="fixbase" value="Add &lt;base&gt; Now"></p>
1642
- }
1643
-
1644
- login_insert_csrf_secret();
1645
- @ <p>Edit HTML text with embedded TH1 (a Tcl dialect) that will be used to
1646
- @ generate the beginning of every page through start of the main
1647
- @ menu.</p>
1648
- textarea_attribute("", 35, 80, "header", "header",
1649
- builtin_text("skins/default/header.txt"), 0);
1650
- @ <br />
1651
- @ <input type="submit" name="submit" value="Apply Changes" />
1652
- @ <input type="submit" name="clear" value="Revert To Default" />
1653
- @ </div></form>
1654
- @ <hr />
1655
- @ The default header is shown below for reference. Other examples
1656
- @ of headers can be seen on the <a href="setup_skin">skins page</a>.
1657
- @ See also the <a href="setup_editcss">CSS</a> and
1658
- @ <a href="setup_footer">footer</a> editing screens.
1659
- @ <blockquote><pre>
1660
- @ %h(builtin_text("skins/default/header.txt"))
1661
- @ </pre></blockquote>
1662
- style_footer();
1663
- db_end_transaction(0);
1664
-}
1665
-
1666
-/*
1667
-** WEBPAGE: setup_footer
1668
-*/
1669
-void setup_footer(void){
1670
- login_check_credentials();
1671
- if( !g.perm.Setup ){
1672
- login_needed(0);
1673
- return;
1674
- }
1675
- db_begin_transaction();
1676
- if( P("clear")!=0 ){
1677
- db_multi_exec("DELETE FROM config WHERE name='footer'");
1678
- cgi_replace_parameter("footer", builtin_text("skins/default/footer.txt"));
1679
- }
1680
-
1681
- style_header("Edit Page Footer");
1682
- @ <form action="%s(g.zTop)/setup_footer" method="post"><div>
1683
- login_insert_csrf_secret();
1684
- @ <p>Edit HTML text with embedded TH1 (a Tcl dialect) that will be used to
1685
- @ generate the end of every page.</p>
1686
- textarea_attribute("", 20, 80, "footer", "footer",
1687
- builtin_text("skins/default/footer.txt"), 0);
1688
- @ <br />
1689
- @ <input type="submit" name="submit" value="Apply Changes" />
1690
- @ <input type="submit" name="clear" value="Revert To Default" />
1691
- @ </div></form>
1692
- @ <hr />
1693
- @ The default footer is shown below for reference. Other examples
1694
- @ of footers can be seen on the <a href="setup_skin">skins page</a>.
1695
- @ See also the <a href="setup_editcss">CSS</a> and
1696
- @ <a href="setup_header">header</a> editing screens.
1697
- @ <blockquote><pre>
1698
- @ %h(builtin_text("skins/default/footer.txt"))
1699
- @ </pre></blockquote>
1700
- style_footer();
1701
- db_end_transaction(0);
1702
-}
1703
-
17041556
/*
17051557
** WEBPAGE: setup_modreq
17061558
*/
17071559
void setup_modreq(void){
17081560
login_check_credentials();
@@ -1783,11 +1635,11 @@
17831635
@ <b>Ad-Unit Notes:</b><ul>
17841636
@ <li>Leave both Ad-Units blank to disable all advertising.
17851637
@ <li>The "Banner Ad-Unit" is used for wide pages.
17861638
@ <li>The "Right-Column Ad-Unit" is used on pages with tall, narrow content.
17871639
@ <li>If the "Right-Column Ad-Unit" is blank, the "Banner Ad-Unit" is used on all pages.
1788
- @ <li>Suggested <a href="setup_editcss">CSS</a> changes:
1640
+ @ <li>Suggested <a href="setup_skinedit?w=0">CSS</a> changes:
17891641
@ <blockquote><pre>
17901642
@ div.adunit_banner {
17911643
@ margin: auto;
17921644
@ width: 100%;
17931645
@ }
@@ -1897,12 +1749,12 @@
18971749
@ <form action="%s(g.zTop)/setup_logo" method="post"
18981750
@ enctype="multipart/form-data"><div>
18991751
@ <p>The logo is accessible to all users at this URL:
19001752
@ <a href="%s(g.zBaseURL)/logo">%s(g.zBaseURL)/logo</a>.
19011753
@ The logo may or may not appear on each
1902
- @ page depending on the <a href="setup_editcss">CSS</a> and
1903
- @ <a href="setup_header">header setup</a>.
1754
+ @ page depending on the <a href="setup_skinedit?w=0">CSS</a> and
1755
+ @ <a href="setup_skinedit?w=2">header setup</a>.
19041756
@ To change the logo image, use the following form:</p>
19051757
login_insert_csrf_secret();
19061758
@ Logo Image file:
19071759
@ <input type="file" name="logoim" size="60" accept="image/*" />
19081760
@ <p align="center">
@@ -1919,12 +1771,12 @@
19191771
@ <form action="%s(g.zTop)/setup_logo" method="post"
19201772
@ enctype="multipart/form-data"><div>
19211773
@ <p>The background image is accessible to all users at this URL:
19221774
@ <a href="%s(g.zBaseURL)/background">%s(g.zBaseURL)/background</a>.
19231775
@ The background image may or may not appear on each
1924
- @ page depending on the <a href="setup_editcss">CSS</a> and
1925
- @ <a href="setup_header">header setup</a>.
1776
+ @ page depending on the <a href="setup_skinedit?w=0">CSS</a> and
1777
+ @ <a href="setup_skinedit?w=2">header setup</a>.
19261778
@ To change the background image, use the following form:</p>
19271779
login_insert_csrf_secret();
19281780
@ Background image file:
19291781
@ <input type="file" name="bgim" size="60" accept="image/*" />
19301782
@ <p align="center">
19311783
--- src/setup.c
+++ src/setup.c
@@ -69,11 +69,11 @@
69 /* Make sure the header contains <base href="...">. Issue a warning
70 ** if it does not. */
71 if( !cgi_header_contains("<base href=") ){
72 @ <p class="generalError"><b>Configuration Error:</b> Please add
73 @ <tt>&lt;base href="$secureurl/$current_page"&gt;</tt> after
74 @ <tt>&lt;head&gt;</tt> in the <a href="setup_header">HTML header</a>!</p>
75 }
76
77 #if !defined(_WIN32)
78 /* Check for /dev/null and /dev/urandom. We want both devices to be present,
79 ** but they are sometimes omitted (by mistake) from chroot jails. */
@@ -108,15 +108,15 @@
108 "Configure the built-in search engine");
109 setup_menu_entry("Transfers", "xfersetup",
110 "Configure the transfer system for this repository");
111 setup_menu_entry("Skins", "setup_skin",
112 "Select from a menu of prepackaged \"skins\" for the web interface");
113 setup_menu_entry("CSS", "setup_editcss",
114 "Edit the Cascading Style Sheet used by all pages of this repository");
115 setup_menu_entry("Header", "setup_header",
116 "Edit HTML text inserted at the top of every page");
117 setup_menu_entry("Footer", "setup_footer",
118 "Edit HTML text inserted at the bottom of every page");
119 setup_menu_entry("Moderation", "setup_modreq",
120 "Enable/Disable requiring moderator approval of Wiki and/or Ticket"
121 " changes and attachments.");
122 setup_menu_entry("Ad-Unit", "setup_adunit",
@@ -930,11 +930,11 @@
930 }
931
932 /*
933 ** Generate a text box for an attribute.
934 */
935 static void textarea_attribute(
936 const char *zLabel, /* The text label on the textarea */
937 int rows, /* Rows in the textarea */
938 int cols, /* Columns in the textarea */
939 const char *zVar, /* The corresponding row in the VAR table */
940 const char *zQP, /* The query parameter */
@@ -959,10 +959,11 @@
959 @ cols="%d(cols)">%h(z)</textarea>
960 if( zLabel && *zLabel ){
961 @ <span class="textareaLabel">%s(zLabel)</span>
962 }
963 }
 
964 }
965
966 /*
967 ** Generate a text box for an attribute.
968 */
@@ -1550,159 +1551,10 @@
1550 @ </div></form>
1551 db_end_transaction(0);
1552 style_footer();
1553 }
1554
1555 /*
1556 ** WEBPAGE: setup_editcss
1557 */
1558 void setup_editcss(void){
1559 login_check_credentials();
1560 if( !g.perm.Setup ){
1561 login_needed(0);
1562 return;
1563 }
1564 db_begin_transaction();
1565 if( P("clear")!=0 ){
1566 db_multi_exec("DELETE FROM config WHERE name='css'");
1567 cgi_replace_parameter("css", builtin_text("skins/default/css.txt"));
1568 db_end_transaction(0);
1569 cgi_redirect("setup_editcss");
1570 }
1571 if( P("submit")!=0 ){
1572 textarea_attribute(0, 0, 0, "css", "css",
1573 builtin_text("skins/default/css.txt"), 0);
1574 db_end_transaction(0);
1575 cgi_redirect("setup_editcss");
1576 }
1577 style_header("Edit CSS");
1578 @ <form action="%s(g.zTop)/setup_editcss" method="post"><div>
1579 login_insert_csrf_secret();
1580 @ Edit the CSS below:<br />
1581 textarea_attribute("", 35, 80, "css", "css",
1582 builtin_text("skins/default/css.txt"), 0);
1583 @ <br />
1584 @ <input type="submit" name="submit" value="Apply Changes" />
1585 @ <input type="submit" name="clear" value="Revert To Default" />
1586 @ </div></form>
1587 @ <p><span class="note">Note:</span> Press your browser Reload button after
1588 @ modifying the CSS in order to pull in the modified CSS file.</p>
1589 @ <hr />
1590 @ The default CSS is shown below for reference. Other examples
1591 @ of CSS files can be seen on the <a href="setup_skin">skins page</a>.
1592 @ See also the <a href="setup_header">header</a> and
1593 @ <a href="setup_footer">footer</a> editing screens.
1594 @ <blockquote><pre>
1595 cgi_append_default_css();
1596 @ </pre></blockquote>
1597 style_footer();
1598 db_end_transaction(0);
1599 }
1600
1601 /*
1602 ** WEBPAGE: setup_header
1603 */
1604 void setup_header(void){
1605 login_check_credentials();
1606 if( !g.perm.Setup ){
1607 login_needed(0);
1608 return;
1609 }
1610 db_begin_transaction();
1611 if( P("clear")!=0 ){
1612 db_multi_exec("DELETE FROM config WHERE name='header'");
1613 cgi_replace_parameter("header", builtin_text("skins/default/header.txt"));
1614 }else if( P("submit")!=0 ){
1615 textarea_attribute(0, 0, 0, "header", "header",
1616 builtin_text("skins/default/header.txt"), 0);
1617 }else if( P("fixbase")!=0 ){
1618 const char *z = db_get("header",
1619 (char*)builtin_text("skins/default/header.txt"));
1620 char *zHead = strstr(z, "<head>");
1621 if( strstr(z, "<base href=")==0 && zHead!=0 ){
1622 char *zNew;
1623 char *zTail = &zHead[6];
1624 while( fossil_isspace(zTail[0]) ) zTail++;
1625 zNew = mprintf("%.*s\n<base href=\"$secureurl/$current_page\" />\n%s",
1626 zHead+6-z, z, zTail);
1627 cgi_replace_parameter("header", zNew);
1628 db_set("header", zNew, 0);
1629 }
1630 }
1631
1632 style_header("Edit Page Header");
1633 @ <form action="%R/setup_header" method="post"><div>
1634
1635 /* Make sure the header contains <base href="...">. Issue a warning
1636 ** if it does not. */
1637 if( !cgi_header_contains("<base href=") ){
1638 @ <p class="generalError">Please add
1639 @ <tt>&lt;base href="$secureurl/$current_page"&gt;</tt> after
1640 @ <tt>&lt;head&gt;</tt> in the header!
1641 @ <input type="submit" name="fixbase" value="Add &lt;base&gt; Now"></p>
1642 }
1643
1644 login_insert_csrf_secret();
1645 @ <p>Edit HTML text with embedded TH1 (a Tcl dialect) that will be used to
1646 @ generate the beginning of every page through start of the main
1647 @ menu.</p>
1648 textarea_attribute("", 35, 80, "header", "header",
1649 builtin_text("skins/default/header.txt"), 0);
1650 @ <br />
1651 @ <input type="submit" name="submit" value="Apply Changes" />
1652 @ <input type="submit" name="clear" value="Revert To Default" />
1653 @ </div></form>
1654 @ <hr />
1655 @ The default header is shown below for reference. Other examples
1656 @ of headers can be seen on the <a href="setup_skin">skins page</a>.
1657 @ See also the <a href="setup_editcss">CSS</a> and
1658 @ <a href="setup_footer">footer</a> editing screens.
1659 @ <blockquote><pre>
1660 @ %h(builtin_text("skins/default/header.txt"))
1661 @ </pre></blockquote>
1662 style_footer();
1663 db_end_transaction(0);
1664 }
1665
1666 /*
1667 ** WEBPAGE: setup_footer
1668 */
1669 void setup_footer(void){
1670 login_check_credentials();
1671 if( !g.perm.Setup ){
1672 login_needed(0);
1673 return;
1674 }
1675 db_begin_transaction();
1676 if( P("clear")!=0 ){
1677 db_multi_exec("DELETE FROM config WHERE name='footer'");
1678 cgi_replace_parameter("footer", builtin_text("skins/default/footer.txt"));
1679 }
1680
1681 style_header("Edit Page Footer");
1682 @ <form action="%s(g.zTop)/setup_footer" method="post"><div>
1683 login_insert_csrf_secret();
1684 @ <p>Edit HTML text with embedded TH1 (a Tcl dialect) that will be used to
1685 @ generate the end of every page.</p>
1686 textarea_attribute("", 20, 80, "footer", "footer",
1687 builtin_text("skins/default/footer.txt"), 0);
1688 @ <br />
1689 @ <input type="submit" name="submit" value="Apply Changes" />
1690 @ <input type="submit" name="clear" value="Revert To Default" />
1691 @ </div></form>
1692 @ <hr />
1693 @ The default footer is shown below for reference. Other examples
1694 @ of footers can be seen on the <a href="setup_skin">skins page</a>.
1695 @ See also the <a href="setup_editcss">CSS</a> and
1696 @ <a href="setup_header">header</a> editing screens.
1697 @ <blockquote><pre>
1698 @ %h(builtin_text("skins/default/footer.txt"))
1699 @ </pre></blockquote>
1700 style_footer();
1701 db_end_transaction(0);
1702 }
1703
1704 /*
1705 ** WEBPAGE: setup_modreq
1706 */
1707 void setup_modreq(void){
1708 login_check_credentials();
@@ -1783,11 +1635,11 @@
1783 @ <b>Ad-Unit Notes:</b><ul>
1784 @ <li>Leave both Ad-Units blank to disable all advertising.
1785 @ <li>The "Banner Ad-Unit" is used for wide pages.
1786 @ <li>The "Right-Column Ad-Unit" is used on pages with tall, narrow content.
1787 @ <li>If the "Right-Column Ad-Unit" is blank, the "Banner Ad-Unit" is used on all pages.
1788 @ <li>Suggested <a href="setup_editcss">CSS</a> changes:
1789 @ <blockquote><pre>
1790 @ div.adunit_banner {
1791 @ margin: auto;
1792 @ width: 100%;
1793 @ }
@@ -1897,12 +1749,12 @@
1897 @ <form action="%s(g.zTop)/setup_logo" method="post"
1898 @ enctype="multipart/form-data"><div>
1899 @ <p>The logo is accessible to all users at this URL:
1900 @ <a href="%s(g.zBaseURL)/logo">%s(g.zBaseURL)/logo</a>.
1901 @ The logo may or may not appear on each
1902 @ page depending on the <a href="setup_editcss">CSS</a> and
1903 @ <a href="setup_header">header setup</a>.
1904 @ To change the logo image, use the following form:</p>
1905 login_insert_csrf_secret();
1906 @ Logo Image file:
1907 @ <input type="file" name="logoim" size="60" accept="image/*" />
1908 @ <p align="center">
@@ -1919,12 +1771,12 @@
1919 @ <form action="%s(g.zTop)/setup_logo" method="post"
1920 @ enctype="multipart/form-data"><div>
1921 @ <p>The background image is accessible to all users at this URL:
1922 @ <a href="%s(g.zBaseURL)/background">%s(g.zBaseURL)/background</a>.
1923 @ The background image may or may not appear on each
1924 @ page depending on the <a href="setup_editcss">CSS</a> and
1925 @ <a href="setup_header">header setup</a>.
1926 @ To change the background image, use the following form:</p>
1927 login_insert_csrf_secret();
1928 @ Background image file:
1929 @ <input type="file" name="bgim" size="60" accept="image/*" />
1930 @ <p align="center">
1931
--- src/setup.c
+++ src/setup.c
@@ -69,11 +69,11 @@
69 /* Make sure the header contains <base href="...">. Issue a warning
70 ** if it does not. */
71 if( !cgi_header_contains("<base href=") ){
72 @ <p class="generalError"><b>Configuration Error:</b> Please add
73 @ <tt>&lt;base href="$secureurl/$current_page"&gt;</tt> after
74 @ <tt>&lt;head&gt;</tt> in the <a href="setup_skinedit?w=2">HTML header</a>!</p>
75 }
76
77 #if !defined(_WIN32)
78 /* Check for /dev/null and /dev/urandom. We want both devices to be present,
79 ** but they are sometimes omitted (by mistake) from chroot jails. */
@@ -108,15 +108,15 @@
108 "Configure the built-in search engine");
109 setup_menu_entry("Transfers", "xfersetup",
110 "Configure the transfer system for this repository");
111 setup_menu_entry("Skins", "setup_skin",
112 "Select from a menu of prepackaged \"skins\" for the web interface");
113 setup_menu_entry("CSS", "setup_skinedit?w=0",
114 "Edit the Cascading Style Sheet used by all pages of this repository");
115 setup_menu_entry("Header", "setup_skinedit?w=2",
116 "Edit HTML text inserted at the top of every page");
117 setup_menu_entry("Footer", "setup_skinedit?w=1",
118 "Edit HTML text inserted at the bottom of every page");
119 setup_menu_entry("Moderation", "setup_modreq",
120 "Enable/Disable requiring moderator approval of Wiki and/or Ticket"
121 " changes and attachments.");
122 setup_menu_entry("Ad-Unit", "setup_adunit",
@@ -930,11 +930,11 @@
930 }
931
932 /*
933 ** Generate a text box for an attribute.
934 */
935 const char *textarea_attribute(
936 const char *zLabel, /* The text label on the textarea */
937 int rows, /* Rows in the textarea */
938 int cols, /* Columns in the textarea */
939 const char *zVar, /* The corresponding row in the VAR table */
940 const char *zQP, /* The query parameter */
@@ -959,10 +959,11 @@
959 @ cols="%d(cols)">%h(z)</textarea>
960 if( zLabel && *zLabel ){
961 @ <span class="textareaLabel">%s(zLabel)</span>
962 }
963 }
964 return z;
965 }
966
967 /*
968 ** Generate a text box for an attribute.
969 */
@@ -1550,159 +1551,10 @@
1551 @ </div></form>
1552 db_end_transaction(0);
1553 style_footer();
1554 }
1555
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1556 /*
1557 ** WEBPAGE: setup_modreq
1558 */
1559 void setup_modreq(void){
1560 login_check_credentials();
@@ -1783,11 +1635,11 @@
1635 @ <b>Ad-Unit Notes:</b><ul>
1636 @ <li>Leave both Ad-Units blank to disable all advertising.
1637 @ <li>The "Banner Ad-Unit" is used for wide pages.
1638 @ <li>The "Right-Column Ad-Unit" is used on pages with tall, narrow content.
1639 @ <li>If the "Right-Column Ad-Unit" is blank, the "Banner Ad-Unit" is used on all pages.
1640 @ <li>Suggested <a href="setup_skinedit?w=0">CSS</a> changes:
1641 @ <blockquote><pre>
1642 @ div.adunit_banner {
1643 @ margin: auto;
1644 @ width: 100%;
1645 @ }
@@ -1897,12 +1749,12 @@
1749 @ <form action="%s(g.zTop)/setup_logo" method="post"
1750 @ enctype="multipart/form-data"><div>
1751 @ <p>The logo is accessible to all users at this URL:
1752 @ <a href="%s(g.zBaseURL)/logo">%s(g.zBaseURL)/logo</a>.
1753 @ The logo may or may not appear on each
1754 @ page depending on the <a href="setup_skinedit?w=0">CSS</a> and
1755 @ <a href="setup_skinedit?w=2">header setup</a>.
1756 @ To change the logo image, use the following form:</p>
1757 login_insert_csrf_secret();
1758 @ Logo Image file:
1759 @ <input type="file" name="logoim" size="60" accept="image/*" />
1760 @ <p align="center">
@@ -1919,12 +1771,12 @@
1771 @ <form action="%s(g.zTop)/setup_logo" method="post"
1772 @ enctype="multipart/form-data"><div>
1773 @ <p>The background image is accessible to all users at this URL:
1774 @ <a href="%s(g.zBaseURL)/background">%s(g.zBaseURL)/background</a>.
1775 @ The background image may or may not appear on each
1776 @ page depending on the <a href="setup_skinedit?w=0">CSS</a> and
1777 @ <a href="setup_skinedit?w=2">header setup</a>.
1778 @ To change the background image, use the following form:</p>
1779 login_insert_csrf_secret();
1780 @ Background image file:
1781 @ <input type="file" name="bgim" size="60" accept="image/*" />
1782 @ <p align="center">
1783
+187 -24
--- src/skins.c
+++ src/skins.c
@@ -37,24 +37,23 @@
3737
** 4. Make an entry in the following array for the new skin.
3838
*/
3939
static struct BuiltinSkin {
4040
const char *zDesc; /* Description of this skin */
4141
const char *zLabel; /* The directory under skins/ holding this skin */
42
- int whiteForeground; /* True if this skin uses a light-colored foreground */
4342
char *zSQL; /* Filled in at run-time with SQL to insert this skin */
4443
} aBuiltinSkin[] = {
45
- { "Default", "default", 0, 0 },
46
- { "Blitz", "blitz", 0, 0 },
47
- { "Blitz, No Logo", "blitz_no_logo", 0, 0 },
48
- { "Xekri", "xekri", 0, 0 },
49
- { "Original", "original", 0, 0 },
50
- { "Enhanced Original", "enhanced1", 0, 0 },
51
- { "Shadow boxes & Rounded Corners", "rounded1", 0, 0 },
52
- { "Eagle", "eagle", 1, 0 },
53
- { "Black & White, Menu on Left", "black_and_white", 0, 0 },
54
- { "Plain Gray, No Logo", "plain_gray", 0, 0 },
55
- { "Khaki, No Logo", "khaki", 0, 0 },
44
+ { "Default", "default", 0 },
45
+ { "Blitz", "blitz", 0 },
46
+ { "Blitz, No Logo", "blitz_no_logo", 0 },
47
+ { "Xekri", "xekri", 0 },
48
+ { "Original", "original", 0 },
49
+ { "Enhanced Original", "enhanced1", 0 },
50
+ { "Shadow boxes & Rounded Corners", "rounded1", 0 },
51
+ { "Eagle", "eagle", 0 },
52
+ { "Black & White, Menu on Left", "black_and_white", 0 },
53
+ { "Plain Gray, No Logo", "plain_gray", 0 },
54
+ { "Khaki, No Logo", "khaki", 0 },
5655
};
5756
5857
/*
5958
** Alternative skins can be specified in the CGI script or by options
6059
** on the "http", "ui", and "server" commands. The alternative skin
@@ -64,10 +63,25 @@
6463
** The following static variable holds the name of the alternative skin,
6564
** or NULL if the skin should be as configured.
6665
*/
6766
static struct BuiltinSkin *pAltSkin = 0;
6867
static char *zAltSkinDir = 0;
68
+
69
+/*
70
+** Skin details are a set of key/value pairs that define display
71
+** attributes of the skin that cannot be easily specified using CSS
72
+** or that need to be known on the server-side.
73
+**
74
+** The following array holds the value for all known skin details.
75
+*/
76
+static struct SkinDetail {
77
+ const char *zName; /* Name of the detail */
78
+ char *zValue; /* Value of the detail */
79
+} aSkinDetail[] = {
80
+ { "timeline-arrowheads", "yes" },
81
+ { "white-foreground", "no" }
82
+};
6983
7084
/*
7185
** Invoke this routine to set the alternative skin. Return NULL if the
7286
** alternative was successfully installed. Return a string listing all
7387
** available skins if zName does not match an available skin. Memory
@@ -141,18 +155,75 @@
141155
fossil_free(z);
142156
}
143157
}
144158
return zOut;
145159
}
146
-int skin_white_foreground(void){
147
- int rc;
148
- if( pAltSkin ){
149
- rc = pAltSkin->whiteForeground;
150
- }else{
151
- rc = db_get_boolean("white-foreground",0);
152
- }
153
- return rc;
160
+
161
+/*
162
+** Return a pointer to a SkinDetail element. Return 0 if not found.
163
+*/
164
+static struct SkinDetail *skin_detail_find(const char *zName){
165
+ int lwr = 0;
166
+ int upr = ArraySize(aSkinDetail);
167
+ while( upr>=lwr ){
168
+ int mid = (upr+lwr)/2;
169
+ int c = fossil_strcmp(aSkinDetail[mid].zName, zName);
170
+ if( c==0 ) return &aSkinDetail[mid];
171
+ if( c<0 ){
172
+ lwr = mid+1;
173
+ }else{
174
+ upr = mid-1;
175
+ }
176
+ }
177
+ return 0;
178
+}
179
+
180
+/* Initialize the aSkinDetail array using the text in the details.txt
181
+** file.
182
+*/
183
+static void skin_detail_initialize(void){
184
+ static int isInit = 0;
185
+ char *zDetail;
186
+ Blob detail, line, key, value;
187
+ if( isInit ) return;
188
+ isInit = 1;
189
+ zDetail = (char*)skin_get("details");
190
+ if( zDetail==0 ) return;
191
+ zDetail = fossil_strdup(zDetail);
192
+ blob_init(&detail, zDetail, -1);
193
+ while( blob_line(&detail, &line) ){
194
+ char *zKey;
195
+ int nKey;
196
+ struct SkinDetail *pDetail;
197
+ if( !blob_token(&line, &key) ) continue;
198
+ zKey = blob_buffer(&key);
199
+ if( zKey[0]=='#' ) continue;
200
+ nKey = blob_size(&key);
201
+ if( nKey<2 ) continue;
202
+ if( zKey[nKey-1]!=':' ) continue;
203
+ zKey[nKey-1] = 0;
204
+ pDetail = skin_detail_find(zKey);
205
+ if( pDetail==0 ) continue;
206
+ if( !blob_token(&line, &value) ) continue;
207
+ pDetail->zValue = fossil_strdup(blob_str(&value));
208
+ }
209
+ blob_reset(&detail);
210
+ fossil_free(zDetail);
211
+}
212
+
213
+/*
214
+** Return a skin detail setting
215
+*/
216
+const char *skin_detail(const char *zName){
217
+ struct SkinDetail *pDetail;
218
+ skin_detail_initialize();
219
+ pDetail = skin_detail_find(zName);
220
+ if( pDetail==0 ) fossil_fatal("no such skin detail: %s", zName);
221
+ return pDetail->zValue;
222
+}
223
+int skin_detail_boolean(const char *zName){
224
+ return !is_false(skin_detail(zName));
154225
}
155226
156227
/*
157228
** Hash function for computing a skin id.
158229
*/
@@ -227,11 +298,11 @@
227298
** Memory to hold the returned string is obtained from malloc.
228299
*/
229300
static char *getSkin(const char *zName){
230301
const char *z;
231302
char *zLabel;
232
- static const char *azType[] = { "css", "header", "footer" };
303
+ static const char *azType[] = { "css", "header", "footer", "details" };
233304
int i;
234305
Blob val;
235306
blob_zero(&val);
236307
for(i=0; i<sizeof(azType)/sizeof(azType[0]); i++){
237308
if( zName ){
@@ -420,13 +491,15 @@
420491
style_header("Skins");
421492
if( zErr ){
422493
@ <p><font color="red">%h(zErr)</font></p>
423494
}
424495
@ <p>A "skin" is a combination of
425
- @ <a href="setup_editcss">CSS</a>,
426
- @ <a href="setup_header">Header</a>, and
427
- @ <a href="setup_footer">Footer</a> that determines the look and feel
496
+ @ <a href="setup_skinedit?w=0">CSS</a>,
497
+ @ <a href="setup_skinedit?w=2">Header</a>,
498
+ @ <a href="setup_skinedit?w=1">Footer</a>, and
499
+ @ <a href="setup_skinedit?w=3">Details</a>
500
+ @ that determines the look and feel
428501
@ of the web interface.</p>
429502
@
430503
if( pAltSkin ){
431504
@ <p class="generalError">
432505
@ This page is generated using an skin override named
@@ -483,8 +556,98 @@
483556
@ <form action="%s(g.zTop)/setup_skin" method="post">
484557
@ <input type="submit" name="save" value="Save">
485558
@ </form>
486559
}
487560
@ </table>
561
+ style_footer();
562
+ db_end_transaction(0);
563
+}
564
+
565
+
566
+/*
567
+** WEBPAGE: setup_skinedit
568
+**
569
+** w=N -- 0=CSS, 1=footer, 2=header, 3=details
570
+*/
571
+void setup_skinedit(void){
572
+ static const struct sSkinAddr {
573
+ const char *zFile;
574
+ const char *zTitle;
575
+ const char *zSubmenu;
576
+ } aSkinAttr[] = {
577
+ /* 0 */ { "css", "CSS", "CSS", },
578
+ /* 1 */ { "footer", "Page Footer", "Footer", },
579
+ /* 2 */ { "header", "Page Header", "Header", },
580
+ /* 3 */ { "details", "Display Details", "Details", },
581
+ };
582
+ const char *zBasis;
583
+ const char *zContent;
584
+ char *zDflt;
585
+ int ii;
586
+ int j;
587
+
588
+ login_check_credentials();
589
+ if( !g.perm.Setup ){
590
+ login_needed(0);
591
+ return;
592
+ }
593
+ ii = atoi(PD("w","0"));
594
+ if( ii<0 || ii>ArraySize(aSkinAttr) ) ii = 0;
595
+ zBasis = PD("basis","default");
596
+ zDflt = mprintf("skins/%s/%s.txt", zBasis, aSkinAttr[ii].zFile);
597
+ db_begin_transaction();
598
+ if( P("revert")!=0 ){
599
+ db_multi_exec("DELETE FROM config WHERE name=%Q", aSkinAttr[ii].zFile);
600
+ cgi_replace_parameter(aSkinAttr[ii].zFile, builtin_text(zDflt));
601
+ }
602
+ style_header("Edit %s", aSkinAttr[ii].zTitle);
603
+ for(j=0; j<ArraySize(aSkinAttr); j++){
604
+ if( j==ii ) continue;
605
+ style_submenu_element(aSkinAttr[j].zSubmenu, 0,
606
+ "%R/setup_skinedit?w=%d&basis=%h",j,zBasis);
607
+ }
608
+ style_submenu_element("Skins", 0, "%R/setup_skin");
609
+ @ <form action="%s(g.zTop)/setup_skinedit" method="post"><div>
610
+ login_insert_csrf_secret();
611
+ @ <input type='hidden' name='w' value='%d(ii)'>
612
+ @ <h2>Edit %s(aSkinAttr[ii].zTitle):</h2>
613
+ zContent = textarea_attribute("", 10, 80, aSkinAttr[ii].zFile,
614
+ aSkinAttr[ii].zFile, builtin_text(zDflt), 0);
615
+ @ <br />
616
+ @ <input type="submit" name="submit" value="Apply Changes" />
617
+ @ <hr />
618
+ @ Baseline: <select size='1' name='basis'>
619
+ for(j=0; j<ArraySize(aBuiltinSkin); j++){
620
+ cgi_printf("<option value='%h'%s>%h</option>\n",
621
+ aBuiltinSkin[j].zLabel,
622
+ fossil_strcmp(zBasis,aBuiltinSkin[j].zLabel)==0 ? " selected" : "",
623
+ aBuiltinSkin[j].zDesc
624
+ );
625
+ }
626
+ @ </select>
627
+ @ <input type="submit" name="diff" value="Diff" />
628
+ if( P("diff")!=0 ){
629
+ u64 diffFlags = construct_diff_flags(0,0) |
630
+ DIFF_STRIP_EOLCR;
631
+ Blob from, to, out;
632
+ blob_init(&to, zContent, -1);
633
+ blob_init(&from, builtin_text(zDflt), -1);
634
+ blob_zero(&out);
635
+ @ <input type="submit" name="revert" value="Revert" /><p>
636
+ if( diffFlags & DIFF_SIDEBYSIDE ){
637
+ text_diff(&from, &to, &out, 0, diffFlags | DIFF_HTML | DIFF_NOTTOOBIG);
638
+ @ %s(blob_str(&out))
639
+ }else{
640
+ text_diff(&from, &to, &out, 0,
641
+ diffFlags | DIFF_LINENO | DIFF_HTML | DIFF_NOTTOOBIG);
642
+ @ <pre class="udiff">
643
+ @ %s(blob_str(&out))
644
+ @ </pre>
645
+ }
646
+ blob_reset(&from);
647
+ blob_reset(&to);
648
+ blob_reset(&out);
649
+ }
650
+ @ </div></form>
488651
style_footer();
489652
db_end_transaction(0);
490653
}
491654
--- src/skins.c
+++ src/skins.c
@@ -37,24 +37,23 @@
37 ** 4. Make an entry in the following array for the new skin.
38 */
39 static struct BuiltinSkin {
40 const char *zDesc; /* Description of this skin */
41 const char *zLabel; /* The directory under skins/ holding this skin */
42 int whiteForeground; /* True if this skin uses a light-colored foreground */
43 char *zSQL; /* Filled in at run-time with SQL to insert this skin */
44 } aBuiltinSkin[] = {
45 { "Default", "default", 0, 0 },
46 { "Blitz", "blitz", 0, 0 },
47 { "Blitz, No Logo", "blitz_no_logo", 0, 0 },
48 { "Xekri", "xekri", 0, 0 },
49 { "Original", "original", 0, 0 },
50 { "Enhanced Original", "enhanced1", 0, 0 },
51 { "Shadow boxes & Rounded Corners", "rounded1", 0, 0 },
52 { "Eagle", "eagle", 1, 0 },
53 { "Black & White, Menu on Left", "black_and_white", 0, 0 },
54 { "Plain Gray, No Logo", "plain_gray", 0, 0 },
55 { "Khaki, No Logo", "khaki", 0, 0 },
56 };
57
58 /*
59 ** Alternative skins can be specified in the CGI script or by options
60 ** on the "http", "ui", and "server" commands. The alternative skin
@@ -64,10 +63,25 @@
64 ** The following static variable holds the name of the alternative skin,
65 ** or NULL if the skin should be as configured.
66 */
67 static struct BuiltinSkin *pAltSkin = 0;
68 static char *zAltSkinDir = 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
70 /*
71 ** Invoke this routine to set the alternative skin. Return NULL if the
72 ** alternative was successfully installed. Return a string listing all
73 ** available skins if zName does not match an available skin. Memory
@@ -141,18 +155,75 @@
141 fossil_free(z);
142 }
143 }
144 return zOut;
145 }
146 int skin_white_foreground(void){
147 int rc;
148 if( pAltSkin ){
149 rc = pAltSkin->whiteForeground;
150 }else{
151 rc = db_get_boolean("white-foreground",0);
152 }
153 return rc;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
154 }
155
156 /*
157 ** Hash function for computing a skin id.
158 */
@@ -227,11 +298,11 @@
227 ** Memory to hold the returned string is obtained from malloc.
228 */
229 static char *getSkin(const char *zName){
230 const char *z;
231 char *zLabel;
232 static const char *azType[] = { "css", "header", "footer" };
233 int i;
234 Blob val;
235 blob_zero(&val);
236 for(i=0; i<sizeof(azType)/sizeof(azType[0]); i++){
237 if( zName ){
@@ -420,13 +491,15 @@
420 style_header("Skins");
421 if( zErr ){
422 @ <p><font color="red">%h(zErr)</font></p>
423 }
424 @ <p>A "skin" is a combination of
425 @ <a href="setup_editcss">CSS</a>,
426 @ <a href="setup_header">Header</a>, and
427 @ <a href="setup_footer">Footer</a> that determines the look and feel
 
 
428 @ of the web interface.</p>
429 @
430 if( pAltSkin ){
431 @ <p class="generalError">
432 @ This page is generated using an skin override named
@@ -483,8 +556,98 @@
483 @ <form action="%s(g.zTop)/setup_skin" method="post">
484 @ <input type="submit" name="save" value="Save">
485 @ </form>
486 }
487 @ </table>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
488 style_footer();
489 db_end_transaction(0);
490 }
491
--- src/skins.c
+++ src/skins.c
@@ -37,24 +37,23 @@
37 ** 4. Make an entry in the following array for the new skin.
38 */
39 static struct BuiltinSkin {
40 const char *zDesc; /* Description of this skin */
41 const char *zLabel; /* The directory under skins/ holding this skin */
 
42 char *zSQL; /* Filled in at run-time with SQL to insert this skin */
43 } aBuiltinSkin[] = {
44 { "Default", "default", 0 },
45 { "Blitz", "blitz", 0 },
46 { "Blitz, No Logo", "blitz_no_logo", 0 },
47 { "Xekri", "xekri", 0 },
48 { "Original", "original", 0 },
49 { "Enhanced Original", "enhanced1", 0 },
50 { "Shadow boxes & Rounded Corners", "rounded1", 0 },
51 { "Eagle", "eagle", 0 },
52 { "Black & White, Menu on Left", "black_and_white", 0 },
53 { "Plain Gray, No Logo", "plain_gray", 0 },
54 { "Khaki, No Logo", "khaki", 0 },
55 };
56
57 /*
58 ** Alternative skins can be specified in the CGI script or by options
59 ** on the "http", "ui", and "server" commands. The alternative skin
@@ -64,10 +63,25 @@
63 ** The following static variable holds the name of the alternative skin,
64 ** or NULL if the skin should be as configured.
65 */
66 static struct BuiltinSkin *pAltSkin = 0;
67 static char *zAltSkinDir = 0;
68
69 /*
70 ** Skin details are a set of key/value pairs that define display
71 ** attributes of the skin that cannot be easily specified using CSS
72 ** or that need to be known on the server-side.
73 **
74 ** The following array holds the value for all known skin details.
75 */
76 static struct SkinDetail {
77 const char *zName; /* Name of the detail */
78 char *zValue; /* Value of the detail */
79 } aSkinDetail[] = {
80 { "timeline-arrowheads", "yes" },
81 { "white-foreground", "no" }
82 };
83
84 /*
85 ** Invoke this routine to set the alternative skin. Return NULL if the
86 ** alternative was successfully installed. Return a string listing all
87 ** available skins if zName does not match an available skin. Memory
@@ -141,18 +155,75 @@
155 fossil_free(z);
156 }
157 }
158 return zOut;
159 }
160
161 /*
162 ** Return a pointer to a SkinDetail element. Return 0 if not found.
163 */
164 static struct SkinDetail *skin_detail_find(const char *zName){
165 int lwr = 0;
166 int upr = ArraySize(aSkinDetail);
167 while( upr>=lwr ){
168 int mid = (upr+lwr)/2;
169 int c = fossil_strcmp(aSkinDetail[mid].zName, zName);
170 if( c==0 ) return &aSkinDetail[mid];
171 if( c<0 ){
172 lwr = mid+1;
173 }else{
174 upr = mid-1;
175 }
176 }
177 return 0;
178 }
179
180 /* Initialize the aSkinDetail array using the text in the details.txt
181 ** file.
182 */
183 static void skin_detail_initialize(void){
184 static int isInit = 0;
185 char *zDetail;
186 Blob detail, line, key, value;
187 if( isInit ) return;
188 isInit = 1;
189 zDetail = (char*)skin_get("details");
190 if( zDetail==0 ) return;
191 zDetail = fossil_strdup(zDetail);
192 blob_init(&detail, zDetail, -1);
193 while( blob_line(&detail, &line) ){
194 char *zKey;
195 int nKey;
196 struct SkinDetail *pDetail;
197 if( !blob_token(&line, &key) ) continue;
198 zKey = blob_buffer(&key);
199 if( zKey[0]=='#' ) continue;
200 nKey = blob_size(&key);
201 if( nKey<2 ) continue;
202 if( zKey[nKey-1]!=':' ) continue;
203 zKey[nKey-1] = 0;
204 pDetail = skin_detail_find(zKey);
205 if( pDetail==0 ) continue;
206 if( !blob_token(&line, &value) ) continue;
207 pDetail->zValue = fossil_strdup(blob_str(&value));
208 }
209 blob_reset(&detail);
210 fossil_free(zDetail);
211 }
212
213 /*
214 ** Return a skin detail setting
215 */
216 const char *skin_detail(const char *zName){
217 struct SkinDetail *pDetail;
218 skin_detail_initialize();
219 pDetail = skin_detail_find(zName);
220 if( pDetail==0 ) fossil_fatal("no such skin detail: %s", zName);
221 return pDetail->zValue;
222 }
223 int skin_detail_boolean(const char *zName){
224 return !is_false(skin_detail(zName));
225 }
226
227 /*
228 ** Hash function for computing a skin id.
229 */
@@ -227,11 +298,11 @@
298 ** Memory to hold the returned string is obtained from malloc.
299 */
300 static char *getSkin(const char *zName){
301 const char *z;
302 char *zLabel;
303 static const char *azType[] = { "css", "header", "footer", "details" };
304 int i;
305 Blob val;
306 blob_zero(&val);
307 for(i=0; i<sizeof(azType)/sizeof(azType[0]); i++){
308 if( zName ){
@@ -420,13 +491,15 @@
491 style_header("Skins");
492 if( zErr ){
493 @ <p><font color="red">%h(zErr)</font></p>
494 }
495 @ <p>A "skin" is a combination of
496 @ <a href="setup_skinedit?w=0">CSS</a>,
497 @ <a href="setup_skinedit?w=2">Header</a>,
498 @ <a href="setup_skinedit?w=1">Footer</a>, and
499 @ <a href="setup_skinedit?w=3">Details</a>
500 @ that determines the look and feel
501 @ of the web interface.</p>
502 @
503 if( pAltSkin ){
504 @ <p class="generalError">
505 @ This page is generated using an skin override named
@@ -483,8 +556,98 @@
556 @ <form action="%s(g.zTop)/setup_skin" method="post">
557 @ <input type="submit" name="save" value="Save">
558 @ </form>
559 }
560 @ </table>
561 style_footer();
562 db_end_transaction(0);
563 }
564
565
566 /*
567 ** WEBPAGE: setup_skinedit
568 **
569 ** w=N -- 0=CSS, 1=footer, 2=header, 3=details
570 */
571 void setup_skinedit(void){
572 static const struct sSkinAddr {
573 const char *zFile;
574 const char *zTitle;
575 const char *zSubmenu;
576 } aSkinAttr[] = {
577 /* 0 */ { "css", "CSS", "CSS", },
578 /* 1 */ { "footer", "Page Footer", "Footer", },
579 /* 2 */ { "header", "Page Header", "Header", },
580 /* 3 */ { "details", "Display Details", "Details", },
581 };
582 const char *zBasis;
583 const char *zContent;
584 char *zDflt;
585 int ii;
586 int j;
587
588 login_check_credentials();
589 if( !g.perm.Setup ){
590 login_needed(0);
591 return;
592 }
593 ii = atoi(PD("w","0"));
594 if( ii<0 || ii>ArraySize(aSkinAttr) ) ii = 0;
595 zBasis = PD("basis","default");
596 zDflt = mprintf("skins/%s/%s.txt", zBasis, aSkinAttr[ii].zFile);
597 db_begin_transaction();
598 if( P("revert")!=0 ){
599 db_multi_exec("DELETE FROM config WHERE name=%Q", aSkinAttr[ii].zFile);
600 cgi_replace_parameter(aSkinAttr[ii].zFile, builtin_text(zDflt));
601 }
602 style_header("Edit %s", aSkinAttr[ii].zTitle);
603 for(j=0; j<ArraySize(aSkinAttr); j++){
604 if( j==ii ) continue;
605 style_submenu_element(aSkinAttr[j].zSubmenu, 0,
606 "%R/setup_skinedit?w=%d&basis=%h",j,zBasis);
607 }
608 style_submenu_element("Skins", 0, "%R/setup_skin");
609 @ <form action="%s(g.zTop)/setup_skinedit" method="post"><div>
610 login_insert_csrf_secret();
611 @ <input type='hidden' name='w' value='%d(ii)'>
612 @ <h2>Edit %s(aSkinAttr[ii].zTitle):</h2>
613 zContent = textarea_attribute("", 10, 80, aSkinAttr[ii].zFile,
614 aSkinAttr[ii].zFile, builtin_text(zDflt), 0);
615 @ <br />
616 @ <input type="submit" name="submit" value="Apply Changes" />
617 @ <hr />
618 @ Baseline: <select size='1' name='basis'>
619 for(j=0; j<ArraySize(aBuiltinSkin); j++){
620 cgi_printf("<option value='%h'%s>%h</option>\n",
621 aBuiltinSkin[j].zLabel,
622 fossil_strcmp(zBasis,aBuiltinSkin[j].zLabel)==0 ? " selected" : "",
623 aBuiltinSkin[j].zDesc
624 );
625 }
626 @ </select>
627 @ <input type="submit" name="diff" value="Diff" />
628 if( P("diff")!=0 ){
629 u64 diffFlags = construct_diff_flags(0,0) |
630 DIFF_STRIP_EOLCR;
631 Blob from, to, out;
632 blob_init(&to, zContent, -1);
633 blob_init(&from, builtin_text(zDflt), -1);
634 blob_zero(&out);
635 @ <input type="submit" name="revert" value="Revert" /><p>
636 if( diffFlags & DIFF_SIDEBYSIDE ){
637 text_diff(&from, &to, &out, 0, diffFlags | DIFF_HTML | DIFF_NOTTOOBIG);
638 @ %s(blob_str(&out))
639 }else{
640 text_diff(&from, &to, &out, 0,
641 diffFlags | DIFF_LINENO | DIFF_HTML | DIFF_NOTTOOBIG);
642 @ <pre class="udiff">
643 @ %s(blob_str(&out))
644 @ </pre>
645 }
646 blob_reset(&from);
647 blob_reset(&to);
648 blob_reset(&out);
649 }
650 @ </div></form>
651 style_footer();
652 db_end_transaction(0);
653 }
654
+1 -1
--- src/timeline.c
+++ src/timeline.c
@@ -108,11 +108,11 @@
108108
int mx, mn; /* Components of HSV */
109109
static char zColor[10]; /* The resulting color */
110110
static int ix[2] = {0,0}; /* Color chooser parameters */
111111
112112
if( ix[0]==0 ){
113
- if( db_get_boolean("white-foreground", 0) ){
113
+ if( skin_detail_boolean("white-foreground") ){
114114
ix[0] = 140;
115115
ix[1] = 40;
116116
}else{
117117
ix[0] = 216;
118118
ix[1] = 16;
119119
--- src/timeline.c
+++ src/timeline.c
@@ -108,11 +108,11 @@
108 int mx, mn; /* Components of HSV */
109 static char zColor[10]; /* The resulting color */
110 static int ix[2] = {0,0}; /* Color chooser parameters */
111
112 if( ix[0]==0 ){
113 if( db_get_boolean("white-foreground", 0) ){
114 ix[0] = 140;
115 ix[1] = 40;
116 }else{
117 ix[0] = 216;
118 ix[1] = 16;
119
--- src/timeline.c
+++ src/timeline.c
@@ -108,11 +108,11 @@
108 int mx, mn; /* Components of HSV */
109 static char zColor[10]; /* The resulting color */
110 static int ix[2] = {0,0}; /* Color chooser parameters */
111
112 if( ix[0]==0 ){
113 if( skin_detail_boolean("white-foreground") ){
114 ix[0] = 140;
115 ix[1] = 40;
116 }else{
117 ix[0] = 216;
118 ix[1] = 16;
119
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -485,43 +485,55 @@
485485
$(SRCDIR)/xfer.c \
486486
$(SRCDIR)/xfersetup.c \
487487
$(SRCDIR)/zip.c
488488
489489
EXTRA_FILES = \
490
+ $(SRCDIR)/../skins/aht/details.txt \
490491
$(SRCDIR)/../skins/black_and_white/css.txt \
492
+ $(SRCDIR)/../skins/black_and_white/details.txt \
491493
$(SRCDIR)/../skins/black_and_white/footer.txt \
492494
$(SRCDIR)/../skins/black_and_white/header.txt \
493495
$(SRCDIR)/../skins/blitz/css.txt \
496
+ $(SRCDIR)/../skins/blitz/details.txt \
494497
$(SRCDIR)/../skins/blitz/footer.txt \
495498
$(SRCDIR)/../skins/blitz/header.txt \
496499
$(SRCDIR)/../skins/blitz/ticket.txt \
497500
$(SRCDIR)/../skins/blitz_no_logo/css.txt \
501
+ $(SRCDIR)/../skins/blitz_no_logo/details.txt \
498502
$(SRCDIR)/../skins/blitz_no_logo/footer.txt \
499503
$(SRCDIR)/../skins/blitz_no_logo/header.txt \
500504
$(SRCDIR)/../skins/blitz_no_logo/ticket.txt \
501505
$(SRCDIR)/../skins/default/css.txt \
506
+ $(SRCDIR)/../skins/default/details.txt \
502507
$(SRCDIR)/../skins/default/footer.txt \
503508
$(SRCDIR)/../skins/default/header.txt \
504509
$(SRCDIR)/../skins/eagle/css.txt \
510
+ $(SRCDIR)/../skins/eagle/details.txt \
505511
$(SRCDIR)/../skins/eagle/footer.txt \
506512
$(SRCDIR)/../skins/eagle/header.txt \
507513
$(SRCDIR)/../skins/enhanced1/css.txt \
514
+ $(SRCDIR)/../skins/enhanced1/details.txt \
508515
$(SRCDIR)/../skins/enhanced1/footer.txt \
509516
$(SRCDIR)/../skins/enhanced1/header.txt \
510517
$(SRCDIR)/../skins/khaki/css.txt \
518
+ $(SRCDIR)/../skins/khaki/details.txt \
511519
$(SRCDIR)/../skins/khaki/footer.txt \
512520
$(SRCDIR)/../skins/khaki/header.txt \
513521
$(SRCDIR)/../skins/original/css.txt \
522
+ $(SRCDIR)/../skins/original/details.txt \
514523
$(SRCDIR)/../skins/original/footer.txt \
515524
$(SRCDIR)/../skins/original/header.txt \
516525
$(SRCDIR)/../skins/plain_gray/css.txt \
526
+ $(SRCDIR)/../skins/plain_gray/details.txt \
517527
$(SRCDIR)/../skins/plain_gray/footer.txt \
518528
$(SRCDIR)/../skins/plain_gray/header.txt \
519529
$(SRCDIR)/../skins/rounded1/css.txt \
530
+ $(SRCDIR)/../skins/rounded1/details.txt \
520531
$(SRCDIR)/../skins/rounded1/footer.txt \
521532
$(SRCDIR)/../skins/rounded1/header.txt \
522533
$(SRCDIR)/../skins/xekri/css.txt \
534
+ $(SRCDIR)/../skins/xekri/details.txt \
523535
$(SRCDIR)/../skins/xekri/footer.txt \
524536
$(SRCDIR)/../skins/xekri/header.txt \
525537
$(SRCDIR)/diff.tcl \
526538
$(SRCDIR)/markdown.md
527539
528540
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -485,43 +485,55 @@
485 $(SRCDIR)/xfer.c \
486 $(SRCDIR)/xfersetup.c \
487 $(SRCDIR)/zip.c
488
489 EXTRA_FILES = \
 
490 $(SRCDIR)/../skins/black_and_white/css.txt \
 
491 $(SRCDIR)/../skins/black_and_white/footer.txt \
492 $(SRCDIR)/../skins/black_and_white/header.txt \
493 $(SRCDIR)/../skins/blitz/css.txt \
 
494 $(SRCDIR)/../skins/blitz/footer.txt \
495 $(SRCDIR)/../skins/blitz/header.txt \
496 $(SRCDIR)/../skins/blitz/ticket.txt \
497 $(SRCDIR)/../skins/blitz_no_logo/css.txt \
 
498 $(SRCDIR)/../skins/blitz_no_logo/footer.txt \
499 $(SRCDIR)/../skins/blitz_no_logo/header.txt \
500 $(SRCDIR)/../skins/blitz_no_logo/ticket.txt \
501 $(SRCDIR)/../skins/default/css.txt \
 
502 $(SRCDIR)/../skins/default/footer.txt \
503 $(SRCDIR)/../skins/default/header.txt \
504 $(SRCDIR)/../skins/eagle/css.txt \
 
505 $(SRCDIR)/../skins/eagle/footer.txt \
506 $(SRCDIR)/../skins/eagle/header.txt \
507 $(SRCDIR)/../skins/enhanced1/css.txt \
 
508 $(SRCDIR)/../skins/enhanced1/footer.txt \
509 $(SRCDIR)/../skins/enhanced1/header.txt \
510 $(SRCDIR)/../skins/khaki/css.txt \
 
511 $(SRCDIR)/../skins/khaki/footer.txt \
512 $(SRCDIR)/../skins/khaki/header.txt \
513 $(SRCDIR)/../skins/original/css.txt \
 
514 $(SRCDIR)/../skins/original/footer.txt \
515 $(SRCDIR)/../skins/original/header.txt \
516 $(SRCDIR)/../skins/plain_gray/css.txt \
 
517 $(SRCDIR)/../skins/plain_gray/footer.txt \
518 $(SRCDIR)/../skins/plain_gray/header.txt \
519 $(SRCDIR)/../skins/rounded1/css.txt \
 
520 $(SRCDIR)/../skins/rounded1/footer.txt \
521 $(SRCDIR)/../skins/rounded1/header.txt \
522 $(SRCDIR)/../skins/xekri/css.txt \
 
523 $(SRCDIR)/../skins/xekri/footer.txt \
524 $(SRCDIR)/../skins/xekri/header.txt \
525 $(SRCDIR)/diff.tcl \
526 $(SRCDIR)/markdown.md
527
528
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -485,43 +485,55 @@
485 $(SRCDIR)/xfer.c \
486 $(SRCDIR)/xfersetup.c \
487 $(SRCDIR)/zip.c
488
489 EXTRA_FILES = \
490 $(SRCDIR)/../skins/aht/details.txt \
491 $(SRCDIR)/../skins/black_and_white/css.txt \
492 $(SRCDIR)/../skins/black_and_white/details.txt \
493 $(SRCDIR)/../skins/black_and_white/footer.txt \
494 $(SRCDIR)/../skins/black_and_white/header.txt \
495 $(SRCDIR)/../skins/blitz/css.txt \
496 $(SRCDIR)/../skins/blitz/details.txt \
497 $(SRCDIR)/../skins/blitz/footer.txt \
498 $(SRCDIR)/../skins/blitz/header.txt \
499 $(SRCDIR)/../skins/blitz/ticket.txt \
500 $(SRCDIR)/../skins/blitz_no_logo/css.txt \
501 $(SRCDIR)/../skins/blitz_no_logo/details.txt \
502 $(SRCDIR)/../skins/blitz_no_logo/footer.txt \
503 $(SRCDIR)/../skins/blitz_no_logo/header.txt \
504 $(SRCDIR)/../skins/blitz_no_logo/ticket.txt \
505 $(SRCDIR)/../skins/default/css.txt \
506 $(SRCDIR)/../skins/default/details.txt \
507 $(SRCDIR)/../skins/default/footer.txt \
508 $(SRCDIR)/../skins/default/header.txt \
509 $(SRCDIR)/../skins/eagle/css.txt \
510 $(SRCDIR)/../skins/eagle/details.txt \
511 $(SRCDIR)/../skins/eagle/footer.txt \
512 $(SRCDIR)/../skins/eagle/header.txt \
513 $(SRCDIR)/../skins/enhanced1/css.txt \
514 $(SRCDIR)/../skins/enhanced1/details.txt \
515 $(SRCDIR)/../skins/enhanced1/footer.txt \
516 $(SRCDIR)/../skins/enhanced1/header.txt \
517 $(SRCDIR)/../skins/khaki/css.txt \
518 $(SRCDIR)/../skins/khaki/details.txt \
519 $(SRCDIR)/../skins/khaki/footer.txt \
520 $(SRCDIR)/../skins/khaki/header.txt \
521 $(SRCDIR)/../skins/original/css.txt \
522 $(SRCDIR)/../skins/original/details.txt \
523 $(SRCDIR)/../skins/original/footer.txt \
524 $(SRCDIR)/../skins/original/header.txt \
525 $(SRCDIR)/../skins/plain_gray/css.txt \
526 $(SRCDIR)/../skins/plain_gray/details.txt \
527 $(SRCDIR)/../skins/plain_gray/footer.txt \
528 $(SRCDIR)/../skins/plain_gray/header.txt \
529 $(SRCDIR)/../skins/rounded1/css.txt \
530 $(SRCDIR)/../skins/rounded1/details.txt \
531 $(SRCDIR)/../skins/rounded1/footer.txt \
532 $(SRCDIR)/../skins/rounded1/header.txt \
533 $(SRCDIR)/../skins/xekri/css.txt \
534 $(SRCDIR)/../skins/xekri/details.txt \
535 $(SRCDIR)/../skins/xekri/footer.txt \
536 $(SRCDIR)/../skins/xekri/header.txt \
537 $(SRCDIR)/diff.tcl \
538 $(SRCDIR)/markdown.md
539
540
+13 -1
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -325,43 +325,55 @@
325325
wysiwyg_.c \
326326
xfer_.c \
327327
xfersetup_.c \
328328
zip_.c
329329
330
-EXTRA_FILES = $(SRCDIR)\../skins/black_and_white/css.txt \
330
+EXTRA_FILES = $(SRCDIR)\../skins/aht/details.txt \
331
+ $(SRCDIR)\../skins/black_and_white/css.txt \
332
+ $(SRCDIR)\../skins/black_and_white/details.txt \
331333
$(SRCDIR)\../skins/black_and_white/footer.txt \
332334
$(SRCDIR)\../skins/black_and_white/header.txt \
333335
$(SRCDIR)\../skins/blitz/css.txt \
336
+ $(SRCDIR)\../skins/blitz/details.txt \
334337
$(SRCDIR)\../skins/blitz/footer.txt \
335338
$(SRCDIR)\../skins/blitz/header.txt \
336339
$(SRCDIR)\../skins/blitz/ticket.txt \
337340
$(SRCDIR)\../skins/blitz_no_logo/css.txt \
341
+ $(SRCDIR)\../skins/blitz_no_logo/details.txt \
338342
$(SRCDIR)\../skins/blitz_no_logo/footer.txt \
339343
$(SRCDIR)\../skins/blitz_no_logo/header.txt \
340344
$(SRCDIR)\../skins/blitz_no_logo/ticket.txt \
341345
$(SRCDIR)\../skins/default/css.txt \
346
+ $(SRCDIR)\../skins/default/details.txt \
342347
$(SRCDIR)\../skins/default/footer.txt \
343348
$(SRCDIR)\../skins/default/header.txt \
344349
$(SRCDIR)\../skins/eagle/css.txt \
350
+ $(SRCDIR)\../skins/eagle/details.txt \
345351
$(SRCDIR)\../skins/eagle/footer.txt \
346352
$(SRCDIR)\../skins/eagle/header.txt \
347353
$(SRCDIR)\../skins/enhanced1/css.txt \
354
+ $(SRCDIR)\../skins/enhanced1/details.txt \
348355
$(SRCDIR)\../skins/enhanced1/footer.txt \
349356
$(SRCDIR)\../skins/enhanced1/header.txt \
350357
$(SRCDIR)\../skins/khaki/css.txt \
358
+ $(SRCDIR)\../skins/khaki/details.txt \
351359
$(SRCDIR)\../skins/khaki/footer.txt \
352360
$(SRCDIR)\../skins/khaki/header.txt \
353361
$(SRCDIR)\../skins/original/css.txt \
362
+ $(SRCDIR)\../skins/original/details.txt \
354363
$(SRCDIR)\../skins/original/footer.txt \
355364
$(SRCDIR)\../skins/original/header.txt \
356365
$(SRCDIR)\../skins/plain_gray/css.txt \
366
+ $(SRCDIR)\../skins/plain_gray/details.txt \
357367
$(SRCDIR)\../skins/plain_gray/footer.txt \
358368
$(SRCDIR)\../skins/plain_gray/header.txt \
359369
$(SRCDIR)\../skins/rounded1/css.txt \
370
+ $(SRCDIR)\../skins/rounded1/details.txt \
360371
$(SRCDIR)\../skins/rounded1/footer.txt \
361372
$(SRCDIR)\../skins/rounded1/header.txt \
362373
$(SRCDIR)\../skins/xekri/css.txt \
374
+ $(SRCDIR)\../skins/xekri/details.txt \
363375
$(SRCDIR)\../skins/xekri/footer.txt \
364376
$(SRCDIR)\../skins/xekri/header.txt \
365377
$(SRCDIR)\diff.tcl \
366378
$(SRCDIR)\markdown.md
367379
368380
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -325,43 +325,55 @@
325 wysiwyg_.c \
326 xfer_.c \
327 xfersetup_.c \
328 zip_.c
329
330 EXTRA_FILES = $(SRCDIR)\../skins/black_and_white/css.txt \
 
 
331 $(SRCDIR)\../skins/black_and_white/footer.txt \
332 $(SRCDIR)\../skins/black_and_white/header.txt \
333 $(SRCDIR)\../skins/blitz/css.txt \
 
334 $(SRCDIR)\../skins/blitz/footer.txt \
335 $(SRCDIR)\../skins/blitz/header.txt \
336 $(SRCDIR)\../skins/blitz/ticket.txt \
337 $(SRCDIR)\../skins/blitz_no_logo/css.txt \
 
338 $(SRCDIR)\../skins/blitz_no_logo/footer.txt \
339 $(SRCDIR)\../skins/blitz_no_logo/header.txt \
340 $(SRCDIR)\../skins/blitz_no_logo/ticket.txt \
341 $(SRCDIR)\../skins/default/css.txt \
 
342 $(SRCDIR)\../skins/default/footer.txt \
343 $(SRCDIR)\../skins/default/header.txt \
344 $(SRCDIR)\../skins/eagle/css.txt \
 
345 $(SRCDIR)\../skins/eagle/footer.txt \
346 $(SRCDIR)\../skins/eagle/header.txt \
347 $(SRCDIR)\../skins/enhanced1/css.txt \
 
348 $(SRCDIR)\../skins/enhanced1/footer.txt \
349 $(SRCDIR)\../skins/enhanced1/header.txt \
350 $(SRCDIR)\../skins/khaki/css.txt \
 
351 $(SRCDIR)\../skins/khaki/footer.txt \
352 $(SRCDIR)\../skins/khaki/header.txt \
353 $(SRCDIR)\../skins/original/css.txt \
 
354 $(SRCDIR)\../skins/original/footer.txt \
355 $(SRCDIR)\../skins/original/header.txt \
356 $(SRCDIR)\../skins/plain_gray/css.txt \
 
357 $(SRCDIR)\../skins/plain_gray/footer.txt \
358 $(SRCDIR)\../skins/plain_gray/header.txt \
359 $(SRCDIR)\../skins/rounded1/css.txt \
 
360 $(SRCDIR)\../skins/rounded1/footer.txt \
361 $(SRCDIR)\../skins/rounded1/header.txt \
362 $(SRCDIR)\../skins/xekri/css.txt \
 
363 $(SRCDIR)\../skins/xekri/footer.txt \
364 $(SRCDIR)\../skins/xekri/header.txt \
365 $(SRCDIR)\diff.tcl \
366 $(SRCDIR)\markdown.md
367
368
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -325,43 +325,55 @@
325 wysiwyg_.c \
326 xfer_.c \
327 xfersetup_.c \
328 zip_.c
329
330 EXTRA_FILES = $(SRCDIR)\../skins/aht/details.txt \
331 $(SRCDIR)\../skins/black_and_white/css.txt \
332 $(SRCDIR)\../skins/black_and_white/details.txt \
333 $(SRCDIR)\../skins/black_and_white/footer.txt \
334 $(SRCDIR)\../skins/black_and_white/header.txt \
335 $(SRCDIR)\../skins/blitz/css.txt \
336 $(SRCDIR)\../skins/blitz/details.txt \
337 $(SRCDIR)\../skins/blitz/footer.txt \
338 $(SRCDIR)\../skins/blitz/header.txt \
339 $(SRCDIR)\../skins/blitz/ticket.txt \
340 $(SRCDIR)\../skins/blitz_no_logo/css.txt \
341 $(SRCDIR)\../skins/blitz_no_logo/details.txt \
342 $(SRCDIR)\../skins/blitz_no_logo/footer.txt \
343 $(SRCDIR)\../skins/blitz_no_logo/header.txt \
344 $(SRCDIR)\../skins/blitz_no_logo/ticket.txt \
345 $(SRCDIR)\../skins/default/css.txt \
346 $(SRCDIR)\../skins/default/details.txt \
347 $(SRCDIR)\../skins/default/footer.txt \
348 $(SRCDIR)\../skins/default/header.txt \
349 $(SRCDIR)\../skins/eagle/css.txt \
350 $(SRCDIR)\../skins/eagle/details.txt \
351 $(SRCDIR)\../skins/eagle/footer.txt \
352 $(SRCDIR)\../skins/eagle/header.txt \
353 $(SRCDIR)\../skins/enhanced1/css.txt \
354 $(SRCDIR)\../skins/enhanced1/details.txt \
355 $(SRCDIR)\../skins/enhanced1/footer.txt \
356 $(SRCDIR)\../skins/enhanced1/header.txt \
357 $(SRCDIR)\../skins/khaki/css.txt \
358 $(SRCDIR)\../skins/khaki/details.txt \
359 $(SRCDIR)\../skins/khaki/footer.txt \
360 $(SRCDIR)\../skins/khaki/header.txt \
361 $(SRCDIR)\../skins/original/css.txt \
362 $(SRCDIR)\../skins/original/details.txt \
363 $(SRCDIR)\../skins/original/footer.txt \
364 $(SRCDIR)\../skins/original/header.txt \
365 $(SRCDIR)\../skins/plain_gray/css.txt \
366 $(SRCDIR)\../skins/plain_gray/details.txt \
367 $(SRCDIR)\../skins/plain_gray/footer.txt \
368 $(SRCDIR)\../skins/plain_gray/header.txt \
369 $(SRCDIR)\../skins/rounded1/css.txt \
370 $(SRCDIR)\../skins/rounded1/details.txt \
371 $(SRCDIR)\../skins/rounded1/footer.txt \
372 $(SRCDIR)\../skins/rounded1/header.txt \
373 $(SRCDIR)\../skins/xekri/css.txt \
374 $(SRCDIR)\../skins/xekri/details.txt \
375 $(SRCDIR)\../skins/xekri/footer.txt \
376 $(SRCDIR)\../skins/xekri/header.txt \
377 $(SRCDIR)\diff.tcl \
378 $(SRCDIR)\markdown.md
379
380

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button