Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0em 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0em 1em;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which use a logographic writing system and need larger font sizes.
***/

/*{{{*/
body {font-size:0.8em;}

#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}

.subtitle {font-size:0.8em;}

.viewer table.listView {font-size:0.95em;}

.htmlarea .toolbarHA table {border:1px solid ButtonFace; margin:0em 0em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<!--}}}-->
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These InterfaceOptions for customising TiddlyWiki are saved in your browser

Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs)

<<option txtUserName>>
<<option chkSaveBackups>> SaveBackups
<<option chkAutoSave>> AutoSave
<<option chkRegExpSearch>> RegExpSearch
<<option chkCaseSensitiveSearch>> CaseSensitiveSearch
<<option chkAnimate>> EnableAnimations

----
Also see AdvancedOptions
[[Plover|http://plover.stenoknight.com/]]
[[N-Key Rollover|http://stenoknight.com/wiki/N-key_rollover#How_do_I_know_if_my_keyboard_has_N-Key_Rollover_.28NKRO.29.3F]]
[[Keyboard Ghosting Demo|http://www.microsoft.com/appliedsciences/content/projects/KeyboardGhostingDemo.aspx]]
[[Joy2Chord|http://joy2chord.sourceforge.net/]]
4.2 The dotfile

Screen's dotfile (.screenrc) is simply a list of colon commands which will be executed at startup. This is a very handy thing, as you can configure things to your taste and create a custom startup environment, all in the same place. Here's my .screenrc:

      # rebindings
      bind E screen -t emacs emacs -nw
      bind W screen -t w3m w3m ~/.w3m/bookmark.html
      
      # default windows
      screen -t fornax
      screen -t mutt mutt
      screen -t emacs emacs -nw
      screen -t w3m w3m ~/.w3m/bookmark.html
    

The lines beginning with pound signs are comments, and are ignores, as are blank lines. The second line binds capital E to a new screen (new window) with a title of "emacs" running the command "emacs -nw". The third line does something similar. The last four lines are my initial set-up: 4 windows — each with set titles — containing a shell, my mail, an editing session, and a web browsing session, respectively.

My .screenrc is pretty simple, but they can be very complex. The screen package comes with samples for both global and user-level dotfiles, so check them out (Debian users will find them in /usr/share/doc/screen).

Rev: 10 Date: 2003-09-14 19:29:03 -0400 (Sun, 14 Sep 2003)
Author: Acropolis Working Group 
--------------------------------
# This is Chris--'s .screenrc file
#
# disable the startup splash message that screen displays on startup
startup_message off
# create a status line at the bottom of the screen.  this will show the titles and locations of
# all screen windows you have open at any given time
hardstatus alwayslastline "%{= dR} %-Lw%50>%{= dG}%n%f* %{= dW}%t%{= dR}%+Lw%<"
# bind some function keys (k1 == F1, etc) for fast navigation through screen windows
#
#
# use F8 to turn the status bar off at the bottom of the screen
bindkey -k k8 hardstatus alwayslastline
# use F9 to turn the status bar on the bottom back on
bindkey -k k9 hardstatus alwaysignore
# the next 2 lines are set up to use F1 and F2 to move one screen forward or backward (respectively) through your screen session.
bindkey -k k1 prev
bindkey -k k2 next
# This changes the default control character (normally ^a) to something else
# (i do this to ease the use of nested screens so command characters dont conflict with each other)
escape "^Ff"
# set the ssh-agent on my workstation to forward my ssh key through my screen windows
. .keychain/<hostname>-sh
# this will log screen errors to a daily log under the speficied directory
logfile /home/<username>/logs/screen_%y-%m-%d_%0c
# the following lines are just to open and title several screen windows that i use throughout the day
screen -t irc /bin/sh -c "softbeep irssi;bash"
screen -t home
screen -t music /bin/sh -c "ncmpc;bash"
screen -t local
screen -t local
screen -t local
screen -t local
screen -t local
# these last 2 lines are to set the focus on startup (which screen window we look at when screen finishes starting)
focus
select 0
 
Sound card = ESS Audiodrive ESS 1869

Sound works with Breezy.

[[PCMCIA ]]
[[Diag partition]]
[[More on diagnostics partition|http://forums12.itrc.hp.com/service/forums/bizsupport/questionanswer.do?threadId=545072&hpweb_printable=true]]

[[Upgrades]]

Forum Post [["List Your System"|http://www.murga-linux.com/puppy/viewtopic.php?p=231848#231848]] 

My current project is MeanPup running on a Compaq Armada 3500.

Bought cheaply with no HDD or CDrom. Managed to get an external floppy drive soon after.
300 Mhz
192mb ram
Xorg works, but I use Xvesa at 1042x768

Booting off a 1GB stick with the help of WakePup. Tried a CF card with an
IDE adapter, but no luck. Was hoping it would boot off this to save plugging the floppy in. (The adapter nearly caught fire at one point, but thats another story - all parts still working though amazingly).
I use dwm as the window manager, and renamed the devx_214.sfs to 202 so I can mindlessly compile pointless progs I come across.
It's got no modem or ethernet ports, but I 'borrowed' a Lindy USB docking station from work, and the ethernet socket will connect up to the internet.

Also use my main PC (Socket 754, AMD 2800 mobile, 765MB, 80Gig HD, FX5200) Shared with my wife, so XP is main OS, but its got a frugal installs of Muppy, 214R, MeanPup, and sometimes the latest alpha...

[edit] Replaced the CF-IDE adaptor and got the 3500 booting a frugal install of MeanPup. Got plenty of space on the 4gb CF card, so have got extra partitions for data storage, and other installs (I've now added Grub) - currently dyne-bolic, (runs quite well, probably quicker than Slitaz, which I've tried). Might try a 4 series on the spare partition.
Note - also tried a full install to the CF card, but this was slooow.
Forget the Lindy - got a new PCMCIA ethernet card from PC World for 97p!!!
Last edited by Keef on Tue 28 Oct 2008, 05:59; edited 1 time in total

[[Download|http://www.ring.gr.jp/archives/linux/puppylinux/puppy-4.3.1JP2012/]]
[[Release notes|http://openlab.jp/puppylinux/download/puppy-4.3.1JP2012/release-431JP2012-en.html]]
Manual frugal install to HDD on [[Toshiba Satellite Pro M10]]
Boots to desktop at 800x600, language is Japanese. Able to change to English with First Run wizard.
Changed res to 1600x1200 via xorgwizard.
Internet (wifi) setup ok. 
Seamonkey starts in English (forum indicates it is Japanese only).
[[4M|http://4mlinux.com/news.html]]
//{{{
config.macros.accordion={}
config.macros.accordion.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
    var tiddler = story.findContainingTiddler(place);
    var btns = tiddler.getElementsByTagName("a");
    for (var i=0; i<btns.length; i++){
        var btn=btns[i];
        if (hasClass(btn,"sliderButton")){
           btn.old_onclick = btn.onclick;
           btn.onclick = function(e){
               this.old_onclick.apply(this,arguments);
               divs = tiddler.getElementsByTagName("div");
               for (var i=0; i<divs.length; i++){
                   if(hasClass(divs[i],"sliderPanel")){
                       if(divs[i]!=this.nextSibling)
                          divs[i].style.display = "none";
                   }
               }
           }
        }
    }
}
//}}}
<<option chkGenerateAnRssFeed>> GenerateAnRssFeed
<<option chkOpenInNewWindow>> OpenLinksInNewWindow
<<option chkSaveEmptyTemplate>> SaveEmptyTemplate
<<option chkToggleLinks>> Clicking on links to notes that are already open causes them to close
^^(override with Control or other modifier key)^^
<<option chkHttpReadOnly>> HideEditingFeatures when viewed over HTTP
<<option chkForceMinorUpdate>> Treat edits as MinorChanges by preserving date and time
^^(override with Shift key when clicking 'done' or by pressing Ctrl-Shift-Enter^^
<<option chkConfirmDelete>> ConfirmBeforeDeleting 
 Maximum number of lines in a note edit box: <<option txtMaxEditRows>> 
 Folder name for backup files: <<option txtBackupFolder>> 
<<option chkInsertTabs>> Use tab key to insert tab characters instead of jumping to next field
<<option chkSinglePageMode>> Display one tiddler at a time
<<option chkSinglePagePermalink>> Automatically permalink current tiddler
<<option chkTopOfPageMode>> Always open tiddlers at the top of the page
<<option chkBottomOfPageMode>> Always open tiddlers at the bottom of the page
Afterthoughts
This article is slightly modified version of a feature article originally written in 1995 for The X Advisor (now defunct). Here are a few extra comments on the code and on the use of bs:

    * Some compilers issue a warning in addbutton, which can be avoided by casting f to ~XtCallbackProc:

       ~XtAddCallback(w,~XtNcallback,(~XtCallbackProc)f,~XtNewString(p));

    * Label strings include newline characters, which are ignored by Xaw, but not by Motif. Here is a fix:

        if (t==NULL)                          /* empty command: label */
        {
         t=strchr(s,'\n'); if (t!=NULL) *t=0;
         wh=addlabel(s);
        }

    * Comments can be added in panel description files by including them as startup lines, that is, lines starting with TAB followed by #. (These lines will actually be handled by the shell, but the effect is the same.)
    * I use the Bourne shell in bs because that is what I write scripts in. If you prefer other shells, you may want to change the code to something like

       shell=popen(getenv("SHELL"),"w");

      Another possibility is to use exec $SHELL as the first startup line. This replaces the Bourne shell with your current shell. Using variants of this idea allows bs to send commands to other programs (but beware that some programs buffer their input and do not respond immediately as lines are fed into them).
    * Powerful panels can be built by calling such nifty utilities as xmenu, xpick, and xprompt to set variables that are later used in commands, as in:

      choose	F=`xmenu *`
      edit	xterm -e vi $F &

    * Like all Unix programs, bs inherits stdin, stdout, and stderr from the shell that starts it. I usually start a new xterm to run bs; then any error messages that occur appear in this window. I need to give /dev/null as input to any programs that might want to read from stdin, such as ~TeX in the first example. Finally, I usually add set -x to the start-up code in panel descriptions so that I see what commands are being run.

      Just the other day, I found out that, instead of a dedicated xterm, I can use xless in "tail mode":

      bs |& xless -f

      This redirects all text written to stdout and stderr to xless, which reads and displays it as it is output. 
# removes lines between tags and removes tags 
 awk '/start tag/{p=1};!p;/end tag/{p=0}' old.txt >> new.txt

[[10 Awk Tips, Tricks and Pitfalls|http://www.catonmat.net/blog/ten-awk-tips-tricks-and-pitfalls/]]

awk 'NR % 6'            # prints all lines except those divisible by 6
awk 'NR > 5'            # prints from line 6 onwards (like tail -n +6, or sed '1,5d')
awk '$2 == "foo"'       # prints lines where the second field is "foo"
awk 'NF >= 6'           # prints lines with 6 or more fields
awk '/foo/ && /bar/'    # prints lines that match /foo/ and /bar/, in any order
awk '/foo/ && !/bar/'   # prints lines that match /foo/ but not /bar/
awk '/foo/ || /bar/'    # prints lines that match /foo/ or /bar/ (like grep -e 'foo' -e 'bar')
awk '/foo/,/bar/'       # prints from line matching /foo/ to line matching /bar/, inclusive
awk 'NF'                # prints only nonempty lines (or: removes empty lines, where NF==0)
awk 'NF--'              # removes last field and prints the line
awk '$0 = NR" "$0'      # prepends line numbers (assignments are valid in conditions)
!!!Format text with long lines to text with fixed width 
bash$  fmt -s -w80 file

 — by openiduser3 on Jan. 22, 2012, 9:08 a.m. 
Explanation
It will break lines longer than 80 characters at appropriate white spaces to make them less than 80 characters long.
The -s flag will collapse multiple consecutive white spaces into one, or at the end of a sentence a double space.
Makefile
-------------------------------
 # bs needs an ANSI compiler
CC=gcc
CFLAGS=-O2

 # some systems might need -lm.  others might nor need -lXext.
 # LIBS=-L/usr/~X11R7/include/X11/Xaw -L/usr/~X11R7/include/X11/Xmu   -L/usr/~X11R7/include/X11/Xt -L/usr/~X11R7/include/X11/m -L/usr/~X11R7/include/X11/Xext -L/usr/~X11R7 
LIBS=-L/usr/~X11R7/lib -lXaw -lXmu -lXt -lSM -lICE -lXext -lX11
bs:	bs.c
	$(CC) $(CFLAGS) -o bs bs.c $(LIBS)
[[Learn C Online|http://www.learnconline.com/2010/03/introduction.html]]
[[Learning GNU C|http://www.nongnu.org/c-prog-book/online/]]
[[Introduction to GCC|http://www.network-theory.co.uk/docs/gccintro/]]
[[Learn C The Hard Way|http://c.learncodethehardway.org/book/]]
[[WikiBooks C Programming|http://en.wikibooks.org/wiki/C_Programming]]
[[University of Strathclyde Computer Centre|http://www2.its.strath.ac.uk/courses/c/]] From 1995
[[The C Book|http://publications.gbdirect.co.uk/c_book/]] second edition by Mike Banahan, Declan Brady and Mark Doran, originally published by Addison Wesley in 1991.
[[Beej's Guide to C|http://beej.us/guide/bgc/output/html/multipage/index.html]]

[[C Pointers Explained, Really|http://karwin.blogspot.co.uk/2012/11/c-pointers-explained-really.html]]
[[Shared libraries|http://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html]] cprogramming.com
[[Pointers|http://www.thegeekstuff.com/2011/12/c-pointers-fundamentals/]] C Pointers Fundamentals Explained with Examples – Part I
... this needs a big clean up ...

[[KMandla|http://inconsolation.wordpress.com/]] Inconsolation blogspot  [[:Index|http://inconsolation.wordpress.com/index/]]
[[Reddit: Commandline|http://www.reddit.com/r/commandline]]
[[TUI|http://murga-linux.com/puppy/viewtopic.php?t=44123]] ~Bruce_B tutorial
[[Conquering the Command Line|http://conqueringthecommandline.com/book]]
!!!Bash
[[Online script checker|http://www.shellcheck.net/]]
[[Advanced Bash Scripting Guide|http://tldp.org/LDP/abs/html/]]
[[Shell scripting by Vivek G. Gite|http://www.freeos.com/guides/lsst/index.html]]
...[[Version 2|http://bash.cyberciti.biz/guide/Main_Page]]
[[explainshell.com|http://explainshell.com/]]
[[Linux command|http://www.linuxcommand.org/]]
[[Better Bash Scripting in 15 Minutes|http://robertmuth.blogspot.co.uk/2012/08/better-bash-scripting-in-15-minutes.html]]
[[Bash Hacker's Wiki|http://wiki.bash-hackers.org/doku.php]]
[[Greg's Wiki - Bash FAQ|http://mywiki.wooledge.org/BashFAQ]]
[[ss64: BASH|http://www.ss64.com/bash/index.html]]
[[UNIX shell scripting with ksh/bash|http://www.dartmouth.edu/~rc/classes/ksh/]] Dartmouth College
[[Shell scripting tutorial|http://steve-parker.org/sh/first.shtml]]
[[Command line|http://puppylinux.org/wikka/CommandLine]] Puppy Linux Wiki
[[Defensive Bash Programming|http://www.kfirlavi.com/blog/2012/11/14/defensive-bash-programming]]
[[Arachnoid - Bash programming|http://www.arachnoid.com/linux/shell_programming.html]]
[[faqs.org|http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html]]
[[bash tests|http://www.ibm.com/developerworks/linux/library/l-bash-test.html]]
[[learnlinux|http://learnlinux.tsf.org.za/courses/build/shell-scripting/]]

[[Regular Expressions|http://www.regular-expressions.info/]]
[[Tao of Regular Expressions|http://linuxreviews.org/beginner/tao_of_regular_expressions/tao_of_regular_expressions.html.en]]
[[ironmanga|https://www.youtube.com/watch?v=sabSAV0yKEg&list=PLDOiVunkOLsEJF2toupqFubpWtVasDqOg]] Youtube tutorials


[[Floppix|http://floppix.ccai.com/cindex.html]] Command Index
[[Inx|http://inx.maincontent.net/]] Ubuntu based Live CD. An introduction to the CLI with tutorials.

[[GNU/Linux Command-Line Tools Summary|http://www.tldp.org/LDP/GNU-Linux-Tools-Summary/html/index.html]]
[[basics]]

[[Immutable|http://linuxhelp.blogspot.com/2005/11/make-your-files-immutable-which-even.html]] How to stop files being deleted

[[dd|http://www.linuxquestions.org/questions/linux-newbie-8/learn-the-dd-command-362506/]]
[[CLI-Apps|http://www.cli-apps.org/]]
[[tmsu|http://tmsu.org/]] File tagger
[[Litcave|http://litcave.rudi.ir/]]

Fonts
[[Terminal font size|http://linuxcommando.blogspot.co.uk/2014/03/how-to-change-font-size-of-terminal.html]] Linux Commando
How to install .pup and .pet packgages from the command line?
================================================
Bruce B

Maybe I can show you by example. The example program is very simple, it's called
ytree-1.84.pet

ytree-1.84.pet is a tar.gz with the extension renamed to .pet

if you don't know for sure how a tarball will expand its safer to put it in a temp
directory.

let's say we downloaded ytree-1.84.pet to /install

# cd /install
# mkdir tmp
# cp ytree-1.84.pet tmp
# cd tmp
# tar -xvzf ytree-1.84.pet

we find some errors reported, which can be ignored and a new directory named
ytree-1.84

# cd ytree-1.84

we find these directories and files were extracted from the tarball:

      usr/
      usr/bin/
      usr/bin/ytree
      usr/share/
      usr/share/doc/
      usr/share/doc/ytree.htm
      usr/share/applications/
      usr/share/applications/YTREE-console-file-manager.desktop
      root/
      root/.ytree



(our only parent directories are root and usr)

# cp -a * /

will put the files in their proper places.

now we clean up

# cd ../..

takes us back to /install

# rm -r tmp

cleans up the mess we made.

note: now that we have discovered how ytree is packaged, we could have made it a
lot easier on ourselves simply by putting it at / and unpacking it. but for the sake of
learning and teaching i went the long way around for you, thinking it would help.

---------------------------------

the .pup file is a little and even more different because the way .pup files are
packaged have changed. meaning to say that not all pups are the same.

follow the basic outline above except remember that a pup file is a .zip archive. use
the unzip command to open it.

unlike pkzip Puppy's unzip will recreate the directory structure without the /d or -d
switch.

after you've unzipped the .pup file you will likely find a tarball to unpack.

also, regardless of .pet or .put look for any scripts or readme files and read them to
get an idea of anything the packager had in mind and decide if you want to
manually duplicate those steps, whatever they may be.
=====================================================
Pizzasgood
 	 
Note: that won't register the package with PetGet, so if you want to uninstall it later you'll have to do it by hand.

Also, if you don't like the errors that come out of tar, run 'pet2tgz' on the file first to convert it into a proper .tar.gz file (.pet files are a .tar.gz file with an md5sum appended to the end of the file, which is what causes tar to complain). 
xclip -o > file.txt   ... will paste from clipboard.
/***
| Name|CloseOnCancelPlugin|
| Description|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|
| Version|3.0 ($Rev: 1845 $)|
| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|
| Source|http://mptw.tiddlyspot.com/#CloseOnCancelPlugin|
| Author|Simon Baird <simon.baird@gmail.com>|
| License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.commands.cancelTiddler,{

	handler_orig_closeUnsaved: config.commands.cancelTiddler.handler,

	handler: function(event,src,title) {
		this.handler_orig_closeUnsaved(event,src,title);
		if (!store.tiddlerExists(title) && !store.isShadowTiddler(title))
			story.closeTiddler(title,true);
	 	return false;
	}

});

//}}}
[[Compact Flash Association|http://www.compactflash.org/]]
[[Addonics|http://www.addonics.com/products/cf_adapter/]]
[[Alcotek|http://www.alcotek.co.uk/compact-flash-cards/compact-flash-cards.html]]
[[Thinkwiki|http://www.thinkwiki.org/wiki/Compact_Flash_boot_drive]]
Compiling
The simplest way to make an X program is with imake. First, you write an Imakefile such as the one below. (Note that bs needs an ANSI C compiler; gcc is available in most systems.) Then, run xmkmf to convert this Imakefile to a Makefile. Finally, run make to make bs.

             CC = gcc
        DEPLIBS = ~XawClientDepLibs
~LOCAL_LIBRARIES = ~XawClientLibs

~SimpleProgramTarget(bs)

If you don't want to use imake, a simple Makefile for bs is:

# bs needs an ANSI compiler
CC=gcc
CFLAGS=-O2

# some systems might need -lm.  others might not need -lXext.
LIBS=-lXaw -lXmu -lXt -lXext -lX11

bs:	bs.c
	$(CC) $(CFLAGS) -o bs bs.c $(LIBS)

Resources
bs does not define any new resources, but any resource understood by the Athena widgets used in bs (Command, Form, Label) can be specified, either on the command line using the -xrm option, or in a resource file, such as .Xdefaults. For example, if you want the text in the "quit"' button to be red, you can use the resource

bs*quit*foreground: red

I like to use a non-proportional font for alignment. I also like the background of the panel in grey and the buttons to have white background. I place all bs panels at the same spot on the screen. And I don't want mwm to add resize handles to bs panels. These preferences are realized with the following resources:

Mwm*bs.clientDecoration: border menu
bs*geometry: -2+112
bs*background: gray80
bs*Command*background: white
bs*font: fixed

The panels in Figures 1 and 2 were created with these resources in effect. Of course, the appearance of panels is a matter of taste. The nice thing about using Xt to manage resources is that I do not need to write support for user preferences.

Using Motif
Motif is very popular nowadays. It is simple to change bs to use Motif widgets instead of Athena widgets, because Motif has a Form widget, with similar semantics, and also labels and buttons (although buttons are called pushbuttons). Most things in Xaw exist in Motif, perhaps under a different name.

The include files for using Motif are:

#include <Xm/Xm.h>
#include <Xm/Form.h>
#include <Xm/Label.h>
#include <Xm/~PushB.h>

The file <Xm/Xm.h> includes the necessary Xt files, such as <X11/Intrinsic.h>.

The Form widget has a different name in Motif, but is created exactly as in Xaw:

 form=~XtCreateManagedWidget("form",~xmFormWidgetClass,toplevel,NULL,0);

The same is true for labels and buttons. The only real difference is that it takes a few more lines to implement the layout model because, instead of horizontal and vertical relative positioning, Motif allows left, right, top and bottom relative positioning:

Widget addlabel(char* label)
{
 Widget w=~XtVaCreateManagedWidget(label,xmLabelWidgetClass,form,
	~XmNleftAttachment,	(~XtArgVal) ~XmATTACH_WIDGET,
	~XmNleftWidget,		(~XtArgVal) wh,
	~XmNtopAttachment,	(~XtArgVal) ~XmATTACH_WIDGET,
	~XmNtopWidget,		(~XtArgVal) wv,
	NULL);
 return w;
}

Widget addbutton(char* label, Callback* f, char* p)
{
 Widget w=~XtVaCreateManagedWidget(label,xmPushButtonWidgetClass,form,
	~XmNleftAttachment,	(~XtArgVal) ~XmATTACH_WIDGET,
	~XmNleftWidget,		(~XtArgVal) wh,
	~XmNtopAttachment,	(~XtArgVal) ~XmATTACH_WIDGET,
	~XmNtopWidget,		(~XtArgVal) wv,
	NULL);
 ~XtAddCallback(w,~XmNactivateCallback,f,~XtNewString(p));
 return w;
}

Except for having to change the Makefile to use -lXm instead of -lXaw, that is all there is to it! The Motif version is just as small as the original Xaw version.
!!!!Flags

 Pentium II (Intel)

CHOST="i686-pc-linux-gnu"
CFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"

[[Source|http://linuxreviews.org/howtos/compiling/safe-cflags/]]
---------------------
"./configure --prefix=/usr intl release" should be proper settings for Puppy (omit "intl" if you don't need internationalized version). The "release" switch does several things - it enables select optimizations which really do improve speed, tells linker not to add unneeded dependencies, and disables debug code GTK+ would otherwise add. Overall, this makes the executable smaller, faster, and more portable. The target architecture is chosen to be i386, because later architectures just increase the binary size without any noticeable improvement in performance.
Writing bs was an instructive experience for me. The most difficult part was going through the large manuals, trying to figure out what widgets to use, what functions to call and with what arguments.

I now have a useful tool and also know how to use Xt and widget sets. I hope this article helps you learn them too.

A bs package containing source code, man page, and examples, is available at sites in Brazil and Canada, and also at the official X repository and its mirrors in contrib/desktop_managers/.

Luiz Henrique de Figueiredo is a Visiting Researcher at IMPA, on leave from LNCC, and also a consultant at TeCGraf, the Computer Graphics Technology Group of PUC-Rio. He is one of the designers of the Lua language.

Last update: Mon May 10 16:55:01 EST 1999 by lhf.
//{{{
config.options.chkHttpReadOnly = false; // means web visitors can experiment with your site by clicking edit
config.options.chkInsertTabs = true;    // tab inserts a tab when editing a tiddler
config.views.wikified.defaultText = ""; // don't need message when a tiddler doesn't exist
config.views.editor.defaultText = "";   // don't need message when creating a new tiddler 
//}}}
[[setfont|http://linuxreviews.org/man/setfont/]]
[[Console tools|http://lct.sourceforge.net/]]
[[kubuntu|https://wiki.kubuntu.org/HardyConsole]]
[[console-tools|https://launchpad.net/ubuntu/+source/console-tools]] Ubuntu source (jaunty)
[[console-setup|http://packages.debian.org/unstable/utils/console-setup]] Debian
[[console-setup|http://groups.google.com/group/linux.debian.bugs.rc/browse_thread/thread/28ec0074691e0ef0]] Debian bugs
[[fbterm|http://code.google.com/p/fbterm/]]

March 6th, 2007, 02:54 AM
Well, it's not exactly self explanatory. To be clear, here's what I had to modify in /etc/default/console-setup:

1. Change the CODESET="Uni1" line to "CODESET=Lat15". This is the default for Ubuntu Server. If you leave the codeset as Uni1 certain symbols won't display properly, like the apostrophe in man pages.

2. Change FONTFACE="Fixed" to FONTFACE="VGA". Again, this is the default in Ubuntu Server.

With these two changes in place, reboot. You might be able to get away with running whatever init script sets the console font...but my limited experimentation didn't reveal what script that would be.
------------------------
[[powernowd|http://deater.net/john/powernowd.html]]
[[Forum info|http://www.murga-linux.com/puppy/viewtopic.php?t=12019&search_id=491581037]]
[[Forum 2|http://www.murga-linux.com/puppy/viewtopic.php?p=192811&sid=b78941e6d0b92772461ed6291cc69095]]
[[Gentoo]]
!!!!Creating the Panel
The main problem in implementing bs is implementing the layout model. Widget sets usually include widgets to support many different layout models. Such layout widgets are called geometry managers in Xt. The Athena widget set has several geometry managers; it turns out that the Form widget is simple to use and suitable for implementing the layout model in bs. A Form widget displays its children in rows and columns. The children of the Form in bs are just labels or buttons, but Form can manage any kind of widget. What makes Form suitable for bs is that it is possible to define the position of a child widget relatively to existing widgets. This is done by requesting that the child be to the right of an existing widget and below another existing widget. The desired layout for a bs panel is built by using a Form widget and keeping track of the last widget created in a row (stored in the global variable wh), and of a widget in last row (stored in the global variable wv). It is convenient that any widget in the last row works.

Once I had identified that the Form widget was suitable, the actual parsing was simple to write:

void makemenu(void)
{
 char s[BUFSIZ];
 form=~XtCreateManagedWidget("form",formWidgetClass,toplevel,NULL,0);
 while (fgets(s,sizeof(s),stdin))
 {
  char* t;
  if (*s=='\n')				/* empty line: new row */
  {
   if (wh!=NULL)			/* handle multiple empty lines */
   {
    wv=wh;
    wh=NULL;
   }
   continue;
  }
  t=strchr(s,'\t');
  if (t==NULL)				/* empty command: label */
   wh=addlabel(s);
  else if (t==s)			/* empty button label: prolog */
   execute(s);
  else					/* button */
  {
   *t++=0;
   wh=addbutton(s,do_it,t);
  }
 }
 addbutton("quit",do_quit,NULL);
}

This routine first creates a Form inside the top level window by calling ~XtCreateManagedWidget with ~formWidgetClass. Most user interfaces define a hierarchy of widgets in which every widget has a parent widget. In this case, form is a child of toplevel. This form is given an external name "form" so that bs can be configured using resources.

After creating the form, makemenu reads the panel description file line by line, acting according to the type of the line. Lines without a TAB are labels. The routine addlabel creates a label with the given text. Startup lines (those starting with a TAB) are sent immediately to the shell using execute:

void execute(char* s)
{
 fputs(s,shell);
 fflush(shell);
}

Note that I flush the pipe to make sure that the command is executed by the shell at once. This same routine will be used to execute commands associated with buttons.

Lines with a TAB not on the first column are buttons. Such lines are split into two strings: the button text and the command line. Buttons are created with the routine addbutton, which takes three arguments: the text to appear on button, a C function to be called when the button is pressed, and a string to be used as argument to this C function. The function called when a user-defined button is pressed is do_it. This function simply calls execute to send the command line associated with the button to the shell:

void do_it(~Widget w, caddr_t client_data, caddr_t call_data)
{
 execute(client_data);
}

A quit button is automatically created at the end of the panel. The function called when this button is pressed is do_quit, which simply closes the pipe and exits:

void do_quit(~Widget w, caddr_t client_data, caddr_t call_data)
{
 pclose(shell);
 exit(0);
}

These two functions, do_it and do_quit, are not called explicitly anywhere in bs. They are callback functions, called by Xt in response to a user event; in this case, pressing a button in the panel created by bs. Programming a user interface is radically different from other kinds of programming, such as batch text processing or accounting. A user interface program is event-driven: it is controlled by user generated events; it is not sequentially controlled like batch programs. A user interface program typically creates and displays the interface, registers callback functions to be called in response to user events, and then yields control to the supporting library, which manages the interaction with the user, calling the appropriate callback functions.

In Xt, a callback function like do_it receives three parameters: the widget w on which the event occurred and pointers to client data and call data. Call data is whatever additional information is needed for specifying the event. Other widgets use call data, but not the buttons in bs. Client data is data that goes hand-in-hand with the callback function. In bs, client data is used in addbutton to store the command line associated with a button:

Widget addbutton(char* label, Callback* f, char* p)
{
 Widget w=~XtVaCreateManagedWidget(label,~commandWidgetClass,form,
	~XtNfromHoriz,	(~XtArgVal) wh,
	~XtNfromVert,	(~XtArgVal) wv,
	NULL);
 ~XtAddCallback(w,~XtNcallback,f,~XtNewString(p));
 return w;
}

This function first creates a button inside the Form widget created in makemenu by calling ~XtVaCreateManagedWidget with command~WidgetClass (buttons widgets are called Command in Xaw). ~XtVaCreateManagedWidget is a variant of ~XtCreateManagedWidget that allows additional information to be passed in line. In this case, this information is precisely what is needed to implement the layout, as mentioned above.

After creating the button, addbutton calls ~XtAddCallback to register a function to be called when the user presses the button. The function ~XtAddCallback registers a C function as a callback function to a given widget; client data for the callback function can be registered at the same time. bs registers the functions do_it and do_quit as callbacks to buttons created with addbutton. Note that the command line is duplicated with ~XtNewString, because it is stored in a local variable in makemenu. No command line is associated with the "quit" button, so makemenu calls addbutton with NULL in the third argument. It is convenient that ~XtNewString does the right thing in this case.

For convenience, the type Callback is defined in bs as:

typedef void Callback(Widget w, caddr_t client_data, caddr_t call_data);

Here, caddr_t is a opaque data type representing a pointer. In later revisions of Xt, the type caddr_t has been replaced by ~XtPointer.

The function addlabel is similar to addbutton but is simpler, because there are no callbacks associated with labels. Again, it calls ~XtVaCreateManagedWidget, but now with ~labelWidgetClass, to create the label inside the Form:

Widget addlabel(char* label)
{
 Widget w=~XtVaCreateManagedWidget(label,labelWidgetClass,form,
	~XtNfromHoriz,	(~XtArgVal) wh,
	~XtNfromVert,	(~XtArgVal) wv,
	~XtNborderWidth,	(~XtArgVal) 0,
	NULL);
 return w;
}

Note how the layout is specified in both routines using the resources ~XtNfromHoriz and ~XtNfromVert. These resources are understood by the Form widget that is given as parent to the button or label being created. Note also that wh stores the last widget created in a row and that wv stores the last widget created in the previous row. As explained before, this information is sufficient to realize the layout model of bs by using relative positioning in a Form widget.
http://www.diy-linux.org/

	
PostPosted: Mon 10 Jan 2011, 04:31    Post subject: 	 
you've already mentioned the lfs options and amigo some alternatives.

I offer a couple of other sources of info:
Rob Landley does some great embedded work and provides a method to bootstrap several architectures with LFS or gentoo in native or qemu (his whole site is full of goodies)
http://landley.net/hg/hgwebdir.cgi/aboriginal/

or look at how other build systems do it
http://git.buildroot.net/buildroot
http://www.openembedded.org/index.php/Getting_started
http://www.scratchbox.org/
http://pokylinux.org/
http://www.t2-project.org/
http://sourceware.org/ml/libc-help/2009-05/msg00046.html

[[DNS-for-a-wireless-network-Router|http://searchnetworking.techtarget.com/tip/DNS-for-a-wireless-network-Router-Expert]]

All I needed was libresolv.....

[[Russoodle's PuppyLinux Stuff|http://puppylinuxstuff.meownplanet.net/]]
[[Lamiaworks|http://www.lamiaworks.com.au/puppy_isos.html]]
[[Dotpups.de (MU)|http://dotpups.de/]]
[[Smokey01|http://www.smokey01.com/]]
[[RSH's single sfs collection|http://www.smokey01.com/RSH/LazY-Puppy-201/lp201-sfs/single-apps/]]
[[puppyisos.org (MU)|http://www.puppyisos.org]]
[[Coopsurv|http://eminima.org/coopsurv/]]
[[412 Collection|http://412collection.neocities.org/]]
[[archive.org/puppy|https://archive.org/details/puppylinux]]
[[nvidia drivers|http://www.revolutionvoice.com/dl.html]]
[[Firmware|http://www.fishprogs.software/puppy/firmware/]] Gyro's  firmware repository

[[nluug.nl - quirky|http://ftp.vim.org/ftp/pub/os/Linux/distr/quirky/]]
[[Puppyisos|http://ftp5.gwdg.de/pub/linux/puppy/]]
[[Internode|http://mirror.internode.on.net/pub/puppylinux/]]
[[ibiblio|http://distro.ibiblio.org/pub/linux/distributions/puppylinux/]]
[[Wary5|http://distro.ibiblio.org/quirky/pet_packages-wary5/]]
[[Akita|http://akita.scottjarvis.com/]]

[[http://pkgs.org/]]
[[Arch Linux hacking thread|http://bbs.archlinux.org/viewtopic.php?id=40637]]
[[Wiki|https://github.com/robm/dzen/wiki]]
[[Icons|https://github.com/dduponchel/dotfiles/tree/master/xmonad/dzen-icons]] xbm
[[sm4tik Icons|http://awesome.naquadah.org/wiki/Nice_Icons]]
[[edbrowse|http://edbrowse.sourceforge.net/]] homepage

To compile use: pcre-devel and openssl-devel 
~RPMs: [[pcre-devel|http://rpmfind.net/linux/rpm2html/search.php?query=pcre-devel]] - [[openss-devel |http://rpmfind.net/linux/rpm2html/search.php?query=openssl-devel]]
<!--{{{-->
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler wikibar'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'>
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler wikibar'></div>
<span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<!--}}}-->
/***
| Name:|ExtentTagButtonPlugin|
| Description:|Adds a New tiddler button in the tag drop down|
| Version:|3.2 ($Rev: 2406 $)|
| Date:|$Date: 2007-08-08 22:50:23 +1000 (Wed, 08 Aug 2007) $|
| Source:|http://mptw.tiddlyspot.com/#ExtendTagButtonPlugin|
| Author:|Simon Baird <simon.baird@gmail.com>|
| License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{

window.onClickTag_mptw_orig = window.onClickTag;
window.onClickTag = function(e) {
	window.onClickTag_mptw_orig.apply(this,arguments);
	var tag = this.getAttribute("tag");
	var title = this.getAttribute("tiddler");
	// Saq, you're a genius :)
	var popup = Popup.stack[Popup.stack.length-1].popup;
	createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
	wikify("<<newTiddler label:'New tiddler' tag:'"+tag+"'>>",createTiddlyElement(popup,"li"));
	return false;
}

//}}}
< What is fstab and why it's useful >

fstab is a configuration file that contains information of all the partitions and storage devices in your computer. The file is located under /etc, so the full path to this file is /etc/fstab.

/etc/fstab contains information of where your partitions and storage devices should be mounted and how. If you can't access your Windows partition from Linux, aren't able to mount your CD or write to your floppy as a normal user, or have problems with your CD-RW, you probably have a misconfigured /etc/fstab file. So, you can usually fix your mounting problems by editing your fstab file.

/etc/fstab is just a plain text file, so you can open and edit it with any text editor you're familiar with. However, note that you must have the root privileges before editing fstab. So, in order to edit the file, you must either log in as root or use the su command to become root.


[[fstab|http://www.tuxfiles.org/linuxhelp/fstab.html]] Tuxfiles
http://www.togaware.com/linux/survivor/Install_Fonts.html
[[Font Squirrel|http://www.fontsquirrel.com/home]]
[[Adding fonts in Puppy|http://www.murga-linux.com/puppy/viewtopic.php?t=7111]] post by Dougal 29 Mar 2006
/***
|''Name:''|ForEachTiddlerPlugin|
|''Version:''|1.0.5 (2006-02-05)|
|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license]]|
|''Macros:''|[[ForEachTiddlerMacro]] v1.0.5|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|
!Description

Create customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.

''Syntax:'' 
|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|
|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|
|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|
|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]] is used.|
|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|

See details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples]].

!Revision history
* v1.0.5
** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.
** Support Firefox 1.5.0.1
** Internal
*** Make "JSLint" conform
*** "Only install once"
* v1.0.4 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.3 (2005-12-22)
** Features: 
*** Write output to a file supports multi-byte environments (Thanks to Bram Chen) 
*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)
** Enhancements:
*** Improved error messages on InternetExplorer.
* v1.0.2 (2005-12-10)
** Features: 
*** context object also holds reference to store (TiddlyWiki)
** Fixed Bugs: 
*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)
* v1.0.1 (2005-12-08)
** Features: 
*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".
*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.
*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).
*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .
*** Improved script evaluation (for where/sort clause and write scripts).
* v1.0.0 (2005-11-20)
** initial version

!Code
***/
//{{{

 
//============================================================================
//============================================================================
// ForEachTiddlerPlugin
//============================================================================
//============================================================================

// Only install once
if (!version.extensions.ForEachTiddlerPlugin) {

version.extensions.ForEachTiddlerPlugin = {major: 1, minor: 0, revision: 5, date: new Date(2006,2,5), source: "http://tiddlywiki.abego-software.de/#ForEachTiddlergPlugin"};

// For backward compatibility with TW 1.2.x
//
if (!TiddlyWiki.prototype.forEachTiddler) {
 TiddlyWiki.prototype.forEachTiddler = function(callback) {
 for(var t in this.tiddlers) {
 callback.call(this,t,this.tiddlers[t]);
 }
 };
}

//============================================================================
// forEachTiddler Macro
//============================================================================

version.extensions.forEachTiddler = {major: 1, minor: 0, revision: 5, date: new Date(2006,2,5), provider: "http://tiddlywiki.abego-software.de"};

// ---------------------------------------------------------------------------
// Configurations and constants 
// ---------------------------------------------------------------------------

config.macros.forEachTiddler = {
 // Standard Properties
 label: "forEachTiddler",
 prompt: "Perform actions on a (sorted) selection of tiddlers",

 // actions
 actions: {
 addToList: {},
 write: {}
 }
};

// ---------------------------------------------------------------------------
// The forEachTiddler Macro Handler 
// ---------------------------------------------------------------------------

config.macros.forEachTiddler.getContainingTiddler = function(e) {
 while(e && !hasClass(e,"tiddler"))
 e = e.parentNode;
 var title = e ? e.getAttribute("tiddler") : null; 
 return title ? store.getTiddler(title) : null;
};

config.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
 // config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);

 if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);
 // --- Parsing ------------------------------------------

 var i = 0; // index running over the params
 // Parse the "in" clause
 var tiddlyWikiPath = undefined;
 if ((i < params.length) && params[i] == "in") {
 i++;
 if (i >= params.length) {
 this.handleError(place, "TiddlyWiki path expected behind 'in'.");
 return;
 }
 tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");
 i++;
 }

 // Parse the where clause
 var whereClause ="true";
 if ((i < params.length) && params[i] == "where") {
 i++;
 whereClause = this.paramEncode((i < params.length) ? params[i] : "");
 i++;
 }

 // Parse the sort stuff
 var sortClause = null;
 var sortAscending = true; 
 if ((i < params.length) && params[i] == "sortBy") {
 i++;
 if (i >= params.length) {
 this.handleError(place, "sortClause missing behind 'sortBy'.");
 return;
 }
 sortClause = this.paramEncode(params[i]);
 i++;

 if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {
 sortAscending = params[i] == "ascending";
 i++;
 }
 }

 // Parse the script
 var scriptText = null;
 if ((i < params.length) && params[i] == "script") {
 i++;
 scriptText = this.paramEncode((i < params.length) ? params[i] : "");
 i++;
 }

 // Parse the action. 
 // When we are already at the end use the default action
 var actionName = "addToList";
 if (i < params.length) {
 if (!config.macros.forEachTiddler.actions[params[i]]) {
 this.handleError(place, "Unknown action '"+params[i]+"'.");
 return;
 } else {
 actionName = params[i]; 
 i++;
 }
 } 
 
 // Get the action parameter
 // (the parsing is done inside the individual action implementation.)
 var actionParameter = params.slice(i);


 // --- Processing ------------------------------------------
 try {
 this.performMacro({
 place: place, 
 inTiddler: tiddler,
 whereClause: whereClause, 
 sortClause: sortClause, 
 sortAscending: sortAscending, 
 actionName: actionName, 
 actionParameter: actionParameter, 
 scriptText: scriptText, 
 tiddlyWikiPath: tiddlyWikiPath});

 } catch (e) {
 this.handleError(place, e);
 }
};

// Returns an object with properties "tiddlers" and "context".
// tiddlers holds the (sorted) tiddlers selected by the parameter,
// context the context of the execution of the macro.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {

 var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);

 var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;
 context["tiddlyWiki"] = tiddlyWiki;
 
 // Get the tiddlers, as defined by the whereClause
 var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);
 context["tiddlers"] = tiddlers;

 // Sort the tiddlers, when sorting is required.
 if (parameter.sortClause) {
 this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);
 }

 return {tiddlers: tiddlers, context: context};
};

// Returns the (sorted) tiddlers selected by the parameter.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlers = function(parameter) {
 return this.getTiddlersAndContext(parameter).tiddlers;
};

// Performs the macros with the given parameter.
//
// @param parameter holds the parameter of the macro as separate properties.
// The following properties are supported:
//
// place
// whereClause
// sortClause
// sortAscending
// actionName
// actionParameter
// scriptText
// tiddlyWikiPath
//
// All properties are optional. 
// For most actions the place property must be defined.
//
config.macros.forEachTiddler.performMacro = function(parameter) {
 var tiddlersAndContext = this.getTiddlersAndContext(parameter);

 // Perform the action
 var actionName = parameter.actionName ? parameter.actionName : "addToList";
 var action = config.macros.forEachTiddler.actions[actionName];
 if (!action) {
 this.handleError(parameter.place, "Unknown action '"+actionName+"'.");
 return;
 }

 var actionHandler = action.handler;
 actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);
};

// ---------------------------------------------------------------------------
// The actions 
// ---------------------------------------------------------------------------

// Internal.
//
// --- The addToList Action -----------------------------------------------
//
config.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {
 // Parse the parameter
 var p = 0;

 // Check for extra parameters
 if (parameter.length > p) {
 config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);
 return;
 }

 // Perform the action.
 var list = document.createElement("ul");
 place.appendChild(list);
 for (var i = 0; i < tiddlers.length; i++) {
 var tiddler = tiddlers[i];
 var listItem = document.createElement("li");
 list.appendChild(listItem);
 createTiddlyLink(listItem, tiddler.title, true);
 }
};

// Internal.
//
// --- The write Action ---------------------------------------------------
//
config.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {
 // Parse the parameter
 var p = 0;
 if (p >= parameter.length) {
 this.handleError(place, "Missing expression behind 'write'.");
 return;
 }

 var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);
 p++;

 // Parse the "toFile" option
 var filename = null;
 var lineSeparator = undefined;
 if ((p < parameter.length) && parameter[p] == "toFile") {
 p++;
 if (p >= parameter.length) {
 this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");
 return;
 }
 
 filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));
 p++;
 if ((p < parameter.length) && parameter[p] == "withLineSeparator") {
 p++;
 if (p >= parameter.length) {
 this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");
 return;
 }
 lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);
 p++;
 }
 }
 
 // Check for extra parameters
 if (parameter.length > p) {
 config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);
 return;
 }

 // Perform the action.
 var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);
 var count = tiddlers.length;
 var text = "";
 for (var i = 0; i < count; i++) {
 var tiddler = tiddlers[i];
 text += func(tiddler, context, count, i);
 }
 
 if (filename) {
 if (lineSeparator !== undefined) {
 lineSeparator = lineSeparator.replace(/\\n/mg, "\n").replace(/\\r/mg, "\r");
 text = text.replace(/\n/mg,lineSeparator);
 }
 saveFile(filename, convertUnicodeToUTF8(text));
 } else {
 var wrapper = createTiddlyElement(place, "span");
 wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);
 }
};


// ---------------------------------------------------------------------------
// Helpers
// ---------------------------------------------------------------------------

// Internal.
//
config.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {
 return {
 place : placeParam, 
 whereClause : whereClauseParam, 
 sortClause : sortClauseParam, 
 sortAscending : sortAscendingParam, 
 script : scriptText,
 actionName : actionNameParam, 
 actionParameter : actionParameterParam,
 tiddlyWikiPath : tiddlyWikiPathParam,
 inTiddler : inTiddlerParam
 };
};

// Internal.
//
// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of 
// the given path.
//
config.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {
 if (!idPrefix) {
 idPrefix = "store";
 }
 var lenPrefix = idPrefix.length;
 
 // Read the content of the given file
 var content = loadFile(this.getLocalPath(path));
 if(content === null) {
 throw "TiddlyWiki '"+path+"' not found.";
 }
 
 // Locate the storeArea div's
 var posOpeningDiv = content.indexOf(startSaveArea);
 var posClosingDiv = content.lastIndexOf(endSaveArea);
 if((posOpeningDiv == -1) || (posClosingDiv == -1)) {
 throw "File '"+path+"' is not a TiddlyWiki.";
 }
 var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);
 
 // Create a "div" element that contains the storage text
 var myStorageDiv = document.createElement("div");
 myStorageDiv.innerHTML = storageText;
 myStorageDiv.normalize();
 
 // Create all tiddlers in a new TiddlyWiki
 // (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)
 var tiddlyWiki = new TiddlyWiki();
 var store = myStorageDiv.childNodes;
 for(var t = 0; t < store.length; t++) {
 var e = store[t];
 var title = null;
 if(e.getAttribute)
 title = e.getAttribute("tiddler");
 if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)
 title = e.id.substr(lenPrefix);
 if(title && title !== "") {
 var tiddler = tiddlyWiki.createTiddler(title);
 tiddler.loadFromDiv(e,title);
 }
 }
 tiddlyWiki.dirty = false;

 return tiddlyWiki;
};


 
// Internal.
//
// Returns a function that has a function body returning the given javaScriptExpression.
// The function has the parameters:
// 
// (tiddler, context, count, index)
//
config.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {
 var script = context["script"];
 var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";
 var fullText = (script ? script+";" : "")+functionText+";theFunction;";
 return eval(fullText);
};

// Internal.
//
config.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {
 var result = [];
 var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);
 tiddlyWiki.forEachTiddler(function(title,tiddler) {
 if (func(tiddler, context, undefined, undefined)) {
 result.push(tiddler);
 }
 });
 return result;
};

// Internal.
//
config.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {
 var message = "Extra parameter behind '"+actionName+"':";
 for (var i = firstUnusedIndex; i < parameter.length; i++) {
 message += " "+parameter[i];
 }
 this.handleError(place, message);
};

// Internal.
//
config.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {
 var result = 
 (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) 
 ? 0
 : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
 ? -1 
 : +1; 
 return result;
};

// Internal.
//
config.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {
 var result = 
 (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) 
 ? 0
 : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
 ? +1 
 : -1; 
 return result;
};

// Internal.
//
config.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {
 // To avoid evaluating the sortClause whenever two items are compared 
 // we pre-calculate the sortValue for every item in the array and store it in a 
 // temporary property ("forEachTiddlerSortValue") of the tiddlers.
 var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);
 var count = tiddlers.length;
 var i;
 for (i = 0; i < count; i++) {
 var tiddler = tiddlers[i];
 tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);
 }

 // Do the sorting
 tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);

 // Delete the temporary property that holds the sortValue. 
 for (i = 0; i < tiddlers.length; i++) {
 delete tiddlers[i].forEachTiddlerSortValue;
 }
};


// Internal.
//
config.macros.forEachTiddler.trace = function(message) {
 displayMessage(message);
};

// Internal.
//
config.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {
 var message ="<<"+macroName;
 for (var i = 0; i < params.length; i++) {
 message += " "+params[i];
 }
 message += ">>";
 displayMessage(message);
};


// Internal.
//
// Creates an element that holds an error message
// 
config.macros.forEachTiddler.createErrorElement = function(place, exception) {
 var message = (exception.description) ? exception.description : exception.toString();
 return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);
};

// Internal.
//
// @param place [may be null]
//
config.macros.forEachTiddler.handleError = function(place, exception) {
 if (place) {
 this.createErrorElement(place, exception);
 } else {
 throw exception;
 }
};

// Internal.
//
// Encodes the given string.
//
// Replaces 
// "$))" to ">>"
// "$)" to ">"
//
config.macros.forEachTiddler.paramEncode = function(s) {
 var reGTGT = new RegExp("\\$\\)\\)","mg");
 var reGT = new RegExp("\\$\\)","mg");
 return s.replace(reGTGT, ">>").replace(reGT, ">");
};

// Internal.
//
// Returns the given original path (that is a file path, starting with "file:")
// as a path to a local file, in the systems native file format.
//
// Location information in the originalPath (i.e. the "#" and stuff following)
// is stripped.
// 
config.macros.forEachTiddler.getLocalPath = function(originalPath) {
 // Remove any location part of the URL
 var hashPos = originalPath.indexOf("#");
 if(hashPos != -1)
 originalPath = originalPath.substr(0,hashPos);
 // Convert to a native file format assuming
 // "file:///x:/path/path/path..." - pc local file --> "x:\path\path\path..."
 // "file://///server/share/path/path/path..." - FireFox pc network file --> "\\server\share\path\path\path..."
 // "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."
 // "file://server/share/path/path/path..." - pc network file --> "\\server\share\path\path\path..."
 var localPath;
 if(originalPath.charAt(9) == ":") // pc local file
 localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\\");
 else if(originalPath.indexOf("file://///") === 0) // FireFox pc network file
 localPath = "\\\\" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\\");
 else if(originalPath.indexOf("file:///") === 0) // mac/unix local file
 localPath = unescape(originalPath.substr(7));
 else if(originalPath.indexOf("file:/") === 0) // mac/unix local file
 localPath = unescape(originalPath.substr(5));
 else // pc network file
 localPath = "\\\\" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\\"); 
 return localPath;
};

// ---------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// ---------------------------------------------------------------------------
//
setStylesheet(
 ".forEachTiddlerError{color: #ffffff;background-color: #880000;}",
 "forEachTiddler");

//============================================================================
// End of forEachTiddler Macro
//============================================================================


//============================================================================
// String.startsWith Function
//============================================================================
//
// Returns true if the string starts with the given prefix, false otherwise.
//
version.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.startsWith = function(prefix) {
 var n = prefix.length;
 return (this.length >= n) && (this.slice(0, n) == prefix);
};



//============================================================================
// String.endsWith Function
//============================================================================
//
// Returns true if the string ends with the given suffix, false otherwise.
//
version.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.endsWith = function(suffix) {
 var n = suffix.length;
 return (this.length >= n) && (this.right(n) == suffix);
};


//============================================================================
// String.contains Function
//============================================================================
//
// Returns true when the string contains the given substring, false otherwise.
//
version.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.contains = function(substring) {
 return this.indexOf(substring) >= 0;
};

//============================================================================
// Array.indexOf Function
//============================================================================
//
// Returns the index of the first occurance of the given item in the array or 
// -1 when no such item exists.
//
// @param item [may be null]
//
version.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.indexOf = function(item) {
 for (var i = 0; i < this.length; i++) {
 if (this[i] == item) {
 return i;
 }
 }
 return -1;
};

//============================================================================
// Array.contains Function
//============================================================================
//
// Returns true when the array contains the given item, otherwise false. 
//
// @param item [may be null]
//
version.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.contains = function(item) {
 return (this.indexOf(item) >= 0);
};

//============================================================================
// Array.containsAny Function
//============================================================================
//
// Returns true when the array contains at least one of the elements 
// of the item. Otherwise (or when items contains no elements) false is returned.
//
version.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAny = function(items) {
 for(var i = 0; i < items.length; i++) {
 if (this.contains(items[i])) {
 return true;
 }
 }
 return false;
};


//============================================================================
// Array.containsAll Function
//============================================================================
//
// Returns true when the array contains all the items, otherwise false.
// 
// When items is null false is returned (even if the array contains a null).
//
// @param items [may be null] 
//
version.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAll = function(items) {
 for(var i = 0; i < items.length; i++) {
 if (!this.contains(items[i])) {
 return false;
 }
 }
 return true;
};


} // of "install only once"

// Used Globals (for JSLint) ==============
// ... DOM
/*global document */
// ... TiddlyWiki Core
/*global convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink, 
 displayMessage, endSaveArea, hasClass, loadFile, saveFile, 
 startSaveArea, store, wikify */
//}}}


/***
!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.

Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/
[[Directfb|http://www.directfb.org/]]
[[TLDP How to|http://en.tldp.org/HOWTO/Framebuffer-HOWTO.html#toc4]]
[[EZFB|http://freshmeat.net/projects/ezfb]]
[[Winnie|https://github.com/hikiko/winnie/tree/winnie.clients-as-plugins]]
[[yaft|https://github.com/uobikiemukot/yaft]]

[[Kernel Mode Setting|http://nouveau.freedesktop.org/wiki/KernelModeSetting/]]

The following table shows the mode numbers you can input at the VGA prompt or for use with the LILO program. (actually these numbers are plus 0x200 to make it easier to refer to the table)

|Colours | 640x400 | 640x480 | 800x600 | 1024x768 | 1152x864 | 1280x1024 | 1600x1200 |
|4 bits    |    ?          |    ?   |  0x302   |   ?    |    ?    |    ?    |     ?     |
|8 bits    |  0x300    |  0x301 |  0x303  |  0x305  |  0x161  |  0x307  |   0x31C |
|15 bits  |    ?          |  0x310  | 0x313  |  0x316  |  0x162  |  0x319  |   0x31D |
|16 bit s |     ?         |   0x311 |  0x314  |  0x317  |  0x163  |  0x31A  |   0x31E |
|24 bits  |    ?          |  0x312  | 0x315  |  0x318   |   ?   |   0x31B  |   0x31F |
|32 bits  |    ?          |    ?   |    ?    |    ?   |   0x164   |   ?   |

Key: 8 bits = 256 colours, 15 bits = 32,768 colours, 16 bits = 65,536 colours, 24 bits = 16.8 million colours, 32 bits - same as 24 bits, but the extra 8 bits can be used for other things, and fits perfectly with a 32 bit PCI/VLB/EISA bus.

Additional modes are at the discretion of the manufacturer, as the VESA 2.0 document only defines modes up to 0x31F. You may need to do some fiddling around to find these extra modes. 
/***
|Name|FullScreenPlugin|
|Created by|SaqImtiaz|
|Location|http://lewcid.googlepages.com/lewcid.html#FullScreenPlugin|
|Version|1.1|
|Requires|~TW2.x|
!Description:
Toggle between viewing tiddlers fullscreen and normally. Very handy for when you need more viewing space.

!Demo:
Click the ↕ button in the toolbar for this tiddler. Click it again to turn off fullscreen.

!Installation:
Copy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.
Edit the ViewTemplate to add the fullscreen command to the toolbar.

!History:
*25-07-06: ver 1.1
*20-07-06: ver 1.0

!Code
***/
//{{{
var lewcidFullScreen = false;

config.commands.fullscreen =
{
            text:" ↕ ",
            tooltip:"Fullscreen mode"
};

config.commands.fullscreen.handler = function (event,src,title)
{
            if (lewcidFullScreen == false)
               {
                lewcidFullScreen = true;
                setStylesheet('#sidebar, .header, #mainMenu{display:none;} #displayArea{margin:0em 0 0 0 !important;}',"lewcidFullScreenStyle");
               }
            else
               {
                lewcidFullScreen = false;
                setStylesheet(' ',"lewcidFullScreenStyle");
               }
}

config.macros.fullscreen={};
config.macros.fullscreen.handler =  function(place,macroName,params,wikifier,paramString,tiddler)
{
        var label = params[0]||" ↕ ";
        var tooltip = params[1]||"Fullscreen mode";
        createTiddlyButton(place,label,tooltip,config.commands.fullscreen.handler);
}

var lewcid_fullscreen_closeTiddler = Story.prototype.closeTiddler;
Story.prototype.closeTiddler =function(title,animate,slowly)
{
           lewcid_fullscreen_closeTiddler.apply(this,arguments);
           if (story.isEmpty() && lewcidFullScreen == true)
              config.commands.fullscreen.handler();
}


Slider.prototype.lewcidStop = Slider.prototype.stop;
Slider.prototype.stop = function()
{
           this.lewcidStop();
           if (story.isEmpty() && lewcidFullScreen == true)
              config.commands.fullscreen.handler();
}
//}}}
http://murga-linux.com/puppy/viewtopic.php?p=608366#608366

Gosh, scOttman, I feel so... vindicated! You must have wrongly updatet the kernel headers when you updated the kernel.... For my distro, I call the headers 'libc-headers' instead of kernel-headers so that no one will think they are really related to the running kernel version. No ,wait, I missed this: "(ish... its still got old kernel, therefore old kernel headers....)". 

 Let me reiterate. When you compile glibc for a new system, you choose a certain version of the includes from the kernel sources. The version of these headers has absolutely no relation to whatever kernel you are running at glibc compile time, nor any relation to the kernel version you plane to release, nor to any upgraded-kernel you might use afterward (well, there a couple of corner cases where this is not *absolutely* true). 

 The headers used when compiling glibc define how glibc interfaces with the kernel. In order to have a sane system, these same kernel-headers should be used for compiling all software on the system until a new glibc version is created. So, the kernel headers which are present under /usr/include should always be the same for the life of the distro. And note that as soon as you upgrade glibc, you should properly re-compile *every* bit of software on the system. If you have noticed the many GLIBC_VERSION errors on this forum, this is exactly where they come from -mismatching binaries/libs. 

 This does not mean that you can never upgrade the kernel. The kernel sources do not install their headers under /usr/include -the kernel includes everything it needs under one dir. So, go right ahead and run any kernel version you like. The only time that the headers of the running kernel version matter is when you are compiling out-of-tree kernel modules. 

 So, make a nice package out of the original headers so they can always be handy and stay the same. Then, do what you like about a running kernel. When you need to compile out-of-tree modules, they are gonna need the full kernel sources *of the running kernel*. Compiling the module will look for the internal kernel headers -usually in the default location /usr/src/linux -otherwise there will be a configuration option which points the build at the correct kernel version. 

 Read this over and over again until it starts to make sense. 

 Note that there are other elements to having a truly sane toolchain. The toolchain only consists of three things: glibc, gcc and binutils. Later versions of gcc have external lib dependencie which also should fit and match, but to really understand the basics just consider those three. 

 Now, a truly sane toolchain is when all three of these components have a 'circular dependency* on each other. That means that *this* glibc was compiled by *this* gcc and linked using *this* binutils. It takes at least two passes to accomplish that. If that sounds like overkill, then you'll never be up to creating your own toolchain. Every major distro -nay, every 'true' distro does this every time the toolchain changes. Why? It is the Right Way (tm) and the only way to ensure that you never see those GLIBC_VERSION errors. Any so-called distro which does not observe these procedures is pure junk and is gonna bring lots of misery to nearly everyone who touches it. You can't simply grab some binaries from just anywhere and start mixing them.
[[LinuxQuestions|http://www.linuxquestions.org/questions/index.php]]
[[Linux.com|http://www.linux.com/]]
[[DistroWatch|http://distrowatch.org/]]
[[NewsNow Linux|http://www.newsnow.co.uk/h/Technology/Software/Linux]]
[[Free Software Magazine|http://www.freesoftwaremagazine.com/]]
[[Linux Format|http://www.linuxformat.co.uk/]]
[[The Linux Documentation Project|http://www.tldp.org/]]
[[Guide|http://www.science.unitn.it/~fiorella/guidelinux/tlk/node5.html]]
[[Linuceum|http://www.linuceum.com/index.php]]

<<section Distros 
[[Slackware|http://www.slackware.com/]]
[[Alienbob Blog|http://alien.slackbook.org/blog/]]

[[4M|http://4mlinux.com/news.html]]
[[RLSD|http://rlsd2.dimakrasner.com/]]
[[Liberte|http://dee.su/liberte]]
[[dyne:bolic|http://www.dynebolic.org/]] : Version 2.5.2 [[download|http://distro.ibiblio.org/dynebolic/]]
[[DSL|http://www.damnsmalllinux.org/]]
[[Slitaz|http://www.slitaz.org/en/]] 
[[Plop|http://www.plop.at/en/ploplinux.html#intro]]
>>
!______________________________________________________________________
[[Puppy Forum - Wacom HOWTO|http://murga-linux.com/puppy/viewtopic.php?t=16491]]
[[ArchWiki Wacom|https://wiki.archlinux.org/index.php/Wacom_Tablet]]
[[ROX|http://rox.sourceforge.net/desktop/static.html]]
[[RUTE|http://www.murga-linux.com/puppy/viewtopic.php?t=19741&sid=b5b089a0a92faa8716dcf91144ca96fa]]
New lappie. £42.50 inc p&p  from ebay.  Has charger, 1 gig RAM and clean 60 gig HDD.

Processor
Intel Pentium M 760 / 2.0 GHz
[[Specs|http://www.cpu-world.com/CPUs/Pentium_M/Intel-Pentium%20M%20760%20RJ80536GE0412M%20-%20LE80536GE0412M.html]]

RAM installed size
1 G

Hard Drive
60.0 GB - 5400.0 rpm

Display Type
15.0 in TFT active matrix

Max Resolution
1400 x 1050 ( SXGA )

Graphics Processor
Intel GMA 915 Dynamic Video Memory Technology 3.0

Optical Drive
DVD±RW - Integrated

Wireless
 802.11a/b/g 

Wireless Controller
 Intel PRO/Wireless 2915ABG 

Network Interface
 Gigabit Ethernet

Memory Card Reader
 6 in 1 card reader ( SmartMedia Card ),
 ( Memory Stick PRO ),
 ( SD Memory Card ),
 ( xD-Picture Card ),
 ( Memory Stick ),
 ( MultiMediaCard )

/***
| Name|HideWhenPlugin|
| Description|Allows conditional inclusion/exclusion in templates|
| Version|3.0 ($Rev: 1845 $)|
| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|
| Source|http://mptw.tiddlyspot.com/#HideWhenPlugin|
| Author|Simon Baird <simon.baird@gmail.com>|
| License|http://mptw.tiddlyspot.com/#TheBSDLicense|
For use in ViewTemplate and EditTemplate. Example usage:
{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}
{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}
***/
//{{{

window.removeElementWhen = function(test,place) {
	if (test) {
		removeChildren(place);
		place.parentNode.removeChild(place);
	}
};

merge(config.macros,{

	hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( eval(paramString), place);
	}},

	showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !eval(paramString), place);
	}},

	hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAll(params), place);
	}},

	showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAll(params), place);
	}},

	hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAny(params), place);
	}},

	showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAny(params), place);
	}},

	hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAll(params), place);
	}},

	showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAll(params), place);
	}},

	hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);
	}},

	showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);
	}}

});

//}}}
Some of the programs included in INX:

abcde                                          (CD ripper script)
@ calcurse                                       (calendar)
@ cmatrix                                        (screensaver)
console-freecell                             (little card game)
console-terminus
cplay                                           (music player)
@ dialog
@ dict                                             (dictionary lookup from command line)
elinks-lite                                      (tabbed CLI browser)
fbgrab                                          (take screenshots in a tty / vt )
fbi                                               (picture viewer - also fbgs which shows pdf files)
@ figlet                                            (fun ascii font mangler)
gpm                                             (use your mouse)
@ greed                                           (another little game)
@ htop                                            (improvement on the "top" monitor)
iftop                                            (monitor network activity)
iptraf                                           (network monitor with attitude.    .    .    )
irssi                                             (IRC client)
jed                                              (emacsish editor with mouseable menus and colours/syntax etc.    )
@ links2                                           (graphical or text mode browser - graphics on frame buffer)
@ linm                                             (yet another file manager)
@ mc                                              (Midnight Commander file manager)
@ moc                                             (Music On Console - very nice)
mpg321                                        (mp3 from the command line)
mplayer-nogui                                (music and video player)
mutt                                            (email client)
@ robotfindskitten                             (another harmless game.    .    .    )
@ sc                                               (spreadsheet)
@ screen                                         (powerful cli session manager - who needs a window manager?)
@sl                                                (not telling you)
sshfs                                           (secure encrypted file access/sharing with ssh)
telnet                                          (yeah, well, it still has uses.    .    .    )
urlview                                         (see URLs from mutt with CTRL+B)
usbmount                                     (automatic usb mounting, with menu in INX)
@ vifm                                             (file manager for vi/vim fans)
vim                                             (the editor, plus runtime etc.    )
zile                                             (tiny basic emacs clone)
Methods to get your IP address:

wget -qO- http://ipecho.net/plain ; echo
curl ifconfig.me
dig +short myip.opendns.com @resolver1.opendns.com

Found on [[Reddit|http://www.reddit.com/r/commandline/comments/2870ho/bash_to_find_out_my_routers_outer_ip_quickly_i/]]
<<importTiddlers>>

/***
|''Name:''|abego.IncludePlugin|
|''Version:''|1.0.0 (2007-02-08)|
|''Type:''|plugin|
|''Source:''|http://tiddlywiki.abego-software.de/#IncludePlugin|
|''Author:''|Udo Borkowski (ub [at] abego-software [dot] de)|
|''Documentation:''|[[IncludePlugin Documentation|http://tiddlywiki.abego-software.de/#%5B%5BIncludePlugin%20Documentation%5D%5D]]|
|''Community:''|([[del.icio.us|http://del.icio.us/post?url=http://tiddlywiki.abego-software.de/index.html%23IncludePlugin]]) ([[Support|http://groups.google.com/group/TiddlyWiki]])|
|''Copyright:''|&copy; 2007 [[abego Software|http://www.abego-software.de]]|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''~CoreVersion:''|2.1.3|
|''Browser:''|Firefox 1.5.0.9 or better; Internet Explorer 6.0|
***/
/***
This plugin's source code is compressed (and hidden). Use this [[link|http://tiddlywiki.abego-software.de/archive/IncludePlugin/Plugin-Include-src.1.0.0.js]] to get the readable source code.
***/
///%
if(!window.abego){window.abego={};}var invokeLater=function(_1,_2,_3){return abego.invokeLater?abego.invokeLater(_1,_2,_3):setTimeout(_1,_2);};abego.loadFile=function(_4,_5,_6){var _7=function(_8,_9,_a,_b,_c){return _8?_5(_a,_b,_9):_5(undefined,_b,_9,"Error loading %0".format([_b]));};if(_4.search(/^((http(s)?)|(file)):/)!=0){if(_4.search(/^((.\:\\)|(\\\\)|(\/))/)==0){_4="file://"+_4;}else{var _d=document.location.toString();var i=_d.lastIndexOf("/");_4=_d.substr(0,i+1)+_4;}_4=_4.replace(/\\/mg,"/");}loadRemoteFile(_4,_7,_6);};abego.loadTiddlyWikiStore=function(_f,_10,_11,_12){var _13=function(_14,_15){if(_12){_12(_14,"abego.loadTiddlyWikiStore",_15,_f,_11);}};var _16=function(_17,_18){var _19=_18.indexOf(startSaveArea);var _1a=_18.indexOf("<!--POST-BODY-END--"+">");var _1b=_18.lastIndexOf(endSaveArea,_1a==-1?_18.length:_1a);if((_19==-1)||(_1b==-1)){return config.messages.invalidFileError.format([_f]);}var _1c="<html><body>"+_18.substring(_19,_1b+endSaveArea.length)+"</body></html>";var _1d=document.createElement("iframe");_1d.style.display="none";document.body.appendChild(_1d);var doc=_1d.document;if(_1d.contentDocument){doc=_1d.contentDocument;}else{if(_1d.contentWindow){doc=_1d.contentWindow.document;}}doc.open();doc.writeln(_1c);doc.close();var _1f=doc.getElementById("storeArea");_17.loadFromDiv(_1f,"store");_1d.parentNode.removeChild(_1d);return null;};var _20=function(_21){_13("Error when loading %0".format([_f]),"Failed");_10(undefined,_f,_11,_21);return _21;};var _22=function(_23){_13("Loaded %0".format([_f]),"Done");_10(_23,_f,_11);return null;};var _24=function(_25,_26,_27,_28){if(_25===undefined){_20(_28);return;}_13("Processing %0".format([_f]),"Processing");var _29=config.messages.invalidFileError;config.messages.invalidFileError="The file '%0' does not appear to be a valid TiddlyWiki file";try{var _2a=new TiddlyWiki();var _2b=_16(_2a,_25);if(_2b){_20(_2b);}else{_22(_2a);}}catch(ex){_20(exceptionText(ex));}finally{config.messages.invalidFileError=_29;}};_13("Start loading %0".format([_f]),"Started");abego.loadFile(_f,_24,_11);};(function(){if(abego.TiddlyWikiIncluder){return;}var _2c="waiting";var _2d="loading";var _2e=1000;var _2f=-200;var _30=-100;var _31=-300;var _32;var _33=[];var _34={};var _35=[];var _36;var _37=[];var _38;var _39=function(){if(_32===undefined){_32=config.options.chkUseInclude===undefined||config.options.chkUseInclude;}return _32;};var _3a=function(url){return "No include specified for %0".format([url]);};var _3c=function(){var _3d=_35;_35=[];if(_3d.length){for(var i=0;i<_37.length;i++){_37[i](_3d);}}};var _3f;var _40=function(){if(_36!==undefined){clearInterval(_36);}_3f=0;var _41=function(){abego.TiddlyWikiIncluder.sendProgress("","","Done");};_36=setInterval(function(){_3f++;if(_3f<=10){return;}clearInterval(_36);_36=undefined;abego.TiddlyWikiIncluder.sendProgress("Refreshing...","","");refreshDisplay();invokeLater(_41,0,_2f);},0);};var _42=function(_43){var _44;for(var i=0;i<_33.length;i++){var _46=abego.TiddlyWikiIncluder.getStore(_33[i]);if(_46&&(_44=_43(_46,_33[i]))){return _44;}}};var _47=function(){if(!window.store){return invokeLater(_47,100);}var _48=store.fetchTiddler;store.fetchTiddler=function(_49){var t=_48.apply(this,arguments);if(t){return t;}if(config.shadowTiddlers[_49]!==undefined){return undefined;}if(_49==config.macros.newTiddler.title){return undefined;}return _42(function(_4b,url){var t=_4b.fetchTiddler(_49);if(t){t.includeURL=url;}return t;});};if(_33.length){_40();}};var _4e=function(){if(!window.store){return invokeLater(_4e,100);}var _4f=store.getTiddlerText("IncludeList");if(_4f){wikify(_4f,document.createElement("div"));}};var _50=function(_51){var _52=function(){var _53=store.forEachTiddler;var _54=function(_55){var _56={};var _57;var _58=function(_59,_5a){if(_56[_59]){return;}_56[_59]=1;if(_57){_5a.includeURL=_57;}_55.apply(this,arguments);};_53.call(store,_58);for(var n in config.shadowTiddlers){_56[n]=1;}_56[config.macros.newTiddler.title]=1;_42(function(_5c,url){_57=url;_5c.forEachTiddler(_58);});};store.forEachTiddler=_54;try{return _51.apply(this,arguments);}finally{store.forEachTiddler=_53;}};return _52;};var _5e=function(_5f,_60){return _5f[_60]=_50(_5f[_60]);};abego.TiddlyWikiIncluder={};abego.TiddlyWikiIncluder.setProgressFunction=function(_61){_38=_61;};abego.TiddlyWikiIncluder.getProgressFunction=function(_62){return _38;};abego.TiddlyWikiIncluder.sendProgress=function(_63,_64,_65){if(_38){_38.apply(this,arguments);}};abego.TiddlyWikiIncluder.onError=function(url,_67){displayMessage("Error when including '%0':\n%1".format([url,_67]));};abego.TiddlyWikiIncluder.hasPendingIncludes=function(){for(var i=0;i<_33.length;i++){var _69=abego.TiddlyWikiIncluder.getState(_33[i]);if(_69==_2c||_69==_2d){return true;}}return false;};abego.TiddlyWikiIncluder.getIncludes=function(){return _33.slice();};abego.TiddlyWikiIncluder.getState=function(url){var s=_34[url];if(!s){return _3a(url);}return typeof s=="string"?s:null;};abego.TiddlyWikiIncluder.getStore=function(url){var s=_34[url];if(!s){return _3a(url);}return s instanceof TiddlyWiki?s:null;};abego.TiddlyWikiIncluder.include=function(url,_6f){if(!_39()||_34[url]){return;}var _70=this;_33.push(url);_34[url]=_2c;var _71=function(_72,_73,_74,_75){if(_72===undefined){_34[url]=_75;_70.onError(url,_75);return;}_34[url]=_72;_35.push(url);invokeLater(_3c);};var _76=function(){_34[url]=_2d;abego.loadTiddlyWikiStore(url,_71,null,_38);};if(_6f){invokeLater(_76,_6f);}else{_76();}};abego.TiddlyWikiIncluder.forReallyEachTiddler=function(_77){var _78=function(){store.forEachTiddler(_77);};_50(_78).call(store);};abego.TiddlyWikiIncluder.getFunctionUsingForReallyEachTiddler=_50;abego.TiddlyWikiIncluder.useForReallyEachTiddler=_5e;abego.TiddlyWikiIncluder.addListener=function(_79){_37.push(_79);};abego.TiddlyWikiIncluder.addListener(_40);if(config.options.chkUseInclude===undefined){config.options.chkUseInclude=true;}config.shadowTiddlers.AdvancedOptions+="\n<<option chkUseInclude>> Include ~TiddlyWikis (IncludeList | IncludeState | [[help|http://tiddlywiki.abego-software.de/#%5B%5BIncludePlugin%20Documentation%5D%5D]])\n^^(Reload this ~TiddlyWiki to make changes become effective)^^";config.shadowTiddlers.IncludeState="<<includeState>>";var _7a=function(e,_7c,_7d){if(!anim||!abego.ShowAnimation){e.style.display=_7c?"block":"none";return;}anim.startAnimating(new abego.ShowAnimation(e,_7c,_7d));};abego.TiddlyWikiIncluder.getDefaultProgressFunction=function(){setStylesheet(".includeProgressState{\n"+"background-color:#FFCC00;\n"+"position:absolute;\n"+"right:0.2em;\n"+"top:0.2em;\n"+"width:7em;\n"+"padding-left:0.2em;\n"+"padding-right:0.2em\n"+"}\n","abegoInclude");var _7e=function(){var e=document.createElement("div");e.className="includeProgressState";e.style.display="none";document.body.appendChild(e);return e;};var _80=_7e();var _81=function(_82){removeChildren(_80);createTiddlyText(_80,_82);_7a(_80,true,0);};var _83=function(){invokeLater(function(){_7a(_80,false,_2e);},100,_30);};var _84=function(_85,_86,_87,url,_89){if(_87=="Done"||_87=="Failed"){_83();return;}if(_86=="abego.loadTiddlyWikiStore"){_3f=0;if(_87=="Processing"){_81("Including...");}}else{_81(_85);}};return _84;};abego.TiddlyWikiIncluder.setProgressFunction(abego.TiddlyWikiIncluder.getDefaultProgressFunction());config.macros.include={};config.macros.include.handler=function(_8a,_8b,_8c,_8d,_8e,_8f){_8c=_8e.parseParams("url",null,true,false,true);var _90=parseInt(getParam(_8c,"delay","0"));var _91=_8c[0]["url"];var _92=getFlag(_8c,"hide",false);if(!_92){createTiddlyText(createTiddlyElement(_8a,"code"),_8d.source.substring(_8d.matchStart,_8d.nextMatch));}for(var i=0;_91&&i<_91.length;i++){abego.TiddlyWikiIncluder.include(_91[i],_90);}};config.macros.includeState={};config.macros.includeState.handler=function(_94,_95,_96,_97,_98,_99){var _9a=function(){var s="";var _9c=abego.TiddlyWikiIncluder.getIncludes();if(!_9c.length){return "{{noIncludes{\nNo includes or 'include' is disabled (see AdvancedOptions)\n}}}\n";}s+="|!Address|!State|\n";for(var i=0;i<_9c.length;i++){var inc=_9c[i];s+="|{{{"+inc+"}}}|";var t=abego.TiddlyWikiIncluder.getState(inc);s+=t?"{{{"+t+"}}}":"included";s+="|\n";}s+="|includeState|k\n";return s;};var _a0=function(){removeChildren(div);wikify(_9a(),div);if(abego.TiddlyWikiIncluder.hasPendingIncludes()){invokeLater(_a0,500,_31);}};var div=createTiddlyElement(_94,"div");invokeLater(_a0,0,_31);};var _a2=Tiddler.prototype.isReadOnly;Tiddler.prototype.isReadOnly=function(){return _a2.apply(this,arguments)||this.isIncluded();};Tiddler.prototype.isIncluded=function(){return this.includeURL!=undefined;};Tiddler.prototype.getIncludeURL=function(){return this.includeURL;};var _a3={getMissingLinks:1,getOrphans:1,getTags:1,reverseLookup:1,updateTiddlers:1};for(var n in _a3){_5e(TiddlyWiki.prototype,n);}var _a5=function(){if(abego.IntelliTagger){_5e(abego.IntelliTagger,"assistTagging");}};_47();invokeLater(_4e,100);invokeLater(_a5,100);})();
//%/
//{{{
config.formatters.unshift( {
    name: "inlinesliders",
    match: "\\+\\+\\+\\+|\\<slider",
    lookaheadRegExp: /(?:\+\+\+\+|<slider) (.*?)(?:>?)\n((?:.|\n)*?)\n(?:====|<\/slider>)/mg,
    handler: function(w)
    {
        this.lookaheadRegExp.lastIndex = w.matchStart;
        var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
        if(lookaheadMatch && lookaheadMatch.index == w.matchStart )
            {
            var btn = createTiddlyButton(w.output,lookaheadMatch[1] + " "+"\u00BB",lookaheadMatch[1],this.onClickSlider,"button sliderButton");
	        var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");
	        panel.style.display = "none";
            wikify(lookaheadMatch[2],panel);
            w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
            }
    },
    onClickSlider : function(e)
    {
        if(!e) var e = window.event;
	    var n = this.nextSibling;
        n.style.display = (n.style.display=="none") ? "block" : "none";
        return false;
    }
})
//}}}
[[DIY 6 button keypad|http://joy2chord.sourceforge.net/]]
 geany /usr/sbin/petget
   
-----------------------------------
 * Midnight Commander Plus by AlienX for Puppy and modified
      by me for more recent versions.

      * Mrxvt terminal emulator (sort of like KDE's Konsole but a mini version)

      * A pocket full of scripts to open various package types.


Having the tools aren't necessary, but they make life much easier.

Here's how it goes:

I have two directories /opt/bin /opt/lib, I add most small packages
and utilities there when I can. In order for these directories to be
used as I intend I have to include them in the PATH and
LD_LIBRARY_PATH statements.

The reason for installing packages there is so I can keep track of
them. They don't get mixed in with all Puppy's other files, normally
under /usr somewhere.

Usually, I'll break the package open using MC, either with it's menu
or if there is no menu item for handling the package, I use its
command line.

Once opened, I inspect the contents in order to see what's there
and how the packager intended to install things.

MC being a two pane file manager makes it easy to copy from the
exploded package to my directories of choice. I also look at any
install scripts and readme files.

After the copying, I open another tab on mrxvt and check if the new
software runs. If I want a menu item, I will add one. I prefer to
manage the menus manually anyway.

Sometimes it works out that a couple files need to be in /usr
somewhere. In that case, I'm likely to make some notes in a
directory under /opt.

Recently I installed Medit and I found it more expedient to use the
default directories. Meaning /opt is not a hard fast rule. It depends
on the contents of the package itself.

Once you've opened the package, you can repack it as a tar.gz
designed to be run from /, which would be a simple command line
operation for installing on remote computers.

Bruce_B
[[Link|http://murga-linux.com/puppy/viewtopic.php?t=97950]]

 The following steps will add 4 keyboard shortcuts Ctrl+Alt+Left/Top/Right/Down to JWM's configuration. The code requires wmctrl to be installed. Please note that the windows will be horizontally or vertically maximized. This allows to restore them (approximately!) to their previous size. 

 Step 1: Open file /root/.jwm/jwmrc-personal with an editor 
 Step 2: Insert following lines.
 Step 3: Save jwmrc-personal 
 Step 4: Restart JWM (Menu: Shutdown > Restart JWM or from Terminal: jwm -restart) 

<Key mask="AC" key="Left"> exec:SW=$(($(cat /tmp/pup_event_frontend_scrn_x)/2));wmctrl -r :ACTIVE: -e 0,0,-1,$SW,-1; wmctrl -r :ACTIVE: -b add,maximized_vert</Key> 
 <Key mask="AC" key="Right">exec:SW=$(($(cat /tmp/pup_event_frontend_scrn_x)/2));wmctrl -r :ACTIVE: -e 0,$SW,-1,$SW,-1;wmctrl -r :ACTIVE: -b add,maximized_vert</Key> 
 <Key mask="AC" key="Up"> exec:SH=$(($(cat /tmp/pup_event_frontend_scrn_y)/2));wmctrl -r :ACTIVE: -e 0,-1,0,-1,$SH; wmctrl -r :ACTIVE: -b add,maximized_horz</Key> 
 <Key mask="AC" key="Down"> exec:SH=$(($(cat /tmp/pup_event_frontend_scrn_y)/2));wmctrl -r :ACTIVE: -e 0,-1,$SH,-1,$SH;wmctrl -r :ACTIVE: -b add,maximized_horz</Key> 

MochiMoppel wrote:	
When the mouse pointer hovers over a window, scrolling the scrollwheel will move the window contents up or down as expected. However as soon as the pointer hovers outside of the window area, the scrollwheel switches virtual desktops. This can be outright confusing for new users and still annoying for experienced users. JWM provides no option to reconfigure mouse bindings, but this behavior can be disabled with a trick.

Step 1: Edit the file /root/.jwm/jwmrc-personal. Add 2 lines:

    <JWM>
    <RootMenu onroot="4"/>
    <RootMenu onroot="5"/>

Step 2: Restart JWM 
http://www.kernel.org/
http://kernelnewbies.org/
[[Kernel Boot Parameters|http://redsymbol.net/linux-kernel-boot-parameters/3.12/]]
http://kernelnewbies.org/KernelBuild
http://www.digitalhermit.com/linux/Kernel-Build-HOWTO.html#INTRO
[[Linuxtopia|http://www.linuxtopia.org/online_books/linux_kernel/kernel_configuration/ch01s02.html]] configuration
[[Tiny|http://itmaze.com.au/articles/linux-tiny/]]
Puppy specific:
[[Installing source|http://murga-linux.com/puppy/viewtopic.php?t=42539]]

http://wiki.osdev.org/Bare_Bones
//If you use TiddlyWiki a lot, it may pay to learn these codes. The top five are essential to know. //


//~TiddlyWiki // 
;CTRL ENTER
:Closes and accepts changes to the current tiddler being edited.
;ESCAPE
:Closes and discards changes to the current tiddler being edited.

//Cut, Copy, and Paste// 
;CTRL X 
:Cut the selected text to the clipboard
;CTRL C
:Copy the selected text to the clipboard
;CTRL V
:Paste the clipboard to the current cursor position

//Undo and Redo//
;CTRL Z 
:Undo the last editing command
;CTRL Y 
:Redo the last undo command

//Navigating Text//
;HOME 
:Move cursor to the beginning of the current line
;END 
:Move the cursor to the end of the current line
;CTRL HOME 
:Move the cursor the very beginning of the current text field.
;CTRL END 
:Move the cursor to the very end of the last line of the current text field.
;PAGE UP 
:Moves the cursor up the same number of lines as is displayed in the textarea.
;PAGE DOWN 
:Moves the cursor down the same number of lines as is displayed in the textarea.
;UP ARROW 
:Move the cursor up one line to the current horizontal cursor position. If the current horizontal position doesn’t exist, the cursor will move to the end of the line.
;DOWN ARROW 
:Move the cursor down one line to the current horizontal cursor position. If the current horizontal position doesn’t exist, the cursor will move to the end of the line.
;LEFT ARROW
:Moves the cursor one character to the left.
;RIGHT ARROW 
:Moves the cursor one character to the right.
;CTRL RIGHT ARROW 
:Moves the cursor one word to the right, placing the cursor before the first letter of the next word.
;CTRL LEFT ARROW 
:Moves the cursor one word to the left, placing the cursor before the first letter of the previous word.

//Selecting Text//
;CTRL A 
:Selects everything in a text area.
;SHIFT HOME 
:Selects all text from the cursor to the beginning of the current line.
;SHIFT END 
:Selects all text from the cursor to the end of the current line.
;SHIFT CTRL HOME 
:Selects all text from the cursor the very beginning of the current text field.
;SHIFT CTRL END 
:Selects all text from the cursor to the very end of the last line of the current text field.
;SHIFT PAGE UP 
:Selects all text from the cursor up the same number of lines as is displayed in the textarea.
;SHIFT PAGE DOWN 
:Selects all text from the cursor down the same number of lines as is displayed in the textarea.
;SHIFT UP ARROW - 
:Selects all text from the cursor up one line to the current horizontal cursor position. If the current horizontal position doesn’t exist on that line, the cursor will selects all text from the end of the line.
;SHIFT DOWN ARROW 
:Selects all text from the cursor down one line to the current horizontal cursor position. If the current horizontal position doesn’t exist on that line, the cursor will Selects all text to the end of the line.
;SHIFT LEFT ARROW 
:Selects one character to the left of the cursor.
;SHIFT RIGHT ARROW 
:Selects one character to the right of the cursor.
;SHIFT CTRL RIGHT ARROW 
:Selects all characters from the cursor to the first letter of the next word.
;SHIFT CTRL LEFT ARROW 
:Selects all characters from the cursor to the first letter of the previous word.

Taken from [[Tid-Help|http://tidhelp.tiddlyspot.com/]]
http://moi.vonos.net/linux/linux-from-scratch-beyond/
http://www.linuxquestions.org/questions/linux-from-scratch-13/
/***
| Name|LessBackupsPlugin|
| Description|Intelligently limit the number of backup files you create|
| Version|3.0 ($Rev: 2320 $)|
| Date|$Date: 2007-06-18 22:37:46 +1000 (Mon, 18 Jun 2007) $|
| Source|http://mptw.tiddlyspot.com/#LessBackupsPlugin|
| Author|Simon Baird|
| Email|simon.baird@gmail.com|
| License|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!!Description
You end up with just backup one per year, per month, per weekday, per hour, minute, and second.  So total number won't exceed about 200 or so. Can be reduced by commenting out the seconds/minutes/hours line from modes array

!!!Notes
Works in IE and Firefox only.  Algorithm by Daniel Baird. IE code by by Saq Imtiaz.
!!!Code
***/
//{{{
window.getSpecialBackupPath = function(backupPath) {

	var MINS  = 60 * 1000;
	var HOURS = 60 * MINS;
	var DAYS  = 24 * HOURS;

	// comment out the ones you don't want
	var modes = [
		["YYYY",  365*DAYS], // one per year for ever
		["MMM",   31*DAYS],  // one per month
		["ddd",   7*DAYS],   // one per weekday
		//["d0DD",  1*DAYS],   // one per day of month
		["h0hh",  24*HOURS], // one per hour
		["m0mm",  1*HOURS],  // one per minute
		["s0ss",  1*MINS],   // one per second
		["latest",0]         // always keep last version. (leave this).
	];

	var now = new Date();

	for (var i=0;i<modes.length;i++) {

		// the filename we will try
		var specialBackupPath = backupPath.replace(/(\.)([0-9]+\.[0-9]+)(\.html)$/,
						'$1'+now.formatString(modes[i][0]).toLowerCase()+'$3')

		// open the file

		try {
			if (config.browser.isIE) {
				var fsobject = new ActiveXObject("Scripting.FileSystemObject")
				var fileExists  = fsobject.FileExists(specialBackupPath);
				if (fileExists) {
					var fileObject = fsobject.GetFile(specialBackupPath);
					var modDate = new Date(fileObject.DateLastModified).valueOf();
				}
			}
			else {
				netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
				var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
				file.initWithPath(specialBackupPath);
				var fileExists = file.exists();
				if (fileExists) {
					var modDate = file.lastModifiedTime;
				}
			}
		}
		catch(e) {
			// give up
			return backupPath;
		}

		// expiry is used to tell if it's an 'old' one. Eg, if the month is June and there is a
		// June file on disk that's more than an month old then it must be stale so overwrite
		// note that "latest" should be always because the expiration period is zero (see above)
		var expiry = new Date(modDate + modes[i][1]);
		if (!fileExists || now > expiry)
			return specialBackupPath;
	}
}

// hijack the core function
window.getBackupPath_orig = window.getBackupPath;
window.getBackupPath = function(localPath) {
	return getSpecialBackupPath(getBackupPath_orig(localPath));
}

//}}}
Linksys WPC54G V3
/***
|''Name:''|LoadRemoteFileThroughProxy (previous LoadRemoteFileHijack)|
|''Description:''|When the TiddlyWiki file is located on the web (view over http) the content of [[SiteProxy]] tiddler is added in front of the file url. If [[SiteProxy]] does not exist "/proxy/" is added. |
|''Version:''|1.1.0|
|''Date:''|mar 17, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#LoadRemoteFileHijack|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
***/
//{{{
version.extensions.LoadRemoteFileThroughProxy = {
 major: 1, minor: 1, revision: 0, 
 date: new Date("mar 17, 2007"), 
 source: "http://tiddlywiki.bidix.info/#LoadRemoteFileThroughProxy"};

if (!window.bidix) window.bidix = {}; // bidix namespace
if (!bidix.core) bidix.core = {};

bidix.core.loadRemoteFile = loadRemoteFile;
loadRemoteFile = function(url,callback,params)
{
 if ((document.location.toString().substr(0,4) == "http") && (url.substr(0,4) == "http")){ 
  url = store.getTiddlerText("SiteProxy", "/proxy/") + url;
 }
 return bidix.core.loadRemoteFile(url,callback,params);
}
//}}}
LINUX INSTALLATION Linux should be installed and set up by a person with reasonably "normal" vision. There is no information provided here for installation and initial large-text setup by a person with low vision. When installing RedHat, I select Custom Installation and I select the "everything" option, which requires more disk space, but ensures I have lots of applications installed. For my 17-inch monitor, I select a resolution of 800 x 600 and a color depth of 256 colors (8-bit). You may have to find your own values here. For setting up modem, ISP connection, printer, etc., I recommend the GUI tools that come with the distribution. I currently have my computer come up in a line-mode prompt (runlevel 3) from which I use the startx command to enter X Windows. XTERM The first step is getting large text in an xterm. To find out what fonts are available on my RedHat Linux system, I type xlsfonts -fn '*-*-*-*-*-*-*-*-*-*-*-m-*' (This command and a good description of font specifications is given on pages 449- 450 in the "GNU Emacs Manual," Fourteenth Edition, Version 20.7, by Richard M. Stallman. Also, there is a good font HOWTO, and man X has relevant information.) Scalable fonts--the kind that look good to me at any size--have the pattern 0-0-0-0-m-0 instead of specific numbers for pixels, height, etc. The scalable fonts can be found by themselves by typing xlsfonts -fn '*-*-*-*-*-*-*-0-0-0-0-m-0-iso8859-*' Once a suitable font is chosen, the following command will open an xterm with nearly any font size. For example, using a font of 112 xterm -fn "-adobe-courier-medium-r-normal--112-*-*-*-m-*-iso8859-1" It might be a good idea to try this now (using a font installed on your system), to see if your monitor and setup are working OK. The "virtual screen" can be moved around by "grabbing it" with the mouse, which is done by holding the alt key and the left-hand mouse button. To close this screen, you'll have to slide it to the left until you see the close button in the upper-right-hand corner. This is not a very pleasant way to move the screen for any length of time, so we'll soon move on to window managers and their configuration. Later, a script can be written to open an xterm with a font of nearly any size, by replacing 112 in the above command with the size that suits you. I have used font sizes up to 312 (which makes the letters about 3 inches high); and there is nothing special about my choice of numbers; 100, 93, 300, 277, etc. will bring up fonts of the corresponding sizes. If you want to specify the font size each time you open a large-text xterm, you can replace the 112 in the above command with $1 xterm -fn "-adobe-courier-medium-r-normal--$1-*-*-*-m-*-iso8859-1" I wrote this command in the Emacs editor and called it xxx (Emacs xxx being the command used in an xterm to get into Emacs). I have to predede xxx with a dot space when I run it, as I do with all my scripts, as explained in the Introduction. Also, for the above command, with the $1 in it, the xxx is followed by the desired font size, for example: . xxx 150 Note: There are a lot more arguments that can be specified when opening an xterm, such as foreground and background colors and location of the xterm in the monitor (xterm -geometry +0+0 -fn etc.). The -geometry +0+0 argument locates the xterm's upper-left-hand corner in the monitor's upper-left-hand corner, and seems to be necessary when using Enlightenment Configuration Shortcuts, Run Command, to bind a key to the command. I haven't needed the -geometry argument when using scripts. (For more information, use the command: "man xterm" or consult one of the many books available on Linux, some of which are listed at the end of this document.) ADDING A NEW USER At this point, it is probably best to add a new user, especially if you are going to change from the default window manager. The new window manager and its configuration can just be for that new user. The documentation for your Linux distribution can probably explain how to do this. ( For someone using RedHat 6.2, this may not be necessary.) WINDOW MANAGERS There are many window managers available for Linux. I have only tried Sawfish and Enlightenment for use with large text. SAWFISH Sawfish is the default window manager when using Gnome in RedHat 7.2. It is usable for large text, but as far as I can see, it only gives one variable for the screen moves. The variable is called "slide Pixels," and a value of 600 is a reasonable compromise. ENLIGHTENMENT Enlightenment -0.15.5-48 is my preferred window manager. With this version of Enlightenment, each up, down, right, and left move (which is bound to a key or key combination, using the shortcuts item on the configuration menu) can be given its own move value. This allows much better control of screen movement. RedHat 6.2, since it uses the preferred Enlightenment as the default in Gnome, seems more integrated; and 6.2 will probably install and run well on some older computers, as it does on my 1997, 120 MHz Pentium. CONFIGURATION To enter the Enlightenment or Sawfish configuration menu, the middle mouse button is pressed when the mouse is over a bare area of the desktop. For Enlightenment, the shortcuts submenu is chosen, and there are lots of options. The most useful of these for me have been the following: Scroll Windows by [X Y] pixels Run Command Annihilate Window Note: The large fonts seem to work best if the "Size of Virtual Screen" (in the Configuration Desktops menu) is left at the default 1x1. Also, for the "Keyboard focus follows" options (in the Configuration Basic Options menu), "Sloppy Pointer" may be the best choice. USING THE KEYBOARD (ONLY) I use the far right-hand keypad for most Shortcut bindings. I've used the following keys and corresponding X Y values for Scroll Windows: KP_Right -700 0, KP_Left 700 0, KP_Home 4900 0 (like Return or Enter for 112 font), KP_Prior (Page Up) 0 500, KP_Next (Page Down) 0 -500, KP_Up 0 100, KP_Down 0 -100, Ctl (Control Key, used as a "Modifier")KP_Right -100 0, Ctl KP_Left 100 0, Ctl KP_Prior 0 2500, Ctl KP_Next 0 -2500, Ctl KP_Home -4900 0 (moves screen from left-most edge to right-most edge, like opposite of Enter) For a font other than 112, experiment to find convenient values. For Run Command, I've used KP_Begin (5 on my keypad!) to run an xterm command, like the one mentioned above for large fonts, with a font size of 16, comfortable for my late-middle-aged eyes. I use KP_Add (+ key) for an xterm with 112-sized font. Note: Once a suitable font is found for a low-visioned user, and Scroll Windows have been given convenient X Y values, a key should be bound to Run Command, using "xterm -geomety +0+0 -fn (font info here, etc.)". This way, the user just hits a certain key or key combination to open an xterm with the chosen font. I use Delete (Del on keypad) to Annihilate Window, which is a lot more convenient than scrolling to the far upper RH corner to hit the X close window button. Note: Position the large-text window so that its upper-left-hand corner is in the monitor's upper-left-hand corner before annihilating it. Otherwise, your launching window will be "lost in virtual flatspace." For a low visioned user, this should be a GUI-less interface. This shouldn't be a problem, if a reasonably experienced Linux user is available to install Linux and set it up. With RedHat, the computer can be configured to come up in text mode or in X Windows. The login might be a little tricky for a low-visioned user, but the distinctive lack of screen activity when it's ready to accept a login would probably be recognizable. Locator dots are available to help with orientation on the keyboard. The dots are raised so they can be felt, and they have adhesive to stick onto the desired keys. XTERM APPLICATIONS As mentioned in the Introduction, this is basically an "xterm user interface." The Pine Email program, the editor Vi, the text-based Internet browser Lynx, and I would guess many other programs can be run in a large-text (or "large-font") xterm, and the programs also run with the same large font. I've used Pine this way quite a bit, and it works well, as does Lynx. However, with Lynx, the particular website has a lot to do with how well it works with a large-text xterm. I've read online English literature from www.literature.org, and I was surprised at how well www.cnn.com worked the other night when I first tried that address. The Emacs editor has to be entered a little differently. From an xterm of any sized font, "emacs" is followed by the same font info that follows the xterm command: emacs -fn "-adobe...etc. I've gone through the emacs tutorial with a font of 112, and it worked pretty well. Note: If emacs is to be used a lot, it might be best to bind the above command to a key, using Enlightenment Configuration. ISP/INTERNET CONNECTION I spent too much time struggling with text-based Internet connect/disconnect commands. What finally made it easier is using the "ps -ax | more" command before and after connecting to or disconnecting from my ISP, using the default GUI method. This let me see the command's text version. With RedHat 6.2, I found "/sbin/ppp-watch ifcfg-ppp0" to connect, and I can use killall "/sbin/ppp-watch" to disconnect. (With RedHat 6.2 I can also use "wvdial <my ISP's name> &" to connect and "killall wvdial" to disconnect.) With RedHat 7.2, I found "/sbin/ppp-watch ppp0 ifcfg-ppp0" to connect and "killall /sbin/ppp-watch" to disconnect. Note: As mentioned in the Introduction, I briefly change to root to use these commands. Also, I'm using fetchmail to retrieve my Email, and the command that I'm using is "fetchmail -p POP3 -u tdan pop.foxinternet.com," with "tdan" my username and "pop.foxinternet.com" my mail server. WHEN X FAILS Two useful commands for bailing out that work with these versions of RedHat Linux (and probably other Linux distributions) are Control Alt Delete, which gives a safe reboot from console mode, and Control Alt Backspace, which exits X Windows and returns to the console mode. Note: For a low-visioned user, Control Alt Delete will be more useful if there is a way to configure it so that the computer halts after the shutdown, instead of rebooting. This may be possible, but I haven't worked on it yet. I'm currently using "/sbin/shutdown -h now" to shutdown the computer from an xterm window. As mentioned in the Introduction, I have to be in root to do this, as I also have to be in root to connect to or disconnect from my ISP. I only stay in root for long enough to do these tasks, because being in root when not necessary is risky and not recommended. ADDITIONAL ISSUES These methods are meant to be independent of mouse and GUI, but if the mouse pointer is out of the xterm window, "focus," or use of the window may be temporarily lost. There may be ways to deal with this using Enlightenment Configuration, or creating a large, visible pointer, or perhaps just clamping the mouse roller so that the pointer is always positioned in an unobtrusive corner of the screen. However, this is something I haven't experimented enough with. What would really be nice, if possible, would be converting a joystick to a two-axis foot rocker and programming it for right, left, up, down, scrolling ("virtual screen" movement). This would leave the hands free for normal keyboard typing. The electro-mechanical aspect seems doable, but I don't know what kind of drivers and software exist for using joysticks with Linux for scrolling. Keeping track of the much more visible, rectangular text cursor, especially when writing, takes getting used to. It follows the text being entered and carriage returns (Enter key), not screen moves. One more thing that should probably be mentioned are the error messages that seem to follow use of large-text xterms. They don't seem to correspond to any serious problems on my computer, but they might cause concern to the person setting up a low-vision Linux system. A low-visioned user might not see them, as they often are in a standard font size, as are the normal messages that appear as the computer is booting up. Note: On further consideration, these error messages seem to appear when starting a large-text xterm from another xterm and then returning to the original xterm. If the low-visioned user has a key bound to the large-text xterm command, and then runs Email, Lynx, Vi, etc. from thant terminal, there probably won't be error messages. SOURCES "The Concise Guide to XFree86 for Linux," by Aron Hsiao, c. 2000, Que Corporation "The Joy of X," by Niall Mansfield, c. 1993, Addison-Wesley "Linux Programmer's Reference, Second Edition," by Richard Petersen, c. 2000, Osborne/McGraw-Hill "Red Hat Linux: The Complete Reference," by Richard Petersen, c. 2000, Osborne/McGraw-Hill "GNU Emacs Manual, 14th Edition, Version 20.7," by Richard Stallman, c. 2000, Free Software Foundation, Inc. "The Linux Problem Solver," by Brian Ward, c. 2000, No Starch Press Also, there are lots of relevant man pages, on-line documents, HOWTOs, etc.

Source: [['[Kde-accessibility] Low Vision HOWTO: Draft' - MARC|http://lists.kde.org/?l=kde-accessibility&m=102676338828673&w=2]]
[[Quickies]]
[[General]]
[[Downloads]]
[[Window Managers]]
[[CLI]]
[[MonkeyPirateTiddlyWiki|http://mptw.tiddlyspot.com]] is a distribution of [[TiddlyWiki|http://www.tiddlywiki.com/]] created by Simon Baird. See [[the web site|http://mptw.tiddlyspot.com/]] for more information.
!!Upgrading ~MonkeyPirateTiddlyWiki
This "empty" ~MonkeyPirateTiddlyWiki file comes pre-installed with the core ~MonkeyPirateTiddlyWiki plugins. You can upgrade these core plugins to the latest version by doing the following:
* Click ImportTiddlers
* Click "Choose..." and select "~MptwUpgradeURL"
* Click "open"
* Click the checkbox in the first column heading to select all tiddlers
* Click "More actions..." and select "Import these tiddlers"
* Click "OK" to confirm you want to overwrite the tiddlers
* Save and reload
A short mounting How-To:                                                   
When it comes to mounting devices with Puppy Linux, the sky is the limit.

I'll show some examples of how i do it sometimes. I run probepart, I get an output like this:
/dev/hdc|iso9660|0|PLEXTOR CD-R PX-W2410A
/dev/hda1|vfat|1863477|Win95 FAT32
/dev/hda2|swap|273105|Linux Swap
/dev/hda3|ext2|8032500|Linux Ext2Fs
/dev/hda4|none|6329610|Win98 Extended (LBA)
/dev/hda5|ext2|1863477|Linux Ext2Fs
/dev/hda6|ext2|4466007|Linux Ext2Fs
/dev/scd0|iso9660|0|PLEXTOR CD-R PX-W2410A

There are some partitions one does not want to mount:

    * the Linux Swap
    * the Extended partion
    * the 'home' partition

probepart doesn't tell which is home, or what is mounted. it just tells you whatcha got.

If you don't know which the home partition is, find out by running mount. This is my output:
rootfs on / type rootfs (rw)
tmpfs on / type tmpfs (rw)
none on /proc type proc (rw)
none on /dev/pts type devpts (rw)
/dev/hda3 on /mnt/home type ext2 (rw)
/dev/loop1 on /root type ext2 (rw)
/dev/loop0 on /usr type squashfs (ro)
none on /usr type unionfs (rw,dirs=/root/.usr=rw:/usr=ro,debug=0,err=tryleft,delete=all,copyup=preserve,setattr=left)
/dev/hda1 on /mnt/hda1 type vfat (rw)
/dev/hda5 on /mnt/hda5 type ext2 (rw)
/dev/hda6 on /mnt/hda6 type ext2 (rw)

Note that home is hda3, it is already mounted on /mnt/home, so you don't need to concern yourself with this.

You can make a script file to mount your other partitions. This is what I'll show you how to do.

Taking the information I gathered from mount and probepart, I want to mount hda1 hda5 hda6, I'll call the script file /root/my-applications/bin/mhd
Code:
#!/bin/sh
# I can make my own mount points
mkdir /mnt/dos
mount -t vfat /dev/hda1 /mnt/dos
# I can also use the predefind ones as shown below
mount -t ext2 /dev/hda5 /mnt/linux2
mount -t ext2 /dev/hda6 /mnt/linux3

Before I reboot the computer, I need to unmount the devices, so I make another script to unmount the devices. I'll call it /root/my-applications/bin/uhd

Code:
#!/bin/sh
umount /mnt/dos
umount /mnt/linux2
umount /mnt/linux3

In order for the scripts to be executable, the file properties need to be set. I generally use 755 (owner=rwx, group=rx, other=rx).

# chmod 755 /root/my-applications/bin/?hd

I hope this helps. And as you know, there are many valid ways to mount devices. This is just one of many.

You can run these scripts on the command line, make shortcuts on the desktop with Rox, or make menu items for them.
Virtual Drives

Linux in general (and Puppy, in particular) has a program called losetup (losetup-FULL in Puppy... BusyBox legacy) which allows Linux filesystems (for example ext2, ext3, etc) that are created in files to be mounted as a 'virtual (block) device'. This means you can access an entire filesystem by simply copying it into a file (see elsewhere). That file can then be mounted and accessed on another mount point, like /mnt/linux3.

From BarryK ...

In the case of Puppy, /sbin/losetup is Busybox's losetup. It seems buggy, as it only properly handles /dev/loop0 and loop1. /bin/losetup-FULL is the full losetup program, which works fine. There is a convention in how Puppy uses/allocates the /dev/loop* devices:
/dev/loop0
This is reserved for usr_cram.fs to mount on /.usr_cram

/dev/loop1
This is reserved for the pupxxx file to mount on /root

/dev/loop2
This is used by various scripts in Puppy. So, it is normally available. A script should use it, then release it.

/dev/loop3
This is reserved for use by usr_devx.sfs to mount on /.usr_devx.

/dev/loop4
This is reserved for usr_more.sfs to mount on /.usr_more.

This means /dev/loop2 is normally available, and loops 5+ are available. (...except that the /dev/loop5 through /dev/loop8 don't exist in Puppy v1.0.5 and as they're block special files, they need to be created... with... what?...)

For further info on loopback devices and how they're used, have a read of
http://www.ibiblio.org/pub/linux/docs/linux-doc-project/archived/linuxdoc/Loopback-Root-FS.sgml∞.

Source [[Wikka archives|http://www.puppylinux.org/wiki/archives/old-wikka-wikki/categorydocumentation/mounting]]
-----------------------------
...and also from the section on [[Shell scripts |http://www.puppylinux.org/wiki/archives/old-wikka-wikki/categorydocumentation/shellscriptsexamples]] 
SquashFS (readonly)
mount /dev/hda1 /mnt/temp -t squashfs

Ext2/Ext3
mount /dev/hda1 /mnt/temp

ISO (readonly)
mount -r file.iso /mnt/cdrom -t iso9660 -o loop

Shared Drive
smbmount \\\\192.168.1.1\\c$ /mnt/tmp -o username=YourUsername password=

Shared Drive Unmount
smbumount /mnt/tmp

Image.gz
gzip -d image.gz
mount image /mnt/temp -o loop

initrd.gz
gzip -d initrd.gz
mount initrd /mnt/temp -o loop

usr_cram.fs
mount usr_cram.fs /mnt/temp -t squashfs -o loop

pup_save.3fs
mount pup_save.3fs /mnt/temp -o loop

pup_save.2fs
mount pup_save.2fs /mnt/temp -o loop

pup_xxx.sfs
mount pup_xxx.sfs /mnt/temp -t squashfs -o loop

Unmount /mnt/yourpath
umount /mnt/yourpath
/***
| Name|MptwLayoutPlugin|
| Description|A package containing templates and css for the MonkeyPirateTiddlyWiki layout|
| Version|3.0 ($Rev: 2721 $)|
| Source|http://mptw.tiddlyspot.com/#MptwLayoutPlugin|
| Author|Simon Baird <simon.baird@gmail.com>|
| License|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
Presumes you have TagglyTaggingPlugin installed. To enable this you should have a PageTemplate containing {{{[[MptwPageTemplate]]}}} and similar for ViewTemplate and EditTemplate.
***/
//{{{
// used in MptwViewTemplate
config.mptwDateFormat = 'DD/MM/YY';
config.mptwJournalFormat = 'Journal DD/MM/YY';
//config.mptwDateFormat = 'MM/0DD/YY';
//config.mptwJournalFormat = 'Journal MM/0DD/YY';

config.shadowTiddlers.GettingStarted += "\n\nSee also MonkeyPirateTiddlyWiki.";

merge(config.annotations,{
	MptwEditTemplate: "Contains the default MPTW EditTemplate. If you want to customise this rename it to EditTemplate",
	MptwViewTemplate: "Contains the default MPTW ViewTemplate. If you want to customise this rename it to ViewTemplate",
	MptwPageTemplate: "Contains the default MPTW PageTemplate. If you want to customise this rename it to PageTemplate",
	MptwStyleSheet:   "Contains the default MPTW ~StyleSheet. Designed to be included in StyleSheet tiddler using the double square bracketted notation like this: {{{[[MptwStyleSheet]]}}}"
});

//}}}

//{{{
merge(config.shadowTiddlers,{

'MptwEditTemplate':[
 "<!--{{{-->",
 "<!--- http://mptw.tiddlyspot.com/#MptwEditTemplate ($Rev: 2720 $) --->",
 "<div class=\"toolbar\" macro=\"toolbar +saveTiddler saveCloseTiddler closeOthers -cancelTiddler cancelCloseTiddler deleteTiddler\"></div>",
 "<div class=\"title\" macro=\"view title\"></div>",
 "<div class=\"editLabel\">Title</div><div class=\"editor\" macro=\"edit title\"></div>",
 "<div macro='annotations'></div>",
 "<div macro=\"showWhenExists EditPanelTemplate\">[[EditPanelTemplate]]</div>",
 "<div class=\"editLabel\">Content</div><div class=\"editor\" macro=\"edit text\"></div>",
 "<div class=\"editLabel\">Tags</div><div class=\"editor\" macro=\"edit tags\"></div>",
 "<div class=\"editorFooter\"><span macro=\"message views.editor.tagPrompt\"></span><span macro=\"tagChooser\"></span></div>",
 "<!--}}}-->"
].join("\n"),

'MptwPageTemplate':[
 "<!--{{{-->",
 "<!-- http://mptw.tiddlyspot.com/#MptwPageTemplate ($Rev: 1829 $) -->",
 "<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>",
 "	<div class='headerShadow'>",
 "		<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;",
 "		<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>",
 "	</div>",
 "	<div class='headerForeground'>",
 "		<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;",
 "		<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>",
 "	</div>",
 "</div>",
 "<!-- horizontal MainMenu -->",
 "<div id='topMenu' refresh='content' tiddler='MainMenu'></div>",
 "<!-- original MainMenu menu -->",
 "<!-- <div id='mainMenu' refresh='content' tiddler='MainMenu'></div> -->",
 "<div id='sidebar'>",
 "	<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>",
 "	<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>",
 "</div>",
 "<div id='displayArea'>",
 "	<div id='messageArea'></div>",
 "	<div id='tiddlerDisplay'></div>",
 "</div>",
 "<!--}}}-->"
].join("\n"),

'MptwStyleSheet':[
 "/*{{{*/",
 "/* http://mptw.tiddlyspot.com/#MptwStyleSheet ($Rev: 2720 $) */",
 "",
 "/* a contrasting background so I can see where one tiddler ends and the other begins */",
 "body {",
 "	background: [[ColorPalette::TertiaryLight]];",
 "}",
 "",
 "/* sexy colours and font for the header */",
 ".headerForeground {",
 "	color: [[ColorPalette::PrimaryPale]];",
 "}",
 ".headerShadow, .headerShadow a {",
 "	color: [[ColorPalette::PrimaryMid]];",
 "}",
 "",
 "/* separate the top menu parts */",
 ".headerForeground, .headerShadow {",
 "	padding: 1em 1em 0;",
 "}",
 "",
 ".headerForeground, .headerShadow {",
 "	font-family: 'Trebuchet MS' sans-serif;",
 "	font-weight:bold;",
 "}",
 ".headerForeground .siteSubtitle {",
 "	color: [[ColorPalette::PrimaryLight]];",
 "}",
 ".headerShadow .siteSubtitle {",
 "	color: [[ColorPalette::PrimaryMid]];",
 "}",
 "",
 "/* make shadow go and down right instead of up and left */",
 ".headerShadow {",
 "	left: 1px;",
 "	top: 1px;",
 "}",
 "",
 "/* prefer monospace for editing */",
 ".editor textarea, .editor input {",
 "	font-family: 'Consolas' monospace;",
 "	background-color:[[ColorPalette::TertiaryPale]];",
 "}",
 "",
 "",
 "/* sexy tiddler titles */",
 ".title {",
 "	font-size: 250%;",
 "	color: [[ColorPalette::PrimaryLight]];",
 "	font-family: 'Trebuchet MS' sans-serif;",
 "}",
 "",
 "/* more subtle tiddler subtitle */",
 ".subtitle {",
 "	padding:0px;",
 "	margin:0px;",
 "	padding-left:0.5em;",
 "	font-size: 90%;",
 "	color: [[ColorPalette::TertiaryMid]];",
 "}",
 ".subtitle .tiddlyLink {",
 "	color: [[ColorPalette::TertiaryMid]];",
 "}",
 "",
 "/* a little bit of extra whitespace */",
 ".viewer {",
 "	padding-bottom:3px;",
 "}",
 "",
 "/* don't want any background color for headings */",
 "h1,h2,h3,h4,h5,h6 {",
 "	background: [[ColorPalette::Background]];",
 "	color: [[ColorPalette::Foreground]];",
 "}",
 "",
 "/* give tiddlers 3d style border and explicit background */",
 ".tiddler {",
 "	background: [[ColorPalette::Background]];",
 "	border-right: 2px [[ColorPalette::TertiaryMid]] solid;",
 "	border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;",
 "	margin-bottom: 1em;",
 "	padding:1em 2em 2em 1.5em;",
 "}",
 "",
 "/* make options slider look nicer */",
 "#sidebarOptions .sliderPanel {",
 "	border:solid 1px [[ColorPalette::PrimaryLight]];",
 "}",
 "",
 "/* the borders look wrong with the body background */",
 "#sidebar .button {",
 "	border-style: none;",
 "}",
 "",
 "/* this means you can put line breaks in SidebarOptions for readability */",
 "#sidebarOptions br {",
 "	display:none;",
 "}",
 "/* undo the above in OptionsPanel */",
 "#sidebarOptions .sliderPanel br {",
 "	display:inline;",
 "}",
 "",
 "/* horizontal main menu stuff */",
 "#displayArea {",
 "	margin: 1em 15.7em 0em 1em; /* use the freed up space */",
 "}",
 "#topMenu br {",
 "	display: none;",
 "}",
 "#topMenu {",
 "	background: [[ColorPalette::PrimaryMid]];",
 "	color:[[ColorPalette::PrimaryPale]];",
 "}",
 "#topMenu {",
 "	padding:2px;",
 "}",
 "#topMenu .button, #topMenu .tiddlyLink, #topMenu a {",
 "	margin-left: 0.5em;",
 "	margin-right: 0.5em;",
 "	padding-left: 3px;",
 "	padding-right: 3px;",
 "	color: [[ColorPalette::PrimaryPale]];",
 "	font-size: 115%;",
 "}",
 "#topMenu .button:hover, #topMenu .tiddlyLink:hover {",
 "	background: [[ColorPalette::PrimaryDark]];",
 "}",
 "",
 "/* make 2.2 act like 2.1 with the invisible buttons */",
 ".toolbar {",
 "	visibility:hidden;",
 "}",
 ".selected .toolbar {",
 "	visibility:visible;",
 "}",
 "",
 "/* experimental. this is a little borked in IE7 with the button ",
 " * borders but worth it I think for the extra screen realestate */",
 ".toolbar { float:right; }",
 "",
 "/* Tagger Plugin users uncomment this.  from sb56637 */",
 "/*",
 ".popup li a {",
 "   display:inline;",
 "}",
 "*/",
 "",
 "/* make it print a little cleaner */",
 "@media print {",
 "	#topMenu {",
 "		display: none ! important;",
 "	}",
 "	/* not sure if we need all the importants */",
 "	.tiddler {",
 "		border-style: none ! important;",
 "		margin:0px ! important;",
 "		padding:0px ! important;",
 "		padding-bottom:2em ! important;",
 "	}",
 "	.tagglyTagging .button, .tagglyTagging .hidebutton {",
 "		display: none ! important;",
 "	}",
 "	.headerShadow {",
 "		visibility: hidden ! important;",
 "	}",
 "	.tagglyTagged .quickopentag, .tagged .quickopentag {",
 "		border-style: none ! important;",
 "	}",
 "	.quickopentag a.button, .miniTag {",
 "		display: none ! important;",
 "	}",
 "}",
 "/*}}}*/"
].join("\n"),

'MptwViewTemplate':[
 "<!--{{{-->",
 "<!--- http://mptw.tiddlyspot.com/#MptwViewTemplate ($Rev: 2247 $) --->",
 "",
 "<div class='toolbar'>",
 "	<span macro=\"showWhenTagged systemConfig\">",
 "		<span macro=\"toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'\"></span>",
 "	</span>",
 "	<span macro=\"showWhenTagged palette\">",
 "		<span macro=\"setPalette\"></span>",
 "	</span>",
 "	<span style=\"padding:1em;\"></span>",
 "	<span macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler > fields syncing permalink references jump'></span> <span macro='newHere label:\"new here\"'></span>",
 "	<span macro='newJournalHere {{config.mptwJournalFormat?config.mptwJournalFormat:\"MM/0DD/YY\"}}'></span>",
 "</div>",
 "",
 "<div class=\"tagglyTagged\" macro=\"tags\"></div>",
 "",
 "<div class='titleContainer'>",
 "	<span class='title' macro='view title'></span>",
 "	<span macro=\"miniTag\"></span>",
 "</div>",
 "",
 "<div class='subtitle'>",
 "	<span macro='view modifier link'></span>,",
 "	<span macro='view modified date {{config.mptwDateFormat?config.mptwDateFormat:\"MM/0DD/YY\"}}'></span>",
 "	(<span macro='message views.wikified.createdPrompt'></span>",
 "	<span macro='view created date {{config.mptwDateFormat?config.mptwDateFormat:\"MM/0DD/YY\"}}'></span>)",
 "</div>",
 "",
 "<div macro=\"showWhenExists ViewPanelTemplate\">[[ViewPanelTemplate]]</div>",
 "",
 "<div macro=\"hideWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')\">",
 "	<div class='viewer' macro='view text wikified'></div>",
 "</div>",
 "<div macro=\"showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')\">",
 "	<div class='viewer'><pre macro='view text'></pre></div>",
 "</div>",
 "",
 "<div macro=\"showWhenExists ViewDashboardTemplate\">[[ViewDashboardTemplate]]</div>",
 "",
 "<div class=\"tagglyTagging\" macro=\"tagglyTagging\"></div>",
 "",
 "<!--}}}-->"
].join("\n")

});
//}}}
For upgrading directly from tiddlyspot. See [[ImportTiddlers]].
URL: /proxy/mptw.tiddlyspot.com/upgrade.html
For upgrading. See [[ImportTiddlers]].
URL: http://mptw.tiddlyspot.com/upgrade.html
Mrxvt.bottomTabbar:             False
Mrxvt.autohideTabbar:           True
Mrxvt.minVisibleTabs:           8
Mrxvt.hideButtons:              True
Mrxvt.syncTabTitle:             True
Mrxvt.highlightTabOnBell:       True
Mrxvt.itabBackground:           #101010
Mrxvt.tabBackground:            #000000
Mrxvt.itabForeground:           #909090
Mrxvt.tabForeground:            #9a9a9a
Mrxvt.scrollBar:                false
Mrxvt.scrollbarRight:           true
Mrxvt.scrollbarStyle:           rxvt
Mrxvt.saveLines:                5000
Mrxvt.scrollTtyOutputInhibit:   true
Mrxvt.scrollTtyKeypress:        true
Mrxvt.scrollColor:              #808080
Mrxvt.troughColor:              #202020
Mrxvt.geometry:                 148x60
Mrxvt.transparent:              True
Mrxvt.transparentScrollbar:     True
Mrxvt.transparentTabbar:        True
Mrxvt.transparentMenubar:       False
Mrxvt.tintColor:                #000000
Mrxvt.shading:                  75
Mrxvt.xft:                      0
Mrxvt.font:                     -nil-profont-medium-r-normal--0-0-72-72-c-0-iso8859-1
Mrxvt.veryBoldFont:             0
Mrxvt.cursorBlink:              true
Mrxvt.cursorColor:              #00ff00
Mrxvt.cursorColor2:             #000000
Mrxvt.background:               #000000
#Mrxvt.foreground:              #9a9a9a
Mrxvt.foreground:               #ffffff
Mrxvt.color0:                   #000000
Mrxvt.color1:                   #af0000
Mrxvt.color2:                   #00af00
Mrxvt.color3:                   #afaf00
Mrxvt.color4:                   #0000af
Mrxvt.color5:                   #af00af
Mrxvt.color6:                   #00afaf
Mrxvt.color7:                   #9a9a9a
Mrxvt.color8:                   #5f5f5f
Mrxvt.color9:                   #d70000
Mrxvt.color10:                  #00d700
Mrxvt.color11:                  #d7d700
Mrxvt.color12:                  #0000d7
Mrxvt.color13:                  #d700d7
Mrxvt.color14:                  #00d7d7
Mrxvt.color15:                  #d7d7d7
# Mrxvt.termName:               xterm
Mrxvt.tabTitle:                 mrxvt
Mrxvt.cutChars:                 :=/~#@?%&_-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0abcdefghijklmnopqrstuvwxyz
Mrxvt.pointerBlank:             True
Mrxvt.pointerBlankDelay:        10
Mrxvt.protectSecondary:         True
Mrxvt.loginShell:               True
Mrxvt.sessionMgt:               True      
[[Murga projects|http://www.murga-projects.com/murgaLua/index.html]]
[[Programming in Lua|http://www.lua.org/pil/]]
[[FLTK manual|http://www.murga-projects.com/murgaLua/fltk/index.html]]
[[Lua-speak|http://lua-espeak.luaforge.net/manual.html]]
[[ONLamp |http://www.onlamp.com/pub/a/onlamp/2006/02/16/introducing-lua.html]]
/***
|''Name:''|NavigationMacro|
|''Description:''|Create next and previous buttons between tiddlers|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Source:''|http://tw.lewcid.org/#NavigationMacro|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.0|
|''Date:''||
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.2|
!!Usage:
* Add the macro to the ViewTemplate, specifying the tiddlers to navigate between.
** Below the line: {{{<div class='viewer' macro='view text wikified'></div>}}}<br>add: <br> {{{<div class='viewer' macro='navigation tiddlers:[[Tiddler1 Tiddler2 Tiddler3]]'></div>}}}
* Note the tiddlers parameter that lists the tiddlers and their order, to navigate between.
* Alternatively you can use an evaluated parameter to provide an array of tiddlers or tiddler titles.
** Example: {{{tiddlers:{{store.getTaggedTiddlers("Lewcid","title");}}}}}

!!Example:
[[Demo|NavigationDemo1]]
***/
// /%
//!BEGIN-PLUGIN-CODE
resolveTitle = function(t)
{
	if (t instanceof Tiddler) t = t.title;
	return store.tiddlerExists(t) ? t : null;
};

config.macros.navigation = {};
config.macros.navigation.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	if (!store.tiddlerExists(tiddler.title))
			return false;
	var e = createTiddlyElement(place,"span",null,"nav");
	e.setAttribute("refresh","macro");
	e.setAttribute("macroName",macroName);
	e.setAttribute("params",paramString);
	e.setAttribute("tiddler",tiddler.title);
	this.refresh(e,paramString);
};

config.macros.navigation.refresh = function(place,params)
{
	var tiddler = store.getTiddler(place.getAttribute("tiddler"));
	var params = place.getAttribute("params").parseParams("tiddlers",null,true);
	removeChildren(place);
	var tiddlers = getParam(params,"tiddlers",undefined);
	if (typeof tiddlers == 'string')
		tiddlers = tiddlers.readBracketedList();
	if (tiddlers == undefined)
		alert("no source tiddlers defined for navigation");
	var contents = [];
	for (var i=0;i<tiddlers.length;i++)
		{
		var title = resolveTitle(tiddlers[i]);
		contents.push(title);
		}
	var navIndex = contents.indexOf(tiddler.title);
	if (navIndex == -1)
		return false;
	if (contents[navIndex-1])
		{
		wikify("[[<< Previous|"+contents[navIndex-1]+"]]",place);
		place.lastChild.className += " navPrev";
		}
	if (contents[navIndex+1])
		{
		wikify("[[Next >>|"+contents[navIndex+1]+"]]",place);
		place.lastChild.className += " navNext";
		}
	var theTable = createTiddlyElement(place,"table",null,"nav");
	var theBody = createTiddlyElement(theTable,"tbody");
	var theRow = createTiddlyElement(theBody,"tr");
	for (var j=0; j<contents.length; j++)
		{
		var box = createTiddlyElement(theRow,"td",null,"navlinkcell"," ");
		box.onclick = onClickTiddlerLink;
		box.setAttribute("tiddlyLink",contents[j]);
		box.title = (contents[j]);
		if (contents[j] ==tiddler.title)
		   box.className += " activenav";
		}
};

setStylesheet(
	".navNext {float:right;font-family:'Courier New',Courier,monospace;}\n"+
	".navPrev, .navPrevious{float:left;font-family:'Courier New',Courier,monospace;}\n"+
	".nav .tiddlyLink  {color:#000; background:transparent;border:none;padding:0;margin:0;}\n"+
	".nav {padding:0;margin:0;}\n"+
	".viewer .nav table {margin:0 auto !important; border:0px solid #000;padding:0;border-collapse:separate;}\n"+
	".viewer .nav table tr{padding:0; margin:0;border-spacing: 1px;}\n"+
	".viewer .nav table td {padding:4px; border:1px solid #000; border-spacing: 0px;cursor:pointer;cursor:hand}\n"+
	".viewer .nav .activenav{background:#000 !important;}\n","NavigationPluginStyles");
//!END-PLUGIN-CODE
// %/
/***
|''Name:''|NestedSlidersPlugin|
|''Source:''|http://www.TiddlyTools.com/#NestedSlidersPlugin|
|''Author:''|Eric Shulman - ELS Design Studios|
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|''~CoreVersion:''|2.0.10|

Quickly make any tiddler content into an expandable 'slider' panel, without needing to create a separate tiddler to contain the slider content.  Optional syntax allows ''default to open'', ''custom button label/tooltip'' and ''automatic blockquote formatting.''

You can also 'nest' these sliders as deep as you like (see complex nesting example below), so that expandable 'tree-like' hierarchical displays can be created.  This is most useful when converting existing in-line text content to create in-line annotations, footnotes, context-sensitive help, or other subordinate information displays.

For more details, please click on a section headline below:
++++!!!!![Configuration]>
Debugging messages for 'lazy sliders' deferred rendering:
<<option chkDebugLazySliderDefer>> show debugging alert when deferring slider rendering
<<option chkDebugLazySliderRender>> show debugging alert when deferred slider is actually rendered
===
++++!!!!![Usage]>
When installed, this plugin adds new wiki syntax for embedding 'slider' panels directly into tiddler content.  Use {{{+++}}} and {{{===}}} to delimit the slider content.  Additional optional syntax elements let you specify
*default to open
*cookiename
*heading level
*floater (with optional CSS width value)
*mouse auto rollover
*custom class/label/tooltip/accesskey
*automatic blockquote
*deferred rendering
The complete syntax, using all options, is:
//{{{
++++(cookiename)!!!!!^width^*{{class{[label=key|tooltip]}}}>...
content goes here
===
//}}}
where:
* {{{+++}}} (or {{{++++}}}) and {{{===}}}^^
marks the start and end of the slider definition, respectively.  When the extra {{{+}}} is used, the slider will be open when initially displayed.^^
* {{{(cookiename)}}}^^
saves the slider opened/closed state, and restores this state whenever the slider is re-rendered.^^
* {{{!}}} through {{{!!!!!}}}^^
displays the slider label using a formatted headline (Hn) style instead of a button/link style^^
* {{{^width^}}} (or just {{{^}}})^^
makes the slider 'float' on top of other content rather than shifting that content downward.  'width' must be a valid CSS value (e.g., "30em", "180px", "50%", etc.).  If omitted, the default width is "auto" (i.e., fit to content)^^
* {{{*}}}^^
automatically opens/closes slider on "rollover" as well as when clicked^^
* {{{{{class{[label=key|tooltip]}}}}}}^^
uses custom label/tooltip/accesskey.  {{{{{class{...}}}}}}, {{{=key}}} and {{{|tooltip}}} are optional.  'class' is any valid CSS class name, used to style the slider label text.  'key' must be a ''single letter only''.  Default labels/tootips are: ">" (more) and "<" (less), with no default access key assignment.^^
* {{{">"}}} //(without the quotes)//^^
automatically adds blockquote formatting to slider content^^
* {{{"..."}}} //(without the quotes)//^^
defers rendering of closed sliders until the first time they are opened.  //Note: deferred rendering may produce unexpected results in some cases.  Use with care.//^^

//Note: to make slider definitions easier to read and recognize when editing a tiddler, newlines immediately following the {{{+++}}} 'start slider' or preceding the {{{===}}} 'end slider' sequence are automatically supressed so that excess whitespace is eliminated from the output.//
===
++++!!!!![Examples]>
simple in-line slider: 
{{{
+++
   content
===
}}}
+++
   content
===
----
use a custom label and tooltip: 
{{{
+++[label|tooltip]
   content
===
}}}
+++[label|tooltip]
   content
===
----
content automatically blockquoted: 
{{{
+++>
   content
===
}}}
+++>
   content
===
----
all options combined //(default open, cookie, heading, sized floater, rollover, class, label/tooltip/key, blockquoted, deferred)//
{{{
++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...
   content
===
}}}
++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...
   content
===
----
complex nesting example:
{{{
+++^[get info...=I|click for information or press Alt-I]
   put some general information here, plus a floating slider with more specific info:
   +++^10em^[view details...|click for details]
      put some detail here, which could include a rollover with a +++^25em^*[glossary definition]explaining technical terms===
   ===
===
}}}
+++^[get info...=I|click for information or press Alt-I]
   put some general information here, plus a floating slider with more specific info:
   +++^10em^[view details...|click for details]
      put some detail here, which could include a rollover with a +++^25em^*[glossary definition]explaining technical terms===
   ===
===
===
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''NestedSlidersPlugin'' (tagged with <<tag systemConfig>>)
<<<
!!!!!Revision History
<<<
''2006.07.28 - 2.0.0'' added custom class syntax around label/tip/key syntax: {{{{{classname{[label=key|tip]}}}}}}
''2006.07.25 - 1.9.3'' when parsing slider, save default open/closed state in button element, then in onClickNestedSlider(), if slider state matches saved default, instead of saving cookie, delete it.  Significantly reduces the 'cookie overhead' when default slider states are used.
''2006.06.29 - 1.9.2'' in onClickNestedSlider(), when setting focus to first control, skip over type="hidden"
''2006.06.22 - 1.9.1'' added panel.defaultPanelWidth to save requested panel width, even after resizing has changed the style value
''2006.05.11 - 1.9.0'' added optional '^width^' syntax for floating sliders and '=key' syntax for setting an access key on a slider label
''2006.05.09 - 1.8.0'' in onClickNestedSlider(), when showing panel, set focus to first child input/textarea/select element
''2006.04.24 - 1.7.8'' in adjustSliderPos(), if floating panel is contained inside another floating panel, subtract offset of containing panel to find correct position
''2006.02.16 - 1.7.7'' corrected deferred rendering to account for use-case where show/hide state is tracked in a cookie
''2006.02.15 - 1.7.6'' in adjustSliderPos(), ensure that floating panel is positioned completely within the browser window (i.e., does not go beyond the right edge of the browser window)
''2006.02.04 - 1.7.5'' add 'var' to unintended global variable declarations to avoid FireFox 1.5.0.1 crash bug when assigning to globals
''2006.01.18 - 1.7.4'' only define adjustSliderPos() function if it has not already been provided by another plugin.  This lets other plugins 'hijack' the function even when they are loaded first.
''2006.01.16 - 1.7.3'' added adjustSliderPos(place,btn,panel,panelClass) function to permit specialized logic for placement of floating panels.  While it provides improved placement for many uses of floating panels, it exhibits a relative offset positioning error when used within *nested* floating panels.  Short-term workaround is to only adjust the position for 'top-level' floaters.
''2006.01.16 - 1.7.2'' added button property to slider panel elements so that slider panel can tell which button it belongs to.  Also, re-activated and corrected animation handling so that nested sliders aren't clipped by hijacking Slider.prototype.stop so that "overflow:hidden" can be reset to "overflow:visible" after animation ends
''2006.01.14 - 1.7.1'' added optional "^" syntax for floating panels.  Defines new CSS class, ".floatingPanel", as an alternative for standard in-line ".sliderPanel" styles.
''2006.01.14 - 1.7.0'' added optional "*" syntax for rollover handling to show/hide slider without requiring a click (Based on a suggestion by tw4efl)
''2006.01.03 - 1.6.2'' When using optional "!" heading style, instead of creating a clickable "Hn" element, create an "A" element inside the "Hn" element.  (allows click-through in SlideShowPlugin, which captures nearly all click events, except for hyperlinks)
''2005.12.15 - 1.6.1'' added optional "..." syntax to invoke deferred ('lazy') rendering for initially hidden sliders
removed checkbox option for 'global' application of lazy sliders
''2005.11.25 - 1.6.0'' added optional handling for 'lazy sliders' (deferred rendering for initially hidden sliders)
''2005.11.21 - 1.5.1'' revised regular expressions: if present, a single newline //preceding// and/or //following// a slider definition will be suppressed so start/end syntax can be place on separate lines in the tiddler 'source' for improved readability.  Similarly, any whitespace (newlines, tabs, spaces, etc.) trailing the 'start slider' syntax or preceding the 'end slider' syntax is also suppressed.
''2005.11.20 - 1.5.0'' added (cookiename) syntax for optional tracking and restoring of slider open/close state
''2005.11.11 - 1.4.0'' added !!!!! syntax to render slider label as a header (Hn) style instead of a button/link style
''2005.11.07 - 1.3.0'' removed alternative syntax {{{(((}}} and {{{)))}}} (so they can be used by other
formatting extensions) and simplified/improved regular expressions to trim multiple excess newlines
''2005.11.05 - 1.2.1'' changed name to NestedSlidersPlugin
more documentation
''2005.11.04 - 1.2.0'' added alternative character-mode syntax {{{(((}}} and {{{)))}}}
tweaked "eat newlines" logic for line-mode {{{+++}}} and {{{===}}} syntax
''2005.11.03 - 1.1.1'' fixed toggling of default tooltips ("more..." and "less...") when a non-default button label is used
code cleanup, added documentation
''2005.11.03 - 1.1.0'' changed delimiter syntax from {{{(((}}} and {{{)))}}} to {{{+++}}} and {{{===}}}
changed name to EasySlidersPlugin
''2005.11.03 - 1.0.0'' initial public release
<<<
!!!!!Credits
<<<
This feature was implemented by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]] with initial research and suggestions from RodneyGomes, GeoffSlocock, and PaulPetterson.
<<<
!!!!!Code
***/
//{{{
version.extensions.nestedSliders = {major: 2, minor: 0, revision: 0, date: new Date(2006,7,28)};
//}}}

//{{{
// options for deferred rendering of sliders that are not initially displayed
if (config.options.chkDebugLazySliderDefer==undefined) config.options.chkDebugLazySliderDefer=false;
if (config.options.chkDebugLazySliderRender==undefined) config.options.chkDebugLazySliderRender=false;

// default styles for 'floating' class
setStylesheet(".floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \
	background-color:#eee; color:#000; border:1px solid #000; text-align:left; }","floatingPanelStylesheet");
//}}}

//{{{
config.formatters.push( {
	name: "nestedSliders",
	match: "\\n?\\+{3}",
	terminator: "\\s*\\={3}\\n?",
	lookahead: "\\n?\\+{3}(\\+)?(\\([^\\)]*\\))?(\\!*)?(\\^(?:[^\\^\\*\\[\\>]*\\^)?)?(\\*)?(?:\\{\\{([\\w]+[\\s\\w]*)\\{)?(\\[[^\\]]*\\])?(?:\\}{3})?(\\>)?(\\.\\.\\.)?\\s*",
	handler: function(w)
		{
			// defopen=lookaheadMatch[1]
			// cookiename=lookaheadMatch[2]
			// header=lookaheadMatch[3]
			// panelwidth=lookaheadMatch[4]
			// rollover=lookaheadMatch[5]
			// class=lookaheadMatch[6]
			// label=lookaheadMatch[7]
			// blockquote=lookaheadMatch[8]
			// deferred=lookaheadMatch[9]

			 lookaheadRegExp = new RegExp(this.lookahead,"mg");
			lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = lookaheadRegExp.exec(w.source)
			if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
			{
				// location for rendering button and panel
				var place=w.output;

				// default to closed, no cookie, no accesskey
				var show="none"; var title=">"; var tooltip="show"; var cookie=""; var key="";

				// extra "+", default to open
				if (lookaheadMatch[1])
					{ show="block"; title="<"; tooltip="hide"; }

				// cookie, use saved open/closed state
				if (lookaheadMatch[2]) {
					cookie=lookaheadMatch[2].trim().slice(1,-1);
					cookie="chkSlider"+cookie;
					if (config.options[cookie]==undefined)
						{ config.options[cookie] = (show=="block") }
					if (config.options[cookie])
						{ show="block"; title="<"; tooltip="hide"; }
					else
						{ show="none"; title=">"; tooltip="show"; }
				}

				// parse custom label/tooltip/accesskey: [label=X|tooltip]
				if (lookaheadMatch[7]) {
					title = lookaheadMatch[7].trim().slice(1,-1);
					var pos=title.indexOf("|");
					if (pos!=-1) { tooltip = title.substr(pos+1,title.length); title=title.substr(0,pos); }
					if (title.substr(title.length-2,1)=="=") { key=title.substr(title.length-1,1); title=title.slice(0,-2); }
					if (pos==-1) tooltip += " "+title; // default tooltip: "show/hide <title>"
				}

				// create the button
				if (lookaheadMatch[3]) { // use "Hn" header format instead of button/link
					var lvl=(lookaheadMatch[3].length>6)?6:lookaheadMatch[3].length;
					var btn = createTiddlyElement(createTiddlyElement(place,"h"+lvl,null,null,null),"a",null,lookaheadMatch[6],title);
					btn.onclick=onClickNestedSlider;
					btn.setAttribute("href","javascript:;");
					btn.setAttribute("title",tooltip);
				}
				else
					var btn = createTiddlyButton(place,title,tooltip,onClickNestedSlider,lookaheadMatch[6]);

				// set extra button attributes
				btn.sliderCookie = cookie; // save the cookiename (if any) in the button object
				btn.defOpen=lookaheadMatch[1]!=null; // save default open/closed state (boolean)
				btn.keyparam=key; // save the access key letter ("" if none)
				if (key.length) {
					btn.setAttribute("accessKey",key); // init access key
					btn.onfocus=function(){this.setAttribute("accessKey",this.keyparam);}; // **reclaim** access key on focus
				}

				// "non-click" MouseOver open/close slider
				if (lookaheadMatch[5]) btn.onmouseover=onClickNestedSlider;

				// create slider panel
				var panelClass=lookaheadMatch[4]?"floatingPanel":"sliderPanel";
				var panel=createTiddlyElement(place,"div",null,panelClass,null);
				panel.button = btn; // so the slider panel know which button it belongs to
				panel.defaultPanelWidth=(lookaheadMatch[4] && lookaheadMatch[4].length>2)?lookaheadMatch[4].slice(1,-1):""; // save requested panel size
				btn.sliderPanel=panel;
				panel.style.display = show;
				panel.style.width=panel.defaultPanelWidth;

				// render slider (or defer until shown) 
				w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
				if ((show=="block")||!lookaheadMatch[9]) {
					// render now if panel is supposed to be shown or NOT deferred rendering
					w.subWikify(lookaheadMatch[8]?createTiddlyElement(panel,"blockquote"):panel,this.terminator);
					// align slider/floater position with button
					adjustSliderPos(place,btn,panel,panelClass);
				}
				else {
					var src = w.source.substr(w.nextMatch);
					var endpos=findMatchingDelimiter(src,"+++","===");
					panel.setAttribute("raw",src.substr(0,endpos));
					panel.setAttribute("blockquote",lookaheadMatch[8]?"true":"false");
					panel.setAttribute("rendered","false");
					w.nextMatch += endpos+3;
					if (w.source.substr(w.nextMatch,1)=="\n") w.nextMatch++;
					if (config.options.chkDebugLazySliderDefer) alert("deferred '"+title+"':\n\n"+panel.getAttribute("raw"));
				}
			}
		}
	}
)

// TBD: ignore 'quoted' delimiters (e.g., "{{{+++foo===}}}" isn't really a slider)
function findMatchingDelimiter(src,starttext,endtext) {
	var startpos = 0;
	var endpos = src.indexOf(endtext);
	// check for nested delimiters
	while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {
		// count number of nested 'starts'
		var startcount=0;
		var temp = src.substring(startpos,endpos-1);
		var pos=temp.indexOf(starttext);
		while (pos!=-1)  { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }
		// set up to check for additional 'starts' after adjusting endpos
		startpos=endpos+endtext.length;
		// find endpos for corresponding number of matching 'ends'
		while (startcount && endpos!=-1) {
			endpos = src.indexOf(endtext,endpos+endtext.length);
			startcount--;
		}
	}
	return (endpos==-1)?src.length:endpos;
}
//}}}

//{{{
window.onClickNestedSlider=function(e)
{
	if (!e) var e = window.event;
	var theTarget = resolveTarget(e);
	var theLabel = theTarget.firstChild.data;
	var theSlider = theTarget.sliderPanel
	var isOpen = theSlider.style.display!="none";
	// if using default button labels, toggle labels
	if (theLabel==">") theTarget.firstChild.data = "<";
	else if (theLabel=="<") theTarget.firstChild.data = ">";
	// if using default tooltips, toggle tooltips
	if (theTarget.getAttribute("title")=="show")
		theTarget.setAttribute("title","hide");
	else if (theTarget.getAttribute("title")=="hide")
		theTarget.setAttribute("title","show");
	if (theTarget.getAttribute("title")=="show "+theLabel)
		theTarget.setAttribute("title","hide "+theLabel);
	else if (theTarget.getAttribute("title")=="hide "+theLabel)
		theTarget.setAttribute("title","show "+theLabel);
	// deferred rendering (if needed)
	if (theSlider.getAttribute("rendered")=="false") {
		if (config.options.chkDebugLazySliderRender)
			alert("rendering '"+theLabel+"':\n\n"+theSlider.getAttribute("raw"));
		var place=theSlider;
		if (theSlider.getAttribute("blockquote")=="true")
			place=createTiddlyElement(place,"blockquote");
		wikify(theSlider.getAttribute("raw"),place);
		theSlider.setAttribute("rendered","true");
	}
	// show/hide the slider
	if(config.options.chkAnimate)
		anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));
	else
		theSlider.style.display = isOpen ? "none" : "block";
	// reset to default width (might have been changed via plugin code)
	theSlider.style.width=theSlider.defaultPanelWidth;
	// align slider/floater position with target button
	if (!isOpen) adjustSliderPos(theSlider.parentNode,theTarget,theSlider,theSlider.className);
	// if showing panel, set focus to first 'focus-able' element in panel
	if (theSlider.style.display!="none") {
		var ctrls=theSlider.getElementsByTagName("*");
		for (var c=0; c<ctrls.length; c++) {
			var t=ctrls[c].tagName.toLowerCase();
			if ((t=="input" && ctrls[c].type!="hidden") || t=="textarea" || t=="select")
				{ ctrls[c].focus(); break; }
		}
	}
	if (this.sliderCookie && this.sliderCookie.length) {
		config.options[this.sliderCookie]=!isOpen;
		if (config.options[this.sliderCookie]!=this.defOpen)
			saveOptionCookie(this.sliderCookie);
		else { // remove cookie if slider is in default display state
			var ex=new Date(); ex.setTime(ex.getTime()-1000);
			document.cookie = this.sliderCookie+"=novalue; path=/; expires="+ex.toGMTString();
		}
	}
	return false;
}

// hijack animation handler 'stop' handler so overflow is visible after animation has completed
Slider.prototype.coreStop = Slider.prototype.stop;
Slider.prototype.stop = function() { this.coreStop(); this.element.style.overflow = "visible"; }

// adjust panel position based on button position
if (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel,panelClass) {
	if (panelClass=="floatingPanel") {
		var left=0;
		var top=btn.offsetHeight; 
		if (place.style.position!="relative") {
			var left=findPosX(btn);
			var top=findPosY(btn)+btn.offsetHeight;
			var p=place; while (p && p.className!='floatingPanel') p=p.parentNode;
			if (p) { left-=findPosX(p); top-=findPosY(p); }
		}
		if (left+panel.offsetWidth > getWindowWidth()) left=getWindowWidth()-panel.offsetWidth-10;
		panel.style.left=left+"px"; panel.style.top=top+"px";
	}
}

function getWindowWidth() {
	if(document.width!=undefined)
		return document.width; // moz (FF)
	if(document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
		return document.documentElement.clientWidth; // IE6
	if(document.body && ( document.body.clientWidth || document.body.clientHeight ) )
		return document.body.clientWidth; // IE4
	if(window.innerWidth!=undefined)
		return window.innerWidth; // IE - general
	return 0; // unknown
}
//}}}
/***
| Name:|NewHerePlugin|
| Description:|Creates the new here and new journal macros|
| Version:|3.0 ($Rev: 1845 $)|
| Date:|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|
| Source:|http://mptw.tiddlyspot.com/#NewHerePlugin|
| Author:|Simon Baird <simon.baird@gmail.com>|
| License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.macros, {
	newHere: {
		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			wikify("<<newTiddler "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
		}
	},
	newJournalHere: {
		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			wikify("<<newJournal "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
		}
	}
});

//}}}
/***
| Name:|NewMeansNewPlugin|
| Description:|If 'New Tiddler' already exists then create 'New Tiddler (1)' and so on|
| Version:|1.0 ($Rev: 2263 $)|
| Date:|$Date: 2007-06-13 04:22:32 +1000 (Wed, 13 Jun 2007) $|
| Source:|http://mptw.tiddlyspot.com/empty.html#NewMeansNewPlugin|
| Author:|Simon Baird <simon.baird@gmail.com>|
| License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{

String.prototype.getNextFreeName = function() {
       var numberRegExp = / \(([0-9]+)\)$/;
       var match = numberRegExp.exec(this);
       if (match) {
               var num = parseInt(match[1]) + 1;
               return this.replace(numberRegExp," ("+num+")");
       }
       else {
               return this + " (1)";
       }
}

config.macros.newTiddler.getName = function(newName) {
       while (store.getTiddler(newName))
               newName = newName.getNextFreeName();
       return newName;
}


config.macros.newTiddler.onClickNewTiddler = function()
{
	var title = this.getAttribute("newTitle");
	if(this.getAttribute("isJournal") == "true") {
		var now = new Date();
		title = now.formatString(title.trim());
	}

	title = config.macros.newTiddler.getName(title); // <--- only changed bit

	var params = this.getAttribute("params");
	var tags = params ? params.split("|") : [];
	var focus = this.getAttribute("newFocus");
	var template = this.getAttribute("newTemplate");
	var customFields = this.getAttribute("customFields");
	story.displayTiddler(null,title,template,false,null,null);
	var tiddlerElem = document.getElementById(story.idPrefix + title);
	if(customFields)
		story.addCustomFields(tiddlerElem,customFields);
	var text = this.getAttribute("newText");
	if(typeof text == "string")
		story.getTiddlerField(title,"text").value = text.format([title]);
	for(var t=0;t<tags.length;t++)
		story.setTiddlerTag(title,tags[t],+1);
	story.focusTiddler(title,focus);
	return false;
};

//}}}
[[Source: system optimization techniques|http://murga-linux.com/puppy/viewtopic.php?t=76827]] Forum thread by Technosaurus.

Wondering whether or not to recompile a program in your puplet to eliminate large shared libs that are only used once or twice?

Code:
for x in ${PATH//://* }/* ; do [ -x "$x" ] && objdump -x $x 2>/dev/null & done|grep NEEDED|sort |uniq -c |sort -n >binaudit

 This will tell you how many times each library is needed (if it isn't on the list, it can likely just be removed - not always though, need to remember dlopen and/or plugins may use it too - in "module" mode). 

Now open binaudit in your text editor and get to work, starting with the ones that are needed only once ... you can build them in statically. 

 The ones that are used the most would benefit the most tools by improving their compiles (I will discuss that later).
<div class='header' macro='gradient vert #FFF #FFF '>
 <div class='gradient'> 
 <div class='titleLine' >
<span class='searchBar' macro='search'></span>
 <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
 <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
 </div>
<div id='topMenu' refresh='content' tiddler='MainMenu'></div>
 </div>
</div>
<div id='bodywrapper'>
<div id='sidebar'>
 <div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
 <div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
 <div id='messageArea'></div>
 <div id='tiddlerDisplay'></div>
</div>
<div id='displayFooter'></div>
</div>
/***
|<html><a name="Top"/></html>''Name:''|PartTiddlerPlugin|
|''Version:''|1.0.9 (2007-07-14)|
|''Source:''|http://tiddlywiki.abego-software.de/#PartTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license]]|
|''CoreVersion:''|2.1.3|
|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|
!Table of Content<html><a name="TOC"/></html>
* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Description',null, event)">Description, Syntax</a></html>
* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Applications',null, event)">Applications</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('LongTiddler',null, event)">Refering to Paragraphs of a Longer Tiddler</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Citation',null, event)">Citation Index</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('TableCells',null, event)">Creating "multi-line" Table Cells</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Tabs',null, event)">Creating Tabs</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Sliders',null, event)">Using Sliders</a></html>
* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Revisions',null, event)">Revision History</a></html>
* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Code',null, event)">Code</a></html>
!Description<html><a name="Description"/></html>
With the {{{<part aPartName> ... </part>}}} feature you can structure your tiddler text into separate (named) parts. 
Each part can be referenced as a "normal" tiddler, using the "//tiddlerName//''/''//partName//" syntax (e.g. "About/Features").  E.g. you may create links to the parts (e.g. {{{[[Quotes/BAX95]]}}} or {{{[[Hobbies|AboutMe/Hobbies]]}}}), use it in {{{<<tiddler...>>}}} or {{{<<tabs...>>}}} macros etc.


''Syntax:'' 
|>|''<part'' //partName// [''hidden''] ''>'' //any tiddler content// ''</part>''|
|//partName//|The name of the part. You may reference a part tiddler with the combined tiddler name "//nameOfContainerTidder//''/''//partName//. <<br>>If you use a partName containing spaces you need to quote it (e.g. {{{"Major Overview"}}} or {{{[[Shortcut List]]}}}).|
|''hidden''|When defined the content of the part is not displayed in the container tiddler. But when the part is explicitly referenced (e.g. in a {{{<<tiddler...>>}}} macro or in a link) the part's content is displayed.|
|<html><i>any&nbsp;tiddler&nbsp;content</i></html>|<html>The content of the part.<br>A part can have any content that a "normal" tiddler may have, e.g. you may use all the formattings and macros defined.</html>|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|
<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!Applications<html><a name="Applications"/></html>
!!Refering to Paragraphs of a Longer Tiddler<html><a name="LongTiddler"/></html>
Assume you have written a long description in a tiddler and now you want to refer to the content of a certain paragraph in that tiddler (e.g. some definition.) Just wrap the text with a ''part'' block, give it a nice name, create a "pretty link" (like {{{[[Discussion Groups|Introduction/DiscussionGroups]]}}}) and you are done.

Notice this complements the approach to first writing a lot of small tiddlers and combine these tiddlers to one larger tiddler in a second step (e.g. using the {{{<<tiddler...>>}}} macro). Using the ''part'' feature you can first write a "classic" (longer) text that can be read "from top to bottom" and later "reuse" parts of this text for some more "non-linear" reading.

<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!!Citation Index<html><a name="Citation"/></html>
Create a tiddler "Citations" that contains your "citations". 
Wrap every citation with a part and a proper name. 

''Example''
{{{
<part BAX98>Baxter, Ira D. et al: //Clone Detection Using Abstract Syntax Trees.// 
in //Proc. ICSM//, 1998.</part>

<part BEL02>Bellon, Stefan: //Vergleich von Techniken zur Erkennung duplizierten Quellcodes.// 
Thesis, Uni Stuttgart, 2002.</part>

<part DUC99>Ducasse, Stéfane et al: //A Language Independent Approach for Detecting Duplicated Code.// 
in //Proc. ICSM//, 1999.</part>
}}}

You may now "cite" them just by using a pretty link like {{{[[Citations/BAX98]]}}} or even more pretty, like this {{{[[BAX98|Citations/BAX98]]}}}.

<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!!Creating "multi-line" Table Cells<html><a name="TableCells"/></html>
You may have noticed that it is hard to create table cells with "multi-line" content. E.g. if you want to create a bullet list inside a table cell you cannot just write the bullet list
{{{
* Item 1
* Item 2
* Item 3
}}}
into a table cell (i.e. between the | ... | bars) because every bullet item must start in a new line but all cells of a table row must be in one line.

Using the ''part'' feature this problem can be solved. Just create a hidden part that contains the cells content and use a {{{<<tiddler >>}}} macro to include its content in the table's cell.

''Example''
{{{
|!Subject|!Items|
|subject1|<<tiddler ./Cell1>>|
|subject2|<<tiddler ./Cell2>>|

<part Cell1 hidden>
* Item 1
* Item 2
* Item 3
</part>
...
}}}

Notice that inside the {{{<<tiddler ...>>}}} macro you may refer to the "current tiddler" using the ".".

BTW: The same approach can be used to create bullet lists with items that contain more than one line.

<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!!Creating Tabs<html><a name="Tabs"/></html>
The build-in {{{<<tabs ...>>}}} macro requires that you defined an additional tiddler for every tab it displays. When you want to have "nested" tabs you need to define a tiddler for the "main tab" and one for every tab it contains. I.e. the definition of a set of tabs that is visually displayed at one place is distributed across multiple tiddlers.

With the ''part'' feature you can put the complete definition in one tiddler, making it easier to keep an overview and maintain the tab sets.

''Example''
The standard tabs at the sidebar are defined by the following eight tiddlers:
* SideBarTabs
* TabAll
* TabMore
* TabMoreMissing
* TabMoreOrphans
* TabMoreShadowed
* TabTags
* TabTimeline

Instead of these eight tiddlers one could define the following SideBarTabs tiddler that uses the ''part'' feature:
{{{
<<tabs txtMainTab 
    Timeline Timeline SideBarTabs/Timeline 
    All 'All tiddlers' SideBarTabs/All 
    Tags 'All tags' SideBarTabs/Tags 
    More 'More lists' SideBarTabs/More>>
<part Timeline hidden><<timeline>></part>
<part All hidden><<list all>></part>
<part Tags hidden><<allTags>></part>
<part More hidden><<tabs txtMoreTab 
    Missing 'Missing tiddlers' SideBarTabs/Missing 
    Orphans 'Orphaned tiddlers' SideBarTabs/Orphans 
    Shadowed 'Shadowed tiddlers' SideBarTabs/Shadowed>></part>
<part Missing hidden><<list missing>></part>
<part Orphans hidden><<list orphans>></part>
<part Shadowed hidden><<list shadowed>></part>
}}}

Notice that you can easily "overwrite" individual parts in separate tiddlers that have the full name of the part.

E.g. if you don't like the classic timeline tab but only want to see the 100 most recent tiddlers you could create a tiddler "~SideBarTabs/Timeline" with the following content:
{{{
<<forEachTiddler 
		sortBy 'tiddler.modified' descending 
		write '(index < 100) ? "* [["+tiddler.title+"]]\n":""'>>
}}}
<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!!Using Sliders<html><a name="Sliders"/></html>
Very similar to the build-in {{{<<tabs ...>>}}} macro (see above) the {{{<<slider ...>>}}} macro requires that you defined an additional tiddler that holds the content "to be slid". You can avoid creating this extra tiddler by using the ''part'' feature

''Example''
In a tiddler "About" we may use the slider to show some details that are documented in the tiddler's "Details" part.
{{{
...
<<slider chkAboutDetails About/Details details "Click here to see more details">>
<part Details hidden>
To give you a better overview ...
</part>
...
}}}

Notice that putting the content of the slider into the slider's tiddler also has an extra benefit: When you decide you need to edit the content of the slider you can just doubleclick the content, the tiddler opens for editing and you can directly start editing the content (in the part section). In the "old" approach you would doubleclick the tiddler, see that the slider is using tiddler X, have to look for the tiddler X and can finally open it for editing. So using the ''part'' approach results in a much short workflow.

<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!Revision history<html><a name="Revisions"/></html>
* v1.0.9 (2007-07-14)
** Bugfix: Error when using the SideBarTabs example and switching between "More" and "Shadow". Thanks to cmari for reporting the issue.
* v1.0.8 (2007-06-16)
** Speeding up display of tiddlers containing multiple pard definitions. Thanks to Paco Rivière for reporting the issue.
** Support "./partName" syntax inside <<tabs ...>> macro
* v1.0.7 (2007-03-07)
** Bugfix: <<tiddler "./partName">> does not always render correctly after a refresh (e.g. like it happens when using the "Include" plugin). Thanks to Morris Gray for reporting the bug.
* v1.0.6 (2006-11-07)
** Bugfix: cannot edit tiddler when UploadPlugin by Bidix is installed. Thanks to José Luis González Castro for reporting the bug.
* v1.0.5 (2006-03-02)
** Bugfix: Example with multi-line table cells does not work in IE6. Thanks to Paulo Soares for reporting the bug.
* v1.0.4 (2006-02-28)
** Bugfix: Shadow tiddlers cannot be edited (in TW 2.0.6). Thanks to Torsten Vanek for reporting the bug.
* v1.0.3 (2006-02-26)
** Adapt code to newly introduced Tiddler.prototype.isReadOnly() function (in TW 2.0.6). Thanks to Paulo Soares for reporting the problem.
* v1.0.2 (2006-02-05)
** Also allow other macros than the "tiddler" macro use the "." in the part reference (to refer to "this" tiddler)
* v1.0.1 (2006-01-27)
** Added Table of Content for plugin documentation. Thanks to RichCarrillo for suggesting.
** Bugfix: newReminder plugin does not work when PartTiddler is installed. Thanks to PauloSoares for reporting.
* v1.0.0 (2006-01-25)
** initial version
<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!Code<html><a name="Code"/></html>
<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>
***/
//{{{
//============================================================================
//                           PartTiddlerPlugin

// Ensure that the PartTiddler Plugin is only installed once.
//
if (!version.extensions.PartTiddlerPlugin) {



version.extensions.PartTiddlerPlugin = {
    major: 1, minor: 0, revision: 9,
    date: new Date(2007, 6, 14), 
    type: 'plugin',
    source: "http://tiddlywiki.abego-software.de/#PartTiddlerPlugin"
};

if (!window.abego) window.abego = {};
if (version.major < 2) alertAndThrow("PartTiddlerPlugin requires TiddlyWiki 2.0 or newer.");

//============================================================================
// Common Helpers

// Looks for the next newline, starting at the index-th char of text. 
//
// If there are only whitespaces between index and the newline 
// the index behind the newline is returned, 
// otherwise (or when no newline is found) index is returned.
//
var skipEmptyEndOfLine = function(text, index) {
	var re = /(\n|[^\s])/g;
	re.lastIndex = index;
	var result = re.exec(text);
	return (result && text.charAt(result.index) == '\n') 
			? result.index+1
			: index;
}


//============================================================================
// Constants

var partEndOrStartTagRE = /(<\/part>)|(<part(?:\s+)((?:[^>])+)>)/mg;
var partEndTagREString = "<\\/part>";
var partEndTagString = "</part>";

//============================================================================
// Plugin Specific Helpers

// Parse the parameters inside a <part ...> tag and return the result.
//
// @return [may be null] {partName: ..., isHidden: ...}
//
var parseStartTagParams = function(paramText) {
	var params = paramText.readMacroParams();
	if (params.length == 0 || params[0].length == 0) return null;
	
	var name = params[0];
	var paramsIndex = 1;
	var hidden = false;
	if (paramsIndex < params.length) {
		hidden = params[paramsIndex] == "hidden";
		paramsIndex++;
	}
	
	return {
		partName: name, 
		isHidden: hidden
	};
}

// Returns the match to the next (end or start) part tag in the text, 
// starting the search at startIndex.
// 
// When no such tag is found null is returned, otherwise a "Match" is returned:
// [0]: full match
// [1]: matched "end" tag (or null when no end tag match)
// [2]: matched "start" tag (or null when no start tag match)
// [3]: content of start tag (or null if no start tag match)
//
var findNextPartEndOrStartTagMatch = function(text, startIndex) {
	var re = new RegExp(partEndOrStartTagRE);
	re.lastIndex = startIndex;
	var match = re.exec(text);
	return match;
}

//============================================================================
// Formatter

// Process the <part ...> ... </part> starting at (w.source, w.matchStart) for formatting.
//
// @return true if a complete part section (including the end tag) could be processed, false otherwise.
//
var handlePartSection = function(w) {
	var tagMatch = findNextPartEndOrStartTagMatch(w.source, w.matchStart);
	if (!tagMatch) return false;
	if (tagMatch.index != w.matchStart || !tagMatch[2]) return false;

	// Parse the start tag parameters
	var arguments = parseStartTagParams(tagMatch[3]);
	if (!arguments) return false;
	
	// Continue processing
	var startTagEndIndex = skipEmptyEndOfLine(w.source, tagMatch.index + tagMatch[0].length);
	var endMatch = findNextPartEndOrStartTagMatch(w.source, startTagEndIndex);
	if (endMatch && endMatch[1]) {
		if (!arguments.isHidden) {
			w.nextMatch = startTagEndIndex;
			w.subWikify(w.output,partEndTagREString);
		}
		w.nextMatch = skipEmptyEndOfLine(w.source, endMatch.index + endMatch[0].length);
		
		return true;
	}
	return false;
}

config.formatters.push( {
    name: "part",
    match: "<part\\s+[^>]+>",
	
	handler: function(w) {
		if (!handlePartSection(w)) {
			w.outputText(w.output,w.matchStart,w.matchStart+w.matchLength);
		}
	}
} )

//============================================================================
// Extend "fetchTiddler" functionality to also recognize "part"s of tiddlers 
// as tiddlers.

var currentParent = null; // used for the "." parent (e.g. in the "tiddler" macro)

// Return the match to the first <part ...> tag of the text that has the
// requrest partName.
//
// @return [may be null]
//
var findPartStartTagByName = function(text, partName) {
	var i = 0;
	
	while (true) {
		var tagMatch = findNextPartEndOrStartTagMatch(text, i);
		if (!tagMatch) return null;

		if (tagMatch[2]) {
			// Is start tag
	
			// Check the name
			var arguments = parseStartTagParams(tagMatch[3]);
			if (arguments && arguments.partName == partName) {
				return tagMatch;
			}
		}
		i = tagMatch.index+tagMatch[0].length;
	}
}

// Return the part "partName" of the given parentTiddler as a "readOnly" Tiddler 
// object, using fullName as the Tiddler's title. 
//
// All remaining properties of the new Tiddler (tags etc.) are inherited from 
// the parentTiddler.
// 
// @return [may be null]
//
var getPart = function(parentTiddler, partName, fullName) {
	var text = parentTiddler.text;
	var startTag = findPartStartTagByName(text, partName);
	if (!startTag) return null;
	
	var endIndexOfStartTag = skipEmptyEndOfLine(text, startTag.index+startTag[0].length);
	var indexOfEndTag = text.indexOf(partEndTagString, endIndexOfStartTag);

	if (indexOfEndTag >= 0) {
		var partTiddlerText = text.substring(endIndexOfStartTag,indexOfEndTag);
		var partTiddler = new Tiddler();
		partTiddler.set(
						fullName,
						partTiddlerText,
						parentTiddler.modifier,
						parentTiddler.modified,
						parentTiddler.tags,
						parentTiddler.created);
		partTiddler.abegoIsPartTiddler = true;
		return partTiddler;
	}
	
	return null;
}

// Hijack the store.fetchTiddler to recognize the "part" addresses.
//
var hijackFetchTiddler = function() {
	var oldFetchTiddler = store.fetchTiddler ;
	store.fetchTiddler = function(title) {
		var result = oldFetchTiddler.apply(this, arguments);
		if (!result && title) {
			var i = title.lastIndexOf('/');
			if (i > 0) {
				var parentName = title.substring(0, i);
				var partName = title.substring(i+1);
				var parent = (parentName == ".") 
						? store.resolveTiddler(currentParent)
						: oldFetchTiddler.apply(this, [parentName]);
				if (parent) {
					return getPart(parent, partName, parent.title+"/"+partName);
				}
			}
		}
		return result;	
	};
};

// for debugging the plugin is not loaded through the systemConfig mechanism but via a script tag. 
// At that point in the "store" is not yet defined. In that case hijackFetchTiddler through the restart function.
// Otherwise hijack now.
if (!store) {
	var oldRestartFunc = restart;
	window.restart = function() {
		hijackFetchTiddler();
		oldRestartFunc.apply(this,arguments);
	};
} else
	hijackFetchTiddler();




// The user must not edit a readOnly/partTiddler
//

config.commands.editTiddler.oldIsReadOnlyFunction = Tiddler.prototype.isReadOnly;

Tiddler.prototype.isReadOnly = function() {
	// Tiddler.isReadOnly was introduced with TW 2.0.6.
	// For older version we explicitly check the global readOnly flag
	if (config.commands.editTiddler.oldIsReadOnlyFunction) {
		if (config.commands.editTiddler.oldIsReadOnlyFunction.apply(this, arguments)) return true;
	} else {
		if (readOnly) return true;
	}

	return this.abegoIsPartTiddler;
}

config.commands.editTiddler.handler = function(event,src,title)
{
	var t = store.getTiddler(title);
	// Edit the tiddler if it either is not a tiddler (but a shadowTiddler)
	// or the tiddler is not readOnly
	if(!t || !t.abegoIsPartTiddler)
		{
		clearMessage();
		story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE);
		story.focusTiddler(title,"text");
		return false;
		}
}

// To allow the "./partName" syntax in macros we need to hijack 
// the invokeMacro to define the "currentParent" while it is running.
// 
var oldInvokeMacro = window.invokeMacro;
function myInvokeMacro(place,macro,params,wikifier,tiddler) {
	var oldCurrentParent = currentParent;
	if (tiddler) currentParent = tiddler;
	try {
		oldInvokeMacro.apply(this, arguments);
	} finally {
		currentParent = oldCurrentParent;
	}
}
window.invokeMacro = myInvokeMacro;

// To correctly support the "./partName" syntax while refreshing we need to hijack 
// the config.refreshers.tiddlers to define the "currentParent" while it is running.
// 
(function() {
	var oldTiddlerRefresher= config.refreshers.tiddler;
	config.refreshers.tiddler = function(e,changeList) {
		var oldCurrentParent = currentParent;
		try {
			currentParent = e.getAttribute("tiddler");
			return oldTiddlerRefresher.apply(this,arguments);
		} finally {
			currentParent = oldCurrentParent;
		}
	};
})();

// Support "./partName" syntax inside <<tabs ...>> macro
(function() {
	var extendRelativeNames = function(e, title) {
		var nodes = e.getElementsByTagName("a");
		for(var i=0; i<nodes.length; i++) {
			var node = nodes[i];
			var s = node.getAttribute("content");
			if (s && s.indexOf("./") == 0)
				node.setAttribute("content",title+s.substr(1));
		}
	};
	var oldHandler = config.macros.tabs.handler;
	config.macros.tabs.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
		var result = oldHandler.apply(this,arguments);
		if (tiddler)
			extendRelativeNames(place, tiddler.title);
		return result;
	};
})();

// Scroll the anchor anchorName in the viewer of the given tiddler visible.
// When no tiddler is defined use the tiddler of the target given event is used.
window.scrollAnchorVisible = function(anchorName, tiddler, evt) {
	var tiddlerElem = null;
	if (tiddler) {
		tiddlerElem = document.getElementById(story.idPrefix + tiddler);
	}
	if (!tiddlerElem && evt) {
		var target = resolveTarget(evt);
		tiddlerElem = story.findContainingTiddler(target);
	}
	if (!tiddlerElem) return;

	var children = tiddlerElem.getElementsByTagName("a");
	for (var i = 0; i < children.length; i++) {
		var child = children[i];
		var name = child.getAttribute("name");
		if (name == anchorName) {
			var y = findPosY(child);
			window.scrollTo(0,y);
			return;
		}
	}
}

} // of "install only once"
//}}}

/***
<html><sub><a href="javascript:;" onclick="scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2006 ([[www.abego-software.de|http://www.abego-software.de]])

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.

Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.

<html><sub><a href="javascript:;" onclick="scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>
***/
In
echo 'one' > /tmp/a

The shell does an open(O_WRONLY) on the pipe and then spawns echo which then does the write("one\n").

The open will block until some other process opens the pipe in RD_ONLY or RD_WR though.

And so will the open from your echo two.

So at the moment you do more /tmp/a you've got two processes ready to fire that have not opened the fifo yet let alone written anything to it. Which of those two will be scheduled as soon as more does the open(RD_ONLY) is going to be random.

To avoid blocking, you could do:
exec 3<>  /tmp/a

to unlock the pipe first, and then run your commands which won't block until the pipe is full.
[[HTDP 2|http://www.ccs.neu.edu/home/matthias/HtDP2e/part_one.html]] How to Design Programs, Second Edition - 'BSL' / Racket
https://processing.org/

[[C]]
[[Agena|http://agena.sourceforge.net/]]
[[Awk|http://www.gnu.org/software/gawk/manual/gawk.html#Getting-Started]]

[[NCurses How-To|http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/]]
[[NCurses tutorial|http://www.writeka.com/ed/ncurses_library.html]]
[[NCurses intro|http://invisible-island.net/ncurses/ncurses-intro.html]]
[[Linux.org|http://www.linux.org/docs/ldp/howto/NCURSES-Programming-HOWTO/]]
[[C for dummies: ncurses|http://www.c-for-dummies.com/ncurses/]]

[[Building the code|http://quaid.fedorapeople.org/TOS/Practical_Open_Source_Software_Exploration/html/ch-Building_the_Code.html]]

[[sketchpad|http://sketchpad.cc/]] Online processing.js

[[SDL2|http://lazyfoo.net/tutorials/SDL/]] Tutorials
[[sdltutorials.com|http://www.sdltutorials.com/]]
 Official Puppy releases up to, and including, Puppy 4.2.x are compiled this way: 
@@white-space:pre;<nowiki> 
./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc --build=i486-pc-linux-gnu
 </nowiki>@@
See [[this thread|http://murga-linux.com/puppy/viewtopic.php?t=93041]]
/***
| Name|QuickOpenTagPlugin|
| Description|Changes tag links to make it easier to open tags as tiddlers|
| Version|3.0.1 ($Rev: 2342 $)|
| Date|$Date: 2007-07-05 10:57:49 +1000 (Thu, 05 Jul 2007) $|
| Source|http://mptw.tiddlyspot.com/#QuickOpenTagPlugin|
| Author|Simon Baird <simon.baird@gmail.com>|
| License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
config.quickOpenTag = {

	dropdownChar: (document.all ? "\u25bc" : "\u25be"), // the little one doesn't work in IE?

	createTagButton: function(place,tag,excludeTiddler) {
		// little hack so we can to <<tag PrettyTagName|RealTagName>>
		var splitTag = tag.split("|");
		var pretty = tag;
		if (splitTag.length == 2) {
			tag = splitTag[1];
			pretty = splitTag[0];
		}
		
		var sp = createTiddlyElement(place,"span",null,"quickopentag");
		createTiddlyText(createTiddlyLink(sp,tag,false),pretty);
		
		var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,
                        config.views.wikified.tag.tooltip.format([tag]),onClickTag);
		theTag.setAttribute("tag",tag);
		if (excludeTiddler)
			theTag.setAttribute("tiddler",excludeTiddler);
    		return(theTag);
	},

	miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var tagged = store.getTaggedTiddlers(tiddler.title);
		if (tagged.length > 0) {
			var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,
                        	config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);
			theTag.setAttribute("tag",tiddler.title);
			theTag.className = "miniTag";
		}
	},

	allTagsHandler: function(place,macroName,params) {
		var tags = store.getTags(params[0]);
		var filter = params[1]; // new feature
		var ul = createTiddlyElement(place,"ul");
		if(tags.length == 0)
			createTiddlyElement(ul,"li",null,"listTitle",this.noTags);
		for(var t=0; t<tags.length; t++) {
			var title = tags[t][0];
			if (!filter || (title.match(new RegExp('^'+filter)))) {
				var info = getTiddlyLinkInfo(title);
				var theListItem =createTiddlyElement(ul,"li");
				var theLink = createTiddlyLink(theListItem,tags[t][0],true);
				var theCount = " (" + tags[t][1] + ")";
				theLink.appendChild(document.createTextNode(theCount));
				var theDropDownBtn = createTiddlyButton(theListItem," " +
					config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);
				theDropDownBtn.setAttribute("tag",tags[t][0]);
			}
		}
	},

	// todo fix these up a bit
	styles: [
"/*{{{*/",
"/* created by QuickOpenTagPlugin */",
".tagglyTagged .quickopentag, .tagged .quickopentag ",
"	{ margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }",
".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }",
".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}",
"/* extra specificity to make it work right */",
"#displayArea .viewer .quickopentag a.button, ",
"#displayArea .viewer .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink ",
"	{ border:0px solid black; }",
"#displayArea .viewer .quickopentag a.button, ",
"#mainMenu .quickopentag a.button ",
"	{ margin-left:0px; padding-left:2px; }",
"#displayArea .viewer .quickopentag a.tiddlyLink, ",
"#mainMenu .quickopentag a.tiddlyLink ",
"	{ margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }",
"a.miniTag {font-size:150%;} ",
"#mainMenu .quickopentag a.button ",
"	/* looks better in right justified main menus */",
"	{ margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }", 
"#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }",
"#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }",
"#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }",
"/*}}}*/",
		""].join("\n"),

	init: function() {
		// we fully replace these builtins. can't hijack them easily
		window.createTagButton = this.createTagButton;
		config.macros.allTags.handler = this.allTagsHandler;
		config.macros.miniTag = { handler: this.miniTagHandler };
		config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;
		store.addNotification("QuickOpenTagStyles",refreshStyles);
	}
}

config.quickOpenTag.init();

//}}}
[[Puppy Linux .org|http://puppylinux.org/home]]
[[Murga-Linux Forum|http://murga-linux.com/puppy/]]
[[Puppy Linux Help|http://puppylinux.info/]]
[[Woof-CE|https://github.com/puppylinux-woof-CE/woof-CE]]

[[BK - new blog|http://bkhome.org/news/]]

!!!!Search ----
[[StartPage|https://startpage.com/eng/]]
[[Startpage forum search|https://startpage.com/do/search?q=host%3Awww.murga-linux.com%2F]]
[[Google|http://www.google.co.uk/]]
[[Wellminded|http://wellminded.net63.net/]]
[[Google search|http://www.google.com/cse?cx=015995643981050743583%3Aabvzbibgzxo&q#gsc.tab=0]]
[[Puppy Repo Search|http://www.google.com/cse/home?cx=016255875863431332108:l66oobflmhi]] Custom Google Search Engine by Scottman
[[Advanced Google Search|http://www.google.com/advanced_search?q=site:murga-linux.com&num=100&hl=en&lr=&as_qdr=all]]
[[Google linux|http://www.google.com/cse/home?cx=002165917076592449621%3Ay8jmiivon3o]]

!______________________________________________________________________
 The rampup ramdrive contains the kernel, so you could not change kernels without rebooting to a new ramdrive.
However all services not contained in the kernel, for example kernel modules, can be in the usr file.
If you wanted to upgrade/modify the kernel, you would make another ramdrive. 
This would not be difficult because the ramdrive is so simple and small - less than 2 megs.
The ramdrive is just a tiny stand alone command line linux that is used as a mount point for root. It is symlinked to the usr file. Nothing is written to the ramdrive after boot.
[[File system]]
[[Mount]]
[[Homepage|http://www.nongnu.org/ratpoison/]]
[[scripts]]
Example ratpoisonrc scripts
[[A|http://michael-prokop.at/computer/config/.ratpoisonrc]]
[[B|http://dotfiles.org/~hermogeneshebert/.ratpoisonrc]]
[[C|http://danielwebb.us/software/ratpoison/]]
[[Commands|http://ratpoison.antidesktop.net/cgi-bin/wiki/commands]]
Ratmen
[[Ratmen|http://ratpoison.antidesktop.net/cgi-bin/wiki/ratmen]]
[[Tutorial|http://lucky13linux.wordpress.com/2008/08/24/a-quick-ratmen-tutorial/]]
Current keybindings:
 ###make semicolon invoke ratpoison command, and colon shell command.
    bind semicolon colon
    bind colon exec
      
   a = time
   b =    
   c = rxvt console (large font)   
   d = seamonkey
   e = edbrowse
   f =
   g = geany 
   h = 
   i = 
   I = Puppy-Software-Installer   
   j =
   k = 'kill' current frame
   l = 
   m = x30   
   M = men2 - dzen menu
   n = 'next' window    
   o =
   p = 'previous' window
   P = pfind
   X =Rox-filer
/***
| Name:|RenameTagsPlugin|
| Description:|Allows you to easily rename or delete tags across multiple tiddlers|
| Version:|3.0 ($Rev: 1845 $)|
| Date:|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|
| Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|
| Author:|Simon Baird <simon.baird@gmail.com>|
| License|http://mptw.tiddlyspot.com/#TheBSDLicense|
Rename a tag and you will be prompted to rename it in all its tagged tiddlers.
***/
//{{{
config.renameTags = {

	prompts: {
		rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",
		remove: "Remove the tag '%0' from %1 tidder%2?"
	},

	removeTag: function(tag,tiddlers) {
		store.suspendNotifications();
		for (var i=0;i<tiddlers.length;i++) {
			store.setTiddlerTag(tiddlers[i].title,false,tag);
		}
		store.resumeNotifications();
		store.notifyAll();
	},

	renameTag: function(oldTag,newTag,tiddlers) {
		store.suspendNotifications();
		for (var i=0;i<tiddlers.length;i++) {
			store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old
			store.setTiddlerTag(tiddlers[i].title,true,newTag);  // add new
		}
		store.resumeNotifications();
		store.notifyAll();
	},

	storeMethods: {

		saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,

		saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields) {
			if (title != newTitle) {
				var tagged = this.getTaggedTiddlers(title);
				if (tagged.length > 0) {
					// then we are renaming a tag
					if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))
						config.renameTags.renameTag(title,newTitle,tagged);

					if (!this.tiddlerExists(title) && newBody == "")
						// dont create unwanted tiddler
						return null;
				}
			}
			return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields);
		},

		removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,

		removeTiddler: function(title) {
			var tagged = this.getTaggedTiddlers(title);
			if (tagged.length > 0)
				if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))
					config.renameTags.removeTag(title,tagged);
			return this.removeTiddler_orig_renameTags(title);
		}

	},

	init: function() {
		merge(TiddlyWiki.prototype,this.storeMethods);
	}
}

config.renameTags.init();

//}}}
/***
| Name|SaveCloseTiddlerPlugin|
| Description|Provides two extra toolbar commands, saveCloseTiddler and cancelCloseTiddler|
| Version|3.0 ($Rev: 2134 $)|
| Date|$Date: 2007-04-30 16:11:12 +1000 (Mon, 30 Apr 2007) $|
| Source|http://mptw.tiddlyspot.com/#SaveCloseTiddlerPlugin|
| Author|Simon Baird <simon.baird@gmail.com>|
| License|http://mptw.tiddlyspot.com/#TheBSDLicense|
To use these you must add them to the tool bar in your EditTemplate
***/
//{{{
merge(config.commands,{

	saveCloseTiddler: {
		text: 'done/close',
		tooltip: 'Save changes to this tiddler and close it',
		handler: function(e,src,title) {
			config.commands.saveTiddler.handler(e,src,title);
			config.commands.closeTiddler.handler(e,src,title);
			return false;
		}
	},

	cancelCloseTiddler: {
		text: 'cancel/close',
		tooltip: 'Undo changes to this tiddler and close it',
		handler: function(e,src,title) {
			config.commands.cancelTiddler.handler(e,src,title);
			config.commands.closeTiddler.handler(e,src,title);
			return false;
		}
	}

});

//}}}
[[Grymoire|http://www.grymoire.com/Unix/index.html]] Bruce Barnett's tutorials on UNIX shell programming 
[[Text Manipulation with sed|http://www.linuxjournal.com/article/7231]]
[[Sed home|http://sed.sourceforge.net/]]
/***
|''Name:''|~SectionMacro|
|''Version:''|0.9.1 (28-Apr-2006)|
|''Author:''|[[Jack]]|
|''Type:''|Macro|
!Description
Allows you to create collapsable sections just like the slider macro but without needing to create new tiddlers for these sections.
!Usage
{{{<<section Title Tiddler Text goes here...
and can be multi-
line.
>>}}}
<<section Title Tiddler Text goes here...
and can be multi-
line.
>>
!Revision History
* Original by [[Jack]] 0.9
* Nested sliders and cookie persistence 0.9.1
* Removed crappy cookie persistance 0.9.2
!Code
***/
//{{{
version.extensions.section = {major: 0, minor: 9, revision: 2, date: new Date("Apr 30, 2006")};

config.macros.section = {count:0,display:'none'};
config.macros.section.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
 this.slider(place,"chkSection" + this.count++,paramString.substr(params[0].length+1).replace(/\$\>/g, '>'),params[0], "tooltip");
}

config.macros.section.slider = function(place,cookie,text,title,tooltips) {
 var btn = createTiddlyButton(place,title,tooltips,config.macros.slider.onClickSlider); 
 var panel = createTiddlyElement(place,"div",null,"timelineSliderPanel",null);
 //panel.setAttribute("cookie",cookie);
 //panel.style.display = config.options[cookie] ? "block" : "none";
 panel.style.display=this.display;
 if(text) wikify(text,panel);
};
//}}}
/***

''This plugin was previously called StyleChooser.''

|Name|SelectThemePlugin|
|Created by|SimonBaird and SaqImtiaz|
|Location|http://lewcid.googlepages.com/lewcid.html#SelectThemePlugin|
|Version|1.2.3|
|Requires|~TW2.x|
!Description
*An alternative style switcher, can be used to switch just stylesheets and/or pagetemplates, or a combination of both (a theme)
*you can add your own stylesheets and pagetemplates, or use a ThemePack, like BigThemePack.

!Usage
* You have to have fetch or create some styleSheets and pageTemplates to use this plugin.
**You can either get a ThemePack like BigThemePack which automatically adds themes to ThemeSelect.
**or create tiddlers with styleSheets and pageTemplates and tag them styleSheets and pageTemplates respectively.
* Put {{{<<themeSelect style 'Select theme'>>}}} in your SideBarOptions.

!Creating Theme Packs
*You can create your own theme pack if you like. Instructions can be found [[here.|CreateThemePack]]

!History
* 15-May-06, v1.2.3, added paramifier so you can put theme on url, eg http://www.somewhere.com/twfile.html#theme:Berry2, thanks Clint (Simon).
* 28-Apr-o6, v1.2.2, fixed bug with opening TW after deleting themepacks. (Saq)
* 26-Apr-06, v1.2.1, more code optimization, dropdowns now updated on the fly. (Saq)
* 25-Apr-06, v1.2.0, added 3rd party ThemePack support, and made various other improvements.(Simon & Saq)
* 24-Apr-06, v1.1.0, added: no styles and default styles options,<<br>>support for ThemePack, support for tag variations(Saq)
* 21-Apr-06, v1.0.0, Reworked dropdowns to include option for pagetemplates (Saq)
* 21-Apr-06, v0.9.0, Rewrote and added Saq's lovely dropdown select (Simon)
* 20-Apr-06, v0.0.1, Basic switcher working (Simon)

!Examples
|!Source|!Output|h
|{{{<<themeSelect style>>}}} for a dropdown with StyleSheets|<<themeSelect style>>|
|{{{<<themeSelect pagetemplate>>}}} for a dropdown with PageTemplates|<<themeSelect pagetemplate>>|
|{{{<<themeSelect style customlabel>>}}} to use a customlabel|<<themeSelect style customlabel>>|
* When applying a stylesheet or template, it also looks for a template or stylesheet respectively based on naming convention, eg MyFunkyStyleSheet and MyFunkyPageTemplate.

!Notes
* See also http://www.tiddlytools.com/#SelectStyleSheetPlugin for a more feature-rich style sheet switcher

! Ideas
* do ViewTemplate also?
* Pretty up the [x] bit

!Code
***/
//{{{
// for compatibility with TW <2.0.9
if (!Array.prototype.contains)
 Array.prototype.contains = function(item)
 {
 return this.find(item) != null;
 };

// for compatibility with TW <2.0.9
if (!Array.prototype.containsAny)
 Array.prototype.containsAny = function(items)
 {
 for(var i=0; i<items.length; i++)
 if (this.contains(items[i]))
 return true;
 return false;
 };
//}}}

//{{{
version.extensions.SelectTheme = { major: 1, minor: 2, revision: 3, date: new Date(2006,5,15),
 source: "http://lewcid.googlepages.com/lewcid.html#SelectTheme"
};

config.SelectTheme = {
 things: {
 style: {
 tag: ["StyleSheets","StyleSheet","styleSheet","styleSheets","stylesheet","stylesheets"],
 theDefault: "StyleSheet",
 suffix: "StyleSheet",
 notify: refreshStyles,
 cookie: "txtStyleSheet",
 otherThing: "pagetemplate",
 label: "Choose StyleSheet: ",
 tooltip: "Choose a StyleSheet",
 caseNone: { text:"None", title:"NoStyleSheet"},
 caseDefault: { text:"Default", title:"StyleSheet" }

 },
 pagetemplate: {
 tag: ["PageTemplates","PageTemplate","pageTemplates","pageTemplate","pagetemplate","pagetemplates"],
 theDefault: "PageTemplate",
 suffix: "PageTemplate",
 notify: refreshPageTemplate,
 cookie: "txtPageTemplate",
 otherThing: "style",
 label: "Choose PageTemplate: ",
 tooltip: "Choose a PageTemplate",
 caseNone: { text:"None", title:"NoPageTemplate"},
 caseDefault: { text:"Default", title:"PageTemplate" }
 }

 },

 specialCases: ["caseNone","caseDefault"]

};

TiddlyWiki.prototype.removeNotification = function(title,fn) {
 for (var i=0;i<this.namedNotifications.length;i++)
 if((this.namedNotifications[i].name == title) && (this.namedNotifications[i].notify == fn))
 this.namedNotifications.splice(i,1); // counting on it only being there once
}


var things = config.SelectTheme.things;
var specialCases=config.SelectTheme.specialCases;

for (var t in things) {
 // make sure we have a value
 if (!config.options[things[t].cookie])
 config.options[things[t].cookie] = things[t].theDefault;

 // remove core notify
 store.removeNotification(things[t].theDefault,things[t].notify);

 // and add our one
 store.addNotification(config.options[things[t].cookie],things[t].notify);

}

//checks to see if a tiddler exists in store or as a shadow.
TiddlyWiki.prototype.isTiddler= function (title)
 {return store.tiddlerExists(title) || store.isShadowTiddler(title)}

//hijack core function & make sure template exists
window.applyPageTemplate_themeSelect=window.applyPageTemplate;
window.applyPageTemplate=function(title){
 if(!store.isTiddler(title))
 {title = things.pagetemplate.theDefault;}
 applyPageTemplate_themeSelect(title);
 }

TiddlyWiki.prototype.makeActiveTheme = function(what,title,alsoCheckOtherThing) {

 var thing = things[what];
 if (!store.isTiddler(title))
 title = thing.theDefault;

 var oldTitle = config.options[thing.cookie];

 if (what == "style") {
 // remove old style element from DOM
 var oldStyleElement = document.getElementById(oldTitle);
 oldStyleElement.parentNode.removeChild(oldStyleElement);
 }

 store.removeNotification(oldTitle,thing.notify);
 store.addNotification(title,thing.notify);
 store.notify(title);

 config.options[thing.cookie] = title;
 saveOptionCookie(thing.cookie);
 if (alsoCheckOtherThing)
 this.makeActiveTheme(thing.otherThing,
 title.replace(new RegExp(thing.suffix+"$"),"") + things[thing.otherThing].suffix,
 false);
};


config.shadowTiddlers.NoStyleSheet = "";
config.shadowTiddlers.NoPageTemplate = config.shadowTiddlers.PageTemplate;


function switchTheme(e){
 if (!e) var e = window.event;
 var theTarget = resolveTarget(e);
 var theLink = theTarget;
 var switchTo= theLink.getAttribute("switchTo");
 var mode = theLink.getAttribute("mode");
 if ((config.options[things[mode].cookie])!=switchTo)
 {store.makeActiveTheme(mode,switchTo,true);};
 return(false);
}


config.macros.themeSelect={};
config.macros.themeSelect.dropdownchar = (document.all?"▼":"▾");
config.macros.themeSelect.handler = function(place,macroName,params,wikifier,paramString,tiddler){
 var arrow = config.macros.themeSelect.dropdownchar;
 var mode = params[0];
 var label = (params[1]?params[1]:things[mode].label) + arrow;
 var cookie = (config.options[things[mode].cookie]);

 var onclick = function(e)
 { if (!e) var e = window.event;
 var popup = Popup.create(this);

 var tagged=[];

 store.forEachTiddler(function(title,tiddler) {
 if ((tiddler.tags).containsAny(things[mode].tag)){
 tagged.push(tiddler.title);}
 });

 //integrate ThemePacks
 if (config.themes) {
 // see what themes have been loaded...
 for (var i=0;i<config.themes.length;i++) {
 // see if there is one
 var lookForThis = config.themes[i] + things[mode].suffix;
 if (store.isShadowTiddler(lookForThis)) {
 tagged.pushUnique(lookForThis);
 }
 }
 tagged = tagged.sort();
 }

 //this function used later to create buttons
 var createThemeButton = function(switchTo){
 var theButton = createTiddlyButton(createTiddlyElement(popup,"li"),text,null,switchTheme,useClass);
 theButton.setAttribute("switchTo",switchTo);
 theButton.setAttribute("mode",mode);};

 //create Buttons for None(shadow styles) & Default (StyleSheet)
 // Default button is not created if StyleSheet doesnt exist.
 for(var t=0; t<specialCases.length; t++){
 var special = specialCases[t];
 var text = things[mode][special].text;
 var useClass = "tiddlyLinkExisting"; //redundant, optimize!
 if ((things[mode][special].title==cookie)||(special=="caseNone"&&!store.isTiddler(cookie)))
 {text+= " [x]";
 useClass = "currentlySelected";}
 if (!((special=="caseDefault")&&(!store.getTiddler(things[mode][special].title))))
 createThemeButton(things[mode][special].title); }

 //insert horizontal rule
 createTiddlyElement(createTiddlyElement(popup,"li"),"hr");

 //create buttons for all other stylesheet tiddlers
 for(var t=0; t<tagged.length; t++)
 { var useClass = "tiddlyLinkExisting";
 var text = (tagged[t]).replace((things[mode].suffix),"");
 if (tagged[t]==(cookie) )
 {text+=" [x]"; useClass="currentlySelected";}
 if ((tagged[t]!= (things[mode].theDefault))&&tagged[t]!= (things[mode].none))
 {createThemeButton(tagged[t]);}}
 Popup.show(popup,false);
 e.cancelBubble = true;
 if (e.stopPropagation)
 e.stopPropagation();
 return(false);
 };

 var createdropperButton = function(place){
 var sp = createTiddlyElement(place,"span",null,"ThemeChooserButton");
 var theDropDownBtn = createTiddlyButton(sp,label,things[mode].tooltip,onclick);
 };

 createdropperButton(place);
};


setStylesheet(".popup li a.currentlySelected {background:#ccc;color:black;font-weight:bold;}","currentlySelectedStyle"); // could do better probably...

config.macros.layoutChooser=config.macros.themeSelect;

//shadow tiddler to hold instructions for creating ThemePacks
config.shadowTiddlers.ThemePack='See http://simonbaird.com/mptw/#CreateThemePack'; 

config.macros.applyTheme = {handler: function (place,macroName,params,wikifier,paramString,tiddler) {
 var theme = params[0];
 var label = params[1]?params[1]:'Apply theme "' + theme + '"';
 var tooltip = 'Apply the "'+theme+'" theme to this TiddlyWiki';
 createTiddlyButton(place,label,tooltip,function() {
 store.makeActiveTheme("style",theme+things.style.suffix,true);
 });
}};


// this means you can put #theme:ThemeName in url. suggested by Clint
config.paramifiers.theme = {
 onstart: function(themeName) {
 store.makeActiveTheme("style",themeName+config.SelectTheme.things.style.suffix,true);
 }
};

//}}}
|Name|SetTiddlerColumns|
|Source|http://www.TiddlyTools.com/#SetTiddlerColumns|
|Version|1.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires||
|Overrides||
|Description|use CSS3 "-moz-column-count" to set single or multi-column tiddler layout|

usage: <<tiddler SetTiddlerColumns>>

credits: Much thanks to "maki" (www.makiaea.org) for pointing out the -moz-column-* attributes.
Important note: these CSS3 features are not supported in InternetExplorer.

<script>
	// init option value (as needed) and set CSS3 column attribute on tiddlerDisplay/storyDisplay
	if (config.options.txtTiddlerColumns==undefined) config.options.txtTiddlerColumns="1";
	var td=document.getElementById("tiddlerDisplay");  // for TW2.1.x and earlier
	if (!td) td=document.getElementById("storyDisplay");  // for TW2.2+
	td.style.MozColumnCount=config.options.txtTiddlerColumns;
</script># of tiddler columns: {{smallform{<<option txtTiddlerColumns>><script>
	var t=place.lastChild
	t.style.width="2em";
	t.value=config.options.txtTiddlerColumns;
	if (config.browser.isIE) {
		t.disabled=true;
		t.value=1;
		t.title="Sorry, multiple column tiddler display is not supported in Internet Explorer";
		return;
	}
	// hijack onchange for this field so CSS can be updated on the fly
	t.coreOnChange=t.onchange;
	t.onchange=function() {
		// call original core onchange handler
		if (this.coreOnChange) this.coreOnChange();
		// set CSS3 column attribute
		var td=document.getElementById("tiddlerDisplay");  // for TW2.1.x and earlier
		if (!td) td=document.getElementById("storyDisplay");  // for TW2.2+
		td.style.MozColumnCount=this.value;
		// sync any option field that is showing txtTiddlerColumns value
		var nodes = document.getElementsByTagName("input");
		for(var t=0; t<nodes.length; t++) 
			if(nodes[t].getAttribute("option")=="txtTiddlerColumns") nodes[t].value=this.value;
	};
</script>}}}
<<closeAll>><<newTiddler>><<newJournal 'DD MMM YYYY'>><<saveChanges>><<tiddler TspotSidebar>><<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Change TiddlyWiki advanced options'>>
/***
|Name|SinglePageModePlugin|
|Source|http://www.TiddlyTools.com/#SinglePageModePlugin|
|Version|2.5.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.displayTiddler(), Story.prototype.displayTiddlers()|
|Description|Display tiddlers one at a time with automatic update of URL (permalink).  Also, options to always open tiddlers at top/bottom of page|

Normally, as you click on the links in TiddlyWiki, more and more tiddlers are displayed on the page. The order of this tiddler display depends upon when and where you have clicked. Some people like this non-linear method of reading the document, while others have reported that when many tiddlers have been opened, it can get somewhat confusing.

!!!!!Usage
<<<
SinglePageMode allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one item displayed at a time.  When SinglePageMode is enabled, the title of the current tiddler is automatically displayed in the browser window's titlebar.  In addition, the browser's location URL is updated with a 'permalink' for the current tiddler so that it is easier to create a browser 'bookmark' for the current tiddler.  You can disable the URL update action

Even when SinglePageMode is disabled (i.e., displaying multiple tiddlers is permitted), you can reduce the potential for confusion by enable TopOfPageMode (or BottomOfPageMode), which forces tiddlers to always open at the top (or bottom) of the page instead of being displayed following the tiddler containing the link that was clicked.

note: when used on the Safari browser, adding the permalink to the URL seems to create a problem whereby tiddlers cannot be properly displayed.  In the short-term, to avoid this problem, this feature is disabled when using Safari.  This does not affect usage under other browsers, and other plugin options will still be applied as configured below...
<<<
!!!!!Configuration
<<<
When installed, this plugin automatically adds checkboxes in the AdvancedOptions tiddler so you can enable/disable the plugin behavior.  For convenience, these checkboxes are also included here:

<<option chkSinglePageMode>> Display one tiddler at a time
<<option chkSinglePagePermalink>> Automatically permalink current tiddler
<<option chkTopOfPageMode>> Always open tiddlers at the top of the page
<<option chkBottomOfPageMode>> Always open tiddlers at the bottom of the page
//(note: if both 'top' and 'bottom' settings are selected, "top of page" is used)//
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''SinglePageModePlugin'' (tagged with <<tag systemConfig>>)

When installed, this plugin automatically adds checkboxes in the ''shadow'' AdvancedOptions tiddler so you can enable/disable this behavior.  However, if you have customized your AdvancedOptions, you may need to ''manually add these checkboxes to your customized tiddler.''
<<<
!!!!!Revision History
<<<
2007.10.08 [2.5.1] if displayTiddler(), when using single-page or top-of-page mode, scrollTo(0,0) to ensure that page header is in view.
2007.09.13 [2.5.0] for TPM/BPM modes, don't force tiddler to redisplay if already shown.  Allows transition between view/edit or collapsed/view templates, without repositioning displayed tiddler.
2007.09.12 [2.4.0] added option to disable automatic permalink feature.  Also, Safari is now excluded from permalinking action to avoid bug where tiddlers don't display after hash is updated.
2007.03.03 [2.3.1] fix typo when adding BPM option to AdvancedOptions (prevented checkbox from appearing)
2007.03.03 [2.3.0] added support for BottomOfPageMode (BPM) based on request from DaveGarbutt
2007.02.06 [2.2.3] in Story.prototype.displayTiddler(), use convertUnicodeToUTF8() for correct I18N string handling when creating URL hash string from tiddler title (based on bug report from BidiX)
2007.01.08 [2.2.2] use apply() to invoke hijacked core functions
2006.07.04 [2.2.1] in hijack for displayTiddlers(), suspend TPM as well as SPM so that DefaultTiddlers displays in the correct order.
2006.06.01 [2.2.0] added chkTopOfPageMode (TPM) handling
2006.02.04 [2.1.1] moved global variable declarations to config.* to avoid FireFox 1.5.0.1 crash bug when assigning to globals
2005.12.27 [2.1.0] hijack displayTiddlers() so that SPM can be suspended during startup while displaying the DefaultTiddlers (or #hash list).  Also, corrected initialization for undefined SPM flag to "false", so default behavior is to display multiple tiddlers
2005.12.27 [2.0.0] Update for TW2.0
2005.11.24 [1.1.2] When the back and forward buttons are used, the page now changes to match the URL.  Based on code added by Clint Checketts
2005.10.14 [1.1.1] permalink creation now calls encodeTiddlyLink() to handle tiddler titles with spaces in them
2005.10.14 [1.1.0] added automatic setting of window title and location bar ('auto-permalink').  feature suggestion by David Dickens.
2005.10.09 [1.0.1] combined documentation and code in a single tiddler
2005.08.15 [1.0.0] Initial Release
<<<
!!!!!Credits
<<<
This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].
Support for BACK/FORWARD buttons adapted from code developed by Clint Checketts
<<<
!!!!!Code
***/
//{{{
version.extensions.SinglePageMode= {major: 2, minor: 5, revision: 1, date: new Date(2007,10,8)};

if (config.options.chkSinglePageMode==undefined) config.options.chkSinglePageMode=false;
if (config.options.chkSinglePagePermalink==undefined) config.options.chkSinglePagePermalink=true;
if (config.options.chkTopOfPageMode==undefined) config.options.chkTopOfPageMode=false;
if (config.options.chkBottomOfPageMode==undefined) config.options.chkBottomOfPageMode=false;

if (config.optionsDesc) {
	config.optionsDesc.chkSinglePageMode="Display one tiddler at a time";
	config.optionsDesc.chkSinglePagePermalink="Automatically permalink current tiddler";
	config.optionsDesc.chkTopOfPageMode="Always open tiddlers at the top of the page";
	config.optionsDesc.chkBottomOfPageMode="Always open tiddlers at the bottom of the page";
} else {
	config.shadowTiddlers.AdvancedOptions += "\
		\n<<option chkSinglePageMode>> Display one tiddler at a time \
		\n<<option chkSinglePagePermalink>> Automatically permalink current tiddler \
		\n<<option chkTopOfPageMode>> Always open tiddlers at the top of the page \
		\n<<option chkBottomOfPageMode>> Always open tiddlers at the bottom of the page";
}

config.SPMTimer = 0;
config.lastURL = window.location.hash;
function checkLastURL()
{
	if (!config.options.chkSinglePageMode)
		{ window.clearInterval(config.SPMTimer); config.SPMTimer=0; return; }
	if (config.lastURL == window.location.hash)
		return;
	var tiddlerName = convertUTF8ToUnicode(decodeURI(window.location.hash.substr(1)));
	tiddlerName=tiddlerName.replace(/\[\[/,"").replace(/\]\]/,""); // strip any [[ ]] bracketing
	if (tiddlerName.length) story.displayTiddler(null,tiddlerName,1,null,null);
}

if (Story.prototype.SPM_coreDisplayTiddler==undefined) Story.prototype.SPM_coreDisplayTiddler=Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function(srcElement,title,template,animate,slowly)
{
	if (config.options.chkSinglePageMode)
		story.closeAllTiddlers();
	else if (config.options.chkTopOfPageMode)
		arguments[0]=null;
	else if (config.options.chkBottomOfPageMode)
		arguments[0]="bottom";
	if (config.options.chkSinglePageMode && config.options.chkSinglePagePermalink && !config.browser.isSafari) {
		window.location.hash = encodeURIComponent(convertUnicodeToUTF8(String.encodeTiddlyLink(title)));
		config.lastURL = window.location.hash;
		document.title = wikifyPlain("SiteTitle") + " - " + title;
		if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);
	}
	this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler
	var tiddlerElem=document.getElementById(story.idPrefix+title);
	if (tiddlerElem) {
		var yPos=ensureVisible(tiddlerElem);
		if (config.options.chkSinglePageMode||config.options.chkTopOfPageMode) yPos=0;
		window.scrollTo(0,yPos); // make sure header and/or tiddler is scrolled into view
	}
}

if (Story.prototype.SPM_coreDisplayTiddlers==undefined) Story.prototype.SPM_coreDisplayTiddlers=Story.prototype.displayTiddlers;
Story.prototype.displayTiddlers = function(srcElement,titles,template,unused1,unused2,animate,slowly)
{
	// suspend single-page mode (and/or top/bottom display options) when showing multiple tiddlers
	var saveSPM=config.options.chkSinglePageMode; config.options.chkSinglePageMode=false;
	var saveTPM=config.options.chkTopOfPageMode; config.options.chkTopOfPageMode=false;
	var saveBPM=config.options.chkBottomOfPageMode; config.options.chkBottomOfPageMode=false;
	this.SPM_coreDisplayTiddlers.apply(this,arguments);
	config.options.chkBottomOfPageMode=saveBPM;
	config.options.chkTopOfPageMode=saveTPM;
	config.options.chkSinglePageMode=saveSPM;
}
//}}}

Linux for Dogs
[[Slackbook - beta|http://slackbook.org/beta/]]
/***
!Metadata:
|''Name:''|Slider2Plugin|
|''Description:''||
|''Version:''|1.0.1|
|''Date:''|Mar 20, 2007|
|''Source:''|http://www.sourceforge.net/projects/ptw/|
|''Author:''|BramChen (bram.chen (at) gmail (dot) com)|
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License]]|
|''~CoreVersion:''|2.1.0|
|''Browser:''|Firefox 1.5+ (the firefox extension, XTML Ruby support, is required)|
!Syntax:
{{{
	<<slider2 tiddlerTitle sliderTitle toolsip>>
	or {{custClass{<<slider2 tiddlerTitle sliderTitle toolsip>><<slider2 ...>>...<slider2...>>}}}
}}}
<<<
tiddlerTitle: the title of tiddler to include in the slider
sliderTitletitle: text of the slider
toolsip: tooltip text of the slider
custClass: optional, for grouping the sliders and/or assigning a group style.
<<<
!Revision History:
|''Version''|''Date''|''Note''|
|1.0.1|Mar 20, 2007|Added animation collapse|
|1.0.0|Mar 18, 2007|Initial release|
!Code section:
***/
//{{{
config.slider2 = {};
config.macros.slider2 = {
	onClickSlider: function(e){
		if (!e) var e = window.event;
		var n = this.nextSibling;
		var isOpen = n.style.display != "none";
		var nodes = this.parentNode.childNodes;
		for(var i=0; i<nodes.length; i++){
			if(nodes[i].title && nodes[i].title != this.title){
				if(nodes[i].nextSibling.className = "sliderPanel"){
					if(config.slider2[this.parentNode.className] == nodes[i].title){
						if(config.options.chkAnimate)
							anim.startAnimating(new Slider(nodes[i].nextSibling, false,e.shiftKey || e.altKey,"none"));
						else 
							nodes[i].nextSibling.style.display = "none";
					}
				}
			}
		}
		if (config.options.chkAnimate)
			setTimeout(function(){anim.startAnimating(new Slider(n,!
isOpen,null,"none"));},300);
//			anim.startAnimating(new Slider(n,!isOpen,e.shiftKey || e.altKey,"none"));
		else
			n.style.display = isOpen ? "none" : "block";
		config.slider2[this.parentNode.className] = isOpen ? "" : this.title;
		return false;
	},

	createSlider: function(place,title,tooltip){
		var btn = createTiddlyButton(place,title,tooltip,this.onClickSlider);
		var panel = createTiddlyElement(place,"div",null,"sliderPanel",null);
		panel.style.display = "none";
		return panel;
	},

	handler: function(place,macroName,params){
		params[2] = params[2]?params[2]:params[0];
		var panel = this.createSlider(place,params[1],params[2]);
		var text = store.getTiddlerText(params[0]);
		if(text)
			wikify(text,panel,null,store.getTiddler(params[0]));
	}
};
//}}}
[[MicroPup|http://www.murga-linux.com/puppy/viewtopic.php?t=14918&start=30&sid=905e309de5a98512e5c75c569024e626]]
Complete Source Code for bs
All functions in bs have been shown. The code is completed by adding include files, function prototypes, and global variables declarations. So here it is, as I originally wrote it in 1992; only 134 lines of C:

/*{{{*/
* bs.c
* simple button shell for X11
* Luiz Henrique de Figueiredo (lhf@visgraf.impa.br)
* 05 Nov 92
 
/*}}}*/
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Xaw/Command.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Label.h>

typedef void Callback(Widget w, caddr_t client_data, caddr_t call_data);

void	doargs		(int argc, char* argv[]);
void	makemenu	(void);
void	execute		(char* s);
Widget	addlabel	(char* label);
Widget	addbutton	(char* label, Callback* f, char* p);
void	do_it		(Widget w, caddr_t client_data, caddr_t call_data);
void	do_quit		(Widget w, caddr_t client_data, caddr_t call_data);

static	Widget		toplevel;
static	Widget		form;
static	Widget		wh=NULL;
static	Widget		wv=NULL;
static	FILE*		shell;

int main(int argc, char* argv[])
{
 shell=popen("/bin/sh","w");
 doargs(argc,argv);
 makemenu();
 XtRealizeWidget(toplevel);
 XtMainLoop();
 return 0;
} 

void doargs(int argc, char* argv[])
{
 char* f;
 toplevel=XtInitialize(argv[0],"bs",NULL,0,&argc,argv);
 switch (argc)
 {
  case 1:
   f=".bsrc";
   break;
  case 2:
   f=argv[1];
   break;
  default:
   fprintf(stderr,"usage: bs [menu-file] [X toolkit options]\n");
   exit(1);
 }
 if (freopen(f,"r",stdin)==NULL)
 {
  fprintf(stderr,"bs: cannot open ");
  perror(f);
  exit(1);
 }
}

void makemenu(void)
{
 char s[BUFSIZ];
 form=XtCreateManagedWidget("form",formWidgetClass,toplevel,NULL,0);
 while (fgets(s,sizeof(s),stdin))
 {
  char* t;
  if (*s=='\n')				/* empty line: new row */
  {
   if (wh!=NULL)			/* handle multiple empty lines */
   {
    wv=wh;
    wh=NULL;
   }
   continue;
  }
  t=strchr(s,'\t');
  if (t==NULL)				/* empty command: label */
   wh=addlabel(s);
  else if (t==s)			/* empty button label: prolog */
   execute(s);
  else					/* button */
  {
   *t++=0;
   wh=addbutton(s,do_it,t);
  }
 }
 addbutton("quit",do_quit,NULL);
}

void execute(char* s)
{
 fputs(s,shell);
 fflush(shell);
}

Widget addlabel(char* label)
{
 Widget w=XtVaCreateManagedWidget(label,labelWidgetClass,form,
	XtNfromHoriz,	(XtArgVal) wh,
	XtNfromVert,	(XtArgVal) wv,
	XtNborderWidth,	(XtArgVal) 0,
	NULL);
 return w;
}

Widget addbutton(char* label, Callback* f, char* p)
{
 Widget w=XtVaCreateManagedWidget(label,commandWidgetClass,form,
	XtNfromHoriz,	(XtArgVal) wh,
	XtNfromVert,	(XtArgVal) wv,
	NULL);
 XtAddCallback(w,XtNcallback,f,XtNewString(p));
 return w;
}

void do_it(Widget w, caddr_t client_data, caddr_t call_data)
{
 execute(client_data);
}

void do_quit(Widget w, caddr_t client_data, caddr_t call_data)
{
 pclose(shell);
 exit(0);
}
[[Start-up manual|http://www.comptechdoc.org/os/linux/startupman/]]
[[Tool Bar]]

/***
!!!General
***/
/*{{{*/
body {
 background: #EDEDED;
}


 #contentWrapper{
 background: #EDEDED;
 border:1px solid #DDD;
 margin: 0 1em;
 padding:0;

height:1%;
}
/*}}}*/

/***
!!!Links
***/
/*{{{*/
a,
a.tiddlyLink,
a.button,
a.externalLink,
#sidebarOptions .sliderPanel a{
 color: #1D65BC;
 text-decoration: none;
 background: transparent;
 border: 0;
}

a:hover,
a.tiddlyLink:hover,
a.button:hover,
a.externalLink:hover,
#sidebarOptions .sliderPanel a:hover
{
 border: 0;
 color: #1D65BC;
 text-decoration: underline;
background:transparent;
}
/*}}}*/

/***
!!!Header
***/
/*{{{*/
.header {
 background: transparent url(bg.gif); 
/*  background: #bcd;   */
 }
.gradient {margin-top:1.3em; background:#3371A3;}
.titleLine{padding: 30px 40px 15px 30px;}
.titleLine a:hover{color:#fff; border-bottom:1px dotted #eee; text-decoration:none;}
.titleLine a{color:#fff; border-bottom:1px dotted #ccc;}
.siteTitle {
 font-size: 2.2em;
 font-weight: bold;
 color:#fff;
}

.siteSubtitle {
 font-size: 1.0em;
 display: block;
 margin: .3em auto 1em;
color:#fff;
}
/*}}}*/

/***
!!!TopMenu
***/
/*{{{*/
#topMenu br {display:none; }
#topMenu { background: #3371A3; font-size:1em; }
#topMenu { padding:5px 32px; }
#topMenu .button, #topMenu .tiddlyLink {
 margin-left:0.1em; margin-right:0.1em;
 padding:0.5em;
 color:white; font-weight:bold;
}
#topMenu a.button:hover, #topMenu a.tiddlyLink:hover { background:#fff; color:#333; text-decoration:none;}

 /*}}}*/

/***
!!!Display
***/
/***
!!!Display General
***/
/*{{{*/

#displayArea { margin: 0em 15.7em 0em 0em; }
#displayFooter {
 clear: both;
}
/*}}}*/
/***
!!!Tiddler
***/
/*{{{*/
.tiddler {
font-size:1.2em;
padding: 1em 1em 1em 1em;
border: 2px solid #6688aa;
border-width: 2px 2px 2px 2px;
}

/*.tiddler {margin-bottom:1em; padding-bottom:1em;}
  .tiddler {padding-left:1.5em;}  */
  
.title {color:#333; font-size:1.3em;  padding-bottom:0.5px;}
.subtitle { font-size:90%; color:#bbb; padding-left:0.25em; margin-top:0.1em; }
.shadow .title {
color: #aaa;
}

h1,h2,h3,h4,h5 { color: #333; background: transparent; padding-bottom:2px; border-bottom: 1px dotted #666; }

* html .viewer pre {
 margin-left: 0em; 
}

.viewer hr {
 border: 0;
 border-top: solid 1px #333;
 margin: 0 8em;
 color: #333;
}

.viewer a.button {color:#000; border:1px solid #1D65BC; font-weight:bold;}
.viewer a.button:hover{color:#fff; background:#3371a3; text-decoration:none;}

.tagClear {clear:none;}
/*}}}*/
/***
!!!Editor
***/
/*{{{*/

* html .editor textarea, * html .editor input {
 width: 98%;
}
/*}}}*/
/***
!!!Sidebar
***/
/*{{{*/
#sidebar{
position:relative;
float:right;
margin-bottom:1em;
display:inline;
width: 16em;
}
/*}}}*/


.toolbar .button {color:#bbb; border:none;}
.toolbar .button:hover, .toolbar .highlight, .toolbar .marked, .toolbar a.button:active {background:transparent; color:#111; border:none;}   /* text-decoration:underline*/
/*   .tiddler {border-bottom:3px solid #EEF1F3; padding-bottom:2em; padding-top:0em;}
.title {border-bottom:none; margin-right:8em;} ======================================= */

h1,h2,h3,h4,h5 { color: #333; background: transparent; padding-bottom:2px; border-bottom: none; }

#sidebar {background: #EBEEF1 ; right:0;}
#displayFooter {
 clear: both;
}
#tiddlerDisplay{padding-top:1em;}
#sidebar .tabSelected, #sidebar .tabSected:hover {
 color: #000;
 background: #dbdee3;
 border-top: solid 1px #B2B6BE;
 border-left: solid 1px #B2B6BE;
 border-right: solid 1px #B2B6BE;
 border-bottom:solid 1px #dbdee3 !important;
padding-bottom:1px;
text-decoration:none;
}

#sidebarOptions, #sidebarTabs {border-left: 1px solid #B2B6BE;}
#sidebarTabs {border-bottom: 1px solid #B2B6BE;}
#sidebar .tabUnselected, #sidebar .tabUnselected:hover {
color: #F0F3F5;
background: #B2B6BE ;
border: solid 1px #B2B6BE ;
padding-bottom:1px;
}

#sidebarTabs .tabContents {border:none; background:#DBDEE3; }
#sidebarTabs .tabContents {border-top:1px solid #B2B6BE;}
#sidebarTabs .tabContents .tabContents {border-left:1px solid #b2b6be;}

.viewer pre, .viewer code {
border: 1px solid #B2B6BE;
background: #EBEEF1;} 

#sidebarOptions .sliderPanel {
 background: #EBEEF1; border:none;
}

#sidebarOptions input {
 border: 1px solid #1d65bc;
}

#sidebarOptions input:hover, #sidebarOptions input:active, #sidebarOptions input:focus {
 border: 1px inset #3371a3;
}

.tagging, .tagged {
 border: 1px solid #dbdee3;
 background-color: #ebeef1;
}
.selected .tagging, .selected .tagged {
 background-color: #dbdee3;
 border: 1px solid #B2B6BE;
}
 .tagging .listTitle, .tagged .listTitle {
 color: #bbb;
}
.selected .tagging .listTitle, .selected .tagged .listTitle {
 color: #014; 
}
.tagging .button:hover, .tagged .button:hover {
 border: none; background:transparent; text-decoration:underline; color:#014;
}
.tagged .highlight, .tagged .marked, .tagged a.button:active {text-decoration:underline; background:transparent; color:#014;}
.tagging .button, .tagged .button {
 color:#bbb;
}
.selected .tagging .button, .selected .tagged .button {
 color:#014;
}
.viewer blockquote {
 border-left:7px solid #ebeef1;
}

.viewer table {
 border: 1px solid #3371a3;
}
.viewer th, thead td {
 background: #3371a3;
 border: 1px solid #3371a3;
 color: #fff;
}
.viewer td, .viewer tr {
 border: 1px solid #3371a3;
}
.editor input, .editor textarea {
 border: 1px solid #1d65bc; background:#ebeef1;
}
.editor {padding-top:0.3em;}
.editor textarea:focus, .editor input:focus {
 border: 1px inset #3371a3; background:#fff;
}
.popup {
 background: #3371a3;
 border: 1px solid #333;
}
.popup hr {
 color: #333;
 background: #333;
 border-bottom: 1px;
}
.popup li.disabled {
 color: #333;
}
.popup li a, .popup li a:visited {
 color: #eee;
 border: none;
}
.popup li a:hover {
 background: #3371a3;
 color: #fff;
 border: none;
 text-decoration:underline;
}
.viewer .button:active, .viewer .marked, .viewer .highlight {
color: #fff !important;
background: #3371a3;
border: 0;
}
.button:active {background:#1d65bc; border:0;}
#sidebar .button:active, #sidebar .marked, #sidebar .highlight {color:#014; background:transparent;text-decoration:none}
#messageArea {
 border: 2px dashed #3371a3;
 background: #dbdee3;
 color: #fff;
 font-size:90%;
}

#messageArea .button {
 color: #1d65bc;
 background: #ebeef1;
 text-decoration:none;
 font-weight:bold;
 border:none; 
}
#messageArea a.button {color:#1d65bc;}
#messageArea .button:hover {text-decoration:underline;}

.viewer .tabSelected, .viewer .tabSelected:hover{
 color: #014;
 background: #eee;
 border-left: 1px solid #B2B6BE;
 border-top: 1px solid #B2B6BE;
 border-right: 1px solid #B2B6BE;
}
.viewer .tabUnselected, .viewer .tabUnselected:hover {
 color: #fff;
 background: #B2B6BE;
}
. viewer .tabContents {
 color: #014;
 background: #ebeef1;
 border: 1px solid #B2B6BE;
}
.searchBar {float:right; font-size:0.9em;}
.searchBar .button {display:block; border:none; color:#ccc;}
.searchBar .button:hover{border:none; color:#eee;}
.searchBar input{
 border: 1px inset #1d65bc; background:#dbdee3;
}
.searchBar input:focus {
 border: 1px inset #3371a3; background:#fff;
}

.blog h2, .blog h3, .blog h4{
  margin:0;
  padding:0;
border-bottom:none;
}
.blog {margin-left:1.5em;}  
.blog .excerpt {
  margin:0;
  margin-top:0.3em;
  padding: 0;
  margin-left:1em;
  padding-left:1em;
  font-size:90%;
  border-left:1px solid #ddd;
}

#tiddlerWhatsNew h1, #tiddlerWhatsNew h2 {border-bottom:none;}
div[tags~="RecentUpdates"], div[tags~="lewcidExtension"] {margin-bottom: 2em;}
#topMenu .fontResizer {float:right;}
#topMenu .fontResizer .button{border:1px solid #3371A3;}
#topMenu .fontResizer .button:hover {border:1px solid #fff; color:#3371A3;}
#sidebarTabs .txtMainTab .tiddlyLinkExisting {
 font-weight: normal;
 font-style: normal;
}

#sidebarTabs .txtMoreTab .tiddlyLinkExisting {
 font-weight: bold;
 font-style: normal;
}
[[Official site|http://www.tcl.tk/software/tcltk/]]
[[Tclers Wiki|http://wiki.tcl.tk/]]
[[TCL Tutorial|http://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial.html]]
[[TCL manual page|http://www.tcl.tk/man/tcl8.5/TclCmd/Tcl.htm]]
[[PA McClamrock's site|http://www.pa-mcclamrock.com/icebox.html]]
[[TkGames|http://tkgames.sourceforge.net/]]
<<allTags excludeLists>>
<<list tagged [IT]>> 
<<tabs txtMoreTab Shadowed 'Shadowed tiddlers' TabMoreShadowed>>
<<allTags excludeLists [a-z]>>
/***
| Name|TagglyTaggingPlugin|
| Description|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|
| Version|3.1 ($Rev: 2351 $)|
| Date|$Date: 2007-07-12 10:18:02 +1000 (Thu, 12 Jul 2007) $|
| Source|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|
| Author|Simon Baird <simon.baird@gmail.com>|
| License|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
See http://mptw.tiddlyspot.com/#TagglyTagging
***/
//{{{
config.taggly = {

	// for translations
	lingo: {
		labels: {
			asc:        "\u2191", // down arrow
			desc:       "\u2193", // up arrow
			title:      "title",
			modified:   "modified",
			created:    "created",
			show:       "+",
			hide:       "-",
			normal:     "normal",
			group:      "group",
			commas:     "commas",
			sitemap:    "sitemap",
			numCols:    "cols\u00b1", // plus minus sign
			label:      "Tagged as '%0':",
			excerpts:   "excerpts",
			contents:   "contents",
			sliders:    "sliders",
			noexcerpts: "title only"
		},

		tooltips: {
			title:    "Click to sort by title",
			modified: "Click to sort by modified date",
			created:  "Click to sort by created date",
			show:     "Click to show tagging list",
			hide:     "Click to hide tagging list",
			normal:   "Click to show a normal ungrouped list",
			group:    "Click to show list grouped by tag",
			sitemap:  "Click to show a sitemap style list",
			commas:   "Click to show a comma separated list",
			numCols:  "Click to change number of columns",
			excerpts: "Click to show excerpts",
			contents: "Click to show entire tiddler contents",
			sliders:  "Click to show tiddler contents in sliders",
			noexcerpts: "Click to show entire title only"
		}
	},

	config: {
		showTaggingCounts: true,
		listOpts: {
			// the first one will be the default
			sortBy:     ["title","modified","created"],
			sortOrder:  ["asc","desc"],
			hideState:  ["show","hide"],
			listMode:   ["normal","group","sitemap","commas"],
			numCols:    ["1","2","3","4","5","6"],
			excerpts:   ["noexcerpts","excerpts","contents","sliders"]
		},
		valuePrefix: "taggly.",
		excludeTags: ["excludeLists","excludeTagging"],
		excerptSize: 50,
		excerptMarker: "/%"+"%/"
	},

	getTagglyOpt: function(title,opt) {
		var val = store.getValue(title,this.config.valuePrefix+opt);
		return val ? val : this.config.listOpts[opt][0];
	},

	setTagglyOpt: function(title,opt,value) {
		if (!store.tiddlerExists(title))
			// create it silently
			store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),null);
		// if value is default then remove it to save space
		return store.setValue(title,
			this.config.valuePrefix+opt,
			value == this.config.listOpts[opt][0] ? null : value);
	},

	getNextValue: function(title,opt) {
		var current = this.getTagglyOpt(title,opt);
		var pos = this.config.listOpts[opt].indexOf(current);
		// a little usability enhancement. actually it doesn't work right for grouped or sitemap
		var limit = (opt == "numCols" ? store.getTaggedTiddlers(title).length : this.config.listOpts[opt].length);
		var newPos = (pos + 1) % limit;
		return this.config.listOpts[opt][newPos];
	},

	toggleTagglyOpt: function(title,opt) {
		var newVal = this.getNextValue(title,opt);
		this.setTagglyOpt(title,opt,newVal);
	}, 

	createListControl: function(place,title,type) {
		var lingo = config.taggly.lingo;
		var label;
		var tooltip;
		var onclick;

		if ((type == "title" || type == "modified" || type == "created")) {
			// "special" controls. a little tricky. derived from sortOrder and sortBy
			label = lingo.labels[type];
			tooltip = lingo.tooltips[type];

			if (this.getTagglyOpt(title,"sortBy") == type) {
				label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];
				onclick = function() {
					config.taggly.toggleTagglyOpt(title,"sortOrder");
					return false;
				}
			}
			else {
				onclick = function() {
					config.taggly.setTagglyOpt(title,"sortBy",type);
					config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);
					return false;
				}
			}
		}
		else {
			// "regular" controls, nice and simple
			label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];
			tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];
			onclick = function() {
				config.taggly.toggleTagglyOpt(title,type);
				return false;
			}
		}

		// hide button because commas don't have columns
		if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))
			createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");
	},

	makeColumns: function(orig,numCols) {
		var listSize = orig.length;
		var colSize = listSize/numCols;
		var remainder = listSize % numCols;

		var upperColsize = colSize;
		var lowerColsize = colSize;

		if (colSize != Math.floor(colSize)) {
			// it's not an exact fit so..
			upperColsize = Math.floor(colSize) + 1;
			lowerColsize = Math.floor(colSize);
		}

		var output = [];
		var c = 0;
		for (var j=0;j<numCols;j++) {
			var singleCol = [];
			var thisSize = j < remainder ? upperColsize : lowerColsize;
			for (var i=0;i<thisSize;i++) 
				singleCol.push(orig[c++]);
			output.push(singleCol);
		}

		return output;
	},

	drawTable: function(place,columns,theClass) {
		var newTable = createTiddlyElement(place,"table",null,theClass);
		var newTbody = createTiddlyElement(newTable,"tbody");
		var newTr = createTiddlyElement(newTbody,"tr");
		for (var j=0;j<columns.length;j++) {
			var colOutput = "";
			for (var i=0;i<columns[j].length;i++) 
				colOutput += columns[j][i];
			var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class
			wikify(colOutput,newTd);
		}
		return newTable;
	},

	createTagglyList: function(place,title) {
		switch(this.getTagglyOpt(title,"listMode")) {
			case "group":  return this.createTagglyListGrouped(place,title); break;
			case "normal": return this.createTagglyListNormal(place,title,false); break;
			case "commas": return this.createTagglyListNormal(place,title,true); break;
			case "sitemap":return this.createTagglyListSiteMap(place,title); break;
		}
	},

	getTaggingCount: function(title) {
		// thanks to Doug Edmunds
		if (this.config.showTaggingCounts) {
			var tagCount = store.getTaggedTiddlers(title).length;
			if (tagCount > 0)
				return " ("+tagCount+")";
		}
		return "";
	},

	getExcerpt: function(inTiddlerTitle,title,indent) {
    if (!indent)
			indent = 1;
		if (this.getTagglyOpt(inTiddlerTitle,"excerpts") == "excerpts") {
			var t = store.getTiddler(title);
			if (t) {
				var text = t.text.replace(/\n/," ");
				var marker = text.indexOf(this.config.excerptMarker);
				if (marker != -1) {
					return " {{excerpt{<nowiki>" + text.substr(0,marker) + "</nowiki>}}}";
				}
				else if (text.length < this.config.excerptSize) {
					return " {{excerpt{<nowiki>" + t.text + "</nowiki>}}}";
				}
				else {
					return " {{excerpt{<nowiki>" + t.text.substr(0,this.config.excerptSize) + "..." + "</nowiki>}}}";
				}
			}
		}
		else if (this.getTagglyOpt(inTiddlerTitle,"excerpts") == "contents") {
			var t = store.getTiddler(title);
			if (t) {
				return "\n{{contents indent"+indent+"{\n" + t.text + "\n}}}";
			}
		}
		else if (this.getTagglyOpt(inTiddlerTitle,"excerpts") == "sliders") {
			var t = store.getTiddler(title);
			if (t) {
				return "<slider slide>\n{{contents{\n" + t.text + "\n}}}\n</slider>";
			}
		}
		return "";
	},

	notHidden: function(t,inTiddler) {
		if (typeof t == "string") 
			t = store.getTiddler(t);
		return (!t || !t.tags.containsAny(this.config.excludeTags) ||
				(inTiddler && this.config.excludeTags.contains(inTiddler)));
	},

	// this is for normal and commas mode
	createTagglyListNormal: function(place,title,useCommas) {

		var list = store.getTaggedTiddlers(title,this.getTagglyOpt(title,"sortBy"));

		if (this.getTagglyOpt(title,"sortOrder") == "desc")
			list = list.reverse();

		var output = [];
		var first = true;
		for (var i=0;i<list.length;i++) {
			if (this.notHidden(list[i],title)) {
				var countString = this.getTaggingCount(list[i].title);
				var excerpt = this.getExcerpt(title,list[i].title);
				if (useCommas)
					output.push((first ? "" : ", ") + "[[" + list[i].title + "]]" + countString + excerpt);
				else
					output.push("*[[" + list[i].title + "]]" + countString + excerpt + "\n");

				first = false;
			}
		}

		return this.drawTable(place,
			this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),
			useCommas ? "commas" : "normal");
	},

	// this is for the "grouped" mode
	createTagglyListGrouped: function(place,title) {
		var sortBy = this.getTagglyOpt(title,"sortBy");
		var sortOrder = this.getTagglyOpt(title,"sortOrder");

		var list = store.getTaggedTiddlers(title,sortBy);

		if (sortOrder == "desc")
			list = list.reverse();

		var leftOvers = []
		for (var i=0;i<list.length;i++)
			leftOvers.push(list[i].title);

		var allTagsHolder = {};
		for (var i=0;i<list.length;i++) {
			for (var j=0;j<list[i].tags.length;j++) {

				if (list[i].tags[j] != title) { // not this tiddler

					if (this.notHidden(list[i].tags[j],title)) {

						if (!allTagsHolder[list[i].tags[j]])
							allTagsHolder[list[i].tags[j]] = "";

						if (this.notHidden(list[i],title)) {
							allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"
										+ this.getTaggingCount(list[i].title) + this.getExcerpt(title,list[i].title) + "\n";

							leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers

						}
					}
				}
			}
		}

		var allTags = [];
		for (var t in allTagsHolder)
			allTags.push(t);

		var sortHelper = function(a,b) {
			if (a == b) return 0;
			if (a < b) return -1;
			return 1;
		};

		allTags.sort(function(a,b) {
			var tidA = store.getTiddler(a);
			var tidB = store.getTiddler(b);
			if (sortBy == "title") return sortHelper(a,b);
			else if (!tidA && !tidB) return 0;
			else if (!tidA) return -1;
			else if (!tidB) return +1;
			else return sortHelper(tidA[sortBy],tidB[sortBy]);
		});

		var leftOverOutput = "";
		for (var i=0;i<leftOvers.length;i++)
			if (this.notHidden(leftOvers[i],title))
				leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + this.getExcerpt(title,leftOvers[i]) + "\n";

		var output = [];

		if (sortOrder == "desc")
			allTags.reverse();
		else if (leftOverOutput != "")
			// leftovers first...
			output.push(leftOverOutput);

		for (var i=0;i<allTags.length;i++)
			if (allTagsHolder[allTags[i]] != "")
				output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(allTags[i]) + this.getExcerpt(title,allTags[i]) + "\n" + allTagsHolder[allTags[i]]);

		if (sortOrder == "desc" && leftOverOutput != "")
			// leftovers last...
			output.push(leftOverOutput);

		return this.drawTable(place,
				this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),
				"grouped");

	},

	// used to build site map
	treeTraverse: function(title,depth,sortBy,sortOrder) {

		var list = store.getTaggedTiddlers(title,sortBy);
		if (sortOrder == "desc")
			list.reverse();

		var indent = "";
		for (var j=0;j<depth;j++)
			indent += "*"

		var childOutput = "";
		for (var i=0;i<list.length;i++)
			if (list[i].title != title)
				if (this.notHidden(list[i].title,this.config.inTiddler))
					childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder);

		if (depth == 0)
			return childOutput;
		else
			return indent + "[["+title+"]]" + this.getTaggingCount(title) + this.getExcerpt(this.config.inTiddler,title,depth) + "\n" + childOutput;
	},

	// this if for the site map mode
	createTagglyListSiteMap: function(place,title) {
		this.config.inTiddler = title; // nasty. should pass it in to traverse probably
		var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"));
		return this.drawTable(place,
				this.makeColumns(output.split(/(?=^\*\[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic
				"sitemap"
				);
	},

	macros: {
		tagglyTagging: {
			handler: function (place,macroName,params,wikifier,paramString,tiddler) {
				var refreshContainer = createTiddlyElement(place,"div");
				// do some refresh magic to make it keep the list fresh - thanks Saq
				refreshContainer.setAttribute("refresh","macro");
				refreshContainer.setAttribute("macroName",macroName);
        			refreshContainer.setAttribute("title",tiddler.title);
				this.refresh(refreshContainer);
			},

			refresh: function(place) {
				var title = place.getAttribute("title");
				removeChildren(place);
				if (store.getTaggedTiddlers(title).length > 0) {
					var lingo = config.taggly.lingo;
					config.taggly.createListControl(place,title,"hideState");
					if (config.taggly.getTagglyOpt(title,"hideState") == "show") {
						createTiddlyElement(place,"span",null,"tagglyLabel",lingo.labels.label.format([title]));
						config.taggly.createListControl(place,title,"title");
						config.taggly.createListControl(place,title,"modified");
						config.taggly.createListControl(place,title,"created");
						config.taggly.createListControl(place,title,"listMode");
						config.taggly.createListControl(place,title,"excerpts");
						config.taggly.createListControl(place,title,"numCols");
						config.taggly.createTagglyList(place,title);
					}
				}
			}
		}
	},

	// todo fix these up a bit
	styles: [
"/*{{{*/",
"/* created by TagglyTaggingPlugin */",
".tagglyTagging { padding-top:0.5em; }",
".tagglyTagging li.listTitle { display:none; }",
".tagglyTagging ul {",
"	margin-top:0px; padding-top:0.5em; padding-left:2em;",
"	margin-bottom:0px; padding-bottom:0px;",
"}",
".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }",
".tagglyTagging table { margin:0px; padding:0px; }",
".tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }",
".tagglyTagging .button, .tagglyTagging .hidebutton {",
"	color:[[ColorPalette::TertiaryLight]]; font-size:90%;",
"	border:0px; padding-left:0.3em;padding-right:0.3em;",
"}",
".tagglyTagging .button:hover, .hidebutton:hover, ",
".tagglyTagging .button:active, .hidebutton:active  {",
"	border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];",
"}",
".selected .tagglyTagging .button { visibility:visible; }",
".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }",
".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }",
".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }",
".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }",
".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}",
".tagglyTagging ul ul li {margin-left:0.5em; }",
".editLabel { font-size:90%; padding-top:0.5em; }",
".tagglyTagging .commas { padding-left:1.8em; }",
"/* not technically tagglytagging but will put them here anyway */",
".tagglyTagged li.listTitle { display:none; }",
".tagglyTagged li { display: inline; font-size:90%; }",
".tagglyTagged ul { margin:0px; padding:0px; }",
".excerpt { color:[[ColorPalette::TertiaryDark]]; }",
"div.tagglyTagging table,",
"div.tagglyTagging table tr,",
"td.tagglyTagging",
" {border-style:none!important; }",
".tagglyTagging .contents { border-bottom:2px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 1em 0.5em;",
"  margin-bottom:0.5em; }",
".tagglyTagging .indent1  { margin-left:3em;  }",
".tagglyTagging .indent2  { margin-left:4em;  }",
".tagglyTagging .indent3  { margin-left:5em;  }",
".tagglyTagging .indent4  { margin-left:6em;  }",
".tagglyTagging .indent5  { margin-left:7em;  }",
".tagglyTagging .indent6  { margin-left:8em;  }",
".tagglyTagging .indent7  { margin-left:9em;  }",
".tagglyTagging .indent8  { margin-left:10em; }",
".tagglyTagging .indent9  { margin-left:11em; }",
".tagglyTagging .indent10 { margin-left:12em; }",
"/*}}}*/",
		""].join("\n"),

	init: function() {
		merge(config.macros,this.macros);
		config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;
		store.addNotification("TagglyTaggingStyles",refreshStyles);
	}
};

config.taggly.init();

//}}}

/***
InlineSlidersPlugin
By Saq Imtiaz
http://tw.lewcid.org/sandbox/#InlineSlidersPlugin

// syntax adjusted to not clash with NestedSlidersPlugin

***/
//{{{
config.formatters.unshift( {
	name: "inlinesliders",
	// match: "\\+\\+\\+\\+|\\<slider",
	match: "\\<slider",
	// lookaheadRegExp: /(?:\+\+\+\+|<slider) (.*?)(?:>?)\n((?:.|\n)*?)\n(?:====|<\/slider>)/mg,
	lookaheadRegExp: /(?:<slider) (.*?)(?:>)\n((?:.|\n)*?)\n(?:<\/slider>)/mg,
	handler: function(w) {
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart ) {
			var btn = createTiddlyButton(w.output,lookaheadMatch[1] + " "+"\u00BB",lookaheadMatch[1],this.onClickSlider,"button sliderButton");
			var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");
			panel.style.display = "none";
			wikify(lookaheadMatch[2],panel);
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
   },
   onClickSlider : function(e) {
		if(!e) var e = window.event;
		var n = this.nextSibling;
		n.style.display = (n.style.display=="none") ? "block" : "none";
		return false;
	}
});

//}}}
[[Cymon's Games|http://cymonsgames.com/taipan/]] Source for C code
[[Browser Version|http://www.taipangame.com/]]
https://backreference.org/2011/01/29/in-place-editing-of-files/
/***
!!!Usage:
msgArea (e.g. the "save changes" popup) disappears after 3 seconds
!!!Created:
2006-09-13 JOS
!!!Code:
***/
//{{{
function displayMessage(text,linkText)
{
 var msgArea = document.getElementById("messageArea");
 if(!msgArea)
 {
 alert(text);
 return;
 }
 var msg;
 if(linkText)
 {
 msg = createTiddlyElement(msgArea,"div",null,null,null);
 var link = createTiddlyElement(msg,"a",null,null,text);
 link.href = linkText;
 link.target = "_blank";
 }
 else
 msg = createTiddlyElement(msgArea,"div",null,null,text);
 msgArea.style.display = "block";
 setTimeout("clearMessage();",3000);
}
//}}}
/***
|''Name:''|ToggleElementPlugin|
|''Description:''|toggles the visibility of the element specified|
|''Author:''|FND|
|''Source:''|http://devpad.tiddlyspot.com/#ToggleElementPlugin|
|''Version:''|0.5|
|''Date:''|2007-09-22|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.1|
!Notes
This plugin was created for use with the [[overflow technique|http://cleanlayout.tiddlyspot.com/#StyleSheet]] (cf. [[[twdev] StyleSheetLayout: overflow technique|http://groups.google.at/group/TiddlyWikiDev/browse_thread/thread/b55011665c5e04d9/]]).
!Usage
{{{
<<toggleElement
	[element ID]
	[button label]
	[button tooltip]
	[button class]
	[button access key]
>>
}}}
All parameters are optional.
In order to use the default value for a certain property, the respective parameter can either be omitted or defined as empty by using {{{""}}}.
!!Examples
|!Code|!Result|
|{{{<<toggleElement>>}}}| <<toggleElement>> |
|{{{<<toggleElement "" "" "" "" "">>}}}| <<toggleElement "" "" "" "" "">> |
|{{{<<toggleElement "mainMenu" "Toggle MainMenu" "" "tiddlyLinkExisting">>}}}| <<toggleElement "mainMenu" "Toggle MainMenu" "" "tiddlyLinkExisting">> |
!To Do
* rename to [[ToggleElementMacro]]
!Revision History
!!v0.5 (2007-09-22)
* initial proof-of-concept implementation
!Code
***/
//{{{
config.macros.toggleElement = {
	elementID: "sidebar",
	label: "Toggle Sidebar",
	prompt: "Switch sidebar on and off",
	buttonClass: "",
	accessKey: ""
};

config.macros.toggleElement.handler = function(place, macroName, params) {
	// process command line parameters
	var elementID = params[0] || this.elementID;
	var label = params[1] || this.label;
	var prompt = params[2] || this.prompt;
	var buttonClass = params[3] || this.buttonClass;
	var accessKey = params[4] || this.accessKey;
	// create toggle button
	createTiddlyButton(place, label, prompt,
		function() { config.macros.toggleElement.toggle(elementID); },
		buttonClass, null, accessKey
	);
};

config.macros.toggleElement.toggle = function(id) {
	var e = document.getElementById(id);
	if(e) {
		if(e.style.display != "none") {
			e.style.display = "none";
		} else {
			e.style.display = "";
		}
	}
};
//}}}
/***

|Name|ToggleSideBarMacro|
|Created by|SaqImtiaz|
|Location|http://lewcid.googlepages.com/lewcid.html#ToggleSideBarMacro|
|Version|1.0|
|Requires|~TW2.x|
!Description:
Provides a button for toggling visibility of the SideBar. You can choose whether the SideBar should initially be hidden or displayed.

!Demo
<<toggleSideBar "Toggle Sidebar">>

!Usage:
{{{<<toggleSideBar>>}}} <<toggleSideBar>>
additional options:
{{{<<toggleSideBar label tooltip show/hide>>}}} where:
label = custom label for the button,
tooltip = custom tooltip for the button,
show/hide = use one or the other, determines whether the sidebar is shown at first or not.
(default is to show the sidebar)

You can add it to your tiddler toolbar, your MainMenu, or where you like really.
If you are using a horizontal MainMenu and want the button to be right aligned, put the following in your StyleSheet:
{{{ .HideSideBarButton {float:right;} }}}

!History
*23-07-06: version 1.0: completely rewritten, now works with custom stylesheets too, and easier to customize start behaviour. 
*20-07-06: version 0.11
*27-04-06: version 0.1: working.

!Code
***/
//{{{
config.macros.toggleSideBar={};

config.macros.toggleSideBar.settings={
         styleHide :  "#sidebar { display: none;}\n"+"#contentWrapper #displayArea { margin-right: 1em;}\n"+"",
         styleShow : " ",
         arrow1: "«",
         arrow2: "»"
};

config.macros.toggleSideBar.handler=function (place,macroName,params,wikifier,paramString,tiddler)
{
          var tooltip= params[1]||'toggle sidebar';
          var mode = (params[2] && params[2]=="hide")? "hide":"show";
          var arrow = (mode == "hide")? this.settings.arrow1:this.settings.arrow2;
          var label= (params[0]&&params[0]!='.')?params[0]+" "+arrow:arrow;
          var theBtn = createTiddlyButton(place,label,tooltip,this.onToggleSideBar,"button HideSideBarButton");
          if (mode == "hide")
             { 
             (document.getElementById("sidebar")).setAttribute("toggle","hide");
              setStylesheet(this.settings.styleHide,"ToggleSideBarStyles");
             }
};

config.macros.toggleSideBar.onToggleSideBar = function(){
          var sidebar = document.getElementById("sidebar");
          var settings = config.macros.toggleSideBar.settings;
          if (sidebar.getAttribute("toggle")=='hide')
             {
              setStylesheet(settings.styleShow,"ToggleSideBarStyles");
              sidebar.setAttribute("toggle","show");
              this.firstChild.data= (this.firstChild.data).replace(settings.arrow1,settings.arrow2);
              }
          else
              {    
               setStylesheet(settings.styleHide,"ToggleSideBarStyles");
               sidebar.setAttribute("toggle","hide");
               this.firstChild.data= (this.firstChild.data).replace(settings.arrow2,settings.arrow1);
              }

     return false;
}

setStylesheet(".HideSideBarButton .button {font-weight:bold; padding: 0 5px;}\n","ToggleSideBarButtonStyles");

//}}}
/***
| Name|ToggleTagPlugin|
| Description|Makes a checkbox which toggles a tag in a tiddler|
| Version|3.0 ($Rev: 1845 $)|
| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|
| Source|http://tiddlyspot.com/mptw/#ToggleTagMacro|
| Author|Simon Baird <simon.baird@gmail.com>|
| License|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Usage
{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}
* TagName - the tag to be toggled, default value "checked"
* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler
* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'
(If a parameter is '.' then the default will be used)

Examples:

|Code|Description|Example|h
|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|
|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|
|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|
|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|
|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|
Notes:
* If TiddlerName doesn't exist it will be silently created
* Set label to '-' to specify no label
* See also http://mgtd-alpha.tiddlyspot.com/#ToggleTag2

!Known issues
* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing

***/
//{{{

merge(config.macros,{

	toggleTag: {

		doRefreshAll: true,
		createIfRequired: true,
		shortLabel: "[[%0]]",
		longLabel: "[[%0]] [[%1]]",

		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			var tag = (params[0] && params[0] != '.') ? params[0] : "checked";
			var title = (params[1] && params[1] != '.') ? params[1] : tiddler.title;
			var defaultLabel = (title == tiddler.title ? this.shortLabel : this.longLabel);
			var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;
			label = (label == '-' ? '' : label);
			var theTiddler =  title == tiddler.title ? tiddler : store.getTiddler(title);
			var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {
				if (!store.tiddlerExists(title)) {
					if (config.macros.toggleTag.createIfRequired) {
						var content = store.getTiddlerText(title); // just in case it's a shadow
						store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);
					}
					else 
						return false;
				}
				store.setTiddlerTag(title,this.checked,tag);
				return true;
			});
		}
	}
});

//}}}
.toolbar { vertical-align: top; 
 line-height: 2.0em; 
 font-size: 1.2em;
 float: right; 
 } 

.selected .toolbar {
 visibility: visible;
}
BIOS INFORMATION (dmidecode):
	Vendor: TOSHIBA
	Version: Version 1.50
	Release Date: 05/23/2003
	Address: 0xE0000
	Runtime Size: 128 kB
	ROM Size: 512 kB
	Characteristics:
		ISA is supported
		PCI is supported
		PC Card (PCMCIA) is supported
		PNP is supported
		APM is supported
		BIOS is upgradeable
		BIOS shadowing is allowed
		VLB is supported
		Boot from CD is supported
		Selectable boot is supported
		Boot from PC Card (PCMCIA) is supported
		EDD is supported
		Japanese floppy for Toshiba 1.2 MB is supported (int 13h)
		3.5"/720 KB floppy services are supported (int 13h)
		Print screen service is supported (int 5h)
		8042 keyboard services are supported (int 9h)
		Serial services are supported (int 14h)
		Printer services are supported (int 17h)
		ACPI is supported
		USB legacy is supported
		AGP is supported
		BIOS boot specification is supported
		Function key-initiated network boot is supported


Processor Information
	Socket Designation: uFC-PGA Socket
	Type: Central Processor
	Family: Pentium M
	Manufacturer: Intel Corporation
	ID: 95 06 00 00 00 00 00 00
	Signature: Type 0, Family 6, Model 9, Stepping 5
	Flags: None
	Version:  
	Voltage: 1.5 V
	External Clock: 100 MHz
	Max Speed: 1700 MHz
	Current Speed: 1700 MHz
	Status: Populated, Enabled
	Upgrade: ZIF Socket
	L1 Cache Handle: 0x0012
	L2 Cache Handle: 0x0013
	L3 Cache Handle: Not Provided

Handle 0x0009, DMI type 5, 20 bytes
Memory Controller Information
	Error Detecting Method: None
	Error Correcting Capabilities:
		None
	Supported Interleave: Other
	Current Interleave: Other
	Maximum Memory Module Size: 1024 MB
	Maximum Total Memory Size: 2048 MB
	Supported Speeds:
		Other
	Supported Memory Types:
		Other
		DIMM
		SDRAM
	Memory Module Voltage: 2.9 V
	Associated Memory Slots: 2
		0x000A
		0x000B
	Enabled Error Correcting Capabilities:
		None

Handle 0x000A, DMI type 6, 12 bytes
Memory Module Information
	Socket Designation: SO-DIMM
	Bank Connections: 0 1
	Current Speed: 8 ns
	Type: Other DIMM SDRAM
	Installed Size: 512 MB (Single-bank Connection)
	Enabled Size: 512 MB (Single-bank Connection)
	Error Status: OK

-Processor-
Name		: Intel(R) Pentium(R) M processor 1700MHz
Family, model, stepping		: 6, 9, 5 (Pentium M)
Vendor		: Intel Corp.
-Configuration-
Cache Size		: 1024kb
Frequency		: 1695.84MHz
BogoMIPS		: 3393.74
Byte Order		: Little Endian
-Features-
FDIV Bug		: no
HLT Bug		: no
F00F Bug		: no
Coma Bug		: no
Has FPU		: yes
-Capabilities-
fpu		: Floating Point Unit
vme		: Virtual 86 Mode Extension
de		: Debug Extensions - I/O breakpoints
pse		: Page Size Extensions (4MB pages)
tsc		: Time Stamp Counter and RDTSC instruction
msr		: Model Specific Registers
mce		: Machine Check Architeture
cx8		: CMPXCHG8 instruction
sep		: Fast System Call (SYSENTER/SYSEXIT)
mtrr		: Memory Type Range Registers
pge		: Page Global Enable
mca		: Machine Check Architecture
cmov		: Conditional Move instruction
pat		: Page Attribute Table
clflush		: Cache Line Flush instruction
dts		: Debug Store
acpi		: Thermal Monitor and Software Controlled Clock
mmx		: MMX technology
fxsr		: FXSAVE and FXRSTOR instructions
sse		: SSE instructions
sse2		: SSE2 (WNI) instructions
tm		: Thermal Monitor
pbe		: Pending Break Enable
bts
est
tm2

-Memory-
Total Memory		: 515444 kB
Free Memory		: 15600 kB
Buffers		: 20068 kB
Cached		: 201192 kB
Cached Swap		: 90124 kB
Active		: 218540 kB
Inactive		: 257948 kB
High Memory		: 0 kB
Free High Memory		: 0 kB
Low Memory		: 515444 kB
Free Low Memory		: 15600 kB
Virtual Memory		: 1486004 kB
Free Virtual Memory		: 1395880 kB

-Display-
Resolution		: 1600x1200 pixels
Vendor		: The X.Org Foundation
Version		: 1.3.0
-Monitors-
Monitor 0		: 1600x1200 pixels
/***
Contains the stuff you need to use Tiddlyspot
Note you must also have UploadPlugin installed
***/
//{{{

// edit this if you are migrating sites or retrofitting an existing TW
config.tiddlyspotSiteId = 'linuxfordogs';

// make it so you can by default see edit controls via http
config.options.chkHttpReadOnly = false;
window.readOnly = false; // make sure of it (for tw 2.2)

// disable autosave in d3
if (window.location.protocol != "file:")
	config.options.chkGTDLazyAutoSave = false;

// tweak shadow tiddlers to add upload button, password entry box etc
with (config.shadowTiddlers) {
	SiteUrl = 'http://'+config.tiddlyspotSiteId+'.tiddlyspot.com';
	SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");
	OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");
	DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[WelcomeToTiddlyspot]] ");
	MainMenu = MainMenu.replace(/^/,"[[WelcomeToTiddlyspot]] ");
}

// create some shadow tiddler content
merge(config.shadowTiddlers,{

'WelcomeToTiddlyspot':[
 "This document is a ~TiddlyWiki from tiddlyspot.com.  A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //What now?// &nbsp;&nbsp;@@ Before you can save any changes, you need to enter your password in the form below.  Then configure privacy and other site settings at your [[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",
 "<<tiddler TspotControls>>",
 "See also GettingStarted.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working online// &nbsp;&nbsp;@@ You can edit this ~TiddlyWiki right now, and save your changes using the \"save to web\" button in the column on the right.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// &nbsp;&nbsp;@@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick.  You can make changes and save them locally without being connected to the Internet.  When you're ready to sync up again, just click \"upload\" and your ~TiddlyWiki will be saved back to tiddlyspot.com.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &nbsp;&nbsp;@@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]].  Also visit [[TiddlyWiki Guides|http://tiddlywikiguides.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help.  If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &nbsp;&nbsp;@@ We hope you like using your tiddlyspot.com site.  Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions."
].join("\n"),

'TspotControls':[
 "| tiddlyspot password:|<<option pasUploadPassword>>|",
 "| site management:|<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<<br>>[[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]], [[download (go offline)|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download]]|",
 "| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[announcements|http://announce.tiddlyspot.com/]], [[blog|http://tiddlyspot.com/blog/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|"
].join("\n"),

'TspotSidebar':[
 "<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">><html><a href='http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download' class='button'>download</a></html>"
].join("\n"),

'TspotOptions':[
 "tiddlyspot password:",
 "<<option pasUploadPassword>>",
 ""
].join("\n")

});
//}}}
[[Pendrive linux|http://www.pendrivelinux.com/]]
[[Unicon Homepage|http://unicon.sourceforge.net/]]
[[Unicon Language resources|http://www.zenadsl6357.zen.co.uk/]]
[[Rosettacode|http://rosettacode.org/wiki/Icon%2BUnicon/Intro]] Icon+Unicon/Intro
Source: http://myhowtosandprojects.blogspot.co.uk/2008/07/install-and-use-unionfs-merging.html
Using unionfs

In the following example, we will merge contents of two directories into a single directory /mnt/union. We assume that all directories already exist.

$ modprobe unionfs
$ mount -t unionfs -o dirs=/mnt/cdrom1=ro:/mnt/cdrom2=ro unionfs /mnt/union

From now, the directory /mnt/union will contain all files and directories from /mnt/cdrom1 and /mnt/cdrom2, merged together and both read only. If the same filename is used in both cdrom directories, the one from cdrom1 has precedence (because it was specified leftmost in the list).
Using unionctl

Unionctl is a tool which is created (together with uniondbg) during unionfs compilation and is installed to /usr/local/sbin. Unionctl is intended to manage the existing union, to list, add, modify or delete existing branches. Some simple example follows, use unionctl command without any argument to see all available options.

To list branches in existing union, use

$ unionctl /mnt/union --list

which will produce the following output

 /mnt/cdrom1 (r-)
 /mnt/cdrom2 (r-)

To add another directory (/mnt/cdrom3) into existing union, use

$ unionctl /mnt/union --add --after /mnt/cdrom2 --mode ro /mnt/cdrom3

and unionctl --list will now produce

 /mnt/cdrom1 (r-)
 /mnt/cdrom2 (r-)
 /mnt/cdrom3 (r-)

In the case when you change the content of branches themselves, execute the following command to force revalidation of the union:

uniondbg -g /mnt/union



Writing to union

Merging read-only directories is useful in many cases, but the union itself remains read-only too, until a read-write branch is added to it. In that case, all changes are stored in leftmost branch (using copy-up method, see below) and file deletions are done by using one of the two methods available:

 * WHITEOUT mode, inserts a .wh (whiteout) file to mask out a real file
 * DELETE_ALL mode, tries to delete all instances of a file from all branches

WHITEOUT mode is used as default. Copy-up is a special method used to handle file modifications in union. A file from ro branch can't be modified, so it is copied to upper (left) read-write branch at the time when the modification should begin. Then the modification is possible and modified file remains in rw branch.

To add a rw branch at the top of union in our example, type

$ unionctl /mnt/union --add --before /mnt/cdrom1 --mode rw /mnt/changes

All the changes will be stored in /mnt/changes and the union will look like this:

 /mnt/changes (rw)
 /mnt/cdrom1 (r-)
 /mnt/cdrom2 (r-)
 /mnt/cdrom3 (r-)



Practical unionfs application - SLAX

Data stored on a read-only medium like CD-ROM can't be modified. A Live CD Linux distribution, which is offering full write support to all directories, needs to use special techniques to allow virtual modifications and to save all changes in memory. SLAX is using these techniques for very long time, starting at the end of 2003 with ovlfs and implementing unionfs at the end of 2004. SLAX 5, released in April 2005, can give you an impression of what miracles could be, thanks to unionfs, created.



Links

Stony Brook university: http://www.fsl.cs.sunysb.edu/
UnionFS: http://www.fsl.cs.sunysb.edu/project-unionfs.html
SLAX: http://www.slax.org
Linux Live scripts: http://www.linux-live.org
Linux kernel: http://www.kernel.org 
 Publicada por  José Oliveira  em 7/23/2008 02:45:00 PM
!!!Memory: taken from [[Wireball|http://wireball.com/cms/armada_1750_repair]] Refers to the 1750, but apparently it is near identical to the 3500.

This computer has very specific memory requirements. It takes a 144-pin PC66, PC100, or PC133 3.3V SO-DIMM. In addition, 256MB modules must meet the following specifications:

   1. 32Meg x 64 stated capacity (32Meg x 72 may also work)
   2. Sixteen chips on one SODIMM (eight per side, but make sure the SODIMM is double-sided!)
   3. 16x8 -type chips

 

Caution; SO-DIMMs using 32x4 or 32x8 chips will only be recognized at half capacity. 256MB SO-DIMMs with only 8 chips total (4 per side, most likely) may not be recognized at all.

Searching on Google for "Compaq Armada 1750 256MB" I quickly turned up a $70USD SO-DIMM that meets the afore-stated requirements. You may be able to find better deals with more searching, or used memory. If in doubt, Kingston offers a 256MB SO-DIMM that should be compatible with this laptop. On the Part Detail page, it looks like it has 4 chips to a side; however, that is a stock photo. Here is what the KTC311/256LP should look like. Looking closely we can deduce that it has 8 chips to a side.

For 128MB modules (although I strongly recommend a 256MB module), the following should work: 16Meg x 64, eight chips (four per side), and 16x8 -type chips. Chances are if it's a 128MB (16M x 64) SO-DIMM and has 8 chips total, it meets the requirements.

To get the memory out, you release the two metal clips on the sides holding it in, pop it up at a shallow angle, and remove it. Inserting new memory is a reversal of the procedure - slot it in at a slight angle (make sure the metal contacts almost completely disappear into the connector), then hinge it down and it should snap into the metal clips and lock in place. Make sure the indentations on the side of the SO-DIMM line up with the clips properly, and don't force it.

-----------------------------------
256MB Compaq Presario/Armada Notebook PC100 SDRAM SODIMM

    * 161554-B21, 167136-001, 175325-001, 176673-B21, 166499-001, KTC311/256LP  
| 14/05/2011 19:14:00 |   | [[/|http://linuxfordogs.tiddlyspot.com/]] | [[store.cgi|http://linuxfordogs.tiddlyspot.com/store.cgi]] | . | [[index.html | http://linuxfordogs.tiddlyspot.com/index.html]] | . | ok |
| 05/03/2016 21:05:58 |   | [[/|http://linuxfordogs.tiddlyspot.com/]] | [[store.cgi|http://linuxfordogs.tiddlyspot.com/store.cgi]] | . | [[index.html | http://linuxfordogs.tiddlyspot.com/index.html]] | . |
| 22/03/2016 15:58:21 |   | [[/|http://linuxfordogs.tiddlyspot.com/]] | [[store.cgi|http://linuxfordogs.tiddlyspot.com/store.cgi]] | . | [[index.html | http://linuxfordogs.tiddlyspot.com/index.html]] | . |
| 27/03/2016 17:33:16 |   | [[/|http://linuxfordogs.tiddlyspot.com/]] | [[store.cgi|http://linuxfordogs.tiddlyspot.com/store.cgi]] | . | [[index.html | http://linuxfordogs.tiddlyspot.com/index.html]] | . |
| 04/04/2016 20:32:41 |   | [[/|http://linuxfordogs.tiddlyspot.com/]] | [[store.cgi|http://linuxfordogs.tiddlyspot.com/store.cgi]] | . | [[index.html | http://linuxfordogs.tiddlyspot.com/index.html]] | . |
| 10/04/2016 13:13:16 |   | [[/|http://linuxfordogs.tiddlyspot.com/]] | [[store.cgi|http://linuxfordogs.tiddlyspot.com/store.cgi]] | . | [[index.html | http://linuxfordogs.tiddlyspot.com/index.html]] | . |
| 25/05/2016 21:14:30 |   | [[/|http://linuxfordogs.tiddlyspot.com/]] | [[store.cgi|http://linuxfordogs.tiddlyspot.com/store.cgi]] | . | [[index.html | http://linuxfordogs.tiddlyspot.com/index.html]] | . |
| 25/06/2016 11:55:40 |   | [[/|http://linuxfordogs.tiddlyspot.com/]] | [[store.cgi|http://linuxfordogs.tiddlyspot.com/store.cgi]] | . | [[index.html | http://linuxfordogs.tiddlyspot.com/index.html]] | . |
| 11/07/2016 21:26:10 |   | [[/|http://linuxfordogs.tiddlyspot.com/]] | [[store.cgi|http://linuxfordogs.tiddlyspot.com/store.cgi]] | . | [[index.html | http://linuxfordogs.tiddlyspot.com/index.html]] | . |
| 26/10/2016 20:17:24 |   | [[/|http://linuxfordogs.tiddlyspot.com/]] | [[store.cgi|http://linuxfordogs.tiddlyspot.com/store.cgi]] | . | [[index.html | http://linuxfordogs.tiddlyspot.com/index.html]] | . |
| 27/11/2016 22:23:17 |   | [[/|http://linuxfordogs.tiddlyspot.com/]] | [[store.cgi|http://linuxfordogs.tiddlyspot.com/store.cgi]] | . | [[index.html | http://linuxfordogs.tiddlyspot.com/index.html]] | . |
/***
|''Name:''|PasswordOptionPlugin|
|''Description:''|Extends TiddlyWiki options with non encrypted password option.|
|''Version:''|1.0.2|
|''Date:''|Apr 19, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#PasswordOptionPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
***/
//{{{
version.extensions.PasswordOptionPlugin = {
	major: 1, minor: 0, revision: 2, 
	date: new Date("Apr 19, 2007"),
	source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
	coreVersion: '2.2.0 (Beta 5)'
};

config.macros.option.passwordCheckboxLabel = "Save this password on this computer";
config.macros.option.passwordInputType = "password"; // password | text
setStylesheet(".pasOptionInput {width: 11em;}\n","passwordInputTypeStyle");

merge(config.macros.option.types, {
	'pas': {
		elementType: "input",
		valueField: "value",
		eventName: "onkeyup",
		className: "pasOptionInput",
		typeValue: config.macros.option.passwordInputType,
		create: function(place,type,opt,className,desc) {
			// password field
			config.macros.option.genericCreate(place,'pas',opt,className,desc);
			// checkbox linked with this password "save this password on this computer"
			config.macros.option.genericCreate(place,'chk','chk'+opt,className,desc);			
			// text savePasswordCheckboxLabel
			place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));
		},
		onChange: config.macros.option.genericOnChange
	}
});

merge(config.optionHandlers['chk'], {
	get: function(name) {
		// is there an option linked with this chk ?
		var opt = name.substr(3);
		if (config.options[opt]) 
			saveOptionCookie(opt);
		return config.options[name] ? "true" : "false";
	}
});

merge(config.optionHandlers, {
	'pas': {
 		get: function(name) {
			if (config.options["chk"+name]) {
				return encodeCookie(config.options[name].toString());
			} else {
				return "";
			}
		},
		set: function(name,value) {config.options[name] = decodeCookie(value);}
	}
});

// need to reload options to load passwordOptions
loadOptionsCookie();

/*
if (!config.options['pasPassword'])
	config.options['pasPassword'] = '';

merge(config.optionsDesc,{
		pasPassword: "Test password"
	});
*/
//}}}

/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.0|
|''Date:''|May 5, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|
|''Documentation:''|http://tiddlywiki.bidix.info/#UploadPluginDoc|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (#3125)|
|''Requires:''|PasswordOptionPlugin|
***/
//{{{
version.extensions.UploadPlugin = {
	major: 4, minor: 1, revision: 0,
	date: new Date("May 5, 2007"),
	source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	coreVersion: '2.2.0 (#3125)'
};

//
// Environment
//

if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false;	// true to activate both in Plugin and UploadService
	
//
// Upload Macro
//

config.macros.upload = {
// default values
	defaultBackupDir: '',	//no backup
	defaultStoreScript: "store.php",
	defaultToFilename: "index.html",
	defaultUploadDir: ".",
	authenticateUser: true	// UploadService Authenticate User
};
	
config.macros.upload.label = {
	promptOption: "Save and Upload this TiddlyWiki with UploadOptions",
	promptParamMacro: "Save and Upload this TiddlyWiki in %0",
	saveLabel: "save to web", 
	saveToDisk: "save to disk",
	uploadLabel: "upload"	
};

config.macros.upload.messages = {
	noStoreUrl: "No store URL in parmeters or options",
	usernameOrPasswordMissing: "Username or password missing"
};

config.macros.upload.handler = function(place,macroName,params) {
	if (readOnly)
		return;
	var label;
	if (document.location.toString().substr(0,4) == "http") 
		label = this.label.saveLabel;
	else
		label = this.label.uploadLabel;
	var prompt;
	if (params[0]) {
		prompt = this.label.promptParamMacro.toString().format([this.destFile(params[0], 
			(params[1] ? params[1]:bidix.basename(window.location.toString())), params[3])]);
	} else {
		prompt = this.label.promptOption;
	}
	createTiddlyButton(place, label, prompt, function() {config.macros.upload.action(params);}, null, null, this.accessKey);
};

config.macros.upload.action = function(params)
{
		// for missing macro parameter set value from options
		var storeUrl = params[0] ? params[0] : config.options.txtUploadStoreUrl;
		var toFilename = params[1] ? params[1] : config.options.txtUploadFilename;
		var backupDir = params[2] ? params[2] : config.options.txtUploadBackupDir;
		var uploadDir = params[3] ? params[3] : config.options.txtUploadDir;
		var username = params[4] ? params[4] : config.options.txtUploadUserName;
		var password = config.options.pasUploadPassword; // for security reason no password as macro parameter	
		// for still missing parameter set default value
		if ((!storeUrl) && (document.location.toString().substr(0,4) == "http")) 
			storeUrl = bidix.dirname(document.location.toString())+'/'+config.macros.upload.defaultStoreScript;
		if (storeUrl.substr(0,4) != "http")
			storeUrl = bidix.dirname(document.location.toString()) +'/'+ storeUrl;
		if (!toFilename)
			toFilename = bidix.basename(window.location.toString());
		if (!toFilename)
			toFilename = config.macros.upload.defaultToFilename;
		if (!uploadDir)
			uploadDir = config.macros.upload.defaultUploadDir;
		if (!backupDir)
			backupDir = config.macros.upload.defaultBackupDir;
		// report error if still missing
		if (!storeUrl) {
			alert(config.macros.upload.messages.noStoreUrl);
			clearMessage();
			return false;
		}
		if (config.macros.upload.authenticateUser && (!username || !password)) {
			alert(config.macros.upload.messages.usernameOrPasswordMissing);
			clearMessage();
			return false;
		}
		bidix.upload.uploadChanges(false,null,storeUrl, toFilename, uploadDir, backupDir, username, password); 
		return false; 
};

config.macros.upload.destFile = function(storeUrl, toFilename, uploadDir) 
{
	if (!storeUrl)
		return null;
		var dest = bidix.dirname(storeUrl);
		if (uploadDir && uploadDir != '.')
			dest = dest + '/' + uploadDir;
		dest = dest + '/' + toFilename;
	return dest;
};

//
// uploadOptions Macro
//

config.macros.uploadOptions = {
	handler: function(place,macroName,params) {
		var wizard = new Wizard();
		wizard.createWizard(place,this.wizardTitle);
		wizard.addStep(this.step1Title,this.step1Html);
		var markList = wizard.getElement("markList");
		var listWrapper = document.createElement("div");
		markList.parentNode.insertBefore(listWrapper,markList);
		wizard.setValue("listWrapper",listWrapper);
		this.refreshOptions(listWrapper,false);
		var uploadCaption;
		if (document.location.toString().substr(0,4) == "http") 
			uploadCaption = config.macros.upload.label.saveLabel;
		else
			uploadCaption = config.macros.upload.label.uploadLabel;
		
		wizard.setButtons([
				{caption: uploadCaption, tooltip: config.macros.upload.label.promptOption, 
					onClick: config.macros.upload.action},
				{caption: this.cancelButton, tooltip: this.cancelButtonPrompt, onClick: this.onCancel}
				
			]);
	},
	refreshOptions: function(listWrapper) {
		var uploadOpts = [
			"txtUploadUserName",
			"pasUploadPassword",
			"txtUploadStoreUrl",
			"txtUploadDir",
			"txtUploadFilename",
			"txtUploadBackupDir",
			"chkUploadLog",
			"txtUploadLogMaxLine",
			]
		var opts = [];
		for(i=0; i<uploadOpts.length; i++) {
			var opt = {};
			opts.push()
			opt.option = "";
			n = uploadOpts[i];
			opt.name = n;
			opt.lowlight = !config.optionsDesc[n];
			opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
			opts.push(opt);
		}
		var listview = ListView.create(listWrapper,opts,this.listViewTemplate);
		for(n=0; n<opts.length; n++) {
			var type = opts[n].name.substr(0,3);
			var h = config.macros.option.types[type];
			if (h && h.create) {
				h.create(opts[n].colElements['option'],type,opts[n].name,opts[n].name,"no");
			}
		}
		
	},
	onCancel: function(e)
	{
		backstage.switchTab(null);
		return false;
	},
	
	wizardTitle: "Upload with options",
	step1Title: "These options are saved in cookies in your browser",
	step1Html: "<input type='hidden' name='markList'></input><br>",
	cancelButton: "Cancel",
	cancelButtonPrompt: "Cancel prompt",
	listViewTemplate: {
		columns: [
			{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
			{name: 'Option', field: 'option', title: "Option", type: 'String'},
			{name: 'Name', field: 'name', title: "Name", type: 'String'}
			],
		rowClasses: [
			{className: 'lowlight', field: 'lowlight'} 
			]}
}

//
// upload functions
//

if (!bidix.upload) bidix.upload = {};

if (!bidix.upload.messages) bidix.upload.messages = {
	//from saving
	invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
	backupSaved: "Backup saved",
	backupFailed: "Failed to upload backup file",
	rssSaved: "RSS feed uploaded",
	rssFailed: "Failed to upload RSS feed file",
	emptySaved: "Empty template uploaded",
	emptyFailed: "Failed to upload empty template file",
	mainSaved: "Main TiddlyWiki file uploaded",
	mainFailed: "Failed to upload main TiddlyWiki file. Your changes have not been saved",
	//specific upload
	loadOriginalHttpPostError: "Can't get original file",
	aboutToSaveOnHttpPost: 'About to upload on %0 ...',
	storePhpNotFound: "The store script '%0' was not found."
};

bidix.upload.uploadChanges = function(onlyIfDirty,tiddlers,storeUrl,toFilename,uploadDir,backupDir,username,password)
{
	var callback = function(status,uploadParams,original,url,xhr) {
		if (!status) {
			displayMessage(bidix.upload.messages.loadOriginalHttpPostError);
			return;
		}
		if (bidix.debugMode) 
			alert(original.substr(0,500)+"\n...");
		// Locate the storeArea div's 
		var posDiv = locateStoreArea(original);
		if((posDiv[0] == -1) || (posDiv[1] == -1)) {
			alert(config.messages.invalidFileError.format([localPath]));
			return;
		}
		bidix.upload.uploadRss(uploadParams,original,posDiv);
	};
	
	if(onlyIfDirty && !store.isDirty())
		return;
	clearMessage();
	// save on localdisk ?
	if (document.location.toString().substr(0,4) == "file") {
		var path = document.location.toString();
		var localPath = getLocalPath(path);
		saveChanges();
	}
	// get original
	var uploadParams = Array(storeUrl,toFilename,uploadDir,backupDir,username,password);
	var originalPath = document.location.toString();
	// If url is a directory : add index.html
	if (originalPath.charAt(originalPath.length-1) == "/")
		originalPath = originalPath + "index.html";
	var dest = config.macros.upload.destFile(storeUrl,toFilename,uploadDir);
	var log = new bidix.UploadLog();
	log.startUpload(storeUrl, dest, uploadDir,  backupDir);
	displayMessage(bidix.upload.messages.aboutToSaveOnHttpPost.format([dest]));
	if (bidix.debugMode) 
		alert("about to execute Http - GET on "+originalPath);
	var r = doHttp("GET",originalPath,null,null,null,null,callback,uploadParams,null);
	if (typeof r == "string")
		displayMessage(r);
	return r;
};

bidix.upload.uploadRss = function(uploadParams,original,posDiv) 
{
	var callback = function(status,params,responseText,url,xhr) {
		if(status) {
			var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
			displayMessage(bidix.upload.messages.rssSaved,bidix.dirname(url)+'/'+destfile);
			bidix.upload.uploadMain(params[0],params[1],params[2]);
		} else {
			displayMessage(bidix.upload.messages.rssFailed);			
		}
	};
	// do uploadRss
	if(config.options.chkGenerateAnRssFeed) {
		var rssPath = uploadParams[1].substr(0,uploadParams[1].lastIndexOf(".")) + ".xml";
		var rssUploadParams = Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
		bidix.upload.httpUpload(rssUploadParams,convertUnicodeToUTF8(generateRss()),callback,Array(uploadParams,original,posDiv));
	} else {
		bidix.upload.uploadMain(uploadParams,original,posDiv);
	}
};

bidix.upload.uploadMain = function(uploadParams,original,posDiv) 
{
	var callback = function(status,params,responseText,url,xhr) {
		var log = new bidix.UploadLog();
		if(status) {
			// if backupDir specified
			if ((params[3]) && (responseText.indexOf("backupfile:") > -1))  {
				var backupfile = responseText.substring(responseText.indexOf("backupfile:")+11,responseText.indexOf("\n", responseText.indexOf("backupfile:")));
				displayMessage(bidix.upload.messages.backupSaved,bidix.dirname(url)+'/'+backupfile);
			}
			var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
			displayMessage(bidix.upload.messages.mainSaved,bidix.dirname(url)+'/'+destfile);
			store.setDirty(false);
			log.endUpload("ok");
		} else {
			alert(bidix.upload.messages.mainFailed);
			displayMessage(bidix.upload.messages.mainFailed);
			log.endUpload("failed");			
		}
	};
	// do uploadMain
	var revised = bidix.upload.updateOriginal(original,posDiv);
	bidix.upload.httpUpload(uploadParams,revised,callback,uploadParams);
};

bidix.upload.httpUpload = function(uploadParams,data,callback,params)
{
	var localCallback = function(status,params,responseText,url,xhr) {
		url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
		if (xhr.status == httpStatus.NotFound)
			alert(bidix.upload.messages.storePhpNotFound.format([url]));
		if ((bidix.debugMode) || (responseText.indexOf("Debug mode") >= 0 )) {
			alert(responseText);
			if (responseText.indexOf("Debug mode") >= 0 )
				responseText = responseText.substring(responseText.indexOf("\n\n")+2);
		} else if (responseText.charAt(0) != '0') 
			alert(responseText);
		if (responseText.charAt(0) != '0')
			status = null;
		callback(status,params,responseText,url,xhr);
	};
	// do httpUpload
	var boundary = "---------------------------"+"AaB03x";	
	var uploadFormName = "UploadPlugin";
	// compose headers data
	var sheader = "";
	sheader += "--" + boundary + "\r\nContent-disposition: form-data; name=\"";
	sheader += uploadFormName +"\"\r\n\r\n";
	sheader += "backupDir="+uploadParams[3] +
				";user=" + uploadParams[4] +
				";password=" + uploadParams[5] +
				";uploaddir=" + uploadParams[2];
	if (bidix.debugMode)
		sheader += ";debug=1";
	sheader += ";;\r\n"; 
	sheader += "\r\n" + "--" + boundary + "\r\n";
	sheader += "Content-disposition: form-data; name=\"userfile\"; filename=\""+uploadParams[1]+"\"\r\n";
	sheader += "Content-Type: text/html;charset=UTF-8" + "\r\n";
	sheader += "Content-Length: " + data.length + "\r\n\r\n";
	// compose trailer data
	var strailer = new String();
	strailer = "\r\n--" + boundary + "--\r\n";
	data = sheader + data + strailer;
	if (bidix.debugMode) alert("about to execute Http - POST on "+uploadParams[0]+"\n with \n"+data.substr(0,500)+ " ... ");
	var r = doHttp("POST",uploadParams[0],data,"multipart/form-data; boundary="+boundary,uploadParams[4],uploadParams[5],localCallback,params,null);
	if (typeof r == "string")
		displayMessage(r);
	return r;
};

// same as Saving's updateOriginal but without convertUnicodeToUTF8 calls
bidix.upload.updateOriginal = function(original, posDiv)
{
	if (!posDiv)
		posDiv = locateStoreArea(original);
	if((posDiv[0] == -1) || (posDiv[1] == -1)) {
		alert(config.messages.invalidFileError.format([localPath]));
		return;
	}
	var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" +
				store.allTiddlersAsHtml() + "\n" +
				original.substr(posDiv[1]);
	var newSiteTitle = getPageTitle().htmlEncode();
	revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
	revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead");
	revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead");
	revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody");
	revised = updateMarkupBlock(revised,"POST-SCRIPT","MarkupPostBody");
	return revised;
};

//
// UploadLog
// 
// config.options.chkUploadLog :
//		false : no logging
//		true : logging
// config.options.txtUploadLogMaxLine :
//		-1 : no limit
//      0 :  no Log lines but UploadLog is still in place
//		n :  the last n lines are only kept
//		NaN : no limit (-1)

bidix.UploadLog = function() {
	if (!config.options.chkUploadLog) 
		return; // this.tiddler = null
	this.tiddler = store.getTiddler("UploadLog");
	if (!this.tiddler) {
		this.tiddler = new Tiddler();
		this.tiddler.title = "UploadLog";
		this.tiddler.text = "| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |";
		this.tiddler.created = new Date();
		this.tiddler.modifier = config.options.txtUserName;
		this.tiddler.modified = new Date();
		store.addTiddler(this.tiddler);
	}
	return this;
};

bidix.UploadLog.prototype.addText = function(text) {
	if (!this.tiddler)
		return;
	// retrieve maxLine when we need it
	var maxLine = parseInt(config.options.txtUploadLogMaxLine,10);
	if (isNaN(maxLine))
		maxLine = -1;
	// add text
	if (maxLine != 0) 
		this.tiddler.text = this.tiddler.text + text;
	// Trunck to maxLine
	if (maxLine >= 0) {
		var textArray = this.tiddler.text.split('\n');
		if (textArray.length > maxLine + 1)
			textArray.splice(1,textArray.length-1-maxLine);
			this.tiddler.text = textArray.join('\n');		
	}
	// update tiddler fields
	this.tiddler.modifier = config.options.txtUserName;
	this.tiddler.modified = new Date();
	store.addTiddler(this.tiddler);
	// refresh and notifiy for immediate update
	story.refreshTiddler(this.tiddler.title);
	store.notify(this.tiddler.title, true);
};

bidix.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir,  backupDir) {
	if (!this.tiddler)
		return;
	var now = new Date();
	var text = "\n| ";
	var filename = bidix.basename(document.location.toString());
	if (!filename) filename = '/';
	text += now.formatString("0DD/0MM/YYYY 0hh:0mm:0ss") +" | ";
	text += config.options.txtUserName + " | ";
	text += "[["+filename+"|"+location + "]] |";
	text += " [[" + bidix.basename(storeUrl) + "|" + storeUrl + "]] | ";
	text += uploadDir + " | ";
	text += "[[" + bidix.basename(toFilename) + " | " +toFilename + "]] | ";
	text += backupDir + " |";
	this.addText(text);
};

bidix.UploadLog.prototype.endUpload = function(status) {
	if (!this.tiddler)
		return;
	this.addText(" "+status+" |");
};

//
// Utilities
// 

bidix.checkPlugin = function(plugin, major, minor, revision) {
	var ext = version.extensions[plugin];
	if (!
		(ext  && 
			((ext.major > major) || 
			((ext.major == major) && (ext.minor > minor))  ||
			((ext.major == major) && (ext.minor == minor) && (ext.revision >= revision))))) {
			// write error in PluginManager
			if (pluginInfo)
				pluginInfo.log.push("Requires " + plugin + " " + major + "." + minor + "." + revision);
			eval(plugin); // generate an error : "Error: ReferenceError: xxxx is not defined"
	}
};

bidix.dirname = function(filePath) {
	if (!filePath) 
		return;
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(0, lastpos);
	} else {
		return filePath.substring(0, filePath.lastIndexOf("\\"));
	}
};

bidix.basename = function(filePath) {
	if (!filePath) 
		return;
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("#")) != -1) 
		filePath = filePath.substring(0, lastpos);
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(lastpos + 1);
	} else
		return filePath.substring(filePath.lastIndexOf("\\")+1);
};

bidix.initOption = function(name,value) {
	if (!config.options[name])
		config.options[name] = value;
};

//
// Initializations
//

// require PasswordOptionPlugin 1.0.1 or better
bidix.checkPlugin("PasswordOptionPlugin", 1, 0, 1);

// styleSheet
setStylesheet('.txtUploadStoreUrl, .txtUploadBackupDir, .txtUploadDir {width: 22em;}',"uploadPluginStyles");

//optionsDesc
merge(config.optionsDesc,{
	txtUploadStoreUrl: "Url of the UploadService script (default: store.php)",
	txtUploadFilename: "Filename of the uploaded file (default: in index.html)",
	txtUploadDir: "Relative Directory where to store the file (default: . (downloadService directory))",
	txtUploadBackupDir: "Relative Directory where to backup the file. If empty no backup. (default: ''(empty))",
	txtUploadUserName: "Upload Username",
	pasUploadPassword: "Upload Password",
	chkUploadLog: "do Logging in UploadLog (default: true)",
	txtUploadLogMaxLine: "Maximum of lines in UploadLog (default: 10)"
});

// Options Initializations
bidix.initOption('txtUploadStoreUrl','');
bidix.initOption('txtUploadFilename','');
bidix.initOption('txtUploadDir','');
bidix.initOption('txtUploadBackupDir','');
bidix.initOption('txtUploadUserName','');
bidix.initOption('pasUploadPassword','');
bidix.initOption('chkUploadLog',true);
bidix.initOption('txtUploadLogMaxLine','10');


/* don't want this for tiddlyspot sites

// Backstage
merge(config.tasks,{
	uploadOptions: {text: "upload", tooltip: "Change UploadOptions and Upload", content: '<<uploadOptions>>'}
});
config.backstageTasks.push("uploadOptions");

*/


//}}}
[["Seeing dog" thread|http://murga-linux.com/puppy/viewtopic.php?p=162716#162716]]
[[Screader|http://leb.net/pub/blinux/screader/]]
[[CLI|http://eklhad.net/cli.html]] article by the edbrowse author.

[[mxk|http://welz.org.za/projects/mxk]] 
[[linux-brl-console|http://brl.thefreecat.org/linux-brl-console.tgz]] download link
[[eSpeak|http://espeak.sourceforge.net/index.html]]
[[FreeTTS|http://freetts.sourceforge.net/docs/index.php]] Java based
[[AFB Linux Accessability|http://afb.org/message_board_replies.asp?TopicID=2001&FolderID=7]]
[[Linux speaks|http://www.joekamphaus.net/index.html]]

[[freebsoft|http://www.freebsoft.org/pub/projects/freebsoft-cdrom/]]
[[Vinux|http://vinuxproject.org/]]
[[Adriane|http://www.knopper.net/knoppix-adriane/index-en.html]] Knoppix
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers -editTiddler '></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span> <span macro='view modified date'></span> </div>
<div class='viewer' macro='view text wikified'></div>
<div class='viewer' macro='navigation tiddlers:[[bs Creating Source Compiling Afterthoughts Conclusion]]'></div>
<div class='tagClear'></div 
<!--}}}-->
[[Configuring from CLI|http://www.ocsmag.com/2015/10/22/3-days-of-networking-troubleshooting-day-3-polling-and-configuring-wifi-from-the-command-line/]] OCS Mag
http://www.murga-linux.com/puppy/viewtopic.php?p=207892

In a nutshell 
- Use the highest WPA encryption your devices allow 
 - Use a full phrase as your pass phrase with spaces, and numbers, upper and lower case. e.g. "Snow white and the 7 Dwarfs". 
 - Set your router to broadcast the SSID (counterintuitive but true!) 

 The long explanation: 

Regarding encryption: 
 - Open connections are the riskiest of them all. Like having a house without doors, with your wallet on the table and the keys of the car hanging on the wall. 
 - WEP gives a false sense of security as it can be cracked in minutes. So for all purposes is no security at all. 
 - WPA is the best encryption for now 

Using a complex passphrase: 
 - This is your main defense 
 - You can tape it under the router if you want. After all: if someone has access to the router any other security is useless. 

Broadcasting the SSID: 
 When not broadcasting the SSID the router is broadcasting the id beam anyway, just without the SSID name. So people will know that you have a wireless network. 
 But... all the devices that have been configured to connect to the router will broadcast the SSID. as if they were shouting "are you my router?" 

 This opens a big vector of attack as someone may intercept that request, identify the network you want to connect to and spoof it so now you are connected to the rouge network. 

 So, even as it is counterintuitive always set your router to broadcast the SSID. This way the security is handled by the encryption mechanism and not by false security by obscurity. 

 Additionally, several wireless devices and drivers have trouble with hidden SSIDs just because fixing it is low priority. after all, everyone should be broadcasting the SSID, isn't it?
!!![[gilesorr.com|http://www.gilesorr.com/wm/table.html]] WM list and reviews
[[Window Managers for X|http://xwinman.org/others.php]] Not up to date.
[[30 WM in 30 Days|http://crunchbang.org/forums/viewtopic.php?id=18273&p=1]] CrunchBang Forum
[[X Window Managers|http://www.systhread.net/texts/200903xvishist1.php]] WM history on systhread.net

[[JWM|http://joewing.net/programs/jwm/]] The default WM for Puppy [[GitHub|https://github.com/joewing/jwm/]]


<slider Minimalist>

Article [[The AntiDesktop|http://freshmeat.net/articles/view/581/]]
Article [[Keyboard-driven environments|http://www.linux.com/feature/62218]]

[[Goomwwm|https://github.com/seanpringle/goomwwm]]
[[Herbstluftwm|http://herbstluftwm.org/]]
[[RatPoison|http://www.nongnu.org/ratpoison/]]
[[pekwm|http://projects.pekdon.net/projects/3]]
[[YeahWM|http://phrat.de/]]
[[GNU screen|http://www.gnu.org/software/screen/#info]]
[[SithWM|http://sithwm.darkside.no/sithwm.html]]
[[Ion|http://modeemi.cs.tut.fi/~tuomov/ion/intro.html]]
[[miwm|http://miwm.sourceforge.net/basic.php]]
[[sWM / failsafewm|http://murga-linux.com/puppy/viewtopic.php?t=23083]]
[[evilWM|http://murga-linux.com/puppy/viewtopic.php?t=2822]]

</slider>

|[[dzen|http://gotmor.googlepages.com/dzen]]|Menu system |[[More...|dzen]]|
|[[bs|http://w3.impa.br/~lhf/bs/]] | Programmable button shell |[[Info from author|bs]]|yes|

!!!Tools
[[Whaw|http://repetae.net/computer/whaw/]] Window manager independent window layout tool
[[Getting Started|http://bkhome.org/fossil/woof2.cgi/wiki?name=Getting+Started+with+Woof]]
[[GitHub|https://github.com/puppylinux-woof-CE/woof-CE]] This is Barry Kauler's woof2 fossil repository of Nov 11, 2013, made into a git repository.
[[Mailing list|http://woof-ce.26403.n7.nabble.com/]]
http://en.gentoo-wiki.com/wiki/X.Org/xsession

http://humanreadable.nfshost.com/howtos/startx_script.htm - Gone

http://en.wikibooks.org/wiki/Guide_to_X11/Starting_Sessions >
xinit and startx

@@white-space:pre;<nowiki> 

There is a program startx, which launches X11. It is simple to use:
$ startx

This gives you some default environment. However, if you want to customise your default environment, using xinit might be
easier. The startx script looks for several files (~/.Xresources, ~/.Xmodmap, ...) and loads them; the files it uses are different
on each system, so you might have to read the startx script on your system to understand what it does.

In contrast, the xinit program only starts an X server and runs a ~/.xinitrc script. There is no need to remember whether your
 system calls it ".Xresources" or ".xresources" or ".xrdb"; you can simply specify the exact behavior that you want in your "~/.xinitrc".
[edit]
Using xinit without an .xinitrc

If you broke your ".xinitrc", or do not have one yet, then you can start one. For example:
these will work
$ xinit /usr/X11R6/bin/xterm
$ xinit `which xterm`
this will NOT work
$ xinit xterm

This will start an X server and the program called "xterm", which you can use to start more X clients. The last line fails (even if
 "xterm" is in your PATH) because xinit assumes that it is an argument, not a program. You must have a slash / somewhere in
 the name of the program.

If you have KDE, you can find your startkde script:
$ which startkde
/usr/local/bin/startkde

Then you can start KDE:
$ xinit /usr/local/bin/startkde

This will let you use Konqueror to find your ".xinitrc" and Kate to edit it. (When browsing your home directory, check "Show
 Hidden Files" in the View menu.)

If you see a message like:
$ xinit
/bin/ksh: xinit: not found

...then you need to add /usr/X11R6/bin to your PATH environment variable.
[edit]
How to write .xinitrc

If you do not specify a program with a slash, then "xinit" uses your .xinitrc script in your home directory.
$ xinit            # starts .xinitrc
$ xinit xterm      # passes "xterm" as argument to .xinitrc

Before using "xinit", one needs a file called .xinitrc in their home directory. Because the filename starts with a dot, the file is 
normally invisible. There are ways to handle invisible files from the shell:
$ cd               # changes current directory to home directory
$ ls -a            # list all files, including dotfiles
$ ls .xinitrc      # list the .xinitrc file
$ vi .xinitrc      # edit .xinitrc using vi
$ emacs .xinitrc   # edit it using Emacs

An ".xinitrc" is simply a Bourne shell script. You could try running it with sh .xinitrc, but it would fail unless you already
 started the X server. You put in commands like you would type at the Unix shell. If you fail to understand this, try starting
 with the examples below.

Here is a simple, one-line example of an ".xinitrc":
exec startkde

A "startkde" command starts the KDE desktop environment. This command does not finish until you logout of KDE. Normally 
the shell would wait for KDE to finish, then run the next command. The "exec" prefix to this command tells the shell that this 
is the last command, so the shell does not need to wait to run a next command. The "exec" is optional in this case.

Here is a more complex example of an ".xinitrc":
ulimit -Sn 512
/usr/bin/mixerctl monitor.master=5,5
/usr/X11R6/bin/xmodmap -e 'keycode 107 = BackSpace'
case "$#" in
0)
  exec sh /etc/X11/xinit/xinitrc
  ;;
*)
  session="$1"
  shift
  exec "$session" "$@"
 ;;
esac

# NOTREACHED
exec /usr/X11R6/bin/xterm
 </nowiki>@@
Source: http://oss.sgi.com/LDP/LDP/LG/issue93/yuan.html

1. Check if the X font server is running. 

 Some people like me tend to suspect it is caused by bugs in the X font server, but it turned out that X font server is quite robust. We can run the xfs script under /etc/init.d to see if the font server is running. 


  [root@localhost /root]# /etc/init.d/xfs status 
  xfs (pid 1385) is running... 


 In some cases, the only reason for the failure is that the font server is dead. So, you need to restart font server like this: 


  [root@localhost /root]# /etc/init.d/xfs start 
  Starting xfs:                                              [  OK  ] 


 Well, my learned lesson is don't take this '[OK]' for granted. You have to check the status again to see if it is running. If it does run, you can try startx to see if you can start X windows. If you still cannot start X server when the font server runs, it means you are having more serious trouble. You need to waste a little more time reading on the following steps. 

Note: In a weird case, my root partition was fully filled by two huge log files occupying more than 2 GB. The font server dies when it cannot write to /tmp. So the simple solution was finding the huge files and deleting them. 


 2. Check if the font 'fixed' is accessible. 

 Now it is time to ensure that the font 'fixed' is accessible. First, we can use command fslsfonts to see if font 'fixed' exists in the search path: 


  [root@localhost alex]# fslsfonts -server unix/:7100 -ll -fn fixed
  DIR  MIN  MAX EXIST DFLT ASC DESC NAME
  -->    0  255  some    0  11    2 fixed
  FONTNAME_REGISTRY    
  FOUNDRY    Misc
  FAMILY_NAME    Fixed
  WEIGHT_NAME    Medium
  SLANT    R
  SETWIDTH_NAME    SemiCondensed
  ADD_STYLE_NAME    
  PIXEL_SIZE    13
  POINT_SIZE    120
  RESOLUTION_X    75
  RESOLUTION_Y    75
  SPACING    C
  AVERAGE_WIDTH    60
  CHARSET_REGISTRY    ISO8859
  CHARSET_ENCODING    1
  COPYRIGHT    Public domain font.  Share and enjoy.
  CAP_HEIGHT    9
  X_HEIGHT    6
  FONT    -Misc-Fixed-Medium-R-SemiCondensed--13-120-75-75-C-60-ISO8859-1
  WEIGHT    10
  RESOLUTION    103
  QUAD_WIDTH    6


 This is the normal output when 'fixed' is available. Here, we can see that 'fixed' is actually an alias for the font '-Misc-Fixed-Medium-R-SemiCondensed--13-120-75-75-C-60-ISO8859-1'. If there is no font 'fixed', we first need to gain knowledge of the search path for fonts. We can use command chkfontpath to look at those paths: 


  [root@localhost alex]# /usr/sbin/chkfontpath
  Current directories in font path:
  1: /usr/X11R6/lib/X11/fonts/misc:unscaled
  2: /usr/X11R6/lib/X11/fonts/75dpi:unscaled
  3: /usr/X11R6/lib/X11/fonts/100dpi:unscaled
  4: /usr/X11R6/lib/X11/fonts/misc
  5: /usr/X11R6/lib/X11/fonts/Type1
  6: /usr/X11R6/lib/X11/fonts/Speedo
  7: /usr/X11R6/lib/X11/fonts/CID
  8: /usr/X11R6/lib/X11/fonts/75dpi
  9: /usr/X11R6/lib/X11/fonts/100dpi
  10: /usr/share/fonts/default/Type1
  11: /usr/share/fonts/default/TrueType
  12: /usr/share/fonts/ja/TrueType
  13: /usr/X11R6/lib/X11/fonts/latin2/100dpi:unscaled
  14: /usr/X11R6/lib/X11/fonts/latin2/100dpi
  15: /usr/share/fonts/ISO8859-7/misc:unscaled
  16: /usr/share/fonts/ISO8859-7/75dpi:unscaled
  17: /usr/share/fonts/ISO8859-7/100dpi:unscaled
  18: /usr/share/fonts/ISO8859-7/misc
  19: /usr/share/fonts/ISO8859-7/Type1
  20: /usr/share/fonts/ISO8859-7/75dpi
  21: /usr/share/fonts/ISO8859-7/100dpi
  22: /usr/share/fonts/ISO8859-9/misc:unscaled
  23: /usr/share/fonts/ISO8859-9/100dpi:unscaled
  24: /usr/share/fonts/ISO8859-9/misc
  25: /usr/share/fonts/ISO8859-9/100dpi
  26: /usr/share/fonts/KOI8-R/100dpi:unscaled
  27: /usr/share/fonts/KOI8-R/100dpi
  28: /usr/share/fonts/zh_CN/TrueType
  29: /usr/share/fonts/zh_TW/TrueType
  30: /usr/share/AbiSuite/fonts


 These are the font paths on my box. It shows that xfs looks into these paths seeking a specific font when it is required. There are two types of important files: fonts.dir in each of these paths, and fonts.alias in some of the paths. For example, let's go to /usr/X11R6/lib/X11/fonts/100dpi, and open the files. The files look like this: 


  [fonts.dir]


  775
  UTI___14.pcf.gz -adobe-utopia-regular-i-normal--19-140-100-100-p-104-iso10646-1
  UTBI__14.pcf.gz -adobe-utopia-bold-i-normal--19-140-100-100-p-109-iso10646-1
  UTI___12.pcf.gz -adobe-utopia-regular-i-normal--17-120-100-100-p-89-iso10646-1
  UTI___24.pcf.gz -adobe-utopia-regular-i-normal--33-240-100-100-p-179-iso10646-1
  courO08.pcf.gz -adobe-courier-medium-o-normal--11-80-100-100-m-60-iso10646-1
  UTBI__12.pcf.gz -adobe-utopia-bold-i-normal--17-120-100-100-p-93-iso10646-1
  ...


 The first line specifies the number of fonts under current directory. Following lines map file names to font names. 


  [fonts.alias]

  lucidasans-bolditalic-8 -b&h-lucida-bold-i-normal-sans-11-80-100-100-p-69-iso8859-1
  lucidasans-bolditalic-10 -b&h-lucida-bold-i-normal-sans-14-100-100-100-p-90-iso8859-1
  lucidasans-bolditalic-12 -b&h-lucida-bold-i-normal-sans-17-120-100-100-p-108-iso8859-1
  lucidasans-bolditalic-14 -b&h-lucida-bold-i-normal-sans-20-140-100-100-p-127-iso8859-1
  lucidasans-bolditalic-18 -b&h-lucida-bold-i-normal-sans-25-180-100-100-p-159-iso8859-1
  lucidasans-bolditalic-24 -b&h-lucida-bold-i-normal-sans-34-240-100-100-p-215-iso8859-1
  ...


 This file maps font alias to font names. So it is clear that once font 'fixed' is needed, the font server search fonts.alias in each font path for a match. If the match exists, the corresponding font file is specified in fonts.dir. If no match exists, which is a rare situation, the X server cannot start and we need to rebuild the font lists. The rebuilding process will generate new fonts.dir and fonts.alias files. 


 3. Rebuild font list. 

 Font list can be rebuilt using the script file xfs under /etc/init.d. Following is an excerpt of the script: 


...
buildfontlist() {
  pushd . &> /dev/null
    for d in $(/usr/sbin/chkfontpath --list | cut -f 2 -d ':') ;do
      if [ -d "$d" ]; then
        cd $d
        # Check if we need to rerun mkfontdir
        NEEDED=no
        if ! [ -e fonts.dir ]; then
          NEEDED=yes
        elif [ "$(find . -type f -cnewer fonts.dir 2>/dev/null)" != "" ];then
          NEEDED=yes
        fi
        if [ "$NEEDED" = "yes" ]; then
        ...
}
...
start() {
  if [ -L /usr/X11R6/bin/X ]; then
    echo -n $"Starting $prog: "
    [ -x /usr/sbin/chkfontpath ] && buildfontlist
    rm -fr /tmp/.font-unix
    daemon xfs -droppriv -daemon
    ret=$?
    [ $ret -eq 0 ] && touch /var/lock/subsys/xfs
    echo
    return $ret
  fi
}	
...


 For readers not familiar with shell programming, this excerpt means that each time xfs script is run, it will check whether there is a fonts.dir file in each listed font path. If fonts.dir is missing in a path, font list needs to be rebuilt. If a fonts.dir does exist for each path, it will check if the status of any file in the font directory is changed after the last change of fonts.dir. If this is true, the font list also needs to be rebuilt. 

 For newbies not interested in learning shell programming, we play a small trick in the subroutine buildfontlist(). We can set "NEEDED=yes" in the first instance to force the rebuilding of font list. 


 4. Fonts really missing? 

 If all steps above fail. My last suggestion is to check if the font file is really removed by some processes. Then you need to reinstall the font.

export PATH="$PATH:/xyz/abcd/bin"

There is a further command, which, to check whether a command is locatable from the PATH. Sometimes there are two commands of the same name in different directories of the PATH. [This is more often true of Solaris systems than LINUX.] Typing which <command> locates the one that your shell would execute. Try:

which ls
which cp mv rm
which which
which cranzgots

which is also useful in shell scripts to tell if there is a command at all, and hence check whether a particular package is installed, for example, which netscape. 
!!!The Making of bs, a Programmable Button Shell for X
by Luiz Henrique de Figueiredo

Abstract. bs is a simple programmable button shell for X that I wrote years ago. Despite being a powerful tool, supporting user-defined dialog layout, bs is actually a very simple and short program. The source code of bs is fully explained in this article. This explanation provides brief introduction to Xt, widgets, callbacks and callback data. I also show how easy it is to use Motif widgets instead of Athena widgets, for which bs was originally developed. The code is freely available.

!!!!Introduction
I am a programmer. I like to write tools for programmers. Like many others, I sometimes spend more time writing tools than the programs I'm supposed to write. I wrote bs back in 1992 to help me during my Ph.D. research (but also to avoid having to do the research itself...). I spend a lot of time in long development cycles: edit, compile, run, test, edit again. I also spend a lot of time writing papers and documents: edit, run TeX, preview, edit again. Despite the good development tools available in Unix, particularly make and shells with editable command line history, these development cycles are boring when controlled from the keyboard. I wrote bs to provide a simple graphical user interface for such repetitive cycles of sending commands to Unix shells. It turns out that bs is also useful as a general purpose menu generator. Despite being programmable and supporting user-defined dialog layout, bs is actually a very simple and short program (only 134 lines of C). In this article, I'll fully explain the source code of bs.

Writing a graphical user interface in X using Xlib directly can be done, but is a daunting task. It is much easier to use one of the many existing widget sets, which are usually supported by Xt, the X Toolkit Intrinsics library. Besides needing a tool, I wrote bs also because I wanted to learn how to use Xt and widget sets to write graphical user interfaces in X. At that time, I only had access to Xaw, the Athena widget set, which is distributed with X. I'll explain the original code for bs, written for Xaw. However, as I'll show later, it is easy to change bs to use Motif instead of Xaw.

!!!!Defining bs
I wanted a tool that could create simple panels composed of labels and buttons. Labels contain informative text; buttons are associated with commands that are run when the button is pressed by the user. I wanted a programmable tool that would read a panel description from a file written by the user, so that bs could be used for many different tasks.

!!!!Layout Model
Besides wanting to program what bs panels would do, I also wanted to control how these panels would look like. I wanted to be able to control the layout of the panel because a long row of buttons and labels looks ugly and requires a lot of mouse movement. I wanted to be able to create horizontal panels and also vertical panels. What I really needed was some way to create a new row, something like a new 'paragraph'  in the panel. In many text processing systems, such as troff and TeX, a paragraph ends with an empty line. I adopted the same idea for bs.

The file read by bs to create the panel is a plain text file in which each line describes either a button or a label. Buttons and labels appear side by side in the panel, from left to right. An empty line in the file signals the start of a new row in the panel. So, descriptions of 'horizontal' panels have no empty lines, and descriptions of 'vertical' panels have an empty line after each element.

This simple scheme proved to be powerful enough for creating a large variety of layouts. Space characters are significant in labels and button labels, and can be used for alignment, provided a fixed-width, non-proportional font is used.

!!!!Describing Panels
There are four kinds of lines in the file describing a panel:

    * empty lines;
    * lines without a TAB;
    * lines starting with a TAB;
    * lines with a TAB elsewhere. 

Empty lines control layout as explained above.

Lines without a TAB represent labels. The text in the line appears verbatim in the panel. Space characters are significant and can be used for alignment.

Lines with a TAB not on the first column represent buttons. The text before the TAB is the button text. The text after the TAB is a command that is run when the button is pressed. The command is run by feeding the text to a Unix shell.

Lines starting with a TAB are called startup lines and are sent to the shell as soon as bs begins. They typically contain variable definitions, but they can contain any command. Because bs sends data to a shell using a single pipe that remains open throughout the execution, variables definitions remain after this initialization and can be used in the command lines associated with buttons. I only added support for this kind of line later, but it proved to be very useful in writing reusable panel descriptions, parametrized by a few lines on the top.

For example, I originally used the panel described below for writing this article. The TABs don't show, but I hope you can guess where they are.

	L="usepath latex209 current -- latex"
	H="latex2html -split 0 -nolatex -no_navigation"
	F=bs
	netscape /u/lhf/w/doc/xa/bs/bs.html &
bs
edit	xterm -geometry 80x70+0+0 -title $F -e vi $F.tex &
tex	$L $F.tex </dev/null
preview	xdvi -geometry +0+0 -hushspecials $F.dvi &
html	$H $F.tex; netscape-remote -remote 'Reload()'
print	dvips -f $F.dvi | lpr -h

This description starts with variable definitions that are used in the command lines associated with buttons. It also starts netscape. (Don't worry about the precise commands. They are probably slightly different on your system.) There is a single label, bs; all remaining lines describe buttons. The button edit opens a tall xterm running vi on my TeX file, which is compiled with the tex button and converted to HTML with the html button, which runs latex2html and instructs netscape to reload the file with netscape-remote. (This was what I did back in 1995. I now write HTML directly with vi.) Note that a command line is not restricted to a single command. Note also that some commands are run in the background, to allow other commands to be run. The print button is actually a left-over from a previous script for writing papers in TeX; I continually reuse panel descriptions. bs automatically adds a button labeled "quit" at the end of the panel, which does the obvious thing. Note that this panel is a horizontal panel, because there are no empty lines (see Figure 1). Like a lot of files in Unix, this panel description seems cryptic, but it works like charm and I find this format convenient to write and parse.

image of panel

Figure 1 - The panel used to write this article

Just to give you a flavor of what can be done with bs, a panel for compiling C programs could be:
//{{{

	X="xterm -geometry 80x70+0+0 -title"
	E="-e vi"
myprog
main	F=main; $X $F.c $E $F.c &
lib	F=lib; $X $F.c $E $F.c &
make	make
run	$F
//}}}
Note how variable definitions simplify command lines.

The panel below is an example of how more sophisticated layouts can be described (see Figure 2). Although you can't see them, blank spaces have been used for alignment: the label on the 'who' button is actually "who " (with one trailing space), and the label on the 'ls' button is actually 'ls  ' (with two trailing spaces). Also, the file does not end with an empty line, and so the 'quit' button appears right after the last label.

try some Unix commands

date	date
displays current date and time

who 	who
display who is logged in

ls  	ls
displays contents of current directory

then, when you're tired, just

image of panel

Figure 2 - Sophisticated layout

Writing bs
Enough about the design of bs. I hope the explanation above has convinced you that if you know the command lines needed to perform a task, then it is easy to write a panel description file for bs that creates a simple graphical user interface for this task.

Let's now see how bs is implemented in X using Xt and Xaw.

!!!!Initialization
Like I said before, bs uses Xt, the X Toolkit Intrinsics library, to create a graphical user interface in X. The easiest way to initialize an Xt application is by calling XtInitialize. This routine has actually been superseded by XtAppInitialize, but the only documentation I had at the time I wrote bs was an old DEC manual for X11R3. I never changed the code of bs after I wrote it, so I'll explain the 'old' way. Newer applications, however, should probably use XtAppInitialize instead of XtInitialize. There are XtApp... versions for a few other routines in Xt.

In any case, Xt is initialized in bs with

 toplevel=XtInitialize(argv[0],"bs",NULL,0,&argc,argv);

XtInitialize returns a top level window, that is, a window whose parent is the root window. The labels and buttons created by bs will be placed inside this window. The 'id' of this window is stored in a global variable toplevel, which is declared as:

static Widget toplevel;

Widget is an opaque Xt data type declared in

#include <X11/Intrinsic.h>

which you need to include in every Xt application.

XtInitialize takes care of all necessary initialization, including parsing and interpreting Xt command line options. This is the reason for passing argc and argv to XtInitialize. By giving Xt access to the command line in this way, every Xt application is automatically configurable using command line options. Thus, for example, without a line of code from me, the user can select the font to be used in both labels and buttons with the -fn option. In bs, XtInitialize also receives the program name stored in argv[0] as the instance name and "bs" as the class name, so that bs can also be configured using resource files.

Let's now see where XtInitialize is actually called in bs.

!!!!The main Routine
The complete main routine in bs is:

int main(int argc, char* argv[])
{
 shell=popen("/bin/sh","w");
 doargs(argc,argv);
 makemenu();
 XtRealizeWidget(toplevel);
 XtMainLoop();
 return 0;
}

This routine first opens a pipe to the Bourne shell /bin/sh with popen. All commands are sent down this pipe, which remains open throughout the execution of bs so that commands can set variables that are used later. The FILE descriptor for the pipe is stored in the global variable shell, because it is needed in the code that handle buttons:

static FILE* shell;

Then, main parses the command line with doargs, initializing Xt and selecting a panel description file, and builds the panel by parsing this file with makemenu. Once labels and buttons have been created, the panel is ready to be displayed with XtRealizeWidget(toplevel), and main yields control to Xt by calling XtMainLoop, so that bs can respond to user actions. XtMainLoop never actually returns, but main ends with return 0 to avoid compilation or lint warnings. If you use XtAppInitialize instead of XtInitialize, then you should use XtAppMainLoop instead of XtMainLoop.

!!!!Command Line Processing
The actual Xt initialization is done in doargs:

void doargs(int argc, char* argv[])
{
 char* f;
 toplevel=XtInitialize(argv[0],"bs",NULL,0,&argc,argv);
 switch (argc)
 {
  case 1:
   f=".bsrc";
   break;
  case 2:
   f=argv[1];
   break;
  default:
   fprintf(stderr,"usage: bs [menu-file] [X toolkit options]\n");
   exit(1);
 }
 if (freopen(f,"r",stdin)==NULL)
 {
  fprintf(stderr,"bs: cannot open ");
  perror(f);
  exit(1);
 }
}

This routine calls ~XtInitialize to parse the command line and create toplevel, as explained before. ~XtInitialize consumes all Xt command line options, and so, at most one argument can remain after ~XtInitialize: the name of the file containing the panel description. If no arguments are left, then bs uses a file named .bsrc by default, which must reside in the current directory. (I usually create a .bsrc file for each project I work on.) The code then makes sure that stdin points to the panel description file, by using freopen. This redirection is not strictly necessary, but it simplifies the code and avoids creating another global variable. If the redirection fails, then bs aborts gracefully, calling perror to tell the user why it failed. If the redirection succeeds, then doargs retuns to main, where the panel is built by parsing the panel description file with makemenu, which I explain next.
[[Basic Chroot|https://help.ubuntu.com/community/BasicChroot]]
Tiddler 
border  #6688aa
.title       #333
[[dotfiles|http://dotfiles.org/]]
config.options.chkHttpReadOnly = false;
config.options.chkAnimate = false;
config.options.txtUserName = " ";     // default "YourName" //
config.options.chkToggleLinks = true;
config.options.chkSinglePageMode = true;
config.options.chkTopOfPageMode = true;
config.options.chkSinglePagePermalink = false;
config.options.chkSaveBackups = false;  
config.views.editor.defaultText = "";
config.views.wikified.defaultText = ""; 
function getPageTitle() { return wikifyPlain("Grrr"); } 
[[Source|http://murga-linux.com/puppy/viewtopic.php?t=36573]] Forum member Aragon

As i'm often working on the 'opened heart' of my puplet (copying the pup_*.sfs-content to a directory, modify, dir2sfs), i also need a solution like dir2sfs for creating an (bootable) iso again.

Isomaster does not work in all cases, so dir2iso is my personal solution. It combines dir2sfs and the mkisofs-command from the remaster-script.

Code:
#!/bin/bash

t=`echo "$1" | sed "s/\/$//"`
z=`echo "$1" | sed "s/\/$//"`

if [ ! -d "$t" ];then

  echo "error: no valid folder specified!"
  exit 0

fi

if [ -f "$z.iso" ];then

  echo "$z.iso already exists, refusing to overwrite it!"
  exit 0

fi

mkisofs -D -R -o "$z.iso" -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table "$t"
md5sum "$z.iso" > "$z.iso-md5.txt"
sync


echo
echo
s=`du -m "$z.iso" | sed "s/\s.*//"`
echo "created: $z.iso ( $s MB )"
echo "created: $z.iso-md5.txt"
echo
echo "...byebye..."
echo


You copy the content of the base cd to a directory. Exchange the old and the new pup_*.sfs. Than you run dir2iso from the parent-dir with
Code:

dir2iso YOURFOLDER


It will create a new iso named YOURFOLDER.iso in the parent-dir.

Possible improvements (here i need help):
- The script does not test if these files exist in YOURFOLDER:
--- boot.cat
--- boot.msg
--- initrd.gz
--- isolinux.bin
--- isolinux.cfg
--- vmlinuz
--- pup_*.sfs
[[Home Page|http://code.google.com/p/fbterm/]]
256 Colours
@@white-space:pre;<nowiki> 
To enable 256 color mode only when fbterm is active, you may execute 
'FBTERM=1 fbterm'

and add  

'[ -n "$FBTERM"] && export TERM=fbterm' 

to the end of ~/.bashrc if the shell is bash.
This can be included in profile.local in newer puppies, as bashrc reads .profile.

Config file - .fbtermrc

# Configuration for FbTerm

# Lines starting with '#' are ignored.
# Note that end-of-line comments are NOT supported, comments must be on a line of their own.


# font family names/pixelsize used by fbterm, multiple font family names must be seperated by ','
# and using a fixed width font as the first is strongly recommended
font-names=LiberationMono
font-size=18

# force font width (and/or height), usually for non-fixed width fonts
# legal value format: n (fw_new = n), +n (fw_new = fw_old + n), -n (fw_new = fw_old - n)
#font-width=
#font-height=

# default color of foreground/background text
# available colors: 0 = black, 1 = red, 2 = green, 3 = brown, 4 = blue, 5 = magenta, 6 = cyan, 7 = white
color-foreground=7
color-background=0

# max scroll-back history lines of every window, value must be [0 - 65535], 0 means disable it
history-lines=1000

# up to 5 additional text encodings, multiple encodings must be seperated by ','
# run 'iconv --list' to get available encodings.
text-encodings=

# cursor shape: 0 = underline, 1 = block
# cursor flash interval in milliseconds, 0 means disable flashing
cursor-shape=1
cursor-interval=500

# additional ascii chars considered as part of a word while auto-selecting text, except ' ', 0-9, a-z, A-Z
word-chars=._-

# change the clockwise orientation angle of screen display
# available values: 0 = 0 degree, 1 = 90 degrees, 2 = 180 degrees, 3 = 270 degrees
screen-rotate=0

# specify the favorite input method program to run
input-method=

# treat ambiguous width characters as wide
#ambiguous-wide=yes
</nowiki>@@
http://pkgs.org/
!!!!Unpack:
mkdir initrd-tree
cd initrd-tree/
zcat ../initrd.gz | cpio -i -d

!!!!Rebuild:
rm ../initrd.gz
find . | cpio -o -H newc | gzip -9 > ../initrd.gz

 - Pizzasgood [[forum|http://www.murga-linux.com/puppy/viewtopic.php?t=24899]]
[[How to compile...|http://puppylinux.com/development/compilekernel.htm]]

!!!!Compiling the kernel

The vital thing to do now is obtain the configuration file for the kernel. A copy of this is in Puppy, in folder /lib/modules.

Do each of these steps:

# cd /usr/src/linux-2.6.18.1
  If there is a .config file, copy it somewhere else temporarily, or rename.
# make clean
# make mrproper
  Copy the .config file for Puppy into /usr/src/linux-2.6.18.1 ...
  In /lib/modules it will have a different name, so rename to ".config"...
  The next steps reads .config, generates a new one... it seems, need
  to do this step even though not making any changes to configuration
  (best not to make any changes, for max compatibility with Puppy)...
# make menuconfig
  ...make any changes that you wish and save. You will now have a
     new .config file, and you should copy that somewhere for safekeeping.
     See note below *
# make bzImage

You have now compiled the kernel.

* A further note on menuconfig. I've been using it for ages, so take some things for granted, however a newbie might get tripped up when wanting to exit from the program. At the top-level menu there is a menu entry to save the configuration -- ignore that. Just press TAB key (or right-arrow key) to highlight Exit "button" then press ENTER key -- it will then ask if you want to save the new configuration, and you answer yes.

Okay, you'll find the Linux kernel at /usr/src/linux-2.6.18.1/arch/i386/boot/bzImage

!!!!Compiling the modules

Now go into /lib/modules and if there is already a folder named "2.6.18.1", rename the folder "2.6.18.1" to "2.6.18.1-old".

Now to install the new modules:

# cd /usr/src/linux-2.6.18.1
# make modules
# make modules_install

...after that, you should find the new modules installed into /lib/modules/2.6.18.1.

Note, the last step above runs the "depmod" program, to check dependencies, and it may give error messages about missing symbols for some of the modules. Don't worry about it -- one of the developers stuffed up and it means we can't use that particular module.

!!!!How to use the new kernel and modules

It is best if you have Puppy Unleashed installed. When the Unleashed tarball is expanded, there are two directories of concern: "boot" and "kernels".

The "boot" contains the file structure and a script to create the initial ramdisk. You will need to place some kernel modules in here.

The "kernels" directory has a directory kernels/2.6.18.1/ and you will need to replace the modules in it with your updated ones. Or perhaps not -- if you have recompiled the same kernel version (2.6.18.1) and only made minor changes to the configuration then perhaps all the old modules may still work.

Note that in kernels/2.6.18.1 there is a file named 'System.map'. You should rename that and replace it with the new one from /usr/src/linux-2.6.18.1.
Basically, look through kernels/2.6.18.1/ and you should be able to see what needs to be updated.

If you only made minor changes to the configuration and the old modules still work, no need to replace the initial ramdisk file "initrd.gz" either.

If you have compiled the kernel in a full h.d. installation of Puppy, you can reboot using the new kernel. The 'make modules_install' step above will have installed the new modules to /lib/modules/2.6.18.1, but you will also have to install the new kernel. I boot with Grub and it was a simple matter of copying the new kernel to /boot directory (and rename it from 'bzImage' to 'vmlinuz').
  #.ratpoisonrc --- ratpoison customizations
      
    ##change directory to $HOME
    chdir
    
    ###Set the ctrl-t key to something easier
    definekey top Insert readkey root
    definekey root Insert link less
    
    ##Set the mouse warping option.
    warp on
    
    ##Hush up, ratpoison. I know what the prefix key is.
    startup_message off
    
    ##There are three different ways ratpoison can "name" frames.
    ##By title, name, or class. Title gets you gunk like "emacs@localhost.localdomain";
    ##but name and class give you the sensible "emacs" or "Emacs". 
    set winname class
    
    ###Supposedly make borders take up less space.
    #defborder 0
    #defpadding 0 0 0 0
    #defbarpadding 0 0 
    set fgcolor white
    set bgcolor black
    
    ##What programs do we run on startup?
    ###Do some key re-mapping
    exec xmodmap -quiet ~/.Xmodmap
    
    ###Apparently modifies some low-level GUI bits of X.
    exec xrdb -load ~/.Xresources
    
    ###Change the background and pointer in X
    #exec xsetroot -solid black -cursor_name left_ptr
     
    ###Set a background. image must currently be manually changed.
     
    ###Run unclutter so the mouse hangs around no longer than needed.
    exec unclutter -idle 1 -jitter 2 -root
    
    ## dzen2 menu at startup
    exec men2      
    # exec AppMenu
    #cpu monitor - same fontsize & colours as men2
    exec cpu
    #exec networkmeter ### doesn't work for me
# With a more modern RP, I want the function keys to be shortcuts to
# windows.

definekey top F1 select 0
definekey top F2 select 1
definekey top F3 select 2
definekey top F4 select 3
definekey top F5 select 4
definekey top F6 select 5
definekey top F7 select 6
definekey top F8 select 7
definekey top F9 select 8
definekey top F10 select 9


    ###make semicolon invoke ratpoison command, and colon shell command.
    bind semicolon colon
    bind colon exec
    bind M exec men2
      
    ###Change the date from 24-hour to 12-hour
    bind a time
    bind I exec Puppy-Software-Installer
    bind e edbrowse
    bind c exec rxvt -rv +sb -sl 1000 -fn -*-courier-bold-r-normal--25-0-*-*-*-*-*-* -fg darkgreen -ls
    
    ###Shortcuts for Seamonkey and Firefox
    bind d exec mozstart
    bind F exec firefox    
    
    ## Large font xterm
    bind m exec x30   
    
    ###Shortcut for geany
    bind g exec geany
    
    ### Pfind
    bind P exec pfind
    
    #### Rox-filer
    bind X exec rox
http://pupngo.dk/
  #.ratpoisonrc --- ratpoison customizations
      
    ##change directory to $HOME
    chdir
    
    ###Set the ctrl-t key to something easier
    definekey top Insert readkey root
    definekey root Insert link less
    
    ##Set the mouse warping option.
    warp on
    
    ##Hush up, ratpoison. I know what the prefix key is.
    startup_message off
    
    ##There are three different ways ratpoison can "name" frames.
    ##By title, name, or class. Title gets you gunk like "emacs@localhost.localdomain";
    ##but name and class give you the sensible "emacs" or "Emacs". 
    set winname class
    
    ###Supposedly make borders take up less space.
    #defborder 0
    #defpadding 0 0 0 0
    #defbarpadding 0 0 
    set fgcolor white
    set bgcolor black
    
    ##What programs do we run on startup?
    ###Do some key re-mapping
    exec xmodmap -quiet ~/.Xmodmap
    
    ###Apparently modifies some low-level GUI bits of X.
    exec xrdb -load ~/.Xresources
    
    ###Change the background and pointer in X
    #exec xsetroot -solid black -cursor_name left_ptr
     
    ###Set a background. image must currently be manually changed.
     
    ###Run unclutter so the mouse hangs around no longer than needed.
    exec unclutter -idle 1 -jitter 2 -root
    
    ## dzen2 menu at startup
    exec men2      
    # exec AppMenu
    #cpu monitor - same fontsize & colours as men2
    # exec cpu
    #exec denmen
    exec timebar
    #exec networkmeter ### doesn't work for me
# With a more modern RP, I want the function keys to be shortcuts to
# windows.

definekey top F1 select 0
definekey top F2 select 1
definekey top F3 select 2
definekey top F4 select 3
definekey top F5 select 4
definekey top F6 select 5
definekey top F7 select 6
# definekey top F8 select 7
# definekey top F9 select 8
# definekey top F10 select 9


    ###make semicolon invoke ratpoison command, and colon shell command.
    bind semicolon colon
    bind colon exec
    bind M exec men2
      
    ###Change the date from 24-hour to 12-hour
    bind a time
    bind I exec Puppy-Software-Installer
    bind e edbrowse
    bind c exec rxvt -rv +sb -sl 1000 -fn -*-courier-bold-r-normal--25-0-*-*-*-*-*-* -fg darkgreen -ls
    
    bind v exec resize
    
    ###Shortcuts for Seamonkey and Firefox
    bind d exec mozstart
    bind F exec firefox    
    
    ## Large font xterm
    bind m exec x30   
    
    ###Shortcut for geany
    bind g exec geany
    
    ### Pfind
    bind P exec pfind
    
    #### Rox-filer
    unbind x
    bind x exec rox
|Key       |	Action            |	                        Notes|
|Ctrl+a c|	new window|	                                   |
|Ctrl+a n|	next window|   I bind F12 to this|
|Ctrl+a p|	previous window|  I bind F11 to this|
|Ctrl+a "|	select window from list|  I have window list in the status line|
|Ctrl+a Ctrl+a|	previous window viewed|                                                    |
 	 	 
|Ctrl+a S|	split terminal horizontally into regions	|Ctrl+a c to create new window there|
|Ctrl+a :resize	|resize region	 ||
|Ctrl+a :fit	|fit screen size to new terminal size|	Ctrl+a F is the same. Do after resizing xterm|
|Ctrl+a :remove	|remove region	|Ctrl+a X is the same|
|Ctrl+a tab	|Move to next region	 ||
 	 	 
|Ctrl+a d	|detach screen from terminal	|Start screen with -r option to reattach|
|Ctrl+a A	|set window title	 ||
|Ctrl+a x	|lock session	|Enter user password to unlock|
|Ctrl+a [	|enter scrollback/copy mode	|Enter to start and end copy region. Ctrl+a ] to leave this mode|
|Ctrl+a ]	|paste buffer	|Supports pasting between windows|
|Ctrl+a >	|write paste buffer to file	|useful for copying between screens|
|Ctrl+a <	|read paste buffer from file	|useful for pasting between screens|
 	 	 
|Ctrl+a ?	|show key bindings/command names	|Note unbound commands only in man page|
|Ctrl+a :	|goto screen command prompt	|up shows last command entered|
[[ratpoisonrc]]
[[xinitrc]] Altered to start up ratpoison and remove desktop background / icons.
[[timebar]]
/*{{{*/
.searchBar { margin-right:1.3em; 
 margin-top: -1.2em;}
.searchBar .button {display:block; border:none; color:#11e; }
.searchBar .button:hover{border:none; color:#eee;}

.searchBar input{
 border: 1px inset #000; background:#EFDFDa; width:11em; margin:0;
}

.searchBar input:focus {
 border: 1px inset #000; background:#fff;
}

/*{{{*/
/***
!Search Bar /% ============================================================= %/
***/

/*{{{*/
.searchBar { margin-right:1.3em; 
 margin-top: -1.em;}
.searchBar .button {display:block; border:none; color:#fff; }
.searchBar .button:hover{border:none; color:#eee;}

.searchBar input{
 border: 1px inset #000; background:#EFDFDa; width:9em; margin:0;
}

.searchBar input:focus {
 border: 1px inset #000; background:#fff;
}

/*{{{*/
#!/bin/sh

FG='#ffffff'
BG='#003aff'
# FONT='-*-courier-bold-r-normal--25-0-*-*-*-*-*-*'

while true ; do
    dt=`date +"%a %b %d %l:%M %p "`
    printf "%s\n" "$dt"
    sleep 20
done | dzen2 -e '' -x '670' -y 2 -w '330' -ta r -fg $FG -bg $BG -fn $FONT

[[Post by ibidem|http://murga-linux.com/puppy/viewtopic.php?p=673363#673363]]
[[Posts by GustavoYz|http://murga-linux.com/puppy/viewtopic.php?t=75872]]

Feel the need of post this here...

Arrow Change the font on the fly (either way):
Code:	
printf '\33]50;%s\007' 9x15,xft:FontName	

Code:	
printf '\33]50;%s\007' xft:"Font Name":pixelsize=10:size=9:hinting=true	


Arrow I'll quote this one, from `man 7 urxvt`:
Quote:	
I don't like the screen colours. How do I change them?

You can change the screen colours at run-time using ~/.Xdefaults resources (or as long-options).

[...]
And here is a more complete set of non-standard colours.
URxvt.cursorColor: #dc74d1
URxvt.pointerColor: #dc74d1
URxvt.background: #0e0e0e
URxvt.foreground: #4ad5e1
URxvt.color0: #000000
URxvt.color8: #8b8f93
URxvt.color1: #dc74d1
URxvt.color9: #dc74d1
URxvt.color2: #0eb8c7
URxvt.color10: #0eb8c7
URxvt.color3: #dfe37e
URxvt.color11: #dfe37e
URxvt.color5: #9e88f0
URxvt.color13: #9e88f0
URxvt.color6: #73f7ff
URxvt.color14: #73f7ff
URxvt.color7: #e1dddd
URxvt.color15: #e1dddd


I tested it and worked as a charm (overwrite the system colours, as other terminals does).
_________________

Here are a couple of urxvt settings that I use and love:

Light brown and white:
Code:	
urxvt -vb +st -tr -cr green -tint moccasin -pr green -pr2 antiquewhite -sh 54 -bg moccasin -fg antiquewhite -fn xft:Inconsolata:pixelsize=12:antialias=true:hingting=true	


Orange and light yellow:
Code:	
urxvt -sr +st -tr -tint chocolate -sh 51 -fn "xft:Inconsolata:size=10" -cr green -bg black -fg moccasin	


Blue and white:
Code:	
urxvt -vb +st -tr -cr green -tint steelblue -pr green -pr2 snow -sh 60 -bg steelblue -fg snow -fn xft:Inconsolata:pixelsize=12:antialias=true:hinting=true	


Gold (yellow?) and white:
Code:	
urxvt -vb +st -tr -cr green -tint gold -pr green -pr2 snow -sh 44 -bg gold -fg snow -fn xft:Inconsolata:pixelsize=12:antialias=true:hinting=true	


Transparent 100% for dark wallpapers:
Code:	
urxvt -vb +st -tr -cr green -tint white -pr green -pr2 black -sh 100 -bg white -fg black -fn xft:Inconsolata:pixelsize=12:antialias=true:hinting=true	


The other options are just settings: remove, edit, change, explore at your will.
Source: http://murga-linux.com/puppy/viewtopic.php?t=80959

--mirror 
 Specifies to mirror the site. Wget will recursively follow all links on the site and download all necessary files. It will also only get files that have changed since the last mirror, which is handy in that it saves download time. 
 -H or --span-hosts 
 Enable spanning across hosts when doing recursive retrieving. 
 See also the -E option at the bottom. 

 Now coming to terrible ideas.. to the hell with webmasters, not allowing to download the website type to ignore the robots.txt. 

DON'T USE THIS IF YOU DON'T KNOW WHAT YOU'RE DOING! AND I REALLY MEAN THAT! 
Code:
wget -r -U Your-Browsername -e robots=off http://url-to-site/ 



 -e command or --execute command 
 Execute command as if it were a part of .wgetrc (will overrun a command given in .wgetrc). 

 -U agent-string or --user-agent=agent-string 
 The HTTP protocol allows the clients to identify themselves using a "User-Agent" header field. Some servers block clients not using their preferred browser (Netscape, IE), the -U lets you specify what you send with wget. 
 Specifying empty user agent with --user-agent="" instructs Wget not to send the "User-Agent" header in HTTP requests. 

 Do you think the web master still can stop u even with above command, to fool him use 
Code:
wget -r -U Your-Browsername -e robots=off -w 5 --limit-rate=20 http://url-to-site/ 



 here -w 5 instructs wget to wait 5 secs before downloading another file and --limit-rate=20 makes wget to cap the download speed to 20KBps. So u can fool the webmaster .... 
 (and even yourself if the download is BIG...) 

 # # # 

 This is the wget I personally use regularly to download tech articles from some magazines that normally don't let you download anything, but just read on-site. Remove the '-e robots=off' to download articles that are not blocked. It works just as good for whole sites. 
Code:
wget -e robots=off -r  -k -p -np -E http://www.your-favorite-magazine.com/techarticles/



 -r or --recursive 
 Turn on recursive retrieving. 

 -k or --convert-links 
 After the download is complete, convert the links in the document to make them suitable for local viewing. This affects not only the visible hyperlinks, but any part of the document that links to external content, such as embedded images, links to style sheets, hyperlinks to non-HTML content, etc. 

 -p or --page-requisites 
 This option causes Wget to download all the files that are necessary to properly display a given HTML page. This includes such things as inlined images, sounds, and referenced stylesheets. 

 -np or --no-parent 
 Do not ever ascend to the parent directory when retrieving recursively. This is a useful option, since it guarantees that only the files below a certain hierarchy will be downloaded. 

 -E or --html-extension 
 If a file of type application/xhtml+xml or text/html is downloaded and the URL does not end with the regexp \.[Hh][Tt][Mm][Ll]?, this option will cause the suffix .html to be appended to the local filename. This is useful, for instance, when you're mirroring a remote site that uses .asp pages, but you want the mirrored pages to be viewable on your stock Apache server. Another good use for this is when you're downloading CGI-generated materials. A URL like http://site.com/article.cgi?25 will be saved as article.cgi?25.html. 

 Look up the options with 'man wget' before using them. A quote from an old TV crime series: Now you be careful out there! 

 tallboy
#!/bin/sh
# PuppyLinux xinitrc
## Modified by Dougal
## Last update: November 5th 2007 (remove autocutsel nicening)

# make sure we have this file (for Tcl/Tk apps):
[ -f $HOME/.tcl-gtk ] || touch $HOME/.tcl-gtk

## code for running the HotPup daemon:
#PINFILE=$HOME/Choices/ROX-Filer/PuppyPin
PINFILE=$HOME/.config/rox.sourceforge.net/ROX-Filer/pb_Default
# Clean pinboard file from previous mountpoints
grep -E -v '>/mnt/[a-z]?[[:alnum:]]+<' $PINFILE >$PINFILE.tmp
mv -f $PINFILE.tmp $PINFILE
# Run daemon:
/etc/HotPup/HotPup.sh all &
##

userresources=$HOME/.Xresources
usermodmap=$HOME/.Xmodmap
sysresources=/usr/X11R7/lib/X11/xinit/Xresources
sysmodmap=/usr/X11R7/lib/X11/xinit/.Xmodmap

# merge in defaults and keymaps

if [ -f $sysresources ]; then
    xrdb -merge -nocpp $sysresources
fi

if [ -f $sysmodmap ]; then
    xmodmap $sysmodmap
fi

if [ -f $userresources ]; then
    xrdb -merge -nocpp $userresources
fi

if [ -f $usermodmap ]; then
    xmodmap $usermodmap
fi

# Dougal: decide on terminal to use (xterm script uses this)
if which defaultterminal >/dev/null ; then
  TERMCMD="defaultterminal"
elif which aterm >/dev/null ; then
  TERMCMD="aterm"
elif which Terminal >/dev/null ; then
  TERMCMD="Terminal"
elif which Eterm >/dev/null ; then
  TERMCMD="Eterm"
elif which mlterm >/dev/null ; then
  TERMCMD="mlterm"
elif which urxvt >/dev/null ; then
  TERMCMD="urxvt"
elif which mrxvt >/dev/null ; then
  TERMCMD="mrxvt"
else
  TERMCMD="rxvt"
fi
export TERMCMD

if [ -f /usr/X11R6/bin/XF86_SVGA ];then #0.9.9
 xmodmap -e "keycode 22 = BackSpace"
 xmodmap -e "keycode 107 = Delete"
fi

CURRENTWM="`cat /etc/windowmanager`"
if [ "$CURRENTWM" = "startkde" ];then
 exec startkde
fi


#0.9.8 sync cut-buffers and clipboard. only useful for older apps
#such as rxvt that use the cut-buffers...
/usr/bin/autocutsel &
#...disadvantage of this is it creates a little square bottom-right of screen.

# Dougal: uncomment to turn on numlock
#xsetnumlock

#rxvt &
if [ -e /tmp/videomode ];then #testing a video mode
 video-wizard &
fi
agenda_chk &

#v1.0.7 set by xrandrshell, part of xorg wizard...
if [ -f /etc/xrandrindex ];then
 XRANDRINDEX="`cat /etc/xrandrindex`"
 [ ! "$XRANDRINDEX" = "0" ] && xrandr -s $XRANDRINDEX
fi


if [ -f /root/.xset.sh ];then
 #this is created by /usr/X11R6/bin/gxsetshell...
 eval "/root/.xset.sh"
else
 #Xorg has it's own fontpath settings in /etc/X11/xorg.conf...
 if [ ! "`readlink /usr/X11R7/bin/X`" = "Xorg" ];then
  xset fp+ /usr/X11R7/lib/X11/fonts/Type1/
  xset fp+ /usr/X11R7/lib/X11/fonts/TTF/
 fi
 xset s 600 600 s blank
fi

#v1.0.7 also see /etc/rc.d/rc.local0
if [ -f /root/.fonts/fonts.dir ];then
 xset fp+ /root/.fonts/
fi
# Set the background color
#xsetroot -solid steelblue
xsetroot -scale drops_blue.jpg
xsetroot -cursor_name top_left_arrow

##new background setter created by mu...
#/usr/local/Puppybackground/puppybackgroundmenu saved &
#/usr/sbin/fixPuppyPin /root/Choices/ROX-Filer/PuppyPin #v1.0.7
#rox -o -p /root/Choices/ROX-Filer/PuppyPin
#v2.13 now using rox 2.5...
#case "`rox -v 2>&1`" in 
 #*'Filer 1'*)
  #/usr/sbin/fixPuppyPin
  #sleep 1 && nice -n 15 rox -o -p Default &
  #;;
# *'Filer 2'*)
#  /usr/sbin/fixPuppyPin
#  sleep 1 && nice -n 15 rox -p Default &
#  ;;
#esac

#v2.0.0
nice -n 19 /usr/sbin/delayedrun &

#v2.01 hide cursor when not moving... (setup in /usr/sbin/input-wizard)
if [ -f /etc/mousehide ];then
 IDLETIME="`cat /etc/mousehide | cut -f 1 -d ','`"
 [ ! "$IDLETIME" = "0" ] && unclutter -idle $IDLETIME &
fi

# run glipper
which glipper >/dev/null && sleep 3 && nice -n 19 glipper &

# run fbxkb if needed
if grep -F '"XkbLayout"' /etc/X11/xorg.conf | grep -v '^#' | grep -F -q ',' 
then sleep 4 && nice -n 19 fbxkb &
fi

#exec $CURRENTWM
#v2.11 GuestToo suggested this improvement...
#which $CURRENTWM >/dev/null && exec $CURRENTWM
#[ -x $CURRENTWM ] && exec $CURRENTWM

ratpoison

###END###