[PATCH 3/5] server: Move the cursor position and last change time to the shared data.

Rémi Bernon rbernon at codeweavers.com
Thu Nov 19 07:42:09 CST 2020


On 11/19/20 2:09 PM, Huw Davies wrote:
> Signed-off-by: Huw Davies <huw at 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?
-- 
Rémi Bernon <rbernon at codeweavers.com>



More information about the wine-devel mailing list