Skip to content

Commit

Permalink
Improve file association
Browse files Browse the repository at this point in the history
  • Loading branch information
ollydev committed Dec 24, 2023
1 parent e88b670 commit 6ce8c84
Show file tree
Hide file tree
Showing 5 changed files with 513 additions and 82 deletions.
113 changes: 77 additions & 36 deletions Source/forms/simba.main.lfm
Original file line number Diff line number Diff line change
Expand Up @@ -38,43 +38,84 @@ object SimbaForm: TSimbaForm
object TrayIcon: TTrayIcon
PopUpMenu = TrayPopup
Icon.Data = {
7E04000000000100010010100000010020006804000016000000280000001000
0000200000000100200000000000000400006400000064000000000000000000
0000071792F908188CF1041383EE06117EEF071082F0030D84F00C1792F10C1A
97F1041E96F2010794FC2C3188CC113EA019757592007675910073718D006C6A
8900000C9AFF061891FF061881FF020D80FF04067DFF080A7BFF0C1189FF0F19
96FF041198FF0F1E88FF5D65854C747B930072748B0076768C007F8BA500A2AD
BA00000D94FF071796FF061494FF00108FFF090D85FF0F087CFF090F83FF091C
92FF000C8BFF2C3775D587848407867E83007D7C8900657FA800869BB500C2D2
D500051891FA081597FF050E9FFF051799FF0B1994FF0A118BFF071381FF0618
79FF000664FF403864CFA0878C059B868B005878A800527BB9008A99AD00B9C7
CC00071A93FA081697FF07129BFF051293FF031C94FF031B8AFF010F6FFF060E
5EFF000651FF37355BE5E0CBC11D9AA1AE003F71AC005A7AB1008A99AC00B9C7
CD0001108FFB051296FF07119CFF040E95FF021B85FF133384FF0A1B6BFF040E
54FF080B54FF110E4AFF6F6E7F826C859A004E79AE32587AB3348F99A91BC8CF
CC00000085FE060A8AFF0914A2FF01149AFF091C74FF0F2362FF162E7DFF1126
7EFF111F70FF0B2162FF0A3266E63369A1D64788CFFB4785E1FD5487D8EE96B1
C8950E2DA7FF0F2B8DFF000A8BFF000D92FF0D2281FF0E4699FF0947A1FF0755
B7FF034FB3FF0855ABFF267AC7FF3B89DEFF4A9EFAFF3A8EF8FF0976FAFF508A
CFC9183DAEFF2665ABFF00157FFF060F95FF050880FF0E50BCFF1273D9FF006D
CDFF006ACEFF0661CCFF3286EBFF3E7FD7FF1E5BB1FB3F8CE9E94791ECFFB7C4
CB51000092FF1F3CAFFF1E3CA3FF030E91FF0A0989FF0A269AFF0E71D8FF076A
CBFF0E6CC1FF1470BFFF3582E6FF4B90EFFF1F48A6FF59679293A8B8C719C7CA
CB00091090FF040893FF0F1899FF0C1693FF050F92FF052AA2FF076FD2FF0467
C8FF076ED1FF0D6DC6FF3688F1FF4592FBFF499AFCFF348BDFFC6392C2547892
B300091494FF0A0E8BFF0C0A8BFF0A1D9DFF020F8FFF082192FF1168BEFF1D86
D4FF2883E4FF145EC7FF1672D6FF2580E8FF2C89E7FF2280F0FF5883C7B87C93
AC00021392FF01129BFF0B138EFF061985FF0C1791FF110F8FFF1C4E92FF1174
AFFF0F49A9FF041F94FF1E71C2F11A6EC4D3165AB7FF333B93FF7F6E90689091
A50045508681151A94EE0013A0FF060E7FFF0F1481FF031886FF001894FF1832
95FF5B5885C84E74B37D5980B7274A81C70058618E37987A8436A78491009B78
8C0062628900452C72291E1B85C7011496FF0A168CFF0A1C8CFF000086FF5338
8385E3DBC801769FC9005176AE00417EC800676C9200A58A8E00A1859400987A
8F00585B8B004029720035227604464988673D2F7994331D7B7E1F1F6C325E47
7900D1CCC5006B95C4005178B100427EC800616A93009E858D00A1849400987B
9000000000000000000000000000000000000000000000000000000000000000
9E09000000000100010018180000010020008809000016000000280000001800
000030000000010020000000000000090000232E0000232E0000000000000000
00001E1E75DC1E1D72DC1C1966DC1B165ADC1C175CDC1C175CDC1C175CDC1C17
5BDC1B165ADC1E1E75DC1F1F79DC1F1F79DC1F1F79DC1F1F79DC1F1F77DD1F1F
76D71F1C63461F1D6E0021173B00000000000000000000000000000000000000
00001F1F79FF1E1E75FF1E1C71FF1C1863FF1B165BFF1C175CFF1C175CFF1C17
5CFF1A1557FF1D1C6FFF1F1F7AFF1F1F79FF1F1F79FF1F1F79FF1F1E73FF1F1E
6FB8201A5410201B5A0000000000000000000000000000000000000000000000
00001F1F79FF1F1E77FF1E1D74FF1D1C6EFF1B1861FF1B1659FF1C175CFF1C17
5CFF1B165AFF1D1A6AFF1F1F7AFF1F1F79FF1F1F79FF1F1F79FF1F1D6EF91F1B
5F541F1D690021142A0000000000000000000000000000000000000000000000
00001F1F79FF1F1F79FF1F1E77FF1E1D72FF1D1B6BFF1A175EFF1B1659FF1C17
5BFF1C175BFF1C1965FF1F1F79FF1F1F79FF1F1F79FF1F1F78FF1F1C62E62017
4026201843000000000000000000000000000000000000000000000000000000
00001F1F79FF1F1F79FF1F1F79FF1F1F79FF1F1F78FF1E1E75FF1D1C6EFF1C19
65FF1C175DFF1B175EFF1F1E77FF1F1F77FF1E1F6CFF1D1F61FF1E1C52D22116
381421173B000000000000000000000000000000000000000000000000000000
00001F1F79FF1F1F79FF1F1F79FF1F1F79FF1F1F79FF1F1F79FF1F1F7AFF1F1F
79FF1E1D72FF1B175EFF1D1B6CFF1E1F67FF1C1D57FF1D1F59FF1D1D54C72017
3F0D201840000000000000000000000000000000000000000000000000000000
00001F1F79FF1F1F79FF1F1F79FF1F1F79FF1F1F79FF1F1F79FF1F1F78FF1E20
6EFF1E1F67FF1C1D5CFF1A1853FF1C1E58FF1C1D57FF1D1E58FF1D1D54D11F19
46141F1A47000000000000000000000000000000000000000000000000000000
00001E1D74FF1F1F78FF1F1F79FF1F1F79FF1F1F79FF1F1F79FF1E1F6DFF1F2D
6AFF1E2763FF1D1F59FF1C1C55FF1B1A52FF1C1E57FF1C1D56FF1E1D52EC2019
43321F1944000000000000000000000000000000000000000000000000000000
00001E1D74FF1E1E75FF1F1F79FF1F1F79FF1F1F79FF1F1F79FF1E1F6BFF2231
6EFF223E7FFF1F306EFF1D225DFF1C1D57FF1C1C55FF1C1C55FF1C1B53FF1C19
4C7F2E315C133B43735C536393846B80AF64687AA845545E891F2A264A054140
6E001E1C70FF1E1D73FF1F1E77FF1F1F79FF1F1F79FF1F1F79FF1E1F73FF232B
6BFF233E7FFF224284FF213B7BFF1F306EFF1E2864FF1D2560FF222964FF323D
74EC485D93D05B72A7F8708BBEFF7E9ACBFE819CCCF77C95C5DF7389B8A45862
91331E1D73FF1E1D72FF1E1D74FF1F1F79FF1F1F79FF1F1F79FF1F237CFF212B
73FF273A7AFF224589FF22498EFF22498EFF22478BFF214589FF2D4F91FF5572
AAFF6582B8FF7996C9FF83A0D0FF84A1D1FF84A1D1FF85A2D2FF829FCFFF5D6D
9EB1202880FF243A89FF202277FF1F1E77FF1F1F79FF1F1E77FF1F2178FF223D
8AFF27458AFF25549DFF265AA6FF265BA7FF265BA6FF2559A4FF2C5CA5FF6788
BFFF7F9BCCFF85A2D2FF85A2D2FF84A1D1FF84A1D1FF84A1D1FF83A0D0FF647A
ADB4233B90FF2B59A3FF293780FF1F1F77FF1F1F79FF1F1F79FF1E1D74FF2132
85FF285FADFF2966B4FF2A69B8FF2A6AB8FF2A69B8FF2A69B8FF2C69B6FF678D
C5FF809CCDFF7A95C4FF7893C1FF84A2D2FF84A1D1FF84A1D1FF829ECEFA6A7D
AB7320247DFF254899FF2B559EFF222A7DFF1F1E79FF1F1F79FF1F1F78FF1F20
79FF264CA0FF2B6DBCFF2B6CBBFF2B6CBBFF2B6CBBFF2B6CBBFF2C6CBBFF638C
C7FF819ECEFF7994C2FF48577DF96A82AEC383A0D1D784A1D2EE7D97C7B35865
90171F1E79FF20247DFF25489AFF23418FFF1F1E77FF1F1F79FF1F1F79FF1F1E
78FF23378DFF2B6BBAFF2B6CBBFF2B6CBBFF2B6CBBFF2B6CBBFF2C6BB9FF648C
C6FF839FCFFF84A1D2FF758FBCFB6980ABA36D86B45F7591C346748DBF1995BF
F8001F1F78FF1F1E77FF20237CFF202E80FF1E1E74FF1F1F79FF1F1F79FF1F1E
78FF23378EFF2B6BBAFF2B6CBBFF2B6CBBFF2B6BBAFF2B6BBAFF2D6DBBFF688F
C8FF819ECEFF83A0D0FF85A2D2FF84A1D1FF819ECDF57E9ACAAA6A83AF0B6C84
B0001E1E75FF1E1D74FF1F1E76FF1F1E77FF1E1E76FF1F1F79FF1F1F79FF1F1E
78FF23378EFF2B6BBAFF2A6CBBFF2D6CBBFF2C6BBAFF296AB9FF296AB9FF5885
C4FF819ECFFF83A0D0FF84A1D1FF84A1D1FF85A2D2FF7F9BCAE05E739D1F5C71
9B001F1F78FF1F1E76FF1E1D73FF1E1D74FF1F1F79FF1F1F79FF1F1F79FF1F1E
78FF22338AFF2E69B7FF5A81C2FF83A1D4FF6EA2D7FF4C86C7FF3B73BCFF3973
BDFF7295CAFF819ECEFF829FCFFF819ECDFF7F9BCAFF7189B7D33E4B70153D4A
6F001F1F78FF1F1F79FF1F1F78FF1E1D72FF1E1D73FF1F1F79FF1F1F79FF1F1E
78FF202981FF2A59A6FF425898FF4687B6FF39B2D5FF3D85B2FF4062A2FF2C6C
BBFF3872BCFF436DB0FF49619EFF4A528AFF414477FF3F3D74B9302860072F2A
5E001F1E76FF1F1F79FF1F1F79FF1F1F77FF1E1C70FF1E1D71FF1F1F79FF1F1F
79FF1F2078FF244494FF2C5299FF2D4B89FF294580FF2B4A8DFF2B65B3FF2A67
B6E82965B4CD295CA7DF314A8EE5344182D9373475CC392F6F7A3C2D6E013A2F
70001E1E76B21F1F78F11F1F79FF1F1F79FF1F1E76FF1E1C70FF1E1C6FFF1F1E
75FF1F1E76FF1F2175FF213184FF223382FE24377CD52A56A1B12963B4962859
AA3A2B549F102E549B1E334B8E25334D8F19334A8C0E39357504373C7D00382A
6E001C1A6C0E1F1E785D1F1F79B61F1F79EA1F1F79FB1F1F79FF1E1E74FF1E1D
72FF1E1D72FF1E1E75FF1F1E78FF1E1D75C31D1B702616238703140542011709
5400000000000000000000000000000000000000000000000000000000000000
00001E1F7A031F1F792B1F1F79691F1F799F1F1F79D71F1F79FF1F1F78FF1F1E
76FF1E1E74FF1F1E76FC1E1E75BC1D1B6C291F1E770018114700000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000
00001F1F79001F1F79001F1F790D1F1F792E1F1F79631F1E76901E1D719C1D1A
69B61D1965A51D1C6E6D1D1B6C1C1F1F78001810470000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000007F0000007F000000FF000000FF000000FF000000FF000000FF000000
FF00000001000000000000000000000000000000000000000000000001000000
010000000100000001000000010000000100000003000001FF00000FFF00C01F
FF00
}
Visible = True
OnClick = TrayIconClick
Expand Down
10 changes: 7 additions & 3 deletions Source/script/simba.script.pas
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ TSimbaScript = class(TObject)
function DoCompilerPreprocessorFunc(Sender: TLapeCompiler; Name, Argument: lpString; out Value: lpString): Boolean;
function DoCompilerMacro(Sender: TLapeCompiler; Name, Argument: lpString; out Value: lpString): Boolean;
procedure DoCompilerHint(Sender: TLapeCompilerBase; Hint: lpString);
function DoCompilerFindFile(Sender: TLapeCompiler; FileName: lpString): String;
procedure DoCompilerFindFile(Sender: TLapeCompiler; var FileName: lpString);
function DoCompilerHandleDirective(Sender: TLapeCompiler; Directive, Argument: lpString; InPeek, InIgnore: Boolean): Boolean;
function GetState: ESimbaScriptState;

Expand Down Expand Up @@ -114,9 +114,13 @@ procedure TSimbaScript.DoCompilerHint(Sender: TLapeCompilerBase; Hint: lpString)
SimbaDebugLn([EDebugLn.YELLOW], Hint);
end;

function TSimbaScript.DoCompilerFindFile(Sender: TLapeCompiler; FileName: lpString): String;
procedure TSimbaScript.DoCompilerFindFile(Sender: TLapeCompiler; var FileName: lpString);
var
IncludeFile: lpString;
begin
Result := SimbaEnv.FindInclude(FileName, [TSimbaPath.PathExtractDir(Sender.Tokenizer.FileName)]);
IncludeFile := SimbaEnv.FindInclude(FileName, [TSimbaPath.PathExtractDir(Sender.Tokenizer.FileName)]);
if (IncludeFile <> '') then
FileName := IncludeFile;
end;

function TSimbaScript.DoCompilerHandleDirective(Sender: TLapeCompiler; Directive, Argument: lpString; InPeek, InIgnore: Boolean): Boolean;
Expand Down
82 changes: 40 additions & 42 deletions Source/simba.associate.pas
Original file line number Diff line number Diff line change
Expand Up @@ -10,59 +10,57 @@
interface

uses
classes, sysutils;
Classes, SysUtils, Forms;

procedure Associate;

implementation

{$IFDEF WINDOWS}
uses
forms, registry, windows, shellapi;
FileAssoc;

procedure Associate;
var
Info: TShellExecuteInfo;
assoc: TFileAssociation;
begin
if not Application.HasOption('associate') then
begin
Info := Default(TShellExecuteInfo);
Info.cbSize := SizeOf(TShellExecuteInfo);
Info.Wnd := Application.MainFormHandle;
Info.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI or SEE_MASK_NO_CONSOLE;
Info.lpVerb := 'runas';
Info.lpFile := PAnsiChar(Application.ExeName);
Info.lpParameters := PAnsiChar('--associate');
Info.nShow := SW_HIDE;

ShellExecuteExA(@Info);
end else
begin
with TRegistry.Create() do
try
RootKey := HKEY_CLASSES_ROOT;
OpenKey('.simba', True);
WriteString('', 'simbafile');
CloseKey();
CreateKey('simbafile');
OpenKey('simbafile\DefaultIcon', True);
WriteString('', ParamStr(0) + ',0');
CloseKey();
OpenKey('simbafile\shell\Open\command', True);
WriteString('', ParamStr(0) + ' "%1"');
CloseKey();
OpenKey('simbafile\shell\Run\command', True);
WriteString('', ParamStr(0) + ' --open --run "%1"');
CloseKey();
OpenKey('simbafile\shell\Run (Headless)\command', True);
WriteString('', ParamStr(0) + ' --run "%1"');
CloseKey();
finally
Free();
end;

SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
end;
assoc := TFileAssociation.Create(nil);
assoc.ApplicationName := 'Simba';

// Requires admin
assoc.RegisterForAllUsers := False;

assoc.Extension := '.simba';
assoc.ExtensionName := 'Simba';
assoc.ExtensionIcon := '"' + Application.ExeName + '",0';

assoc.WriteFileAssociationClass();
assoc.WriteFileAssociation();
assoc.WriteDefaultPrograms();
assoc.WriteDefaultProgramsAddExt();

assoc.ActionName := 'Open';
assoc.ActionText := 'Open';
assoc.ActionIcon := '"' + Application.ExeName + '",0';
assoc.Action := '"' + Application.ExeName + '" --open "%1"';

assoc.WriteFileAssociationClassCommand();

assoc.ActionName := 'Open and Run';
assoc.ActionText := 'Open and Run';
assoc.ActionIcon := '"' + Application.ExeName + '",0';
assoc.Action := '"' + Application.ExeName + '" --open --run "%1"';

assoc.WriteFileAssociationClassCommand();

assoc.ActionName := 'Run';
assoc.ActionText := 'Run';
assoc.ActionIcon := '"' + Application.ExeName + '",0';
assoc.Action := '"' + Application.ExeName + '" --run "%1"';

assoc.WriteFileAssociationClassCommand();

assoc.ClearIconCache();
end;
{$ELSE}
procedure Associate;
Expand Down
Loading

0 comments on commit 6ce8c84

Please sign in to comment.