Index » Empathy Jukebox : Commitdiff 85335f

Added On screen keyboard to tree

Matthew Smith [12-10-12 11:15]
Added On screen keyboard to tree
diff --git a/On Screen Keyboard/alpha.csv b/On Screen Keyboard/alpha.csv
new file mode 100644
index 0000000..cd8fb3d
--- /dev/null
+++ b/On Screen Keyboard/alpha.csv
@@ -0,0 +1,31 @@
+NULL,0,0.75,1
+Q,Q,1,1
+W,W,1,1
+E,E,1,1
+R,R,1,1
+T,T,1,1
+Y,Y,1,1
+U,U,1,1
+I,I,1,1
+O,O,1,1
+P,P,1,1
+ROW,0,0,0
+NULL,0,1,1
+A,A,1,1
+S,S,1,1
+D,D,1,1
+F,F,1,1
+G,G,1,1
+H,H,1,1
+J,J,1,1
+K,K,1,1
+L,L,1,1
+ROW,0,0,0
+NULL,0,1.5,1
+Z,Z,1,1
+X,X,1,1
+C,C,1,1
+V,V,1,1
+B,B,1,1
+N,N,1,1
+M,M,1,1
diff --git a/On Screen Keyboard/alphaoutline.csv b/On Screen Keyboard/alphaoutline.csv
new file mode 100644
index 0000000..485c108
--- /dev/null
+++ b/On Screen Keyboard/alphaoutline.csv
@@ -0,0 +1,12 @@
+TR11
+BR11
+TR21
+BR21
+TR29
+BR29
+BL23
+TL23
+BL13
+TL13
+BL2
+TL2
diff --git a/On Screen Keyboard/emposk.bdsproj b/On Screen Keyboard/emposk.bdsproj
new file mode 100644
index 0000000..a83eb69
--- /dev/null
+++ b/On Screen Keyboard/emposk.bdsproj
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="utf-8"?>
+<BorlandProject>
+	<PersonalityInfo>
+		<Option>
+			<Option Name="Personality">Delphi.Personality</Option>
+			<Option Name="ProjectType">VCLApplication</Option>
+			<Option Name="Version">1.0</Option>
+			<Option Name="GUID">{9EAEDD7F-059A-4E46-99F2-2C5BB60BA080}</Option>
+		</Option>
+	</PersonalityInfo>
+	<Delphi.Personality>
+		<Source>
+			<Source Name="MainSource">emposk.dpr</Source>
+		</Source>
+		<FileVersion>
+			<FileVersion Name="Version">7.0</FileVersion>
+		</FileVersion>
+		<Compiler>
+			<Compiler Name="A">1</Compiler>
+			<Compiler Name="B">0</Compiler>
+			<Compiler Name="C">1</Compiler>
+			<Compiler Name="D">1</Compiler>
+			<Compiler Name="E">0</Compiler>
+			<Compiler Name="F">0</Compiler>
+			<Compiler Name="G">1</Compiler>
+			<Compiler Name="H">1</Compiler>
+			<Compiler Name="I">1</Compiler>
+			<Compiler Name="J">1</Compiler>
+			<Compiler Name="K">0</Compiler>
+			<Compiler Name="L">1</Compiler>
+			<Compiler Name="M">0</Compiler>
+			<Compiler Name="N">1</Compiler>
+			<Compiler Name="O">1</Compiler>
+			<Compiler Name="P">1</Compiler>
+			<Compiler Name="Q">1</Compiler>
+			<Compiler Name="R">0</Compiler>
+			<Compiler Name="S">0</Compiler>
+			<Compiler Name="T">0</Compiler>
+			<Compiler Name="U">0</Compiler>
+			<Compiler Name="V">1</Compiler>
+			<Compiler Name="W">0</Compiler>
+			<Compiler Name="X">1</Compiler>
+			<Compiler Name="Y">2</Compiler>
+			<Compiler Name="Z">1</Compiler>
+			<Compiler Name="ShowHints">True</Compiler>
+			<Compiler Name="ShowWarnings">True</Compiler>
+			<Compiler Name="UnitAliases">WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;</Compiler>
+			<Compiler Name="NamespacePrefix"></Compiler>
+			<Compiler Name="GenerateDocumentation">False</Compiler>
+			<Compiler Name="DefaultNamespace"></Compiler>
+			<Compiler Name="SymbolDeprecated">True</Compiler>
+			<Compiler Name="SymbolLibrary">True</Compiler>
+			<Compiler Name="SymbolPlatform">True</Compiler>
+			<Compiler Name="SymbolExperimental">True</Compiler>
+			<Compiler Name="UnitLibrary">True</Compiler>
+			<Compiler Name="UnitPlatform">True</Compiler>
+			<Compiler Name="UnitDeprecated">True</Compiler>
+			<Compiler Name="UnitExperimental">True</Compiler>
+			<Compiler Name="HResultCompat">True</Compiler>
+			<Compiler Name="HidingMember">True</Compiler>
+			<Compiler Name="HiddenVirtual">True</Compiler>
+			<Compiler Name="Garbage">True</Compiler>
+			<Compiler Name="BoundsError">True</Compiler>
+			<Compiler Name="ZeroNilCompat">True</Compiler>
+			<Compiler Name="StringConstTruncated">True</Compiler>
+			<Compiler Name="ForLoopVarVarPar">True</Compiler>
+			<Compiler Name="TypedConstVarPar">True</Compiler>
+			<Compiler Name="AsgToTypedConst">True</Compiler>
+			<Compiler Name="CaseLabelRange">True</Compiler>
+			<Compiler Name="ForVariable">True</Compiler>
+			<Compiler Name="ConstructingAbstract">True</Compiler>
+			<Compiler Name="ComparisonFalse">True</Compiler>
+			<Compiler Name="ComparisonTrue">True</Compiler>
+			<Compiler Name="ComparingSignedUnsigned">True</Compiler>
+			<Compiler Name="CombiningSignedUnsigned">True</Compiler>
+			<Compiler Name="UnsupportedConstruct">True</Compiler>
+			<Compiler Name="FileOpen">True</Compiler>
+			<Compiler Name="FileOpenUnitSrc">True</Compiler>
+			<Compiler Name="BadGlobalSymbol">True</Compiler>
+			<Compiler Name="DuplicateConstructorDestructor">True</Compiler>
+			<Compiler Name="InvalidDirective">True</Compiler>
+			<Compiler Name="PackageNoLink">True</Compiler>
+			<Compiler Name="PackageThreadVar">True</Compiler>
+			<Compiler Name="ImplicitImport">True</Compiler>
+			<Compiler Name="HPPEMITIgnored">True</Compiler>
+			<Compiler Name="NoRetVal">True</Compiler>
+			<Compiler Name="UseBeforeDef">True</Compiler>
+			<Compiler Name="ForLoopVarUndef">True</Compiler>
+			<Compiler Name="UnitNameMismatch">True</Compiler>
+			<Compiler Name="NoCFGFileFound">True</Compiler>
+			<Compiler Name="ImplicitVariants">True</Compiler>
+			<Compiler Name="UnicodeToLocale">True</Compiler>
+			<Compiler Name="LocaleToUnicode">True</Compiler>
+			<Compiler Name="ImagebaseMultiple">True</Compiler>
+			<Compiler Name="SuspiciousTypecast">True</Compiler>
+			<Compiler Name="PrivatePropAccessor">True</Compiler>
+			<Compiler Name="UnsafeType">False</Compiler>
+			<Compiler Name="UnsafeCode">False</Compiler>
+			<Compiler Name="UnsafeCast">False</Compiler>
+			<Compiler Name="OptionTruncated">True</Compiler>
+			<Compiler Name="WideCharReduced">True</Compiler>
+			<Compiler Name="DuplicatesIgnored">True</Compiler>
+			<Compiler Name="UnitInitSeq">True</Compiler>
+			<Compiler Name="LocalPInvoke">True</Compiler>
+			<Compiler Name="MessageDirective">True</Compiler>
+			<Compiler Name="CodePage"></Compiler>
+		</Compiler>
+		<Linker>
+			<Linker Name="MapFile">0</Linker>
+			<Linker Name="OutputObjs">0</Linker>
+			<Linker Name="GenerateHpps">False</Linker>
+			<Linker Name="ConsoleApp">1</Linker>
+			<Linker Name="DebugInfo">False</Linker>
+			<Linker Name="RemoteSymbols">False</Linker>
+			<Linker Name="GenerateDRC">False</Linker>
+			<Linker Name="MinStackSize">16384</Linker>
+			<Linker Name="MaxStackSize">1048576</Linker>
+			<Linker Name="ImageBase">4194304</Linker>
+			<Linker Name="ExeDescription"></Linker>
+		</Linker>
+		<Directories>
+			<Directories Name="OutputDir"></Directories>
+			<Directories Name="UnitOutputDir"></Directories>
+			<Directories Name="PackageDLLOutputDir"></Directories>
+			<Directories Name="PackageDCPOutputDir"></Directories>
+			<Directories Name="SearchPath"></Directories>
+			<Directories Name="Packages">Vcl40;Vclx40;VclSmp40;Qrpt40;Vcldb40;TeeUI40;teedb40;tee40;vcldbx40;ibevnt40;nmfast40</Directories>
+			<Directories Name="Conditionals"></Directories>
+			<Directories Name="DebugSourceDirs"></Directories>
+			<Directories Name="UsePackages">False</Directories>
+		</Directories>
+		<Parameters>
+			<Parameters Name="RunParams">300 50 1 </Parameters>
+			<Parameters Name="HostApplication"></Parameters>
+			<Parameters Name="Launcher"></Parameters>
+			<Parameters Name="UseLauncher">False</Parameters>
+			<Parameters Name="DebugCWD"></Parameters>
+			<Parameters Name="Debug Symbols Search Path"></Parameters>
+			<Parameters Name="LoadAllSymbols">True</Parameters>
+			<Parameters Name="LoadUnspecifiedSymbols">False</Parameters>
+		</Parameters>
+		<Language>
+			<Language Name="ActiveLang"></Language>
+			<Language Name="ProjectLang">{viewgit}{/viewgit}000000</Language>
+			<Language Name="RootDir"></Language>
+		</Language>
+		<VersionInfo>
+			<VersionInfo Name="IncludeVerInfo">True</VersionInfo>
+			<VersionInfo Name="AutoIncBuild">False</VersionInfo>
+			<VersionInfo Name="MajorVer">1</VersionInfo>
+			<VersionInfo Name="MinorVer">1</VersionInfo>
+			<VersionInfo Name="Release">0</VersionInfo>
+			<VersionInfo Name="Build">0</VersionInfo>
+			<VersionInfo Name="Debug">False</VersionInfo>
+			<VersionInfo Name="PreRelease">False</VersionInfo>
+			<VersionInfo Name="Special">False</VersionInfo>
+			<VersionInfo Name="Private">False</VersionInfo>
+			<VersionInfo Name="DLL">False</VersionInfo>
+			<VersionInfo Name="Locale">2057</VersionInfo>
+			<VersionInfo Name="CodePage">1252</VersionInfo>
+		</VersionInfo>
+		<VersionInfoKeys>
+			<VersionInfoKeys Name="CompanyName">LibrarySmith Software</VersionInfoKeys>
+			<VersionInfoKeys Name="FileDescription">On Screen Keyboard</VersionInfoKeys>
+			<VersionInfoKeys Name="FileVersion">1.1.0.0</VersionInfoKeys>
+			<VersionInfoKeys Name="InternalName">emposk.exe</VersionInfoKeys>
+			<VersionInfoKeys Name="LegalCopyright">(C) 2004 Libarysmith Software</VersionInfoKeys>
+			<VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys>
+			<VersionInfoKeys Name="OriginalFilename"></VersionInfoKeys>
+			<VersionInfoKeys Name="ProductName"></VersionInfoKeys>
+			<VersionInfoKeys Name="ProductVersion">1.1</VersionInfoKeys>
+			<VersionInfoKeys Name="Comments"></VersionInfoKeys>
+		</VersionInfoKeys>
+	</Delphi.Personality>
+</BorlandProject>
diff --git a/On Screen Keyboard/emposk.bdsproj.local b/On Screen Keyboard/emposk.bdsproj.local
new file mode 100644
index 0000000..b3811b7
--- /dev/null
+++ b/On Screen Keyboard/emposk.bdsproj.local
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8"?>
+<BorlandProject/>
diff --git a/On Screen Keyboard/emposk.cfg b/On Screen Keyboard/emposk.cfg
new file mode 100644
index 0000000..7a8dc7c
--- /dev/null
+++ b/On Screen Keyboard/emposk.cfg
@@ -0,0 +1,36 @@
+-$A1
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J+
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q+
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$Y+
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K{viewgit}{/viewgit}400000
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/On Screen Keyboard/emposk.dof b/On Screen Keyboard/emposk.dof
new file mode 100644
index 0000000..7906759
--- /dev/null
+++ b/On Screen Keyboard/emposk.dof
@@ -0,0 +1,84 @@
+[Compiler]
+A=1
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=1
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=1
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=2
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+[Directories]
+OutputDir=
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=Vcl40;Vclx40;VclSmp40;Qrpt40;Vcldb40;TeeUI40;teedb40;tee40;vcldbx40;ibevnt40;nmfast40
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+[Parameters]
+RunParams=300 50 1
+HostApplication=
+[Version Info]
+IncludeVerInfo=1
+AutoIncBuild=0
+MajorVer=1
+MinorVer=1
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=2057
+CodePage=1252
+[Version Info Keys]
+CompanyName=LibrarySmith Software
+FileDescription=On Screen Keyboard
+FileVersion=1.1.0.0
+InternalName=emposk.exe
+LegalCopyright=(C) 2004 Libarysmith Software
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.1
+Comments=
+[HistoryLists\hlUnitAliases]
+Count=1
+Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+[HistoryLists\hlRunParameters]
+Count=1
+Item0=300 50 1
diff --git a/On Screen Keyboard/emposk.dpr b/On Screen Keyboard/emposk.dpr
new file mode 100644
index 0000000..54df333
--- /dev/null
+++ b/On Screen Keyboard/emposk.dpr
@@ -0,0 +1,25 @@
+program emposk;
+
+{%File 'emposk.bdsproj'}
+
+uses
+  Forms,
+  mainform in 'mainform.pas' {main},
+  windows;
+
+{$R *.RES}
+
+var
+ Mutex : THandle;
+begin
+ Mutex:=CreateMutex(nil,True,'EmpOskOnScreenKeyboard');
+ if (Mutex=0) or (GetLastError = Error_Already_Exists) then begin
+ end else
+  begin
+  Application.Initialize;
+  Application.CreateForm(Tmain, main);
+  Application.Run;
+  if Mutex<>0 then
+    CloseHandle(Mutex);
+end;
+end.
diff --git a/On Screen Keyboard/emposk.identcache b/On Screen Keyboard/emposk.identcache
new file mode 100644
index 0000000..38a0c55
Binary files /dev/null and b/On Screen Keyboard/emposk.identcache differ
diff --git a/On Screen Keyboard/emposk.res b/On Screen Keyboard/emposk.res
new file mode 100644
index 0000000..217d636
Binary files /dev/null and b/On Screen Keyboard/emposk.res differ
diff --git a/On Screen Keyboard/emposkgraphics.RES b/On Screen Keyboard/emposkgraphics.RES
new file mode 100644
index 0000000..3c13d2b
Binary files /dev/null and b/On Screen Keyboard/emposkgraphics.RES differ
diff --git a/On Screen Keyboard/emposkgraphics.rc b/On Screen Keyboard/emposkgraphics.rc
new file mode 100644
index 0000000..7047c90
--- /dev/null
+++ b/On Screen Keyboard/emposkgraphics.rc
@@ -0,0 +1,11 @@
+KU BITMAP graphics\jukeboxbuttonup.bmp
+KD BITMAP graphics\jukeboxbuttondown.bmp
+E2U BITMAP graphics\enterlargeup.bmp
+E2D BITMAP graphics\enterlargedown.bmp
+SPACEUP BITMAP graphics\spaceup.bmp
+SPACEDOWN BITMAP graphics\spacedown.bmp
+BLANK BITMAP graphics\blank.bmp
+LAYOUT RCDATA layout.csv
+ALPHA RCDATA alpha.csv
+OUTLINE RCDATA outline.csv
+ALPHAOUTLINE RCDATA alphaoutline.csv
diff --git a/On Screen Keyboard/graphics/STAINLESS%20STEEL.jpg b/On Screen Keyboard/graphics/STAINLESS%20STEEL.jpg
new file mode 100644
index 0000000..4357afc
Binary files /dev/null and b/On Screen Keyboard/graphics/STAINLESS%20STEEL.jpg differ
diff --git a/On Screen Keyboard/graphics/Thumbs.db b/On Screen Keyboard/graphics/Thumbs.db
new file mode 100644
index 0000000..ebeb2ba
Binary files /dev/null and b/On Screen Keyboard/graphics/Thumbs.db differ
diff --git a/On Screen Keyboard/graphics/blank.bmp b/On Screen Keyboard/graphics/blank.bmp
new file mode 100644
index 0000000..2b5d554
Binary files /dev/null and b/On Screen Keyboard/graphics/blank.bmp differ
diff --git a/On Screen Keyboard/graphics/enterlargedown.bmp b/On Screen Keyboard/graphics/enterlargedown.bmp
new file mode 100644
index 0000000..c3c8dcb
Binary files /dev/null and b/On Screen Keyboard/graphics/enterlargedown.bmp differ
diff --git a/On Screen Keyboard/graphics/enterlargeup.bmp b/On Screen Keyboard/graphics/enterlargeup.bmp
new file mode 100644
index 0000000..3f61baf
Binary files /dev/null and b/On Screen Keyboard/graphics/enterlargeup.bmp differ
diff --git a/On Screen Keyboard/graphics/jukeboxbuttondown.bmp b/On Screen Keyboard/graphics/jukeboxbuttondown.bmp
new file mode 100644
index 0000000..ee87bd3
Binary files /dev/null and b/On Screen Keyboard/graphics/jukeboxbuttondown.bmp differ
diff --git a/On Screen Keyboard/graphics/jukeboxbuttonup.bmp b/On Screen Keyboard/graphics/jukeboxbuttonup.bmp
new file mode 100644
index 0000000..e53d083
Binary files /dev/null and b/On Screen Keyboard/graphics/jukeboxbuttonup.bmp differ
diff --git a/On Screen Keyboard/graphics/keys.cdr b/On Screen Keyboard/graphics/keys.cdr
new file mode 100644
index 0000000..5302c0c
Binary files /dev/null and b/On Screen Keyboard/graphics/keys.cdr differ
diff --git a/On Screen Keyboard/graphics/spacedown.bmp b/On Screen Keyboard/graphics/spacedown.bmp
new file mode 100644
index 0000000..81578bf
Binary files /dev/null and b/On Screen Keyboard/graphics/spacedown.bmp differ
diff --git a/On Screen Keyboard/graphics/spaceup.bmp b/On Screen Keyboard/graphics/spaceup.bmp
new file mode 100644
index 0000000..584880e
Binary files /dev/null and b/On Screen Keyboard/graphics/spaceup.bmp differ
diff --git a/On Screen Keyboard/graphics/stainless.jpg b/On Screen Keyboard/graphics/stainless.jpg
new file mode 100644
index 0000000..c4cffed
Binary files /dev/null and b/On Screen Keyboard/graphics/stainless.jpg differ
diff --git a/On Screen Keyboard/keyboard layout.xls b/On Screen Keyboard/keyboard layout.xls
new file mode 100644
index 0000000..363507d
Binary files /dev/null and b/On Screen Keyboard/keyboard layout.xls differ
diff --git a/On Screen Keyboard/layout.csv b/On Screen Keyboard/layout.csv
new file mode 100644
index 0000000..479bfc4
--- /dev/null
+++ b/On Screen Keyboard/layout.csv
@@ -0,0 +1,63 @@
+NULL,0,1,1,
+1,!,1,1,
+2,QUOTE,1,1,
+3,,1,1,
+4,$,1,1,
+5,%,1,1,
+6,^,1,1,
+7,&,1,1,
+8,*,1,1,
+9,(,1,1,
+0,),1,1,
+-,_,1,1,
+=,+,1,1,
+Backspace,Backspace,2.5,1,backspace
+NULL,0,0.5,1,
+ROW,0,0,0,
+Tab,Tab,1.75,1,
+q,Q,1,1,
+w,W,1,1,
+e,E,1,1,
+r,R,1,1,
+t,T,1,1,
+y,Y,1,1,
+u,U,1,1,
+i,I,1,1,
+o,O,1,1,
+p,P,1,1,
+[,{,1,1,
+],},1,1,
+|1,|1,0.25,1,ent1
+|2,|2,2,2,ent2
+ROW,0,0,0,
+Caps Lock,Caps Lock,2,1
+a,A,1,1
+s,S,1,1
+d,D,1,1
+f,F,1,1
+g,G,1,1
+h,H,1,1
+j,J,1,1
+k,K,1,1
+l,L,1,1
+;,:,1,1
+APOST,@,1,1
+#,~,1,1
+ROW,0,0,0
+SHIFTL,SHIFTL,1.5,1
+\,|,1,1
+z,Z,1,1
+x,X,1,1
+c,C,1,1
+v,V,1,1
+b,B,1,1
+n,N,1,1
+m,M,1,1
+COMMA,<,1,1
+.,>,1,1
+/,?,1,1
+SHIFTR,SHIFTR,3.5,1
+ROW,0,0,0
+NULL,0,4,1
+SPACE,SPACE,8,1
+NULL,0,4,1
diff --git a/On Screen Keyboard/main.ico b/On Screen Keyboard/main.ico
new file mode 100644
index 0000000..a350a1d
Binary files /dev/null and b/On Screen Keyboard/main.ico differ
diff --git a/On Screen Keyboard/mainform.dfm b/On Screen Keyboard/mainform.dfm
new file mode 100644
index 0000000..a51e1af
Binary files /dev/null and b/On Screen Keyboard/mainform.dfm differ
diff --git a/On Screen Keyboard/mainform.pas b/On Screen Keyboard/mainform.pas
new file mode 100644
index 0000000..7e193dc
--- /dev/null
+++ b/On Screen Keyboard/mainform.pas
@@ -0,0 +1,599 @@
+unit mainform;
+
+
+{NOTE DEVELOP VARIABLE FOR WORKING OUT OUTLINES}
+
+interface
+
+uses
+  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+  ExtCtrls, ImgList, StdCtrls;
+
+type
+  Tmain = class(TForm)
+    focustimer: TTimer;
+    procedure FormCreate(Sender: TObject);
+    procedure cvMouseDown(Sender: TObject; Button: TMouseButton;
+      Shift: TShiftState; X, Y: Integer);
+    procedure FormClose(Sender: TObject; var Action: TCloseAction);
+    procedure cvMouseUp(Sender: TObject; Button: TMouseButton;
+      Shift: TShiftState; X, Y: Integer);
+    procedure cvMouseMove(Sender: TObject; Shift: TShiftState; X,
+      Y: Integer);
+    procedure FormDestroy(Sender: TObject);
+    procedure focustimerTimer(Sender: TObject);
+    procedure FormActivate(Sender: TObject);
+    procedure FormPaint(Sender: TObject);
+  private
+    { Private declarations }
+    function AppHook(var message : Tmessage) : boolean;
+ procedure WMMouseActivate(var Message: TWMMouseActivate); message WM_MOUSEACTIVATE;
+
+
+  public
+    { Public declarations }
+    protected
+
+  end;
+
+type tkey = record
+     lowercase : string;
+     uppercase : string;
+     height : integer;
+     width : single;
+     picture : string;
+     key : string;
+end;
+
+
+type trows = record
+     key : array of tkey;
+     count : integer;
+end;
+
+
+type tscangrid = record
+     tr : trect;
+     keyref : pointer;
+end;
+
+var
+  main: Tmain;
+  rows : array [1..6] of trows;
+  scangrid : array of tscangrid;
+  scangridcount : integer =0;
+  keyheight : integer;
+  keywidth : integer;
+  bu,bd,e1,e2,s1,s2,blank : tbitmap;
+  engageuptracker : integer;
+  ent1,ent2 : tscangrid;
+  shift1,shift2 : tscangrid;
+  caps1 : tscangrid;
+  curcase : boolean;
+  shiftkey : boolean;
+  capskey : boolean;
+  window : hwnd;
+  mshand : thandle;
+  dosmode : boolean = false;
+
+  function drawkey(x,y : integer;pos : byte) : tkey;
+  procedure sendkey(key : string);
+
+
+  const
+  WS_EX_NOACTIVATE = 00000;
+  DEVELOP = FALSE;
+implementation
+
+{$R *.DFM}
+{$R emposkgraphics.res}
+
+
+procedure setoutline;
+var
+rs : tresourcestream;
+sngs : tstringlist;
+n : integer;
+ori : string;
+key : integer;
+pt : array[0..50] of tagPoint;
+rgn : hrgn;
+begin
+ if paramstr(4)<>'d' then if paramstr(4)='' then rs:=tresourcestream.Create(HInstance,'OUTLINE',RT_RCDATA)
+ else rs:=tresourcestream.Create(HInstance,'ALPHAOUTLINE',RT_RCDATA) else
+  begin
+  rs:=tresourcestream.Create(HInstance,'OUTLINE',RT_RCDATA);
+  dosmode:=true;
+  end;
+ sngs:=tstringlist.create;
+ sngs.LoadFromStream(rs);
+
+  n:=0;
+    while (n<sngs.Count) do begin
+      ori:=copy(sngs.Strings[n],1,2);
+      key:=strtoint(copy(sngs.Strings[n],3,2));
+
+
+      if ori='TL' then begin
+        pt[n].x:=scangrid[key].tr.left;
+        pt[n].y:=scangrid[key].tr.top;
+      end;
+
+
+      if ori='TR' then begin
+        pt[n].x:=scangrid[key].tr.right;
+        pt[n].y:=scangrid[key].tr.top;
+      end;
+
+      if ori='BR' then begin
+        pt[n].x:=scangrid[key].tr.right;
+        pt[n].y:=scangrid[key].tr.bottom;
+      end;
+
+      if ori='BL' then begin
+        pt[n].x:=scangrid[key].tr.left;
+        pt[n].y:=scangrid[key].tr.bottom;
+      end;
+
+      inc(n);
+
+    end;
+
+
+
+   rgn:=CreatePolygonRgn(pt,n,WINDING);
+   setwindowrgn(main.handle,rgn,true);
+
+   rs.free;
+   sngs.free;
+
+end;
+
+procedure initmailslot;
+begin
+//MAILSLOT_WAIT_FOREVER
+mshand:=createmailslot('\.\mailslot\LSOSK1',0, 200000,nil);
+if mshand=INVALID_HANDLE_VALUE  then halt;
+
+end;
+
+function readmailslot : string;
+var
+messz : cardinal;
+mescnt,rd : dword;
+res : array [0..255] of char;
+readtimeout : dword;
+begin
+readtimeout:=2000;
+messz:=0;
+getmailslotinfo(mshand,nil,messz,@mescnt,nil);
+sleep(10);
+result:='';
+if (messz<>0) and (mescnt<>0) then begin
+readfile(mshand,res,messz,rd,nil);
+result:=res;
+end;
+end;
+
+
+procedure Tmain.WMMouseActivate(var Message: TWMMouseActivate);
+begin
+
+	Message.result := MA_NOACTIVATE;
+        if window<>0 then setforegroundwindow(window);
+
+
+end;
+
+
+
+function tmain.AppHook(var message : Tmessage) : boolean;
+begin
+if (message.Msg=WM_QUIT) or (message.Msg=WM_CLOSE) then begin
+halt;
+end;
+
+
+result:=false;
+end;
+
+procedure drawlabel(scan : tscangrid;size : integer);
+var
+x,y : integer;
+s : string;
+begin
+     with main do begin
+     canvas.Brush.Style:=bsClear;
+     canvas.font.color:=clwhite;
+     if size=1 then canvas.font.size:=12;
+     if size=2 then canvas.font.size:=10;
+     s:=tkey(scan.keyref^).lowercase;
+     if capskey=true then begin
+        if (ord(s[1])>96) and (ord(s[1])<123) then s:=tkey(scan.keyref^).uppercase;
+     end;
+     if (shiftkey=true) then s:=tkey(scan.keyref^).uppercase;
+     if tkey(scan.keyref^).lowercase[1]='|' then s:='Enter';
+     x:=scan.tr.left+ ((scan.tr.right-scan.tr.left) div 2) - ((canvas.textwidth(s) div 2));
+     y:=scan.tr.Top + ((scan.tr.bottom-scan.tr.top) div 2) - ((canvas.textheight(s) div 2));
+     {relabel shift key}
+     if tkey(scan.keyref^).lowercase[2]='H' then s:='SHIFT';
+     if tkey(scan.keyref^).lowercase[2]='P' then s:=' ';
+     if tkey(scan.keyref^).lowercase='NULL' then s:='';
+     canvas.textout(x,y,s);
+     tkey(scan.keyref^).key:=s;
+     end;
+end;
+
+procedure drawkeys;
+var
+x,lastx,xx,y,lasty : integer;
+tr : trect;
+begin
+
+
+scangridcount:=0;
+setlength(scangrid,0);
+
+
+  with main do begin
+   for y:=1 to 5 do begin
+    lastx:=0;
+    x:=0;
+    lasty:=(y*keyheight)-keyheight;
+    for xx:=1 to rows[y].count do begin
+
+     x:=x+round(keywidth*rows[y].key[xx].width);
+     if rows[y].key[xx].lowercase<>'NUL' then begin
+     //canvas.rectangle(lastx,lasty,x,lasty+(keyheight*rows[y].key[xx].height));
+     tr.left:=lastx;
+     tr.top:=lasty;
+     tr.right:=x;
+     tr.bottom:=lasty+(keyheight*rows[y].key[xx].height);
+     inc(scangridcount);
+     setlength(scangrid,scangridcount+1);
+     scangrid[scangridcount].tr:=tr;
+     scangrid[scangridcount].keyref:=@rows[y].key[xx];
+     //canvas.stretchdraw(tr,bu);
+     if rows[y].key[xx].lowercase='|1' then ent1:=scangrid[scangridcount];
+     if rows[y].key[xx].lowercase='|2' then ent2:=scangrid[scangridcount];
+
+     if rows[y].key[xx].lowercase='SHIFTL' then shift1:=scangrid[scangridcount];
+     if rows[y].key[xx].lowercase='SHIFTR' then begin;
+        shift2:=scangrid[scangridcount];
+     end;
+     if rows[y].key[xx].lowercase='Caps Lock' then caps1:=scangrid[scangridcount];
+
+
+        //if (rows[y].key[xx].lowercase[1]<>'|') then drawlabel(scangrid[scangridcount],1);
+
+
+     end;
+     lastx:=x;
+    end;
+   end;
+ end;
+
+for x := 0 to scangridcount do begin
+drawkey(scangrid[x].tr.Left+1,scangrid[x].tr.top+1,1);
+end;
+
+end;
+
+procedure getkeyinfo;
+var
+k : tkey;
+ln : string;
+rowcount : integer;
+n : integer;
+sngs : tstringlist;
+rs : tresourcestream;
+x : integer;
+
+  function getparam : string;
+  var
+  p : integer;
+  begin
+  p:=pos(',',ln);
+  if p<>0 then begin
+     result:=copy(ln,1,p-1);
+     ln:=copy(ln,p+1,length(ln)-p);
+  end else begin
+  result:=ln;
+  ln:='';
+  end;
+
+  end;
+
+  function getline : tkey;
+  begin
+       result.lowercase:=getparam;
+       if result.lowercase='COMMA' then result.lowercase:=',';
+       if result.lowercase='APOST' then result.lowercase:='''';
+       result.uppercase:=getparam;
+       if result.uppercase='QUOTE' then result.uppercase:='"';
+       result.width:=strtofloat(getparam);
+       result.height:=strtoint(getparam);
+       result.picture:=getparam;
+  end;
+
+begin
+ window:=getforegroundwindow;
+ if paramstr(4)='' then rs:=tresourcestream.Create(HInstance,'LAYOUT',RT_RCDATA) else rs:=tresourcestream.Create(HInstance,'ALPHA',RT_RCDATA);
+ sngs:=tstringlist.create;
+ sngs.LoadFromStream(rs);
+
+  rowcount:=1;
+  x:=0;
+    while (x<sngs.Count) do begin
+      ln:=sngs.Strings[x];
+      inc(x);
+      k:=getline;
+
+      inc(rows[rowcount].count);
+      setlength(rows[rowcount].key,rows[rowcount].count+1);
+      rows[rowcount].key[rows[rowcount].count]:=k;
+
+      if k.lowercase='ROW' then begin
+         dec(rows[rowcount].count);
+         setlength(rows[rowcount].key,rows[rowcount].count+1);
+         inc(rowcount);
+      end;
+
+    end;
+
+    for n:=0 to (rows[1].count) do begin
+        keywidth:=round(keywidth+rows[1].key[n].width);
+    end;
+    keywidth:=round(main.width / keywidth);
+    keyheight:=main.height div 5;
+
+end;
+
+procedure Tmain.FormCreate(Sender: TObject);
+var
+a,scrap : integer;
+begin
+initmailslot;
+
+
+application.HookMainWindow(AppHook);
+bu := tbitmap.create;
+bu.LoadFromResourceName(HInstance,'KU');
+bd := tbitmap.create;
+bd.LoadFromResourceName(HInstance,'KD');
+e1 := tbitmap.create;
+e1.LoadFromResourceName(HInstance,'E2U');
+e2 := tbitmap.create;
+e2.LoadFromResourceName(HInstance,'E2D');
+s1 := tbitmap.create;
+s1.LoadFromResourceName(HInstance,'SPACEUP');
+s2 := tbitmap.create;
+s2.LoadFromResourceName(HInstance,'SPACEDOWN');
+blank := tbitmap.create;
+blank.LoadFromResourceName(HInstance,'BLANK');
+
+val(paramstr(1),a,scrap);
+if a=0 then a:=screen.Height div 2;
+
+Main.height:=a;
+top:=screen.height-main.height;
+main.left:=0;
+val(paramstr(2),a,scrap);
+if a=0 then main.width:=screen.width else main.width:=screen.width-a;
+main.left:=(screen.width div 2)-(main.width div 2);
+
+val(paramstr(3),a,scrap);
+if a<>0 then main.top:=main.top-a;
+
+
+getkeyinfo;
+main.doublebuffered:=true;
+
+
+end;
+
+function iskey (key : tscangrid;x,y : integer) : boolean;
+begin
+result:=false;
+if (x>=key.tr.left) and
+   (x<=key.tr.right) and
+   (y>=key.tr.top) and
+   (y<=key.tr.bottom) then begin
+                      result:=true;
+   end;
+end;
+
+function drawkey(x,y : integer;pos : byte) : tkey;
+var
+n : integer;
+keymap : tbitmap;
+p:boolean;
+begin
+keymap:=tbitmap.create;
+
+for n:=1 to scangridcount do begin
+if iskey(scangrid[n],x,y) then  begin
+                      if pos=0 then begin
+                                   keymap.assign(bd);
+                                   if (tkey(scangrid[n].keyref^).lowercase[1]='|') then begin
+                                    main.canvas.stretchdraw(ent1.tr,e2);
+                                    main.canvas.stretchdraw(ent2.tr,e2);
+                                   if (tkey(scangrid[n].keyref^).lowercase[2]='2')   then drawlabel(ent2,1);
+                                    engageuptracker:=n;
+                                    break;
+                                   end;
+                                   if (tkey(scangrid[n].keyref^).lowercase='NULL') then keymap.assign(BLANK);
+                                   if (tkey(scangrid[n].keyref^).lowercase='SPACE') then begin
+                                      keymap.assign(s2);
+                                      end;
+                                   if (tkey(scangrid[n].keyref^).lowercase='SHIFTL') or  (tkey(scangrid[n].keyref^).lowercase='SPACER') then begin
+                                      if shiftkey=true then keymap.assign(s1) else keymap.assign(s2);
+                                   end;
+                                   if (tkey(scangrid[n].keyref^).lowercase='Backspace') then keymap.assign(s2);
+                                   if (tkey(scangrid[n].keyref^).lowercase='Caps Lock') then begin
+                                      if capskey=true then keymap.assign(s1) else keymap.assign(s2);
+                                   end;
+                                   main.canvas.stretchdraw(scangrid[n].tr,keymap);
+                                   drawlabel(scangrid[n],2);
+                                   engageuptracker:=n;
+                                   end;
+
+                     if pos=1 then begin
+                                   keymap.assign(bu);
+                                   if (tkey(scangrid[n].keyref^).lowercase[1]='|')  then begin
+                                    main.canvas.stretchdraw(ent1.tr,e1);
+                                    main.canvas.stretchdraw(ent2.tr,e1);
+                                    if (tkey(scangrid[n].keyref^).lowercase[2]='2')   then drawlabel(ent2,1);
+                                    engageuptracker:=n;
+                                    break;
+                                   end;
+                                   if (tkey(scangrid[n].keyref^).lowercase='NULL') then keymap.assign(BLANK);
+                                   if (tkey(scangrid[n].keyref^).lowercase='SPACE') then keymap.assign(s1);
+                                   if (tkey(scangrid[n].keyref^).lowercase='SHIFTL') or (tkey(scangrid[n].keyref^).lowercase='SHIFTR')then begin
+                                      if shiftkey=true then keymap.assign(s2) else keymap.assign(s1);
+                                   end;
+                                   if (tkey(scangrid[n].keyref^).lowercase='Backspace') then keymap.assign(s1);
+                                   if (tkey(scangrid[n].keyref^).lowercase='Caps Lock') then begin
+                                      if capskey=true then keymap.assign(s2) else keymap.assign(s1);
+                                   end;
+                                   if (tkey(scangrid[n].keyref^).lowercase<>'NULL') then main.canvas.stretchdraw(scangrid[n].tr,keymap);
+                                   drawlabel(scangrid[n],1);
+                                   engageuptracker:=-1;
+                                   end;
+
+                     break;
+   end;
+end;
+keymap.free;
+result:=tkey(scangrid[n].keyref^);
+end;
+
+procedure Tmain.cvMouseDown(Sender: TObject; Button: TMouseButton;
+  Shift: TShiftState; X, Y: Integer);
+Var
+k : tkey;
+n : integer;
+begin
+
+if DEVELOP=true then begin
+
+for n:=0 to scangridcount do begin
+if iskey(scangrid[n],x,y) then
+ begin
+   messagedlg('Key no: '+inttostr(n)+' - '+inttostr(scangrid[n].tr.Top)+':'+inttostr(scangrid[n].tr.Left)+':'+inttostr(scangrid[n].tr.Right)+':'+inttostr(scangrid[n].tr.Bottom)+':' ,mtconfirmation,[mbOk],0);
+   break;
+ end;
+end;
+
+end;
+
+if iskey(shift1,x,y) or iskey(shift2,x,y) then begin
+   if shiftkey=true then shiftkey:=false else shiftkey:=true;
+   curcase:=shiftkey;
+   drawkeys;
+   exit;
+end;
+if iskey(caps1,x,y)  then begin
+   if capskey=true then capskey:=false else capskey:=true;
+   keybd_event(VK_CAPITAL,0,0,0);
+   keybd_event(VK_CAPITAL,0,KEYEVENTF_KEYUP,0);
+   curcase:=capskey;
+   shiftkey:=false;
+   drawkeys;
+   exit;
+end;
+k:=drawkey(x,y,0);
+
+
+
+sendkey(k.key);
+if shiftkey=true then begin;curcase:=false;shiftkey:=false;drawkeys;end;
+
+end;
+
+procedure Tmain.FormClose(Sender: TObject; var Action: TCloseAction);
+begin
+bu.free;
+end;
+
+procedure Tmain.cvMouseUp(Sender: TObject; Button: TMouseButton;
+  Shift: TShiftState; X, Y: Integer);
+var
+k : tkey;
+begin
+
+drawkey(x,y,1);
+
+end;
+
+procedure Tmain.cvMouseMove(Sender: TObject; Shift: TShiftState; X,
+  Y: Integer);
+begin
+if engageuptracker<>-1 then begin
+   if (x<=scangrid[engageuptracker].tr.left) or
+      (x>=scangrid[engageuptracker].tr.right) or
+      (y<=scangrid[engageuptracker].tr.top) or
+      (y>=scangrid[engageuptracker].tr.bottom) then begin
+      drawkeys;
+      engageuptracker:=-1;
+      end;
+end;
+end;
+
+procedure Tmain.FormDestroy(Sender: TObject);
+begin
+Application.UnHookMainWindow(AppHook);
+end;
+
+
+
+procedure sendkey(key : string);
+var
+c : shortint;
+begin
+if length(key)=1 then c:=vkkeyscan(key[1]) else begin
+if uppercase(key)='SPACE' then c:=vkkeyscan(key[1]);
+if uppercase(key)='ENTER' then c:=vk_Return;
+if uppercase(key)='TAB' then c:=vk_Tab;
+if uppercase(key)='BACKSPACE' then c:=vk_back;
+end;
+
+
+if shiftkey=true then keybd_event(VK_SHIFT,0,0,0);
+keybd_event(c,0,0,0);
+keybd_event(c,0,KEYEVENTF_KEYUP,0);
+if shiftkey=true then keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
+
+
+
+end;
+
+procedure Tmain.focustimerTimer(Sender: TObject);
+var
+w : hwnd;
+begin
+w:=getforegroundwindow;
+if (w<>application.Handle) and (w<>main.handle) then window:=w;
+
+end;
+
+procedure Tmain.FormActivate(Sender: TObject);
+begin
+setforegroundwindow(window);
+drawkeys;
+setoutline;
+while(readmailslot='') do begin
+application.ProcessMessages;
+end;
+application.terminate;
+
+
+
+end;
+
+procedure Tmain.FormPaint(Sender: TObject);
+begin
+drawkeys;
+end;
+
+end.
diff --git a/On Screen Keyboard/makeres.bat b/On Screen Keyboard/makeres.bat
new file mode 100644
index 0000000..22e4fd2
--- /dev/null
+++ b/On Screen Keyboard/makeres.bat
@@ -0,0 +1,2 @@
+brcc32 emposkgraphics.rc
+pause
diff --git a/On Screen Keyboard/outline.csv b/On Screen Keyboard/outline.csv
new file mode 100644
index 0000000..80369f0
--- /dev/null
+++ b/On Screen Keyboard/outline.csv
@@ -0,0 +1,12 @@
+TL16
+BL02
+TL02
+TR14
+BR14
+TR30
+BR56
+TR58
+BR58
+BL58
+TL58
+BL44