mirror of
https://github.com/gnustep/libs-back.git
synced 2025-06-04 03:00:43 +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
a9e6f5bd73
commit
355aa2db1e
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.
|
* Source/cairo/CairoGState.m: Add more checks for cairo status.
|
||||||
|
|
||||||
|
|
|
@ -77,7 +77,14 @@ struct XGGeneric {
|
||||||
unsigned appOwnsMiniwindow:1;
|
unsigned appOwnsMiniwindow:1;
|
||||||
unsigned doubleParentWindow:1;
|
unsigned doubleParentWindow:1;
|
||||||
} flags;
|
} flags;
|
||||||
|
// Time of last X event
|
||||||
Time lastTime;
|
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;
|
Time lastClick;
|
||||||
Window lastClickWindow;
|
Window lastClickWindow;
|
||||||
int lastClickX;
|
int lastClickX;
|
||||||
|
|
|
@ -98,4 +98,9 @@ typedef enum {
|
||||||
- (BOOL) setPreeditSpot: (NSPoint *)p;
|
- (BOOL) setPreeditSpot: (NSPoint *)p;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@interface XGServer (TimeKeeping)
|
||||||
|
- (void) setLastTime: (Time)last;
|
||||||
|
- (Time) lastTime;
|
||||||
|
@end
|
||||||
|
|
||||||
#endif /* _XGServer_h_INCLUDE */
|
#endif /* _XGServer_h_INCLUDE */
|
||||||
|
|
|
@ -395,7 +395,7 @@ static int check_modifier (XEvent *xEvent, KeySym key_sym,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
generic.lastClick = xEvent.xbutton.time;
|
generic.lastClick = xEvent.xbutton.time;
|
||||||
generic.lastTime = generic.lastClick;
|
[self setLastTime: generic.lastClick];
|
||||||
deltaY = 0.0;
|
deltaY = 0.0;
|
||||||
|
|
||||||
if (xEvent.xbutton.button == generic.lMouse)
|
if (xEvent.xbutton.button == generic.lMouse)
|
||||||
|
@ -445,14 +445,14 @@ static int check_modifier (XEvent *xEvent, KeySym key_sym,
|
||||||
& (NSMiniWindowMask | NSIconWindowMask)) != 0
|
& (NSMiniWindowMask | NSIconWindowMask)) != 0
|
||||||
&& eventType == NSLeftMouseDown && clickCount == 1)
|
&& eventType == NSLeftMouseDown && clickCount == 1)
|
||||||
{
|
{
|
||||||
if (cWin->parent == None)
|
if (cWin->parent == None)
|
||||||
break;
|
break;
|
||||||
xEvent.xbutton.window = cWin->parent;
|
xEvent.xbutton.window = cWin->parent;
|
||||||
XUngrabPointer(dpy, CurrentTime);
|
XUngrabPointer(dpy, CurrentTime);
|
||||||
XSendEvent(dpy, cWin->parent, True,
|
XSendEvent(dpy, cWin->parent, True,
|
||||||
ButtonPressMask, &xEvent);
|
ButtonPressMask, &xEvent);
|
||||||
XFlush(dpy);
|
XFlush(dpy);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -475,7 +475,7 @@ static int check_modifier (XEvent *xEvent, KeySym key_sym,
|
||||||
case ButtonRelease:
|
case ButtonRelease:
|
||||||
NSDebugLLog(@"NSEvent", @"%d ButtonRelease\n",
|
NSDebugLLog(@"NSEvent", @"%d ButtonRelease\n",
|
||||||
xEvent.xbutton.window);
|
xEvent.xbutton.window);
|
||||||
generic.lastTime = xEvent.xbutton.time;
|
[self setLastTime: xEvent.xbutton.time];
|
||||||
if (xEvent.xbutton.button == generic.lMouse)
|
if (xEvent.xbutton.button == generic.lMouse)
|
||||||
eventType = NSLeftMouseUp;
|
eventType = NSLeftMouseUp;
|
||||||
else if (xEvent.xbutton.button == generic.rMouse
|
else if (xEvent.xbutton.button == generic.rMouse
|
||||||
|
@ -543,7 +543,7 @@ static int check_modifier (XEvent *xEvent, KeySym key_sym,
|
||||||
break;
|
break;
|
||||||
if (xEvent.xclient.message_type == generic.protocols_atom)
|
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",
|
NSDebugLLog(@"NSEvent", @"WM Protocol - %s\n",
|
||||||
XGetAtomName(dpy, xEvent.xclient.data.l[0]));
|
XGetAtomName(dpy, xEvent.xclient.data.l[0]));
|
||||||
|
|
||||||
|
@ -1086,7 +1086,7 @@ static int check_modifier (XEvent *xEvent, KeySym key_sym,
|
||||||
case KeyPress:
|
case KeyPress:
|
||||||
NSDebugLLog(@"NSEvent", @"%d KeyPress\n",
|
NSDebugLLog(@"NSEvent", @"%d KeyPress\n",
|
||||||
xEvent.xkey.window);
|
xEvent.xkey.window);
|
||||||
generic.lastTime = xEvent.xkey.time;
|
[self setLastTime: xEvent.xkey.time];
|
||||||
e = process_key_event (&xEvent, self, NSKeyDown, event_queue);
|
e = process_key_event (&xEvent, self, NSKeyDown, event_queue);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1094,7 +1094,7 @@ static int check_modifier (XEvent *xEvent, KeySym key_sym,
|
||||||
case KeyRelease:
|
case KeyRelease:
|
||||||
NSDebugLLog(@"NSEvent", @"%d KeyRelease\n",
|
NSDebugLLog(@"NSEvent", @"%d KeyRelease\n",
|
||||||
xEvent.xkey.window);
|
xEvent.xkey.window);
|
||||||
generic.lastTime = xEvent.xkey.time;
|
[self setLastTime: xEvent.xkey.time];
|
||||||
e = process_key_event (&xEvent, self, NSKeyUp, event_queue);
|
e = process_key_event (&xEvent, self, NSKeyUp, event_queue);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1259,7 +1259,7 @@ static int check_modifier (XEvent *xEvent, KeySym key_sym,
|
||||||
}
|
}
|
||||||
|
|
||||||
generic.lastMotion = xEvent.xmotion.time;
|
generic.lastMotion = xEvent.xmotion.time;
|
||||||
generic.lastTime = generic.lastMotion;
|
[self setLastTime: generic.lastMotion];
|
||||||
state = xEvent.xmotion.state;
|
state = xEvent.xmotion.state;
|
||||||
if (state & generic.lMouseMask)
|
if (state & generic.lMouseMask)
|
||||||
{
|
{
|
||||||
|
@ -2325,4 +2325,45 @@ process_modifier_flags(unsigned int state)
|
||||||
|
|
||||||
@end
|
@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,
|
ret = XGrabPointer(dpy, window->ident, False,
|
||||||
PointerMotionMask | ButtonReleaseMask | ButtonPressMask,
|
PointerMotionMask | ButtonReleaseMask | ButtonPressMask,
|
||||||
GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
|
GrabModeAsync, GrabModeAsync, None, None, [self lastTime]);
|
||||||
|
|
||||||
if (ret != GrabSuccess)
|
if (ret != GrabSuccess)
|
||||||
NSDebugLLog(@"XGTrace", @"Failed to grab pointer %d\n", win);
|
NSDebugLLog(@"XGTrace", @"Failed to grab pointer %d\n", win);
|
||||||
|
@ -3521,7 +3521,7 @@ static BOOL didCreatePixmaps;
|
||||||
- (void) releasemouse
|
- (void) releasemouse
|
||||||
{
|
{
|
||||||
NSDebugLLog(@"XGTrace", @"Released pointer\n");
|
NSDebugLLog(@"XGTrace", @"Released pointer\n");
|
||||||
XUngrabPointer(dpy, CurrentTime);
|
XUngrabPointer(dpy, [self lastTime]);
|
||||||
grab_window = NULL;
|
grab_window = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3549,9 +3549,7 @@ static BOOL didCreatePixmaps;
|
||||||
NSDebugLLog(@"Focus", @"Setting focus to %d", window->number);
|
NSDebugLLog(@"Focus", @"Setting focus to %d", window->number);
|
||||||
generic.desiredFocusWindow = win;
|
generic.desiredFocusWindow = win;
|
||||||
generic.focusRequestNumber = XNextRequest(dpy);
|
generic.focusRequestNumber = XNextRequest(dpy);
|
||||||
// In the case of activation via DO the lastTime is outdated and cannot be used.
|
XSetInputFocus(dpy, window->ident, RevertToParent, [self lastTime]);
|
||||||
// XSetInputFocus(dpy, window->ident, RevertToParent, generic.lastTime);
|
|
||||||
XSetInputFocus(dpy, window->ident, RevertToParent, CurrentTime);
|
|
||||||
[inputServer ximFocusICWindow: window];
|
[inputServer ximFocusICWindow: window];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4338,7 +4336,7 @@ _computeDepth(int class, int bpp)
|
||||||
type: current_desktop
|
type: current_desktop
|
||||||
window: root
|
window: root
|
||||||
data0: workspace
|
data0: workspace
|
||||||
data1: generic.lastTime
|
data1: [self lastTime]
|
||||||
data2: 0
|
data2: 0
|
||||||
data3: 0];
|
data3: 0];
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue