mirror of
https://github.com/gnustep/libs-back.git
synced 2025-02-23 20:01:22 +00:00
Thomas Gamper: implement key repeat support
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/back/trunk@28068 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
a764159165
commit
605c77fe48
2 changed files with 65 additions and 5 deletions
|
@ -1,3 +1,8 @@
|
|||
2009-03-12 Thomas Gamper <icicle@cg.tuwien.ac.at>
|
||||
|
||||
* Source/x11/XGServerEvent.m:
|
||||
Implement key repeat support.
|
||||
|
||||
2009-03-07 Xavier Glattard <xavier.glattard@online.fr>
|
||||
|
||||
* Source/x11/XGServerEvent.m:
|
||||
|
|
|
@ -90,6 +90,8 @@ static KeySym _help_keysyms[2];
|
|||
static BOOL _is_keyboard_initialized = NO;
|
||||
static BOOL _mod_ignore_shift = NO;
|
||||
|
||||
static BOOL next_event_is_a_keyrepeat;
|
||||
|
||||
void __objc_xgcontextevent_linking (void)
|
||||
{
|
||||
}
|
||||
|
@ -342,6 +344,7 @@ static int check_modifier (XEvent *xEvent, KeySym key_sym)
|
|||
NSGraphicsContext *gcontext;
|
||||
float deltaX;
|
||||
float deltaY;
|
||||
int buttonNumber;
|
||||
|
||||
gcontext = GSCurrentContext();
|
||||
xEvent = *event;
|
||||
|
@ -404,24 +407,35 @@ static int check_modifier (XEvent *xEvent, KeySym key_sym)
|
|||
deltaY = 0.0;
|
||||
|
||||
if (xEvent.xbutton.button == generic.lMouse)
|
||||
{
|
||||
eventType = NSLeftMouseDown;
|
||||
buttonNumber = generic.lMouse;
|
||||
}
|
||||
else if (xEvent.xbutton.button == generic.rMouse
|
||||
&& generic.rMouse != 0)
|
||||
{
|
||||
eventType = NSRightMouseDown;
|
||||
buttonNumber = generic.rMouse;
|
||||
}
|
||||
else if (xEvent.xbutton.button == generic.mMouse
|
||||
&& generic.mMouse != 0)
|
||||
{
|
||||
eventType = NSOtherMouseDown;
|
||||
buttonNumber = generic.mMouse;
|
||||
}
|
||||
else if (xEvent.xbutton.button == generic.upMouse
|
||||
&& generic.upMouse != 0)
|
||||
{
|
||||
deltaY = 1.;
|
||||
eventType = NSScrollWheel;
|
||||
buttonNumber = generic.upMouse;
|
||||
}
|
||||
else if (xEvent.xbutton.button == generic.downMouse
|
||||
&& generic.downMouse != 0)
|
||||
{
|
||||
deltaY = -1.;
|
||||
eventType = NSScrollWheel;
|
||||
buttonNumber = generic.downMouse;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -471,7 +485,7 @@ static int check_modifier (XEvent *xEvent, KeySym key_sym)
|
|||
eventNumber: xEvent.xbutton.serial
|
||||
clickCount: clickCount
|
||||
pressure: 1.0
|
||||
buttonNumber: 0 /* FIXME */
|
||||
buttonNumber: buttonNumber /* FIXME */
|
||||
deltaX: 0.
|
||||
deltaY: deltaY
|
||||
deltaZ: 0.];
|
||||
|
@ -482,13 +496,22 @@ static int check_modifier (XEvent *xEvent, KeySym key_sym)
|
|||
xEvent.xbutton.window);
|
||||
[self setLastTime: xEvent.xbutton.time];
|
||||
if (xEvent.xbutton.button == generic.lMouse)
|
||||
{
|
||||
eventType = NSLeftMouseUp;
|
||||
buttonNumber = generic.lMouse;
|
||||
}
|
||||
else if (xEvent.xbutton.button == generic.rMouse
|
||||
&& generic.rMouse != 0)
|
||||
{
|
||||
eventType = NSRightMouseUp;
|
||||
buttonNumber = generic.rMouse;
|
||||
}
|
||||
else if (xEvent.xbutton.button == generic.mMouse
|
||||
&& generic.mMouse != 0)
|
||||
{
|
||||
eventType = NSOtherMouseUp;
|
||||
buttonNumber = generic.mMouse;
|
||||
}
|
||||
else
|
||||
{
|
||||
// we ignore release of scrollUp or scrollDown
|
||||
|
@ -516,7 +539,7 @@ static int check_modifier (XEvent *xEvent, KeySym key_sym)
|
|||
eventNumber: xEvent.xbutton.serial
|
||||
clickCount: clickCount
|
||||
pressure: 1.0
|
||||
buttonNumber: 0 /* FIXMME */
|
||||
buttonNumber: buttonNumber /* FIXMME */
|
||||
deltaX: 0.0
|
||||
deltaY: 0.0
|
||||
deltaZ: 0.0];
|
||||
|
@ -1918,6 +1941,7 @@ process_key_event (XEvent* xEvent, XGServer* context, NSEventType eventType,
|
|||
int alt_key = 0;
|
||||
int help_key = 0;
|
||||
KeySym modKeysym; // process modifier independently of shift, etc.
|
||||
XEvent next_event;
|
||||
|
||||
if (_is_keyboard_initialized == NO)
|
||||
initialize_keyboard ();
|
||||
|
@ -2050,6 +2074,37 @@ process_key_event (XEvent* xEvent, XGServer* context, NSEventType eventType,
|
|||
eventType = NSFlagsChanged;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
For key repeats X creates two corresponding KeyRelease/KeyPress events.
|
||||
So, first we check for the KeyRelease event, take a look at the next
|
||||
event in the queue and look if they are a matching KeyRelease/KeyPress
|
||||
pair. If so, we mark the current KeyRelease event as a KeyRepeat, and
|
||||
set "next_event_is_a_keyrepeat" to "YES" so that we know that the next
|
||||
event is a repeat too.
|
||||
*/
|
||||
BOOL keyRepeat = NO;
|
||||
|
||||
if ( next_event_is_a_keyrepeat == YES )
|
||||
{
|
||||
keyRepeat = YES;
|
||||
next_event_is_a_keyrepeat = NO;
|
||||
}
|
||||
else if( XEventsQueued( [context xDisplay], QueuedAfterReading ) )
|
||||
{
|
||||
XPeekEvent( [context xDisplay], &next_event );
|
||||
if( next_event.type == KeyPress &&
|
||||
next_event.xkey.window == xEvent->xkey.window &&
|
||||
next_event.xkey.keycode == xEvent->xkey.keycode &&
|
||||
next_event.xkey.time == xEvent->xkey.time )
|
||||
{
|
||||
// Do not report anything for this event
|
||||
keyRepeat = YES;
|
||||
next_event_is_a_keyrepeat = YES;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (help_key)
|
||||
{
|
||||
unicode = NSHelpFunctionKey;
|
||||
|
@ -2064,7 +2119,7 @@ process_key_event (XEvent* xEvent, XGServer* context, NSEventType eventType,
|
|||
context: GSCurrentContext()
|
||||
characters: keys
|
||||
charactersIgnoringModifiers: keys
|
||||
isARepeat: NO
|
||||
isARepeat: keyRepeat
|
||||
keyCode: keyCode];
|
||||
[event_queue addObject: event];
|
||||
event = [NSEvent keyEventWithType: NSFlagsChanged
|
||||
|
@ -2100,7 +2155,7 @@ process_key_event (XEvent* xEvent, XGServer* context, NSEventType eventType,
|
|||
context: GSCurrentContext()
|
||||
characters: keys
|
||||
charactersIgnoringModifiers: keys
|
||||
isARepeat: NO
|
||||
isARepeat: keyRepeat
|
||||
keyCode: keyCode];
|
||||
return event;
|
||||
}
|
||||
|
@ -2138,7 +2193,7 @@ process_key_event (XEvent* xEvent, XGServer* context, NSEventType eventType,
|
|||
context: GSCurrentContext()
|
||||
characters: keys
|
||||
charactersIgnoringModifiers: ukeys
|
||||
isARepeat: NO /* isARepeat can't be supported with X */
|
||||
isARepeat: keyRepeat
|
||||
keyCode: keyCode];
|
||||
|
||||
return event;
|
||||
|
|
Loading…
Reference in a new issue