mirror of
https://github.com/hyprwm/aquamarine.git
synced 2024-12-22 21:49:48 +01:00
libinput: add switch support
This commit is contained in:
parent
84b936b21e
commit
c7fa62afe8
5 changed files with 113 additions and 9 deletions
|
@ -109,6 +109,10 @@ namespace Aquamarine {
|
||||||
Hyprutils::Signal::CSignal newPointer;
|
Hyprutils::Signal::CSignal newPointer;
|
||||||
Hyprutils::Signal::CSignal newKeyboard;
|
Hyprutils::Signal::CSignal newKeyboard;
|
||||||
Hyprutils::Signal::CSignal newTouch;
|
Hyprutils::Signal::CSignal newTouch;
|
||||||
|
Hyprutils::Signal::CSignal newSwitch;
|
||||||
|
Hyprutils::Signal::CSignal newTablet;
|
||||||
|
Hyprutils::Signal::CSignal newTabletTool;
|
||||||
|
Hyprutils::Signal::CSignal newTabletPad;
|
||||||
} events;
|
} events;
|
||||||
|
|
||||||
Hyprutils::Memory::CSharedPointer<IAllocator> allocator;
|
Hyprutils::Memory::CSharedPointer<IAllocator> allocator;
|
||||||
|
|
|
@ -99,6 +99,23 @@ namespace Aquamarine {
|
||||||
Hyprutils::Memory::CWeakPointer<CLibinputDevice> device;
|
Hyprutils::Memory::CWeakPointer<CLibinputDevice> device;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class CLibinputSwitch : public ISwitch {
|
||||||
|
public:
|
||||||
|
CLibinputSwitch(Hyprutils::Memory::CSharedPointer<CLibinputDevice> dev);
|
||||||
|
virtual ~CLibinputSwitch() {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual libinput_device* getLibinputHandle();
|
||||||
|
virtual const std::string& getName();
|
||||||
|
|
||||||
|
eSwitchType type = AQ_SWITCH_TYPE_UNKNOWN;
|
||||||
|
bool state = false;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Hyprutils::Memory::CWeakPointer<CLibinputDevice> device;
|
||||||
|
};
|
||||||
|
|
||||||
class CLibinputDevice {
|
class CLibinputDevice {
|
||||||
public:
|
public:
|
||||||
CLibinputDevice(libinput_device* device, Hyprutils::Memory::CWeakPointer<CSession> session_);
|
CLibinputDevice(libinput_device* device, Hyprutils::Memory::CWeakPointer<CSession> session_);
|
||||||
|
@ -114,6 +131,7 @@ namespace Aquamarine {
|
||||||
Hyprutils::Memory::CSharedPointer<CLibinputKeyboard> keyboard;
|
Hyprutils::Memory::CSharedPointer<CLibinputKeyboard> keyboard;
|
||||||
Hyprutils::Memory::CSharedPointer<CLibinputMouse> mouse;
|
Hyprutils::Memory::CSharedPointer<CLibinputMouse> mouse;
|
||||||
Hyprutils::Memory::CSharedPointer<CLibinputTouch> touch;
|
Hyprutils::Memory::CSharedPointer<CLibinputTouch> touch;
|
||||||
|
Hyprutils::Memory::CSharedPointer<CLibinputSwitch> switchy; // :)
|
||||||
};
|
};
|
||||||
|
|
||||||
class CSession {
|
class CSession {
|
||||||
|
|
|
@ -13,7 +13,7 @@ namespace Aquamarine {
|
||||||
}
|
}
|
||||||
virtual libinput_device* getLibinputHandle();
|
virtual libinput_device* getLibinputHandle();
|
||||||
virtual const std::string& getName() = 0;
|
virtual const std::string& getName() = 0;
|
||||||
virtual void updateLEDs(uint32_t leds);
|
virtual void updateLEDs(uint32_t leds);
|
||||||
|
|
||||||
struct SKeyEvent {
|
struct SKeyEvent {
|
||||||
uint32_t timeMs = 0;
|
uint32_t timeMs = 0;
|
||||||
|
@ -79,7 +79,7 @@ namespace Aquamarine {
|
||||||
ePointerAxis axis = AQ_POINTER_AXIS_VERTICAL;
|
ePointerAxis axis = AQ_POINTER_AXIS_VERTICAL;
|
||||||
ePointerAxisSource source = AQ_POINTER_AXIS_SOURCE_WHEEL;
|
ePointerAxisSource source = AQ_POINTER_AXIS_SOURCE_WHEEL;
|
||||||
ePointerAxisRelativeDirection direction = AQ_POINTER_AXIS_RELATIVE_IDENTICAL;
|
ePointerAxisRelativeDirection direction = AQ_POINTER_AXIS_RELATIVE_IDENTICAL;
|
||||||
double delta = 0.0, discrete = 0.0;
|
double delta = 0.0, discrete = 0.0;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SSwipeBeginEvent {
|
struct SSwipeBeginEvent {
|
||||||
|
@ -88,8 +88,8 @@ namespace Aquamarine {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SSwipeUpdateEvent {
|
struct SSwipeUpdateEvent {
|
||||||
uint32_t timeMs = 0;
|
uint32_t timeMs = 0;
|
||||||
uint32_t fingers = 0;
|
uint32_t fingers = 0;
|
||||||
Hyprutils::Math::Vector2D delta;
|
Hyprutils::Math::Vector2D delta;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -104,10 +104,10 @@ namespace Aquamarine {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SPinchUpdateEvent {
|
struct SPinchUpdateEvent {
|
||||||
uint32_t timeMs = 0;
|
uint32_t timeMs = 0;
|
||||||
uint32_t fingers = 0;
|
uint32_t fingers = 0;
|
||||||
Hyprutils::Math::Vector2D delta;
|
Hyprutils::Math::Vector2D delta;
|
||||||
double scale = 1.0, rotation = 0.0;
|
double scale = 1.0, rotation = 0.0;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SPinchEndEvent {
|
struct SPinchEndEvent {
|
||||||
|
@ -155,7 +155,7 @@ namespace Aquamarine {
|
||||||
virtual libinput_device* getLibinputHandle();
|
virtual libinput_device* getLibinputHandle();
|
||||||
virtual const std::string& getName() = 0;
|
virtual const std::string& getName() = 0;
|
||||||
|
|
||||||
Hyprutils::Math::Vector2D physicalSize; // in mm, 0,0 if unknown
|
Hyprutils::Math::Vector2D physicalSize; // in mm, 0,0 if unknown
|
||||||
|
|
||||||
struct SDownEvent {
|
struct SDownEvent {
|
||||||
uint32_t timeMs = 0;
|
uint32_t timeMs = 0;
|
||||||
|
@ -189,6 +189,33 @@ namespace Aquamarine {
|
||||||
} events;
|
} events;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ISwitch {
|
||||||
|
public:
|
||||||
|
virtual ~ISwitch() {
|
||||||
|
events.destroy.emit();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual libinput_device* getLibinputHandle();
|
||||||
|
virtual const std::string& getName() = 0;
|
||||||
|
|
||||||
|
enum eSwitchType {
|
||||||
|
AQ_SWITCH_TYPE_UNKNOWN = 0,
|
||||||
|
AQ_SWITCH_TYPE_LID,
|
||||||
|
AQ_SWITCH_TYPE_TABLET_MODE,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SFireEvent {
|
||||||
|
uint32_t timeMs = 0;
|
||||||
|
eSwitchType type = AQ_SWITCH_TYPE_UNKNOWN;
|
||||||
|
bool enable = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct {
|
||||||
|
Hyprutils::Signal::CSignal destroy;
|
||||||
|
Hyprutils::Signal::CSignal fire;
|
||||||
|
} events;
|
||||||
|
};
|
||||||
|
|
||||||
class ITablet {
|
class ITablet {
|
||||||
public:
|
public:
|
||||||
// FIXME:
|
// FIXME:
|
||||||
|
|
|
@ -267,6 +267,8 @@ void Aquamarine::CSession::onReady() {
|
||||||
backend->events.newPointer.emit(SP<IPointer>(d->mouse));
|
backend->events.newPointer.emit(SP<IPointer>(d->mouse));
|
||||||
if (d->touch)
|
if (d->touch)
|
||||||
backend->events.newTouch.emit(SP<ITouch>(d->touch));
|
backend->events.newTouch.emit(SP<ITouch>(d->touch));
|
||||||
|
if (d->switchy)
|
||||||
|
backend->events.newSwitch.emit(SP<ITouch>(d->touch));
|
||||||
|
|
||||||
// FIXME: other devices.
|
// FIXME: other devices.
|
||||||
}
|
}
|
||||||
|
@ -571,7 +573,7 @@ void Aquamarine::CSession::handleLibinputEvent(libinput_event* e) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------- touch
|
// --------- touch
|
||||||
|
|
||||||
case LIBINPUT_EVENT_TOUCH_DOWN: {
|
case LIBINPUT_EVENT_TOUCH_DOWN: {
|
||||||
auto te = libinput_event_get_touch_event(e);
|
auto te = libinput_event_get_touch_event(e);
|
||||||
|
@ -612,6 +614,33 @@ void Aquamarine::CSession::handleLibinputEvent(libinput_event* e) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --------- switch
|
||||||
|
|
||||||
|
case LIBINPUT_EVENT_SWITCH_TOGGLE: {
|
||||||
|
auto se = libinput_event_get_switch_event(e);
|
||||||
|
|
||||||
|
const bool ENABLED = libinput_event_switch_get_switch_state(se) == LIBINPUT_SWITCH_STATE_ON;
|
||||||
|
|
||||||
|
if (ENABLED == hlDevice->switchy->state)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (libinput_event_switch_get_switch(se)) {
|
||||||
|
case LIBINPUT_SWITCH_LID: hlDevice->switchy->type = ISwitch::AQ_SWITCH_TYPE_LID; break;
|
||||||
|
case LIBINPUT_SWITCH_TABLET_MODE: hlDevice->switchy->type = ISwitch::AQ_SWITCH_TYPE_TABLET_MODE; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
hlDevice->switchy->events.fire.emit(ISwitch::SFireEvent{
|
||||||
|
.timeMs = (uint32_t)(libinput_event_switch_get_time_usec(se) / 1000),
|
||||||
|
.type = hlDevice->switchy->type,
|
||||||
|
.enable = ENABLED,
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------- tbalet
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// FIXME: other events
|
// FIXME: other events
|
||||||
|
|
||||||
default: break;
|
default: break;
|
||||||
|
@ -652,6 +681,12 @@ void Aquamarine::CLibinputDevice::init() {
|
||||||
session->backend->events.newTouch.emit(SP<ITouch>(touch));
|
session->backend->events.newTouch.emit(SP<ITouch>(touch));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_SWITCH)) {
|
||||||
|
switchy = makeShared<CLibinputSwitch>(self.lock());
|
||||||
|
if (session->backend->ready)
|
||||||
|
session->backend->events.newSwitch.emit(SP<ISwitch>(switchy));
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME: other devices
|
// FIXME: other devices
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -710,3 +745,19 @@ const std::string& Aquamarine::CLibinputTouch::getName() {
|
||||||
return AQ_UNKNOWN_DEVICE_NAME;
|
return AQ_UNKNOWN_DEVICE_NAME;
|
||||||
return device->name;
|
return device->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Aquamarine::CLibinputSwitch::CLibinputSwitch(Hyprutils::Memory::CSharedPointer<CLibinputDevice> dev) : device(dev) {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
libinput_device* Aquamarine::CLibinputSwitch::getLibinputHandle() {
|
||||||
|
if (!device)
|
||||||
|
return nullptr;
|
||||||
|
return device->device;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string& Aquamarine::CLibinputSwitch::getName() {
|
||||||
|
if (!device)
|
||||||
|
return AQ_UNKNOWN_DEVICE_NAME;
|
||||||
|
return device->name;
|
||||||
|
}
|
|
@ -12,6 +12,10 @@ libinput_device* Aquamarine::ITouch::getLibinputHandle() {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
libinput_device* Aquamarine::ISwitch::getLibinputHandle() {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
void Aquamarine::IKeyboard::updateLEDs(uint32_t leds) {
|
void Aquamarine::IKeyboard::updateLEDs(uint32_t leds) {
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue