Make GetTickCount not use the whole Unix epoch (since 1970) any more,

since that crashed several games or caused problems with them as they
aren't used to a high Windows uptime of more than 24.9 days.
This commit is contained in:
Andreas Mohr 2000-09-22 22:37:56 +00:00 committed by Alexandre Julliard
parent 19f8dda01b
commit c941effc24
12 changed files with 56 additions and 14 deletions

View File

@ -10,6 +10,8 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>
#include <X11/cursorfont.h>
#include "ts_xlib.h"
#include "ts_xutil.h"
@ -40,6 +42,8 @@ unsigned int screen_height;
unsigned int screen_depth;
Window root_window;
unsigned int X11DRV_server_startticks;
/***********************************************************************
* error_handler
*/
@ -50,6 +54,20 @@ static int error_handler(Display *display, XErrorEvent *error_evt)
}
/***********************************************************************
* get_server_startup
*
* Get the server startup time
* Won't be exact, but should be sufficient
*/
static void get_server_startup(void)
{
struct timeval t;
gettimeofday( &t, NULL );
X11DRV_server_startticks = ((t.tv_sec * 1000) + (t.tv_usec / 1000)) - GetTickCount();
}
/***********************************************************************
* setup_options
*
@ -216,6 +234,7 @@ static void process_attach(void)
{
WND_Driver = &X11DRV_WND_Driver;
get_server_startup();
setup_options();
/* Open display */

View File

@ -22,6 +22,7 @@ struct options
extern struct options Options;
extern const char *argv0;
extern const char *full_argv0;
extern unsigned int server_startticks;
extern void OPTIONS_Usage(void) WINE_NORETURN;
extern void OPTIONS_ParseOptions( char *argv[] );

View File

@ -181,6 +181,7 @@ struct init_process_request
IN void* ldt_flags; /* addr of LDT flags */
IN int ppid; /* parent Unix pid */
OUT int start_flags; /* flags from startup info */
OUT unsigned int server_start; /* server start time (GetTickCount) */
OUT int exe_file; /* file handle for main exe */
OUT int hstdin; /* handle for stdin */
OUT int hstdout; /* handle for stdout */
@ -1586,7 +1587,7 @@ union generic_request
struct set_serial_info_request set_serial_info;
};
#define SERVER_PROTOCOL_VERSION 22
#define SERVER_PROTOCOL_VERSION 23
/* ### make_requests end ### */
/* Everything above this line is generated automatically by tools/make_requests */

View File

@ -83,6 +83,8 @@ extern GC BITMAP_monoGC, BITMAP_colorGC;
extern DeviceCaps X11DRV_DevCaps;
extern unsigned int X11DRV_server_startticks;
/* Wine driver X11 functions */
extern const DC_FUNCTIONS X11DRV_DC_Funcs;
@ -288,7 +290,7 @@ void X11DRV_GDI_Finalize(void);
/* X11 GDI palette driver */
#define X11DRV_PALETTE_FIXED 0x0001 /* read-only colormap - have to use XAllocColor (if not virtual)*/
#define X11DRV_PALETTE_FIXED 0x0001 /* read-only colormap - have to use XAllocColor (if not virtual) */
#define X11DRV_PALETTE_VIRTUAL 0x0002 /* no mapping needed - pixel == pixel color */
#define X11DRV_PALETTE_PRIVATE 0x1000 /* private colormap, identity mapping */

View File

@ -229,11 +229,11 @@ FARPROC16 WINAPI FileCDR16(FARPROC16 x)
* GetTickCount (USER.13) (KERNEL32.299)
*
* Returns the number of milliseconds, modulo 2^32, since the start
* of the current session.
* of the wineserver.
*/
DWORD WINAPI GetTickCount(void)
{
struct timeval t;
gettimeofday( &t, NULL );
return (t.tv_sec * 1000) + (t.tv_usec / 1000);
return ((t.tv_sec * 1000) + (t.tv_usec / 1000)) - server_startticks;
}

View File

@ -42,6 +42,7 @@ static char **main_exe_argv;
static char main_exe_name[MAX_PATH];
static HFILE main_exe_file = INVALID_HANDLE_VALUE;
unsigned int server_startticks;
/***********************************************************************
* PROCESS_CallUserSignalProc
@ -198,6 +199,7 @@ static BOOL process_init( char *argv[] )
main_exe_name[len] = 0;
main_exe_file = req->exe_file;
current_startupinfo.dwFlags = req->start_flags;
server_startticks = req->server_start;
current_startupinfo.wShowWindow = req->cmd_show;
current_envdb.hStdin = current_startupinfo.hStdInput = req->hstdin;
current_envdb.hStdout = current_startupinfo.hStdOutput = req->hstdout;

View File

@ -21,6 +21,8 @@
int debug_level = 0;
int persistent_server = 0;
unsigned int server_start_ticks = 0;
/* parse-line args */
/* FIXME: should probably use getopt, and add a help option */
static void parse_args( int argc, char *argv[] )
@ -68,6 +70,14 @@ static void signal_init(void)
signal( SIGABRT, sigterm_handler );
}
/* get server start ticks used to calculate GetTickCount() in Wine clients */
static void get_start_ticks(void)
{
struct timeval t;
gettimeofday( &t, NULL );
server_start_ticks = (t.tv_sec * 1000) + (t.tv_usec / 1000);
}
int main( int argc, char *argv[] )
{
parse_args( argc, argv );
@ -76,6 +86,7 @@ int main( int argc, char *argv[] )
setvbuf( stderr, NULL, _IOLBF, 0 );
if (debug_level) fprintf( stderr, "Server: starting (pid=%ld)\n", (long) getpid() );
get_start_ticks();
init_registry();
select_loop();
close_registry();

View File

@ -181,9 +181,13 @@ extern void close_registry(void);
extern void close_atom_table(void);
/* global variables (command-line options) */
/* global variables */
/* command-line options */
extern int debug_level;
extern int persistent_server;
/* server start time used for GetTickCount() */
extern unsigned int server_start_ticks;
#endif /* __WINE_SERVER_OBJECT_H */

View File

@ -275,6 +275,7 @@ static void init_process( int ppid, struct init_process_request *req )
req->cmd_show = 0;
set_req_data_size( req, 0 );
}
req->server_start = server_start_ticks;
error:
}

