Package comfortable-swipe with Python (#58)
* Add initial python setup script * Add working initial python porting definition for comfortable-swipe * Add python extensions to cpp libraries * Remove boost and prefer vanilla Python.h implementation * Add main driver function for comfortable_swipe * Fix compilation for Python 3 * Remove depcreacted cpp scripts in root * Move script to entrypoint * Increment version to beta * Update variable formatting * Remove deprecated install script * Move install to post-install command * Create install script hooks * Fix bdist_wheel class errors * Use absolute path for c++ sources * Unignore index files * Move autostart to python * Allow comfortable swipe autostart for possible virtualenv * Completely port autostart to python * Move status to python * Optimize swipe function * Remove iostream optimization from buffer * Register pre-install and post-install in a stack * Remove underscores from value-defined macros * Compress default config * Change cpp to __init__.py * Error message * Bugfix for python2
This commit is contained in:
parent
28f5ca2a91
commit
8464084f56
120
.gitignore
vendored
120
.gitignore
vendored
@ -4,3 +4,123 @@
|
|||||||
# IDE-specific
|
# IDE-specific
|
||||||
.idea
|
.idea
|
||||||
.vscode
|
.vscode
|
||||||
|
|
||||||
|
# PYTHON
|
||||||
|
|
||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
|
||||||
|
# C extensions
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Distribution / packaging
|
||||||
|
.Python
|
||||||
|
build/
|
||||||
|
develop-eggs/
|
||||||
|
dist/
|
||||||
|
downloads/
|
||||||
|
eggs/
|
||||||
|
.eggs/
|
||||||
|
lib/
|
||||||
|
!/lib
|
||||||
|
lib64/
|
||||||
|
parts/
|
||||||
|
sdist/
|
||||||
|
var/
|
||||||
|
wheels/
|
||||||
|
pip-wheel-metadata/
|
||||||
|
share/python-wheels/
|
||||||
|
*.egg-info/
|
||||||
|
.installed.cfg
|
||||||
|
*.egg
|
||||||
|
MANIFEST
|
||||||
|
|
||||||
|
# PyInstaller
|
||||||
|
# Usually these files are written by a python script from a template
|
||||||
|
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||||
|
*.manifest
|
||||||
|
*.spec
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
pip-delete-this-directory.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
htmlcov/
|
||||||
|
.tox/
|
||||||
|
.nox/
|
||||||
|
.coverage
|
||||||
|
.coverage.*
|
||||||
|
.cache
|
||||||
|
nosetests.xml
|
||||||
|
coverage.xml
|
||||||
|
*.cover
|
||||||
|
.hypothesis/
|
||||||
|
.pytest_cache/
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
*.mo
|
||||||
|
*.pot
|
||||||
|
|
||||||
|
# Django stuff:
|
||||||
|
*.log
|
||||||
|
local_settings.py
|
||||||
|
db.sqlite3
|
||||||
|
|
||||||
|
# Flask stuff:
|
||||||
|
instance/
|
||||||
|
.webassets-cache
|
||||||
|
|
||||||
|
# Scrapy stuff:
|
||||||
|
.scrapy
|
||||||
|
|
||||||
|
# Sphinx documentation
|
||||||
|
docs/_build/
|
||||||
|
|
||||||
|
# PyBuilder
|
||||||
|
target/
|
||||||
|
|
||||||
|
# Jupyter Notebook
|
||||||
|
.ipynb_checkpoints
|
||||||
|
|
||||||
|
# IPython
|
||||||
|
profile_default/
|
||||||
|
ipython_config.py
|
||||||
|
|
||||||
|
# pyenv
|
||||||
|
.python-version
|
||||||
|
|
||||||
|
# celery beat schedule file
|
||||||
|
celerybeat-schedule
|
||||||
|
|
||||||
|
# SageMath parsed files
|
||||||
|
*.sage.py
|
||||||
|
|
||||||
|
# Environments
|
||||||
|
.env
|
||||||
|
.venv
|
||||||
|
env/
|
||||||
|
venv/
|
||||||
|
ENV/
|
||||||
|
env.bak/
|
||||||
|
venv.bak/
|
||||||
|
|
||||||
|
# Spyder project settings
|
||||||
|
.spyderproject
|
||||||
|
.spyproject
|
||||||
|
|
||||||
|
# Rope project settings
|
||||||
|
.ropeproject
|
||||||
|
|
||||||
|
# mkdocs documentation
|
||||||
|
/site
|
||||||
|
|
||||||
|
# mypy
|
||||||
|
.mypy_cache/
|
||||||
|
.dmypy.json
|
||||||
|
dmypy.json
|
||||||
|
|
||||||
|
# Pyre type checker
|
||||||
|
.pyre/
|
||||||
|
|||||||
1
MANIFEST.in
Normal file
1
MANIFEST.in
Normal file
@ -0,0 +1 @@
|
|||||||
|
include comfortable_swipe/res/comfortable-swipe.desktop
|
||||||
@ -5,10 +5,10 @@ Comfortable, seamless, and fast 3-finger (and 4-finger) touchpad swipe gestures
|
|||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
1. Install git, libinput, and g++
|
1. Install Python3, libinput, and g++
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo apt-get install git libinput-tools libxdo-dev g++
|
sudo apt-get install git python3-dev libinput-tools libxdo-dev
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Clone this repository
|
2. Clone this repository
|
||||||
|
|||||||
@ -1,2 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
g++ $(dirname $0)/comfortable-swipe.cpp -std=c++11 -O2 -lxdo -Wno-unused-result -o $1
|
|
||||||
@ -1,70 +0,0 @@
|
|||||||
/*
|
|
||||||
Comfortable Swipe
|
|
||||||
by Rico Tiongson
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <ios> // std::ios
|
|
||||||
#include <iostream> // std::cin, std::cout, std::cerr
|
|
||||||
#include <string> // std::string
|
|
||||||
#include "lib/comfortable_swipe"
|
|
||||||
|
|
||||||
/* MAIN DRIVER FUNCTION */
|
|
||||||
|
|
||||||
int main(int argc, char** args)
|
|
||||||
{
|
|
||||||
// improve buffering by decoupling loggers from stdio
|
|
||||||
std::ios::sync_with_stdio(false);
|
|
||||||
std::cin.tie(0);
|
|
||||||
std::cout.tie(0);
|
|
||||||
std::cerr.tie(0);
|
|
||||||
|
|
||||||
if (argc > 1)
|
|
||||||
{
|
|
||||||
std::string arg = args[1];
|
|
||||||
|
|
||||||
// select based on argument
|
|
||||||
if (arg == "start")
|
|
||||||
comfortable_swipe::service::start();
|
|
||||||
|
|
||||||
else if (arg == "stop")
|
|
||||||
comfortable_swipe::service::stop();
|
|
||||||
|
|
||||||
else if (arg == "restart")
|
|
||||||
comfortable_swipe::service::restart();
|
|
||||||
|
|
||||||
else if (arg == "buffer")
|
|
||||||
comfortable_swipe::service::buffer();
|
|
||||||
|
|
||||||
else if (arg == "autostart")
|
|
||||||
comfortable_swipe::service::autostart();
|
|
||||||
|
|
||||||
else if (arg == "config")
|
|
||||||
comfortable_swipe::service::config();
|
|
||||||
|
|
||||||
else if (arg == "debug")
|
|
||||||
comfortable_swipe::service::debug();
|
|
||||||
|
|
||||||
else if (arg == "status")
|
|
||||||
comfortable_swipe::service::status();
|
|
||||||
|
|
||||||
else /* if (arg == "help") */
|
|
||||||
comfortable_swipe::service::help();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
comfortable_swipe::service::help();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
0
comfortable_swipe/__init__.py
Normal file
0
comfortable_swipe/__init__.py
Normal file
28
comfortable_swipe/__main__.py
Normal file
28
comfortable_swipe/__main__.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from comfortable_swipe.autostart import toggle_status
|
||||||
|
from comfortable_swipe.constants import CONFIG
|
||||||
|
from comfortable_swipe.status import print_status
|
||||||
|
|
||||||
|
from comfortable_swipe.cpp import service as cpp_service
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if len(sys.argv) <= 1:
|
||||||
|
cpp_service.help()
|
||||||
|
else:
|
||||||
|
dict(
|
||||||
|
start=cpp_service.start,
|
||||||
|
stop=cpp_service.stop,
|
||||||
|
restart=cpp_service.restart,
|
||||||
|
buffer=cpp_service.buffer,
|
||||||
|
help=cpp_service.help,
|
||||||
|
debug=cpp_service.debug,
|
||||||
|
status=print_status,
|
||||||
|
autostart=lambda: print('Autostart switched', toggle_status()),
|
||||||
|
config=lambda: print(CONFIG),
|
||||||
|
)[sys.argv[1]]()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
61
comfortable_swipe/autostart.py
Normal file
61
comfortable_swipe/autostart.py
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from comfortable_swipe.constants import NAME, RES, exe
|
||||||
|
|
||||||
|
|
||||||
|
# status enums
|
||||||
|
OFF = 'off'
|
||||||
|
ON = 'on'
|
||||||
|
|
||||||
|
|
||||||
|
# the target path to the autostart desktop file
|
||||||
|
def target_path():
|
||||||
|
return os.path.join(
|
||||||
|
os.getenv(
|
||||||
|
'XDG_CONFIG_HOME',
|
||||||
|
os.path.join(os.getenv('HOME'), '.config')
|
||||||
|
),
|
||||||
|
'autostart',
|
||||||
|
'{}.desktop'.format(NAME)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# path to the autostart template file to be copied
|
||||||
|
def template_path():
|
||||||
|
return os.path.join(RES, '{}.desktop'.format(NAME))
|
||||||
|
|
||||||
|
|
||||||
|
# parsed contents of the template file
|
||||||
|
def template(raw=False):
|
||||||
|
with open(template_path(), 'r') as file:
|
||||||
|
contents = file.read()
|
||||||
|
if raw:
|
||||||
|
return contents
|
||||||
|
return contents.replace('Exec=' + NAME, 'Exec={} {}'.format(sys.executable, exe()))
|
||||||
|
|
||||||
|
|
||||||
|
# gets the current autostart status
|
||||||
|
def get_status():
|
||||||
|
return ON if os.path.exists(target_path()) else OFF
|
||||||
|
|
||||||
|
|
||||||
|
# sets the autostart status
|
||||||
|
def set_status(status=ON):
|
||||||
|
if status == ON:
|
||||||
|
with open(target_path(), 'w') as file:
|
||||||
|
file.write(template())
|
||||||
|
elif status == OFF:
|
||||||
|
if os.path.exists(target_path()):
|
||||||
|
os.remove(target_path())
|
||||||
|
else:
|
||||||
|
raise ValueError('invalid status for autostart')
|
||||||
|
|
||||||
|
return status
|
||||||
|
|
||||||
|
|
||||||
|
# toggles autostart status
|
||||||
|
def toggle_status():
|
||||||
|
return set_status(OFF if get_status() == ON else ON)
|
||||||
17
comfortable_swipe/constants.py
Normal file
17
comfortable_swipe/constants.py
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from distutils.spawn import find_executable
|
||||||
|
|
||||||
|
|
||||||
|
NAME = 'comfortable-swipe'
|
||||||
|
DESCRIPTION = 'Comfortable 3-finger and 4-finger swipe gestures'
|
||||||
|
BIN = os.path.dirname(sys.executable)
|
||||||
|
DIR = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
PYTHON_NAME = os.path.basename(DIR)
|
||||||
|
RES = os.path.join(DIR, 'res')
|
||||||
|
CONFIG = os.path.join(sys.prefix, 'local', 'share', NAME, '{}.conf'.format(NAME))
|
||||||
|
DEFAULT_CONFIG = os.path.join(RES, 'defaults.conf')
|
||||||
|
|
||||||
|
def exe():
|
||||||
|
return find_executable(NAME)
|
||||||
1
comfortable_swipe/cpp/__init__.py
Normal file
1
comfortable_swipe/cpp/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
# This is a placeholder module that will contain the C++ libraries.
|
||||||
8
comfortable_swipe/res/comfortable-swipe.desktop
Normal file
8
comfortable_swipe/res/comfortable-swipe.desktop
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Type=Application
|
||||||
|
Exec=comfortable-swipe start
|
||||||
|
Hidden=false
|
||||||
|
NoDisplay=false
|
||||||
|
X-GNOME-Autostart-enabled=true
|
||||||
|
Name=Comfortable Swipe
|
||||||
|
Comment=3 or 4 finger swipe gestures
|
||||||
@ -5,59 +5,46 @@
|
|||||||
#
|
#
|
||||||
# Refer to https://www.linux.org/threads/xdotool-keyboard.10528/ for a list of
|
# Refer to https://www.linux.org/threads/xdotool-keyboard.10528/ for a list of
|
||||||
# keycodes you can use.
|
# keycodes you can use.
|
||||||
|
|
||||||
#################
|
#################
|
||||||
# MISCELLANEOUS #
|
# MISCELLANEOUS #
|
||||||
#################
|
#################
|
||||||
|
|
||||||
# Threshold
|
# Threshold
|
||||||
# Tweak this value depending on the sensitivity of your mousepad to perform
|
# Tweak this value depending on the sensitivity of your mousepad to perform
|
||||||
# gestures. A higher value means less sensitive.
|
# gestures. A higher value means less sensitive.
|
||||||
#
|
|
||||||
# (Note: Sky is the limit! Can be as large as 1000.0)
|
# (Note: Sky is the limit! Can be as large as 1000.0)
|
||||||
#
|
|
||||||
# Default: threshold = 0.0
|
# Default: threshold = 0.0
|
||||||
threshold = 0.0
|
threshold = 0.0
|
||||||
|
|
||||||
#############################
|
#############################
|
||||||
# THREE / FOUR FINGER SWIPE #
|
# THREE / FOUR FINGER SWIPE #
|
||||||
#############################
|
#############################
|
||||||
|
|
||||||
# 3-finger swipe left
|
# 3-finger swipe left
|
||||||
# The default shortcut is switching to the right workspace.
|
# The default shortcut is switching to the right workspace.
|
||||||
# Default: left3 = ctrl+alt+Right
|
# Default: left3 = ctrl+alt+Right
|
||||||
left3 = ctrl+alt+Right
|
left3 = ctrl+alt+Right
|
||||||
|
|
||||||
# 4-finger swipe left
|
|
||||||
# The default shortcut is moving current window to the right workspace.
|
|
||||||
# Default: left4=ctrl+alt+shift+Right
|
|
||||||
left4 = ctrl+alt+shift+Right
|
|
||||||
|
|
||||||
# 3-finger swipe right
|
# 3-finger swipe right
|
||||||
# The default shortcut is switching to the left workspace.
|
# The default shortcut is switching to the left workspace.
|
||||||
# Default: right3 = ctrl+alt+Left
|
# Default: right3 = ctrl+alt+Left
|
||||||
right3 = ctrl+alt+Left
|
right3 = ctrl+alt+Left
|
||||||
|
# 4-finger swipe left
|
||||||
|
# The default shortcut is moving current window to the right workspace.
|
||||||
|
# Default: left4=ctrl+alt+shift+Right
|
||||||
|
left4 = ctrl+alt+shift+Right
|
||||||
# 4-finger swipe right
|
# 4-finger swipe right
|
||||||
# The default shortcut is moving current window to the left workspace.
|
# The default shortcut is moving current window to the left workspace.
|
||||||
# Default: right4=ctrl+alt+shift+Left
|
# Default: right4=ctrl+alt+shift+Left
|
||||||
right4 = ctrl+alt+shift+Left
|
right4 = ctrl+alt+shift+Left
|
||||||
|
|
||||||
# 3-finger swipe up
|
# 3-finger swipe up
|
||||||
# The default shortcut is switching to the workspace below.
|
# The default shortcut is switching to the workspace below.
|
||||||
# Default: up3 = ctrl+alt+Down
|
# Default: up3 = ctrl+alt+Down
|
||||||
up3 = ctrl+alt+Down
|
up3 = ctrl+alt+Down
|
||||||
|
|
||||||
# 4-finger swipe up
|
|
||||||
# The default shortcut is moving current window to the bottom workspace.
|
|
||||||
# Default: ctrl+alt+shift+Down
|
|
||||||
up4 = ctrl+alt+shift+Down
|
|
||||||
|
|
||||||
# 3-finger swipe down
|
# 3-finger swipe down
|
||||||
# The default shortcut is switching to the workspace above.
|
# The default shortcut is switching to the workspace above.
|
||||||
# Default: down3 = ctrl+alt+Up
|
# Default: down3 = ctrl+alt+Up
|
||||||
down3 = ctrl+alt+Up
|
down3 = ctrl+alt+Up
|
||||||
|
# 4-finger swipe up
|
||||||
|
# The default shortcut is moving current window to the bottom workspace.
|
||||||
|
# Default: ctrl+alt+shift+Down
|
||||||
|
up4 = ctrl+alt+shift+Down
|
||||||
# 4-finger swipe down
|
# 4-finger swipe down
|
||||||
# The default shortcut is moving current window to the above workspace.
|
# The default shortcut is moving current window to the above workspace.
|
||||||
# Default: ctrl+alt+shift+Up
|
# Default: ctrl+alt+shift+Up
|
||||||
22
comfortable_swipe/status.py
Normal file
22
comfortable_swipe/status.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from comfortable_swipe import autostart
|
||||||
|
from comfortable_swipe.cpp import service
|
||||||
|
from comfortable_swipe.constants import NAME, exe
|
||||||
|
|
||||||
|
def print_status():
|
||||||
|
service.status()
|
||||||
|
print('autostart is', autostart.get_status().upper())
|
||||||
|
print('{} program is {}'.format(NAME, 'RUNNING' if is_running() else 'STOPPED'))
|
||||||
|
|
||||||
|
|
||||||
|
def is_running():
|
||||||
|
import psutil
|
||||||
|
for process in psutil.process_iter():
|
||||||
|
process_args = [process.name()] + process.cmdline()
|
||||||
|
for index in range(len(process_args) - 1):
|
||||||
|
if process_args[index + 1] == 'start' and process_args[index].endswith(NAME):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
8
cpp/_index.cpp
Normal file
8
cpp/_index.cpp
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#ifndef __COMFORTABLE_SWIPE__index_cpp__
|
||||||
|
#define __COMFORTABLE_SWIPE__index_cpp__
|
||||||
|
|
||||||
|
#include "gesture/_index.cpp"
|
||||||
|
#include "service/_index.cpp"
|
||||||
|
#include "util/_index.cpp"
|
||||||
|
|
||||||
|
#endif /* __COMFORTABLE_SWIPE__index_cpp__ */
|
||||||
8
cpp/_index.hpp
Normal file
8
cpp/_index.hpp
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#ifndef __COMFORTABLE_SWIPE__index_hpp__
|
||||||
|
#define __COMFORTABLE_SWIPE__index_hpp__
|
||||||
|
|
||||||
|
#include "gesture/_index.hpp"
|
||||||
|
#include "service/_index.hpp"
|
||||||
|
#include "util/_index.hpp"
|
||||||
|
|
||||||
|
#endif /* __COMFORTABLE_SWIPE__index_hpp__ */
|
||||||
12
cpp/_macro.cpp
Normal file
12
cpp/_macro.cpp
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#ifndef __COMFORTABLE_SWIPE__macro_hpp__
|
||||||
|
#define __COMFORTABLE_SWIPE__macro_hpp__
|
||||||
|
|
||||||
|
#ifndef COMFORTABLE_SWIPE_CONFIG
|
||||||
|
#error "COMFORTABLE_SWIPE_CONFIG must be defined."
|
||||||
|
#endif /* COMFORTABLE_SWIPE_CONFIG */
|
||||||
|
|
||||||
|
#ifndef COMFORTABLE_SWIPE_VERSION
|
||||||
|
#warning "COMFORTABLE_SWIPE_VERSION is not defined."
|
||||||
|
#endif /* COMFORTABLE_SWIPE_VERSION */
|
||||||
|
|
||||||
|
#endif /* __COMFORTABLE_SWIPE__macro_hpp__ */
|
||||||
7
cpp/_python.cpp
Normal file
7
cpp/_python.cpp
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#ifndef __COMFORTABLE_SWIPE__python_cpp__
|
||||||
|
#define __COMFORTABLE_SWIPE__python_cpp__
|
||||||
|
|
||||||
|
#include "service/_python.cpp"
|
||||||
|
#include "comfortable-swipe.cpp"
|
||||||
|
|
||||||
|
#endif /* __COMFORTABLE_SWIPE__python_cpp__ */
|
||||||
1
cpp/comfortable-swipe
Normal file
1
cpp/comfortable-swipe
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "comfortable-swipe.cpp"
|
||||||
@ -1,5 +1,5 @@
|
|||||||
#ifndef __COMFORTABLE_SWIPE__util_conf_filename__
|
#ifndef __COMFORTABLE_SWIPE__
|
||||||
#define __COMFORTABLE_SWIPE__util_conf_filename__
|
#define __COMFORTABLE_SWIPE__
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Comfortable Swipe
|
Comfortable Swipe
|
||||||
@ -19,17 +19,8 @@ You should have received a copy of the GNU General Public License
|
|||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../index.hpp"
|
#include "_macro.cpp"
|
||||||
|
#include "_index.hpp"
|
||||||
|
#include "_index.cpp"
|
||||||
|
|
||||||
namespace comfortable_swipe::util
|
#endif /* __COMFORTABLE_SWIPE__ */
|
||||||
{
|
|
||||||
/**
|
|
||||||
* The path where the configuration file is located.
|
|
||||||
*/
|
|
||||||
constexpr const char* conf_filename()
|
|
||||||
{
|
|
||||||
return __COMFORTABLE_SWIPE__CONFIG__;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* __COMFORTABLE_SWIPE__util_conf_filename__ */
|
|
||||||
9
cpp/gesture/_index.cpp
Normal file
9
cpp/gesture/_index.cpp
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#ifndef __COMFORTABLE_SWIPE__gesture_index_cpp__
|
||||||
|
#define __COMFORTABLE_SWIPE__gesture_index_cpp__
|
||||||
|
|
||||||
|
#include "_index.hpp"
|
||||||
|
#include "xdo_gesture.cpp"
|
||||||
|
#include "swipe_gesture.cpp"
|
||||||
|
#include "swipe_gesture.regex.cpp"
|
||||||
|
|
||||||
|
#endif /* __COMFORTABLE_SWIPE__gesture_index_cpp__ */
|
||||||
7
cpp/gesture/_index.hpp
Normal file
7
cpp/gesture/_index.hpp
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#ifndef __COMFORTABLE_SWIPE__gesture_index_hpp__
|
||||||
|
#define __COMFORTABLE_SWIPE__gesture_index_hpp__
|
||||||
|
|
||||||
|
#include "xdo_gesture.h"
|
||||||
|
#include "swipe_gesture.h"
|
||||||
|
|
||||||
|
#endif /* __COMFORTABLE_SWIPE__gesture_index_hpp__ */
|
||||||
@ -22,6 +22,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#include <iostream> // std::cout, std::endl
|
#include <iostream> // std::cout, std::endl
|
||||||
#include <string> // std::stoi, std::stof
|
#include <string> // std::stoi, std::stof
|
||||||
#include <regex> // std::regex, std::regex_match, std::cmatch
|
#include <regex> // std::regex, std::regex_match, std::cmatch
|
||||||
|
#include <ctime>
|
||||||
#include "swipe_gesture.h"
|
#include "swipe_gesture.h"
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
@ -140,8 +141,6 @@ namespace comfortable_swipe::gesture
|
|||||||
*/
|
*/
|
||||||
bool swipe_gesture::parse_line(const char * line)
|
bool swipe_gesture::parse_line(const char * line)
|
||||||
{
|
{
|
||||||
|
|
||||||
// prepare regex matchers (will only load at most once)
|
|
||||||
static const std::regex gesture_swipe_begin(swipe_gesture::GESTURE_BEGIN_REGEX_PATTERN);
|
static const std::regex gesture_swipe_begin(swipe_gesture::GESTURE_BEGIN_REGEX_PATTERN);
|
||||||
static const std::regex gesture_swipe_update(swipe_gesture::GESTURE_UPDATE_REGEX_PATTERN);
|
static const std::regex gesture_swipe_update(swipe_gesture::GESTURE_UPDATE_REGEX_PATTERN);
|
||||||
static const std::regex gesture_swipe_end(swipe_gesture::GESTURE_END_REGEX_PATTERN);
|
static const std::regex gesture_swipe_end(swipe_gesture::GESTURE_END_REGEX_PATTERN);
|
||||||
13
cpp/service/_index.cpp
Normal file
13
cpp/service/_index.cpp
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#ifndef __COMFORTABLE_SWIPE__service_index_cpp__
|
||||||
|
#define __COMFORTABLE_SWIPE__service_index_cpp__
|
||||||
|
|
||||||
|
#include "_index.hpp"
|
||||||
|
#include "buffer.cpp"
|
||||||
|
#include "debug.cpp"
|
||||||
|
#include "help.cpp"
|
||||||
|
#include "restart.cpp"
|
||||||
|
#include "start.cpp"
|
||||||
|
#include "status.cpp"
|
||||||
|
#include "stop.cpp"
|
||||||
|
|
||||||
|
#endif /* __COMFORTABLE_SWIPE__service_index_cpp__ */
|
||||||
24
cpp/service/_index.hpp
Normal file
24
cpp/service/_index.hpp
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#ifndef __COMFORTABLE_SWIPE__service_index_hpp__
|
||||||
|
#define __COMFORTABLE_SWIPE__service_index_hpp__
|
||||||
|
|
||||||
|
#include <map> // std::map
|
||||||
|
#include <string> // std::string
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
namespace comfortable_swipe
|
||||||
|
{
|
||||||
|
namespace service
|
||||||
|
{
|
||||||
|
void buffer();
|
||||||
|
void debug();
|
||||||
|
void help();
|
||||||
|
void restart();
|
||||||
|
void start();
|
||||||
|
void stop();
|
||||||
|
void status();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __COMFORTABLE_SWIPE__service_index_hpp__ */
|
||||||
82
cpp/service/_python.cpp
Normal file
82
cpp/service/_python.cpp
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
#ifndef __COMFORTABLE_SWIPE__service_python__
|
||||||
|
#define __COMFORTABLE_SWIPE__service_python__
|
||||||
|
|
||||||
|
#include "_index.hpp"
|
||||||
|
#include <Python.h>
|
||||||
|
|
||||||
|
// export as python module
|
||||||
|
namespace comfortable_swipe::service::python
|
||||||
|
{
|
||||||
|
#define __comfortable_swipe_void_method(method) \
|
||||||
|
static PyObject * \
|
||||||
|
method(PyObject * self, PyObject * args) \
|
||||||
|
{ \
|
||||||
|
comfortable_swipe::service::method(); \
|
||||||
|
Py_RETURN_NONE; \
|
||||||
|
}
|
||||||
|
|
||||||
|
// create the python method signatures
|
||||||
|
__comfortable_swipe_void_method(status);
|
||||||
|
__comfortable_swipe_void_method(start);
|
||||||
|
__comfortable_swipe_void_method(stop);
|
||||||
|
__comfortable_swipe_void_method(restart);
|
||||||
|
// __comfortable_swipe_void_method(autostart);
|
||||||
|
__comfortable_swipe_void_method(buffer);
|
||||||
|
__comfortable_swipe_void_method(help);
|
||||||
|
// __comfortable_swipe_void_method(config);
|
||||||
|
__comfortable_swipe_void_method(debug);
|
||||||
|
|
||||||
|
#undef __comfortable_swipe_void_method
|
||||||
|
|
||||||
|
// create the method list for C++
|
||||||
|
static PyMethodDef methods[] =
|
||||||
|
{
|
||||||
|
{ "status", &status, METH_VARARGS , "checks status of program, autostart, and config" },
|
||||||
|
{ "start", &start, METH_VARARGS , "starts 3/4-finger gesture service" },
|
||||||
|
{ "stop", &stop, METH_VARARGS , "stops 3/4-finger gesture service" },
|
||||||
|
{ "restart", &restart, METH_VARARGS , "stops then starts 3/4-finger gesture service" },
|
||||||
|
// { "autostart", &autostart, METH_VARARGS , "automatically run on startup (toggleable)" },
|
||||||
|
{ "buffer", &buffer, METH_VARARGS , "parses output of libinput debug-events" },
|
||||||
|
{ "help", &help, METH_VARARGS , "shows the help dialog" },
|
||||||
|
// { "config", &config, METH_VARARGS , "locates the config file " },
|
||||||
|
{ "debug", &debug, METH_VARARGS , "logs raw output from input events taken from libinput" },
|
||||||
|
{ NULL, NULL, 0, NULL } // sentinel
|
||||||
|
};
|
||||||
|
|
||||||
|
// create the module configuration
|
||||||
|
#if PY_MAJOR_VERSION >= 3
|
||||||
|
static struct PyModuleDef module_def =
|
||||||
|
{
|
||||||
|
PyModuleDef_HEAD_INIT,
|
||||||
|
"service",
|
||||||
|
"Comfortable swipe service",
|
||||||
|
-1,
|
||||||
|
methods
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
PyObject * module;
|
||||||
|
}
|
||||||
|
|
||||||
|
// initialize module
|
||||||
|
#if PY_MAJOR_VERSION >= 3
|
||||||
|
PyMODINIT_FUNC
|
||||||
|
PyInit_service(void)
|
||||||
|
{
|
||||||
|
using comfortable_swipe::service::python::module_def;
|
||||||
|
using comfortable_swipe::service::python::module;
|
||||||
|
if (module != NULL) return module;
|
||||||
|
return module = PyModule_Create(&module_def);
|
||||||
|
}
|
||||||
|
#else /* PY_MAJOR_VERSION < 3 */
|
||||||
|
PyMODINIT_FUNC
|
||||||
|
initservice(void)
|
||||||
|
{
|
||||||
|
using comfortable_swipe::service::python::methods;
|
||||||
|
using comfortable_swipe::service::python::module;
|
||||||
|
if (module != NULL) return;
|
||||||
|
module = Py_InitModule("service", methods);
|
||||||
|
}
|
||||||
|
#endif /* PY_MAJOR_VERSION */
|
||||||
|
|
||||||
|
#endif /* __COMFORTABLE_SWIPE__service_python__ */
|
||||||
@ -19,9 +19,10 @@ You should have received a copy of the GNU General Public License
|
|||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "../_macro.cpp"
|
||||||
|
#include "../util/_index.hpp"
|
||||||
|
#include "../gesture/_index.hpp"
|
||||||
#include <cstdio> // fgets_unlocked, stdin
|
#include <cstdio> // fgets_unlocked, stdin
|
||||||
#include <iostream> // std::ios, std::cout, std::cin
|
|
||||||
#include "../index.hpp"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Starts the comfortable-swipe service by buffering libinput debug-events.
|
* Starts the comfortable-swipe service by buffering libinput debug-events.
|
||||||
@ -30,13 +31,8 @@ namespace comfortable_swipe::service
|
|||||||
{
|
{
|
||||||
void buffer()
|
void buffer()
|
||||||
{
|
{
|
||||||
std::ios::sync_with_stdio(false);
|
|
||||||
std::cin.tie(0);
|
|
||||||
std::cout.tie(0);
|
|
||||||
std::cout.flush();
|
|
||||||
|
|
||||||
// read config file
|
// read config file
|
||||||
auto config = comfortable_swipe::util::read_config_file(comfortable_swipe::util::conf_filename());
|
auto config = comfortable_swipe::util::read_config_file(COMFORTABLE_SWIPE_CONFIG);
|
||||||
|
|
||||||
// initialize swipe gesture handler
|
// initialize swipe gesture handler
|
||||||
comfortable_swipe::gesture::swipe_gesture swipe_gesture_handler
|
comfortable_swipe::gesture::swipe_gesture swipe_gesture_handler
|
||||||
@ -20,7 +20,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <cstdio> // std::puts, std::printf
|
#include <cstdio> // std::puts, std::printf
|
||||||
#include "../index.hpp"
|
|
||||||
|
|
||||||
namespace comfortable_swipe::service
|
namespace comfortable_swipe::service
|
||||||
{
|
{
|
||||||
@ -29,7 +28,6 @@ namespace comfortable_swipe::service
|
|||||||
*/
|
*/
|
||||||
void help()
|
void help()
|
||||||
{
|
{
|
||||||
using comfortable_swipe::util::conf_filename;
|
|
||||||
std::puts("comfortable-swipe [start|stop|restart|autostart|buffer|help|config|debug|status]");
|
std::puts("comfortable-swipe [start|stop|restart|autostart|buffer|help|config|debug|status]");
|
||||||
std::puts("");
|
std::puts("");
|
||||||
std::puts("start - starts 3/4-finger gesture service");
|
std::puts("start - starts 3/4-finger gesture service");
|
||||||
@ -38,11 +36,9 @@ namespace comfortable_swipe::service
|
|||||||
std::puts("autostart - automatically run on startup (toggleable)");
|
std::puts("autostart - automatically run on startup (toggleable)");
|
||||||
std::puts("buffer - parses output of libinput debug-events");
|
std::puts("buffer - parses output of libinput debug-events");
|
||||||
std::puts("help - shows the help dialog");
|
std::puts("help - shows the help dialog");
|
||||||
std::puts("config - locates the config file [/usr/share/comfortable-swipe/comfortable-swipe.conf]");
|
std::puts("config - locates the config file");
|
||||||
std::puts("debug - logs raw output from input events taken from libinput");
|
std::puts("debug - logs raw output from input events taken from libinput");
|
||||||
std::puts("status - checks status of program and autostart");
|
std::puts("status - checks status of program and autostart");
|
||||||
std::puts("");
|
|
||||||
std::printf("Configuration file can be found in %s\n", conf_filename());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -19,7 +19,7 @@ You should have received a copy of the GNU General Public License
|
|||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../index.hpp"
|
#include "../service/_index.hpp"
|
||||||
|
|
||||||
namespace comfortable_swipe::service
|
namespace comfortable_swipe::service
|
||||||
{
|
{
|
||||||
@ -19,8 +19,10 @@ You should have received a copy of the GNU General Public License
|
|||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../index.hpp"
|
#include "_index.hpp"
|
||||||
|
#include <iostream> // std::cin, std::cout, std::ios
|
||||||
#include <cstdlib> // std::system
|
#include <cstdlib> // std::system
|
||||||
|
#include <unistd.h> // pipe, fork, perror, exit
|
||||||
|
|
||||||
namespace comfortable_swipe::service
|
namespace comfortable_swipe::service
|
||||||
{
|
{
|
||||||
@ -31,7 +33,30 @@ namespace comfortable_swipe::service
|
|||||||
*/
|
*/
|
||||||
void start()
|
void start()
|
||||||
{
|
{
|
||||||
(void) std::system(__COMFORTABLE_SWIPE__PROGRAM__ " debug | " __COMFORTABLE_SWIPE__PROGRAM__ " buffer");
|
std::ios::sync_with_stdio(false);
|
||||||
|
std::cin.tie(0);
|
||||||
|
std::cout.tie(0);
|
||||||
|
std::cout.flush();
|
||||||
|
|
||||||
|
// redirect stdout to stdin
|
||||||
|
int fd[2];
|
||||||
|
pipe(fd); // create the pipes
|
||||||
|
|
||||||
|
int child;
|
||||||
|
if ((child = fork()) == -1) {
|
||||||
|
perror("fork");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
if (child) {
|
||||||
|
dup2(fd[1], STDOUT_FILENO);
|
||||||
|
comfortable_swipe::service::debug();
|
||||||
|
close(fd[0]);
|
||||||
|
} else {
|
||||||
|
dup2(fd[0], STDIN_FILENO);
|
||||||
|
comfortable_swipe::service::buffer();
|
||||||
|
close(fd[1]);
|
||||||
|
}
|
||||||
|
comfortable_swipe::service::stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -19,7 +19,9 @@ You should have received a copy of the GNU General Public License
|
|||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../index.hpp"
|
#include "../_macro.cpp"
|
||||||
|
#include "../util/_index.hpp"
|
||||||
|
#include "../gesture/_index.hpp"
|
||||||
#include <stdexcept> // std::runtime_error
|
#include <stdexcept> // std::runtime_error
|
||||||
#include <unistd.h> // popen, pclose, getpid, access, F_OK
|
#include <unistd.h> // popen, pclose, getpid, access, F_OK
|
||||||
#include <memory> // std::unique_ptr
|
#include <memory> // std::unique_ptr
|
||||||
@ -35,45 +37,21 @@ namespace comfortable_swipe::service
|
|||||||
*/
|
*/
|
||||||
void status()
|
void status()
|
||||||
{
|
{
|
||||||
// check if comfortable-swipe is running
|
// std::printf("autostart is %s\n", autostart_on ? "ON" : "OFF");
|
||||||
bool running = false;
|
|
||||||
std::array<char, 128> buffer;
|
|
||||||
std::unique_ptr<FILE, decltype(&pclose)> pipe(popen("pgrep -f comfortable-swipe", "r"), pclose);
|
|
||||||
if (pipe && !std::feof(pipe.get()) && std::fgets(buffer.data(), buffer.size(), pipe.get()) != NULL)
|
|
||||||
{
|
|
||||||
int pid = std::atoi(buffer.data());
|
|
||||||
if (pid != getpid())
|
|
||||||
running = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if autostart is on
|
|
||||||
auto autostart_f = comfortable_swipe::util::autostart_filename();
|
|
||||||
bool autostart_on = access(autostart_f, F_OK) != -1;
|
|
||||||
|
|
||||||
// print status
|
|
||||||
std::printf("program is %s\n", running ? "ON" : "OFF");
|
|
||||||
std::printf("autostart is %s\n", autostart_on ? "ON" : "OFF");
|
|
||||||
std::printf("config file at %s\n", comfortable_swipe::util::conf_filename());
|
|
||||||
|
|
||||||
// check status of configuration file
|
// check status of configuration file
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
auto config = comfortable_swipe::util::read_config_file(comfortable_swipe::util::conf_filename());
|
std::puts(COMFORTABLE_SWIPE_CONFIG);
|
||||||
|
auto config = comfortable_swipe::util::read_config_file(COMFORTABLE_SWIPE_CONFIG);
|
||||||
// print keys and values of config file
|
|
||||||
std::printf("\nConfigurations:\n");
|
|
||||||
|
|
||||||
// print threshold
|
// print threshold
|
||||||
if (config.count("threshold") > 0)
|
if (config.count("threshold") > 0)
|
||||||
{
|
{
|
||||||
auto & threshold = config["threshold"];
|
auto & threshold = config["threshold"];
|
||||||
|
// std::cmatch matches;
|
||||||
// check if regex pattern matches threshold
|
// bool ok = (std::regex_match(threshold.data(), matches, std::regex("^\\d+(?:\\.\\d+)??$")) != 0);
|
||||||
std::cmatch matches;
|
|
||||||
bool ok = (std::regex_match(threshold.data(), matches, std::regex("^\\d+(?:\\.\\d+)??$")) != 0);
|
|
||||||
|
|
||||||
// print status of threshold
|
// print status of threshold
|
||||||
std::printf(" %9s is %s (%s)\n", "threshold", ok ? "OK" : "INVALID", threshold.data());
|
std::printf(" %9s = %s\n", "threshold", threshold.data()); // ok ? "VALID" : "INVALID"
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
std::printf(" %9s is OFF\n", "threshold");
|
std::printf(" %9s is OFF\n", "threshold");
|
||||||
@ -82,9 +60,9 @@ namespace comfortable_swipe::service
|
|||||||
for (auto &command : comfortable_swipe::gesture::swipe_gesture::command_map)
|
for (auto &command : comfortable_swipe::gesture::swipe_gesture::command_map)
|
||||||
{
|
{
|
||||||
if (config.count(command) > 0)
|
if (config.count(command) > 0)
|
||||||
std::printf(" %9s is OK (%s)\n", command, config[command].data());
|
std::printf(" %9s = %s\n", command, config[command].data());
|
||||||
else
|
else
|
||||||
std::printf(" %9s is OFF\n", command);
|
std::printf(" %9s NOT SET\n", command);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (const std::runtime_error& e)
|
catch (const std::runtime_error& e)
|
||||||
7
cpp/util/_index.cpp
Normal file
7
cpp/util/_index.cpp
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#ifndef __COMFORTABLE_SWIPE__util_index_cpp__
|
||||||
|
#define __COMFORTABLE_SWIPE__util_index_cpp__
|
||||||
|
|
||||||
|
#include "_index.hpp"
|
||||||
|
#include "read_config_file.cpp"
|
||||||
|
|
||||||
|
#endif /* __COMFORTABLE_SWIPE__util_index_cpp__ */
|
||||||
18
cpp/util/_index.hpp
Normal file
18
cpp/util/_index.hpp
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#ifndef __COMFORTABLE_SWIPE__util_index_hpp__
|
||||||
|
#define __COMFORTABLE_SWIPE__util_index_hpp__
|
||||||
|
|
||||||
|
#include <map> // std::map
|
||||||
|
#include <string> // std::string
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
namespace comfortable_swipe
|
||||||
|
{
|
||||||
|
namespace util
|
||||||
|
{
|
||||||
|
std::map<std::string, std::string> read_config_file(const char*);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __COMFORTABLE_SWIPE__util_index_hpp__ */
|
||||||
82
install
82
install
@ -1,82 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# prefer running as root
|
|
||||||
DIR=$(dirname $0)
|
|
||||||
PROGRAM=/usr/local/bin/comfortable-swipe
|
|
||||||
COMPILE=$DIR/comfortable-swipe.compile.sh
|
|
||||||
CONF_PATH=/usr/local/share/comfortable-swipe/comfortable-swipe.conf
|
|
||||||
DCONF_PATH=$DIR/defaults.conf
|
|
||||||
OLD_CONF_PATH=${XDG_CONFIG_HOME:-$HOME/.config}/comfortable-swipe.conf
|
|
||||||
|
|
||||||
if [ -x "$(command -v $PROGRAM)" ]; then
|
|
||||||
# stop any running comfortable-swipe if it exists
|
|
||||||
$PROGRAM stop
|
|
||||||
fi
|
|
||||||
|
|
||||||
#copy config file
|
|
||||||
abort () {
|
|
||||||
exec echo "Installation aborted"
|
|
||||||
}
|
|
||||||
sudo mkdir -p $(dirname $CONF_PATH) || abort
|
|
||||||
|
|
||||||
# check if "-y" or "--yes" is passed as an argument
|
|
||||||
YES=false
|
|
||||||
while test $# -gt 0
|
|
||||||
do
|
|
||||||
case "$1" in
|
|
||||||
-y) YES=true
|
|
||||||
;;
|
|
||||||
--yes) YES=true
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
sudo chown $USER $(dirname $CONF_PATH)
|
|
||||||
if [ ! -f $CONF_PATH ]; then
|
|
||||||
if [ ! -f $OLD_CONF_PATH ]; then
|
|
||||||
# old config file not found, create from scratch
|
|
||||||
cat $DCONF_PATH > $CONF_PATH || abort
|
|
||||||
else
|
|
||||||
# old config file found, move to the new path
|
|
||||||
cat $OLD_CONF_PATH > $CONF_PATH || abort
|
|
||||||
echo "Configuration copied from $OLD_CONF_PATH to $CONF_PATH"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
# config file found, ask user if overwrite
|
|
||||||
echo "Old conf file found in $CONF_PATH"
|
|
||||||
if [ $YES == false ]; then
|
|
||||||
read -r -p "Keep the old conf file? (default: yes) [Y/n] " response
|
|
||||||
response=${response,,} # tolower
|
|
||||||
if [[ "$response" =~ ^(no|n)$ ]]; then
|
|
||||||
read -r -p "Conf file will be overwritten. Are you sure? [Y/n] " response
|
|
||||||
response=${response,,}
|
|
||||||
if [[ "$response" =~ ^(yes|y)$ ]]; then
|
|
||||||
cat $DCONF_PATH > $CONF_PATH || abort
|
|
||||||
else
|
|
||||||
abort
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Installing..."
|
|
||||||
|
|
||||||
# remove existing comfortable-swipe
|
|
||||||
if [ -x "$(command -v $PROGRAM)" ]; then
|
|
||||||
sudo rm -f $(which comfortable-swipe)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# compile library
|
|
||||||
sudo $COMPILE $PROGRAM || abort
|
|
||||||
|
|
||||||
# add permissions to input group (defer)
|
|
||||||
# GROUP=$(ls -l /dev/input/event* | awk '{print $4}' | head --line=1) || abort
|
|
||||||
|
|
||||||
# toggle autostart twice to refresh any changes
|
|
||||||
$PROGRAM autostart > /dev/null || abort
|
|
||||||
$PROGRAM autostart > /dev/null || abort
|
|
||||||
|
|
||||||
echo "Successfully installed comfortable-swipe."
|
|
||||||
echo "Configuration file is located at $CONF_PATH"
|
|
||||||
echo ""
|
|
||||||
echo "Try running 'comfortable-swipe start' to test."
|
|
||||||
@ -1,44 +0,0 @@
|
|||||||
#ifndef __COMFORTABLE_SWIPE__
|
|
||||||
#define __COMFORTABLE_SWIPE__
|
|
||||||
|
|
||||||
/*
|
|
||||||
Comfortable Swipe
|
|
||||||
by Rico Tiongson
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "index.hpp"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Make sure to include all implementation (.cpp) files below to be ready for export.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "gesture/xdo_gesture.cpp"
|
|
||||||
#include "gesture/swipe_gesture.cpp"
|
|
||||||
#include "gesture/swipe_gesture.regex.cpp"
|
|
||||||
#include "service/autostart.cpp"
|
|
||||||
#include "service/buffer.cpp"
|
|
||||||
#include "service/config.cpp"
|
|
||||||
#include "service/debug.cpp"
|
|
||||||
#include "service/help.cpp"
|
|
||||||
#include "service/restart.cpp"
|
|
||||||
#include "service/start.cpp"
|
|
||||||
#include "service/status.cpp"
|
|
||||||
#include "service/stop.cpp"
|
|
||||||
#include "util/autostart_filename.cpp"
|
|
||||||
#include "util/conf_filename.cpp"
|
|
||||||
#include "util/read_config_file.cpp"
|
|
||||||
|
|
||||||
#endif /* __COMFORTABLE_SWIPE__ */
|
|
||||||
@ -1,64 +0,0 @@
|
|||||||
#ifndef __COMFORTABLE_SWIPE__index_hpp__
|
|
||||||
#define __COMFORTABLE_SWIPE__index_hpp__
|
|
||||||
|
|
||||||
/*
|
|
||||||
Comfortable Swipe
|
|
||||||
by Rico Tiongson
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// global defines
|
|
||||||
#ifndef __COMFORTABLE_SWIPE__PROGRAM__
|
|
||||||
#define __COMFORTABLE_SWIPE__PROGRAM__ "/usr/local/bin/comfortable-swipe"
|
|
||||||
#endif /* __COMFORTABLE_SWIPE__PROGRAM__ */
|
|
||||||
|
|
||||||
#ifndef __COMFORTABLE_SWIPE__CONFIG__
|
|
||||||
#define __COMFORTABLE_SWIPE__CONFIG__ "/usr/local/share/comfortable-swipe/comfortable-swipe.conf"
|
|
||||||
#endif /* __COMFORTABLE_SWIPE__CONFIG__ */
|
|
||||||
|
|
||||||
#include <map> // std::map
|
|
||||||
#include <string> // std::string
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Make sure to include your header files here so that they can be imported by other modules.
|
|
||||||
*/
|
|
||||||
#include "gesture/xdo_gesture.h"
|
|
||||||
#include "gesture/swipe_gesture.h"
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
namespace comfortable_swipe
|
|
||||||
{
|
|
||||||
namespace util
|
|
||||||
{
|
|
||||||
const char* autostart_filename();
|
|
||||||
constexpr const char* conf_filename();
|
|
||||||
std::map<std::string, std::string> read_config_file(const char*);
|
|
||||||
}
|
|
||||||
namespace service
|
|
||||||
{
|
|
||||||
void autostart();
|
|
||||||
void buffer();
|
|
||||||
void config();
|
|
||||||
void debug();
|
|
||||||
void help();
|
|
||||||
void restart();
|
|
||||||
void start();
|
|
||||||
void status();
|
|
||||||
void stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* __COMFORTABLE_SWIPE__index_hpp__ */
|
|
||||||
@ -1,75 +0,0 @@
|
|||||||
#ifndef __COMFORTABLE_SWIPE__service_autostart__
|
|
||||||
#define __COMFORTABLE_SWIPE__service_autostart__
|
|
||||||
|
|
||||||
/*
|
|
||||||
Comfortable Swipe
|
|
||||||
by Rico Tiongson
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <iostream> // std::cerr, std::cout, std::endl
|
|
||||||
#include <fstream> // std::ifstream, std::ofstream
|
|
||||||
#include <string> // std::string
|
|
||||||
#include <cstdio> // std::remove
|
|
||||||
#include <cstdlib> // std::system
|
|
||||||
#include "../index.hpp"
|
|
||||||
|
|
||||||
namespace comfortable_swipe::service
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Toggles automatic startup of comfortable swipe.
|
|
||||||
*/
|
|
||||||
void autostart()
|
|
||||||
{
|
|
||||||
using comfortable_swipe::util::autostart_filename;
|
|
||||||
|
|
||||||
const std::string& path = autostart_filename();
|
|
||||||
if (std::ifstream(path.data()).good())
|
|
||||||
{
|
|
||||||
// file found, delete it
|
|
||||||
if (std::remove(path.data()) != 0)
|
|
||||||
std::cerr << "Error: failed to switch off autostart. "
|
|
||||||
<< "Maybe the autostart file is in use?"
|
|
||||||
<< std::endl;
|
|
||||||
else
|
|
||||||
std::cout << "Autostart switched off" << std::endl;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// file not found, create it
|
|
||||||
int result = std::system(("mkdir -p $(dirname " + path + ")").data());
|
|
||||||
std::ofstream fout(path.data());
|
|
||||||
if (result != 0 || !fout.good())
|
|
||||||
std::cerr << "Error: failed to switch on autostart. "
|
|
||||||
<< "Are you sure you have the permissions?"
|
|
||||||
<< std::endl;
|
|
||||||
else {
|
|
||||||
fout <<
|
|
||||||
"[Desktop Entry]\n"
|
|
||||||
"Type=Application\n"
|
|
||||||
"Exec=bash -c \""
|
|
||||||
__COMFORTABLE_SWIPE__PROGRAM__
|
|
||||||
" start\"\n"
|
|
||||||
"Hidden=false\n"
|
|
||||||
"NoDisplay=false\n"
|
|
||||||
"X-GNOME-Autostart-enabled=true\n"
|
|
||||||
"Name=Comfortable Swipe\n"
|
|
||||||
"Comment=3 or 4 touchpad gestures\n";
|
|
||||||
std::cout << "Autostart switched on" << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* __COMFORTABLE_SWIPE__service_autostart__ */
|
|
||||||
@ -1,38 +0,0 @@
|
|||||||
#ifndef __COMFORTABLE_SWIPE__service_config__
|
|
||||||
#define __COMFORTABLE_SWIPE__service_config__
|
|
||||||
|
|
||||||
/*
|
|
||||||
Comfortable Swipe
|
|
||||||
by Rico Tiongson
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "../index.hpp"
|
|
||||||
#include <cstdio> // std::puts
|
|
||||||
|
|
||||||
namespace comfortable_swipe::service
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Prints where the config file of comfortable swipe is located.
|
|
||||||
*
|
|
||||||
* Usage: nano $(comfortable-swipe config)
|
|
||||||
*/
|
|
||||||
void config()
|
|
||||||
{
|
|
||||||
std::puts(comfortable_swipe::util::conf_filename());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* __COMFORTABLE_SWIPE__service_config__ */
|
|
||||||
@ -1,46 +0,0 @@
|
|||||||
#ifndef __COMFORTABLE_SWIPE__util_autostart_filename__
|
|
||||||
#define __COMFORTABLE_SWIPE__util_autostart_filename__
|
|
||||||
|
|
||||||
/*
|
|
||||||
Comfortable Swipe
|
|
||||||
by Rico Tiongson
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string> // std::string
|
|
||||||
#include <unistd.h> // getenv
|
|
||||||
|
|
||||||
namespace comfortable_swipe::util
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* The path where the autostart configuration is located.
|
|
||||||
*/
|
|
||||||
const char* autostart_filename()
|
|
||||||
{
|
|
||||||
static std::string filename;
|
|
||||||
if (filename.empty()) {
|
|
||||||
const char* xdg_config = getenv("XDG_CONFIG_HOME");
|
|
||||||
std::string config(
|
|
||||||
xdg_config == NULL
|
|
||||||
? std::string(getenv("HOME")) + "/.config"
|
|
||||||
: xdg_config
|
|
||||||
);
|
|
||||||
filename = config + "/autostart/comfortable-swipe.desktop";
|
|
||||||
}
|
|
||||||
return filename.data();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* __COMFORTABLE_SWIPE__util_autostart_filename__ */
|
|
||||||
158
setup.py
Normal file
158
setup.py
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import setuptools
|
||||||
|
|
||||||
|
from shutil import copyfile
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
from setuptools.extension import Extension
|
||||||
|
from setuptools.command.develop import develop
|
||||||
|
from setuptools.command.install import install
|
||||||
|
from setuptools.command.easy_install import easy_install
|
||||||
|
from wheel.bdist_wheel import bdist_wheel
|
||||||
|
|
||||||
|
|
||||||
|
VERSION = '1.1.0-beta'
|
||||||
|
__CWD__ = os.getcwd()
|
||||||
|
__DIR__ = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
__URL__ = 'https://github.com/Hikari9/comfortable-swipe-ubuntu'
|
||||||
|
|
||||||
|
extension_names = ['service']
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
# make sure working directory is here
|
||||||
|
os.chdir(__DIR__)
|
||||||
|
|
||||||
|
|
||||||
|
# save README as long_description
|
||||||
|
with open('README.md', 'r') as README_file:
|
||||||
|
README = README_file.read()
|
||||||
|
|
||||||
|
|
||||||
|
# match constants with source
|
||||||
|
from comfortable_swipe.constants import *
|
||||||
|
|
||||||
|
# include old conf paths to list from previous versions
|
||||||
|
conf_paths = [
|
||||||
|
DEFAULT_CONFIG,
|
||||||
|
os.path.join(os.getenv('HOME', ''), '.config', 'comfortable-swipe', 'comfortable-swipe.conf'),
|
||||||
|
os.path.join('/usr/local/share', 'comfortable-swipe', 'comfortable-swipe.conf'),
|
||||||
|
CONFIG
|
||||||
|
]
|
||||||
|
|
||||||
|
# for C++ library
|
||||||
|
cpp_macros = dict(
|
||||||
|
COMFORTABLE_SWIPE_VERSION='"{}"'.format(VERSION),
|
||||||
|
COMFORTABLE_SWIPE_CONFIG='"{}"'.format(CONFIG)
|
||||||
|
)
|
||||||
|
|
||||||
|
# read C++ libraries for comfortable swipe
|
||||||
|
extensions = [Extension(
|
||||||
|
name='{}.cpp.{}'.format(PYTHON_NAME, extension_name),
|
||||||
|
define_macros=list(cpp_macros.items()),
|
||||||
|
sources=[os.path.join('cpp', '_python.cpp')],
|
||||||
|
extra_compile_args=['-O2', '-Wno-unused-result'],
|
||||||
|
libraries=['xdo']
|
||||||
|
) for extension_name in extension_names]
|
||||||
|
|
||||||
|
|
||||||
|
class Command:
|
||||||
|
outer_installer = None
|
||||||
|
outer_uninstaller = None
|
||||||
|
|
||||||
|
def pre_install(self):
|
||||||
|
# make sure only outer install script will run post_install
|
||||||
|
if self.__class__.outer_installer is not None: return
|
||||||
|
self.__class__.outer_installer = self
|
||||||
|
print('running pre_install')
|
||||||
|
|
||||||
|
def post_install(self):
|
||||||
|
# make sure post_install will only run when command is outer installer
|
||||||
|
if self.__class__.outer_installer is not self: return
|
||||||
|
print('running post_install')
|
||||||
|
|
||||||
|
# create program/config directories
|
||||||
|
if not os.path.exists(os.path.dirname(CONFIG)):
|
||||||
|
os.makedirs(os.path.dirname(CONFIG))
|
||||||
|
|
||||||
|
# copy any of the old config files
|
||||||
|
conf_files = [path for path in conf_paths if os.path.exists(path) and os.path.isfile(path)]
|
||||||
|
print('Using configuration file at', conf_files[-1])
|
||||||
|
|
||||||
|
if conf_files[-1] != CONFIG:
|
||||||
|
# new installation or upgrading from old version, copy to new location
|
||||||
|
copyfile(conf_files[-1], CONFIG)
|
||||||
|
if conf_files[-1] == DEFAULT_CONFIG:
|
||||||
|
# new installation - copy default configuration
|
||||||
|
print('Copying configuration file to', CONFIG)
|
||||||
|
else:
|
||||||
|
# upgrading - delete the deprecated config file (failsafe)
|
||||||
|
print('warning: depcrecated configuration file at', conf_files[-1])
|
||||||
|
print(' you have to remove this manually')
|
||||||
|
|
||||||
|
# enable autostart by default
|
||||||
|
from comfortable_swipe import autostart
|
||||||
|
autostart.set_status(autostart.ON)
|
||||||
|
print('Autostart created at', autostart.target_path())
|
||||||
|
print('\nInstallation successful\nTry running: {} start'.format(NAME))
|
||||||
|
|
||||||
|
def pre_uninstall(self):
|
||||||
|
# make sure only outer uninstall script will run post_uninstall
|
||||||
|
if self.__class__.outer_uninstaller is not None: return
|
||||||
|
self.__class__.outer_uninstaller = self
|
||||||
|
print('running pre_uninstall')
|
||||||
|
|
||||||
|
|
||||||
|
def post_uninstall(self):
|
||||||
|
# make sure post_uninstall will only run when command is outer uninstaller
|
||||||
|
if self.__class__.outer_uninstaller is not self: return
|
||||||
|
print('running post_uninstall')
|
||||||
|
from comfortable_swipe import autostart
|
||||||
|
if autostart.get_status() is autostart.ON:
|
||||||
|
print('Removing autostart at', autostart.target_path())
|
||||||
|
autostart.set_status(autostart.OFF)
|
||||||
|
|
||||||
|
# add post_install script to install method
|
||||||
|
def wrap_command(base_cls, uninstall=False):
|
||||||
|
class InstallCommand(Command, base_cls):
|
||||||
|
def run(self):
|
||||||
|
self.pre_uninstall() if uninstall and self.uninstall else self.pre_install()
|
||||||
|
base_cls.run(self)
|
||||||
|
self.post_uninstall() if uninstall and self.uninstall else self.post_install()
|
||||||
|
|
||||||
|
InstallCommand.__name__ = base_cls.__name__
|
||||||
|
return InstallCommand
|
||||||
|
|
||||||
|
# Override command classes here
|
||||||
|
cmdclass = dict(
|
||||||
|
install=wrap_command(install),
|
||||||
|
easy_install=wrap_command(easy_install),
|
||||||
|
develop=wrap_command(develop, uninstall=True),
|
||||||
|
bdist_wheel=wrap_command(bdist_wheel)
|
||||||
|
)
|
||||||
|
|
||||||
|
# setup python script
|
||||||
|
setup_script = setup(
|
||||||
|
name=NAME,
|
||||||
|
version=VERSION,
|
||||||
|
description=DESCRIPTION,
|
||||||
|
long_description=README,
|
||||||
|
license='MIT',
|
||||||
|
author='Rico Tiongson',
|
||||||
|
author_email='thericotiongson@gmail.com',
|
||||||
|
url=__URL__,
|
||||||
|
zip_safe=False,
|
||||||
|
packages=find_packages(),
|
||||||
|
include_package_data=True,
|
||||||
|
entry_points=dict(console_scripts=['{}={}.__main__:main'.format(NAME, PYTHON_NAME)]),
|
||||||
|
ext_modules=extensions,
|
||||||
|
cmdclass=cmdclass,
|
||||||
|
install_requires=['psutil']
|
||||||
|
)
|
||||||
|
|
||||||
|
finally:
|
||||||
|
# move working directory back to where it was before
|
||||||
|
os.chdir(__CWD__)
|
||||||
@ -1,7 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
echo "Uninstalling..."
|
|
||||||
rm ${XDG_CONFIG_HOME:-$HOME/.config}/autostart/comfortable-swipe.desktop 2> /dev/null
|
|
||||||
comfortable-swipe stop 2> /dev/null
|
|
||||||
rm $HOME/.local/bin/comfortable-swipe 2> /dev/null # compat
|
|
||||||
sudo rm /usr/local/bin/comfortable-swipe 2> /dev/null
|
|
||||||
echo "Successfully uninstalled comfortable-swipe"
|
|
||||||
Loading…
Reference in New Issue
Block a user