summaryrefslogtreecommitdiff
path: root/src/devices
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2024-07-21 13:09:54 +0200
committerGitHub <noreply@github.com>2024-07-21 13:09:54 +0200
commit016da234d0e852de3ef20eb2e89ac58d2a85f6e7 (patch)
tree496085987176551b0794fffc069877d44943e2f1 /src/devices
parentf642fb97df5c69267a03452533de383ff8023570 (diff)
Core: Move to aquamarine (#6608)
Moves Hyprland from wlroots to aquamarine for the backend. --------- Signed-off-by: Vaxry <vaxry@vaxry.net> Co-authored-by: Mihai Fufezan <mihai@fufexan.net> Co-authored-by: Jan Beich <jbeich@FreeBSD.org> Co-authored-by: vaxerski <vaxerski@users.noreply.github.com> Co-authored-by: UjinT34 <41110182+UjinT34@users.noreply.github.com> Co-authored-by: Tom Englund <tomenglund26@gmail.com> Co-authored-by: Ikalco <73481042+ikalco@users.noreply.github.com> Co-authored-by: diniamo <diniamo53@gmail.com>
Diffstat (limited to 'src/devices')
-rw-r--r--src/devices/IKeyboard.cpp254
-rw-r--r--src/devices/IKeyboard.hpp73
-rw-r--r--src/devices/IPointer.hpp10
-rw-r--r--src/devices/ITouch.hpp10
-rw-r--r--src/devices/Keyboard.cpp66
-rw-r--r--src/devices/Keyboard.hpp22
-rw-r--r--src/devices/Mouse.cpp182
-rw-r--r--src/devices/Mouse.hpp41
-rw-r--r--src/devices/Tablet.cpp256
-rw-r--r--src/devices/Tablet.hpp156
-rw-r--r--src/devices/TouchDevice.cpp78
-rw-r--r--src/devices/TouchDevice.hpp26
-rw-r--r--src/devices/VirtualKeyboard.cpp67
-rw-r--r--src/devices/VirtualKeyboard.hpp21
-rw-r--r--src/devices/VirtualPointer.cpp176
-rw-r--r--src/devices/VirtualPointer.hpp37
16 files changed, 736 insertions, 739 deletions
diff --git a/src/devices/IKeyboard.cpp b/src/devices/IKeyboard.cpp
index cb294d1a..284a8295 100644
--- a/src/devices/IKeyboard.cpp
+++ b/src/devices/IKeyboard.cpp
@@ -2,7 +2,21 @@
#include "../defines.hpp"
#include "../helpers/varlist/VarList.hpp"
#include "../managers/input/InputManager.hpp"
+#include "../managers/SeatManager.hpp"
+#include "../config/ConfigManager.hpp"
+#include <sys/mman.h>
+#include <aquamarine/input/Input.hpp>
+#include <cstring>
+#define LED_COUNT 3
+
+constexpr static std::array<const char*, 8> MODNAMES = {
+ XKB_MOD_NAME_SHIFT, XKB_MOD_NAME_CAPS, XKB_MOD_NAME_CTRL, XKB_MOD_NAME_ALT, XKB_MOD_NAME_NUM, "Mod3", XKB_MOD_NAME_LOGO, "Mod5",
+};
+
+constexpr static std::array<const char*, 3> LEDNAMES = {XKB_LED_NAME_NUM, XKB_LED_NAME_CAPS, XKB_LED_NAME_SCROLL};
+
+//
uint32_t IKeyboard::getCapabilities() {
return HID_INPUT_CAPABILITY_KEYBOARD;
}
@@ -14,27 +28,149 @@ eHIDType IKeyboard::getType() {
IKeyboard::~IKeyboard() {
events.destroy.emit();
- if (!xkbTranslationState)
+ clearManuallyAllocd();
+}
+
+void IKeyboard::clearManuallyAllocd() {
+ if (xkbStaticState)
+ xkb_state_unref(xkbStaticState);
+
+ if (xkbState)
+ xkb_state_unref(xkbState);
+
+ if (xkbKeymap)
+ xkb_keymap_unref(xkbKeymap);
+
+ if (xkbKeymapFD >= 0)
+ close(xkbKeymapFD);
+
+ xkbKeymap = nullptr;
+ xkbState = nullptr;
+ xkbStaticState = nullptr;
+ xkbKeymapFD = -1;
+}
+
+void IKeyboard::setKeymap(const SStringRuleNames& rules) {
+ currentRules = rules;
+ xkb_rule_names XKBRULES = {
+ .rules = rules.rules.c_str(),
+ .model = rules.model.c_str(),
+ .layout = rules.layout.c_str(),
+ .variant = rules.variant.c_str(),
+ .options = rules.options.c_str(),
+ };
+
+ const auto CONTEXT = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
+
+ if (!CONTEXT) {
+ Debug::log(ERR, "setKeymap: CONTEXT null??");
return;
+ }
+
+ clearManuallyAllocd();
+
+ Debug::log(LOG, "Attempting to create a keymap for layout {} with variant {} (rules: {}, model: {}, options: {})", rules.layout, rules.variant, rules.rules, rules.model,
+ rules.options);
+
+ if (!xkbFilePath.empty()) {
+ auto path = absolutePath(xkbFilePath, g_pConfigManager->configCurrentPath);
+
+ if (FILE* const KEYMAPFILE = fopen(path.c_str(), "r"); !KEYMAPFILE)
+ Debug::log(ERR, "Cannot open input:kb_file= file for reading");
+ else {
+ xkbKeymap = xkb_keymap_new_from_file(CONTEXT, KEYMAPFILE, XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS);
+ fclose(KEYMAPFILE);
+ }
+ }
+
+ if (!xkbKeymap)
+ xkbKeymap = xkb_keymap_new_from_names(CONTEXT, &XKBRULES, XKB_KEYMAP_COMPILE_NO_FLAGS);
+
+ if (!xkbKeymap) {
+ g_pConfigManager->addParseError("Invalid keyboard layout passed. ( rules: " + rules.rules + ", model: " + rules.model + ", variant: " + rules.variant +
+ ", options: " + rules.options + ", layout: " + rules.layout + " )");
+
+ Debug::log(ERR, "Keyboard layout {} with variant {} (rules: {}, model: {}, options: {}) couldn't have been loaded.", rules.layout, rules.variant, rules.rules, rules.model,
+ rules.options);
+ memset(&XKBRULES, 0, sizeof(XKBRULES));
+
+ currentRules.rules = "";
+ currentRules.model = "";
+ currentRules.variant = "";
+ currentRules.options = "";
+ currentRules.layout = "us";
+
+ xkbKeymap = xkb_keymap_new_from_names(CONTEXT, &XKBRULES, XKB_KEYMAP_COMPILE_NO_FLAGS);
+ }
+
+ // set internal translation state
+ // demo sunao ni ienai
+ xkbStaticState = xkb_state_new(xkbKeymap);
+
+ updateXKBTranslationState(xkbKeymap);
+
+ const auto NUMLOCKON = g_pConfigManager->getDeviceInt(hlName, "numlock_by_default", "input:numlock_by_default");
+
+ if (NUMLOCKON == 1) {
+ // lock numlock
+ const auto IDX = xkb_map_mod_get_index(xkbKeymap, XKB_MOD_NAME_NUM);
+
+ if (IDX != XKB_MOD_INVALID)
+ modifiersState.locked |= (uint32_t)1 << IDX;
+
+ updateModifiers(modifiersState.depressed, modifiersState.latched, modifiersState.locked, modifiersState.group);
+ }
+
+ for (size_t i = 0; i < LEDNAMES.size(); ++i) {
+ ledIndexes.at(i) = xkb_map_led_get_index(xkbKeymap, LEDNAMES.at(i));
+ Debug::log(LOG, "xkb: LED index {} (name {}) got index {}", i, LEDNAMES.at(i), ledIndexes.at(i));
+ }
+
+ for (size_t i = 0; i < MODNAMES.size(); ++i) {
+ modIndexes.at(i) = xkb_map_mod_get_index(xkbKeymap, MODNAMES.at(i));
+ Debug::log(LOG, "xkb: Mod index {} (name {}) got index {}", i, MODNAMES.at(i), modIndexes.at(i));
+ }
- xkb_state_unref(xkbTranslationState);
- xkbTranslationState = nullptr;
+ auto cKeymapStr = xkb_keymap_get_as_string(xkbKeymap, XKB_KEYMAP_FORMAT_TEXT_V1);
+ xkbKeymapString = cKeymapStr;
+ free(cKeymapStr);
+
+ int rw, ro;
+ if (!allocateSHMFilePair(xkbKeymapString.length() + 1, &rw, &ro))
+ Debug::log(ERR, "IKeyboard: failed to allocate shm pair for the keymap");
+ else {
+ auto keymapFDDest = mmap(nullptr, xkbKeymapString.length() + 1, PROT_READ | PROT_WRITE, MAP_SHARED, rw, 0);
+ close(rw);
+ if (keymapFDDest == MAP_FAILED) {
+ Debug::log(ERR, "IKeyboard: failed to mmap a shm pair for the keymap");
+ close(ro);
+ } else {
+ memcpy(keymapFDDest, xkbKeymapString.c_str(), xkbKeymapString.length());
+ munmap(keymapFDDest, xkbKeymapString.length() + 1);
+ xkbKeymapFD = ro;
+ }
+ }
+
+ xkb_context_unref(CONTEXT);
+
+ g_pSeatManager->updateActiveKeyboardData();
}
void IKeyboard::updateXKBTranslationState(xkb_keymap* const keymap) {
- if (xkbTranslationState)
- xkb_state_unref(xkbTranslationState);
+ if (xkbState)
+ xkb_state_unref(xkbState);
+
+ xkbState = nullptr;
if (keymap) {
Debug::log(LOG, "Updating keyboard {:x}'s translation state from a provided keymap", (uintptr_t)this);
- xkbTranslationState = xkb_state_new(keymap);
+ xkbState = xkb_state_new(keymap);
return;
}
- const auto WLRKB = wlr();
- const auto KEYMAP = WLRKB->keymap;
- const auto STATE = WLRKB->xkb_state;
+ const auto KEYMAP = xkbKeymap;
+ const auto STATE = xkbState;
const auto LAYOUTSNUM = xkb_keymap_num_layouts(KEYMAP);
const auto PCONTEXT = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
@@ -73,7 +209,7 @@ void IKeyboard::updateXKBTranslationState(xkb_keymap* const keymap) {
KEYMAP = xkb_keymap_new_from_names(PCONTEXT, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS);
}
- xkbTranslationState = xkb_state_new(KEYMAP);
+ xkbState = xkb_state_new(KEYMAP);
xkb_keymap_unref(KEYMAP);
xkb_context_unref(PCONTEXT);
@@ -94,16 +230,15 @@ void IKeyboard::updateXKBTranslationState(xkb_keymap* const keymap) {
const auto NEWKEYMAP = xkb_keymap_new_from_names(PCONTEXT, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS);
- xkbTranslationState = xkb_state_new(NEWKEYMAP);
+ xkbState = xkb_state_new(NEWKEYMAP);
xkb_keymap_unref(NEWKEYMAP);
xkb_context_unref(PCONTEXT);
}
std::string IKeyboard::getActiveLayout() {
- const auto WLRKB = wlr();
- const auto KEYMAP = WLRKB->keymap;
- const auto STATE = WLRKB->xkb_state;
+ const auto KEYMAP = xkbKeymap;
+ const auto STATE = xkbState;
const auto LAYOUTSNUM = xkb_keymap_num_layouts(KEYMAP);
for (uint32_t i = 0; i < LAYOUTSNUM; ++i) {
@@ -120,14 +255,12 @@ std::string IKeyboard::getActiveLayout() {
}
void IKeyboard::updateLEDs() {
- auto keyboard = wlr();
-
- if (!keyboard || keyboard->xkb_state == nullptr)
+ if (xkbState == nullptr)
return;
uint32_t leds = 0;
- for (uint32_t i = 0; i < WLR_LED_COUNT; ++i) {
- if (xkb_state_led_index_is_active(keyboard->xkb_state, keyboard->led_indexes[i]))
+ for (uint32_t i = 0; i < LED_COUNT; ++i) {
+ if (xkb_state_led_index_is_active(xkbState, ledIndexes.at(i)))
leds |= (1 << i);
}
@@ -135,13 +268,88 @@ void IKeyboard::updateLEDs() {
}
void IKeyboard::updateLEDs(uint32_t leds) {
- auto keyboard = wlr();
-
- if (!keyboard || keyboard->xkb_state == nullptr)
+ if (!xkbState)
return;
if (isVirtual() && g_pInputManager->shouldIgnoreVirtualKeyboard(self.lock()))
return;
- wlr_keyboard_led_update(keyboard, leds);
+ if (!aq())
+ return;
+
+ aq()->updateLEDs(leds);
+}
+
+uint32_t IKeyboard::getModifiers() {
+ uint32_t modMask = modifiersState.depressed | modifiersState.latched;
+ uint32_t mods = 0;
+ for (size_t i = 0; i < modIndexes.size(); ++i) {
+ if (modIndexes.at(i) == XKB_MOD_INVALID)
+ continue;
+
+ if (!(modMask & (1 << modIndexes.at(i))))
+ continue;
+
+ mods |= (1 << i);
+ }
+
+ return mods;
+}
+
+void IKeyboard::updateModifiers(uint32_t depressed, uint32_t latched, uint32_t locked, uint32_t group) {
+ if (!xkbState)
+ return;
+
+ xkb_state_update_mask(xkbState, depressed, latched, locked, 0, 0, group);
+
+ if (!updateModifiersState())
+ return;
+
+ updateLEDs();
+}
+
+bool IKeyboard::updateModifiersState() {
+ if (!xkbState)
+ return false;
+
+ auto depressed = xkb_state_serialize_mods(xkbState, XKB_STATE_MODS_DEPRESSED);
+ auto latched = xkb_state_serialize_mods(xkbState, XKB_STATE_MODS_LATCHED);
+ auto locked = xkb_state_serialize_mods(xkbState, XKB_STATE_MODS_LOCKED);
+ auto group = xkb_state_serialize_layout(xkbState, XKB_STATE_LAYOUT_EFFECTIVE);
+
+ if (depressed == modifiersState.depressed && latched == modifiersState.latched && locked == modifiersState.locked && group == modifiersState.group)
+ return false;
+
+ modifiersState.depressed = depressed;
+ modifiersState.latched = latched;
+ modifiersState.locked = locked;
+ modifiersState.group = group;
+
+ return true;
+}
+
+void IKeyboard::updateXkbStateWithKey(uint32_t xkbKey, bool pressed) {
+
+ const auto contains = std::find(pressedXKB.begin(), pressedXKB.end(), xkbKey) != pressedXKB.end();
+
+ if (contains && pressed)
+ return;
+ if (!contains && !pressed)
+ return;
+
+ if (contains)
+ std::erase(pressedXKB, xkbKey);
+ else
+ pressedXKB.emplace_back(xkbKey);
+
+ xkb_state_update_key(xkbState, xkbKey, pressed ? XKB_KEY_DOWN : XKB_KEY_UP);
+
+ if (updateModifiersState()) {
+ keyboardEvents.modifiers.emit(SModifiersEvent{
+ .depressed = modifiersState.depressed,
+ .latched = modifiersState.latched,
+ .locked = modifiersState.locked,
+ .group = modifiersState.group,
+ });
+ }
}
diff --git a/src/devices/IKeyboard.hpp b/src/devices/IKeyboard.hpp
index b1757a18..1ae6c7bc 100644
--- a/src/devices/IKeyboard.hpp
+++ b/src/devices/IKeyboard.hpp
@@ -7,15 +7,26 @@
#include <xkbcommon/xkbcommon.h>
-struct wlr_keyboard;
+AQUAMARINE_FORWARD(IKeyboard);
+
+enum eKeyboardModifiers {
+ HL_MODIFIER_SHIFT = (1 << 0),
+ HL_MODIFIER_CAPS = (1 << 1),
+ HL_MODIFIER_CTRL = (1 << 2),
+ HL_MODIFIER_ALT = (1 << 3),
+ HL_MODIFIER_MOD2 = (1 << 4),
+ HL_MODIFIER_MOD3 = (1 << 5),
+ HL_MODIFIER_META = (1 << 6),
+ HL_MODIFIER_MOD5 = (1 << 7),
+};
class IKeyboard : public IHID {
public:
virtual ~IKeyboard();
- virtual uint32_t getCapabilities();
- virtual eHIDType getType();
- virtual bool isVirtual() = 0;
- virtual wlr_keyboard* wlr() = 0;
+ virtual uint32_t getCapabilities();
+ virtual eHIDType getType();
+ virtual bool isVirtual() = 0;
+ virtual SP<Aquamarine::IKeyboard> aq() = 0;
struct SKeyEvent {
uint32_t timeMs = 0;
@@ -24,6 +35,17 @@ class IKeyboard : public IHID {
wl_keyboard_key_state state = WL_KEYBOARD_KEY_STATE_PRESSED;
};
+ struct SKeymapEvent {
+ xkb_keymap* keymap = nullptr;
+ };
+
+ struct SModifiersEvent {
+ uint32_t depressed = 0;
+ uint32_t latched = 0;
+ uint32_t locked = 0;
+ uint32_t group = 0;
+ };
+
struct {
CSignal key;
CSignal modifiers;
@@ -39,25 +61,46 @@ class IKeyboard : public IHID {
std::string rules = "";
};
+ void setKeymap(const SStringRuleNames& rules);
void updateXKBTranslationState(xkb_keymap* const keymap = nullptr);
std::string getActiveLayout();
void updateLEDs();
void updateLEDs(uint32_t leds);
+ uint32_t getModifiers();
+ void updateModifiers(uint32_t depressed, uint32_t latched, uint32_t locked, uint32_t group);
+ bool updateModifiersState(); // rets whether changed
+ void updateXkbStateWithKey(uint32_t xkbKey, bool pressed);
bool active = false;
bool enabled = true;
- xkb_layout_index_t activeLayout = 0;
- xkb_state* xkbTranslationState = nullptr;
+ xkb_layout_index_t activeLayout = 0;
+ xkb_state * xkbState = nullptr, *xkbStaticState /* Static state: never gets modifiers or layout changes sent, used for keybinds. */ = nullptr;
+ xkb_keymap* xkbKeymap = nullptr;
+
+ struct {
+ uint32_t depressed = 0, latched = 0, locked = 0, group = 0;
+ } modifiersState;
+
+ std::array<xkb_led_index_t, 3> ledIndexes = {XKB_MOD_INVALID};
+ std::array<xkb_mod_index_t, 8> modIndexes = {XKB_MOD_INVALID};
+ uint32_t leds = 0;
+
+ std::string hlName = "";
+ std::string xkbFilePath = "";
+ std::string xkbKeymapString = "";
+ int xkbKeymapFD = -1;
+
+ SStringRuleNames currentRules;
+ int repeatRate = 0;
+ int repeatDelay = 0;
+ int numlockOn = -1;
+ bool resolveBindsBySym = false;
- std::string hlName = "";
- std::string xkbFilePath = "";
+ WP<IKeyboard> self;
- SStringRuleNames currentRules;
- int repeatRate = 0;
- int repeatDelay = 0;
- int numlockOn = -1;
- bool resolveBindsBySym = false;
+ private:
+ void clearManuallyAllocd();
- WP<IKeyboard> self;
+ std::vector<uint32_t> pressedXKB;
};
diff --git a/src/devices/IPointer.hpp b/src/devices/IPointer.hpp
index b2995b2f..5df47c04 100644
--- a/src/devices/IPointer.hpp
+++ b/src/devices/IPointer.hpp
@@ -5,17 +5,17 @@
#include "../macros.hpp"
#include "../helpers/math/Math.hpp"
-struct wlr_pointer;
+AQUAMARINE_FORWARD(IPointer);
/*
Base class for a pointer.
*/
class IPointer : public IHID {
public:
- virtual uint32_t getCapabilities();
- virtual eHIDType getType();
- virtual bool isVirtual() = 0;
- virtual wlr_pointer* wlr() = 0;
+ virtual uint32_t getCapabilities();
+ virtual eHIDType getType();
+ virtual bool isVirtual() = 0;
+ virtual SP<Aquamarine::IPointer> aq() = 0;
struct SMotionEvent {
uint32_t timeMs = 0;
diff --git a/src/devices/ITouch.hpp b/src/devices/ITouch.hpp
index b9cbf2ae..cb8a6e90 100644
--- a/src/devices/ITouch.hpp
+++ b/src/devices/ITouch.hpp
@@ -5,14 +5,14 @@
#include "../macros.hpp"
#include "../helpers/math/Math.hpp"
-struct wlr_touch;
+AQUAMARINE_FORWARD(ITouch);
class ITouch : public IHID {
public:
- virtual uint32_t getCapabilities();
- virtual eHIDType getType();
- virtual bool isVirtual() = 0;
- virtual wlr_touch* wlr() = 0;
+ virtual uint32_t getCapabilities();
+ virtual eHIDType getType();
+ virtual bool isVirtual() = 0;
+ virtual SP<Aquamarine::ITouch> aq() = 0;
struct SDownEvent {
uint32_t timeMs = 0;
diff --git a/src/devices/Keyboard.cpp b/src/devices/Keyboard.cpp
index 17357edb..ae28c07d 100644
--- a/src/devices/Keyboard.cpp
+++ b/src/devices/Keyboard.cpp
@@ -1,7 +1,10 @@
#include "Keyboard.hpp"
#include "../defines.hpp"
+#include "../Compositor.hpp"
-SP<CKeyboard> CKeyboard::create(wlr_keyboard* keeb) {
+#include <aquamarine/input/Input.hpp>
+
+SP<CKeyboard> CKeyboard::create(SP<Aquamarine::IKeyboard> keeb) {
SP<CKeyboard> pKeeb = SP<CKeyboard>(new CKeyboard(keeb));
pKeeb->self = pKeeb;
@@ -13,52 +16,41 @@ bool CKeyboard::isVirtual() {
return false;
}
-wlr_keyboard* CKeyboard::wlr() {
- return keyboard;
+SP<Aquamarine::IKeyboard> CKeyboard::aq() {
+ return keyboard.lock();
}
-CKeyboard::CKeyboard(wlr_keyboard* keeb) : keyboard(keeb) {
+CKeyboard::CKeyboard(SP<Aquamarine::IKeyboard> keeb) : keyboard(keeb) {
if (!keeb)
return;
- // clang-format off
- hyprListener_destroy.initCallback(&keeb->base.events.destroy, [this] (void* owner, void* data) {
- disconnectCallbacks();
- keyboard = nullptr;
- events.destroy.emit();
- }, this, "CKeyboard");
+ listeners.destroy = keeb->events.destroy.registerListener([this](std::any d) {
+ keyboard.reset();
+ events.destroy.emit();
+ });
+
+ listeners.key = keeb->events.key.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::IKeyboard::SKeyEvent>(d);
- hyprListener_key.initCallback(&keeb->events.key, [this] (void* owner, void* data) {
- auto E = (wlr_keyboard_key_event*)data;
+ updateXkbStateWithKey(E.key + 8, E.pressed);
keyboardEvents.key.emit(SKeyEvent{
- .timeMs = E->time_msec,
- .keycode = E->keycode,
- .updateMods = E->update_state,
- .state = E->state,
+ .timeMs = E.timeMs,
+ .keycode = E.key,
+ .state = E.pressed ? WL_KEYBOARD_KEY_STATE_PRESSED : WL_KEYBOARD_KEY_STATE_RELEASED,
});
- }, this, "CKeyboard");
-
- hyprListener_keymap.initCallback(&keeb->events.keymap, [this] (void* owner, void* data) {
- keyboardEvents.keymap.emit();
- }, this, "CKeyboard");
+ });
- hyprListener_modifiers.initCallback(&keeb->events.modifiers, [this] (void* owner, void* data) {
- keyboardEvents.modifiers.emit();
- }, this, "CKeyboard");
+ listeners.modifiers = keeb->events.modifiers.registerListener([this](std::any d) {
+ updateModifiersState();
- hyprListener_repeatInfo.initCallback(&keeb->events.repeat_info, [this] (void* owner, void* data) {
- keyboardEvents.repeatInfo.emit();
- }, this, "CKeyboard");
- // clang-format on
-
- deviceName = keeb->base.name ? keeb->base.name : "UNKNOWN";
-}
+ keyboardEvents.modifiers.emit(SModifiersEvent{
+ .depressed = modifiersState.depressed,
+ .latched = modifiersState.latched,
+ .locked = modifiersState.locked,
+ .group = modifiersState.group,
+ });
+ });
-void CKeyboard::disconnectCallbacks() {
- hyprListener_destroy.removeCallback();
- hyprListener_key.removeCallback();
- hyprListener_keymap.removeCallback();
- hyprListener_repeatInfo.removeCallback();
- hyprListener_modifiers.removeCallback();
+ deviceName = keeb->getName();
}
diff --git a/src/devices/Keyboard.hpp b/src/devices/Keyboard.hpp
index cf01a9a7..f6de43cb 100644
--- a/src/devices/Keyboard.hpp
+++ b/src/devices/Keyboard.hpp
@@ -4,21 +4,19 @@
class CKeyboard : public IKeyboard {
public:
- static SP<CKeyboard> create(wlr_keyboard* keeb);
+ static SP<CKeyboard> create(SP<Aquamarine::IKeyboard> keeb);
- virtual bool isVirtual();
- virtual wlr_keyboard* wlr();
+ virtual bool isVirtual();
+ virtual SP<Aquamarine::IKeyboard> aq();
private:
- CKeyboard(wlr_keyboard* keeb);
+ CKeyboard(SP<Aquamarine::IKeyboard> keeb);
- wlr_keyboard* keyboard = nullptr;
+ WP<Aquamarine::IKeyboard> keyboard;
- void disconnectCallbacks();
-
- DYNLISTENER(destroy);
- DYNLISTENER(key);
- DYNLISTENER(modifiers);
- DYNLISTENER(keymap);
- DYNLISTENER(repeatInfo);
+ struct {
+ CHyprSignalListener destroy;
+ CHyprSignalListener key;
+ CHyprSignalListener modifiers;
+ } listeners;
}; \ No newline at end of file
diff --git a/src/devices/Mouse.cpp b/src/devices/Mouse.cpp
index b860298c..ae89ed92 100644
--- a/src/devices/Mouse.cpp
+++ b/src/devices/Mouse.cpp
@@ -1,7 +1,8 @@
#include "Mouse.hpp"
#include "../defines.hpp"
+#include <aquamarine/input/Input.hpp>
-SP<CMouse> CMouse::create(wlr_pointer* mouse) {
+SP<CMouse> CMouse::create(SP<Aquamarine::IPointer> mouse) {
SP<CMouse> pMouse = SP<CMouse>(new CMouse(mouse));
pMouse->self = pMouse;
@@ -9,166 +10,143 @@ SP<CMouse> CMouse::create(wlr_pointer* mouse) {
return pMouse;
}
-CMouse::CMouse(wlr_pointer* mouse_) : mouse(mouse_) {
+CMouse::CMouse(SP<Aquamarine::IPointer> mouse_) : mouse(mouse_) {
if (!mouse)
return;
- // clang-format off
- hyprListener_destroy.initCallback(&mouse->base.events.destroy, [this] (void* owner, void* data) {
- disconnectCallbacks();
- mouse = nullptr;
+ listeners.destroy = mouse->events.destroy.registerListener([this](std::any d) {
+ mouse.reset();
events.destroy.emit();
- }, this, "CMouse");
+ });
- hyprListener_motion.initCallback(&mouse->events.motion, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_motion_event*)data;
+ listeners.motion = mouse->events.move.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::IPointer::SMoveEvent>(d);
pointerEvents.motion.emit(SMotionEvent{
- .timeMs = E->time_msec,
- .delta = {E->delta_x, E->delta_y},
- .unaccel = {E->unaccel_dx, E->unaccel_dy},
+ .timeMs = E.timeMs,
+ .delta = E.delta,
+ .unaccel = E.unaccel,
});
- }, this, "CMouse");
+ });
- hyprListener_motionAbsolute.initCallback(&mouse->events.motion_absolute, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_motion_absolute_event*)data;
+ listeners.motionAbsolute = mouse->events.warp.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::IPointer::SWarpEvent>(d);
pointerEvents.motionAbsolute.emit(SMotionAbsoluteEvent{
- .timeMs = E->time_msec,
- .absolute = {E->x, E->y},
+ .timeMs = E.timeMs,
+ .absolute = E.absolute,
.device = self.lock(),
});
- }, this, "CMouse");
+ });
- hyprListener_button.initCallback(&mouse->events.button, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_button_event*)data;
+ listeners.button = mouse->events.button.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::IPointer::SButtonEvent>(d);
pointerEvents.button.emit(SButtonEvent{
- .timeMs = E->time_msec,
- .button = E->button,
- .state = (wl_pointer_button_state)E->state,
+ .timeMs = E.timeMs,
+ .button = E.button,
+ .state = E.pressed ? WL_POINTER_BUTTON_STATE_PRESSED : WL_POINTER_BUTTON_STATE_RELEASED,
});
- }, this, "CMouse");
+ });
- hyprListener_axis.initCallback(&mouse->events.axis, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_axis_event*)data;
+ listeners.axis = mouse->events.axis.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::IPointer::SAxisEvent>(d);
pointerEvents.axis.emit(SAxisEvent{
- .timeMs = E->time_msec,
- .source = E->source,
- .axis = E->orientation,
- .relativeDirection = E->relative_direction,
- .delta = E->delta,
- .deltaDiscrete = E->delta_discrete,
+ .timeMs = E.timeMs,
+ .source = (wl_pointer_axis_source)E.source,
+ .axis = (wl_pointer_axis)E.axis,
+ .relativeDirection = (wl_pointer_axis_relative_direction)E.direction,
+ .delta = E.delta,
+ .deltaDiscrete = E.discrete,
});
- }, this, "CMouse");
+ });
- hyprListener_frame.initCallback(&mouse->events.frame, [this] (void* owner, void* data) {
- pointerEvents.frame.emit();
- }, this, "CMouse");
+ listeners.frame = mouse->events.frame.registerListener([this](std::any d) { pointerEvents.frame.emit(); });
- hyprListener_swipeBegin.initCallback(&mouse->events.swipe_begin, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_swipe_begin_event*)data;
+ listeners.swipeBegin = mouse->events.swipeBegin.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::IPointer::SSwipeBeginEvent>(d);
pointerEvents.swipeBegin.emit(SSwipeBeginEvent{
- .timeMs = E->time_msec,
- .fingers = E->fingers,
+ .timeMs = E.timeMs,
+ .fingers = E.fingers,
});
- }, this, "CMouse");
+ });
- hyprListener_swipeEnd.initCallback(&mouse->events.swipe_end, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_swipe_end_event*)data;
+ listeners.swipeEnd = mouse->events.swipeEnd.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::IPointer::SSwipeEndEvent>(d);
pointerEvents.swipeEnd.emit(SSwipeEndEvent{
- .timeMs = E->time_msec,
- .cancelled = E->cancelled,
+ .timeMs = E.timeMs,
+ .cancelled = E.cancelled,
});
- }, this, "CMouse");
+ });
- hyprListener_swipeUpdate.initCallback(&mouse->events.swipe_update, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_swipe_update_event*)data;
+ listeners.swipeUpdate = mouse->events.swipeUpdate.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::IPointer::SSwipeUpdateEvent>(d);
pointerEvents.swipeUpdate.emit(SSwipeUpdateEvent{
- .timeMs = E->time_msec,
- .fingers = E->fingers,
- .delta = {E->dx, E->dy},
+ .timeMs = E.timeMs,
+ .fingers = E.fingers,
+ .delta = E.delta,
});
- }, this, "CMouse");
+ });
- hyprListener_pinchBegin.initCallback(&mouse->events.pinch_begin, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_pinch_begin_event*)data;
+ listeners.pinchBegin = mouse->events.pinchBegin.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::IPointer::SPinchBeginEvent>(d);
pointerEvents.pinchBegin.emit(SPinchBeginEvent{
- .timeMs = E->time_msec,
- .fingers = E->fingers,
+ .timeMs = E.timeMs,
+ .fingers = E.fingers,
});
- }, this, "CMouse");
+ });
- hyprListener_pinchEnd.initCallback(&mouse->events.pinch_end, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_pinch_end_event*)data;
+ listeners.pinchEnd = mouse->events.pinchEnd.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::IPointer::SPinchEndEvent>(d);
pointerEvents.pinchEnd.emit(SPinchEndEvent{
- .timeMs = E->time_msec,
- .cancelled = E->cancelled,
+ .timeMs = E.timeMs,
+ .cancelled = E.cancelled,
});
- }, this, "CMouse");
+ });
- hyprListener_pinchUpdate.initCallback(&mouse->events.pinch_update, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_pinch_update_event*)data;
+ listeners.pinchUpdate = mouse->events.pinchUpdate.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::IPointer::SPinchUpdateEvent>(d);
pointerEvents.pinchUpdate.emit(SPinchUpdateEvent{
- .timeMs = E->time_msec,
- .fingers = E->fingers,
- .delta = {E->dx, E->dy},
- .scale = E->scale,
- .rotation = E->rotation,
+ .timeMs = E.timeMs,
+ .fingers = E.fingers,
+ .delta = E.delta,
+ .scale = E.scale,
+ .rotation = E.rotation,
});
- }, this, "CMouse");
+ });
- hyprListener_holdBegin.initCallback(&mouse->events.hold_begin, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_hold_begin_event*)data;
+ listeners.holdBegin = mouse->events.holdBegin.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::IPointer::SHoldBeginEvent>(d);
pointerEvents.holdBegin.emit(SHoldBeginEvent{
- .timeMs = E->time_msec,
- .fingers = E->fingers,
+ .timeMs = E.timeMs,
+ .fingers = E.fingers,
});
- }, this, "CMouse");
+ });
- hyprListener_holdEnd.initCallback(&mouse->events.hold_end, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_hold_end_event*)data;
+ listeners.holdEnd = mouse->events.holdEnd.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::IPointer::SHoldEndEvent>(d);
pointerEvents.holdEnd.emit(SHoldEndEvent{
- .timeMs = E->time_msec,
- .cancelled = E->cancelled,
+ .timeMs = E.timeMs,
+ .cancelled = E.cancelled,
});
- }, this, "CMouse");
+ });
- // clang-format on
-
- deviceName = mouse->base.name ? mouse->base.name : "UNKNOWN";
-}
-
-void CMouse::disconnectCallbacks() {
- hyprListener_destroy.removeCallback();
- hyprListener_motion.removeCallback();
- hyprListener_motionAbsolute.removeCallback();
- hyprListener_button.removeCallback();
- hyprListener_axis.removeCallback();
- hyprListener_frame.removeCallback();
- hyprListener_swipeBegin.removeCallback();
- hyprListener_swipeEnd.removeCallback();
- hyprListener_swipeUpdate.removeCallback();
- hyprListener_pinchBegin.removeCallback();
- hyprListener_pinchEnd.removeCallback();
- hyprListener_pinchUpdate.removeCallback();
- hyprListener_holdBegin.removeCallback();
- hyprListener_holdEnd.removeCallback();
+ deviceName = mouse->getName();
}
bool CMouse::isVirtual() {
return false;
}
-wlr_pointer* CMouse::wlr() {
- return mouse;
+SP<Aquamarine::IPointer> CMouse::aq() {
+ return mouse.lock();
}
diff --git a/src/devices/Mouse.hpp b/src/devices/Mouse.hpp
index 40a65ca8..2b51fbe9 100644
--- a/src/devices/Mouse.hpp
+++ b/src/devices/Mouse.hpp
@@ -4,33 +4,34 @@
class CMouse : public IPointer {
public:
- static SP<CMouse> create(wlr_pointer* mouse);
+ static SP<CMouse> create(SP<Aquamarine::IPointer> mouse);
- virtual bool isVirtual();
- virtual wlr_pointer* wlr();
+ virtual bool isVirtual();
+ virtual SP<Aquamarine::IPointer> aq();
private:
- CMouse(wlr_pointer* mouse);
+ CMouse(SP<Aquamarine::IPointer> mouse);
- wlr_pointer* mouse = nullptr;
+ WP<Aquamarine::IPointer> mouse;
- void disconnectCallbacks();
+ struct {
+ CHyprSignalListener destroy;
- DYNLISTENER(destroy);
- DYNLISTENER(motion);
- DYNLISTENER(motionAbsolute);
- DYNLISTENER(button);
- DYNLISTENER(axis);
- DYNLISTENER(frame);
+ CHyprSignalListener motion;
+ CHyprSignalListener motionAbsolute;
+ CHyprSignalListener button;
+ CHyprSignalListener axis;
+ CHyprSignalListener frame;
- DYNLISTENER(swipeBegin);
- DYNLISTENER(swipeEnd);
- DYNLISTENER(swipeUpdate);
+ CHyprSignalListener swipeBegin;
+ CHyprSignalListener swipeEnd;
+ CHyprSignalListener swipeUpdate;
- DYNLISTENER(pinchBegin);
- DYNLISTENER(pinchEnd);
- DYNLISTENER(pinchUpdate);
+ CHyprSignalListener pinchBegin;
+ CHyprSignalListener pinchEnd;
+ CHyprSignalListener pinchUpdate;
- DYNLISTENER(holdBegin);
- DYNLISTENER(holdEnd);
+ CHyprSignalListener holdBegin;
+ CHyprSignalListener holdEnd;
+ } listeners;
};
diff --git a/src/devices/Tablet.cpp b/src/devices/Tablet.cpp
index b5ab16c1..71ca8991 100644
--- a/src/devices/Tablet.cpp
+++ b/src/devices/Tablet.cpp
@@ -2,8 +2,9 @@
#include "../defines.hpp"
#include "../protocols/Tablet.hpp"
#include "../protocols/core/Compositor.hpp"
+#include <aquamarine/input/Input.hpp>
-SP<CTablet> CTablet::create(wlr_tablet* tablet) {
+SP<CTablet> CTablet::create(SP<Aquamarine::ITablet> tablet) {
SP<CTablet> pTab = SP<CTablet>(new CTablet(tablet));
pTab->self = pTab;
@@ -13,7 +14,7 @@ SP<CTablet> CTablet::create(wlr_tablet* tablet) {
return pTab;
}
-SP<CTabletTool> CTabletTool::create(wlr_tablet_tool* tablet) {
+SP<CTabletTool> CTabletTool::create(SP<Aquamarine::ITabletTool> tablet) {
SP<CTabletTool> pTab = SP<CTabletTool>(new CTabletTool(tablet));
pTab->self = pTab;
@@ -23,7 +24,7 @@ SP<CTabletTool> CTabletTool::create(wlr_tablet_tool* tablet) {
return pTab;
}
-SP<CTabletPad> CTabletPad::create(wlr_tablet_pad* tablet) {
+SP<CTabletPad> CTabletPad::create(SP<Aquamarine::ITabletPad> tablet) {
SP<CTabletPad> pTab = SP<CTabletPad>(new CTabletPad(tablet));
pTab->self = pTab;
@@ -33,33 +34,25 @@ SP<CTabletPad> CTabletPad::create(wlr_tablet_pad* tablet) {
return pTab;
}
-SP<CTabletTool> CTabletTool::fromWlr(wlr_tablet_tool* tool) {
- return ((CTabletTool*)tool->data)->self.lock();
-}
-
-SP<CTablet> CTablet::fromWlr(wlr_tablet* tablet) {
- return ((CTablet*)tablet->data)->self.lock();
-}
-
-static uint32_t wlrUpdateToHl(uint32_t wlr) {
+static uint32_t aqUpdateToHl(uint32_t aq) {
uint32_t result = 0;
- if (wlr & WLR_TABLET_TOOL_AXIS_X)
+ if (aq & Aquamarine::AQ_TABLET_TOOL_AXIS_X)
result |= CTablet::eTabletToolAxes::HID_TABLET_TOOL_AXIS_X;
- if (wlr & WLR_TABLET_TOOL_AXIS_Y)
+ if (aq & Aquamarine::AQ_TABLET_TOOL_AXIS_Y)
result |= CTablet::eTabletToolAxes::HID_TABLET_TOOL_AXIS_Y;
- if (wlr & WLR_TABLET_TOOL_AXIS_DISTANCE)
+ if (aq & Aquamarine::AQ_TABLET_TOOL_AXIS_DISTANCE)
result |= CTablet::eTabletToolAxes::HID_TABLET_TOOL_AXIS_DISTANCE;
- if (wlr & WLR_TABLET_TOOL_AXIS_PRESSURE)
+ if (aq & Aquamarine::AQ_TABLET_TOOL_AXIS_PRESSURE)
result |= CTablet::eTabletToolAxes::HID_TABLET_TOOL_AXIS_PRESSURE;
- if (wlr & WLR_TABLET_TOOL_AXIS_TILT_X)
+ if (aq & Aquamarine::AQ_TABLET_TOOL_AXIS_TILT_X)
result |= CTablet::eTabletToolAxes::HID_TABLET_TOOL_AXIS_TILT_X;
- if (wlr & WLR_TABLET_TOOL_AXIS_TILT_Y)
+ if (aq & Aquamarine::AQ_TABLET_TOOL_AXIS_TILT_Y)
result |= CTablet::eTabletToolAxes::HID_TABLET_TOOL_AXIS_TILT_Y;
- if (wlr & WLR_TABLET_TOOL_AXIS_ROTATION)
+ if (aq & Aquamarine::AQ_TABLET_TOOL_AXIS_ROTATION)
result |= CTablet::eTabletToolAxes::HID_TABLET_TOOL_AXIS_ROTATION;
- if (wlr & WLR_TABLET_TOOL_AXIS_SLIDER)
+ if (aq & Aquamarine::AQ_TABLET_TOOL_AXIS_SLIDER)
result |= CTablet::eTabletToolAxes::HID_TABLET_TOOL_AXIS_SLIDER;
- if (wlr & WLR_TABLET_TOOL_AXIS_WHEEL)
+ if (aq & Aquamarine::AQ_TABLET_TOOL_AXIS_WHEEL)
result |= CTablet::eTabletToolAxes::HID_TABLET_TOOL_AXIS_WHEEL;
return result;
}
@@ -68,97 +61,81 @@ uint32_t CTablet::getCapabilities() {
return HID_INPUT_CAPABILITY_POINTER | HID_INPUT_CAPABILITY_TABLET;
}
-wlr_tablet* CTablet::wlr() {
- return tablet;
+SP<Aquamarine::ITablet> CTablet::aq() {
+ return tablet.lock();
}
-CTablet::CTablet(wlr_tablet* tablet_) : tablet(tablet_) {
+CTablet::CTablet(SP<Aquamarine::ITablet> tablet_) : tablet(tablet_) {
if (!tablet)
return;
- tablet->data = this;
-
- // clang-format off
- hyprListener_destroy.initCallback(&tablet->base.events.destroy, [this] (void* owner, void* data) {
- tablet = nullptr;
- disconnectCallbacks();
+ listeners.destroy = tablet->events.destroy.registerListener([this](std::any d) {
+ tablet.reset();
events.destroy.emit();
- }, this, "CTablet");
+ });
- hyprListener_axis.initCallback(&tablet->events.axis, [this] (void* owner, void* data) {
- auto E = (wlr_tablet_tool_axis_event*)data;
+ listeners.axis = tablet->events.axis.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::ITablet::SAxisEvent>(d);
tabletEvents.axis.emit(SAxisEvent{
- .tool = E->tool,
+ .tool = E.tool,
.tablet = self.lock(),
- .timeMs = E->time_msec,
- .updatedAxes = wlrUpdateToHl(E->updated_axes),
- .axis = {E->x, E->y},
- .axisDelta = {E->dx, E->dy},
- .tilt = {E->tilt_x, E->tilt_y},
- .pressure = E->pressure,
- .distance = E->distance,
- .rotation = E->rotation,
- .slider = E->slider,
- .wheelDelta = E->wheel_delta,
+ .timeMs = E.timeMs,
+ .updatedAxes = aqUpdateToHl(E.updatedAxes),
+ .axis = E.absolute,
+ .axisDelta = E.delta,
+ .tilt = E.tilt,
+ .pressure = E.pressure,
+ .distance = E.distance,
+ .rotation = E.rotation,
+ .slider = E.slider,
+ .wheelDelta = E.wheelDelta,
});
- }, this, "CTablet");
+ });
- hyprListener_proximity.initCallback(&tablet->events.proximity, [this] (void* owner, void* data) {
- auto E = (wlr_tablet_tool_proximity_event*)data;
+ listeners.proximity = tablet->events.proximity.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::ITablet::SProximityEvent>(d);
tabletEvents.proximity.emit(SProximityEvent{
- .tool = E->tool,
+ .tool = E.tool,
.tablet = self.lock(),
- .timeMs = E->time_msec,
- .proximity = {E->x, E->y},
- .in = E->state == WLR_TABLET_TOOL_PROXIMITY_IN,
+ .timeMs = E.timeMs,
+ .proximity = E.absolute,
+ .in = E.in,
});
- }, this, "CTablet");
+ });
- hyprListener_tip.initCallback(&tablet->events.tip, [this] (void* owner, void* data) {
- auto E = (wlr_tablet_tool_tip_event*)data;
+ listeners.tip = tablet->events.tip.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::ITablet::STipEvent>(d);
tabletEvents.tip.emit(STipEvent{
- .tool = E->tool,
+ .tool = E.tool,
.tablet = self.lock(),
- .timeMs = E->time_msec,
- .tip = {E->x, E->y},
- .in = E->state == WLR_TABLET_TOOL_TIP_DOWN,
+ .timeMs = E.timeMs,
+ .tip = E.absolute,
+ .in = E.down,
});
- }, this, "CTablet");
+ });
- hyprListener_button.initCallback(&tablet->events.button, [this] (void* owner, void* data) {
- auto E = (wlr_tablet_tool_button_event*)data;
+ listeners.button = tablet->events.button.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::ITablet::SButtonEvent>(d);
tabletEvents.button.emit(SButtonEvent{
- .tool = E->tool,
+ .tool = E.tool,
.tablet = self.lock(),
- .timeMs = E->time_msec,
- .button = E->button,
- .down = E->state == WLR_BUTTON_PRESSED,
+ .timeMs = E.timeMs,
+ .button = E.button,
+ .down = E.down,
});
- }, this, "CTablet");
- // clang-format on
+ });
- deviceName = tablet->base.name ? tablet->base.name : "UNKNOWN";
+ deviceName = tablet->getName();
}
CTablet::~CTablet() {
- if (tablet)
- tablet->data = nullptr;
-
PROTO::tablet->recheckRegisteredDevices();
}
-void CTablet::disconnectCallbacks() {
- hyprListener_axis.removeCallback();
- hyprListener_button.removeCallback();
- hyprListener_destroy.removeCallback();
- hyprListener_proximity.removeCallback();
- hyprListener_tip.removeCallback();
-}
-
eHIDType CTablet::getType() {
return HID_TYPE_TABLET;
}
@@ -167,138 +144,111 @@ uint32_t CTabletPad::getCapabilities() {
return HID_INPUT_CAPABILITY_TABLET;
}
-wlr_tablet_pad* CTabletPad::wlr() {
- return pad;
+SP<Aquamarine::ITabletPad> CTabletPad::aq() {
+ return pad.lock();
}
eHIDType CTabletPad::getType() {
return HID_TYPE_TABLET_PAD;
}
-CTabletPad::CTabletPad(wlr_tablet_pad* pad_) : pad(pad_) {
+CTabletPad::CTabletPad(SP<Aquamarine::ITabletPad> pad_) : pad(pad_) {
if (!pad)
return;
- // clang-format off
- hyprListener_destroy.initCallback(&pad->base.events.destroy, [this] (void* owner, void* data) {
- pad = nullptr;
- disconnectCallbacks();
+ listeners.destroy = pad->events.destroy.registerListener([this](std::any d) {
+ pad.reset();
events.destroy.emit();
- }, this, "CTabletPad");
+ });
- hyprListener_button.initCallback(&pad->events.button, [this] (void* owner, void* data) {
- auto E = (wlr_tablet_pad_button_event*)data;
+ listeners.button = pad->events.button.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::ITabletPad::SButtonEvent>(d);
padEvents.button.emit(SButtonEvent{
- .timeMs = E->time_msec,
- .button = E->button,
- .down = E->state == WLR_BUTTON_PRESSED,
- .mode = E->mode,
- .group = E->group,
+ .timeMs = E.timeMs,
+ .button = E.button,
+ .down = E.down,
+ .mode = E.mode,
+ .group = E.group,
});
- }, this, "CTabletPad");
+ });
- hyprListener_ring.initCallback(&pad->events.ring, [this] (void* owner, void* data) {
- auto E = (wlr_tablet_pad_ring_event*)data;
+ listeners.ring = pad->events.ring.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::ITabletPad::SRingEvent>(d);
padEvents.ring.emit(SRingEvent{
- .timeMs = E->time_msec,
- .finger = E->source == WLR_TABLET_PAD_RING_SOURCE_FINGER,
- .ring = E->ring,
- .position = E->position,
- .mode = E->mode,
+ .timeMs = E.timeMs,
+ .finger = E.source == Aquamarine::ITabletPad::AQ_TABLET_PAD_RING_SOURCE_FINGER,
+ .ring = E.ring,
+ .position = E.pos,
+ .mode = E.mode,
});
- }, this, "CTabletPad");
+ });
- hyprListener_strip.initCallback(&pad->events.strip, [this] (void* owner, void* data) {
- auto E = (wlr_tablet_pad_strip_event*)data;
+ listeners.strip = pad->events.strip.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::ITabletPad::SStripEvent>(d);
padEvents.strip.emit(SStripEvent{
- .timeMs = E->time_msec,
- .finger = E->source == WLR_TABLET_PAD_STRIP_SOURCE_FINGER,
- .strip = E->strip,
- .position = E->position,
- .mode = E->mode,
+ .timeMs = E.timeMs,
+ .finger = E.source == Aquamarine::ITabletPad::AQ_TABLET_PAD_STRIP_SOURCE_FINGER,
+ .strip = E.strip,
+ .position = E.pos,
+ .mode = E.mode,
});
- }, this, "CTabletPad");
+ });
- hyprListener_attach.initCallback(&pad->events.attach_tablet, [this] (void* owner, void* data) {
- if (!data)
- return;
-
- padEvents.attach.emit(CTabletTool::fromWlr((wlr_tablet_tool*)data));
- }, this, "CTabletPad");
- // clang-format on
+ listeners.attach = pad->events.attach.registerListener([this](std::any d) {
+ ; // TODO: this doesn't do anything in aq atm
+ });
- deviceName = pad->base.name ? pad->base.name : "UNKNOWN";
+ deviceName = pad->getName();
}
CTabletPad::~CTabletPad() {
PROTO::tablet->recheckRegisteredDevices();
}
-void CTabletPad::disconnectCallbacks() {
- hyprListener_ring.removeCallback();
- hyprListener_button.removeCallback();
- hyprListener_destroy.removeCallback();
- hyprListener_strip.removeCallback();
- hyprListener_attach.removeCallback();
-}
-
uint32_t CTabletTool::getCapabilities() {
return HID_INPUT_CAPABILITY_POINTER | HID_INPUT_CAPABILITY_TABLET;
}
-wlr_tablet_tool* CTabletTool::wlr() {
- return tool;
+SP<Aquamarine::ITabletTool> CTabletTool::aq() {
+ return tool.lock();
}
eHIDType CTabletTool::getType() {
return HID_TYPE_TABLET_TOOL;
}
-CTabletTool::CTabletTool(wlr_tablet_tool* tool_) : tool(tool_) {
+CTabletTool::CTabletTool(SP<Aquamarine::ITabletTool> tool_) : tool(tool_) {
if (!tool)
return;
- // clang-format off
- hyprListener_destroy.initCallback(&tool->events.destroy, [this] (void* owner, void* data) {
- tool = nullptr;
- disconnectCallbacks();
+ listeners.destroyTool = tool->events.destroy.registerListener([this](std::any d) {
+ tool.reset();
events.destroy.emit();
- }, this, "CTabletTool");
- // clang-format on
+ });
- if (tool->tilt)
+ if (tool->capabilities & Aquamarine::ITabletTool::AQ_TABLET_TOOL_CAPABILITY_TILT)
toolCapabilities |= HID_TABLET_TOOL_CAPABILITY_TILT;
- if (tool->pressure)
+ if (tool->capabilities & Aquamarine::ITabletTool::AQ_TABLET_TOOL_CAPABILITY_PRESSURE)
toolCapabilities |= HID_TABLET_TOOL_CAPABILITY_PRESSURE;
- if (tool->distance)
+ if (tool->capabilities & Aquamarine::ITabletTool::AQ_TABLET_TOOL_CAPABILITY_DISTANCE)
toolCapabilities |= HID_TABLET_TOOL_CAPABILITY_DISTANCE;
- if (tool->rotation)
+ if (tool->capabilities & Aquamarine::ITabletTool::AQ_TABLET_TOOL_CAPABILITY_ROTATION)
toolCapabilities |= HID_TABLET_TOOL_CAPABILITY_ROTATION;
- if (tool->slider)
+ if (tool->capabilities & Aquamarine::ITabletTool::AQ_TABLET_TOOL_CAPABILITY_SLIDER)
toolCapabilities |= HID_TABLET_TOOL_CAPABILITY_SLIDER;
- if (tool->wheel)
+ if (tool->capabilities & Aquamarine::ITabletTool::AQ_TABLET_TOOL_CAPABILITY_WHEEL)
toolCapabilities |= HID_TABLET_TOOL_CAPABILITY_WHEEL;
- tool->data = this;
-
- deviceName = std::to_string(tool->hardware_serial) + std::to_string(tool->hardware_wacom);
+ deviceName = std::format("{:x}-{:x}", tool->serial, tool->id);
}
CTabletTool::~CTabletTool() {
- if (tool)
- tool->data = nullptr;
-
PROTO::tablet->recheckRegisteredDevices();
}
-void CTabletTool::disconnectCallbacks() {
- hyprListener_destroy.removeCallback();
- listeners.destroySurface.reset();
-}
-
SP<CWLSurfaceResource> CTabletTool::getSurface() {
return pSurface.lock();
}
diff --git a/src/devices/Tablet.hpp b/src/devices/Tablet.hpp
index ada2cf89..0efbe796 100644
--- a/src/devices/Tablet.hpp
+++ b/src/devices/Tablet.hpp
@@ -6,9 +6,9 @@
#include "../helpers/math/Math.hpp"
#include "../helpers/math/Math.hpp"
-struct wlr_tablet;
-struct wlr_tablet_tool;
-struct wlr_tablet_pad;
+AQUAMARINE_FORWARD(ITablet);
+AQUAMARINE_FORWARD(ITabletTool);
+AQUAMARINE_FORWARD(ITabletPad);
class CTabletTool;
class CTabletPad;
@@ -21,13 +21,12 @@ class CWLSurfaceResource;
*/
class CTablet : public IHID {
public:
- static SP<CTablet> create(wlr_tablet* tablet);
- static SP<CTablet> fromWlr(wlr_tablet* tablet);
+ static SP<CTablet> create(SP<Aquamarine::ITablet> tablet);
~CTablet();
- virtual uint32_t getCapabilities();
- virtual eHIDType getType();
- wlr_tablet* wlr();
+ virtual uint32_t getCapabilities();
+ virtual eHIDType getType();
+ SP<Aquamarine::ITablet> aq();
enum eTabletToolAxes {
HID_TABLET_TOOL_AXIS_X = (1 << 0),
@@ -42,46 +41,46 @@ class CTablet : public IHID {
};
struct SAxisEvent {
- wlr_tablet_tool* tool;
- SP<CTablet> tablet;
-
- uint32_t timeMs = 0;
- uint32_t updatedAxes = 0; // eTabletToolAxes
- Vector2D axis;
- Vector2D axisDelta;
- Vector2D tilt;
- double pressure = 0;
- double distance = 0;
- double rotation = 0;
- double slider = 0;
- double wheelDelta = 0;
+ SP<Aquamarine::ITabletTool> tool;
+ SP<CTablet> tablet;
+
+ uint32_t timeMs = 0;
+ uint32_t updatedAxes = 0; // eTabletToolAxes
+ Vector2D axis;
+ Vector2D axisDelta;
+ Vector2D tilt;
+ double pressure = 0;
+ double distance = 0;
+ double rotation = 0;
+ double slider = 0;
+ double wheelDelta = 0;
};
struct SProximityEvent {
- wlr_tablet_tool* tool;
- SP<CTablet> tablet;
+ SP<Aquamarine::ITabletTool> tool;
+ SP<CTablet> tablet;
- uint32_t timeMs = 0;
- Vector2D proximity;
- bool in = false;
+ uint32_t timeMs = 0;
+ Vector2D proximity;
+ bool in = false;
};
struct STipEvent {
- wlr_tablet_tool* tool;
- SP<CTablet> tablet;
+ SP<Aquamarine::ITabletTool> tool;
+ SP<CTablet> tablet;
- uint32_t timeMs = 0;
- Vector2D tip;
- bool in = false;
+ uint32_t timeMs = 0;
+ Vector2D tip;
+ bool in = false;
};
struct SButtonEvent {
- wlr_tablet_tool* tool;
- SP<CTablet> tablet;
+ SP<Aquamarine::ITabletTool> tool;
+ SP<CTablet> tablet;
- uint32_t timeMs = 0;
- uint32_t button;
- bool down = false;
+ uint32_t timeMs = 0;
+ uint32_t button;
+ bool down = false;
};
struct {
@@ -100,27 +99,27 @@ class CTablet : public IHID {
CBox boundBox; // output-local
private:
- CTablet(wlr_tablet* tablet);
+ CTablet(SP<Aquamarine::ITablet> tablet);
- void disconnectCallbacks();
+ WP<Aquamarine::ITablet> tablet;
- wlr_tablet* tablet = nullptr;
-
- DYNLISTENER(destroy);
- DYNLISTENER(axis);
- DYNLISTENER(proximity);
- DYNLISTENER(tip);
- DYNLISTENER(button);
+ struct {
+ CHyprSignalListener destroy;
+ CHyprSignalListener axis;
+ CHyprSignalListener proximity;
+ CHyprSignalListener tip;
+ CHyprSignalListener button;
+ } listeners;
};
class CTabletPad : public IHID {
public:
- static SP<CTabletPad> create(wlr_tablet_pad* pad);
+ static SP<CTabletPad> create(SP<Aquamarine::ITabletPad> pad);
~CTabletPad();
- virtual uint32_t getCapabilities();
- virtual eHIDType getType();
- wlr_tablet_pad* wlr();
+ virtual uint32_t getCapabilities();
+ virtual eHIDType getType();
+ SP<Aquamarine::ITabletPad> aq();
struct SButtonEvent {
uint32_t timeMs = 0;
@@ -159,23 +158,22 @@ class CTabletPad : public IHID {
std::string hlName;
private:
- CTabletPad(wlr_tablet_pad* pad);
+ CTabletPad(SP<Aquamarine::ITabletPad> pad);
- void disconnectCallbacks();
+ WP<Aquamarine::ITabletPad> pad;
- wlr_tablet_pad* pad = nullptr;
-
- DYNLISTENER(destroy);
- DYNLISTENER(ring);
- DYNLISTENER(strip);
- DYNLISTENER(button);
- DYNLISTENER(attach);
+ struct {
+ CHyprSignalListener destroy;
+ CHyprSignalListener ring;
+ CHyprSignalListener strip;
+ CHyprSignalListener button;
+ CHyprSignalListener attach;
+ } listeners;
};
class CTabletTool : public IHID {
public:
- static SP<CTabletTool> create(wlr_tablet_tool* tool);
- static SP<CTabletTool> fromWlr(wlr_tablet_tool* tool);
+ static SP<CTabletTool> create(SP<Aquamarine::ITabletTool> tool);
~CTabletTool();
enum eTabletToolType {
@@ -198,35 +196,31 @@ class CTabletTool : public IHID {
HID_TABLET_TOOL_CAPABILITY_WHEEL = (1 << 5),
};
- virtual uint32_t getCapabilities();
- wlr_tablet_tool* wlr();
- virtual eHIDType getType();
- SP<CWLSurfaceResource> getSurface();
- void setSurface(SP<CWLSurfaceResource>);
+ virtual uint32_t getCapabilities();
+ SP<Aquamarine::ITabletTool> aq();
+ virtual eHIDType getType();
+ SP<CWLSurfaceResource> getSurface();
+ void setSurface(SP<CWLSurfaceResource>);
- WP<CTabletTool> self;
- Vector2D tilt;
- bool active = false; // true if in proximity
- uint32_t toolCapabilities = 0;
+ WP<CTabletTool> self;
+ Vector2D tilt;
+ bool active = false; // true if in proximity
+ uint32_t toolCapabilities = 0;
- bool isDown = false;
- std::vector<uint32_t> buttonsDown;
- Vector2D absolutePos; // last known absolute position.
+ bool isDown = false;
+ std::vector<uint32_t> buttonsDown;
+ Vector2D absolutePos; // last known absolute position.
- std::string hlName;
+ std::string hlName;
private:
- CTabletTool(wlr_tablet_tool* tool);
-
- void disconnectCallbacks();
-
- WP<CWLSurfaceResource> pSurface;
-
- wlr_tablet_tool* tool = nullptr;
+ CTabletTool(SP<Aquamarine::ITabletTool> tool);
- DYNLISTENER(destroy);
+ WP<CWLSurfaceResource> pSurface;
+ WP<Aquamarine::ITabletTool> tool;
struct {
CHyprSignalListener destroySurface;
+ CHyprSignalListener destroyTool;
} listeners;
}; \ No newline at end of file
diff --git a/src/devices/TouchDevice.cpp b/src/devices/TouchDevice.cpp
index 64c521a2..25b7b503 100644
--- a/src/devices/TouchDevice.cpp
+++ b/src/devices/TouchDevice.cpp
@@ -1,7 +1,8 @@
#include "TouchDevice.hpp"
#include "../defines.hpp"
+#include <aquamarine/input/Input.hpp>
-SP<CTouchDevice> CTouchDevice::create(wlr_touch* touch) {
+SP<CTouchDevice> CTouchDevice::create(SP<Aquamarine::ITouch> touch) {
SP<CTouchDevice> pTouch = SP<CTouchDevice>(new CTouchDevice(touch));
pTouch->self = pTouch;
@@ -9,78 +10,63 @@ SP<CTouchDevice> CTouchDevice::create(wlr_touch* touch) {
return pTouch;
}
-CTouchDevice::CTouchDevice(wlr_touch* touch_) : touch(touch_) {
+CTouchDevice::CTouchDevice(SP<Aquamarine::ITouch> touch_) : touch(touch_) {
if (!touch)
return;
- // clang-format off
- hyprListener_destroy.initCallback(&touch->base.events.destroy, [this] (void* owner, void* data) {
+ listeners.destroy = touch->events.destroy.registerListener([this](std::any d) {
events.destroy.emit();
- disconnectCallbacks();
- touch = nullptr;
- }, this, "CTouchDevice");
+ touch.reset();
+ });
- hyprListener_down.initCallback(&touch->events.down, [this] (void* owner, void* data) {
- auto E = (wlr_touch_down_event*)data;
+ listeners.down = touch->events.down.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::ITouch::SDownEvent>(d);
touchEvents.down.emit(SDownEvent{
- .timeMs = E->time_msec,
- .touchID = E->touch_id,
- .pos = {E->x, E->y},
+ .timeMs = E.timeMs,
+ .touchID = E.touchID,
+ .pos = E.pos,
.device = self.lock(),
});
- }, this, "CTouchDevice");
+ });
- hyprListener_up.initCallback(&touch->events.up, [this] (void* owner, void* data) {
- auto E = (wlr_touch_up_event*)data;
+ listeners.up = touch->events.up.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::ITouch::SUpEvent>(d);
touchEvents.up.emit(SUpEvent{
- .timeMs = E->time_msec,
- .touchID = E->touch_id
+ .timeMs = E.timeMs,
+ .touchID = E.touchID,
});
- }, this, "CTouchDevice");
+ });
- hyprListener_motion.initCallback(&touch->events.motion, [this] (void* owner, void* data) {
- auto E = (wlr_touch_motion_event*)data;
+ listeners.motion = touch->events.move.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::ITouch::SMotionEvent>(d);
touchEvents.motion.emit(SMotionEvent{
- .timeMs = E->time_msec,
- .touchID = E->touch_id,
- .pos = {E->x, E->y},
+ .timeMs = E.timeMs,
+ .touchID = E.touchID,
+ .pos = E.pos,
});
- }, this, "CTouchDevice");
+ });
- hyprListener_cancel.initCallback(&touch->events.cancel, [this] (void* owner, void* data) {
- auto E = (wlr_touch_cancel_event*)data;
+ listeners.cancel = touch->events.cancel.registerListener([this](std::any d) {
+ auto E = std::any_cast<Aquamarine::ITouch::SCancelEvent>(d);
touchEvents.cancel.emit(SCancelEvent{
- .timeMs = E->time_msec,
- .touchID = E->touch_id
+ .timeMs = E.timeMs,
+ .touchID = E.touchID,
});
- }, this, "CTouchDevice");
+ });
- hyprListener_frame.initCallback(&touch->events.frame, [this] (void* owner, void* data) {
- touchEvents.frame.emit();
- }, this, "CTouchDevice");
+ listeners.frame = touch->events.frame.registerListener([this](std::any d) { touchEvents.frame.emit(); });
- // clang-format on
-
- deviceName = touch->base.name ? touch->base.name : "UNKNOWN";
+ deviceName = touch->getName();
}
bool CTouchDevice::isVirtual() {
return false;
}
-wlr_touch* CTouchDevice::wlr() {
- return touch;
-}
-
-void CTouchDevice::disconnectCallbacks() {
- hyprListener_destroy.removeCallback();
- hyprListener_down.removeCallback();
- hyprListener_up.removeCallback();
- hyprListener_motion.removeCallback();
- hyprListener_cancel.removeCallback();
- hyprListener_frame.removeCallback();
+SP<Aquamarine::ITouch> CTouchDevice::aq() {
+ return touch.lock();
}
diff --git a/src/devices/TouchDevice.hpp b/src/devices/TouchDevice.hpp
index 51eb76d4..b18df2d0 100644
--- a/src/devices/TouchDevice.hpp
+++ b/src/devices/TouchDevice.hpp
@@ -4,22 +4,22 @@
class CTouchDevice : public ITouch {
public:
- static SP<CTouchDevice> create(wlr_touch* touch);
+ static SP<CTouchDevice> create(SP<Aquamarine::ITouch> touch);
- virtual bool isVirtual();
- virtual wlr_touch* wlr();
+ virtual bool isVirtual();
+ virtual SP<Aquamarine::ITouch> aq();
private:
- CTouchDevice(wlr_touch* touch);
+ CTouchDevice(SP<Aquamarine::ITouch> touch);
- wlr_touch* touch = nullptr;
+ WP<Aquamarine::ITouch> touch;
- void disconnectCallbacks();
-
- DYNLISTENER(destroy);
- DYNLISTENER(down);
- DYNLISTENER(up);
- DYNLISTENER(motion);
- DYNLISTENER(cancel);
- DYNLISTENER(frame);
+ struct {
+ CHyprSignalListener destroy;
+ CHyprSignalListener down;
+ CHyprSignalListener up;
+ CHyprSignalListener motion;
+ CHyprSignalListener cancel;
+ CHyprSignalListener frame;
+ } listeners;
}; \ No newline at end of file
diff --git a/src/devices/VirtualKeyboard.cpp b/src/devices/VirtualKeyboard.cpp
index e2be0078..654ca9f5 100644
--- a/src/devices/VirtualKeyboard.cpp
+++ b/src/devices/VirtualKeyboard.cpp
@@ -14,58 +14,37 @@ CVirtualKeyboard::CVirtualKeyboard(SP<CVirtualKeyboardV1Resource> keeb_) : keybo
if (!keeb_)
return;
- auto keeb = keeb_->wlr();
-
- // clang-format off
- hyprListener_destroy.initCallback(&keeb->base.events.destroy, [this] (void* owner, void* data) {
- disconnectCallbacks();
+ listeners.destroy = keeb_->events.destroy.registerListener([this](std::any d) {
keyboard.reset();
- events.destroy.emit();
- }, this, "CVirtualKeyboard");
-
- hyprListener_key.initCallback(&keeb->events.key, [this] (void* owner, void* data) {
- auto E = (wlr_keyboard_key_event*)data;
-
- keyboardEvents.key.emit(SKeyEvent{
- .timeMs = E->time_msec,
- .keycode = E->keycode,
- .updateMods = E->update_state,
- .state = E->state,
+ events.destroy.emit();
+ });
+
+ listeners.key = keeb_->events.key.registerListener([this](std::any d) { keyboardEvents.key.emit(d); });
+ listeners.modifiers = keeb_->events.modifiers.registerListener([this](std::any d) {
+ auto E = std::any_cast<SModifiersEvent>(d);
+ updateModifiers(E.depressed, E.latched, E.locked, E.group);
+ keyboardEvents.modifiers.emit(SModifiersEvent{
+ .depressed = modifiersState.depressed,
+ .latched = modifiersState.latched,
+ .locked = modifiersState.locked,
+ .group = modifiersState.group,
});
- }, this, "CVirtualKeyboard");
-
- hyprListener_keymap.initCallback(&keeb->events.keymap, [this] (void* owner, void* data) {
- keyboardEvents.keymap.emit();
- }, this, "CVirtualKeyboard");
-
- hyprListener_modifiers.initCallback(&keeb->events.modifiers, [this] (void* owner, void* data) {
- keyboardEvents.modifiers.emit();
- }, this, "CVirtualKeyboard");
-
- hyprListener_repeatInfo.initCallback(&keeb->events.repeat_info, [this] (void* owner, void* data) {
- keyboardEvents.repeatInfo.emit();
- }, this, "CVirtualKeyboard");
- // clang-format on
-
- deviceName = keeb->base.name ? keeb->base.name : "UNKNOWN";
+ });
+ listeners.keymap = keeb_->events.keymap.registerListener([this](std::any d) {
+ auto E = std::any_cast<SKeymapEvent>(d);
+ xkbKeymap = xkb_keymap_ref(E.keymap);
+ keyboardEvents.keymap.emit(d);
+ });
+
+ deviceName = keeb_->name;
}
bool CVirtualKeyboard::isVirtual() {
return true;
}
-wlr_keyboard* CVirtualKeyboard::wlr() {
- if (keyboard.expired())
- return nullptr;
- return keyboard->wlr();
-}
-
-void CVirtualKeyboard::disconnectCallbacks() {
- hyprListener_destroy.removeCallback();
- hyprListener_key.removeCallback();
- hyprListener_keymap.removeCallback();
- hyprListener_repeatInfo.removeCallback();
- hyprListener_modifiers.removeCallback();
+SP<Aquamarine::IKeyboard> CVirtualKeyboard::aq() {
+ return nullptr;
}
wl_client* CVirtualKeyboard::getClient() {
diff --git a/src/devices/VirtualKeyboard.hpp b/src/devices/VirtualKeyboard.hpp
index 5ef88dd3..12a3907c 100644
--- a/src/devices/VirtualKeyboard.hpp
+++ b/src/devices/VirtualKeyboard.hpp
@@ -6,23 +6,22 @@ class CVirtualKeyboardV1Resource;
class CVirtualKeyboard : public IKeyboard {
public:
- static SP<CVirtualKeyboard> create(SP<CVirtualKeyboardV1Resource> keeb);
+ static SP<CVirtualKeyboard> create(SP<CVirtualKeyboardV1Resource> keeb);
- virtual bool isVirtual();
- virtual wlr_keyboard* wlr();
+ virtual bool isVirtual();
+ virtual SP<Aquamarine::IKeyboard> aq();
- wl_client* getClient();
+ wl_client* getClient();
private:
CVirtualKeyboard(SP<CVirtualKeyboardV1Resource> keeb);
WP<CVirtualKeyboardV1Resource> keyboard;
- void disconnectCallbacks();
-
- DYNLISTENER(destroy);
- DYNLISTENER(key);
- DYNLISTENER(modifiers);
- DYNLISTENER(keymap);
- DYNLISTENER(repeatInfo);
+ struct {
+ CHyprSignalListener destroy;
+ CHyprSignalListener key;
+ CHyprSignalListener modifiers;
+ CHyprSignalListener keymap;
+ } listeners;
};
diff --git a/src/devices/VirtualPointer.cpp b/src/devices/VirtualPointer.cpp
index c8ee3332..faca27dc 100644
--- a/src/devices/VirtualPointer.cpp
+++ b/src/devices/VirtualPointer.cpp
@@ -1,5 +1,6 @@
#include "VirtualPointer.hpp"
#include "../protocols/VirtualPointer.hpp"
+#include <aquamarine/input/Input.hpp>
SP<CVirtualPointer> CVirtualPointer::create(SP<CVirtualPointerV1Resource> resource) {
SP<CVirtualPointer> pPointer = SP<CVirtualPointer>(new CVirtualPointer(resource));
@@ -13,165 +14,32 @@ CVirtualPointer::CVirtualPointer(SP<CVirtualPointerV1Resource> resource) : point
if (!resource->good())
return;
- auto mouse = resource->wlr();
-
- // clang-format off
- hyprListener_destroy.initCallback(&mouse->base.events.destroy, [this] (void* owner, void* data) {
- disconnectCallbacks();
+ listeners.destroy = pointer->events.destroy.registerListener([this](std::any d) {
+ pointer.reset();
events.destroy.emit();
- }, this, "CVirtualPointer");
-
- hyprListener_motion.initCallback(&mouse->events.motion, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_motion_event*)data;
-
- pointerEvents.motion.emit(SMotionEvent{
- .timeMs = E->time_msec,
- .delta = {E->delta_x, E->delta_y},
- .unaccel = {E->unaccel_dx, E->unaccel_dy},
- });
- }, this, "CVirtualPointer");
-
- hyprListener_motionAbsolute.initCallback(&mouse->events.motion_absolute, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_motion_absolute_event*)data;
-
- pointerEvents.motionAbsolute.emit(SMotionAbsoluteEvent{
- .timeMs = E->time_msec,
- .absolute = {E->x, E->y},
- .device = self.lock(),
- });
- }, this, "CVirtualPointer");
-
- hyprListener_button.initCallback(&mouse->events.button, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_button_event*)data;
-
- pointerEvents.button.emit(SButtonEvent{
- .timeMs = E->time_msec,
- .button = E->button,
- .state = (wl_pointer_button_state)E->state,
- });
- }, this, "CVirtualPointer");
-
- hyprListener_axis.initCallback(&mouse->events.axis, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_axis_event*)data;
-
- pointerEvents.axis.emit(SAxisEvent{
- .timeMs = E->time_msec,
- .source = E->source,
- .axis = E->orientation,
- .relativeDirection = E->relative_direction,
- .delta = E->delta,
- .deltaDiscrete = E->delta_discrete,
- });
- }, this, "CVirtualPointer");
-
- hyprListener_frame.initCallback(&mouse->events.frame, [this] (void* owner, void* data) {
- pointerEvents.frame.emit();
- }, this, "CVirtualPointer");
-
- hyprListener_swipeBegin.initCallback(&mouse->events.swipe_begin, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_swipe_begin_event*)data;
-
- pointerEvents.swipeBegin.emit(SSwipeBeginEvent{
- .timeMs = E->time_msec,
- .fingers = E->fingers,
- });
- }, this, "CVirtualPointer");
-
- hyprListener_swipeEnd.initCallback(&mouse->events.swipe_end, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_swipe_end_event*)data;
-
- pointerEvents.swipeEnd.emit(SSwipeEndEvent{
- .timeMs = E->time_msec,
- .cancelled = E->cancelled,
- });
- }, this, "CVirtualPointer");
-
- hyprListener_swipeUpdate.initCallback(&mouse->events.swipe_update, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_swipe_update_event*)data;
-
- pointerEvents.swipeUpdate.emit(SSwipeUpdateEvent{
- .timeMs = E->time_msec,
- .fingers = E->fingers,
- .delta = {E->dx, E->dy},
- });
- }, this, "CVirtualPointer");
-
- hyprListener_pinchBegin.initCallback(&mouse->events.pinch_begin, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_pinch_begin_event*)data;
-
- pointerEvents.pinchBegin.emit(SPinchBeginEvent{
- .timeMs = E->time_msec,
- .fingers = E->fingers,
- });
- }, this, "CVirtualPointer");
-
- hyprListener_pinchEnd.initCallback(&mouse->events.pinch_end, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_pinch_end_event*)data;
-
- pointerEvents.pinchEnd.emit(SPinchEndEvent{
- .timeMs = E->time_msec,
- .cancelled = E->cancelled,
- });
- }, this, "CVirtualPointer");
-
- hyprListener_pinchUpdate.initCallback(&mouse->events.pinch_update, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_pinch_update_event*)data;
-
- pointerEvents.pinchUpdate.emit(SPinchUpdateEvent{
- .timeMs = E->time_msec,
- .fingers = E->fingers,
- .delta = {E->dx, E->dy},
- .scale = E->scale,
- .rotation = E->rotation,
- });
- }, this, "CVirtualPointer");
-
- hyprListener_holdBegin.initCallback(&mouse->events.hold_begin, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_hold_begin_event*)data;
-
- pointerEvents.holdBegin.emit(SHoldBeginEvent{
- .timeMs = E->time_msec,
- .fingers = E->fingers,
- });
- }, this, "CVirtualPointer");
-
- hyprListener_holdEnd.initCallback(&mouse->events.hold_end, [this] (void* owner, void* data) {
- auto E = (wlr_pointer_hold_end_event*)data;
-
- pointerEvents.holdEnd.emit(SHoldEndEvent{
- .timeMs = E->time_msec,
- .cancelled = E->cancelled,
- });
- }, this, "CVirtualPointer");
-
- // clang-format on
-
- deviceName = mouse->base.name ? mouse->base.name : "UNKNOWN";
+ });
+
+ listeners.motion = pointer->events.move.registerListener([this](std::any d) { pointerEvents.motion.emit(d); });
+ listeners.motionAbsolute = pointer->events.warp.registerListener([this](std::any d) { pointerEvents.motionAbsolute.emit(d); });
+ listeners.button = pointer->events.button.registerListener([this](std::any d) { pointerEvents.button.emit(d); });
+ listeners.axis = pointer->events.axis.registerListener([this](std::any d) { pointerEvents.axis.emit(d); });
+ listeners.frame = pointer->events.frame.registerListener([this](std::any d) { pointerEvents.frame.emit(); });
+ listeners.swipeBegin = pointer->events.swipeBegin.registerListener([this](std::any d) { pointerEvents.swipeBegin.emit(d); });
+ listeners.swipeEnd = pointer->events.swipeEnd.registerListener([this](std::any d) { pointerEvents.swipeEnd.emit(d); });
+ listeners.swipeUpdate = pointer->events.swipeUpdate.registerListener([this](std::any d) { pointerEvents.swipeUpdate.emit(d); });
+ listeners.pinchBegin = pointer->events.pinchBegin.registerListener([this](std::any d) { pointerEvents.pinchBegin.emit(d); });
+ listeners.pinchEnd = pointer->events.pinchEnd.registerListener([this](std::any d) { pointerEvents.pinchEnd.emit(d); });
+ listeners.pinchUpdate = pointer->events.pinchUpdate.registerListener([this](std::any d) { pointerEvents.pinchUpdate.emit(d); });
+ listeners.holdBegin = pointer->events.holdBegin.registerListener([this](std::any d) { pointerEvents.holdBegin.emit(d); });
+ listeners.holdEnd = pointer->events.holdEnd.registerListener([this](std::any d) { pointerEvents.holdEnd.emit(d); });
+
+ deviceName = pointer->name;
}
bool CVirtualPointer::isVirtual() {
return true;
}
-void CVirtualPointer::disconnectCallbacks() {
- hyprListener_destroy.removeCallback();
- hyprListener_motion.removeCallback();
- hyprListener_motionAbsolute.removeCallback();
- hyprListener_button.removeCallback();
- hyprListener_axis.removeCallback();
- hyprListener_frame.removeCallback();
- hyprListener_swipeBegin.removeCallback();
- hyprListener_swipeEnd.removeCallback();
- hyprListener_swipeUpdate.removeCallback();
- hyprListener_pinchBegin.removeCallback();
- hyprListener_pinchEnd.removeCallback();
- hyprListener_pinchUpdate.removeCallback();
- hyprListener_holdBegin.removeCallback();
- hyprListener_holdEnd.removeCallback();
-}
-
-wlr_pointer* CVirtualPointer::wlr() {
- if (pointer.expired())
- return nullptr;
- return pointer->wlr();
+SP<Aquamarine::IPointer> CVirtualPointer::aq() {
+ return nullptr;
}
diff --git a/src/devices/VirtualPointer.hpp b/src/devices/VirtualPointer.hpp
index b22c8bf2..1ecfd842 100644
--- a/src/devices/VirtualPointer.hpp
+++ b/src/devices/VirtualPointer.hpp
@@ -6,33 +6,34 @@ class CVirtualPointerV1Resource;
class CVirtualPointer : public IPointer {
public:
- static SP<CVirtualPointer> create(SP<CVirtualPointerV1Resource> resource);
+ static SP<CVirtualPointer> create(SP<CVirtualPointerV1Resource> resource);
- virtual bool isVirtual();
- virtual wlr_pointer* wlr();
+ virtual bool isVirtual();
+ virtual SP<Aquamarine::IPointer> aq();
private:
CVirtualPointer(SP<CVirtualPointerV1Resource>);
WP<CVirtualPointerV1Resource> pointer;
- void disconnectCallbacks();
+ struct {
+ CHyprSignalListener destroy;
- DYNLISTENER(destroy);
- DYNLISTENER(motion);
- DYNLISTENER(motionAbsolute);
- DYNLISTENER(button);
- DYNLISTENER(axis);
- DYNLISTENER(frame);
+ CHyprSignalListener motion;
+ CHyprSignalListener motionAbsolute;
+ CHyprSignalListener button;
+ CHyprSignalListener axis;
+ CHyprSignalListener frame;
- DYNLISTENER(swipeBegin);
- DYNLISTENER(swipeEnd);
- DYNLISTENER(swipeUpdate);
+ CHyprSignalListener swipeBegin;
+ CHyprSignalListener swipeEnd;
+ CHyprSignalListener swipeUpdate;
- DYNLISTENER(pinchBegin);
- DYNLISTENER(pinchEnd);
- DYNLISTENER(pinchUpdate);
+ CHyprSignalListener pinchBegin;
+ CHyprSignalListener pinchEnd;
+ CHyprSignalListener pinchUpdate;
- DYNLISTENER(holdBegin);
- DYNLISTENER(holdEnd);
+ CHyprSignalListener holdBegin;
+ CHyprSignalListener holdEnd;
+ } listeners;
}; \ No newline at end of file