Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 19 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

![](https://img.shields.io/aur/version/gebaar.svg?style=flat)
Expand All @@ -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 = ""
Expand All @@ -86,16 +96,24 @@ 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`

### 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


10 changes: 7 additions & 3 deletions src/config/config.cpp
Original file line number Diff line number Diff line change
@@ -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 <http://www.gnu.org/licenses/>.
*/
Expand Down Expand Up @@ -61,6 +61,10 @@ void gebaar::config::Config::load_config()
swipe_four_commands[8] = *config->get_qualified_as<std::string>("commands.swipe.four.down");
swipe_four_commands[9] = *config->get_qualified_as<std::string>("commands.swipe.four.right_down");

pinch_commands[PINCH_IN] = *config->get_qualified_as<std::string>("commands.pinch.out");
pinch_commands[PINCH_OUT] = *config->get_qualified_as<std::string>("commands.pinch.in");
pinch_commands[DISTANCE] = *config->get_qualified_as<std::string>("commands.pinch.distance");

loaded = true;
}
}
Expand Down
10 changes: 7 additions & 3 deletions src/config/config.h
Original file line number Diff line number Diff line change
@@ -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 <http://www.gnu.org/licenses/>.
*/
Expand All @@ -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();
Expand Down
70 changes: 61 additions & 9 deletions src/io/input.cpp
Original file line number Diff line number Diff line change
@@ -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 <http://www.gnu.org/licenses/>.
*/
Expand All @@ -28,6 +28,7 @@ gebaar::io::Input::Input(std::shared_ptr<gebaar::config::Config> const& config_p
{
config = config_ptr;
gesture_swipe_event = {};
gesture_pinch_event = {};
}

/**
Expand All @@ -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.
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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;
}
Expand Down
23 changes: 20 additions & 3 deletions src/io/input.h
Original file line number Diff line number Diff line change
@@ -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 <http://www.gnu.org/licenses/>.
*/
Expand All @@ -24,13 +24,26 @@
#include <zconf.h>
#include "../config/config.h"

#define DEFAULT_SCALE 1.0
#define DEFAULT_DISTANCE 0.5


namespace gebaar::io {
struct gesture_swipe_event {
int fingers;
double x;
double y;
};

struct gesture_pinch_event {
int fingers;
double scale;
double angle;

double distance;
bool executed;
};

class Input {
public:
Input(std::shared_ptr<gebaar::config::Config> const& config_ptr);
Expand All @@ -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();

Expand All @@ -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);

};
}

Expand Down