diff --git a/lib/gesture/swipe_gesture.cpp b/lib/gesture/swipe_gesture.cpp
index f2d0c02..dc30766 100644
--- a/lib/gesture/swipe_gesture.cpp
+++ b/lib/gesture/swipe_gesture.cpp
@@ -20,7 +20,9 @@ along with this program. If not, see .
*/
#include // std::cout, std::endl
-#include "xdo_gesture.h"
+#include // std::stoi, std::stof
+#include // std::regex, std::regex_match, std::cmatch
+#include "swipe_gesture.h"
extern "C"
{
@@ -127,6 +129,65 @@ namespace comfortable_swipe::gesture
void swipe_gesture::end()
{ }
+ /**
+ * Dispatches begin/update/end depending on the regex pattern provided by this class.
+ *
+ * @param line the line from libinput debug-events to parse
+ * @return true if begin/update/end was dispatched
+ */
+ 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_update(swipe_gesture::GESTURE_UPDATE_REGEX_PATTERN);
+ static const std::regex gesture_swipe_end(swipe_gesture::GESTURE_END_REGEX_PATTERN);
+
+ // prepare holder for regex matches
+ static std::cmatch matches;
+
+ if (this->flag_swiping)
+ {
+ // currently swiping
+ if (std::regex_match(line, matches, gesture_swipe_update) != 0)
+ {
+ // assign necessary variables for swipe update
+ this->fingers = std::stoi(matches[1]);
+ this->dx = std::stof(matches[2]);
+ this->dy = std::stof(matches[3]);
+ this->udx = std::stof(matches[4]);
+ this->udy = std::stof(matches[5]);
+ // dispatch update
+ this->update();
+ return true;
+ }
+ else if (std::regex_match(line, matches, gesture_swipe_end) != 0)
+ {
+ // assign necessary variables for swipe end
+ this->flag_swiping = false;
+ this->fingers = std::stoi(matches[1]);
+ // dispatch end
+ this->end();
+ return true;
+ }
+ }
+ else
+ {
+ // not swiping, check if swipe will begin
+ if (std::regex_match(line, matches, gesture_swipe_begin) != 0)
+ {
+ // assign necessary variables for swipe begin
+ this->flag_swiping = true;
+ this->fingers = std::stoi(matches[1]);
+ // dispatch begin
+ this->begin();
+ return true;
+ }
+ }
+
+ return false;
+ }
+
/* STATICS DEFINITIONS */
const int swipe_gesture::MSK_THREE_FINGERS = 0;
const int swipe_gesture::MSK_FOUR_FINGERS = 1;
diff --git a/lib/gesture/swipe_gesture.h b/lib/gesture/swipe_gesture.h
index 4061aec..86ec3bd 100644
--- a/lib/gesture/swipe_gesture.h
+++ b/lib/gesture/swipe_gesture.h
@@ -52,7 +52,8 @@ namespace comfortable_swipe::gesture
void begin() override;
void update() override;
void end() override;
-
+ bool parse_line(const char *) override;
+
protected:
// location of mouse
int screen_num, ix, iy;
@@ -62,6 +63,9 @@ namespace comfortable_swipe::gesture
int previous_gesture;
const char ** commands;
+ // optimization flag for checking if GESTURE_SWIPE_BEGIN was dispatched
+ bool flag_swiping;
+
public:
// static constants
static const int MSK_THREE_FINGERS;
diff --git a/lib/gesture/xdo_gesture.h b/lib/gesture/xdo_gesture.h
index ef9d181..37eb157 100644
--- a/lib/gesture/xdo_gesture.h
+++ b/lib/gesture/xdo_gesture.h
@@ -45,6 +45,7 @@ namespace comfortable_swipe
virtual void begin() = 0;
virtual void update() = 0;
virtual void end() = 0;
+ virtual bool parse_line(const char *) = 0;
};
}
}
diff --git a/lib/service/buffer.cpp b/lib/service/buffer.cpp
index f3c9517..14b421a 100644
--- a/lib/service/buffer.cpp
+++ b/lib/service/buffer.cpp
@@ -19,9 +19,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
-#include // std::stoi, std::stof
#include // std::fgets_unlocked, stdin
-#include // std::regex, std::regex_match, std::cmatch
#include "../index.hpp"
/**
@@ -34,13 +32,8 @@ namespace comfortable_swipe::service
// read config file
auto config = comfortable_swipe::util::read_config_file(comfortable_swipe::util::conf_filename());
- // pre-compile regex patterns
- static const std::regex gesture_swipe_begin(comfortable_swipe::gesture::swipe_gesture::GESTURE_BEGIN_REGEX_PATTERN);
- static const std::regex gesture_swipe_update(comfortable_swipe::gesture::swipe_gesture::GESTURE_UPDATE_REGEX_PATTERN);
- static const std::regex gesture_swipe_end(comfortable_swipe::gesture::swipe_gesture::GESTURE_END_REGEX_PATTERN);
-
// initialize swipe gesture handler
- comfortable_swipe::gesture::swipe_gesture swipe
+ comfortable_swipe::gesture::swipe_gesture swipe_gesture_handler
(
config.count("threshold") ? std::stof(config["threshold"]) : 0.0,
config["left3"].c_str(),
@@ -56,47 +49,12 @@ namespace comfortable_swipe::service
// prepare data containers
static const int MAX_LINE_LENGTH = 256;
static char data[MAX_LINE_LENGTH];
- static std::cmatch matches;
-
- // optimization flag for checking if GESTURE_SWIPE_BEGIN was dispatched
- bool flag_swiping = false;
// start reading lines from input one by one
while (fgets_unlocked(data, MAX_LINE_LENGTH, stdin) != NULL)
{
- if (flag_swiping)
- {
- // currently swiping
- if (std::regex_match(data, matches, gesture_swipe_update) != 0)
- {
- // update swipe
- swipe.fingers = std::stoi(matches[1]);
- swipe.dx = std::stof(matches[2]);
- swipe.dy = std::stof(matches[3]);
- swipe.udx = std::stof(matches[4]);
- swipe.udy = std::stof(matches[5]);
- swipe.update();
- }
- else if (std::regex_match(data, matches, gesture_swipe_end) != 0)
- {
- // end swipe
- flag_swiping = false;
- swipe.fingers = std::stoi(matches[1]);
- swipe.end();
- }
- }
- else /* !flag_swiping */
- {
- // not swiping, check if swipe will begin
- if (std::regex_match(data, matches, gesture_swipe_begin) != 0)
- {
- // begin swipe
- flag_swiping = true;
- swipe.fingers = std::stoi(matches[1]);
- swipe.begin();
- }
- }
-
+ // attempt to parse swipe gestures
+ swipe_gesture_handler.parse_line(data);
}
}
}