ADD: Haiku initial support

This commit is contained in:
Alexander Koblov 2022-11-18 22:08:53 +03:00
commit ebd030ca48
13 changed files with 106 additions and 49 deletions

View file

@ -28,7 +28,7 @@ unit DCUnix;
interface
uses
InitC, BaseUnix, SysUtils;
InitC, BaseUnix, UnixType, SysUtils;
const
{$IF DEFINED(LINUX)}
@ -38,6 +38,9 @@ const
O_CLOEXEC = &04000000;
{$ELSEIF DEFINED(NETBSD)}
O_CLOEXEC = $00400000;
{$ELSEIF DEFINED(HAIKU)}
FD_CLOEXEC = 1;
O_CLOEXEC = $00000040;
{$ELSE}
O_CLOEXEC = 0;
{$ENDIF}
@ -90,9 +93,14 @@ type
pw_change: time_t; //en< password change time
pw_class: PChar; //en< user access class
{$ENDIF}
{$IF NOT DEFINED(HAIKU)}
pw_gecos: PChar; //en< real name
{$ENDIF}
pw_dir: PChar; //en< home directory
pw_shell: PChar; //en< shell program
{$IF DEFINED(HAIKU)}
pw_gecos: PChar; //en< real name
{$ENDIF}
{$IF DEFINED(BSD)}
pw_expire: time_t; //en< account expiration
pw_fields: cint; //en< internal: fields filled in
@ -215,6 +223,10 @@ const
{$ELSEIF DEFINED(BSD)}
_SC_OPEN_MAX = 5;
RLIM_INFINITY = rlim_t(High(QWord) shr 1);
{$ELSEIF DEFINED(HAIKU)}
_SC_OPEN_MAX = 20;
RLIMIT_NOFILE = 4;
RLIM_INFINITY = $ffffffff;
{$ENDIF}
procedure tzset(); cdecl; external clib;

View file

@ -35,7 +35,7 @@ uses
Classes, SysUtils, BaseUnix, TermIO, InitC, VTEmuCtl;
// Under Linux and BSD forkpty is situated in libutil.so library
{$IF NOT DEFINED(DARWIN)}
{$IF NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
{$LINKLIB util}
{$ENDIF}

View file

@ -193,7 +193,7 @@ uses
, BaseUnix, Unix, uMyUnix, dl
{$IF DEFINED(DARWIN)}
, CocoaAll, uMyDarwin
{$ELSE}
{$ELSEIF NOT DEFINED(HAIKU)}
, uGio, uClipboard, uXdg, uKde
{$ENDIF}
{$ENDIF}
@ -400,6 +400,10 @@ begin
CFRelease(theFileNameUrlRef);
end;
end;
{$ELSEIF DEFINED(HAIKU)}
begin
Result:= False;
end;
{$ELSE}
var
sCmdLine: String;
@ -466,6 +470,7 @@ var
sbfs: TStatFS;
begin
Result := High(Int64);
{$IF NOT DEFINED(HAIKU)}
if (fpStatFS(PAnsiChar(CeUtf8ToSys(Path)), @sbfs) = 0) then
begin
{$IFDEF BSD}
@ -475,6 +480,7 @@ begin
{$ENDIF}
Result:= $FFFFFFFF; // 4 Gb
end;
{$ENDIF}
end;
{$ELSE}
var

View file

@ -139,7 +139,7 @@ var
implementation
{$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)}
{$IF DEFINED(UNIX) AND NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
{$DEFINE X11}
{$ENDIF}

View file

@ -172,7 +172,7 @@ uses
{$IF (NOT DEFINED(FPC_USE_LIBC)) or (DEFINED(BSD) AND NOT DEFINED(DARWIN))}
, SysCall
{$ENDIF}
{$IF NOT DEFINED(DARWIN)}
{$IF NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
, uMimeActions, uMimeType, uGVolume
{$ENDIF}
{$IFDEF LINUX}
@ -373,7 +373,7 @@ begin
end;
function GetDefaultAppCmd(const FileName: String): String;
{$IF NOT DEFINED(DARWIN)}
{$IF NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
var
Filenames: TStringList;
begin
@ -391,7 +391,7 @@ end;
{$ENDIF}
function GetFileMimeType(const FileName: String): String;
{$IF NOT DEFINED(DARWIN)}
{$IF NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
begin
Result:= uMimeType.GetFileMimeType(FileName);
end;
@ -521,7 +521,7 @@ function UnmountDrive(Drive: PDrive): Boolean;
begin
if Drive^.IsMounted then
begin
{$IF NOT DEFINED(DARWIN)}
{$IF NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
if Drive^.DriveType = dtSpecial then
begin
Exit(uGVolume.Unmount(Drive^.Path));
@ -546,7 +546,7 @@ end;
function EjectDrive(Drive: PDrive): Boolean;
begin
{$IF NOT DEFINED(DARWIN)}
{$IF NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
Result:= uGVolume.Eject(Drive^.Path);
if not Result then
{$ENDIF}

View file

@ -69,6 +69,8 @@ function GetPipeFileName(const FileName: String; Global : Boolean): String;
begin
{$IF DEFINED(DARWIN)}
Result:= NSGetTempPath + FileName;
{$ELSEIF DEFINED(HAIKU)}
Result:= IncludeTrailingBackslash(GetTempDir) + FileName;
{$ELSE}
Result:= IncludeTrailingBackslash(GetUserRuntimeDir) + FileName;
{$ENDIF}

View file

@ -74,7 +74,7 @@ uses
fMain, fFileProperties, DCOSUtils, DCStrUtils, uExts, uArchiveFileSourceUtil
{$IF DEFINED(DARWIN)}
, MacOSAll
{$ELSE}
{$ELSEIF NOT DEFINED(HAIKU)}
, uKeyFile, uMimeActions, uOSForms, uSysFolders
{$IF DEFINED(LINUX)}
, uRabbitVCS
@ -92,7 +92,7 @@ var
// list.
ContextMenuActionList: TExtActionList = nil;
{$IF NOT DEFINED(DARWIN)}
{$IF NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
function GetGnomeTemplateMenu(out Items: TStringList): Boolean;
var
@ -197,7 +197,7 @@ end;
function GetTemplateMenu(out Items: TStringList): Boolean;
begin
{$IF DEFINED(DARWIN)}
{$IF DEFINED(DARWIN) OR DEFINED(HAIKU)}
Result:= False;
{$ELSE}
case GetDesktopEnvironment of
@ -322,7 +322,7 @@ var
I: LongInt;
FileNames: TStringList;
begin
{$IF NOT DEFINED(DARWIN)}
{$IF NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
FileNames := TStringList.Create;
for I := 0 to FFiles.Count - 1 do
FileNames.Add(FFiles[I].FullPath);
@ -417,6 +417,10 @@ begin
CFRelease(ApplicationArrayRef);
end;
end;
{$ELSEIF DEFINED(HAIKU)}
begin
Result:= False;
end;
{$ELSE}
var
I: LongInt;

View file

@ -108,7 +108,7 @@ procedure ShowTrashContextMenu(Parent: TWinControl; X, Y : Integer;
}
function ShowOpenIconDialog(Owner: TCustomControl; var sFileName : String) : Boolean;
{$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)}
{$IF DEFINED(UNIX) AND NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
{en
Show open with dialog
@param(FileList List of files to open with)
@ -139,15 +139,12 @@ uses
{$ENDIF}
{$IFDEF UNIX}
, BaseUnix, Errors, fFileProperties, uJpegThumb, uOpenDocThumb
{$IF NOT DEFINED(DARWIN)}
{$IF DEFINED(DARWIN)}
, MacOSAll, uQuickLook, uMyDarwin
{$ELSEIF NOT DEFINED(HAIKU)}
, uDCReadSVG, uMagickWand, uGio, uGioFileSource, uVfsModule, uVideoThumb
, uDCReadWebP, uFolderThumb, uAudioThumb, uDefaultTerminal, uDCReadHEIF
, uTrashFileSource
{$ELSE}
, MacOSAll, uQuickLook, uMyDarwin
{$ENDIF}
{$IF NOT DEFINED(DARWIN)}
, fOpenWith
, uTrashFileSource, fOpenWith
{$ENDIF}
{$IF DEFINED(LCLQT) and not DEFINED(DARWIN)}
, qt4, qtwidgets
@ -639,7 +636,7 @@ begin
with TfrmMain(MainForm) do
StaticTitle:= StaticTitle + ' - ROOT PRIVILEGES';
end;
{$IF NOT DEFINED(DARWIN)}
{$IF NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
if HasGio then
begin
if TGioFileSource.IsSupportedPath('trash://') then
@ -944,7 +941,7 @@ begin
end;
{$ENDIF}
{$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)}
{$IF DEFINED(UNIX) AND NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
procedure ShowOpenWithDialog(TheOwner: TComponent; const FileList: TStringList);
begin
fOpenWith.ShowOpenWithDlg(TheOwner, FileList);

View file

@ -51,15 +51,15 @@ uses
, fgl
{$ELSEIF DEFINED(UNIX)}
, DCFileAttributes
{$IF NOT DEFINED(DARWIN)}
{$IF DEFINED(DARWIN)}
, CocoaUtils, uMyDarwin
{$ELSEIF NOT DEFINED(HAIKU)}
, Contnrs, uGio
{$IFDEF LCLGTK2}
, gtk2
{$ELSE}
, uUnixIconTheme
{$ENDIF}
{$ELSE}
, CocoaUtils, uMyDarwin
{$ENDIF}
{$ENDIF};
@ -126,7 +126,7 @@ type
FOneDrivePath: String;
{$ELSEIF DEFINED(DARWIN)}
FUseSystemTheme: Boolean;
{$ELSEIF DEFINED(UNIX)}
{$ELSEIF DEFINED(UNIX) AND NOT DEFINED(HAIKU)}
{en
Maps file extension to MIME icon name(s).
}
@ -205,7 +205,7 @@ type
function GetSystemArchiveIcon: PtrInt;
function GetSystemExecutableIcon: PtrInt;
{$ENDIF}
{$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)}
{$IF DEFINED(UNIX) AND NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
{en
Loads MIME icons names and creates a mapping: file extension -> MIME icon name.
Doesn't need to be synchronized as long as it's only called from Load().
@ -230,7 +230,7 @@ type
{$ENDIF}
function GetBuiltInDriveIcon(Drive : PDrive; IconSize : Integer; clBackColor : TColor) : Graphics.TBitmap;
{$IF NOT DEFINED(DARWIN)}
{$IF NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
procedure LoadApplicationThemeIcon;
{$ENDIF}
@ -698,7 +698,7 @@ procedure TPixMapManager.CreateIconTheme;
var
DirList: array of string;
begin
{$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)}
{$IF DEFINED(UNIX) AND NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
{$IFDEF LCLGTK2}
// get current gtk theme
FIconTheme:= gtk_icon_theme_get_for_screen(gdk_screen_get_default);
@ -723,7 +723,7 @@ end;
procedure TPixMapManager.DestroyIconTheme;
begin
{$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)}
{$IF DEFINED(UNIX) AND NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
{$IFDEF LCLGTK2}
FIconTheme:= nil;
{$ELSE}
@ -734,7 +734,7 @@ begin
FreeThenNil(FDCIconTheme);
end;
{$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)}
{$IF DEFINED(UNIX) AND NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
procedure TPixMapManager.LoadMimeIconNames;
const
@ -1132,7 +1132,7 @@ var
begin
// This function must be called under FPixmapsLock.
{$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)}
{$IF DEFINED(UNIX) AND NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
Result := nil;
// Try to load icon from system theme
if gShowIcons > sim_standart then
@ -1425,7 +1425,7 @@ begin
{$IF DEFINED(DARWIN)}
FUseSystemTheme:= NSAppKitVersionNumber >= 1038;
{$ELSEIF DEFINED(UNIX)}
{$ELSEIF DEFINED(UNIX) AND NOT DEFINED(HAIKU)}
FExtToMimeIconName := TFPDataHashTable.Create;
FHomeFolder := IncludeTrailingBackslash(GetHomeDir);
{$ENDIF}
@ -1460,7 +1460,7 @@ destructor TPixMapManager.Destroy;
var
I : Integer;
K: TDriveType;
{$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)}
{$IF DEFINED(UNIX) AND NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
J : Integer;
nodeList: TFPObjectList;
{$ENDIF}
@ -1493,7 +1493,7 @@ begin
{$IF DEFINED(MSWINDOWS)}
ImageList_Destroy(FSysImgList);
{$ELSEIF DEFINED(UNIX) AND NOT DEFINED(DARWIN)}
{$ELSEIF DEFINED(UNIX) AND NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
for I := 0 to FExtToMimeIconName.HashTable.Count - 1 do
begin
nodeList := TFPObjectList(FExtToMimeIconName.HashTable.Items[I]);
@ -1531,7 +1531,7 @@ begin
// (via LoadPixMapManager in doublecmd.lpr).
// Load icon themes.
{$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)}
{$IF DEFINED(UNIX) AND NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
if gShowIcons > sim_standart then
begin
LoadMimeIconNames; // For use with GetMimeIcon
@ -1699,7 +1699,7 @@ begin
(* /Set archive icons *)
{$IF NOT DEFINED(DARWIN)}
{$IF NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
LoadApplicationThemeIcon;
{$ENDIF}
end;
@ -1986,7 +1986,7 @@ begin
// and contains desktop.ini file
(not (DirectAccess and (IsSysFile or FileIsReadOnly(Attributes)) and mbFileExists(FullPath + '\desktop.ini'))) or
(ScreenInfo.ColorDepth < 16) then
{$ELSEIF DEFINED(UNIX) AND NOT DEFINED(DARWIN)}
{$ELSEIF DEFINED(UNIX) AND NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
if (IconsMode = sim_all_and_exe) and (DirectAccess) then
begin
if not LoadIcon then Exit(-1);
@ -2032,7 +2032,7 @@ begin
if (Extension = '') then
begin
{$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)}
{$IF DEFINED(UNIX) AND NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
if IconsMode = sim_all_and_exe then
begin
if DirectAccess and (Attributes and S_IXUGO <> 0) then
@ -2067,7 +2067,7 @@ begin
else if Ext = 'ico' then
Exit(FiDefaultIconID)
end;
{$ELSEIF DEFINED(UNIX) AND NOT DEFINED(DARWIN)}
{$ELSEIF DEFINED(UNIX) AND NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
if IconsMode = sim_all_and_exe then
begin
if DirectAccess and ((Ext = 'desktop') or (Ext = 'directory')) then
@ -2090,7 +2090,7 @@ begin
if IconsMode <= sim_standart then
Exit(FiDefaultIconID);
{$IF DEFINED(UNIX)}
{$IF DEFINED(UNIX) AND NOT DEFINED(HAIKU)}
if LoadIcon = False then
Exit(-1);
@ -2354,7 +2354,7 @@ begin
// 'Bitmap' should not be freed, because it only points to DriveIconList.
end;
{$IF NOT DEFINED(DARWIN)}
{$IF NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
procedure TPixMapManager.LoadApplicationThemeIcon;
var

View file

@ -60,7 +60,7 @@ uses
, BaseUnix, Unix, DCUnix
{$IF DEFINED(DARWIN)}
, CocoaAll, uMyDarwin
{$ELSE}
{$ELSEIF NOT DEFINED(HAIKU)}
, uXdg
{$ENDIF}
{$ENDIF}
@ -110,6 +110,10 @@ end;
begin
Result:= GetHomeDir + '/Library/Preferences/' + ApplicationName;
end;
{$ELSEIF DEFINED(HAIKU)}
begin
Result:= GetHomeDir + '/config/settings/' + ApplicationName;
end;
{$ELSE}
var
uinfo: PPasswordRecord;
@ -136,6 +140,10 @@ end;
begin
Result:= NSGetFolderPath(NSCachesDirectory);
end;
{$ELSEIF DEFINED(HAIKU)}
begin
Result:= GetHomeDir + '/config/cache/' + ApplicationName;
end;
{$ELSE}
var
uinfo: PPasswordRecord;
@ -157,6 +165,10 @@ end;
begin
Result:= NSGetFolderPath(NSApplicationSupportDirectory);
end;
{$ELSEIF DEFINED(HAIKU)}
begin
Result:= GetAppConfigDir;
end;
{$ELSE}
begin
Result:= IncludeTrailingPathDelimiter(GetUserDataDir) + ApplicationName;

View file

@ -70,7 +70,10 @@ uses
{$IF DEFINED(MSWINDOWS)}
Windows,
{$ELSEIF DEFINED(UNIX)}
ipc, baseunix, uPipeServer,
baseunix, uPipeServer,
{$IFNDEF HAIKU}
ipc,
{$ENDIF}
{$ENDIF}
Forms, StrUtils, FileUtil, uRegExprA, uGlobs, uDebug;
@ -137,6 +140,10 @@ begin
Result:= True;
end;
end;
{$ELSEIF DEFINED(HAIKU)}
begin
Result:= True;
end;
{$ELSEIF DEFINED(UNIX)}
const
SEM_PERM = 6 shl 6 { 0600 };
@ -221,6 +228,10 @@ procedure TUniqueInstance.DisposeMutex;
{$IF DEFINED(MSWINDOWS)}
begin
ReleaseMutex(FHandle);
end;
{$ELSEIF DEFINED(HAIKU)}
begin
end;
{$ELSEIF DEFINED(UNIX)}
var

View file

@ -28,7 +28,7 @@ const
SCM_RIGHTS = $01; //* Transfer file descriptors. */
type
msglen_t = {$IFDEF BSD}cint{$ELSE}size_t{$ENDIF};
msglen_t = {$IF DEFINED(BSD) OR DEFINED(HAIKU)}cint{$ELSE}size_t{$ENDIF};
Pmsghdr = ^msghdr;
msghdr = record
@ -53,6 +53,19 @@ function recvmsg(__fd: cInt; __message: pmsghdr; __flags: cInt): ssize_t; cdecl;
{$IF DEFINED(LINUX)}
type
ucred = record
pid : pid_t;
uid : uid_t;
gid : gid_t;
end;
{$ELSEIF DEFINED(HAIKU)}
const
MSG_NOSIGNAL = $0800;
SO_PEERCRED = $4000000;
type
ucred = record
pid : pid_t;
@ -133,7 +146,7 @@ begin
end;
procedure SetSocketClientProcessId(fd: cint);
{$IF DEFINED(LINUX) OR DEFINED(DARWIN)}
{$IF DEFINED(LINUX) OR DEFINED(DARWIN) OR DEFINED(HAIKU)}
begin
end;
@ -178,7 +191,7 @@ end;
{$ENDIF}
function GetSocketClientProcessId(fd: cint): pid_t;
{$IF DEFINED(LINUX)}
{$IF DEFINED(LINUX) OR DEFINED(HAIKU)}
var
cred: ucred;
ALength: TSockLen;

View file

@ -317,7 +317,7 @@ end;
{$ENDIF}
initialization
{$IF DEFINED(DARWIN)}
{$IF DEFINED(DARWIN) OR DEFINED(HAIKU)}
FAdministratorPrivileges:= True;
{$ELSEIF DEFINED(UNIX)}
{$IFDEF LINUX}