diff --git a/README.md b/README.md
index bb51f9e..741395f 100644
--- a/README.md
+++ b/README.md
@@ -55,8 +55,17 @@ right_down = ""
down = ""
left = ""
right = ""
+
+[commands.pinch]
+in = ""
+out = ""
+distance=""
```
+* `distance` variable in `commands.pinch` sets the distance between fingers where it shold trigger.
+ Defaults to `0.5` which means fingers should travel exactly half way from their initial position.
+
+
### Repository versions

@@ -77,6 +86,7 @@ down = "bspc node -f south"
left = "bspc node -f west"
right = "bspc node -f east"
+
[commands.swipe.four]
left_up = ""
right_up = ""
@@ -86,6 +96,11 @@ right_down = ""
down = ""
left = "bspc desktop -f prev"
right = "bspc desktop -f next"
+
+[commands.pinch]
+in = "xdotool key Control_L+equal"
+out = "xdotool key Control_L+minus"
+ditance="0.1"
```
Add `gebaard -b` to `~/.config/bspwm/bspwmrc`
@@ -93,9 +108,12 @@ Add `gebaard -b` to `~/.config/bspwm/bspwmrc`
### State of the project
- [x] Receiving swipe events from libinput
-- [ ] Receiving pinch/zoom events from libinput
+- [x] Receiving pinch/zoom events from libinput
+ - [ ] Support continous pinch
+ - [ ] Support pinch-and-rotate gestures
- [ ] Receiving rotation events from libinput
- [x] Converting libinput events to motions
- [x] Running commands based on motions
- [x] Refactor code to be up to Release standards, instead of testing-hell
+
diff --git a/src/config/config.cpp b/src/config/config.cpp
index bafa3c6..d13dcef 100644
--- a/src/config/config.cpp
+++ b/src/config/config.cpp
@@ -1,17 +1,17 @@
/*
gebaar
Copyright (C) 2019 coffee2code
-
+
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 .
*/
@@ -61,6 +61,10 @@ void gebaar::config::Config::load_config()
swipe_four_commands[8] = *config->get_qualified_as("commands.swipe.four.down");
swipe_four_commands[9] = *config->get_qualified_as("commands.swipe.four.right_down");
+ pinch_commands[PINCH_IN] = *config->get_qualified_as("commands.pinch.out");
+ pinch_commands[PINCH_OUT] = *config->get_qualified_as("commands.pinch.in");
+ pinch_commands[DISTANCE] = *config->get_qualified_as("commands.pinch.distance");
+
loaded = true;
}
}
diff --git a/src/config/config.h b/src/config/config.h
index 499eb51..45e7642 100644
--- a/src/config/config.h
+++ b/src/config/config.h
@@ -1,17 +1,17 @@
/*
gebaar
Copyright (C) 2019 coffee2code
-
+
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 .
*/
@@ -33,8 +33,12 @@ namespace gebaar::config {
void load_config();
+
+ enum pinches {PINCH_IN, PINCH_OUT, DISTANCE};
+
std::string swipe_three_commands[10];
std::string swipe_four_commands[10];
+ std::string pinch_commands[10];
private:
bool config_file_exists();
diff --git a/src/io/input.cpp b/src/io/input.cpp
index 943dc96..22f1409 100644
--- a/src/io/input.cpp
+++ b/src/io/input.cpp
@@ -1,17 +1,17 @@
/*
gebaar
Copyright (C) 2019 coffee2code
-
+
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 .
*/
@@ -28,6 +28,7 @@ gebaar::io::Input::Input(std::shared_ptr const& config_p
{
config = config_ptr;
gesture_swipe_event = {};
+ gesture_pinch_event = {};
}
/**
@@ -42,6 +43,54 @@ bool gebaar::io::Input::initialize_context()
return libinput_udev_assign_seat(libinput, "seat0")==0;
}
+
+
+/**
+ * Pinch Gesture
+ * Currently supporting only "one shot" pinch-in and pinch-out gestures.
+ * @param gev Gesture Event
+ * @param begin Boolean to denote begin or continuation of gesture.
+ **/
+void gebaar::io::Input::handle_pinch_event(libinput_event_gesture* gev, bool begin)
+{
+ if (begin) {
+ gesture_pinch_event.fingers = libinput_event_gesture_get_finger_count(gev);
+ // Get pinch distance
+ try {
+ gesture_pinch_event.distance = std::stod(config->pinch_commands[config->DISTANCE]);
+ }
+ catch (const std::invalid_argument &ia) {
+ // Set default distance
+ gesture_pinch_event.distance = DEFAULT_DISTANCE;
+ }
+ // Reset pinch data
+ gesture_pinch_event.scale = DEFAULT_SCALE;
+ gesture_pinch_event.executed = false;
+ }
+ else {
+ // Ignore input after command execution
+ if (gesture_pinch_event.executed) return;
+ double new_scale = libinput_event_gesture_get_scale(gev);
+ if (new_scale > gesture_pinch_event.scale) {
+ // Scale up
+ // Add 1 to required distance to get 2 > x > 1
+ if (new_scale > 1 + gesture_pinch_event.distance) {
+ std::system(config->pinch_commands[config->PINCH_IN].c_str());
+ gesture_pinch_event.executed = true;
+ }
+ }
+ else {
+ // Scale Down
+ // Substract from 1 to have inverted value for pinch in gesture
+ if (gesture_pinch_event.scale < 1 - gesture_pinch_event.distance) {
+ std::system(config->pinch_commands[config->PINCH_OUT].c_str());
+ gesture_pinch_event.executed = true;
+ }
+ }
+ gesture_pinch_event.scale = new_scale;
+ }
+}
+
/**
* This event has no coordinates, so it's an event that gives us a begin or end signal.
* If it begins, we get the amount of fingers used.
@@ -169,6 +218,15 @@ void gebaar::io::Input::handle_event()
case LIBINPUT_EVENT_GESTURE_SWIPE_END:
handle_swipe_event_without_coords(libinput_event_get_gesture_event(libinput_event), false);
break;
+ case LIBINPUT_EVENT_GESTURE_PINCH_BEGIN:
+ handle_pinch_event(libinput_event_get_gesture_event(libinput_event), true);
+ break;
+ case LIBINPUT_EVENT_GESTURE_PINCH_UPDATE:
+ handle_pinch_event(libinput_event_get_gesture_event(libinput_event), false);
+ break;
+ case LIBINPUT_EVENT_GESTURE_PINCH_END:
+ handle_pinch_event(libinput_event_get_gesture_event(libinput_event), false);
+ break;
case LIBINPUT_EVENT_NONE:
break;
case LIBINPUT_EVENT_DEVICE_ADDED:
@@ -209,12 +267,6 @@ void gebaar::io::Input::handle_event()
break;
case LIBINPUT_EVENT_TABLET_PAD_STRIP:
break;
- case LIBINPUT_EVENT_GESTURE_PINCH_BEGIN:
- break;
- case LIBINPUT_EVENT_GESTURE_PINCH_UPDATE:
- break;
- case LIBINPUT_EVENT_GESTURE_PINCH_END:
- break;
case LIBINPUT_EVENT_SWITCH_TOGGLE:
break;
}
diff --git a/src/io/input.h b/src/io/input.h
index b40d61f..af52637 100644
--- a/src/io/input.h
+++ b/src/io/input.h
@@ -1,17 +1,17 @@
/*
gebaar
Copyright (C) 2019 coffee2code
-
+
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 .
*/
@@ -24,6 +24,10 @@
#include
#include "../config/config.h"
+#define DEFAULT_SCALE 1.0
+#define DEFAULT_DISTANCE 0.5
+
+
namespace gebaar::io {
struct gesture_swipe_event {
int fingers;
@@ -31,6 +35,15 @@ namespace gebaar::io {
double y;
};
+ struct gesture_pinch_event {
+ int fingers;
+ double scale;
+ double angle;
+
+ double distance;
+ bool executed;
+ };
+
class Input {
public:
Input(std::shared_ptr const& config_ptr);
@@ -48,6 +61,7 @@ namespace gebaar::io {
struct libinput_event* libinput_event;
struct udev* udev;
struct gesture_swipe_event gesture_swipe_event;
+ struct gesture_pinch_event gesture_pinch_event;
bool initialize_context();
@@ -74,6 +88,9 @@ namespace gebaar::io {
void handle_swipe_event_without_coords(libinput_event_gesture* gev, bool begin);
void handle_swipe_event_with_coords(libinput_event_gesture* gev);
+
+ void handle_pinch_event(libinput_event_gesture* gev, bool begin);
+
};
}