On 11/19/20 2:09 PM, Huw Davies wrote:
Signed-off-by: Huw Davies huw@codeweavers.com
server/protocol.def | 9 ++++++- server/queue.c | 62 ++++++++++++++++++++++----------------------- server/user.h | 3 --- 3 files changed, 39 insertions(+), 35 deletions(-)
diff --git a/server/protocol.def b/server/protocol.def index c1c33d7e3d1..d61d7f3c549 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -796,9 +796,16 @@ typedef struct lparam_t info; } cursor_pos_t;
+struct shared_cursor +{
- int x; /* cursor position */
- int y;
- unsigned int last_change; /* time of last position change */
+};
- struct desktop_shared_memory {
- int placeholder;
struct shared_cursor cursor; /* global cursor information */ };
/****************************************************************/
diff --git a/server/queue.c b/server/queue.c index 935475b4c09..f6664509ee3 100644 --- a/server/queue.c +++ b/server/queue.c @@ -377,10 +377,10 @@ static int update_desktop_cursor_pos( struct desktop *desktop, int x, int y )
x = max( min( x, desktop->cursor.clip.right - 1 ), desktop->cursor.clip.left ); y = max( min( y, desktop->cursor.clip.bottom - 1 ), desktop->cursor.clip.top );
- updated = (desktop->cursor.x != x || desktop->cursor.y != y);
- desktop->cursor.x = x;
- desktop->cursor.y = y;
- desktop->cursor.last_change = get_tick_count();
updated = (desktop->shared->cursor.x != x || desktop->shared->cursor.y != y);
desktop->shared->cursor.x = x;
desktop->shared->cursor.y = y;
desktop->shared->cursor.last_change = get_tick_count();
return updated; }
@@ -411,8 +411,8 @@ static void get_message_defaults( struct msg_queue *queue, int *x, int *y, unsig { struct desktop *desktop = queue->input->desktop;
- *x = desktop->cursor.x;
- *y = desktop->cursor.y;
- *x = desktop->shared->cursor.x;
- *y = desktop->shared->cursor.y; *time = get_tick_count(); }
@@ -439,9 +439,9 @@ static void set_clip_rectangle( struct desktop *desktop, const rectangle_t *rect post_desktop_message( desktop, desktop->cursor.clip_msg, rect != NULL, 0 );
/* warp the mouse to be inside the clip rect */
- x = max( min( desktop->cursor.x, desktop->cursor.clip.right - 1 ), desktop->cursor.clip.left );
- y = max( min( desktop->cursor.y, desktop->cursor.clip.bottom - 1 ), desktop->cursor.clip.top );
- if (x != desktop->cursor.x || y != desktop->cursor.y) set_cursor_pos( desktop, x, y );
x = max( min( desktop->shared->cursor.x, desktop->cursor.clip.right - 1 ), desktop->cursor.clip.left );
y = max( min( desktop->shared->cursor.y, desktop->cursor.clip.bottom - 1 ), desktop->cursor.clip.top );
if (x != desktop->shared->cursor.x || y != desktop->shared->cursor.y) set_cursor_pos( desktop, x, y ); }
/* change the foreground input and reset the cursor clip rect */
@@ -1568,8 +1568,8 @@ static void queue_hardware_message( struct desktop *desktop, struct message *msg if (desktop->keystate[VK_XBUTTON1] & 0x80) msg->wparam |= MK_XBUTTON1; if (desktop->keystate[VK_XBUTTON2] & 0x80) msg->wparam |= MK_XBUTTON2; }
- msg->x = desktop->cursor.x;
- msg->y = desktop->cursor.y;
msg->x = desktop->shared->cursor.x;
msg->y = desktop->shared->cursor.y;
if (msg->win && (thread = get_window_thread( msg->win ))) {
@@ -1737,10 +1737,10 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons WM_MOUSEHWHEEL /* 0x1000 = MOUSEEVENTF_HWHEEL */ };
- update_desktop_cursor_pos( desktop, desktop->cursor.x, desktop->cursor.y ); /* Update last change time */
- update_desktop_cursor_pos( desktop, desktop->shared->cursor.x, desktop->shared->cursor.y ); /* Update last change time */ flags = input->mouse.flags; time = input->mouse.time;
- if (!time) time = desktop->cursor.last_change;
if (!time) time = desktop->shared->cursor.last_change;
if (flags & MOUSEEVENTF_MOVE) {
@@ -1749,19 +1749,19 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons x = input->mouse.x; y = input->mouse.y; if (flags & ~(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE) &&
x == desktop->cursor.x && y == desktop->cursor.y)
x == desktop->shared->cursor.x && y == desktop->shared->cursor.y) flags &= ~MOUSEEVENTF_MOVE; } else {
x = desktop->cursor.x + input->mouse.x;
y = desktop->cursor.y + input->mouse.y;
x = desktop->shared->cursor.x + input->mouse.x;
y = desktop->shared->cursor.y + input->mouse.y; } } else {
x = desktop->cursor.x;
y = desktop->cursor.y;
x = desktop->shared->cursor.x;
y = desktop->shared->cursor.y; } if ((foreground = get_foreground_thread( desktop, win )))
@@ -1775,8 +1775,8 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons msg_data->info = input->mouse.info; msg_data->flags = flags; msg_data->rawinput.type = RIM_TYPEMOUSE;
msg_data->rawinput.mouse.x = x - desktop->cursor.x;
msg_data->rawinput.mouse.y = y - desktop->cursor.y;
msg_data->rawinput.mouse.x = x - desktop->shared->cursor.x;
msg_data->rawinput.mouse.y = y - desktop->shared->cursor.y; msg_data->rawinput.mouse.data = input->mouse.data; enum_processes( queue_rawinput_message, &raw_msg );
@@ -1967,8 +1967,8 @@ static void queue_custom_hardware_message( struct desktop *desktop, user_handle_ msg->msg = input->hw.msg; msg->wparam = 0; msg->lparam = input->hw.lparam;
- msg->x = desktop->cursor.x;
- msg->y = desktop->cursor.y;
msg->x = desktop->shared->cursor.x;
msg->y = desktop->shared->cursor.y;
queue_hardware_message( desktop, msg, 1 ); }
@@ -2473,8 +2473,8 @@ DECL_HANDLER(send_hardware_message) } }
- reply->prev_x = desktop->cursor.x;
- reply->prev_y = desktop->cursor.y;
reply->prev_x = desktop->shared->cursor.x;
reply->prev_y = desktop->shared->cursor.y;
switch (req->input.type) {
@@ -2492,8 +2492,8 @@ DECL_HANDLER(send_hardware_message) } if (thread) release_object( thread );
- reply->new_x = desktop->cursor.x;
- reply->new_y = desktop->cursor.y;
- reply->new_x = desktop->shared->cursor.x;
- reply->new_y = desktop->shared->cursor.y; set_reply_data( desktop->keystate, size ); release_object( desktop ); }
@@ -3202,8 +3202,8 @@ DECL_HANDLER(set_cursor)
reply->prev_handle = input->cursor; reply->prev_count = input->cursor_count;
- reply->prev_x = input->desktop->cursor.x;
- reply->prev_y = input->desktop->cursor.y;
reply->prev_x = input->desktop->shared->cursor.x;
reply->prev_y = input->desktop->shared->cursor.y;
if (req->flags & SET_CURSOR_HANDLE) {
@@ -3234,10 +3234,10 @@ DECL_HANDLER(set_cursor) set_clip_rectangle( desktop, (req->flags & SET_CURSOR_NOCLIP) ? NULL : &req->clip, 0 ); }
- reply->new_x = input->desktop->cursor.x;
- reply->new_y = input->desktop->cursor.y;
- reply->new_x = input->desktop->shared->cursor.x;
- reply->new_y = input->desktop->shared->cursor.y; reply->new_clip = input->desktop->cursor.clip;
- reply->last_change = input->desktop->cursor.last_change;
reply->last_change = input->desktop->shared->cursor.last_change; }
/* Get the history of the 64 last cursor positions */
diff --git a/server/user.h b/server/user.h index 9a28ba7f449..e525957c5bc 100644 --- a/server/user.h +++ b/server/user.h @@ -54,11 +54,8 @@ struct winstation
struct global_cursor {
- int x; /* cursor position */
- int y; rectangle_t clip; /* cursor clip rectangle */ unsigned int clip_msg; /* message to post for cursor clip changes */
- unsigned int last_change; /* time of last position change */ user_handle_t win; /* window that contains the cursor */ };
Just a quick thought, as the shared desktop data struct is flagged volatile, this will probably prevent optimizations on the server-side reads too, maybe we could avoid that and only make the writes volatile?