2
* Copyright © 2012 Canonical Ltd.
4
* This program is free software: you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License version 3 as
6
* published by the Free Software Foundation.
8
* This program is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
* GNU General Public License for more details.
13
* You should have received a copy of the GNU General Public License
14
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16
* Authored by: Chase Douglas <chase.douglas@canonical.com>
19
#include "mir/input/evemu/device.h"
21
#include <boost/filesystem.hpp>
28
#include <sys/types.h>
32
namespace mi = mir::input;
38
void operator() (struct evemu_device* device)
46
mi::evemu::EvemuDevice::EvemuDevice(
47
const std::string& path,
48
EventHandler* event_handler) : LogicalDevice(event_handler),
49
simultaneous_instances{1},
50
buttons(static_cast<size_t>(KEY_MAX), false),
51
position_info{Mode::none}
53
std::unique_ptr<evemu_device, EvemuDeleter> evemu{evemu_new(NULL), EvemuDeleter()};
55
boost::filesystem::file_status const status{boost::filesystem::status(path)};
56
if (status.type() == boost::filesystem::regular_file)
58
std::FILE *file = fopen(path.c_str(), "r");
61
throw std::runtime_error("Failed to open evemu file");
63
int const evenmu_error{evemu_read(evemu.get(), file)};
67
throw std::runtime_error("Failed to read evemu parameters from file");
69
/* FIXME: Need test for evdev device nodes before uncommenting */
70
/*else if (status.type() == boost::filesystem::character_file)
72
int fd = open(path.c_str(), O_RDONLY);
74
throw std::runtime_error("Failed to open evdev node");
76
if (evemu_extract(evemu.get(), fd) < 0)
77
throw std::runtime_error("Failed to extract evdev node evemu parameters");
79
throw std::runtime_error("Device path is not a file nor a character device");
81
name = evemu_get_name(evemu.get());
83
if (evemu_has_event(evemu.get(), EV_ABS, ABS_MT_SLOT))
85
simultaneous_instances =
86
evemu_get_abs_maximum(evemu.get(), ABS_MT_SLOT) - evemu_get_abs_minimum(evemu.get(), ABS_MT_SLOT) + 1;
89
for (int b = 0; b <= KEY_MAX; ++b)
99
if (evemu_has_event(evemu.get(), EV_KEY, b))
103
if (evemu_has_event(evemu.get(), EV_ABS, ABS_MT_POSITION_X) || evemu_has_event(evemu.get(), EV_ABS, ABS_X))
104
position_info.mode = Mode::absolute;
105
else if (evemu_has_event(evemu.get(), EV_REL, REL_X))
106
position_info.mode = Mode::relative;
109
mi::EventProducer::State mi::evemu::EvemuDevice::current_state() const
111
return mi::EventProducer::State::stopped;
114
void mi::evemu::EvemuDevice::start()
119
void mi::evemu::EvemuDevice::stop()
124
const std::string& mi::evemu::EvemuDevice::get_name() const
129
int mi::evemu::EvemuDevice::get_simultaneous_instances() const
131
return simultaneous_instances;
134
/* FIXME: Reenable once under test.
135
bool mi::evemu::EvemuDevice::is_button_supported(const Button& button) const
137
return buttons[button];
141
const mi::PositionInfo& mi::evemu::EvemuDevice::get_position_info() const
143
return position_info;
146
const std::map<mi::AxisType, mi::Axis>& mi::evemu::EvemuDevice::get_axes() const