Author: fredkiefer
Date: Sat Oct 17 00:07:24 2015
New Revision: 39078
URL: http://svn.gna.org/viewcvs/gnustep?rev=39078&view=rev
Log:
* Source/x11/XGServerEvent.m (-processEvent:): Move repeate key
detection from process_key_event() to here to enable filtering
out keyUp events as Cocoa does.
Modified:
libs/back/trunk/ChangeLog
libs/back/trunk/Source/x11/XGServerEvent.m
Modified: libs/back/trunk/ChangeLog
URL:
http://svn.gna.org/viewcvs/gnustep/libs/back/trunk/ChangeLog?rev=39078&r1=39077&r2=39078&view=diff
==============================================================================
--- libs/back/trunk/ChangeLog (original)
+++ libs/back/trunk/ChangeLog Sat Oct 17 00:07:24 2015
@@ -1,3 +1,9 @@
+2015-10-16 Fred Kiefer <[email protected]>
+
+ * Source/x11/XGServerEvent.m (-processEvent:): Move repeate key
+ detection from process_key_event() to here to enable filtering out
+ keyUp events as Cocoa does.
+
2015-10-09 Fred Kiefer <[email protected]>
* Source/gsc/GSContext.m: Set some defaults.
Modified: libs/back/trunk/Source/x11/XGServerEvent.m
URL:
http://svn.gna.org/viewcvs/gnustep/libs/back/trunk/Source/x11/XGServerEvent.m?rev=39078&r1=39077&r2=39078&view=diff
==============================================================================
--- libs/back/trunk/Source/x11/XGServerEvent.m (original)
+++ libs/back/trunk/Source/x11/XGServerEvent.m Sat Oct 17 00:07:24 2015
@@ -89,8 +89,6 @@
static BOOL _is_keyboard_initialized = NO;
static BOOL _mod_ignore_shift = NO;
-static BOOL next_event_is_a_keyrepeat;
-
void __objc_xgcontextevent_linking (void)
{
}
@@ -129,7 +127,8 @@
}
static NSEvent*process_key_event (XEvent* xEvent, XGServer* ctxt,
- NSEventType eventType, NSMutableArray *event_queue);
+ NSEventType eventType,
+ NSMutableArray *event_queue, BOOL keyRepeat);
static unichar process_char (KeySym keysym, unsigned *eventModifierFlags);
@@ -334,9 +333,11 @@
{
static int clickCount = 1;
static unsigned int eventFlags;
+ static NSPoint eventLocation;
+ // Time of last key press
+ static Time downTime = 0;
NSEvent *e = nil;
XEvent xEvent;
- static NSPoint eventLocation;
NSWindow *nswin;
Window xWin;
NSEventType eventType;
@@ -1020,8 +1021,6 @@
NSDebugLLog(@"NSEvent", @"%lu Expose\n",
xEvent.xexpose.window);
{
- BOOL isSubWindow = NO;
-
if (cWin == 0 || xEvent.xexpose.window != cWin->ident)
{
generic.cachedWindow
@@ -1029,6 +1028,8 @@
}
// sub-window ?
/*
+ BOOL isSubWindow = NO;
+
{
Window xw;
xw = xEvent.xexpose.window;
@@ -1195,24 +1196,71 @@
xEvent.xgravity.window);
break;
- // a key has been pressed
+ // a key has been pressed
case KeyPress:
NSDebugLLog(@"NSEvent", @"%lu KeyPress\n",
xEvent.xkey.window);
[self setLastTime: xEvent.xkey.time];
- e = process_key_event (&xEvent, self, NSKeyDown, event_queue);
- break;
-
- // a key has been released
+ e = process_key_event (&xEvent, self, NSKeyDown, event_queue, NO);
+ // Store the time of key down to catch repeated keys
+ downTime = xEvent.xkey.time;
+ break;
+
+ // a key has been released
case KeyRelease:
NSDebugLLog(@"NSEvent", @"%lu KeyRelease\n",
xEvent.xkey.window);
[self setLastTime: xEvent.xkey.time];
- e = process_key_event (&xEvent, self, NSKeyUp, event_queue);
- break;
-
- // reports the state of the keyboard when pointer or
- // focus enters a window
+
+ /*
+ 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 ignore the current KeyRelease event, and if there
was
+ a long enough time interval report the the next keyPress event as a
+ repeat.
+ */
+ if (XEventsQueued(dpy, QueuedAfterReading))
+ {
+ XEvent nev;
+ XPeekEvent(dpy, &nev);
+
+ if (nev.type == KeyPress &&
+ nev.xkey.window == xEvent.xkey.window &&
+ nev.xkey.time == xEvent.xkey.time &&
+ nev.xkey.keycode == xEvent.xkey.keycode)
+ {
+ // delete retriggered KeyPress event
+ XNextEvent (dpy, &xEvent);
+
+ // After some time we should generate repeated keyDowns
+ if (xEvent.xkey.time - downTime > 1000)
+ {
+ downTime = xEvent.xkey.time;
+ e = process_key_event(&xEvent, self, NSKeyDown,
event_queue, YES);
+ }
+ }
+ else
+ {
+ /*
+ if (nev.type == ClientMessage)
+ {
+ NSDebugLLog(@"NSEvent", @"Next event ClientMessage type
%ld %s",
+ xEvent.xclient.message_type,
+ XGetAtomName(dpy,
xEvent.xclient.message_type));
+ }
+ */
+ e = process_key_event(&xEvent, self, NSKeyUp, event_queue, NO);
+ }
+ }
+ else
+ {
+ e = process_key_event(&xEvent, self, NSKeyUp, event_queue, NO);
+ }
+ break;
+
+ // reports the state of the keyboard when pointer or
+ // focus enters a window
case KeymapNotify:
{
if (_is_keyboard_initialized == NO)
@@ -2014,7 +2062,7 @@
static NSEvent*
process_key_event (XEvent* xEvent, XGServer* context, NSEventType eventType,
- NSMutableArray *event_queue)
+ NSMutableArray *event_queue, BOOL keyRepeat)
{
NSString *keys, *ukeys;
KeySym keysym;
@@ -2031,8 +2079,6 @@
int alt_key = 0;
int help_key = 0;
KeySym modKeysym; // process modifier independently of shift, etc.
- XEvent next_event;
- BOOL keyRepeat = NO;
if (_is_keyboard_initialized == NO)
initialize_keyboard ();
@@ -2178,34 +2224,6 @@
if (keysym_is_X_modifier (keysym))
{
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.
- */
- 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;
- }
}
_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs