Compare commits

..

5 Commits

Author SHA1 Message Date
Ben Reaves
0e76f8ed19 Added required dependencies for openSUSE tumbleweed 2021-04-04 16:52:26 -04:00
Ben Reaves
70606b187a Merge branch 'feature/display-opensuse' into feature/zypper-opensuse 2021-04-04 15:54:07 -04:00
Ben Reaves
4e1aa8b731 Adding support for opensuse, vte 2021-04-04 15:51:01 -04:00
RedBearAK
5c35bf032b Inline export DISPLAY on openSUSE Tumbleweed
OpenSUSE Tumbleweed has an error where install completes but the xkeysnail service won't run due to "display not found". Double quotes together indicates display environment variable inside the command is nonexistent or empty. 

This patch inlines `export DISPLAY=` [ insert actual DISPLAY variable value] at the beginning of the main command in the xkeysnail service file, just before the file is copied into its destination. 

Don't know of any other way to fix the issue on Tumbleweed. Tried moving the "Environment" line before the "ExecStart" line in the service file, that of course made no difference.
2021-04-01 12:02:19 -08:00
RedBearAK
33151bfe44 Add zypper support, make output easier to read
Removing "--allow-downgrades --allow-remove-essential --allow-change-held-packages" as a replacement for "--force-yes" because none of those options are really recommended. They can potentially break the system entirely, and shouldn't actually be necessary in any normal situation when installing packages. 

This adds some strategic blank lines and "descriptions" of what is happening so things are far more clear in the terminal during install. Aids in troubleshooting which parts go wrong. 

Adds support for the zypper package manager used by openSUSE Tumbleweed.
2021-03-31 23:58:26 -08:00
6 changed files with 57 additions and 225 deletions

View File

@@ -32,25 +32,21 @@ Video Tutorial: [Install Kinto.sh for Linux in less than a minute](https://www.y
<img src="https://user-images.githubusercontent.com/10969616/97070698-179c4500-15a0-11eb-8064-c03aa7f4d4a5.png" width="75%"> <img src="https://user-images.githubusercontent.com/10969616/97070698-179c4500-15a0-11eb-8064-c03aa7f4d4a5.png" width="75%">
### Quick Install Method 1. clone this repo
Paste the following into your Terminal
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/rbreaves/kinto/HEAD/install/linux.sh)"
```
Uninstall
```
/bin/bash <( curl https://raw.githubusercontent.com/rbreaves/kinto/HEAD/install/linux.sh ) -r
```
### Old Install Method
``` ```
git clone https://github.com/rbreaves/kinto.git git clone https://github.com/rbreaves/kinto.git
cd kinto cd kinto
```
2. Install python3 (If needed)
Debian or Ubuntu 16.04 or 18.04
```
sudo apt update sudo apt update
sudo apt install python3 sudo apt install python3
```
3. Run the script, press 1 or 2 keys and you are done.
```
./setup.py ./setup.py
``` ```
@@ -93,14 +89,10 @@ Video Tutorial: [How to Install Kinto.sh on Windows 10](https://youtu.be/sRk8A8k
### Quick install ### Quick install
Open Powershell as Administrator and copy and paste the following. This will download & extract Kinto, install chocolatey, python3 and then install Kinto. Open Powershell as Administrator and copy and paste the following. This will download & extract Kinto, install chocolatey, python3 and then install Kinto.
**⚠ NOTE: Please inspect https://raw.githubusercontent.com/rbreaves/kinto/master/install/windows.ps1 and https://chocolatey.org/install.ps1 before running scripts directly. More information about running powershell scripts in this context can be found [here](https://chocolatey.org/install).**
``` ```
Set-ExecutionPolicy Bypass -Scope Process -Force Invoke-WebRequest -Uri https://github.com/rbreaves/kinto/archive/refs/heads/master.zip -OutFile $env:USERPROFILE\Downloads\kinto.zip;Expand-Archive -LiteralPath "$env:USERPROFILE\Downloads\kinto.zip" -DestinationPath "$env:USERPROFILE\Downloads" -Force;Set-ExecutionPolicy Bypass -Scope Process -Force; iwr https://chocolatey.org/install.ps1 -UseBasicParsing | iex; choco install -y python3;cd "$env:USERPROFILE\Downloads\kinto-master";py .\setup.py
iwr https://raw.githubusercontent.com/rbreaves/kinto/master/install/windows.ps1 -UseBasicParsing | iex
``` ```
Update system tray to show Kinto icon at all times (optional) Update system tray to show Kinto icon at all times (optional)
``` ```
cmd /c "explorer shell:::{05d7b0f4-2121-4eff-bf6b-ed3f69b894d9}" cmd /c "explorer shell:::{05d7b0f4-2121-4eff-bf6b-ed3f69b894d9}"

View File

@@ -1,21 +0,0 @@
#!/usr/bin/env bash
# /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/rbreaves/kinto/master/install/linux.sh)"
curl https://github.com/rbreaves/kinto/archive/refs/heads/master.zip -J -L -o ~/Downloads/kinto.zip
unzip ~/Downloads/kinto.zip -d ~/Downloads/
cd ~/Downloads/kinto-master/
kintorelease=`curl -s https://api.github.com/repos/rbreaves/kinto/releases/latest | awk -F'tag_name": ' '{if ($2) print $2}' | tr -d \",`
kintohash=`unzip -z ~/Downloads/kinto.zip | tail -n1`
kintoshort=${kintohash::7}
echo "$kintorelease" "build" "$kintoshort" > ./dl_version
if [ $# -eq 0 ];then
echo "Installing Kinto..."
./setup.py
elif [ $1 == "-r" ];then
echo "Uninstall Kinto..."
./setup.py -r
fi

View File

@@ -1,7 +0,0 @@
Invoke-WebRequest -Uri https://github.com/rbreaves/kinto/archive/refs/heads/master.zip -OutFile $env:USERPROFILE\Downloads\kinto.zip
Expand-Archive -LiteralPath "$env:USERPROFILE\Downloads\kinto.zip" -DestinationPath "$env:USERPROFILE\Downloads" -Force
Set-ExecutionPolicy Bypass -Scope Process -Force
iwr https://chocolatey.org/install.ps1 -UseBasicParsing | iex
choco install -y python3
cd "$env:USERPROFILE\Downloads\kinto-master"
py .\setup.py

View File

@@ -9,7 +9,6 @@ from xkeysnail.transform import *
# xbindkeys -mk # xbindkeys -mk
terminals = [ terminals = [
"alacritty", "alacritty",
"deepin-terminal",
"eterm", "eterm",
"gnome-terminal", "gnome-terminal",
"guake", "guake",
@@ -18,7 +17,6 @@ terminals = [
"kinto-gui.py", "kinto-gui.py",
"kitty", "kitty",
"konsole", "konsole",
"lxterminal",
"mate-terminal", "mate-terminal",
"qterminal", "qterminal",
"sakura", "sakura",
@@ -214,7 +212,8 @@ define_keymap(re.compile("^jetbrains-(?!.*toolbox).*$", re.IGNORECASE),{
K("C-M-o"): K("C-M-Shift-n"), # Go to symbol K("C-M-o"): K("C-M-Shift-n"), # Go to symbol
K("Super-Right"): K("M-Right"), # Go to next editor tab K("Super-Right"): K("M-Right"), # Go to next editor tab
K("Super-Left"): K("M-Left"), # Go to previous editor tab K("Super-Left"): K("M-Left"), # Go to previous editor tab
K("C-l"): K("C-g"), # Go to line K("Super-l"): K("C-g"), # Go to line
K("Super-e"): K("C-e"), # Recent files popup
K("M-Space"): K("C-Shift-i"), # Open quick definition lookup K("M-Space"): K("C-Shift-i"), # Open quick definition lookup
K("C-Y"): K("C-Shift-i"), # Open quick definition lookup K("C-Y"): K("C-Shift-i"), # Open quick definition lookup
K("Super-Shift-b"): K("C-Shift-b"), # Go to type declaration K("Super-Shift-b"): K("C-Shift-b"), # Go to type declaration
@@ -249,140 +248,13 @@ define_keymap(re.compile("^jetbrains-(?!.*toolbox).*$", re.IGNORECASE),{
K("Super-c"): K("LC-c"), # Sigints - interrupt K("Super-c"): K("LC-c"), # Sigints - interrupt
},"Jetbrains") },"Jetbrains")
############################################## # Keybindings for Nautilus
### START OF FILE MANAGER GROUP OF KEYMAPS ### define_keymap(re.compile("org.gnome.nautilus", re.IGNORECASE),{
############################################## K("RC-Up"): K("M-Up"), # Go Up dir
K("RC-Down"): K("M-Down"), # Go Down dir
# Keybindings overrides for Caja
# (overrides some bindings from general file manager code block below)
define_keymap(re.compile("caja", re.IGNORECASE),{
# K("RC-Super-o"): K("RC-Shift-Enter"), # Open in new tab
K("RC-Super-o"): K("RC-Shift-W"), # Open in new window
},"Overrides for Caja - Finder")
# Keybindings overrides for DDE (Deepin) File Manager
# (overrides some bindings from general file manager code block below)
define_keymap(re.compile("dde-file-manager", re.IGNORECASE),{
K("RC-i"): K("RC-i"), # File properties dialog (Get Info)
K("RC-comma"): K("RC-comma"), # Open preferences dialog (doesn't work, no shortcut available?)
K("RC-Up"): K("RC-Up"), # Go Up dir
},"Overrides for DDE File Manager - Finder")
# Keybindings overrides for Dolphin
# (overrides some bindings from general file manager code block below)
define_keymap(re.compile("dolphin", re.IGNORECASE),{
K("RC-Super-o"): K("RC-Shift-o"), # Open in new window (or new tab, user's choice)
# "Open in new window" requires manually setting custom shortcut of Ctrl+Shift+o
# in Dolphin's keyboard shortcuts. There is no default shortcut set for this function.
###
# "Open in new tab" requires manually setting custom shortcut of Ctrl+Shift+o in
# Dolphin's keyboard shortcuts. There is no default shortcut set for this function.
###
K("RC-Shift-N"): K("F10"), # Create new folder
K("RC-comma"): K("RC-Shift-comma"), # Open preferences dialog
},"Overrides for Dolphin - Finder")
# Keybindings overrides for elementary OS Files
# (overrides some bindings from general file manager code block below)
define_keymap(re.compile("io.elementary.files", re.IGNORECASE),{
# K("RC-Super-o"): K("Shift-Enter"), # Open folder in new tab
K("RC-Comma"): None, # Disable preferences shortcut since none availabe
},"Overrides for Pantheon - Finder")
# Keybindings overrides for Nautilus
# (overrides some bindings from general file manager code block below)
define_keymap(re.compile("org.gnome.nautilus|nautilus", re.IGNORECASE),{
K("RC-Super-o"): K("Shift-Enter"), # Open in new window
# K("RC-Super-o"): K("RC-Enter"), # Open in new tab
K("RC-comma"): K("RC-comma"), # Overrides "Open preferences dialog" shortcut below
},"Overrides for Nautilus - Finder")
# Keybindings overrides for PCManFM
# (overrides some bindings from general file manager code block below)
define_keymap(re.compile("pcmanfm", re.IGNORECASE),{
K("RC-Backspace"): [K("Delete"),K("Enter")], # Move to Trash (delete, bypass dialog)
},"Overrides for PCManFM - Finder")
# Keybindings overrides for SpaceFM
# (overrides some bindings from general file manager code block below)
define_keymap(re.compile("spacefm", re.IGNORECASE),{
K("RC-Shift-N"): [K("RC-F")], # Create new folder is Ctrl+F by default
K("RC-Backspace"): [K("Delete"),K("Enter")], # Move to Trash (delete, bypass dialog)
K("RC-comma"): [K("M-V"),K("p")], # Overrides "Open preferences dialog" shortcut below
# This shortcut ^^^^^^^^^^^^^^^ is not fully working in SpaceFM. Opens "View" menu but not Preferences.
# SpaceFM seems to be doing some nasty binding that blocks things like Alt+Tab while the menu is open.
},"Overrides for SpaceFM - Finder")
# Keybindings overrides for Thunar
# (overrides some bindings from general file manager code block below)
define_keymap(re.compile("thunar", re.IGNORECASE),{
K("RC-Super-o"): K("RC-Shift-P"), # Open in new tab
K("RC-comma"): [K("M-E"),K("E")], # Overrides "Open preferences dialog" shortcut below
},"Overrides for Thunar - Finder")
filemanagers = [
"caja",
"dde-file-manager",
"dolphin",
"io.elementary.files",
"nautilus",
"nemo",
"org.gnome.nautilus",
"pcmanfm",
"pcmanfm-qt",
"spacefm",
"thunar",
]
filemanagers = [filemanager.casefold() for filemanager in filemanagers]
filemanagerStr = "|".join(str(x) for x in filemanagers)
# Currently supported Linux file managers (file browsers):
#
# Caja File Browser (MATE file manager, fork of Nautilus)
# DDE File Manager (Deepin Linux file manager)
# Dolphin (KDE file manager)
# Nautilus (GNOME file manager, may be named "Files")
# Nemo (Cinnamon file manager, fork of Nautilus, may be named "Files")
# Pantheon Files (elementary OS file manager, may be named "Files")
# PCManFM (LXDE file manager)
# PCManFM-Qt (LXQt file manager)
# SpaceFM (Fork of PCManFM file manager)
# Thunar File Manager (Xfce file manager)
#
# Keybindings for general Linux file managers group:
define_keymap(re.compile(filemanagerStr, re.IGNORECASE),{
###########################################################################################################
### Show Properties (Get Info) | Open Settings/Preferences | Show/Hide hidden files ###
###########################################################################################################
K("RC-i"): K("M-Enter"), # File properties dialog (Get Info)
K("RC-comma"): [K("M-E"),K("N")], # Open preferences dialog
K("RC-Shift-dot"): K("RC-H"), # Show/hide hidden files ("dot" files)
###########################################################################################################
### Navigation ###
###########################################################################################################
K("RC-Left"): K("M-Left"), # Go Back K("RC-Left"): K("M-Left"), # Go Back
K("RC-Right"): K("M-Right"), # Go Forward K("RC-Right"): K("M-Right"), # Go Forward
K("RC-Up"): K("M-Up"), # Go Up dir },"Nautilus - Finder")
# K("RC-Down"): K("M-Down"), # Go Down dir (only works on folders) [not universal]
# K("RC-Down"): K("RC-O"), # Go Down dir (open folder/file) [not universal]
K("RC-Down"): K("Enter"), # Go Down dir (open folder/file) [universal]
###########################################################################################################
### Open in New Window | Move to Trash | Duplicate file/folder ###
###########################################################################################################
K("RC-Super-o"): K("RC-Shift-o"), # Open in new window (or tab, depends on FM setup) [not universal]
K("RC-Backspace"): K("Delete"), # Move to Trash (delete)
K("RC-D"): [K("RC-C"),K("RC-V")], # Mimic Finder's Duplicate command (Copy, then Paste)
###########################################################################################################
### To enable renaming files with the Enter key, uncomment the two keymapping lines just below this. ###
### Use Ctrl+Shift+Enter to escape or activate text fields such as "[F]ind" and "[L]ocation" fields. ###
###########################################################################################################
# K("Enter"): K("F2"), # Rename with Enter key
# K("RC-Shift-Enter"): K("Enter"), # Remap alternative "Enter" key to easily activate/exit text fields
},"File Managers - Finder")
############################################
### END OF FILE MANAGER GROUP OF KEYMAPS ###
############################################
# Keybindings for Browsers # Keybindings for Browsers
define_keymap(re.compile(browserStr, re.IGNORECASE),{ define_keymap(re.compile(browserStr, re.IGNORECASE),{

View File

@@ -1,15 +1,31 @@
#!/bin/bash #!/bin/bash
if pkgmgr="$( which apt-get )" 2> /dev/null; then if pkgmgr="$( which apt-get )" 2> /dev/null; then
echo "Debian" echo
echo "Debian apt-get package manager detected... "
echo "Installing $1... "
echo
$pkgmgr update $pkgmgr update
$pkgmgr --yes --force-yes install $1 $pkgmgr --yes install $1
elif pkgmgr="$( which dnf )" 2> /dev/null; then elif pkgmgr="$( which dnf )" 2> /dev/null; then
echo "dnf" echo
echo "dnf package manager detected... "
echo "Installing $1... "
echo
$pkgmgr check-update; $pkgmgr install -y $1 $pkgmgr check-update; $pkgmgr install -y $1
elif pkgmgr="$( which pacman )" 2> /dev/null; then elif pkgmgr="$( which pacman )" 2> /dev/null; then
echo "Arch-based" echo
echo "Arch-based pacman package manager detected... "
echo "Installing $1... "
echo
$pkgmgr -Syy;yes | $pkgmgr -S $1 $pkgmgr -Syy;yes | $pkgmgr -S $1
elif pkgmgr="$( which zypper )" 2> /dev/null; then
echo
echo "zypper package manager detected... "
echo "Installing $1... "
echo
$pkgmgr refresh
$pkgmgr -n install $1
else else
echo "Package manager not found, please install $1" >&2 echo "Package manager not found, please install $1" >&2
exit 1 exit 1

View File

@@ -209,24 +209,7 @@ sudo systemctl disable xkeysnail >/dev/null 2>&1
sudo pkill -f bin/xkeysnail >/dev/null 2>&1 sudo pkill -f bin/xkeysnail >/dev/null 2>&1
sudo pkill -f "is-active xkeysnail" >/dev/null 2>&1 sudo pkill -f "is-active xkeysnail" >/dev/null 2>&1
if [ "$distro" == "manjarolinux" ]; then pip3 install pillow
while true; do
read -rep $'\nHave you run \"sudo pacman -Syu\" before running Kinto setup? (y/n): ' updated
case $updated in
[Yy]* ) mjupdated='yes'; break;;
[Nn]* ) mjupdated='no'; break;;
* ) echo -e "\nPlease answer [y]es or [n]o.";;
esac
done
if [[ "$mjupdated" == "no" ]]; then
echo
echo "================================================================================"
echo "========== Please run a full system update before installing Kinto. =========="
echo "================================================================================"
echo
exit 0
fi
fi
# Add additional shortcuts if needed, does not modify existing ones # Add additional shortcuts if needed, does not modify existing ones
@@ -267,6 +250,8 @@ fi
if [[ $dename == "kde" ]]; then if [[ $dename == "kde" ]]; then
if [[ $distro == "manjarolinux" ]]; then if [[ $distro == "manjarolinux" ]]; then
sudo ./linux/system-config/unipkg.sh vte3 sudo ./linux/system-config/unipkg.sh vte3
elif [[ ${distro:0:8} == "opensuse" ]];then
sudo ./linux/system-config/unipkg.sh vte-devel-0.62.3
else else
sudo ./linux/system-config/unipkg.sh libvte-2.91-dev sudo ./linux/system-config/unipkg.sh libvte-2.91-dev
fi fi
@@ -343,10 +328,6 @@ expsh=" "
# echo "Will need to install inotify-tools to restart key remapper live for config file changes..." # echo "Will need to install inotify-tools to restart key remapper live for config file changes..."
# sudo ./linux/system-config/unipkg.sh inotify-tools # sudo ./linux/system-config/unipkg.sh inotify-tools
# fi # fi
if ! [ -x "$(command -v git)" ]; then
echo "Will need to install git..."
sudo ./linux/system-config/unipkg.sh git
fi
if ! [ -x "$(command -v pip3)" ]; then if ! [ -x "$(command -v pip3)" ]; then
echo "Will need to install python3-pip..." echo "Will need to install python3-pip..."
sudo ./linux/system-config/unipkg.sh python3-pip sudo ./linux/system-config/unipkg.sh python3-pip
@@ -356,8 +337,10 @@ if ! [ -x "$(command -v python3-config)" ]; then
pydev="python3-dev" pydev="python3-dev"
elif [ "$distro" == "fedora" ]; then elif [ "$distro" == "fedora" ]; then
pydev="python3-devel" pydev="python3-devel"
elif [ "${distro:0:8}" == "opensuse" ]; then
pydev="python3-devel python3-gobject python3-gobject-Gdk typelib-1_0-Gtk-3_0 libgtk-3-0"
fi fi
if [ "$distro" == "gnome" ] || [ "$distro" == "fedora" ] || [ "$distro" == "debian" ] || [ "$distro" == 'linuxmint' ]; then if [ "$distro" == "gnome" ] || [ "$distro" == "fedora" ] || [ "$distro" == "debian" ] || [ "$distro" == 'linuxmint' ] || [ "${distro:0:8}" == "opensuse" ]; then
echo "Will need to install $pydev..." echo "Will need to install $pydev..."
sudo ./linux/system-config/unipkg.sh "$pydev" sudo ./linux/system-config/unipkg.sh "$pydev"
fi fi
@@ -366,16 +349,16 @@ fi
# sudo ./linux/system-config/unipkg.sh gnome-tweaks gnome-shell-extension-appindicator gir1.2-appindicator3-0.1 # sudo ./linux/system-config/unipkg.sh gnome-tweaks gnome-shell-extension-appindicator gir1.2-appindicator3-0.1
# fi # fi
if ! [ -x "$(command -v xhost)" ] || ! [ -x "$(command -v gcc)" ]; then if ! [ -x "$(command -v xhost)" ] || ! [ -x "$(command -v gcc)" ]; then
if [ "$distro" == "\"manjaro linux\"" ]; then if [ "$distro" == "manjarolinux" ]; then
sudo ./linux/system-config/unipkg.sh "xorg-xhost gcc" sudo ./linux/system-config/unipkg.sh "xorg-xhost gcc"
elif [ "${distro:0:8}" == "opensuse" ]; then
sudo ./linux/system-config/unipkg.sh "gcc"
fi fi
fi fi
if [ "$distro" == 'linuxmint' ]; then if [ "$distro" == 'linuxmint' ]; then
pip3 install setuptools pip3 install setuptools
fi fi
pip3 install pillow
# echo "Transferring files..." # echo "Transferring files..."
mkdir -p ~/.config/kinto mkdir -p ~/.config/kinto
@@ -400,16 +383,7 @@ yes | cp -rf ./linux/xkeysnail.desktop ~/.config/kinto/xkeysnail.desktop
# logoff fix - not solid for every os. Prevents missed 1 character input on login # logoff fix - not solid for every os. Prevents missed 1 character input on login
# yes | sudo cp -rf linux/gnome_logoff.sh ~/.config/kinto/logoff.sh # yes | sudo cp -rf linux/gnome_logoff.sh ~/.config/kinto/logoff.sh
if [ -d "./.git" ] echo "$(git describe --tag --abbrev=0 | head -n 1)" "build" "$(git rev-parse --short HEAD)" > ~/.config/kinto/version
then
echo "$(git describe --tag --abbrev=0 | head -n 1)" "build" "$(git rev-parse --short HEAD)" > ~/.config/kinto/version
elif [ -f "./dl_version" ]; then
cp ./dl_version ~/.config/kinto/version
else
# Not a typo - v is built in
echo "ersion Unknown" > ~/.config/kinto/version
fi
yes | cp -rf ./linux/kinto.py ./linux/kinto.py.new yes | cp -rf ./linux/kinto.py ./linux/kinto.py.new
yes | cp -rf ./linux/limitedadmins ./linux/limitedadmins.new yes | cp -rf ./linux/limitedadmins ./linux/limitedadmins.new
yes | cp -rf ./linux/gui/ ~/.config/kinto/ yes | cp -rf ./linux/gui/ ~/.config/kinto/
@@ -523,6 +497,12 @@ if ! [[ $1 == "5" || $1 == "uninstall" || $1 == "Uninstall" ]]; then
fi fi
sed -i "s#{xkeysnail}#`which xkeysnail`#g" ./linux/xkeysnail.service.new sed -i "s#{xkeysnail}#`which xkeysnail`#g" ./linux/xkeysnail.service.new
sed -i "s#{xkeysnail}#`which xkeysnail`#g" ./linux/limitedadmins.new sed -i "s#{xkeysnail}#`which xkeysnail`#g" ./linux/limitedadmins.new
# openSUSE needs DISPLAY exported inside main command to avoid display "" not found error.
if [[ ${distro:0:8} == "opensuse" ]];then
sed -i "s#'/usr/bin/xhost#'export DISPLAY=`echo $DISPLAY` \&\& /usr/bin/xhost#g" ./linux/xkeysnail.service.new
fi
sudo mv ./linux/xkeysnail.service.new "$xkeypath"xkeysnail.service && echo "Service file added to "$xkeypath"xkeysnail.service" sudo mv ./linux/xkeysnail.service.new "$xkeypath"xkeysnail.service && echo "Service file added to "$xkeypath"xkeysnail.service"
sudo chown root:root ./linux/limitedadmins.new sudo chown root:root ./linux/limitedadmins.new
# Add a check here for xkeysnail path resolving # Add a check here for xkeysnail path resolving