mirror of
https://port.numenaute.org/aleajactaest/khanat-opennel-code.git
synced 2024-12-14 21:58:43 +00:00
Fixed: #1057 X11 Key auto repeat
This commit is contained in:
parent
61cc4a8830
commit
839171a10d
2 changed files with 21 additions and 15 deletions
|
@ -29,7 +29,7 @@ typedef bool (*x11Proc)(NL3D::IDriver *drv, XEvent *e);
|
||||||
|
|
||||||
namespace NLMISC {
|
namespace NLMISC {
|
||||||
|
|
||||||
CUnixEventEmitter::CUnixEventEmitter ():_dpy(NULL), _win(0), _PreviousKey(KeyNOKEY), _emulateRawMode(false), _driver(NULL)
|
CUnixEventEmitter::CUnixEventEmitter ():_dpy(NULL), _win(0), _emulateRawMode(false), _driver(NULL)
|
||||||
{
|
{
|
||||||
_im = 0;
|
_im = 0;
|
||||||
_ic = 0;
|
_ic = 0;
|
||||||
|
@ -111,7 +111,7 @@ void CUnixEventEmitter::submitEvents(CEventServer & server, bool allWindows)
|
||||||
|
|
||||||
static Bool isMouseMoveEvent(Display *display, XEvent *event, XPointer arg)
|
static Bool isMouseMoveEvent(Display *display, XEvent *event, XPointer arg)
|
||||||
{
|
{
|
||||||
return (event->type == MotionNotify);
|
return (event->type == MotionNotify);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CUnixEventEmitter::emulateMouseRawMode(bool enable)
|
void CUnixEventEmitter::emulateMouseRawMode(bool enable)
|
||||||
|
@ -124,9 +124,9 @@ void CUnixEventEmitter::emulateMouseRawMode(bool enable)
|
||||||
XGetWindowAttributes(_dpy, _win, &xwa);
|
XGetWindowAttributes(_dpy, _win, &xwa);
|
||||||
XWarpPointer(_dpy, None, _win, None, None, None, None,
|
XWarpPointer(_dpy, None, _win, None, None, None, None,
|
||||||
(xwa.width / 2), (xwa.height / 2));
|
(xwa.width / 2), (xwa.height / 2));
|
||||||
|
|
||||||
// remove all outstanding mouse move events, they happened before the mouse
|
// remove all outstanding mouse move events, they happened before the mouse
|
||||||
// was pulled back to 0.5 / 0.5, so a wrong movement delta would be
|
// was pulled back to 0.5 / 0.5, so a wrong movement delta would be
|
||||||
// reported otherwise
|
// reported otherwise
|
||||||
XEvent event;
|
XEvent event;
|
||||||
while(XCheckIfEvent(_dpy, &event, &isMouseMoveEvent, NULL)) { };
|
while(XCheckIfEvent(_dpy, &event, &isMouseMoveEvent, NULL)) { };
|
||||||
|
@ -533,8 +533,14 @@ bool CUnixEventEmitter::processMessage (XEvent &event, CEventServer *server)
|
||||||
if(key == KeyNOKEY)
|
if(key == KeyNOKEY)
|
||||||
key = getKeyFromKeycode(keyCode);
|
key = getKeyFromKeycode(keyCode);
|
||||||
|
|
||||||
server->postEvent (new CEventKeyDown (key, getKeyButton(event.xbutton.state), _PreviousKey != key, this));
|
// search for key in map
|
||||||
_PreviousKey = key;
|
std::map<TKey, bool>::const_iterator it = _PressedKeys.find(key);
|
||||||
|
|
||||||
|
// if key is not found or value is false, that's the first time
|
||||||
|
bool firstTime = (it == _PressedKeys.end()) || !it->second;
|
||||||
|
|
||||||
|
server->postEvent (new CEventKeyDown (key, getKeyButton(event.xbutton.state), firstTime, this));
|
||||||
|
_PressedKeys[key] = true;
|
||||||
|
|
||||||
// don't send a control character when deleting
|
// don't send a control character when deleting
|
||||||
if (key == KeyDELETE)
|
if (key == KeyDELETE)
|
||||||
|
@ -568,7 +574,7 @@ bool CUnixEventEmitter::processMessage (XEvent &event, CEventServer *server)
|
||||||
key = getKeyFromKeycode(event.xkey.keycode);
|
key = getKeyFromKeycode(event.xkey.keycode);
|
||||||
|
|
||||||
server->postEvent (new CEventKeyUp (key, getKeyButton(event.xbutton.state), this));
|
server->postEvent (new CEventKeyUp (key, getKeyButton(event.xbutton.state), this));
|
||||||
_PreviousKey = KeyNOKEY;
|
_PressedKeys[key] = false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,14 +89,14 @@ private:
|
||||||
|
|
||||||
void createIM();
|
void createIM();
|
||||||
|
|
||||||
Display* _dpy;
|
Display* _dpy;
|
||||||
Window _win;
|
Window _win;
|
||||||
TKey _PreviousKey;
|
std::map<TKey, bool> _PressedKeys;
|
||||||
XIM _im;
|
XIM _im;
|
||||||
XIC _ic;
|
XIC _ic;
|
||||||
bool _emulateRawMode;
|
bool _emulateRawMode;
|
||||||
NL3D::IDriver* _driver;
|
NL3D::IDriver* _driver;
|
||||||
CUnixEventServer _InternalServer;
|
CUnixEventServer _InternalServer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue