Add util module
This commit is contained in:
parent
85aa6c1c0f
commit
be9d711d6f
28
src/comfortable_swipe/util/autostart_filename.cpp
Normal file
28
src/comfortable_swipe/util/autostart_filename.cpp
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#ifndef __COMFORTABLE_SWIPE__util_conf_filename__
|
||||||
|
#define __COMFORTABLE_SWIPE__util_conf_filename__
|
||||||
|
|
||||||
|
#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_conf_filename__ */
|
||||||
17
src/comfortable_swipe/util/conf_filename.cpp
Normal file
17
src/comfortable_swipe/util/conf_filename.cpp
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#ifndef __COMFORTABLE_SWIPE__util_conf_filename__
|
||||||
|
#define __COMFORTABLE_SWIPE__util_conf_filename__
|
||||||
|
|
||||||
|
#include "../index.hpp"
|
||||||
|
|
||||||
|
namespace comfortable_swipe::util
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The path where the configuration file is located.
|
||||||
|
*/
|
||||||
|
constexpr const char* conf_filename()
|
||||||
|
{
|
||||||
|
return __COMFORTABLE_SWIPE__CONFIG__;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __COMFORTABLE_SWIPE__util_conf_filename__ */
|
||||||
78
src/comfortable_swipe/util/read_config_file.cpp
Normal file
78
src/comfortable_swipe/util/read_config_file.cpp
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
#include <map> // std::map
|
||||||
|
#include <string> // std::string
|
||||||
|
#include <fstream> // std::ifstream
|
||||||
|
#include <iostream> // std::cerr, std::endl, std::getline
|
||||||
|
#include <cstdlib> // exit
|
||||||
|
#include <cctype> // std::isspace
|
||||||
|
|
||||||
|
namespace comfortable_swipe::util
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* A utility method for reading the config file.
|
||||||
|
*
|
||||||
|
* @param filename (const char*) the path of the config file.
|
||||||
|
*/
|
||||||
|
std::map<std::string, std::string> read_config_file(const char* filename)
|
||||||
|
{
|
||||||
|
|
||||||
|
std::map<std::string, std::string> conf;
|
||||||
|
std::ifstream fin(filename);
|
||||||
|
|
||||||
|
if (!fin.is_open())
|
||||||
|
{
|
||||||
|
std::cerr << "file \"" << filename << "\" does not exist!" << std::endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string line, token[2];
|
||||||
|
int line_number = 0;
|
||||||
|
|
||||||
|
while (std::getline(fin, line))
|
||||||
|
{
|
||||||
|
++line_number;
|
||||||
|
token[0].clear();
|
||||||
|
token[1].clear();
|
||||||
|
int length = line.length();
|
||||||
|
int equal_flag = 0;
|
||||||
|
|
||||||
|
// tokenize comfig config
|
||||||
|
for (int i = 0; i < length; ++i)
|
||||||
|
{
|
||||||
|
if (line[i] == '#') // skip comments
|
||||||
|
break;
|
||||||
|
if (line[i] == '=') // flag equal sign
|
||||||
|
{
|
||||||
|
if (++equal_flag > 1)
|
||||||
|
{
|
||||||
|
std::cerr << "error in conf file " << filename << std::endl;
|
||||||
|
std::cerr << "multiple equal signs in line " << line_number << std::endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!std::isspace(line[i]))
|
||||||
|
{
|
||||||
|
// add to buffer
|
||||||
|
token[equal_flag].push_back(line[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ignore empty lines
|
||||||
|
if (equal_flag == 0 && token[0].length() == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// no equal sign found in non-empty line
|
||||||
|
if (equal_flag == 0)
|
||||||
|
{
|
||||||
|
std::cerr << "error in conf file: " << filename << std::endl;
|
||||||
|
std::cerr << "equal sign expected in line " << line_number << std::endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// equal sign found, add to tokens
|
||||||
|
if (token[1].length() > 0)
|
||||||
|
conf[token[0]] = token[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
return conf;
|
||||||
|
}
|
||||||
|
}
|
||||||
71
src/comfortable_swipe/util/regex.cpp
Normal file
71
src/comfortable_swipe/util/regex.cpp
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
#ifndef __COMFORTABLE_SWIPE__util_regex__
|
||||||
|
#define __COMFORTABLE_SWIPE__util_regex__
|
||||||
|
|
||||||
|
namespace comfortable_swipe::util
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Regex pattern for the libinput entry for start of swipe.
|
||||||
|
* Extracts one match for the number of fingers used during the swipe.
|
||||||
|
*
|
||||||
|
* eg. event15 GESTURE_SWIPE_BEGIN +34.33s 3
|
||||||
|
* ^
|
||||||
|
* fingers
|
||||||
|
*/
|
||||||
|
const char* GESTURE_SWIPE_BEGIN_REGEX_PATTERN =
|
||||||
|
"^" // start of string
|
||||||
|
"[ -]event\\d+" // event
|
||||||
|
"\\s+GESTURE_SWIPE_BEGIN" // gesture
|
||||||
|
"\\s+\\S+" // timestamp
|
||||||
|
"\\s+(\\d+)" // fingers
|
||||||
|
"\\s*$" // end of string
|
||||||
|
;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Regex pattern for the libinput entry for the end of swipe.
|
||||||
|
* Extracts one match for the number of fingers used during the swipe.
|
||||||
|
*
|
||||||
|
* eg. event15 GESTURE_SWIPE_END +35.03s 3
|
||||||
|
* ^
|
||||||
|
* fingers
|
||||||
|
*/
|
||||||
|
const char* GESTURE_SWIPE_END_REGEX_PATTERN =
|
||||||
|
"^" // start of string
|
||||||
|
"[ -]event\\d+" // event
|
||||||
|
"\\s+GESTURE_SWIPE_END" // gesture
|
||||||
|
"\\s+\\S+" // timestamp
|
||||||
|
"\\s+(\\d+)" // fingers
|
||||||
|
"\\s*$" // end of string
|
||||||
|
;
|
||||||
|
|
||||||
|
// matches signed decimal numbers (eg. "6.02" "-1.1")
|
||||||
|
#define CF_NUMBER_REGEX "-?\\d+(?:\\.\\d+)"
|
||||||
|
|
||||||
|
// matches and extracts a space-prefixed signed fraction (eg. "-3.00/ 5.12")
|
||||||
|
#define CF_NUMBER_DIVISION "\\s*(" CF_NUMBER_REGEX ")/\\s*(" CF_NUMBER_REGEX ")"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Regex pattern for the libinput entry for during a swipe.
|
||||||
|
* Extracts number of fingers used and the speed (normal and accelerated) of the swipe.
|
||||||
|
*
|
||||||
|
* eg. event15 GESTURE_SWIPE_UPDATE +34.70s 3 -0.12/ 4.99 (-0.33/13.50 unaccelerated)
|
||||||
|
* ^ ^ ^ ^ ^
|
||||||
|
* fingers dx dy udx udy
|
||||||
|
*/
|
||||||
|
const char* GESTURE_SWIPE_UPDATE_REGEX_PATTERN =
|
||||||
|
"^" // start of string
|
||||||
|
"[ -]event\\d+" // event
|
||||||
|
"\\s+GESTURE_SWIPE_UPDATE" // gesture
|
||||||
|
"\\s+\\S+" // timestamp
|
||||||
|
"\\s+(\\d+)" // fingers
|
||||||
|
"\\s+" CF_NUMBER_DIVISION // speed (dx/dy)
|
||||||
|
"\\s+\\(" CF_NUMBER_DIVISION "\\s+unaccelerated\\)" // unaccelerated speed (udx/udy)
|
||||||
|
"\\s*$" // end of string
|
||||||
|
;
|
||||||
|
|
||||||
|
// delete macros
|
||||||
|
#undef CF_NUMBER_DIVISION
|
||||||
|
#undef CF_NUMBER_EXTRACT
|
||||||
|
#undef CF_NUMBER_REGEX
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __COMFORTABLE_SWIPE__util_regex__ */
|
||||||
Loading…
Reference in New Issue
Block a user