#ifndef __COMFORTABLE_SWIPE__service_buffer__ #define __COMFORTABLE_SWIPE__service_buffer__ /* 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 . */ #include // std::stoi, std::stof #include // std::fgets_unlocked, stdin #include // std::regex, std::regex_match, std::cmatch #include "../index.hpp" /** * Starts the comfortable-swipe service by buffering libinput debug-events. */ namespace comfortable_swipe::service { void buffer() { // 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 ( config.count("threshold") ? std::stof(config["threshold"]) : 0.0, config["left3"].c_str(), config["left4"].c_str(), config["right3"].c_str(), config["right4"].c_str(), config["up3"].c_str(), config["up4"].c_str(), config["down3"].c_str(), config["down4"].c_str() ); // 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(); } } } } } #endif /* __COMFORTABLE_SWIPE__service_buffer__ */