View File

@ -315,6 +315,7 @@ static void dump_init_process_request( const struct init_process_request *req )
static void dump_init_process_reply( const struct init_process_request *req )
{
fprintf( stderr, " start_flags=%d,", req->start_flags );
fprintf( stderr, " server_start=%08x,", req->server_start );
fprintf( stderr, " exe_file=%d,", req->exe_file );
fprintf( stderr, " hstdin=%d,", req->hstdin );
fprintf( stderr, " hstdout=%d,", req->hstdout );

View File

@ -717,12 +717,12 @@ static void EVENT_MotionNotify( HWND hWnd, XMotionEvent *event )
X11DRV_SendEvent( MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE,
xOffset + event->x, yOffset + event->y,
X11DRV_EVENT_XStateToKeyState( event->state ),
event->time, hWnd);
event->time - X11DRV_server_startticks, hWnd);
} else {
X11DRV_SendEvent( MOUSEEVENTF_MOVE,
event->x_root, event->y_root,
X11DRV_EVENT_XStateToKeyState( event->state ),
event->time, hWnd);
event->time - X11DRV_server_startticks, hWnd);
}
}
@ -776,7 +776,7 @@ static void EVENT_ButtonPress( HWND hWnd, XButtonEvent *event )
X11DRV_SendEvent( statusCodes[buttonNum],
xOffset + event->x, yOffset + event->y,
MAKEWPARAM(keystate,wData),
event->time, hWnd);
event->time - X11DRV_server_startticks, hWnd);
}
@ -823,7 +823,7 @@ static void EVENT_ButtonRelease( HWND hWnd, XButtonEvent *event )
X11DRV_SendEvent( statusCodes[buttonNum],
xOffset + event->x, yOffset + event->y,
keystate, event->time, hWnd);
keystate, event->time - X11DRV_server_startticks, hWnd);
}
@ -1942,7 +1942,7 @@ static void EVENT_DGAMotionEvent( XDGAMotionEvent *event )
X11DRV_SendEvent( MOUSEEVENTF_MOVE,
event->dx, event->dy,
X11DRV_EVENT_XStateToKeyState( event->state ),
event->time, DGAhwnd );
event->time - X11DRV_server_startticks, DGAhwnd );
}
static void EVENT_DGAButtonPressEvent( XDGAButtonEvent *event )
@ -1970,7 +1970,7 @@ static void EVENT_DGAButtonPressEvent( XDGAButtonEvent *event )
break;
}
X11DRV_SendEvent( statusCodes[buttonNum], 0, 0, keystate, event->time, DGAhwnd );
X11DRV_SendEvent( statusCodes[buttonNum], 0, 0, keystate, event->time - X11DRV_server_startticks, DGAhwnd );
}
static void EVENT_DGAButtonReleaseEvent( XDGAButtonEvent *event )
@ -1998,7 +1998,7 @@ static void EVENT_DGAButtonReleaseEvent( XDGAButtonEvent *event )
break;
}
X11DRV_SendEvent( statusCodes[buttonNum], 0, 0, keystate, event->time, DGAhwnd );
X11DRV_SendEvent( statusCodes[buttonNum], 0, 0, keystate, event->time - X11DRV_server_startticks, DGAhwnd );
}
#endif

View File

@ -606,7 +606,7 @@ void X11DRV_KEYBOARD_HandleEvent( WND *pWnd, XKeyEvent *event )
INT event_x = (pWnd? pWnd->rectWindow.left : 0) + event->x;
INT event_y = (pWnd? pWnd->rectWindow.top : 0) + event->y;
DWORD event_time = event->time;
DWORD event_time = event->time - X11DRV_server_startticks;
/* this allows support for dead keys */
if ((event->keycode >> 8) == 0x10)
@ -614,7 +614,7 @@ void X11DRV_KEYBOARD_HandleEvent( WND *pWnd, XKeyEvent *event )
ascii_chars = TSXLookupString(event, Str, 1, &keysym, &cs);
TRACE_(key)("EVENT_key : state = %X\n", event->state);
TRACE_(key)("state = %X\n", event->state);
/* If XKB extensions is used, the state mask for AltGr will used the group
index instead of the modifier mask. The group index is set in bits