mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-21 09:58:13 +00:00
ADD: Open with other from flatpak sandbox (issue #309)
FIX: Memory leak
(cherry picked from commit 6ee8e81d6d)
This commit is contained in:
parent
28507aedda
commit
0750dc3264
3 changed files with 75 additions and 12 deletions
|
|
@ -200,7 +200,7 @@ uses
|
|||
, uGio, uClipboard, uXdg, uKde
|
||||
{$ENDIF}
|
||||
{$IF DEFINED(LINUX)}
|
||||
, DCUnix, uMyLinux
|
||||
, DCUnix, uMyLinux, uFlatpak
|
||||
{$ENDIF}
|
||||
{$ENDIF}
|
||||
;
|
||||
|
|
@ -424,10 +424,13 @@ begin
|
|||
Result:= ExecuteCommand(sCmdLine, [], mbGetCurrentDir);
|
||||
end
|
||||
else begin
|
||||
{$IF DEFINED(LINUX)}
|
||||
if (DesktopEnv = DE_FLATPAK) then
|
||||
Result:= FlatpakOpen(sCmdLine, False)
|
||||
else
|
||||
{$ENDIF}
|
||||
{$IF NOT DEFINED(HAIKU)}
|
||||
if (DesktopEnv = DE_FLATPAK) then
|
||||
Result:= ExecuteCommand('xdg-open', [sCmdLine], mbGetCurrentDir)
|
||||
else if (DesktopEnv = DE_KDE) and (HasKdeOpen = True) then
|
||||
if (DesktopEnv = DE_KDE) and (HasKdeOpen = True) then
|
||||
Result:= KioOpen(sCmdLine) // Under KDE use "kioclient" to open files
|
||||
else if HasGio and (DesktopEnv <> DE_XFCE) then
|
||||
Result:= GioOpen(sCmdLine) // Under GNOME, Unity and LXDE use "GIO" to open files
|
||||
|
|
|
|||
|
|
@ -7,15 +7,18 @@ interface
|
|||
uses
|
||||
Classes, SysUtils, uMyUnix;
|
||||
|
||||
function FlatpakOpen(const FileName: String; Ask: Boolean32): Boolean;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
BaseUnix, DCUnix, uTrash, uDebug, uGLib2, uGObject2, uGio2;
|
||||
BaseUnix, DCOSUtils, DCUnix, uTrash, uDebug, uGLib2, uGObject2, uGio2;
|
||||
|
||||
const
|
||||
PORTAL_BUS_NAME = 'org.freedesktop.portal.Desktop';
|
||||
PORTAL_OBJECT_PATH = '/org/freedesktop/portal/desktop';
|
||||
PORTAL_INTERFACE_TRASH = 'org.freedesktop.portal.Trash';
|
||||
PORTAL_INTERFACE_OPENURI = 'org.freedesktop.portal.OpenURI';
|
||||
|
||||
var
|
||||
PortalBusName: String;
|
||||
|
|
@ -27,12 +30,55 @@ begin
|
|||
g_error_free(AError);
|
||||
end;
|
||||
|
||||
function FlatpakOpen(const FileName: String; Ask: Boolean32): Boolean;
|
||||
var
|
||||
Res: PGVariant;
|
||||
Handle: THandle;
|
||||
FDList: PGUnixFDList;
|
||||
AError: PGError = nil;
|
||||
Options: TGVariantBuilder;
|
||||
begin
|
||||
if (DBusConn = nil) then Exit(False);
|
||||
Handle:= mbFileOpen(FileName, fmOpenRead or fmShareDenyNone);
|
||||
|
||||
if Handle < 0 then Exit(False);
|
||||
|
||||
FDList:= g_unix_fd_list_new_from_array(@Handle, 1);
|
||||
g_variant_builder_init(@Options, PGVariantType(Pgchar('a{sv}')));
|
||||
g_variant_builder_add(@Options, '{sv}', ['ask', g_variant_new_boolean(Ask)]);
|
||||
|
||||
Res:= g_dbus_connection_call_with_unix_fd_list_sync(DBusConn,
|
||||
Pgchar(PortalBusName),
|
||||
PORTAL_OBJECT_PATH,
|
||||
PORTAL_INTERFACE_OPENURI,
|
||||
'OpenFile',
|
||||
g_variant_new('(sha{sv})', ['', 0, @Options]),
|
||||
nil,
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
-1,
|
||||
FDList,
|
||||
nil,
|
||||
nil,
|
||||
@AError);
|
||||
|
||||
g_object_unref(PGObject(FDList));
|
||||
|
||||
if Assigned(AError) then
|
||||
begin
|
||||
PrintError(AError);
|
||||
end;
|
||||
|
||||
Result:= Assigned(Res);
|
||||
if Result then g_variant_unref(Res);
|
||||
end;
|
||||
|
||||
function FileTrash(const FileName: String): Boolean;
|
||||
var
|
||||
Answer: guint;
|
||||
Ret: PGVariant;
|
||||
Handle: THandle;
|
||||
FDList: PGUnixFDList;
|
||||
AError: PGError = nil;
|
||||
begin
|
||||
repeat
|
||||
Handle:= fpOpen(FileName, O_PATH or O_CLOEXEC);
|
||||
|
|
@ -54,16 +100,21 @@ begin
|
|||
FDList,
|
||||
nil,
|
||||
nil,
|
||||
nil);
|
||||
@AError);
|
||||
|
||||
g_object_unref(PGObject(FDList));
|
||||
|
||||
if Assigned(AError) then
|
||||
begin
|
||||
PrintError(AError);
|
||||
end;
|
||||
|
||||
if (Ret = nil) then
|
||||
Result:= False
|
||||
else begin
|
||||
g_variant_get(Ret, '(u)', [@Answer]);
|
||||
g_object_unref(PGObject(Ret));
|
||||
Result:= (Answer = 1);
|
||||
g_variant_unref(Ret);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ uses
|
|||
{$ELSEIF NOT DEFINED(HAIKU)}
|
||||
, uKeyFile, uMimeActions
|
||||
{$IF DEFINED(LINUX)}
|
||||
, uRabbitVCS
|
||||
, uRabbitVCS, uFlatpak
|
||||
{$ENDIF}
|
||||
{$ENDIF}
|
||||
;
|
||||
|
|
@ -318,15 +318,24 @@ begin
|
|||
end;
|
||||
|
||||
procedure TShellContextMenu.OpenWithOtherSelect(Sender: TObject);
|
||||
{$IF NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
|
||||
var
|
||||
I: LongInt;
|
||||
FileNames: TStringList;
|
||||
{$ENDIF}
|
||||
begin
|
||||
{$IF DEFINED(LINUX)}
|
||||
if DesktopEnv = DE_FLATPAK then
|
||||
FlatpakOpen(FFiles[0].FullPath, True)
|
||||
else
|
||||
{$ENDIF}
|
||||
{$IF NOT (DEFINED(DARWIN) OR DEFINED(HAIKU))}
|
||||
FileNames := TStringList.Create;
|
||||
for I := 0 to FFiles.Count - 1 do
|
||||
FileNames.Add(FFiles[I].FullPath);
|
||||
ShowOpenWithDialog(frmMain, FileNames);
|
||||
begin
|
||||
FileNames := TStringList.Create;
|
||||
for I := 0 to FFiles.Count - 1 do
|
||||
FileNames.Add(FFiles[I].FullPath);
|
||||
ShowOpenWithDialog(frmMain, FileNames);
|
||||
end;
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue