diff -up src/xfe-1.43/src/FilePanel.cpp.orig src/xfe-1.43/src/FilePanel.cpp --- src/xfe-1.43/src/FilePanel.cpp.orig 2018-05-16 09:28:02.000000000 -0600 +++ src/xfe-1.43/src/FilePanel.cpp 2019-06-19 18:28:48.000000000 -0600 @@ -4481,27 +4481,32 @@ long FilePanel::onCmdPopupMenu(FXObject* // Last and before last file extensions FXString ext1 = name.rafter('.', 1).lower(); FXString ext2 = name.rafter('.', 2).lower(); + FXString ext3 = name.rafter('.', 3).lower(); // Destination folder name FXString extract_to_folder; - if ((ext2 == "tar.gz") || (ext2 == "tar.bz2") || (ext2 == "tar.xz") || (ext2 == "tar.z")) + if ((ext3 != "pkg.tar.xz") && ((ext2 == "tar.gz") || (ext2 == "tar.bz2") || (ext2 == "tar.xz") || (ext2 == "tar.z"))) { extract_to_folder = _("Extr&act to folder ")+name.section('\t', 0).rbefore('.', 2); } + else if ((ext3 == "pkg.tar.xz")) + { + extract_to_folder = _("Extr&act to folder ")+name.section('\t', 0).rbefore('.', 3); + } else { extract_to_folder = _("Extr&act to folder ")+name.section('\t', 0).rbefore('.', 1); } // Display the extract and package menus according to the archive extensions - if ((num == 1) && ((ext2 == "tar.gz") || (ext2 == "tar.bz2") || (ext2 == "tar.xz") || (ext2 == "tar.z"))) + if ((num == 1) && (ext3 != "pkg.tar.xz") && ((ext2 == "tar.gz") || (ext2 == "tar.bz2") || (ext2 == "tar.xz") || (ext2 == "tar.z"))) { ar = true; new FXMenuCommand(menu, _("&Extract here"), archexticon, current, FilePanel::ID_EXTRACT_HERE); new FXMenuCommand(menu, extract_to_folder, archexticon, current, FilePanel::ID_EXTRACT_TO_FOLDER); new FXMenuCommand(menu, _("E&xtract to..."), archexticon, current, FilePanel::ID_EXTRACT); } - else if ((num == 1) && ((ext1 == "gz") || (ext1 == "bz2") || (ext1 == "xz") || (ext1 == "z"))) + else if ((num == 1) && (ext3 != "pkg.tar.xz") && ((ext1 == "gz") || (ext1 == "bz2") || (ext1 == "xz") || (ext1 == "z"))) { ar = true; new FXMenuCommand(menu, _("&Extract here"), archexticon, current, FilePanel::ID_EXTRACT_HERE); @@ -4514,7 +4519,7 @@ long FilePanel::onCmdPopupMenu(FXObject* new FXMenuCommand(menu, _("E&xtract to..."), archexticon, current, FilePanel::ID_EXTRACT); } #if defined(linux) - else if ((num == 1) && ((ext1 == "rpm") || (ext1 == "deb"))) + else if ((num == 1) && ((ext1 == "rpm") || (ext1 == "deb") || (ext3 == "pkg.tar.xz"))) { ar = true; new FXMenuCommand(menu, _("&View"), packageicon, current, FilePanel::ID_VIEW); @@ -5382,6 +5387,7 @@ long FilePanel::onCmdPkgInstall(FXObject // Command to perform FXString ext = FXPath::extension(name); + FXString ext3 = name.rafter('.', 3); if (comparecase(ext, "rpm") == 0) { cmd = "rpm -Uvh " + path; @@ -5390,6 +5396,10 @@ long FilePanel::onCmdPkgInstall(FXObject { cmd = "dpkg -i "+ path; } + else if (comparecase(ext3, "pkg.tar.xz") == 0) + { + cmd = "sudo pacman -U "+ path; + } // Wait cursor getApp()->beginWaitCursor(); @@ -5429,6 +5439,7 @@ long FilePanel::onCmdPkgUninstall(FXObje // Command to perform FXString ext = FXPath::extension(name); + FXString ext3 = name.rafter('.', 3); if (comparecase(ext, "rpm") == 0) { name = name.section('-', 0); @@ -5439,6 +5450,11 @@ long FilePanel::onCmdPkgUninstall(FXObje name = name.section('_', 0); cmd = "dpkg -r "+ name; } + else if (comparecase(ext3, "pkg.tar.xz") == 0) + { + name = name.section('-', 0); + cmd = "sudo pacman -R " + name; + } // Wait cursor getApp()->beginWaitCursor(); @@ -5925,9 +5941,13 @@ long FilePanel::onCmdPkgQuery(FXObject* { cmd = "rpm -qf " + ::quote(file); } + else if (pkg_format == PKG_PKG) + { + cmd = "pacman -Qo " + ::quote(file); + } else { - MessageBox::error(this, BOX_OK, _("Error"), _("No compatible package manager (rpm or dpkg) found!")); + MessageBox::error(this, BOX_OK, _("Error"), _("No compatible package manager (rpm, dpkg or pacman) found!")); return(0); } @@ -5984,6 +6004,13 @@ long FilePanel::onCmdPkgQuery(FXObject* { if (str.find(' ') != -1) // Space character exists in the string { + str = ""; + } + } + if (pkg_format == PKG_PKG) // PKG based distribution + { + if (str.find(' ') != -1) // Space character exists in the string + { str = ""; } } diff -up src/xfe-1.43/src/help.h.orig src/xfe-1.43/src/help.h --- src/xfe-1.43/src/help.h.orig 2016-11-07 01:04:00.000000000 -0700 +++ src/xfe-1.43/src/help.h 2019-06-19 18:28:48.000000000 -0600 @@ -49,7 +49,7 @@ - Panels synchronization and switching\n \ - Integrated text editor and viewer (X File Write, Xfw)\n \ - Integrated image viewer (X File Image, Xfi)\n \ - - Integrated package (rpm or deb) viewer / installer / uninstaller (X File Package, Xfp)\n \ + - Integrated package (rpm, deb or pkg) viewer / installer / uninstaller (X File Package, Xfp)\n \ - Custom shell scripts (like Nautilus scripts)\n \ - Search files and directories\n \ - Natural sort order (foo10.txt comes after foo2.txt...)\n \ diff -up src/xfe-1.43/src/main.cpp.orig src/xfe-1.43/src/main.cpp --- src/xfe-1.43/src/main.cpp.orig 2018-05-16 09:57:11.000000000 -0600 +++ src/xfe-1.43/src/main.cpp 2019-06-19 18:28:48.000000000 -0600 @@ -334,6 +334,7 @@ int main(int argc, char* argv[]) // For package query on Linux systems, try to guess if the default package format is deb or rpm: // - if dpkg exists then the system uses deb packages // - else if rpm exists, then the system uses rpm packages + // - else if pacman exists, then the system uses pkg packages // - else another (unsupported) package manager is used cmd = "dpkg --version"; @@ -354,7 +355,17 @@ int main(int argc, char* argv[]) } else { - pkg_format = OTHER_PKG; // other (unsupported) package system + cmd = "pacman --version"; + str = getCommandOutput(cmd); + + if (str.find("pacman") != -1) + { + pkg_format = PKG_PKG; // pkg based system + } + else + { + pkg_format = OTHER_PKG; // other (unsupported) package system + } } } #endif diff -up src/xfe-1.43/src/Properties.cpp.orig src/xfe-1.43/src/Properties.cpp --- src/xfe-1.43/src/Properties.cpp.orig 2018-02-19 02:28:23.000000000 -0700 +++ src/xfe-1.43/src/Properties.cpp 2019-06-19 18:28:48.000000000 -0600 @@ -169,7 +169,7 @@ PropertiesBox::PropertiesBox(FXWindow* w FXString grpid, usrid; FXLabel* sizelabel = NULL; struct stat linfo; - FXString type = "", extension, extension2, fileassoc; + FXString type = "", extension, extension2, extension3, fileassoc; FXbool isLink, isBrokenLink; FXString pathname, referredpath; char mnttype[64], used[64], avail[64], pctr[64], size[64]; @@ -245,16 +245,17 @@ PropertiesBox::PropertiesBox(FXWindow* w FXString editlbl = _("Edit:"); extension = file.rafter('.', 1).lower(); - if ((extension == "gz") || (extension == "tgz") || (extension == "tar") || (extension == "taz") || (extension == "bz2") || + extension3 = file.rafter('.', 3).lower(); + if (((extension == "gz") || (extension == "tgz") || (extension == "tar") || (extension == "taz") || (extension == "bz2") || (extension == "tbz2") || (extension == "tbz") || (extension == "xz") || (extension == "txz") || (extension == "zip") || (extension == "7z") || (extension == "Z") || (extension == "lzh") || (extension == "rar") || - (extension == "ace") || (extension == "arj")) + (extension == "ace") || (extension == "arj")) && (extension3 != "pkg.tar.xz")) { is_ar = true; // archive viewlbl = _("Extract:"); } #if defined(linux) - else if (extension == "rpm") + else if ((extension == "rpm") || (extension == "deb") || (extension3 == "pkg.tar.xz")) { editlbl = _("Install/Upgrade:"); } diff -up src/xfe-1.43/src/SearchPanel.cpp.orig src/xfe-1.43/src/SearchPanel.cpp --- src/xfe-1.43/src/SearchPanel.cpp.orig 2018-05-16 05:37:15.000000000 -0600 +++ src/xfe-1.43/src/SearchPanel.cpp 2019-06-19 18:28:48.000000000 -0600 @@ -2270,14 +2270,15 @@ long SearchPanel::onCmdPopupMenu(FXObjec // Last and before last file extensions FXString ext1 = name.rafter('.', 1).lower(); FXString ext2 = name.rafter('.', 2).lower(); + FXString ext3 = name.rafter('.', 3).lower(); // Display the extract and package menus according to the archive extensions - if ((num == 1) && ((ext2 == "tar.gz") || (ext2 == "tar.bz2") || (ext2 == "tar.xz") || (ext2 == "tar.z"))) + if ((num == 1) && (ext3 != "pkg.tar.xz") && ((ext2 == "tar.gz") || (ext2 == "tar.bz2") || (ext2 == "tar.xz") || (ext2 == "tar.z"))) { ar = true; new FXMenuCommand(menu, _("E&xtract to..."), archexticon, this, SearchPanel::ID_EXTRACT); } - else if ((num == 1) && ((ext1 == "gz") || (ext1 == "bz2") || (ext1 == "xz") || (ext1 == "z"))) + else if ((num == 1) && (ext3 != "pkg.tar.xz") && ((ext1 == "gz") || (ext1 == "bz2") || (ext1 == "xz") || (ext1 == "z"))) { ar = true; new FXMenuCommand(menu, _("&Extract here"), archexticon, this, SearchPanel::ID_EXTRACT); @@ -2288,7 +2289,7 @@ long SearchPanel::onCmdPopupMenu(FXObjec new FXMenuCommand(menu, _("E&xtract to..."), archexticon, this, SearchPanel::ID_EXTRACT); } #if defined(linux) - else if ((num == 1) && ((ext1 == "rpm") || (ext1 == "deb"))) + else if ((num == 1) && ((ext1 == "rpm") || (ext1 == "deb") || (ext3 == "pkg.tar.xz"))) { ar = true; new FXMenuCommand(menu, _("&View"), packageicon, this, SearchPanel::ID_VIEW); @@ -4326,9 +4327,13 @@ long SearchPanel::onCmdPkgQuery(FXObject { cmd = "rpm -qf " + ::quote(file); } + else if (pkg_format == PKG_PKG) + { + cmd = "pacman -Qo " + ::quote(file); + } else { - MessageBox::error(this, BOX_OK, _("Error"), _("No compatible package manager (rpm or dpkg) found!")); + MessageBox::error(this, BOX_OK, _("Error"), _("No compatible package manager (rpm, dpkg or pacman) found!")); return(0); } @@ -4388,6 +4393,13 @@ long SearchPanel::onCmdPkgQuery(FXObject str = ""; } } + if (pkg_format == PKG_PKG) // PKG based distribution + { + if (str.find(' ') != -1) // Space character exists in the string + { + str = ""; + } + } // Display the related output message FXString message; @@ -4436,5 +4448,4 @@ long SearchPanel::onUpdPkgQuery(FXObject return(1); } - #endif diff -up src/xfe-1.43/src/xfedefs.h.orig src/xfe-1.43/src/xfedefs.h --- src/xfe-1.43/src/xfedefs.h.orig 2018-05-15 06:35:05.000000000 -0600 +++ src/xfe-1.43/src/xfedefs.h 2019-06-19 18:28:48.000000000 -0600 @@ -294,6 +294,7 @@ // Package format #define DEB_PKG 0 #define RPM_PKG 1 -#define OTHER_PKG 2 +#define PKG_PKG 2 +#define OTHER_PKG 3 #endif diff -up src/xfe-1.43/src/XFilePackage.cpp.orig src/xfe-1.43/src/XFilePackage.cpp --- src/xfe-1.43/src/XFilePackage.cpp.orig 2015-12-15 06:53:31.000000000 -0700 +++ src/xfe-1.43/src/XFilePackage.cpp 2019-06-19 18:28:48.000000000 -0600 @@ -32,6 +32,7 @@ char** args; FXbool dpkg = false; FXbool rpm = false; +FXbool pacman = false; FXColor highlightcolor; FXbool allowPopupScroll = false; FXuint single_click; @@ -223,7 +224,7 @@ long XFilePackage::onCmdAbout(FXObject*, { FXString msg; - msg.format(_("X File Package Version %s is a simple rpm or deb package manager.\n\n"), VERSION); + msg.format(_("X File Package Version %s is a simple rpm, deb or pkg package manager.\n\n"), VERSION); msg += COPYRIGHT; MessageBox about(this, _("About X File Package"), msg.text(), xfpicon, BOX_OK|DECOR_TITLE|DECOR_BORDER, JUSTIFY_CENTER_X|ICON_BEFORE_TEXT|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_Y); @@ -241,6 +242,7 @@ long XFilePackage::onCmdOpen(FXObject*, _("RPM source packages"), "*.src.rpm", _("RPM packages"), "*.rpm", _("DEB packages"), "*.deb", + _("PKG packages"), "*.pkg.tar.xz", NULL }; @@ -278,6 +280,7 @@ long XFilePackage::onCmdInstall(FXObject // Command to perform FXString ext = FXPath::extension(filename); + FXString ext3 = filename.rafter('.', 3); if (comparecase(ext, "rpm") == 0) { cmd = "rpm -Uvh "+filename; @@ -286,6 +289,10 @@ long XFilePackage::onCmdInstall(FXObject { cmd = "dpkg -i "+filename; } + else if (comparecase(ext3, "pkg.tar.xz") == 0) + { + cmd = "sudo pacman -U "+filename; + } else { MessageBox::error(this, BOX_OK, _("Error"), _("Unknown package format")); @@ -322,6 +329,7 @@ long XFilePackage::onCmdUninstall(FXObje // Command to perform FXString package; FXString ext = FXPath::extension(filename); + FXString ext3 = filename.rafter('.', 3); if (comparecase(ext, "rpm") == 0) { // Get package name @@ -336,6 +344,13 @@ long XFilePackage::onCmdUninstall(FXObje package = package.section('_', 0); cmd = "dpkg -r "+ package; } + else if (comparecase(ext3, "pkg.tar.xz") == 0) + { + // Get package name + package = FXPath::name(filename); + package = package.section('-', 0); + cmd = "sudo pacman -R "+ package; + } else { MessageBox::error(this, BOX_OK, _("Error"), _("Unknown package format")); @@ -425,6 +440,7 @@ int XFilePackage::readFileList(void) FXString cmd; FXString ext = FXPath::extension(filename); + FXString ext3 = filename.rafter('.', 3); if (comparecase(ext, "rpm") == 0) { @@ -436,6 +452,11 @@ int XFilePackage::readFileList(void) errorflag = false; cmd = "dpkg -c "+::quote(filename); } + else if (comparecase(ext3, "pkg.tar.xz") == 0) + { + errorflag = false; + cmd = "pacman -Qlp "+::quote(filename); + } else if (errorflag == false) { errorflag = true; @@ -487,6 +508,7 @@ int XFilePackage::readDescription(void) FXString buf; FXString ext = FXPath::extension(filename); + FXString ext3 = filename.rafter('.', 3); if (comparecase(ext, "rpm") == 0) { @@ -500,6 +522,12 @@ int XFilePackage::readDescription(void) buf += _("[DEB package]\n"); cmd = "dpkg -I "+::quote(filename); } + else if (comparecase(ext3, "pkg.tar.xz") == 0) + { + errorflag = false; + buf += _("[PKG package]\n"); + cmd = "pacman -Qip "+::quote(filename); + } else if (errorflag == false) { errorflag = true; @@ -646,7 +674,7 @@ void XFilePackage::create() -h, --help Print (this) help screen and exit.\n\ -v, --version Print version information and exit.\n\ \n\ - [package] is the path to the rpm or deb package you want to open on start up.\n\ + [package] is the path to the rpm, deb or pkg package you want to open on start up.\n\ \n") @@ -797,6 +825,7 @@ int main(int argc, char* argv[]) // Test the existence of the Debian package manager (dpkg) // and the RedHat package manager (rpm) + // and the ArchLinux package manager (pacman) FXString cmd = "dpkg --version"; FXString str = getCommandOutput(cmd); @@ -813,10 +842,18 @@ int main(int argc, char* argv[]) rpm = true; } + cmd = "pacman --version"; + str = getCommandOutput(cmd); + + if (str.find("pacman") != -1) + { + pacman = true; + } + // No package manager was found - if ((dpkg == false) && (rpm == false)) + if ((dpkg == false) && (rpm == false) && (pacman == false)) { - MessageBox::error(window, BOX_OK, _("Error"), _("No compatible package manager (rpm or dpkg) found!")); + MessageBox::error(window, BOX_OK, _("Error"), _("No compatible package manager (rpm, dpkg or pacman) found!")); exit(EXIT_FAILURE); }