server: Return the time of last change along with the current cursor position.
This commit is contained in:
parent
c64c36f573
commit
6576703fac
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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] = {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue