mirror of
https://github.com/gnustep/libs-back.git
synced 2025-04-22 15:31:14 +00:00
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:
parent
c89d043fd7
commit
cb3f3e35bf
5 changed files with 80 additions and 21 deletions
10
ChangeLog
10
ChangeLog
|
@ -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.
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue