Alexandre Julliard : server: Return the time of last change along with the current cursor position.
Alexandre Julliard
julliard at winehq.org
Fri Apr 1 09:40:59 CDT 2011
Module: wine
Branch: master
Commit: 6576703facc1f42efcbd755308d46382b763d774
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6576703facc1f42efcbd755308d46382b763d774
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Mar 31 20:15:56 2011 +0200
server: Return the time of last change along with the current cursor position.
---
dlls/user32/input.c | 23 +++++++----------------
include/wine/server_protocol.h | 4 +++-
server/protocol.def | 1 +
server/queue.c | 11 +++++++----
server/request.h | 3 ++-
server/trace.c | 1 +
server/user.h | 1 +
7 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/dlls/user32/input.c b/dlls/user32/input.c
index 06553a4..9b22021 100644
--- a/dlls/user32/input.c
+++ b/dlls/user32/input.c
@@ -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;
}
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 82e95be..70e539b 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -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 */
diff --git a/server/protocol.def b/server/protocol.def
index aaaebc0..f8fc82b 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -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
diff --git a/server/queue.c b/server/queue.c
index f6ac303..35448e5 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -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;
}
diff --git a/server/request.h b/server/request.h
index 47733a5..c2104e9 100644
--- a/server/request.h
+++ b/server/request.h
@@ -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 */
diff --git a/server/trace.c b/server/trace.c
index 0933cf1..553ba4d 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -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] = {
diff --git a/server/user.h b/server/user.h
index 52a44a6..cc603cf 100644
--- a/server/user.h
+++ b/server/user.h
@@ -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
More information about the wine-cvs
mailing list