diff options
Diffstat (limited to 'tdecore/tdehw/tdeeventdevice.cpp')
-rw-r--r-- | tdecore/tdehw/tdeeventdevice.cpp | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/tdecore/tdehw/tdeeventdevice.cpp b/tdecore/tdehw/tdeeventdevice.cpp new file mode 100644 index 000000000..a98bc78c3 --- /dev/null +++ b/tdecore/tdehw/tdeeventdevice.cpp @@ -0,0 +1,146 @@ +/* This file is part of the TDE libraries + Copyright (C) 2012 Timothy Pearson <kb9vqf@pearsoncomputing.net> + (C) 2013 Golubev Alexander <fatzer2@gmail.com> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "tdeeventdevice.h" + +#include <unistd.h> +#include <linux/input.h> + +#include <tqsocketnotifier.h> + +#include "tdelocale.h" + +#include "tdehardwaredevices.h" + +#include "config.h" + +TDEEventDevice::TDEEventDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn) : TDEGenericDevice(dt, dn) { + m_fd = -1; + m_fdMonitorActive = false; +} + +TDEEventDevice::~TDEEventDevice() { + if (m_fd >= 0) { + close(m_fd); + } +} + +TDEEventDeviceType::TDEEventDeviceType TDEEventDevice::eventType() { + return m_eventType; +} + +void TDEEventDevice::internalSetEventType(TDEEventDeviceType::TDEEventDeviceType et) { + m_eventType = et; +} + +TDESwitchType::TDESwitchType TDEEventDevice::providedSwitches() { + return m_providedSwitches; +} + +void TDEEventDevice::internalSetProvidedSwitches(TDESwitchType::TDESwitchType sl) { + m_providedSwitches = sl; +} + +TDESwitchType::TDESwitchType TDEEventDevice::activeSwitches() { + return m_switchActive; +} + +void TDEEventDevice::internalSetActiveSwitches(TDESwitchType::TDESwitchType sl) { + m_switchActive = sl; +} + +// Keep this in sync with the TDESwitchType definition in the header +TQStringList TDEEventDevice::friendlySwitchList(TDESwitchType::TDESwitchType switches) { + TQStringList ret; + + if (switches & TDESwitchType::Lid) { + ret.append(i18n("Lid Switch")); + } + if (switches & TDESwitchType::TabletMode) { + ret.append(i18n("Tablet Mode")); + } + if (switches & TDESwitchType::HeadphoneInsert) { + ret.append(i18n("Headphone Inserted")); + } + if (switches & TDESwitchType::RFKill) { + ret.append(i18n("Radio Frequency Device Kill Switch")); + } + if (switches & TDESwitchType::Radio) { + ret.append(i18n("Enable Radio")); + } + if (switches & TDESwitchType::MicrophoneInsert) { + ret.append(i18n("Microphone Inserted")); + } + if (switches & TDESwitchType::Dock) { + ret.append(i18n("Docked")); + } + if (switches & TDESwitchType::LineOutInsert) { + ret.append(i18n("Line Out Inserted")); + } + if (switches & TDESwitchType::JackPhysicalInsert) { + ret.append(i18n("Physical Jack Inserted")); + } + if (switches & TDESwitchType::VideoOutInsert) { + ret.append(i18n("Video Out Inserted")); + } + if (switches & TDESwitchType::CameraLensCover) { + ret.append(i18n("Camera Lens Cover")); + } + if (switches & TDESwitchType::KeypadSlide) { + ret.append(i18n("Keypad Slide")); + } + if (switches & TDESwitchType::FrontProximity) { + ret.append(i18n("Front Proximity")); + } + if (switches & TDESwitchType::RotateLock) { + ret.append(i18n("Rotate Lock")); + } + if (switches & TDESwitchType::LineInInsert) { + ret.append(i18n("Line In Inserted")); + } + + return ret; +} + +void TDEEventDevice::internalStartFdMonitoring(TDEHardwareDevices* hwmanager) { + if (!m_fdMonitorActive) { + // For security and performance reasons, only monitor known ACPI buttons + if (eventType() != TDEEventDeviceType::Unknown) { + if (m_fd >= 0) { + m_eventNotifier = new TQSocketNotifier(m_fd, TQSocketNotifier::Read, this); + connect( m_eventNotifier, TQT_SIGNAL(activated(int)), this, TQT_SLOT(eventReceived()) ); + } + connect( this, TQT_SIGNAL(keyPressed(unsigned int, TDEEventDevice*)), hwmanager, TQT_SLOT(processEventDeviceKeyPressed(unsigned int, TDEEventDevice*)) ); + } + m_fdMonitorActive = true; + } +} + +void TDEEventDevice::eventReceived() { + struct input_event ev; + int r; + r = read(m_fd, &ev, sizeof(struct input_event)); + if (r > 0) { + if (ev.type == EV_KEY) { + emit keyPressed(ev.code, this); + } + } +} + +#include "tdeeventdevice.moc" |