Commit c941effc authored by Andreas Mohr's avatar Andreas Mohr Committed by Alexandre Julliard

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.
parent 19f8dda0
......@@ -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
*/
......@@ -51,6 +55,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
*
* Setup the x11drv options.
......@@ -216,6 +234,7 @@ static void process_attach(void)
{
WND_Driver = &X11DRV_WND_Driver;
get_server_startup();
setup_options();
/* Open display */
......
......@@ -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[] );
......
......@@ -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 */
......
......@@ -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 */
......
......@@ -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;
}
......@@ -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;
......
......@@ -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();
......
......@@ -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 */
......@@ -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:
}
......
......@@ -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 );
......
......@@ -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
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment