From a9c2a1922a6946749fb57ce14a1cde2157eec1b9 Mon Sep 17 00:00:00 2001 From: Deve Date: Thu, 4 May 2017 22:36:12 +0200 Subject: [PATCH] Some work on support clipboard --- .../source/Irrlicht/CIrrDeviceWayland.cpp | 32 +++++++++++-------- .../source/Irrlicht/CIrrDeviceWayland.h | 1 + lib/irrlicht/source/Irrlicht/COSOperator.cpp | 19 +++++++++++ lib/irrlicht/source/Irrlicht/COSOperator.h | 8 +++++ 4 files changed, 46 insertions(+), 14 deletions(-) diff --git a/lib/irrlicht/source/Irrlicht/CIrrDeviceWayland.cpp b/lib/irrlicht/source/Irrlicht/CIrrDeviceWayland.cpp index 5df1c3505..1c9f28670 100644 --- a/lib/irrlicht/source/Irrlicht/CIrrDeviceWayland.cpp +++ b/lib/irrlicht/source/Irrlicht/CIrrDeviceWayland.cpp @@ -39,8 +39,9 @@ extern bool GLContextDebugBit; #endif // _IRR_COMPILE_WITH_JOYSTICK_EVENTS_ -#define XRANDR_ROTATION_LEFT (1 << 1) -#define XRANDR_ROTATION_RIGHT (1 << 3) +#define MOD_SHIFT_MASK 0x01 +#define MOD_ALT_MASK 0x02 +#define MOD_CONTROL_MASK 0x04 namespace irr { @@ -346,9 +347,8 @@ public: irrevent.EventType = irr::EET_KEY_INPUT_EVENT; irrevent.KeyInput.PressedDown = (state == WL_KEYBOARD_KEY_STATE_PRESSED); irrevent.KeyInput.Char = xkb_keysym_to_utf32(sym); - // irrevent.KeyInput.Char = ((wchar_t*)(buf))[0]; - // irrevent.KeyInput.Control = (event.xkey.state & ControlMask) != 0; - // irrevent.KeyInput.Shift = (event.xkey.state & ShiftMask) != 0; + irrevent.KeyInput.Control = (device->modifiers & MOD_CONTROL_MASK) != 0; + irrevent.KeyInput.Shift = (device->modifiers & MOD_SHIFT_MASK) != 0; @@ -405,13 +405,14 @@ public: XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED); mask = xkb_state_serialize_mods(device->state, state_component); - //~ input->modifiers = 0; - //~ if (mask & input->xkb.control_mask) - //~ input->modifiers |= MOD_CONTROL_MASK; - //~ if (mask & input->xkb.alt_mask) - //~ input->modifiers |= MOD_ALT_MASK; - //~ if (mask & input->xkb.shift_mask) - //~ input->modifiers |= MOD_SHIFT_MASK; + + device->modifiers = 0; + if (mask & device->control_mask) + device->modifiers |= MOD_CONTROL_MASK; + if (mask & device->alt_mask) + device->modifiers |= MOD_ALT_MASK; + if (mask & device->shift_mask) + device->modifiers |= MOD_SHIFT_MASK; } static void @@ -631,7 +632,7 @@ CIrrDeviceWayland::CIrrDeviceWayland(const SIrrlichtCreationParameters& param) linuxversion += " "; linuxversion += LinuxInfo.machine; - Operator = new COSOperator(linuxversion); + Operator = new COSOperator(linuxversion, this); os::Printer::log(linuxversion.c_str(), ELL_INFORMATION); // Retrieve wayland infos @@ -1365,13 +1366,16 @@ bool CIrrDeviceWayland::getGammaRamp( f32 &red, f32 &green, f32 &blue, f32 &brig //! \return Returns 0 if no string is in there. const c8* CIrrDeviceWayland::getTextFromClipboard() const { - return 0; + printf("get text from clipboard: %s\n", Clipboard.c_str()); + return Clipboard.c_str(); } //! copies text to the clipboard void CIrrDeviceWayland::copyToClipboard(const c8* text) const { + printf("copy to clipboard: %s\n", text); + Clipboard = text; } diff --git a/lib/irrlicht/source/Irrlicht/CIrrDeviceWayland.h b/lib/irrlicht/source/Irrlicht/CIrrDeviceWayland.h index 17d33fcfb..d96680bf2 100644 --- a/lib/irrlicht/source/Irrlicht/CIrrDeviceWayland.h +++ b/lib/irrlicht/source/Irrlicht/CIrrDeviceWayland.h @@ -259,6 +259,7 @@ namespace irr xkb_mod_mask_t control_mask; xkb_mod_mask_t alt_mask; xkb_mod_mask_t shift_mask; + uint32_t modifiers; struct xkb_compose_table *compose_table; struct xkb_compose_state *compose_state; diff --git a/lib/irrlicht/source/Irrlicht/COSOperator.cpp b/lib/irrlicht/source/Irrlicht/COSOperator.cpp index 3199fd5a5..2588ada5f 100644 --- a/lib/irrlicht/source/Irrlicht/COSOperator.cpp +++ b/lib/irrlicht/source/Irrlicht/COSOperator.cpp @@ -25,6 +25,9 @@ #if defined(_IRR_COMPILE_WITH_X11_DEVICE_) #include "CIrrDeviceLinux.h" #endif +#if defined(_IRR_COMPILE_WITH_WAYLAND) +#include "CIrrDeviceWayland.h" +#endif #ifdef _IRR_COMPILE_WITH_OSX_DEVICE_ #include "MacOSX/OSXClipboard.h" #endif @@ -40,6 +43,14 @@ namespace irr } #endif +#if defined(_IRR_COMPILE_WITH_WAYLAND) +// constructor linux + COSOperator::COSOperator(const core::stringc& osVersion, CIrrDeviceWayland* device) +: OperatingSystem(osVersion), IrrDeviceWayland(device) +{ +} +#endif + // constructor COSOperator::COSOperator(const core::stringc& osVersion) : OperatingSystem(osVersion) { @@ -121,6 +132,9 @@ void COSOperator::copyToClipboard(const c8* text) const #elif defined(_IRR_COMPILE_WITH_X11_DEVICE_) if ( IrrDeviceLinux ) IrrDeviceLinux->copyToClipboard(text); +#elif defined(_IRR_COMPILE_WITH_WAYLAND) + if ( IrrDeviceWayland ) + IrrDeviceWayland->copyToClipboard(text); #else #endif @@ -177,6 +191,11 @@ const c8* COSOperator::getTextFromClipboard() const return IrrDeviceLinux->getTextFromClipboard(); return 0; +#elif defined(_IRR_COMPILE_WITH_WAYLAND) + if ( IrrDeviceWayland ) + return IrrDeviceWayland->getTextFromClipboard(); + return 0; + #else return 0; diff --git a/lib/irrlicht/source/Irrlicht/COSOperator.h b/lib/irrlicht/source/Irrlicht/COSOperator.h index 44f7680c2..c813b804a 100644 --- a/lib/irrlicht/source/Irrlicht/COSOperator.h +++ b/lib/irrlicht/source/Irrlicht/COSOperator.h @@ -11,6 +11,7 @@ namespace irr { class CIrrDeviceLinux; +class CIrrDeviceWayland; //! The Operating system operator provides operation system specific methods and informations. class COSOperator : public IOSOperator @@ -20,6 +21,9 @@ public: // constructor #if defined(_IRR_COMPILE_WITH_X11_DEVICE_) COSOperator(const core::stringc& osversion, CIrrDeviceLinux* device); +#endif +#if defined(_IRR_COMPILE_WITH_WAYLAND) + COSOperator(const core::stringc& osversion, CIrrDeviceWayland* device); #endif COSOperator(const core::stringc& osversion); @@ -59,6 +63,10 @@ private: #if defined(_IRR_COMPILE_WITH_X11_DEVICE_) CIrrDeviceLinux * IrrDeviceLinux; #endif +#if defined(_IRR_COMPILE_WITH_WAYLAND) + CIrrDeviceWayland * IrrDeviceWayland; +#endif + };