WINE_DEFAULT_DEBUG_CHANNEL(win);
WINE_DECLARE_DEBUG_CHANNEL(keyboard);
-static DWORD last_mouse_event;
/***********************************************************************
* get_key_state
*/
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;
}
{
/* 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 )))
{
*/
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;
}
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
struct set_cursor_reply set_cursor_reply;
};
-#define SERVER_PROTOCOL_VERSION 417
+#define SERVER_PROTOCOL_VERSION 418
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
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
{
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 */
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)
{
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;
}
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 */
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] = {
int x; /* cursor position */
int y;
rectangle_t clip; /* cursor clip rectangle */
+ unsigned int last_change; /* time of last position change */
};
struct desktop