New methods to store and get last event time.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/back/trunk@25457 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
fredkiefer 2007-09-05 14:35:06 +00:00
parent c89d043fd7
commit cb3f3e35bf
5 changed files with 80 additions and 21 deletions

View file

@ -1,4 +1,12 @@
2007-09-06 Fred Kiefer <FredKiefer@gmx.de>
2007-09-05 Fred Kiefer <FredKiefer@gmx.de>
* Headers/x11/XGGeneric.h: Add ivars for event time keeping.
* Headers/x11/XGServer.h: Declare new event time keeping methods.
* Source/x11/XGServerEvent.m (-setLastTime:, -lastTime): Implement
new methods and use them to store event time.
* Source/x11/XGServerWindow.m: Use these methods to get event time.
2007-09-05 Fred Kiefer <FredKiefer@gmx.de>
* Source/cairo/CairoGState.m: Add more checks for cairo status.

View file

@ -77,7 +77,14 @@ struct XGGeneric {
unsigned appOwnsMiniwindow:1;
unsigned doubleParentWindow:1;
} flags;
// Time of last X event
Time lastTime;
// Approximate local time for last X event, used to decide
// if the last X event time is still valid.
NSTimeInterval lastTimeStamp;
// last reference time on X server, used to prevent time drift between
// local machine and X server.
Time baseXServerTime;
Time lastClick;
Window lastClickWindow;
int lastClickX;

View file

@ -98,4 +98,9 @@ typedef enum {
- (BOOL) setPreeditSpot: (NSPoint *)p;
@end
@interface XGServer (TimeKeeping)
- (void) setLastTime: (Time)last;
- (Time) lastTime;
@end
#endif /* _XGServer_h_INCLUDE */

View file

@ -395,7 +395,7 @@ static int check_modifier (XEvent *xEvent, KeySym key_sym,
}
}
generic.lastClick = xEvent.xbutton.time;
generic.lastTime = generic.lastClick;
[self setLastTime: generic.lastClick];
deltaY = 0.0;
if (xEvent.xbutton.button == generic.lMouse)
@ -445,14 +445,14 @@ static int check_modifier (XEvent *xEvent, KeySym key_sym,
& (NSMiniWindowMask | NSIconWindowMask)) != 0
&& eventType == NSLeftMouseDown && clickCount == 1)
{
if (cWin->parent == None)
break;
xEvent.xbutton.window = cWin->parent;
XUngrabPointer(dpy, CurrentTime);
XSendEvent(dpy, cWin->parent, True,
ButtonPressMask, &xEvent);
XFlush(dpy);
break;
if (cWin->parent == None)
break;
xEvent.xbutton.window = cWin->parent;
XUngrabPointer(dpy, CurrentTime);
XSendEvent(dpy, cWin->parent, True,
ButtonPressMask, &xEvent);
XFlush(dpy);
break;
}
}
@ -475,7 +475,7 @@ static int check_modifier (XEvent *xEvent, KeySym key_sym,
case ButtonRelease:
NSDebugLLog(@"NSEvent", @"%d ButtonRelease\n",
xEvent.xbutton.window);
generic.lastTime = xEvent.xbutton.time;
[self setLastTime: xEvent.xbutton.time];
if (xEvent.xbutton.button == generic.lMouse)
eventType = NSLeftMouseUp;
else if (xEvent.xbutton.button == generic.rMouse
@ -543,7 +543,7 @@ static int check_modifier (XEvent *xEvent, KeySym key_sym,
break;
if (xEvent.xclient.message_type == generic.protocols_atom)
{
generic.lastTime = (Time)xEvent.xclient.data.l[1];
[self setLastTime: (Time)xEvent.xclient.data.l[1]];
NSDebugLLog(@"NSEvent", @"WM Protocol - %s\n",
XGetAtomName(dpy, xEvent.xclient.data.l[0]));
@ -1086,7 +1086,7 @@ static int check_modifier (XEvent *xEvent, KeySym key_sym,
case KeyPress:
NSDebugLLog(@"NSEvent", @"%d KeyPress\n",
xEvent.xkey.window);
generic.lastTime = xEvent.xkey.time;
[self setLastTime: xEvent.xkey.time];
e = process_key_event (&xEvent, self, NSKeyDown, event_queue);
break;
@ -1094,7 +1094,7 @@ static int check_modifier (XEvent *xEvent, KeySym key_sym,
case KeyRelease:
NSDebugLLog(@"NSEvent", @"%d KeyRelease\n",
xEvent.xkey.window);
generic.lastTime = xEvent.xkey.time;
[self setLastTime: xEvent.xkey.time];
e = process_key_event (&xEvent, self, NSKeyUp, event_queue);
break;
@ -1259,7 +1259,7 @@ static int check_modifier (XEvent *xEvent, KeySym key_sym,
}
generic.lastMotion = xEvent.xmotion.time;
generic.lastTime = generic.lastMotion;
[self setLastTime: generic.lastMotion];
state = xEvent.xmotion.state;
if (state & generic.lMouseMask)
{
@ -2325,4 +2325,45 @@ process_modifier_flags(unsigned int state)
@end
@implementation XGServer (TimeKeeping)
// Sync time with X server every 10 seconds
#define MAX_TIME_DIFF 10
// Regard an X time stamp as valid for half a second
#define OUT_DATE_TIME_DIFF 0.5
- (void) setLastTime: (Time)last
{
if (generic.lastTimeStamp == 0
|| generic.baseXServerTime + MAX_TIME_DIFF * 1000 < last)
{
// We have not sync'ed with the clock for at least
// MAX_TIME_DIFF seconds ... so we do it now.
generic.lastTimeStamp = [NSDate timeIntervalSinceReferenceDate];
generic.baseXServerTime = last;
}
else
{
// Optimisation to compute the new time stamp instead.
generic.lastTimeStamp += (last - generic.lastTime) / 1000.0;
}
generic.lastTime = last;
}
- (Time) lastTime
{
// In the case of activation via DO the lastTime is outdated and cannot be used.
if (generic.lastTimeStamp == 0
|| ((generic.lastTimeStamp + OUT_DATE_TIME_DIFF)
< [NSDate timeIntervalSinceReferenceDate]))
{
return CurrentTime;
}
else
{
return generic.lastTime;
}
}
@end

View file

@ -3506,7 +3506,7 @@ static BOOL didCreatePixmaps;
ret = XGrabPointer(dpy, window->ident, False,
PointerMotionMask | ButtonReleaseMask | ButtonPressMask,
GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
GrabModeAsync, GrabModeAsync, None, None, [self lastTime]);
if (ret != GrabSuccess)
NSDebugLLog(@"XGTrace", @"Failed to grab pointer %d\n", win);
@ -3521,7 +3521,7 @@ static BOOL didCreatePixmaps;
- (void) releasemouse
{
NSDebugLLog(@"XGTrace", @"Released pointer\n");
XUngrabPointer(dpy, CurrentTime);
XUngrabPointer(dpy, [self lastTime]);
grab_window = NULL;
}
@ -3549,9 +3549,7 @@ static BOOL didCreatePixmaps;
NSDebugLLog(@"Focus", @"Setting focus to %d", window->number);
generic.desiredFocusWindow = win;
generic.focusRequestNumber = XNextRequest(dpy);
// In the case of activation via DO the lastTime is outdated and cannot be used.
// XSetInputFocus(dpy, window->ident, RevertToParent, generic.lastTime);
XSetInputFocus(dpy, window->ident, RevertToParent, CurrentTime);
XSetInputFocus(dpy, window->ident, RevertToParent, [self lastTime]);
[inputServer ximFocusICWindow: window];
}
@ -4338,7 +4336,7 @@ _computeDepth(int class, int bpp)
type: current_desktop
window: root
data0: workspace
data1: generic.lastTime
data1: [self lastTime]
data2: 0
data3: 0];
}