mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-21 09:58:13 +00:00
256 lines
6.7 KiB
ObjectPascal
256 lines
6.7 KiB
ObjectPascal
program doublecmd;
|
|
|
|
{$IF DEFINED(LCLGTK3)}
|
|
{$FATAL LCLGTK3 is not production ready}
|
|
{$ENDIF}
|
|
|
|
uses
|
|
{$IFDEF MSWINDOWS}
|
|
uElevation,
|
|
{$IFDEF LCLQT5}
|
|
uDarkStyle,
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
{$IFDEF UNIX}
|
|
{$IFNDEF HEAPTRC}
|
|
cmem,
|
|
{$ENDIF}
|
|
cthreads,
|
|
{$IFDEF DARWIN}
|
|
iosxwstr,
|
|
iosxlocale,
|
|
{$ELSE}
|
|
cwstring,
|
|
clocale,
|
|
{$ENDIF}
|
|
{$IFDEF darwin}
|
|
uAppleMagnifiedModeFix,
|
|
uMyDarwin,
|
|
{$ENDIF}
|
|
uElevation,
|
|
{$IFDEF LINUX}
|
|
uAppImage,
|
|
{$ENDIF}
|
|
{$IFDEF LCLGTK2}
|
|
uOverlayScrollBarFix,
|
|
gtk2,
|
|
Gtk2Int,
|
|
{$ENDIF}
|
|
{$IF DEFINED(LCLQT5) and not DEFINED(DARWIN)}
|
|
uQt5Workaround,
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
uSystem,
|
|
uMoveConfig,
|
|
uEarlyConfig,
|
|
DCConvertEncoding,
|
|
{$IF DEFINED(LCLWIN32) and DEFINED(DARKWIN)}
|
|
uWin32WidgetSetDark,
|
|
{$ENDIF}
|
|
Interfaces,
|
|
{$IFDEF LCLGTK2}
|
|
uGtk2FixCursorPos,
|
|
{$ENDIF}
|
|
{$IFDEF LCLWIN32}
|
|
uDClass,
|
|
{$IF NOT DEFINED(DARKWIN)}
|
|
uWin32WidgetSetFix,
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
LCLProc,
|
|
Classes,
|
|
SysUtils,
|
|
Forms,
|
|
LCLVersion,
|
|
Math,
|
|
{$IF DEFINED(NIGHTLY_BUILD)}
|
|
un_lineinfo,
|
|
{$ENDIF}
|
|
uGlobsPaths,
|
|
uGlobs,
|
|
fHackForm,
|
|
fMain,
|
|
uAccentsUtils,
|
|
dmHigh, dmHelpManager, dmCommonData,
|
|
uShowMsg,
|
|
uCryptProc,
|
|
uPixMapManager,
|
|
uKeyboard,
|
|
uUniqueInstance,
|
|
uDCVersion,
|
|
uCmdLineParams,
|
|
uDebug,
|
|
uOSUtils,
|
|
uspecialdir,
|
|
fstartingsplash,
|
|
ulog,
|
|
uVariableMenuSupport,
|
|
uLng
|
|
{$IFDEF MSWINDOWS}
|
|
, uMyWindows
|
|
{$ENDIF}
|
|
{$IFDEF UNIX}
|
|
, uMyUnix
|
|
{$ENDIF}
|
|
;
|
|
|
|
{$R *.res}
|
|
|
|
{$IF DEFINED(MSWINDOWS)}
|
|
{$SETPEOPTFLAGS $140}
|
|
{$R doublecmd.manifest.rc}
|
|
{$ENDIF}
|
|
|
|
{$IFDEF HEAPTRC}
|
|
var
|
|
LogPath: String;
|
|
{$ENDIF}
|
|
|
|
begin
|
|
// Initialize again
|
|
uSystem.Initialize;
|
|
|
|
DCDebug('Starting Double Commander');
|
|
|
|
// Initialize random number generator
|
|
Randomize;
|
|
|
|
{$IF DEFINED(NIGHTLY_BUILD)}
|
|
InitLineInfo;
|
|
AddLineInfoPath(ExtractFileDir(ParamStr(0)));
|
|
{$ENDIF}
|
|
|
|
{$IFDEF HEAPTRC}
|
|
LogPath := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + 'logs';
|
|
CreateDir(LogPath);
|
|
SetHeapTraceOutput(LogPath + '/heaptrc-' + FormatDateTime('yyyy-mm-dd hh.mm.ss', Now) + '.log');
|
|
{$ENDIF}
|
|
|
|
{$IFDEF MSWINDOWS}
|
|
uMyWindows.FixCommandLineToUTF8;
|
|
{$ENDIF}
|
|
|
|
Application.Scaled:= True;
|
|
|
|
// Fix default BidiMode
|
|
// see http://bugs.freepascal.org/view.php?id=22044
|
|
Application.BidiMode:= bdLeftToRight;
|
|
|
|
Application.Title:='Double Commander';
|
|
Application.Initialize;
|
|
|
|
{$IF DEFINED(DARWIN)}
|
|
GetMacFormatSettings(DefaultFormatSettings);
|
|
Application.Icon:= nil;
|
|
{$ENDIF}
|
|
|
|
uDCVersion.InitializeVersionInfo;
|
|
// Initializing keyboard module on GTK needs GTKProc.InitKeyboardTables
|
|
// which is called by Application.Initialize.
|
|
uKeyboard.InitializeKeyboard;
|
|
|
|
{$IF DEFINED(MSWINDOWS) and (DEFINED(LCLQT5) or DEFINED(DARKWIN))}
|
|
ApplyDarkStyle;
|
|
{$ENDIF}
|
|
|
|
{$IF DEFINED(darwin)}
|
|
FixMacFormatSettings;
|
|
setMacOSAppearance( gAppMode );
|
|
{$ENDIF}
|
|
|
|
// Use only current directory separator
|
|
AllowDirectorySeparators:= [DirectorySeparator];
|
|
// Disable because we set a few of our own format settings and we don't want
|
|
// them to be changed. There's no way currently to react to Application.IntfSettingsChange.
|
|
// If in future we move to a Unicode RTL this could be removed.
|
|
{$PUSH}{$WARN SYMBOL_PLATFORM OFF}
|
|
Application.UpdateFormatSettings := False;
|
|
{$POP}
|
|
if Ord(DefaultFormatSettings.ThousandSeparator) > $7F then
|
|
begin
|
|
DefaultFormatSettings.ThousandSeparator:= ' ';
|
|
end;
|
|
{$IFDEF UNIX}
|
|
uMyUnix.FixDateTimeSeparators;
|
|
{$ENDIF}
|
|
FixDateNamesToUTF8;
|
|
|
|
DCDebug('Double Commander ' + dcVersion);
|
|
DCDebug('Revision: ' + dcRevision);
|
|
DCDebug('Commit: ' + dcCommit);
|
|
DCDebug('Build: ' + dcBuildDate);
|
|
DCDebug('Lazarus: ' + lazVersion);
|
|
DCDebug('Free Pascal: ' + fpcVersion);
|
|
DCDebug('Platform: ' + TargetCPU + '-' + TargetOS + '-' + TargetWS);
|
|
DCDebug('System: ' + OSVersion);
|
|
{$IF DEFINED(UNIX) AND NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
|
|
DCDebug('Desktop Environment: ' + DesktopName[DesktopEnv]);
|
|
{$ENDIF}
|
|
if WSVersion <> EmptyStr then
|
|
DCDebug('Widgetset library: ' + WSVersion);
|
|
DCDebug('This program is free software released under terms of GNU GPL 2');
|
|
DCDebug(Copyright + LineEnding + ' and contributors (see about dialog)');
|
|
|
|
Application.ShowMainForm:= False;
|
|
Application.CreateForm(TfrmHackForm, frmHackForm);
|
|
|
|
ProcessCommandLineParams; // before load paths
|
|
|
|
if (gSplashForm) and (not CommandLineParams.NoSplash) then
|
|
begin
|
|
// Let's show the starting slash screen to confirm user application has been started
|
|
Application.CreateForm(TfrmStartingSplash, frmStartingSplash);
|
|
end;
|
|
|
|
LoadInMemoryOurAccentLookupTableList; // Used for conversion of string to remove accents.
|
|
LoadPaths; // before loading config
|
|
LoadWindowsSpecialDir; // Load the list with special path. *Must* be located AFTER "LoadPaths" and BEFORE "InitGlobs"
|
|
|
|
if InitGlobs then
|
|
//-- NOTE: before, only IsInstanceAllowed was called, and all the magic on creation
|
|
// new instance or sending params to the existing server happened inside
|
|
// IsInstanceAllowed() function as a side effect.
|
|
// Functions with side effects are generally bad, so,
|
|
// new function was added to explicitly initialize instance.
|
|
InitInstance;
|
|
if IsInstanceAllowed then
|
|
begin
|
|
if (log_start_shutdown in gLogOptions) then logWrite(rsMsgLogProgramStart + ' (' + GetCurrentUserName + '/' + GetComputerNetName + ')');
|
|
|
|
InitPasswordStore;
|
|
LoadPixMapManager;
|
|
Application.CreateForm(TfrmMain, frmMain); // main form
|
|
Application.CreateForm(TdmComData, dmComData); // common data
|
|
Application.CreateForm(TdmHelpManager, dmHelpMgr); // help manager
|
|
|
|
{$IF DEFINED(LCLGTK2)}
|
|
// LCLGTK2 uses Application.MainForm as the clipboard widget, however our
|
|
// MainForm is TfrmHackForm and it never gets realized. GTK2 doesn't
|
|
// seem to allow a not realized widget to have clipboard ownership.
|
|
// We switch to frmMain instead which will be realized at some point.
|
|
GTK2WidgetSet.SetClipboardWidget(PGtkWidget(frmMain.Handle));
|
|
{$ENDIF}
|
|
|
|
// Hooking on QT needs the handle of the main form which is created
|
|
// in Application.CreateForm above.
|
|
uKeyboard.HookKeyboardLayoutChanged;
|
|
|
|
frmMain.ShowOnTop;
|
|
Application.ProcessMessages;
|
|
Application.Run;
|
|
|
|
if not UniqueInstance.isAnotherDCRunningWhileIamRunning then
|
|
DeleteTempFolderDeletableAtTheEnd;
|
|
|
|
FreeMemoryFromOurAccentLookupTableList;
|
|
|
|
if (log_start_shutdown in gLogOptions) then logWrite(rsMsgLogProgramShutdown + ' (' + GetCurrentUserName + '/' + GetComputerNetName + ')');
|
|
end
|
|
else
|
|
begin
|
|
DCDebug('Another instance of DC is already running. Exiting.');
|
|
end;
|
|
|
|
uKeyboard.CleanupKeyboard;
|
|
DCDebug('Finished Double Commander');
|
|
end.
|