ADDED skins/README.md Index: skins/README.md ================================================================== --- /dev/null +++ skins/README.md @@ -0,0 +1,27 @@ +Built-in Skins +============== + +Each subdirectory under this folder describes a built-in "skin". +There are three files in each subdirectory for the CSS, the header, +and the footer for the skin. + +To improve an existing built-in skin, simply edit the appropriate +files and recompile. + +To add a new skin: + + 1. Create a new subdirectory under skins/. (The new directory is + called "skins/newskin" below but you should use a new original + name, of course.) + + 2. Add files skins/newskin/css.txt, skins/newskin/header.txt, + and skins/newskin/footer.txt. Be sure to "fossil add" these files. + + 3. Go to the src/ directory and rerun "tclsh makemake.tcl". This + step rebuilds the various makefiles so that they have dependencies + on the skin files you just installed. + + 4. Edit the BuiltinSkin[] array near the top of the src/skins.c source + file so that it describes and references the "newskin" skin. + + 5. Type "make" to rebuild. ADDED skins/black_and_white/css.txt Index: skins/black_and_white/css.txt ================================================================== --- /dev/null +++ skins/black_and_white/css.txt @@ -0,0 +1,174 @@ +/* General settings for the entire page */ +body { + margin:0px 0px 0px 0px; + padding:0px; + font-family:verdana, arial, helvetica, "sans serif"; + color:#333; + background-color:white; +} + +/* consistent colours */ +h2 { + color: #333; +} +h3 { + color: #333; +} + +/* The project logo in the upper left-hand corner of each page */ +div.logo { + display: table-cell; + text-align: left; + vertical-align: bottom; + font-weight: bold; + color: #333; + white-space: nowrap; +} + +/* The page title centered at the top of each page */ +div.title { + display: table-cell; + font-size: 2em; + font-weight: bold; + text-align: center; + color: #333; + vertical-align: bottom; + width: 100%; +} + +/* The login status message in the top right-hand corner */ +div.status { + display: table-cell; + padding-right: 10px; + text-align: right; + vertical-align: bottom; + padding-bottom: 5px; + color: #333; + font-size: 0.8em; + font-weight: bold; + white-space: nowrap; +} + +/* The header across the top of the page */ +div.header { + margin:10px 0px 10px 0px; + padding:1px 0px 0px 20px; + border-style:solid; + border-color:black; + border-width:1px 0px; + background-color:#eee; +} + +/* The main menu bar that appears at the top left of the page beneath +** the header. Width must be co-ordinated with the container below */ +div.mainmenu { + float: left; + margin-left: 10px; + margin-right: 10px; + font-size: 0.9em; + font-weight: bold; + padding:5px; + background-color:#eee; + border:1px solid #999; + width:8em; +} + +/* Main menu is now a list */ +div.mainmenu ul { + padding: 0; + list-style:none; +} +div.mainmenu a, div.mainmenu a:visited{ + padding: 1px 10px 1px 10px; + color: #333; + text-decoration: none; +} +div.mainmenu a:hover { + color: #eee; + background-color: #333; +} + +/* Container for the sub-menu and content so they don't spread +** out underneath the main menu */ +#container { + padding-left: 9em; +} + +/* The submenu bar that *sometimes* appears below the main menu */ +div.submenu, div.sectionmenu { + padding: 3px 10px 3px 10px; + font-size: 0.9em; + text-align: center; + border:1px solid #999; + border-width:1px 0px; + background-color: #eee; + color: #333; +} +div.submenu a, div.submenu a:visited, div.sectionmenu>a.button:link, +div.sectionmenu>a.button:visited { + padding: 3px 10px 3px 10px; + color: #333; + text-decoration: none; +} +div.submenu a:hover, div.sectionmenu>a.button:hover { + color: #eee; + background-color: #333; +} + +/* All page content from the bottom of the menu or submenu down to +** the footer */ +div.content { + padding: 2ex 1ex 0ex 2ex; +} + +/* Some pages have section dividers */ +div.section { + margin-bottom: 0px; + margin-top: 1em; + padding: 1px 1px 1px 1px; + font-size: 1.2em; + font-weight: bold; + border-style:solid; + border-color:#999; + border-width:1px 0px; + background-color: #eee; + color: #333; + white-space: nowrap; +} + +/* The "Date" that occurs on the left hand side of timelines */ +div.divider { + background: #eee; + border: 2px #999 solid; + font-size: 1em; font-weight: normal; + padding: .25em; + margin: .2em 0 .2em 0; + float: left; + clear: left; + color: #333; + white-space: nowrap; +} + +/* The footer at the very bottom of the page */ +div.footer { + font-size: 0.8em; + margin-top: 12px; + padding: 5px 10px 5px 10px; + text-align: right; + background-color: #eee; + color: #555; +} + +/* blocks */ +pre.verbatim { + background-color: #f5f5f5; + padding: 0.5em; + white-space: pre-wrap; +} + +/* The label/value pairs on (for example) the ci page */ +table.label-value th { + vertical-align: top; + text-align: right; + padding: 0.2ex 2ex; +} ADDED skins/black_and_white/footer.txt Index: skins/black_and_white/footer.txt ================================================================== --- /dev/null +++ skins/black_and_white/footer.txt @@ -0,0 +1,4 @@ + + ADDED skins/black_and_white/header.txt Index: skins/black_and_white/header.txt ================================================================== --- /dev/null +++ skins/black_and_white/header.txt @@ -0,0 +1,54 @@ + + + +$<project_name>: $<title> + + + + +
+ +
$</div> + <div class="status"><th1> + if {[info exists login]} { + puts "Logged in as $login" + } else { + puts "Not logged in" + } + </th1></div> +</div> +<div class="mainmenu"> +<th1> +html "<a href='$home$index_page'>Home</a>\n" +if {[anycap jor]} { + html "<a href='$home/timeline'>Timeline</a>\n" +} +if {[hascap oh]} { + html "<a href='$home/tree?ci=tip'>Files</a>\n" +} +if {[hascap o]} { + html "<a href='$home/brlist'>Branches</a>\n" + html "<a href='$home/taglist'>Tags</a>\n" +} +if {[hascap r]} { + html "<a href='$home/reportlist'>Tickets</a>\n" +} +if {[hascap j]} { + html "<a href='$home/wiki'>Wiki</a>\n" +} +if {[hascap s]} { + html "<a href='$home/setup'>Admin</a>\n" +} elseif {[hascap a]} { + html "<a href='$home/setup_ulist'>Users</a>\n" +} +if {[info exists login]} { + html "<a href='$home/login'>Logout</a>\n" +} else { + html "<a href='$home/login'>Login</a>\n" +} +</th1></ul></div> ADDED skins/default/css.txt Index: skins/default/css.txt ================================================================== --- /dev/null +++ skins/default/css.txt @@ -0,0 +1,138 @@ +/* General settings for the entire page */ +body { + margin: 0ex 1ex; + padding: 0px; + background-color: white; + font-family: sans-serif; +} + +/* The project logo in the upper left-hand corner of each page */ +div.logo { + display: table-cell; + text-align: center; + vertical-align: bottom; + font-weight: bold; + color: #558195; + min-width: 200px; + white-space: nowrap; +} + +/* The page title centered at the top of each page */ +div.title { + display: table-cell; + font-size: 2em; + font-weight: bold; + text-align: center; + padding: 0 0 0 1em; + color: #558195; + vertical-align: bottom; + width: 100%; +} + +/* The login status message in the top right-hand corner */ +div.status { + display: table-cell; + text-align: right; + vertical-align: bottom; + color: #558195; + font-size: 0.8em; + font-weight: bold; + min-width: 200px; + white-space: nowrap; +} + +/* The header across the top of the page */ +div.header { + display: table; + width: 100%; +} + +/* The main menu bar that appears at the top of the page beneath +** the header */ +div.mainmenu { + padding: 5px 10px 5px 10px; + font-size: 0.9em; + font-weight: bold; + text-align: center; + letter-spacing: 1px; + background-color: #558195; + border-top-left-radius: 8px; + border-top-right-radius: 8px; + color: white; +} + +/* The submenu bar that *sometimes* appears below the main menu */ +div.submenu, div.sectionmenu { + padding: 3px 10px 3px 0px; + font-size: 0.9em; + text-align: center; + background-color: #456878; + color: white; +} +div.mainmenu a, div.mainmenu a:visited, div.submenu a, div.submenu a:visited, +div.sectionmenu>a.button:link, div.sectionmenu>a.button:visited { + padding: 3px 10px 3px 10px; + color: white; + text-decoration: none; +} +div.mainmenu a:hover, div.submenu a:hover, div.sectionmenu>a.button:hover { + color: #558195; + background-color: white; +} + +/* All page content from the bottom of the menu or submenu down to +** the footer */ +div.content { + padding: 0ex 1ex 1ex 1ex; + border: solid #aaa; + border-width: 1px; +} + +/* Some pages have section dividers */ +div.section { + margin-bottom: 0px; + margin-top: 1em; + padding: 1px 1px 1px 1px; + font-size: 1.2em; + font-weight: bold; + background-color: #558195; + color: white; + white-space: nowrap; +} + +/* The "Date" that occurs on the left hand side of timelines */ +div.divider { + background: #a1c4d4; + border: 2px #558195 solid; + font-size: 1em; font-weight: normal; + padding: .25em; + margin: .2em 0 .2em 0; + float: left; + clear: left; + white-space: nowrap; +} + +/* The footer at the very bottom of the page */ +div.footer { + clear: both; + font-size: 0.8em; + padding: 5px 10px 5px 10px; + text-align: right; + background-color: #558195; + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + color: white; +} + +/* Hyperlink colors in the footer */ +div.footer a { color: white; } +div.footer a:link { color: white; } +div.footer a:visited { color: white; } +div.footer a:hover { background-color: white; color: #558195; } + +/* verbatim blocks */ +pre.verbatim { + background-color: #f5f5f5; + padding: 0.5em; + white-space: pre-wrap; +} ADDED skins/default/footer.txt Index: skins/default/footer.txt ================================================================== --- /dev/null +++ skins/default/footer.txt @@ -0,0 +1,6 @@ +<div class="footer"> +This page was generated in about +<th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s by +Fossil version $manifest_version $manifest_date +</div> +</body></html> ADDED skins/default/header.txt Index: skins/default/header.txt ================================================================== --- /dev/null +++ skins/default/header.txt @@ -0,0 +1,53 @@ +<html> +<head> +<base href="$baseurl/$current_page" /> +<title>$<project_name>: $<title> + + + + +
+ +
$
$</div> + <div class="status"><th1> + if {[info exists login]} { + puts "Logged in as $login" + } else { + puts "Not logged in" + } + </th1></div> +</div> +<div class="mainmenu"> +<th1> +html "<a href='$home$index_page'>Home</a>\n" +if {[anycap jor]} { + html "<a href='$home/timeline'>Timeline</a>\n" +} +if {[hascap oh]} { + html "<a href='$home/tree?ci=tip'>Files</a>\n" +} +if {[hascap o]} { + html "<a href='$home/brlist'>Branches</a>\n" + html "<a href='$home/taglist'>Tags</a>\n" +} +if {[hascap r]} { + html "<a href='$home/reportlist'>Tickets</a>\n" +} +if {[hascap j]} { + html "<a href='$home/wiki'>Wiki</a>\n" +} +if {[hascap s]} { + html "<a href='$home/setup'>Admin</a>\n" +} elseif {[hascap a]} { + html "<a href='$home/setup_ulist'>Users</a>\n" +} +if {[info exists login]} { + html "<a href='$home/login'>Logout</a>\n" +} else { + html "<a href='$home/login'>Login</a>\n" +} +</th1></div> ADDED skins/enhanced1/css.txt Index: skins/enhanced1/css.txt ================================================================== --- /dev/null +++ skins/enhanced1/css.txt @@ -0,0 +1,145 @@ +/* General settings for the entire page */ +body { + margin: 0ex 1ex; + padding: 0px; + background-color: white; + font-family: sans-serif; +} + +/* The project logo in the upper left-hand corner of each page */ +div.logo { + display: table-cell; + text-align: center; + vertical-align: bottom; + font-weight: bold; + color: #558195; + min-width: 200px; + white-space: nowrap; +} + +/* The page title centered at the top of each page */ +div.title { + display: table-cell; + font-size: 2em; + font-weight: bold; + text-align: center; + padding: 0 0 0 1em; + color: #558195; + vertical-align: bottom; + width: 100%; +} + +/* The login status message in the top right-hand corner */ +div.status { + display: table-cell; + text-align: right; + vertical-align: bottom; + color: #558195; + font-size: 0.8em; + font-weight: bold; + min-width: 200px; + white-space: nowrap; +} + +/* The header across the top of the page */ +div.header { + display: table; + width: 100%; +} + +/* The main menu bar that appears at the top of the page beneath +** the header */ +div.mainmenu { + padding: 5px 10px 5px 10px; + font-size: 0.9em; + font-weight: bold; + text-align: center; + letter-spacing: 1px; + background-color: #558195; + border-top-left-radius: 8px; + border-top-right-radius: 8px; + color: white; +} + +/* The submenu bar that *sometimes* appears below the main menu */ +div.submenu, div.sectionmenu { + padding: 3px 10px 3px 0px; + font-size: 0.9em; + text-align: center; + background-color: #456878; + color: white; +} +div.mainmenu a, div.mainmenu a:visited, div.submenu a, div.submenu a:visited, +div.sectionmenu>a.button:link, div.sectionmenu>a.button:visited { + padding: 3px 10px 3px 10px; + color: white; + text-decoration: none; +} +div.mainmenu a:hover, div.submenu a:hover, div.sectionmenu>a.button:hover { + color: #558195; + background-color: white; +} + +/* All page content from the bottom of the menu or submenu down to +** the footer */ +div.content { + padding: 0ex 1ex 1ex 1ex; + border: solid #aaa; + border-width: 1px; +} + +/* Some pages have section dividers */ +div.section { + margin-bottom: 0px; + margin-top: 1em; + padding: 1px 1px 1px 1px; + font-size: 1.2em; + font-weight: bold; + background-color: #558195; + color: white; + white-space: nowrap; +} + +/* The "Date" that occurs on the left hand side of timelines */ +div.divider { + background: #a1c4d4; + border: 2px #558195 solid; + font-size: 1em; font-weight: normal; + padding: .25em; + margin: .2em 0 .2em 0; + float: left; + clear: left; + white-space: nowrap; +} + +/* The footer at the very bottom of the page */ +div.footer { + clear: both; + font-size: 0.8em; + padding: 5px 10px 5px 10px; + text-align: right; + background-color: #558195; + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + color: white; +} + +/* Hyperlink colors in the footer */ +div.footer a { color: white; } +div.footer a:link { color: white; } +div.footer a:visited { color: white; } +div.footer a:hover { background-color: white; color: #558195; } + +/* verbatim blocks */ +pre.verbatim { + background-color: #f5f5f5; + padding: 0.5em; + white-space: pre-wrap; +} + +/* The label/value pairs on (for example) the ci page */ +table.label-value th { + vertical-align: top; + text-align: right; + padding: 0.2ex 2ex; +} ADDED skins/enhanced1/footer.txt Index: skins/enhanced1/footer.txt ================================================================== --- /dev/null +++ skins/enhanced1/footer.txt @@ -0,0 +1,24 @@ +<div class="footer"> + <th1> + proc getTclVersion {} { + if {[catch {tclEval info patchlevel} tclVersion] == 0} { + return "<a href=\"http://www.tcl.tk/\">Tcl</a> version $tclVersion" + } + return "" + } + proc getVersion { version } { + set length [string length $version] + return [string range $version 1 [expr {$length - 2}]] + } + set version [getVersion $manifest_version] + set tclVersion [getTclVersion] + set fossilUrl http://www.fossil-scm.org + </th1> + This page was generated in about + <th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s by + <a href="$fossilUrl/">Fossil</a> + version $release_version $tclVersion + <a href="$fossilUrl/index.html/info/$version">$manifest_version</a> + <a href="$fossilUrl/index.html/timeline?c=$manifest_date&y=ci">$manifest_date</a> +</div> +</body></html> ADDED skins/enhanced1/header.txt Index: skins/enhanced1/header.txt ================================================================== --- /dev/null +++ skins/enhanced1/header.txt @@ -0,0 +1,115 @@ +<html> +<head> +<base href="$baseurl/$current_page" /> +<title>$<project_name>: $<title> + + + + +
+ +
$
$</div> + <div class="status"><th1> + if {[info exists login]} { + puts "Logged in as $login" + } else { + puts "Not logged in" + } + </th1></div> +</div> +<div class="mainmenu"> +<th1> +html "<a href='$home$index_page'>Home</a>\n" +if {[anycap jor]} { + html "<a href='$home/timeline'>Timeline</a>\n" +} +if {[hascap oh]} { + html "<a href='$home/tree?ci=tip'>Files</a>\n" +} +if {[hascap o]} { + html "<a href='$home/brlist'>Branches</a>\n" + html "<a href='$home/taglist'>Tags</a>\n" +} +if {[hascap r]} { + html "<a href='$home/reportlist'>Tickets</a>\n" +} +if {[hascap j]} { + html "<a href='$home/wiki'>Wiki</a>\n" +} +if {[hascap s]} { + html "<a href='$home/setup'>Admin</a>\n" +} elseif {[hascap a]} { + html "<a href='$home/setup_ulist'>Users</a>\n" +} +if {[info exists login]} { + html "<a href='$home/login'>Logout</a>\n" +} else { + html "<a href='$home/login'>Login</a>\n" +} +</th1></div> ADDED skins/khaki/css.txt Index: skins/khaki/css.txt ================================================================== --- /dev/null +++ skins/khaki/css.txt @@ -0,0 +1,143 @@ +/* General settings for the entire page */ +body { + margin: 0ex 0ex; + padding: 0px; + background-color: #fef3bc; + font-family: sans-serif; +} + +/* The project logo in the upper left-hand corner of each page */ +div.logo { + display: inline; + text-align: center; + vertical-align: bottom; + font-weight: bold; + font-size: 2.5em; + color: #a09048; + white-space: nowrap; +} + +/* The page title centered at the top of each page */ +div.title { + display: table-cell; + font-size: 2em; + font-weight: bold; + text-align: left; + padding: 0 0 0 5px; + color: #a09048; + vertical-align: bottom; + width: 100%; +} + +/* The login status message in the top right-hand corner */ +div.status { + display: table-cell; + text-align: right; + vertical-align: bottom; + color: #a09048; + padding: 5px 5px 0 0; + font-size: 0.8em; + font-weight: bold; + white-space: nowrap; +} + +/* The header across the top of the page */ +div.header { + display: table; + width: 100%; +} + +/* The main menu bar that appears at the top of the page beneath +** the header */ +div.mainmenu { + padding: 5px 10px 5px 10px; + font-size: 0.9em; + font-weight: bold; + text-align: center; + letter-spacing: 1px; + background-color: #a09048; + color: black; +} + +/* The submenu bar that *sometimes* appears below the main menu */ +div.submenu, div.sectionmenu { + padding: 3px 10px 3px 0px; + font-size: 0.9em; + text-align: center; + background-color: #c0af58; + color: white; +} +div.mainmenu a, div.mainmenu a:visited, div.submenu a, div.submenu a:visited, +div.sectionmenu>a.button:link, div.sectionmenu>a.button:visited { + padding: 3px 10px 3px 10px; + color: white; + text-decoration: none; +} +div.mainmenu a:hover, div.submenu a:hover, div.sectionmenu>a.button:hover { + color: #a09048; + background-color: white; +} + +/* All page content from the bottom of the menu or submenu down to +** the footer */ +div.content { + padding: 1ex 5px; +} +div.content a { color: #706532; } +div.content a:link { color: #706532; } +div.content a:visited { color: #704032; } +div.content a:hover { background-color: white; color: #706532; } + +/* Some pages have section dividers */ +div.section { + margin-bottom: 0px; + margin-top: 1em; + padding: 3px 3px 0 3px; + font-size: 1.2em; + font-weight: bold; + background-color: #a09048; + color: white; + white-space: nowrap; +} + +/* The "Date" that occurs on the left hand side of timelines */ +div.divider { + background: #e1d498; + border: 2px #a09048 solid; + font-size: 1em; font-weight: normal; + padding: .25em; + margin: .2em 0 .2em 0; + float: left; + clear: left; + white-space: nowrap; +} + +/* The footer at the very bottom of the page */ +div.footer { + font-size: 0.8em; + margin-top: 12px; + padding: 5px 10px 5px 10px; + text-align: right; + background-color: #a09048; + color: white; +} + +/* Hyperlink colors */ +div.footer a { color: white; } +div.footer a:link { color: white; } +div.footer a:visited { color: white; } +div.footer a:hover { background-color: white; color: #558195; } + +/* <verbatim> blocks */ +pre.verbatim { + background-color: #f5f5f5; + padding: 0.5em; + white-space: pre-wrap; +} + +/* The label/value pairs on (for example) the ci page */ +table.label-value th { + vertical-align: top; + text-align: right; + padding: 0.2ex 2ex; +} ADDED skins/khaki/footer.txt Index: skins/khaki/footer.txt ================================================================== --- /dev/null +++ skins/khaki/footer.txt @@ -0,0 +1,4 @@ +<div class="footer"> +Fossil version $manifest_version $manifest_date +</div> +</body></html> ADDED skins/khaki/header.txt Index: skins/khaki/header.txt ================================================================== --- /dev/null +++ skins/khaki/header.txt @@ -0,0 +1,52 @@ +<html> +<head> +<base href="$baseurl/$current_page" /> +<title>$<project_name>: $<title> + + + + +
+
$</div> + <div class="status"> + <div class="logo">$<project_name></div><br/> + <th1> + if {[info exists login]} { + puts "Logged in as $login" + } else { + puts "Not logged in" + } + </th1></div> +</div> +<div class="mainmenu"> +<th1> +html "<a href='$home$index_page'>Home</a>\n" +if {[anycap jor]} { + html "<a href='$home/timeline'>Timeline</a>\n" +} +if {[hascap oh]} { + html "<a href='$home/tree?ci=tip'>Files</a>\n" +} +if {[hascap o]} { + html "<a href='$home/brlist'>Branches</a>\n" + html "<a href='$home/taglist'>Tags</a>\n" +} +if {[hascap r]} { + html "<a href='$home/reportlist'>Tickets</a>\n" +} +if {[hascap j]} { + html "<a href='$home/wiki'>Wiki</a>\n" +} +if {[hascap s]} { + html "<a href='$home/setup'>Admin</a>\n" +} elseif {[hascap a]} { + html "<a href='$home/setup_ulist'>Users</a>\n" +} +if {[info exists login]} { + html "<a href='$home/login'>Logout</a>\n" +} else { + html "<a href='$home/login'>Login</a>\n" +} +</th1></div> ADDED skins/plain_gray/css.txt Index: skins/plain_gray/css.txt ================================================================== --- /dev/null +++ skins/plain_gray/css.txt @@ -0,0 +1,139 @@ +/* General settings for the entire page */ +body { + margin: 0ex 1ex; + padding: 0px; + background-color: white; + font-family: sans-serif; +} + +/* The project logo in the upper left-hand corner of each page */ +div.logo { + display: table-row; + text-align: center; + /* vertical-align: bottom;*/ + font-size: 2em; + font-weight: bold; + background-color: #707070; + color: #ffffff; + min-width: 200px; + white-space: nowrap; +} + +/* The page title centered at the top of each page */ +div.title { + display: table-cell; + font-size: 1.5em; + font-weight: bold; + text-align: center; + padding: 0 0 0 10px; + color: #404040; + vertical-align: bottom; + width: 100%; +} + +/* The login status message in the top right-hand corner */ +div.status { + display: table-cell; + text-align: right; + vertical-align: bottom; + color: #404040; + font-size: 0.8em; + font-weight: bold; + min-width: 200px; + white-space: nowrap; +} + +/* The header across the top of the page */ +div.header { + display: table; + width: 100%; +} + +/* The main menu bar that appears at the top of the page beneath +** the header */ +div.mainmenu { + padding: 5px 10px 5px 10px; + font-size: 0.9em; + font-weight: bold; + text-align: center; + letter-spacing: 1px; + background-color: #404040; + color: white; +} + +/* The submenu bar that *sometimes* appears below the main menu */ +div.submenu, div.sectionmenu { + padding: 3px 10px 3px 0px; + font-size: 0.9em; + text-align: center; + background-color: #606060; + color: white; +} +div.mainmenu a, div.mainmenu a:visited, div.submenu a, div.submenu a:visited, +div.sectionmenu>a.button:link, div.sectionmenu>a.button:visited { + padding: 3px 10px 3px 10px; + color: white; + text-decoration: none; +} +div.mainmenu a:hover, div.submenu a:hover, div.sectionmenu>a.button:hover { + color: #404040; + background-color: white; +} + +/* All page content from the bottom of the menu or submenu down to +** the footer */ +div.content { + padding: 0ex 0ex 0ex 0ex; +} +/* Hyperlink colors */ +div.content a { color: #604000; } +div.content a:link { color: #604000;} +div.content a:visited { color: #600000; } + +/* <verbatim> blocks */ +pre.verbatim { + background-color: #ffffff; + padding: 0.5em; + white-space: pre-wrap; +} + +/* Some pages have section dividers */ +div.section { + margin-bottom: 0px; + margin-top: 1em; + padding: 1px 1px 1px 1px; + font-size: 1.2em; + font-weight: bold; + background-color: #404040; + color: white; + white-space: nowrap; +} + +/* The "Date" that occurs on the left hand side of timelines */ +div.divider { + background: #a0a0a0; + border: 2px #505050 solid; + font-size: 1em; font-weight: normal; + padding: .25em; + margin: .2em 0 .2em 0; + float: left; + clear: left; + white-space: nowrap; +} + +/* The footer at the very bottom of the page */ +div.footer { + font-size: 0.8em; + margin-top: 12px; + padding: 5px 10px 5px 10px; + text-align: right; + background-color: #404040; + color: white; +} + +/* The label/value pairs on (for example) the vinfo page */ +table.label-value th { + vertical-align: top; + text-align: right; + padding: 0.2ex 2ex; +} ADDED skins/plain_gray/footer.txt Index: skins/plain_gray/footer.txt ================================================================== --- /dev/null +++ skins/plain_gray/footer.txt @@ -0,0 +1,4 @@ +<div class="footer"> +Fossil version $manifest_version $manifest_date +</div> +</body></html> ADDED skins/plain_gray/header.txt Index: skins/plain_gray/header.txt ================================================================== --- /dev/null +++ skins/plain_gray/header.txt @@ -0,0 +1,50 @@ +<html> +<head> +<base href="$baseurl/$current_page" /> +<title>$<project_name>: $<title> + + + + +
+
$
$</div> + <div class="status"><th1> + if {[info exists login]} { + puts "Logged in as $login" + } else { + puts "Not logged in" + } + </th1></div> +</div> +<div class="mainmenu"> +<th1> +html "<a href='$home$index_page'>Home</a>\n" +if {[anycap jor]} { + html "<a href='$home/timeline'>Timeline</a>\n" +} +if {[hascap oh]} { + html "<a href='$home/tree?ci=tip'>Files</a>\n" +} +if {[hascap o]} { + html "<a href='$home/brlist'>Branches</a>\n" + html "<a href='$home/taglist'>Tags</a>\n" +} +if {[hascap r]} { + html "<a href='$home/reportlist'>Tickets</a>\n" +} +if {[hascap j]} { + html "<a href='$home/wiki'>Wiki</a>\n" +} +if {[hascap s]} { + html "<a href='$home/setup'>Admin</a>\n" +} elseif {[hascap a]} { + html "<a href='$home/setup_ulist'>Users</a>\n" +} +if {[info exists login]} { + html "<a href='$home/login'>Logout</a>\n" +} else { + html "<a href='$home/login'>Login</a>\n" +} +</th1></div> ADDED skins/rounded1/css.txt Index: skins/rounded1/css.txt ================================================================== --- /dev/null +++ skins/rounded1/css.txt @@ -0,0 +1,195 @@ +/* General settings for the entire page */ +html { + min-height: 100%; +} +body { + margin: 0ex 1ex; + padding: 0px; + background-color: white; + color: #333; + font-family: Verdana, sans-serif; + font-size: 0.8em; +} + +/* The project logo in the upper left-hand corner of each page */ +div.logo { + display: table-cell; + text-align: right; + vertical-align: bottom; + font-weight: normal; + white-space: nowrap; +} + +/* Widths */ +div.header, div.mainmenu, div.submenu, div.content, div.footer { + max-width: 900px; + margin: auto; + padding: 3px 20px 3px 20px; + clear: both; +} + +/* The page title at the top of each page */ +div.title { + display: table-cell; + padding-left: 10px; + font-size: 2em; + margin: 10px 0 10px -20px; + vertical-align: bottom; + text-align: left; + width: 80%; + font-family: Verdana, sans-serif; + font-weight: bold; + color: #558195; + text-shadow: 0px 2px 2px #999999; +} + +/* The login status message in the top right-hand corner */ +div.status { + display: table-cell; + text-align: right; + vertical-align: bottom; + color: #333; + margin-right: -20px; + white-space: nowrap; +} + +/* The main menu bar that appears at the top of the page beneath + ** the header */ +div.mainmenu { + text-align: center; + color: white; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + vertical-align: middle; + padding-top: 8px; + padding-bottom: 8px; + background-color: #446979; + box-shadow: 0px 3px 4px #333333; +} + +/* The submenu bar that *sometimes* appears below the main menu */ +div.submenu { + padding-top:10px; + padding-bottom:0; + text-align: right; + color: #000; + background-color: #fff; + height: 1.5em; + vertical-align:middle; + box-shadow: 0px 3px 4px #999; +} +div.mainmenu a, div.mainmenu a:visited { + padding: 3px 10px 3px 10px; + color: white; + text-decoration: none; +} +div.submenu a, div.submenu a:visited, a.button, +div.sectionmenu>a.button:link, div.sectionmenu>a.button:visited { + padding: 2px 8px; + color: #000; + font-family: Arial; + text-decoration: none; + margin:auto; + border-radius: 5px; + background-color: #e0e0e0; + text-shadow: 0px -1px 0px #eee; + border: 1px solid #000; +} + +div.mainmenu a:hover { + color: #000; + background-color: white; +} + +div.submenu a:hover, div.sectionmenu>a.button:hover { + background-color: #c0c0c0; +} + +/* All page content from the bottom of the menu or submenu down to + ** the footer */ +div.content { + background-color: #fff; + box-shadow: 0px 3px 4px #999; + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; + padding-bottom: 1em; + min-height:40%; +} + + +/* Some pages have section dividers */ +div.section { + margin-bottom: 0.5em; + margin-top: 1em; + margin-right: auto; + padding: 1px 1px 1px 1px; + font-size: 1.2em; + font-weight: bold; + text-align: center; + color: white; + border-radius: 5px; + background-color: #446979; + box-shadow: 0px 3px 4px #333333; + white-space: nowrap; +} + +/* The "Date" that occurs on the left hand side of timelines */ +div.divider { + font-size: 1.2em; + font-family: Georgia, serif; + font-weight: bold; + margin-top: 1em; + white-space: nowrap; +} + +/* The footer at the very bottom of the page */ +div.footer { + font-size: 0.9em; + text-align: right; + margin-bottom: 1em; + color: #666; +} + +/* Hyperlink colors in the footer */ +div.footer a { color: white; } +div.footer a:link { color: white; } +div.footer a:visited { color: white; } +div.footer a:hover { background-color: white; color: #558195; } + +/* <verbatim> blocks */ +pre.verbatim, blockquote pre { + font-family: Dejavu Sans Mono, Monaco, Lucida Console, monospace; + background-color: #f3f3f3; + padding: 0.5em; + white-space: pre-wrap; +} + +blockquote pre { + border: 1px #000 dashed; +} + +/* The label/value pairs on (for example) the ci page */ +table.label-value th { + vertical-align: top; + text-align: right; + padding: 0.2ex 2ex; +} + +table.report tr th { + padding: 3px 5px; + text-transform: capitalize; + cursor: pointer; +} + +table.report tr td { + padding: 3px 5px; + cursor: pointer; +} + +textarea { + font-size: 1em; +} + +.fullsize-text { + font-size: 1.25em; +} ADDED skins/rounded1/footer.txt Index: skins/rounded1/footer.txt ================================================================== --- /dev/null +++ skins/rounded1/footer.txt @@ -0,0 +1,4 @@ +<div class="footer"> +Fossil version $manifest_version $manifest_date +</div> +</body></html> ADDED skins/rounded1/header.txt Index: skins/rounded1/header.txt ================================================================== --- /dev/null +++ skins/rounded1/header.txt @@ -0,0 +1,54 @@ +<html> +<head> +<base href="$baseurl/$current_page" /> +<title>$<project_name>: $<title> + + + + +
+ +
$</div> + <div class="status"><th1> + if {[info exists login]} { + puts "Logged in as $login" + } else { + puts "Not logged in" + } + </th1></div> +</div> +<div class="mainmenu"> +<th1> +html "<a href='$home$index_page'>Home</a>\n" +if {[anycap jor]} { + html "<a href='$home/timeline'>Timeline</a>\n" +} +if {[hascap oh]} { + html "<a href='$home/tree?ci=tip'>Files</a>\n" +} +if {[hascap o]} { + html "<a href='$home/brlist'>Branches</a>\n" + html "<a href='$home/taglist'>Tags</a>\n" +} +if {[hascap r]} { + html "<a href='$home/reportlist'>Tickets</a>\n" +} +if {[hascap j]} { + html "<a href='$home/wiki'>Wiki</a>\n" +} +if {[hascap s]} { + html "<a href='$home/setup'>Admin</a>\n" +} elseif {[hascap a]} { + html "<a href='$home/setup_ulist'>Users</a>\n" +} +if {[info exists login]} { + html "<a href='$home/login'>Logout</a>\n" +} else { + html "<a href='$home/login'>Login</a>\n" +} +</th1></div> Index: src/builtin.c ================================================================== --- src/builtin.c +++ src/builtin.c @@ -31,22 +31,30 @@ /* ** Return a pointer to built-in content */ const unsigned char *builtin_file(const char *zFilename, int *piSize){ - int lwr, upr, i; + int lwr, upr, i, c; lwr = 0; upr = sizeof(aBuiltinFiles)/sizeof(aBuiltinFiles[0]) - 1; while( upr>=lwr ){ i = (upr+lwr)/2; - if( strcmp(aBuiltinFiles[i].zName,zFilename)==0 ){ + c = strcmp(aBuiltinFiles[i].zName,zFilename); + if( c<0 ){ + lwr = i+1; + }else if( c>0 ){ + upr = i-1; + }else{ if( piSize ) *piSize = aBuiltinFiles[i].nByte; return aBuiltinFiles[i].pData; } } if( piSize ) *piSize = 0; return 0; +} +const char *builtin_text(const char *zFilename){ + return (char*)builtin_file(zFilename, 0); } /* ** COMMAND: test-builtin-list ** Index: src/diff.tcl ================================================================== --- src/diff.tcl +++ src/diff.tcl @@ -1,5 +1,14 @@ +# The "diff --tk" command outputs prepends a "set fossilcmd {...}" line +# to this file, then runs this file using "tclsh" in order to display the +# graphical diff in a separate window. A typical "set fossilcmd" line +# looks like this: +# +# set fossilcmd {| "./fossil" diff --html -y -i -v} +# +# This header comment is stripped off by the "mkbuiltin.c" program. +# set prog { package require Tk array set CFG { TITLE {Fossil Diff} Index: src/main.mk ================================================================== --- src/main.mk +++ src/main.mk @@ -131,10 +131,28 @@ $(SRCDIR)/xfer.c \ $(SRCDIR)/xfersetup.c \ $(SRCDIR)/zip.c EXTRA_FILES = \ + $(SRCDIR)/../skins/black_and_white/css.txt \ + $(SRCDIR)/../skins/black_and_white/footer.txt \ + $(SRCDIR)/../skins/black_and_white/header.txt \ + $(SRCDIR)/../skins/default/css.txt \ + $(SRCDIR)/../skins/default/footer.txt \ + $(SRCDIR)/../skins/default/header.txt \ + $(SRCDIR)/../skins/enhanced1/css.txt \ + $(SRCDIR)/../skins/enhanced1/footer.txt \ + $(SRCDIR)/../skins/enhanced1/header.txt \ + $(SRCDIR)/../skins/khaki/css.txt \ + $(SRCDIR)/../skins/khaki/footer.txt \ + $(SRCDIR)/../skins/khaki/header.txt \ + $(SRCDIR)/../skins/plain_gray/css.txt \ + $(SRCDIR)/../skins/plain_gray/footer.txt \ + $(SRCDIR)/../skins/plain_gray/header.txt \ + $(SRCDIR)/../skins/rounded1/css.txt \ + $(SRCDIR)/../skins/rounded1/footer.txt \ + $(SRCDIR)/../skins/rounded1/header.txt \ $(SRCDIR)/diff.tcl TRANS_SRC = \ $(OBJDIR)/add_.c \ $(OBJDIR)/allrepo_.c \ Index: src/makemake.tcl ================================================================== --- src/makemake.tcl +++ src/makemake.tcl @@ -142,10 +142,11 @@ # Additional resource files that get built into the executable. # set extra_files { diff.tcl + ../skins/*/*.txt } # Options used to compile the included SQLite library. # set SQLITE_OPTIONS { @@ -203,10 +204,19 @@ } # STOP HERE. # Unless the build procedures changes, you should not have to edit anything # below this line. + +# Expand any wildcards in "extra_files" +set new_extra_files {} +foreach file $extra_files { + foreach x [glob -nocomplain $file] { + lappend new_extra_files $x + } +} +set extra_files $new_extra_files ############################################################################## ############################################################################## ############################################################################## # Start by generating the "main.mk" makefile used for all unix systems. Index: src/mkbuiltin.c ================================================================== --- src/mkbuiltin.c +++ src/mkbuiltin.c @@ -29,11 +29,11 @@ #include <string.h> /* ** Read the entire content of the file named zFilename into memory obtained -** from malloc() and retur a pointer to that memory. Write the size of the +** from malloc() and return a pointer to that memory. Write the size of the ** file into *pnByte. */ static unsigned char *read_file(const char *zFilename, int *pnByte){ FILE *in; unsigned char *z; @@ -62,10 +62,11 @@ */ typedef struct Resource Resource; struct Resource { const char *zName; int nByte; + int idx; }; /* ** Compare two Resource objects for sorting purposes. They sort ** in zName order so that Fossil can search for resources using @@ -82,10 +83,11 @@ int j, n; Resource *aRes; int nRes = argc-1; unsigned char *pData; int nErr = 0; + int nSkip; aRes = malloc( nRes*sizeof(aRes[0]) ); if( aRes==0 ){ fprintf(stderr, "malloc failed\n"); return 1; @@ -103,15 +105,24 @@ if( pData==0 ){ fprintf(stderr, "Cannot open file [%s]\n", aRes[i].zName); nErr++; continue; } - aRes[i].nByte = sz; + + /* Skip initial lines beginning with # */ + nSkip = 0; + while( pData[nSkip]=='#' ){ + while( pData[nSkip]!=0 && pData[nSkip]!='\n' ){ nSkip++; } + if( pData[nSkip]=='\n' ) nSkip++; + } + + aRes[i].nByte = sz - nSkip; + aRes[i].idx = i; printf("/* Content of file %s */\n", aRes[i].zName); printf("static const unsigned char bidata%d[%d] = {\n ", - i, sz+1); - for(j=n=0; j<=sz; j++){ + i, sz+1-nSkip); + for(j=nSkip, n=0; j<=sz; j++){ printf("%3d", pData[j]); if( j==sz ){ printf(" };\n"); }else if( n==14 ){ printf(",\n "); @@ -129,17 +140,26 @@ printf(" const unsigned char *pData;\n"); printf(" int nByte;\n"); printf("};\n"); printf("static const BuiltinFileTable aBuiltinFiles[] = {\n"); for(i=0; i<nRes; i++){ - const char *zTail; const char *z = aRes[i].zName; + const char *zTail; + int nSlash = 0; zTail = z; while( z && z[0] ){ - if( z[0]=='/' || z[0]=='\\' ) zTail = &z[1]; + if( z[0]=='/' || z[0]=='\\' ){ + nSlash++; + if( nSlash<=2 || z[-1]=='.' ) zTail = &z[1]; + } z++; } - printf(" { \"%s\", bidata%d, %d },\n", zTail, i, aRes[i].nByte); + aRes[i].zName = zTail; + } + qsort(aRes, nRes, sizeof(aRes[0]), compareResource); + for(i=0; i<nRes; i++){ + printf(" { \"%s\", bidata%d, %d },\n", + aRes[i].zName, aRes[i].idx, aRes[i].nByte); } printf("};\n"); return nErr; } Index: src/setup.c ================================================================== --- src/setup.c +++ src/setup.c @@ -1525,24 +1525,26 @@ login_needed(); } db_begin_transaction(); if( P("clear")!=0 ){ db_multi_exec("DELETE FROM config WHERE name='css'"); - cgi_replace_parameter("css", zDefaultCSS); + cgi_replace_parameter("css", builtin_text("skins/default.css")); db_end_transaction(0); cgi_redirect("setup_editcss"); } if( P("submit")!=0 ){ - textarea_attribute(0, 0, 0, "css", "css", zDefaultCSS, 0); + textarea_attribute(0, 0, 0, "css", "css", + builtin_text("skins/default.css"), 0); db_end_transaction(0); cgi_redirect("setup_editcss"); } style_header("Edit CSS"); @ <form action="%s(g.zTop)/setup_editcss" method="post"><div> login_insert_csrf_secret(); @ Edit the CSS below:<br /> - textarea_attribute("", 35, 80, "css", "css", zDefaultCSS, 0); + textarea_attribute("", 35, 80, "css", "css", + builtin_text("skins/default.css"), 0); @ <br /> @ <input type="submit" name="submit" value="Apply Changes" /> @ <input type="submit" name="clear" value="Revert To Default" /> @ </div></form> @ <p><span class="note">Note:</span> Press your browser Reload button after @@ -1568,15 +1570,17 @@ login_needed(); } db_begin_transaction(); if( P("clear")!=0 ){ db_multi_exec("DELETE FROM config WHERE name='header'"); - cgi_replace_parameter("header", zDefaultHeader); + cgi_replace_parameter("header", builtin_text("skins/default.header")); }else if( P("submit")!=0 ){ - textarea_attribute(0, 0, 0, "header", "header", zDefaultHeader, 0); + textarea_attribute(0, 0, 0, "header", "header", + builtin_text("skins/default.header"), 0); }else if( P("fixbase")!=0 ){ - const char *z = db_get("header", (char*)zDefaultHeader); + const char *z = db_get("header", + (char*)builtin_text("skins/default.header")); char *zHead = strstr(z, "<head>"); if( strstr(z, "<base href=")==0 && zHead!=0 ){ char *zNew; char *zTail = &zHead[6]; while( fossil_isspace(zTail[0]) ) zTail++; @@ -1601,11 +1605,12 @@ login_insert_csrf_secret(); @ <p>Edit HTML text with embedded TH1 (a TCL dialect) that will be used to @ generate the beginning of every page through start of the main @ menu.</p> - textarea_attribute("", 35, 80, "header", "header", zDefaultHeader, 0); + textarea_attribute("", 35, 80, "header", "header", + builtin_text("skins/default.header"), 0); @ <br /> @ <input type="submit" name="submit" value="Apply Changes" /> @ <input type="submit" name="clear" value="Revert To Default" /> @ </div></form> @ <hr /> @@ -1612,11 +1617,11 @@ @ The default header is shown below for reference. Other examples @ of headers can be seen on the <a href="setup_skin">skins page</a>. @ See also the <a href="setup_editcss">CSS</a> and @ <a href="setup_footer">footer</a> editing screens. @ <blockquote><pre> - @ %h(zDefaultHeader) + @ %h(builtin_text("skins/default.header")) @ </pre></blockquote> style_footer(); db_end_transaction(0); } @@ -1629,19 +1634,20 @@ login_needed(); } db_begin_transaction(); if( P("clear")!=0 ){ db_multi_exec("DELETE FROM config WHERE name='footer'"); - cgi_replace_parameter("footer", zDefaultFooter); + cgi_replace_parameter("footer", builtin_text("skins/default.footer")); } style_header("Edit Page Footer"); @ <form action="%s(g.zTop)/setup_footer" method="post"><div> login_insert_csrf_secret(); @ <p>Edit HTML text with embedded TH1 (a TCL dialect) that will be used to @ generate the end of every page.</p> - textarea_attribute("", 20, 80, "footer", "footer", zDefaultFooter, 0); + textarea_attribute("", 20, 80, "footer", "footer", + builtin_text("skins/default.footer"), 0); @ <br /> @ <input type="submit" name="submit" value="Apply Changes" /> @ <input type="submit" name="clear" value="Revert To Default" /> @ </div></form> @ <hr /> @@ -1648,11 +1654,11 @@ @ The default footer is shown below for reference. Other examples @ of footers can be seen on the <a href="setup_skin">skins page</a>. @ See also the <a href="setup_editcss">CSS</a> and @ <a href="setup_header">header</a> editing screens. @ <blockquote><pre> - @ %h(zDefaultFooter) + @ %h(builtin_text("skins/default.footer")) @ </pre></blockquote> style_footer(); db_end_transaction(0); } Index: src/skins.c ================================================================== --- src/skins.c +++ src/skins.c @@ -19,1255 +19,36 @@ */ #include "config.h" #include <assert.h> #include "skins.h" -/* @-comment: ## */ -/* -** A black-and-white theme with the project title in a bar across the top -** and no logo image. -*/ -static const char zBuiltinSkin1[] = -@ REPLACE INTO config(name,mtime,value) -@ VALUES('css',now(),'/* General settings for the entire page */ -@ body { -@ margin: 0ex 1ex; -@ padding: 0px; -@ background-color: white; -@ font-family: sans-serif; -@ } -@ -@ /* The project logo in the upper left-hand corner of each page */ -@ div.logo { -@ display: table-row; -@ text-align: center; -@ /* vertical-align: bottom;*/ -@ font-size: 2em; -@ font-weight: bold; -@ background-color: #707070; -@ color: #ffffff; -@ min-width: 200px; -@ white-space: nowrap; -@ } -@ -@ /* The page title centered at the top of each page */ -@ div.title { -@ display: table-cell; -@ font-size: 1.5em; -@ font-weight: bold; -@ text-align: center; -@ padding: 0 0 0 10px; -@ color: #404040; -@ vertical-align: bottom; -@ width: 100%; -@ } -@ -@ /* The login status message in the top right-hand corner */ -@ div.status { -@ display: table-cell; -@ text-align: right; -@ vertical-align: bottom; -@ color: #404040; -@ font-size: 0.8em; -@ font-weight: bold; -@ min-width: 200px; -@ white-space: nowrap; -@ } -@ -@ /* The header across the top of the page */ -@ div.header { -@ display: table; -@ width: 100%; -@ } -@ -@ /* The main menu bar that appears at the top of the page beneath -@ ** the header */ -@ div.mainmenu { -@ padding: 5px 10px 5px 10px; -@ font-size: 0.9em; -@ font-weight: bold; -@ text-align: center; -@ letter-spacing: 1px; -@ background-color: #404040; -@ color: white; -@ } -@ -@ /* The submenu bar that *sometimes* appears below the main menu */ -@ div.submenu, div.sectionmenu { -@ padding: 3px 10px 3px 0px; -@ font-size: 0.9em; -@ text-align: center; -@ background-color: #606060; -@ color: white; -@ } -@ div.mainmenu a, div.mainmenu a:visited, div.submenu a, div.submenu a:visited, -@ div.sectionmenu>a.button:link, div.sectionmenu>a.button:visited { -@ padding: 3px 10px 3px 10px; -@ color: white; -@ text-decoration: none; -@ } -@ div.mainmenu a:hover, div.submenu a:hover, div.sectionmenu>a.button:hover { -@ color: #404040; -@ background-color: white; -@ } -@ -@ /* All page content from the bottom of the menu or submenu down to -@ ** the footer */ -@ div.content { -@ padding: 0ex 0ex 0ex 0ex; -@ } -@ /* Hyperlink colors */ -@ div.content a { color: #604000; } -@ div.content a:link { color: #604000;} -@ div.content a:visited { color: #600000; } -@ -@ /* <verbatim> blocks */ -@ pre.verbatim { -@ background-color: #ffffff; -@ padding: 0.5em; -@ white-space: pre-wrap; -@ } -@ -@ /* Some pages have section dividers */ -@ div.section { -@ margin-bottom: 0px; -@ margin-top: 1em; -@ padding: 1px 1px 1px 1px; -@ font-size: 1.2em; -@ font-weight: bold; -@ background-color: #404040; -@ color: white; -@ white-space: nowrap; -@ } -@ -@ /* The "Date" that occurs on the left hand side of timelines */ -@ div.divider { -@ background: #a0a0a0; -@ border: 2px #505050 solid; -@ font-size: 1em; font-weight: normal; -@ padding: .25em; -@ margin: .2em 0 .2em 0; -@ float: left; -@ clear: left; -@ white-space: nowrap; -@ } -@ -@ /* The footer at the very bottom of the page */ -@ div.footer { -@ font-size: 0.8em; -@ margin-top: 12px; -@ padding: 5px 10px 5px 10px; -@ text-align: right; -@ background-color: #404040; -@ color: white; -@ } -@ -@ /* The label/value pairs on (for example) the vinfo page */ -@ table.label-value th { -@ vertical-align: top; -@ text-align: right; -@ padding: 0.2ex 2ex; -@ }'); -@ REPLACE INTO config(name,mtime,value) VALUES('header',now(),'<html> -@ <head> -@ <base href="$baseurl/$current_page" /> -@ <title>$<project_name>: $<title> -@ -@ -@ -@ -@
-@
$
$</div> -@ <div class="status"><th1> -@ if {[info exists login]} { -@ puts "Logged in as $login" -@ } else { -@ puts "Not logged in" -@ } -@ </th1></div> -@ </div> -@ <div class="mainmenu"> -@ <th1> -@ html "<a href=''$home$index_page''>Home</a>\n" -@ if {[anycap jor]} { -@ html "<a href=''$home/timeline''>Timeline</a>\n" -@ } -@ if {[hascap oh]} { -@ html "<a href=''$home/tree?ci=tip''>Files</a>\n" -@ } -@ if {[hascap o]} { -@ html "<a href=''$home/brlist''>Branches</a>\n" -@ html "<a href=''$home/taglist''>Tags</a>\n" -@ } -@ if {[hascap r]} { -@ html "<a href=''$home/reportlist''>Tickets</a>\n" -@ } -@ if {[hascap j]} { -@ html "<a href=''$home/wiki''>Wiki</a>\n" -@ } -@ if {[hascap s]} { -@ html "<a href=''$home/setup''>Admin</a>\n" -@ } elseif {[hascap a]} { -@ html "<a href=''$home/setup_ulist''>Users</a>\n" -@ } -@ if {[info exists login]} { -@ html "<a href=''$home/login''>Logout</a>\n" -@ } else { -@ html "<a href=''$home/login''>Login</a>\n" -@ } -@ </th1></div> -@ '); -@ REPLACE INTO config(name,mtime,value) -@ VALUES('footer',now(),'<div class="footer"> -@ Fossil version $manifest_version $manifest_date -@ </div> -@ </body></html> -@ '); -; - -/* -** A tan theme with the project title above the user identification -** and no logo image. -*/ -static const char zBuiltinSkin2[] = -@ REPLACE INTO config(name,mtime,value) -@ VALUES('css',now(),'/* General settings for the entire page */ -@ body { -@ margin: 0ex 0ex; -@ padding: 0px; -@ background-color: #fef3bc; -@ font-family: sans-serif; -@ } -@ -@ /* The project logo in the upper left-hand corner of each page */ -@ div.logo { -@ display: inline; -@ text-align: center; -@ vertical-align: bottom; -@ font-weight: bold; -@ font-size: 2.5em; -@ color: #a09048; -@ white-space: nowrap; -@ } -@ -@ /* The page title centered at the top of each page */ -@ div.title { -@ display: table-cell; -@ font-size: 2em; -@ font-weight: bold; -@ text-align: left; -@ padding: 0 0 0 5px; -@ color: #a09048; -@ vertical-align: bottom; -@ width: 100%; -@ } -@ -@ /* The login status message in the top right-hand corner */ -@ div.status { -@ display: table-cell; -@ text-align: right; -@ vertical-align: bottom; -@ color: #a09048; -@ padding: 5px 5px 0 0; -@ font-size: 0.8em; -@ font-weight: bold; -@ white-space: nowrap; -@ } -@ -@ /* The header across the top of the page */ -@ div.header { -@ display: table; -@ width: 100%; -@ } -@ -@ /* The main menu bar that appears at the top of the page beneath -@ ** the header */ -@ div.mainmenu { -@ padding: 5px 10px 5px 10px; -@ font-size: 0.9em; -@ font-weight: bold; -@ text-align: center; -@ letter-spacing: 1px; -@ background-color: #a09048; -@ color: black; -@ } -@ -@ /* The submenu bar that *sometimes* appears below the main menu */ -@ div.submenu, div.sectionmenu { -@ padding: 3px 10px 3px 0px; -@ font-size: 0.9em; -@ text-align: center; -@ background-color: #c0af58; -@ color: white; -@ } -@ div.mainmenu a, div.mainmenu a:visited, div.submenu a, div.submenu a:visited, -@ div.sectionmenu>a.button:link, div.sectionmenu>a.button:visited { -@ padding: 3px 10px 3px 10px; -@ color: white; -@ text-decoration: none; -@ } -@ div.mainmenu a:hover, div.submenu a:hover, div.sectionmenu>a.button:hover { -@ color: #a09048; -@ background-color: white; -@ } -@ -@ /* All page content from the bottom of the menu or submenu down to -@ ** the footer */ -@ div.content { -@ padding: 1ex 5px; -@ } -@ div.content a { color: #706532; } -@ div.content a:link { color: #706532; } -@ div.content a:visited { color: #704032; } -@ div.content a:hover { background-color: white; color: #706532; } -@ -@ /* Some pages have section dividers */ -@ div.section { -@ margin-bottom: 0px; -@ margin-top: 1em; -@ padding: 3px 3px 0 3px; -@ font-size: 1.2em; -@ font-weight: bold; -@ background-color: #a09048; -@ color: white; -@ white-space: nowrap; -@ } -@ -@ /* The "Date" that occurs on the left hand side of timelines */ -@ div.divider { -@ background: #e1d498; -@ border: 2px #a09048 solid; -@ font-size: 1em; font-weight: normal; -@ padding: .25em; -@ margin: .2em 0 .2em 0; -@ float: left; -@ clear: left; -@ white-space: nowrap; -@ } -@ -@ /* The footer at the very bottom of the page */ -@ div.footer { -@ font-size: 0.8em; -@ margin-top: 12px; -@ padding: 5px 10px 5px 10px; -@ text-align: right; -@ background-color: #a09048; -@ color: white; -@ } -@ -@ /* Hyperlink colors */ -@ div.footer a { color: white; } -@ div.footer a:link { color: white; } -@ div.footer a:visited { color: white; } -@ div.footer a:hover { background-color: white; color: #558195; } -@ -@ /* <verbatim> blocks */ -@ pre.verbatim { -@ background-color: #f5f5f5; -@ padding: 0.5em; -@ white-space: pre-wrap; -@ } -@ -@ /* The label/value pairs on (for example) the ci page */ -@ table.label-value th { -@ vertical-align: top; -@ text-align: right; -@ padding: 0.2ex 2ex; -@ }'); -@ REPLACE INTO config(name,mtime,value) VALUES('header',now(),'<html> -@ <head> -@ <base href="$baseurl/$current_page" /> -@ <title>$<project_name>: $<title> -@ -@ -@ -@ -@
-@
$</div> -@ <div class="status"> -@ <div class="logo">$<project_name></div><br/> -@ <th1> -@ if {[info exists login]} { -@ puts "Logged in as $login" -@ } else { -@ puts "Not logged in" -@ } -@ </th1></div> -@ </div> -@ <div class="mainmenu"> -@ <th1> -@ html "<a href=''$home$index_page''>Home</a>\n" -@ if {[anycap jor]} { -@ html "<a href=''$home/timeline''>Timeline</a>\n" -@ } -@ if {[hascap oh]} { -@ html "<a href=''$home/tree?ci=tip''>Files</a>\n" -@ } -@ if {[hascap o]} { -@ html "<a href=''$home/brlist''>Branches</a>\n" -@ html "<a href=''$home/taglist''>Tags</a>\n" -@ } -@ if {[hascap r]} { -@ html "<a href=''$home/reportlist''>Tickets</a>\n" -@ } -@ if {[hascap j]} { -@ html "<a href=''$home/wiki''>Wiki</a>\n" -@ } -@ if {[hascap s]} { -@ html "<a href=''$home/setup''>Admin</a>\n" -@ } elseif {[hascap a]} { -@ html "<a href=''$home/setup_ulist''>Users</a>\n" -@ } -@ if {[info exists login]} { -@ html "<a href=''$home/login''>Logout</a>\n" -@ } else { -@ html "<a href=''$home/login''>Login</a>\n" -@ } -@ </th1></div> -@ '); -@ REPLACE INTO config(name,mtime,value) -@ VALUES('footer',now(),'<div class="footer"> -@ Fossil version $manifest_version $manifest_date -@ </div> -@ </body></html> -@ '); -; - -/* -** Black letters on a white or cream background with the main menu -** stuck on the left-hand side. -*/ -static const char zBuiltinSkin3[] = -@ REPLACE INTO config(name,mtime,value) -@ VALUES('css',now(),'/* General settings for the entire page */ -@ body { -@ margin:0px 0px 0px 0px; -@ padding:0px; -@ font-family:verdana, arial, helvetica, "sans serif"; -@ color:#333; -@ background-color:white; -@ } -@ -@ /* consistent colours */ -@ h2 { -@ color: #333; -@ } -@ h3 { -@ color: #333; -@ } -@ -@ /* The project logo in the upper left-hand corner of each page */ -@ div.logo { -@ display: table-cell; -@ text-align: left; -@ vertical-align: bottom; -@ font-weight: bold; -@ color: #333; -@ white-space: nowrap; -@ } -@ -@ /* The page title centered at the top of each page */ -@ div.title { -@ display: table-cell; -@ font-size: 2em; -@ font-weight: bold; -@ text-align: center; -@ color: #333; -@ vertical-align: bottom; -@ width: 100%; -@ } -@ -@ /* The login status message in the top right-hand corner */ -@ div.status { -@ display: table-cell; -@ padding-right: 10px; -@ text-align: right; -@ vertical-align: bottom; -@ padding-bottom: 5px; -@ color: #333; -@ font-size: 0.8em; -@ font-weight: bold; -@ white-space: nowrap; -@ } -@ -@ /* The header across the top of the page */ -@ div.header { -@ margin:10px 0px 10px 0px; -@ padding:1px 0px 0px 20px; -@ border-style:solid; -@ border-color:black; -@ border-width:1px 0px; -@ background-color:#eee; -@ } -@ -@ /* The main menu bar that appears at the top left of the page beneath -@ ** the header. Width must be co-ordinated with the container below */ -@ div.mainmenu { -@ float: left; -@ margin-left: 10px; -@ margin-right: 10px; -@ font-size: 0.9em; -@ font-weight: bold; -@ padding:5px; -@ background-color:#eee; -@ border:1px solid #999; -@ width:8em; -@ } -@ -@ /* Main menu is now a list */ -@ div.mainmenu ul { -@ padding: 0; -@ list-style:none; -@ } -@ div.mainmenu a, div.mainmenu a:visited{ -@ padding: 1px 10px 1px 10px; -@ color: #333; -@ text-decoration: none; -@ } -@ div.mainmenu a:hover { -@ color: #eee; -@ background-color: #333; -@ } -@ -@ /* Container for the sub-menu and content so they don''t spread -@ ** out underneath the main menu */ -@ #container { -@ padding-left: 9em; -@ } -@ -@ /* The submenu bar that *sometimes* appears below the main menu */ -@ div.submenu, div.sectionmenu { -@ padding: 3px 10px 3px 10px; -@ font-size: 0.9em; -@ text-align: center; -@ border:1px solid #999; -@ border-width:1px 0px; -@ background-color: #eee; -@ color: #333; -@ } -@ div.submenu a, div.submenu a:visited, div.sectionmenu>a.button:link, -@ div.sectionmenu>a.button:visited { -@ padding: 3px 10px 3px 10px; -@ color: #333; -@ text-decoration: none; -@ } -@ div.submenu a:hover, div.sectionmenu>a.button:hover { -@ color: #eee; -@ background-color: #333; -@ } -@ -@ /* All page content from the bottom of the menu or submenu down to -@ ** the footer */ -@ div.content { -@ padding: 2ex 1ex 0ex 2ex; -@ } -@ -@ /* Some pages have section dividers */ -@ div.section { -@ margin-bottom: 0px; -@ margin-top: 1em; -@ padding: 1px 1px 1px 1px; -@ font-size: 1.2em; -@ font-weight: bold; -@ border-style:solid; -@ border-color:#999; -@ border-width:1px 0px; -@ background-color: #eee; -@ color: #333; -@ white-space: nowrap; -@ } -@ -@ /* The "Date" that occurs on the left hand side of timelines */ -@ div.divider { -@ background: #eee; -@ border: 2px #999 solid; -@ font-size: 1em; font-weight: normal; -@ padding: .25em; -@ margin: .2em 0 .2em 0; -@ float: left; -@ clear: left; -@ color: #333; -@ white-space: nowrap; -@ } -@ -@ /* The footer at the very bottom of the page */ -@ div.footer { -@ font-size: 0.8em; -@ margin-top: 12px; -@ padding: 5px 10px 5px 10px; -@ text-align: right; -@ background-color: #eee; -@ color: #555; -@ } -@ -@ /* <verbatim> blocks */ -@ pre.verbatim { -@ background-color: #f5f5f5; -@ padding: 0.5em; -@ white-space: pre-wrap; -@ } -@ -@ /* The label/value pairs on (for example) the ci page */ -@ table.label-value th { -@ vertical-align: top; -@ text-align: right; -@ padding: 0.2ex 2ex; -@ }'); -@ REPLACE INTO config(name,mtime,value) VALUES('header',now(),'<html> -@ <head> -@ <base href="$baseurl/$current_page" /> -@ <title>$<project_name>: $<title> -@ -@ -@ -@ -@
-@ -@
$</div> -@ <div class="status"><th1> -@ if {[info exists login]} { -@ puts "Logged in as $login" -@ } else { -@ puts "Not logged in" -@ } -@ </th1></div> -@ </div> -@ <div class="mainmenu"> -@ <th1> -@ html "<a href=''$home$index_page''>Home</a>\n" -@ if {[anycap jor]} { -@ html "<a href=''$home/timeline''>Timeline</a>\n" -@ } -@ if {[hascap oh]} { -@ html "<a href=''$home/tree?ci=tip''>Files</a>\n" -@ } -@ if {[hascap o]} { -@ html "<a href=''$home/brlist''>Branches</a>\n" -@ html "<a href=''$home/taglist''>Tags</a>\n" -@ } -@ if {[hascap r]} { -@ html "<a href=''$home/reportlist''>Tickets</a>\n" -@ } -@ if {[hascap j]} { -@ html "<a href=''$home/wiki''>Wiki</a>\n" -@ } -@ if {[hascap s]} { -@ html "<a href=''$home/setup''>Admin</a>\n" -@ } elseif {[hascap a]} { -@ html "<a href=''$home/setup_ulist''>Users</a>\n" -@ } -@ if {[info exists login]} { -@ html "<a href=''$home/login''>Logout</a>\n" -@ } else { -@ html "<a href=''$home/login''>Login</a>\n" -@ } -@ </th1></ul></div> -@ <div id="container"> -@ '); -@ REPLACE INTO config(name,mtime,value) VALUES('footer',now(),'</div> -@ <div class="footer"> -@ Fossil version $manifest_version $manifest_date -@ </div> -@ </body></html> -@ '); -; - - -/* -** Shadow boxes and rounded corners. -*/ -static const char zBuiltinSkin4[] = -@ REPLACE INTO config(name,mtime,value) -@ VALUES('css',now(),'/* General settings for the entire page */ -@ html { -@ min-height: 100%; -@ } -@ body { -@ margin: 0ex 1ex; -@ padding: 0px; -@ background-color: white; -@ color: #333; -@ font-family: Verdana, sans-serif; -@ font-size: 0.8em; -@ } -@ -@ /* The project logo in the upper left-hand corner of each page */ -@ div.logo { -@ display: table-cell; -@ text-align: right; -@ vertical-align: bottom; -@ font-weight: normal; -@ white-space: nowrap; -@ } -@ -@ /* Widths */ -@ div.header, div.mainmenu, div.submenu, div.content, div.footer { -@ max-width: 900px; -@ margin: auto; -@ padding: 3px 20px 3px 20px; -@ clear: both; -@ } -@ -@ /* The page title at the top of each page */ -@ div.title { -@ display: table-cell; -@ padding-left: 10px; -@ font-size: 2em; -@ margin: 10px 0 10px -20px; -@ vertical-align: bottom; -@ text-align: left; -@ width: 80%; -@ font-family: Verdana, sans-serif; -@ font-weight: bold; -@ color: #558195; -@ text-shadow: 0px 2px 2px #999999; -@ } -@ -@ /* The login status message in the top right-hand corner */ -@ div.status { -@ display: table-cell; -@ text-align: right; -@ vertical-align: bottom; -@ color: #333; -@ margin-right: -20px; -@ white-space: nowrap; -@ } -@ -@ /* The main menu bar that appears at the top of the page beneath -@ ** the header */ -@ div.mainmenu { -@ text-align: center; -@ color: white; -@ border-top-left-radius: 5px; -@ border-top-right-radius: 5px; -@ vertical-align: middle; -@ padding-top: 8px; -@ padding-bottom: 8px; -@ background-color: #446979; -@ box-shadow: 0px 3px 4px #333333; -@ } -@ -@ /* The submenu bar that *sometimes* appears below the main menu */ -@ div.submenu { -@ padding-top:10px; -@ padding-bottom:0; -@ text-align: right; -@ color: #000; -@ background-color: #fff; -@ height: 1.5em; -@ vertical-align:middle; -@ box-shadow: 0px 3px 4px #999; -@ } -@ div.mainmenu a, div.mainmenu a:visited { -@ padding: 3px 10px 3px 10px; -@ color: white; -@ text-decoration: none; -@ } -@ div.submenu a, div.submenu a:visited, a.button, -@ div.sectionmenu>a.button:link, div.sectionmenu>a.button:visited { -@ padding: 2px 8px; -@ color: #000; -@ font-family: Arial; -@ text-decoration: none; -@ margin:auto; -@ border-radius: 5px; -@ background-color: #e0e0e0; -@ text-shadow: 0px -1px 0px #eee; -@ border: 1px solid #000; -@ } -@ -@ div.mainmenu a:hover { -@ color: #000; -@ background-color: white; -@ } -@ -@ div.submenu a:hover, div.sectionmenu>a.button:hover { -@ background-color: #c0c0c0; -@ } -@ -@ /* All page content from the bottom of the menu or submenu down to -@ ** the footer */ -@ div.content { -@ background-color: #fff; -@ box-shadow: 0px 3px 4px #999; -@ border-bottom-right-radius: 5px; -@ border-bottom-left-radius: 5px; -@ padding-bottom: 1em; -@ min-height:40%; -@ } -@ -@ -@ /* Some pages have section dividers */ -@ div.section { -@ margin-bottom: 0.5em; -@ margin-top: 1em; -@ margin-right: auto; -@ padding: 1px 1px 1px 1px; -@ font-size: 1.2em; -@ font-weight: bold; -@ text-align: center; -@ color: white; -@ border-radius: 5px; -@ background-color: #446979; -@ box-shadow: 0px 3px 4px #333333; -@ white-space: nowrap; -@ } -@ -@ /* The "Date" that occurs on the left hand side of timelines */ -@ div.divider { -@ font-size: 1.2em; -@ font-family: Georgia, serif; -@ font-weight: bold; -@ margin-top: 1em; -@ white-space: nowrap; -@ } -@ -@ /* The footer at the very bottom of the page */ -@ div.footer { -@ font-size: 0.9em; -@ text-align: right; -@ margin-bottom: 1em; -@ color: #666; -@ } -@ -@ /* Hyperlink colors in the footer */ -@ div.footer a { color: white; } -@ div.footer a:link { color: white; } -@ div.footer a:visited { color: white; } -@ div.footer a:hover { background-color: white; color: #558195; } -@ -@ /* <verbatim> blocks */ -@ pre.verbatim, blockquote pre { -@ font-family: Dejavu Sans Mono, Monaco, Lucida Console, monospace; -@ background-color: #f3f3f3; -@ padding: 0.5em; -@ white-space: pre-wrap; -@ } -@ -@ blockquote pre { -@ border: 1px #000 dashed; -@ } -@ -@ /* The label/value pairs on (for example) the ci page */ -@ table.label-value th { -@ vertical-align: top; -@ text-align: right; -@ padding: 0.2ex 2ex; -@ } -@ -@ table.report tr th { -@ padding: 3px 5px; -@ text-transform: capitalize; -@ cursor: pointer; -@ } -@ -@ table.report tr td { -@ padding: 3px 5px; -@ cursor: pointer; -@ } -@ -@ textarea { -@ font-size: 1em; -@ } -@ -@ .fullsize-text { -@ font-size: 1.25em; -@ }'); -@ REPLACE INTO config(name,mtime,value) VALUES('header',now(),'<html> -@ <head> -@ <base href="$baseurl/$current_page" /> -@ <title>$<project_name>: $<title> -@ -@ -@ -@ -@
-@ -@
$</div> -@ <div class="status"><th1> -@ if {[info exists login]} { -@ puts "Logged in as $login" -@ } else { -@ puts "Not logged in" -@ } -@ </th1></div> -@ </div> -@ <div class="mainmenu"> -@ <th1> -@ html "<a href=''$home$index_page''>Home</a>\n" -@ if {[anycap jor]} { -@ html "<a href=''$home/timeline''>Timeline</a>\n" -@ } -@ if {[hascap oh]} { -@ html "<a href=''$home/tree?ci=tip''>Files</a>\n" -@ } -@ if {[hascap o]} { -@ html "<a href=''$home/brlist''>Branches</a>\n" -@ html "<a href=''$home/taglist''>Tags</a>\n" -@ } -@ if {[hascap r]} { -@ html "<a href=''$home/reportlist''>Tickets</a>\n" -@ } -@ if {[hascap j]} { -@ html "<a href=''$home/wiki''>Wiki</a>\n" -@ } -@ if {[hascap s]} { -@ html "<a href=''$home/setup''>Admin</a>\n" -@ } elseif {[hascap a]} { -@ html "<a href=''$home/setup_ulist''>Users</a>\n" -@ } -@ if {[info exists login]} { -@ html "<a href=''$home/login''>Logout</a>\n" -@ } else { -@ html "<a href=''$home/login''>Login</a>\n" -@ } -@ </th1></div> -@ <div id="container"> -@ '); -@ REPLACE INTO config(name,mtime,value) VALUES('footer',now(),'</div> -@ <div class="footer"> -@ Fossil version $manifest_version $manifest_date -@ </div> -@ </body></html> -@ '); -; - - -/* -** This skin is intended to be almost identical to the default one, with the -** following changes to the header and footer: -** -** 1. The logo image in the header has been modified to be a hyperlink to the -** root of the web site containing the repository using the same scheme -** (i.e. HTTP or HTTPS) as the base URL for the repository. The header -** contains a TH1 script block to help accomplish these tasks. -** -** 2. The Fossil version information in the footer has been augmented with -** hyperlinks to the corresponding points on the timeline in the official -** Fossil repository. Additionally, if the Tcl integration feature is -** enabled, the loaded version of Tcl is included, with a hyperlink to the -** official Tcl/Tk web site. The footer also contains a TH1 script block -** to help accomplish these tasks. -*/ -static const char zBuiltinSkin5[] = -@ REPLACE INTO config(name,mtime,value) -@ VALUES('css',now(),'/* General settings for the entire page */ -@ body { -@ margin: 0ex 1ex; -@ padding: 0px; -@ background-color: white; -@ font-family: sans-serif; -@ } -@ -@ /* The project logo in the upper left-hand corner of each page */ -@ div.logo { -@ display: table-cell; -@ text-align: center; -@ vertical-align: bottom; -@ font-weight: bold; -@ color: #558195; -@ min-width: 200px; -@ white-space: nowrap; -@ } -@ -@ /* The page title centered at the top of each page */ -@ div.title { -@ display: table-cell; -@ font-size: 2em; -@ font-weight: bold; -@ text-align: center; -@ padding: 0 0 0 1em; -@ color: #558195; -@ vertical-align: bottom; -@ width: 100%; -@ } -@ -@ /* The login status message in the top right-hand corner */ -@ div.status { -@ display: table-cell; -@ text-align: right; -@ vertical-align: bottom; -@ color: #558195; -@ font-size: 0.8em; -@ font-weight: bold; -@ min-width: 200px; -@ white-space: nowrap; -@ } -@ -@ /* The header across the top of the page */ -@ div.header { -@ display: table; -@ width: 100%; -@ } -@ -@ /* The main menu bar that appears at the top of the page beneath -@ ** the header */ -@ div.mainmenu { -@ padding: 5px 10px 5px 10px; -@ font-size: 0.9em; -@ font-weight: bold; -@ text-align: center; -@ letter-spacing: 1px; -@ background-color: #558195; -@ border-top-left-radius: 8px; -@ border-top-right-radius: 8px; -@ color: white; -@ } -@ -@ /* The submenu bar that *sometimes* appears below the main menu */ -@ div.submenu, div.sectionmenu { -@ padding: 3px 10px 3px 0px; -@ font-size: 0.9em; -@ text-align: center; -@ background-color: #456878; -@ color: white; -@ } -@ div.mainmenu a, div.mainmenu a:visited, div.submenu a, div.submenu a:visited, -@ div.sectionmenu>a.button:link, div.sectionmenu>a.button:visited { -@ padding: 3px 10px 3px 10px; -@ color: white; -@ text-decoration: none; -@ } -@ div.mainmenu a:hover, div.submenu a:hover, div.sectionmenu>a.button:hover { -@ color: #558195; -@ background-color: white; -@ } -@ -@ /* All page content from the bottom of the menu or submenu down to -@ ** the footer */ -@ div.content { -@ padding: 0ex 1ex 1ex 1ex; -@ border: solid #aaa; -@ border-width: 1px; -@ } -@ -@ /* Some pages have section dividers */ -@ div.section { -@ margin-bottom: 0px; -@ margin-top: 1em; -@ padding: 1px 1px 1px 1px; -@ font-size: 1.2em; -@ font-weight: bold; -@ background-color: #558195; -@ color: white; -@ white-space: nowrap; -@ } -@ -@ /* The "Date" that occurs on the left hand side of timelines */ -@ div.divider { -@ background: #a1c4d4; -@ border: 2px #558195 solid; -@ font-size: 1em; font-weight: normal; -@ padding: .25em; -@ margin: .2em 0 .2em 0; -@ float: left; -@ clear: left; -@ white-space: nowrap; -@ } -@ -@ /* The footer at the very bottom of the page */ -@ div.footer { -@ clear: both; -@ font-size: 0.8em; -@ padding: 5px 10px 5px 10px; -@ text-align: right; -@ background-color: #558195; -@ border-bottom-left-radius: 8px; -@ border-bottom-right-radius: 8px; -@ color: white; -@ } -@ -@ /* Hyperlink colors in the footer */ -@ div.footer a { color: white; } -@ div.footer a:link { color: white; } -@ div.footer a:visited { color: white; } -@ div.footer a:hover { background-color: white; color: #558195; } -@ -@ /* verbatim blocks */ -@ pre.verbatim { -@ background-color: #f5f5f5; -@ padding: 0.5em; -@ white-space: pre-wrap; -@ } -@ -@ /* The label/value pairs on (for example) the ci page */ -@ table.label-value th { -@ vertical-align: top; -@ text-align: right; -@ padding: 0.2ex 2ex; -@ }'); -@ REPLACE INTO config(name,mtime,value) VALUES('header',now(),'<html> -@ <head> -@ <base href="$baseurl/$current_page" /> -@ <title>$<project_name>: $<title> -@ -@ -@ -@ -@
-@ -@
$
$</div> -@ <div class="status"><th1> -@ if {[info exists login]} { -@ puts "Logged in as $login" -@ } else { -@ puts "Not logged in" -@ } -@ </th1></div> -@ </div> -@ <div class="mainmenu"> -@ <th1> -@ html "<a href=''$home$index_page''>Home</a>\n" -@ if {[anycap jor]} { -@ html "<a href=''$home/timeline''>Timeline</a>\n" -@ } -@ if {[hascap oh]} { -@ html "<a href=''$home/tree?ci=tip''>Files</a>\n" -@ } -@ if {[hascap o]} { -@ html "<a href=''$home/brlist''>Branches</a>\n" -@ html "<a href=''$home/taglist''>Tags</a>\n" -@ } -@ if {[hascap r]} { -@ html "<a href=''$home/reportlist''>Tickets</a>\n" -@ } -@ if {[hascap j]} { -@ html "<a href=''$home/wiki''>Wiki</a>\n" -@ } -@ if {[hascap s]} { -@ html "<a href=''$home/setup''>Admin</a>\n" -@ } elseif {[hascap a]} { -@ html "<a href=''$home/setup_ulist''>Users</a>\n" -@ } -@ if {[info exists login]} { -@ html "<a href=''$home/login''>Logout</a>\n" -@ } else { -@ html "<a href=''$home/login''>Login</a>\n" -@ } -@ </th1></div> -@ '); -@ REPLACE INTO config(name,mtime,value) -@ VALUES('footer',now(),'<div class="footer"> -@ <th1> -@ proc getTclVersion {} { -@ if {[catch {tclEval info patchlevel} tclVersion] == 0} { -@ return "<a href=\"http://www.tcl.tk/\">Tcl</a> version $tclVersion" -@ } -@ return "" -@ } -@ proc getVersion { version } { -@ set length [string length $version] -@ return [string range $version 1 [expr {$length - 2}]] -@ } -@ set version [getVersion $manifest_version] -@ set tclVersion [getTclVersion] -@ set fossilUrl http://www.fossil-scm.org -@ </th1> -@ This page was generated in about -@ <th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s by -@ <a href="$fossilUrl/">Fossil</a> -@ version $release_version $tclVersion -@ <a href="$fossilUrl/index.html/info/$version">$manifest_version</a> -@ <a href="$fossilUrl/index.html/timeline?c=$manifest_date&y=ci">$manifest_date</a> -@ </div> -@ </body></html> -@ '); -; - /* ** An array of available built-in skins. +** +** To add new built-in skins: +** +** 1. Pick a name for the new skin. (Here we use "xyzzy"). +** +** 2. Install files skins/xyzzy/css.txt, skins/xyzzy/header.txt, +** and skins/xyzzy/footer.txt into the source tree. +** +** 3. Rerun "tclsh makemake.tcl" in the src/ folder in order to +** rebuild the makefiles to reference the new CSS, headers, and footers. +** +** 4. Make an entry in the following array for the new skin. */ static struct BuiltinSkin { - const char *zName; - const char *zValue; + const char *zDesc; /* Description of this skin */ + const char *zLabel; /* The directory under skins/ holding this skin */ + char *zSQL; /* Filled in at run-time with SQL to insert this skin */ } aBuiltinSkin[] = { - { "Default", 0 /* Filled in at runtime */ }, - { "Plain Gray, No Logo", zBuiltinSkin1 }, - { "Khaki, No Logo", zBuiltinSkin2 }, - { "Black & White, Menu on Left", zBuiltinSkin3 }, - { "Shadow boxes & Rounded Corners", zBuiltinSkin4 }, - { "Enhanced Default", zBuiltinSkin5 }, + { "Default", "default", 0 }, + { "Plain Gray, No Logo", "plain_gray", 0 }, + { "Khaki, No Logo", "khaki", 0 }, + { "Black & White, Menu on Left", "black_and_white", 0 }, + { "Shadow boxes & Rounded Corners", "rounded1", 0 }, + { "Enhanced Default", "enhanced1", 0 }, }; /* ** For a skin named zSkinName, compute the name of the CONFIG table ** entry where that skin is stored and return it. @@ -1286,57 +67,65 @@ } return z; } /* -** Construct and return a string that represents the current skin if -** useDefault==0 or a string for the default skin if useDefault==1. +** Construct and return an string of SQL statements that represents +** a "skin" setting. If zName==0 then return the skin currently +** installed. Otherwise, return one of the built-in skins designated +** by zName. ** ** Memory to hold the returned string is obtained from malloc. */ -static char *getSkin(int useDefault){ +static char *getSkin(const char *zName){ + const char *z; + char *zLabel; + static const char *azType[] = { "css", "header", "footer" }; + int i; Blob val; blob_zero(&val); - blob_appendf(&val, - "REPLACE INTO config(name,value,mtime) VALUES('css',%Q,now());\n", - useDefault ? zDefaultCSS : db_get("css", (char*)zDefaultCSS) - ); - blob_appendf(&val, - "REPLACE INTO config(name,value,mtime) VALUES('header',%Q,now());\n", - useDefault ? zDefaultHeader : db_get("header", (char*)zDefaultHeader) - ); - blob_appendf(&val, - "REPLACE INTO config(name,value,mtime) VALUES('footer',%Q,now());\n", - useDefault ? zDefaultFooter : db_get("footer", (char*)zDefaultFooter) - ); + for(i=0; i<sizeof(azType)/sizeof(azType[0]); i++){ + if( zName ){ + zLabel = mprintf("skins/%s/%s.txt", zName, azType[i]); + z = builtin_text(zLabel); + fossil_free(zLabel); + }else{ + z = db_get(azType[i], 0); + if( z==0 ){ + zLabel = mprintf("skins/default/%s.txt", azType[i]); + z = builtin_text(zLabel); + fossil_free(zLabel); + } + } + blob_appendf(&val, + "REPLACE INTO config(name,value,mtime) VALUES(%Q,%Q,now());\n", + azType[i], z + ); + } return blob_str(&val); } -/* -** Construct the default skin string and fill in the corresponding -** entry in aBuildinSkin[] -*/ -static void setDefaultSkin(void){ - aBuiltinSkin[0].zValue = getSkin(1); -} - /* ** WEBPAGE: setup_skin */ void setup_skin(void){ const char *z; char *zName; char *zErr = 0; - const char *zCurrent; /* Current skin */ - int i; /* Loop counter */ + const char *zCurrent = 0; /* Current skin */ + int i; /* Loop counter */ Stmt q; login_check_credentials(); if( !g.perm.Setup ){ login_needed(); } db_begin_transaction(); + zCurrent = getSkin(0); + for(i=0; i<sizeof(aBuiltinSkin)/sizeof(aBuiltinSkin[0]); i++){ + aBuiltinSkin[i].zSQL = getSkin(aBuiltinSkin[i].zLabel); + } /* Process requests to delete a user-defined skin */ if( P("del1") && (zName = skinVarName(P("sn"), 1))!=0 ){ style_header("Confirm Custom Skin Delete"); @ <form action="%s(g.zTop)/setup_skin" method="post"><div> @@ -1351,14 +140,10 @@ return; } if( P("del2")!=0 && (zName = skinVarName(P("sn"), 1))!=0 ){ db_multi_exec("DELETE FROM config WHERE name=%Q", zName); } - - setDefaultSkin(); - zCurrent = getSkin(0); - if( P("save")!=0 && (zName = skinVarName(P("save"),0))!=0 ){ if( db_exists("SELECT 1 FROM config WHERE name=%Q", zName) || fossil_strcmp(zName, "Default")==0 ){ zErr = mprintf("Skin name \"%h\" already exists. " "Choose a different name.", P("sn")); @@ -1367,35 +152,39 @@ zName, zCurrent ); } } - /* The user pressed the "Use This Skin" button. */ + /* The user pressed one of the "Install" buttons. */ if( P("load") && (z = P("sn"))!=0 && z[0] ){ int seen = 0; + + /* Check to see if the current skin is already saved. If it is, there + ** is no need to create a backup */ + zCurrent = getSkin(0); for(i=0; i<sizeof(aBuiltinSkin)/sizeof(aBuiltinSkin[0]); i++){ - if( fossil_strcmp(aBuiltinSkin[i].zValue, zCurrent)==0 ){ + if( fossil_strcmp(aBuiltinSkin[i].zSQL, zCurrent)==0 ){ seen = 1; break; } } if( !seen ){ seen = db_exists("SELECT 1 FROM config WHERE name GLOB 'skin:*'" " AND value=%Q", zCurrent); - } - if( !seen ){ - db_multi_exec( - "INSERT INTO config(name,value,mtime) VALUES(" - " strftime('skin:Backup On %%Y-%%m-%%d %%H:%%M:%%S')," - " %Q,now())", zCurrent - ); + if( !seen ){ + db_multi_exec( + "INSERT INTO config(name,value,mtime) VALUES(" + " strftime('skin:Backup On %%Y-%%m-%%d %%H:%%M:%%S')," + " %Q,now())", zCurrent + ); + } } seen = 0; for(i=0; i<sizeof(aBuiltinSkin)/sizeof(aBuiltinSkin[0]); i++){ - if( fossil_strcmp(aBuiltinSkin[i].zName, z)==0 ){ + if( fossil_strcmp(aBuiltinSkin[i].zDesc, z)==0 ){ seen = 1; - zCurrent = aBuiltinSkin[i].zValue; + zCurrent = aBuiltinSkin[i].zSQL; db_multi_exec("%s", zCurrent/*safe-for-%s*/); break; } } if( !seen ){ @@ -1409,48 +198,50 @@ if( zErr ){ @ <p><font color="red">%h(zErr)</font></p> } @ <p>A "skin" is a combination of @ <a href="setup_editcss">CSS</a>, - @ <a href="setup_header">Header</a>, - @ <a href="setup_footer">Footer</a>, and - @ <a href="setup_logo">Logo</a> that determines the look and feel + @ <a href="setup_header">Header</a>, and + @ <a href="setup_footer">Footer</a> that determines the look and feel @ of the web interface.</p> @ @ <h2>Available Skins:</h2> - @ <ol> + @ <table border="0"> for(i=0; i<sizeof(aBuiltinSkin)/sizeof(aBuiltinSkin[0]); i++){ - z = aBuiltinSkin[i].zName; - if( fossil_strcmp(aBuiltinSkin[i].zValue, zCurrent)==0 ){ - @ <li><p>%h(z).   <b>Currently In Use</b></p> + z = aBuiltinSkin[i].zDesc; + @ <tr><td>%d(i+1).<td>%h(z)<td>  <td> + if( fossil_strcmp(aBuiltinSkin[i].zSQL, zCurrent)==0 ){ + @ (Currently In Use) }else{ - @ <li><form action="%s(g.zTop)/setup_skin" method="post"><div> - @ %h(z).   + @ <form action="%s(g.zTop)/setup_skin" method="post"> @ <input type="hidden" name="sn" value="%h(z)" /> - @ <input type="submit" name="load" value="Use This Skin" /> - @ </div></form></li> + @ <input type="submit" name="load" value="Install" /> + @ </form> } + @ </tr> } db_prepare(&q, "SELECT substr(name, 6), value FROM config" " WHERE name GLOB 'skin:*'" " ORDER BY name" ); while( db_step(&q)==SQLITE_ROW ){ const char *zN = db_column_text(&q, 0); const char *zV = db_column_text(&q, 1); + i++; + @ <tr><td>%d(i).<td>%h(zN)<td>  <td> if( fossil_strcmp(zV, zCurrent)==0 ){ - @ <li><p>%h(zN).   <b>Currently In Use</b></p> + @ (Currently In Use) }else{ - @ <li><form action="%s(g.zTop)/setup_skin" method="post"> - @ %h(zN).   + @ <form action="%s(g.zTop)/setup_skin" method="post"> @ <input type="hidden" name="sn" value="%h(zN)"> - @ <input type="submit" name="load" value="Use This Skin"> - @ <input type="submit" name="del1" value="Delete This Skin"> - @ </form></li> + @ <input type="submit" name="load" value="Install"> + @ <input type="submit" name="del1" value="Delete"> + @ </form> } + @ </tr> } db_finalize(&q); - @ </ol> + @ </table> style_footer(); db_end_transaction(0); } Index: src/style.c ================================================================== --- src/style.c +++ src/style.c @@ -289,11 +289,12 @@ ** Draw the header. */ void style_header(const char *zTitleFormat, ...){ va_list ap; char *zTitle; - const char *zHeader = db_get("header", (char*)zDefaultHeader); + const char *zHeader = db_get("header", 0); + if( zHeader==0 ) zHeader = builtin_text("skins/default/header.txt"); login_check_credentials(); va_start(ap, zTitleFormat); zTitle = vmprintf(zTitleFormat, ap); va_end(ap); @@ -454,11 +455,12 @@ /* Set the href= field on hyperlinks. Do this before the footer since ** the footer will be generating </html> */ style_resolve_href(); - zFooter = db_get("footer", (char*)zDefaultFooter); + zFooter = db_get("footer", 0); + if( zFooter==0 ) zFooter = builtin_text("skins/default/footer.txt"); if( g.thTrace ) Th_Trace("BEGIN_FOOTER<br />\n", -1); Th_Render(zFooter); if( g.thTrace ) Th_Trace("END_FOOTER<br />\n", -1); /* Render trace log if TH1 tracing is enabled. */ @@ -484,230 +486,10 @@ */ void style_sidebox_end(void){ @ </div> } -/* @-comment: // */ -/* -** The default page header. -*/ -const char zDefaultHeader[] = -@ <html> -@ <head> -@ <base href="$baseurl/$current_page" /> -@ <title>$<project_name>: $<title> -@ -@ -@ -@ -@
-@ -@
$
$</div> -@ <div class="status"><th1> -@ if {[info exists login]} { -@ puts "Logged in as $login" -@ } else { -@ puts "Not logged in" -@ } -@ </th1></div> -@ </div> -@ <div class="mainmenu"> -@ <th1> -@ html "<a href='$home$index_page'>Home</a>\n" -@ if {[anycap jor]} { -@ html "<a href='$home/timeline'>Timeline</a>\n" -@ } -@ if {[hascap oh]} { -@ html "<a href='$home/tree?ci=tip'>Files</a>\n" -@ } -@ if {[hascap o]} { -@ html "<a href='$home/brlist'>Branches</a>\n" -@ html "<a href='$home/taglist'>Tags</a>\n" -@ } -@ if {[hascap r]} { -@ html "<a href='$home/reportlist'>Tickets</a>\n" -@ } -@ if {[hascap j]} { -@ html "<a href='$home/wiki'>Wiki</a>\n" -@ } -@ if {[hascap s]} { -@ html "<a href='$home/setup'>Admin</a>\n" -@ } elseif {[hascap a]} { -@ html "<a href='$home/setup_ulist'>Users</a>\n" -@ } -@ if {[info exists login]} { -@ html "<a href='$home/login'>Logout</a>\n" -@ } else { -@ html "<a href='$home/login'>Login</a>\n" -@ } -@ </th1></div> -; - -/* -** The default page footer -*/ -const char zDefaultFooter[] = -@ <div class="footer"> -@ This page was generated in about -@ <th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s by -@ Fossil version $manifest_version $manifest_date -@ </div> -@ </body></html> -; - -/* -** The default Cascading Style Sheet. -** It's assembled by different strings for each class. -** The default css contains all definitions. -** The style sheet, send to the client only contains the ones, -** not defined in the user defined css. -*/ -const char zDefaultCSS[] = -@ /* General settings for the entire page */ -@ body { -@ margin: 0ex 1ex; -@ padding: 0px; -@ background-color: white; -@ font-family: sans-serif; -@ } -@ -@ /* The project logo in the upper left-hand corner of each page */ -@ div.logo { -@ display: table-cell; -@ text-align: center; -@ vertical-align: bottom; -@ font-weight: bold; -@ color: #558195; -@ min-width: 200px; -@ white-space: nowrap; -@ } -@ -@ /* The page title centered at the top of each page */ -@ div.title { -@ display: table-cell; -@ font-size: 2em; -@ font-weight: bold; -@ text-align: center; -@ padding: 0 0 0 1em; -@ color: #558195; -@ vertical-align: bottom; -@ width: 100%; -@ } -@ -@ /* The login status message in the top right-hand corner */ -@ div.status { -@ display: table-cell; -@ text-align: right; -@ vertical-align: bottom; -@ color: #558195; -@ font-size: 0.8em; -@ font-weight: bold; -@ min-width: 200px; -@ white-space: nowrap; -@ } -@ -@ /* The header across the top of the page */ -@ div.header { -@ display: table; -@ width: 100%; -@ } -@ -@ /* The main menu bar that appears at the top of the page beneath -@ ** the header */ -@ div.mainmenu { -@ padding: 5px 10px 5px 10px; -@ font-size: 0.9em; -@ font-weight: bold; -@ text-align: center; -@ letter-spacing: 1px; -@ background-color: #558195; -@ border-top-left-radius: 8px; -@ border-top-right-radius: 8px; -@ color: white; -@ } -@ -@ /* The submenu bar that *sometimes* appears below the main menu */ -@ div.submenu, div.sectionmenu { -@ padding: 3px 10px 3px 0px; -@ font-size: 0.9em; -@ text-align: center; -@ background-color: #456878; -@ color: white; -@ } -@ div.mainmenu a, div.mainmenu a:visited, div.submenu a, div.submenu a:visited, -@ div.sectionmenu>a.button:link, div.sectionmenu>a.button:visited { -@ padding: 3px 10px 3px 10px; -@ color: white; -@ text-decoration: none; -@ } -@ div.mainmenu a:hover, div.submenu a:hover, div.sectionmenu>a.button:hover { -@ color: #558195; -@ background-color: white; -@ } -@ -@ /* All page content from the bottom of the menu or submenu down to -@ ** the footer */ -@ div.content { -@ padding: 0ex 1ex 1ex 1ex; -@ border: solid #aaa; -@ border-width: 1px; -@ } -@ -@ /* Some pages have section dividers */ -@ div.section { -@ margin-bottom: 0px; -@ margin-top: 1em; -@ padding: 1px 1px 1px 1px; -@ font-size: 1.2em; -@ font-weight: bold; -@ background-color: #558195; -@ color: white; -@ white-space: nowrap; -@ } -@ -@ /* The "Date" that occurs on the left hand side of timelines */ -@ div.divider { -@ background: #a1c4d4; -@ border: 2px #558195 solid; -@ font-size: 1em; font-weight: normal; -@ padding: .25em; -@ margin: .2em 0 .2em 0; -@ float: left; -@ clear: left; -@ white-space: nowrap; -@ } -@ -@ /* The footer at the very bottom of the page */ -@ div.footer { -@ clear: both; -@ font-size: 0.8em; -@ padding: 5px 10px 5px 10px; -@ text-align: right; -@ background-color: #558195; -@ border-bottom-left-radius: 8px; -@ border-bottom-right-radius: 8px; -@ color: white; -@ } -@ -@ /* Hyperlink colors in the footer */ -@ div.footer a { color: white; } -@ div.footer a:link { color: white; } -@ div.footer a:visited { color: white; } -@ div.footer a:hover { background-color: white; color: #558195; } -@ -@ /* verbatim blocks */ -@ pre.verbatim { -@ background-color: #f5f5f5; -@ padding: 0.5em; -@ white-space: pre-wrap; -@} -; - /* The following table contains bits of default CSS that must ** be included if they are not found in the application-defined ** CSS. */ @@ -714,14 +496,10 @@ const struct strctCssDefaults { const char *elementClass; /* Name of element needed */ const char *comment; /* Comment text */ const char *value; /* CSS text */ } cssDefaultList[] = { - { "", - "", - zDefaultCSS - }, { "div.sidebox", "The nomenclature sidebox for branches,..", @ float: right; @ background-color: white; @ border-width: medium; @@ -1358,19 +1136,16 @@ ** Append all of the default CSS to the CGI output. */ void cgi_append_default_css(void) { int i; + cgi_printf("%s", builtin_text("skins/default/css.txt")); for( i=0; cssDefaultList[i].elementClass; i++ ){ if( cssDefaultList[i].elementClass[0] ){ cgi_printf("/* %s */\n%s {\n%s\n}\n\n", cssDefaultList[i].comment, cssDefaultList[i].elementClass, - cssDefaultList[i].value - ); - }else{ - cgi_printf("%s", cssDefaultList[i].value ); } } } @@ -1381,11 +1156,11 @@ void page_style_css(void){ Blob css; int i; cgi_set_content_type("text/css"); - blob_init(&css, db_get("css",(char*)zDefaultCSS), -1); + blob_init(&css, db_get("css",(char*)builtin_text("skins/default/css.txt")), -1); /* add special missing definitions */ for(i=1; cssDefaultList[i].elementClass; i++){ if( strstr(blob_str(&css), cssDefaultList[i].elementClass)==0 ){ blob_appendf(&css, "/* %s */\n%s {\n%s}\n", Index: win/Makefile.mingw ================================================================== --- win/Makefile.mingw +++ win/Makefile.mingw @@ -484,10 +484,28 @@ $(SRCDIR)/xfer.c \ $(SRCDIR)/xfersetup.c \ $(SRCDIR)/zip.c EXTRA_FILES = \ + $(SRCDIR)/../skins/black_and_white/css.txt \ + $(SRCDIR)/../skins/black_and_white/footer.txt \ + $(SRCDIR)/../skins/black_and_white/header.txt \ + $(SRCDIR)/../skins/default/css.txt \ + $(SRCDIR)/../skins/default/footer.txt \ + $(SRCDIR)/../skins/default/header.txt \ + $(SRCDIR)/../skins/enhanced1/css.txt \ + $(SRCDIR)/../skins/enhanced1/footer.txt \ + $(SRCDIR)/../skins/enhanced1/header.txt \ + $(SRCDIR)/../skins/khaki/css.txt \ + $(SRCDIR)/../skins/khaki/footer.txt \ + $(SRCDIR)/../skins/khaki/header.txt \ + $(SRCDIR)/../skins/plain_gray/css.txt \ + $(SRCDIR)/../skins/plain_gray/footer.txt \ + $(SRCDIR)/../skins/plain_gray/header.txt \ + $(SRCDIR)/../skins/rounded1/css.txt \ + $(SRCDIR)/../skins/rounded1/footer.txt \ + $(SRCDIR)/../skins/rounded1/header.txt \ $(SRCDIR)/diff.tcl TRANS_SRC = \ $(OBJDIR)/add_.c \ $(OBJDIR)/allrepo_.c \ Index: win/Makefile.msc ================================================================== --- win/Makefile.msc +++ win/Makefile.msc @@ -322,11 +322,29 @@ wysiwyg_.c \ xfer_.c \ xfersetup_.c \ zip_.c -EXTRA_FILES = $(SRCDIR)\diff.tcl +EXTRA_FILES = $(SRCDIR)\../skins/black_and_white/css.txt \ + $(SRCDIR)\../skins/black_and_white/footer.txt \ + $(SRCDIR)\../skins/black_and_white/header.txt \ + $(SRCDIR)\../skins/default/css.txt \ + $(SRCDIR)\../skins/default/footer.txt \ + $(SRCDIR)\../skins/default/header.txt \ + $(SRCDIR)\../skins/enhanced1/css.txt \ + $(SRCDIR)\../skins/enhanced1/footer.txt \ + $(SRCDIR)\../skins/enhanced1/header.txt \ + $(SRCDIR)\../skins/khaki/css.txt \ + $(SRCDIR)\../skins/khaki/footer.txt \ + $(SRCDIR)\../skins/khaki/header.txt \ + $(SRCDIR)\../skins/plain_gray/css.txt \ + $(SRCDIR)\../skins/plain_gray/footer.txt \ + $(SRCDIR)\../skins/plain_gray/header.txt \ + $(SRCDIR)\../skins/rounded1/css.txt \ + $(SRCDIR)\../skins/rounded1/footer.txt \ + $(SRCDIR)\../skins/rounded1/header.txt \ + $(SRCDIR)\diff.tcl OBJ = $(OX)\add$O \ $(OX)\allrepo$O \ $(OX)\attach$O \ $(OX)\bag$O \