server: Return the time of last change along with the current cursor position.

This commit is contained in:
Alexandre Julliard 2011-03-31 20:15:56 +02:00
parent c64c36f573
commit 6576703fac
7 changed files with 22 additions and 22 deletions

View File

@ -52,7 +52,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(win);
WINE_DECLARE_DEBUG_CHANNEL(keyboard);
static DWORD last_mouse_event;
/***********************************************************************
* get_key_state
@ -124,10 +123,7 @@ BOOL set_capture_window( HWND hwnd, UINT gui_flags, HWND *prev_ret )
*/
BOOL CDECL __wine_send_input( HWND hwnd, const INPUT *input )
{
NTSTATUS status;
if (input->type == INPUT_MOUSE) last_mouse_event = GetTickCount();
status = send_hardware_message( hwnd, input, 0 );
NTSTATUS status = send_hardware_message( hwnd, input, 0 );
if (status) SetLastError( RtlNtStatusToDosError(status) );
return !status;
}
@ -183,7 +179,6 @@ UINT WINAPI SendInput( UINT count, LPINPUT inputs, int size )
{
/* we need to update the coordinates to what the server expects */
INPUT input = inputs[i];
last_mouse_event = GetTickCount();
update_mouse_coords( &input );
if (!(status = send_hardware_message( 0, &input, SEND_HWMSG_INJECTED )))
{
@ -254,28 +249,24 @@ void WINAPI mouse_event( DWORD dwFlags, DWORD dx, DWORD dy,
*/
BOOL WINAPI DECLSPEC_HOTPATCH GetCursorPos( POINT *pt )
{
BOOL ret = FALSE;
BOOL ret;
DWORD last_change;
if (!pt) return FALSE;
/* query new position from graphics driver if we haven't updated recently */
if (GetTickCount() - last_mouse_event > 100) ret = USER_Driver->pGetCursorPos( pt );
SERVER_START_REQ( set_cursor )
{
if (ret) /* update it */
{
req->flags = SET_CURSOR_POS;
req->x = pt->x;
req->y = pt->y;
}
if ((ret = !wine_server_call( req )))
{
pt->x = reply->new_x;
pt->y = reply->new_y;
last_change = reply->last_change;
}
}
SERVER_END_REQ;
/* query new position from graphics driver if we haven't updated recently */
if (ret && GetTickCount() - last_change > 100) ret = USER_Driver->pGetCursorPos( pt );
return ret;
}

View File

@ -4807,6 +4807,8 @@ struct set_cursor_reply
int new_x;
int new_y;
rectangle_t new_clip;
unsigned int last_change;
char __pad_44[4];
};
#define SET_CURSOR_HANDLE 0x01
#define SET_CURSOR_COUNT 0x02
@ -5559,6 +5561,6 @@ union generic_reply
struct set_cursor_reply set_cursor_reply;
};
#define SERVER_PROTOCOL_VERSION 417
#define SERVER_PROTOCOL_VERSION 418
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */

View File

@ -3324,6 +3324,7 @@ enum coords_relative
int new_x; /* new position */
int new_y;
rectangle_t new_clip; /* new clip rectangle */
unsigned int last_change; /* time of last position change */
@END
#define SET_CURSOR_HANDLE 0x01
#define SET_CURSOR_COUNT 0x02

View File

@ -1281,6 +1281,7 @@ static void set_cursor_pos( struct desktop *desktop, int x, int y )
{
desktop->cursor.x = min( max( x, desktop->cursor.clip.left ), desktop->cursor.clip.right - 1 );
desktop->cursor.y = min( max( y, desktop->cursor.clip.top ), desktop->cursor.clip.bottom - 1 );
desktop->cursor.last_change = get_tick_count();
}
/* queue a hardware message into a given thread input */
@ -1411,9 +1412,10 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons
WM_MOUSEHWHEEL /* 0x1000 = MOUSEEVENTF_HWHEEL */
};
desktop->cursor.last_change = get_tick_count();
flags = input->mouse.flags;
time = input->mouse.time;
if (!time) time = get_tick_count();
if (!time) time = desktop->cursor.last_change;
if (flags & MOUSEEVENTF_MOVE)
{
@ -2624,7 +2626,8 @@ DECL_HANDLER(set_cursor)
input->desktop->cursor.clip = top_rect;
}
reply->new_x = input->desktop->cursor.x;
reply->new_y = input->desktop->cursor.y;
reply->new_clip = input->desktop->cursor.clip;
reply->new_x = input->desktop->cursor.x;
reply->new_y = input->desktop->cursor.y;
reply->new_clip = input->desktop->cursor.clip;
reply->last_change = input->desktop->cursor.last_change;
}

View File

@ -2103,7 +2103,8 @@ C_ASSERT( FIELD_OFFSET(struct set_cursor_reply, prev_count) == 12 );
C_ASSERT( FIELD_OFFSET(struct set_cursor_reply, new_x) == 16 );
C_ASSERT( FIELD_OFFSET(struct set_cursor_reply, new_y) == 20 );
C_ASSERT( FIELD_OFFSET(struct set_cursor_reply, new_clip) == 24 );
C_ASSERT( sizeof(struct set_cursor_reply) == 40 );
C_ASSERT( FIELD_OFFSET(struct set_cursor_reply, last_change) == 40 );
C_ASSERT( sizeof(struct set_cursor_reply) == 48 );
#endif /* WANT_REQUEST_HANDLERS */

View File

@ -3905,6 +3905,7 @@ static void dump_set_cursor_reply( const struct set_cursor_reply *req )
fprintf( stderr, ", new_x=%d", req->new_x );
fprintf( stderr, ", new_y=%d", req->new_y );
dump_rectangle( ", new_clip=", &req->new_clip );
fprintf( stderr, ", last_change=%08x", req->last_change );
}
static const dump_func req_dumpers[REQ_NB_REQUESTS] = {

View File

@ -56,6 +56,7 @@ struct global_cursor
int x; /* cursor position */
int y;
rectangle_t clip; /* cursor clip rectangle */
unsigned int last_change; /* time of last position change */
};
struct desktop